diff --git a/browser/extensions/screenshots/install.rdf b/browser/extensions/screenshots/install.rdf
index a2102bbb870b92238d7488d8e52789d166ec4bbe..d2a3d5c5c709ca271938dc74444243bd329c56c7 100644
--- a/browser/extensions/screenshots/install.rdf
+++ b/browser/extensions/screenshots/install.rdf
@@ -12,7 +12,7 @@
       </Description>
     </em:targetApplication>
     <em:type>2</em:type>
-    <em:version>8.1.0</em:version>
+    <em:version>9.0.0</em:version>
     <em:bootstrap>true</em:bootstrap>
     <em:homepageURL>https://pageshot.net/</em:homepageURL>
     <em:multiprocessCompatible>true</em:multiprocessCompatible>
diff --git a/browser/extensions/screenshots/moz.build b/browser/extensions/screenshots/moz.build
index 32560b7506dd2dad43cb289270c1fc44e5f44e65..a31c5ea01c73e7ca70ca87e2f95b22ba8cd250fc 100644
--- a/browser/extensions/screenshots/moz.build
+++ b/browser/extensions/screenshots/moz.build
@@ -28,6 +28,10 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales
   'webextension/_locales/ach/messages.json'
 ]
 
+FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["ar"] += [
+  'webextension/_locales/ar/messages.json'
+]
+
 FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["az"] += [
   'webextension/_locales/az/messages.json'
 ]
diff --git a/browser/extensions/screenshots/webextension/_locales/ar/messages.json b/browser/extensions/screenshots/webextension/_locales/ar/messages.json
new file mode 100644
index 0000000000000000000000000000000000000000..d2fabc28ac7fb49fb68090119226f11f5f50ed8d
--- /dev/null
+++ b/browser/extensions/screenshots/webextension/_locales/ar/messages.json
@@ -0,0 +1,123 @@
+{
+  "addonDescription": {
+    "message": "خذ مقاطع و لقطات من الوب و احفظهم مؤقتًا أو دائمًا."
+  },
+  "addonAuthorsList": {
+    "message": "موزيلا <screenshots-feedback@mozilla.com>"
+  },
+  "contextMenuLabel": {
+    "message": "خذ لقطة شاشة"
+  },
+  "myShotsLink": {
+    "message": "لقطاتي"
+  },
+  "screenshotInstructions": {
+    "message": "اسحب أو انقر في الصفحة لاختيار منطقة. اضغط ESC للإلغاء."
+  },
+  "saveScreenshotSelectedArea": {
+    "message": "احفظ"
+  },
+  "saveScreenshotVisibleArea": {
+    "message": "احفظ الجزء المرئي"
+  },
+  "saveScreenshotFullPage": {
+    "message": "احفظ كل الصفحة"
+  },
+  "cancelScreenshot": {
+    "message": "ألغِ"
+  },
+  "downloadScreenshot": {
+    "message": "نزّل"
+  },
+  "notificationLinkCopiedTitle": {
+    "message": "نُسخ الرابط"
+  },
+  "notificationLinkCopiedDetails": {
+    "message": "نُسِخَ رابط اللقطة إلى الحافظة. اضغط $META_KEY$-V للصقها.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "requestErrorTitle": {
+    "message": "خارج الخدمة."
+  },
+  "requestErrorDetails": {
+    "message": "تعذّر حفظ لقطتك. رجاء أعد المحاولة فيما بعد."
+  },
+  "connectionErrorTitle": {
+    "message": "تعذّر الاتصال بلقطات شاشتك."
+  },
+  "connectionErrorDetails": {
+    "message": "رجاء فحص اتصال الإنترنت. إذا كان باستطاعتك الاتصال بالإنترنت، فربما هناك عطل مؤقت في خدمة «لقطات شاشة فَيَرفُكس»."
+  },
+  "loginErrorDetails": {
+    "message": "تعذّر حفظ لقطتك لعُطل في خدمة «لقطات شاشة فَيَرفُكس». رجاء إعادة المحاولة لاحقًا."
+  },
+  "unshootablePageErrorTitle": {
+    "message": "تعذّر أخذ لقطة شاشة لهذه الصفحة."
+  },
+  "unshootablePageErrorDetails": {
+    "message": "ليست هذه صفحة وِب قياسية، لذا لا يمكنك أخذ لقطة لها."
+  },
+  "selfScreenshotErrorTitle": {
+    "message": "لا يمكننا أخذ لقطة لصفحة من صفحات «لقطات شاشة فَيَرفُكس»!"
+  },
+  "genericErrorTitle": {
+    "message": "هناك عطل في «لقطات شاشة فَيَرفُكس»."
+  },
+  "genericErrorDetails": {
+    "message": "لسنا متأكدين ما المشكلة. أتمانع إعادة المحاولة أو أخذ لقطة لصفحة أخرى؟"
+  },
+  "tourBodyOne": {
+    "message": "خذ لقطات الشاشة و احفظها و شارطها دون مغادرة فَيَرفُكس."
+  },
+  "tourHeaderTwo": {
+    "message": "التقط ما تريده فقط"
+  },
+  "tourBodyTwo": {
+    "message": "انقر و اسحب لالتقاط جزء معين من الصفحة. يمكنك أيضًا التحويم لإبراز التحديد."
+  },
+  "tourHeaderThree": {
+    "message": "كما تريدها"
+  },
+  "tourBodyThree": {
+    "message": "احفظ اللقطات التي أخذتها على الوب لمشاركتها بسهولة، أو نزّلها على حاسوبك. يمكنك أيضًل النقر على زر ”لقطاتي“ للعثور على كل اللقطات التي أخذتها."
+  },
+  "tourHeaderFour": {
+    "message": "التقط النوافذ أو صفحات كاملة"
+  },
+  "tourBodyFour": {
+    "message": "اختر الأزرار في أعلى اليمين لالتقاط المنطقة المرئية في النافذة أو الصفحة كلها."
+  },
+  "tourSkip": {
+    "message": "تخطَّ"
+  },
+  "tourNext": {
+    "message": "الشريحة التالية"
+  },
+  "tourPrevious": {
+    "message": "الشريحة السابقة"
+  },
+  "tourDone": {
+    "message": "تمّ"
+  },
+  "termsAndPrivacyNoticeCloudServices": {
+    "message": "استخدامك لخدمات «لقطات شاشة فَيَرفُكس» يعني موافقتك على $TERMSANDPRIVACYNOTICETERMSLINK$ و $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
+    "placeholders": {
+      "termsandprivacynoticetermslink": {
+        "content": "$1"
+      },
+      "termsandprivacynoticeprivacylink": {
+        "content": "$2"
+      }
+    }
+  },
+  "termsAndPrivacyNoticeTermsLink": {
+    "message": "الشروط"
+  },
+  "termsAndPrivacyNoticyPrivacyLink": {
+    "message": "تنويه الخصوصية"
+  }
+}
\ No newline at end of file
diff --git a/browser/extensions/screenshots/webextension/_locales/de/messages.json b/browser/extensions/screenshots/webextension/_locales/de/messages.json
index c71d73fc8443a38566e4630f3ea68c23aa983604..34c57e3ff5ecdeaa1007fc462717326b88115b31 100644
--- a/browser/extensions/screenshots/webextension/_locales/de/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/de/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Sie können kein Bildschirmfoto einer Firefox-Screenshots-Seite machen!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Ihr Auswahlbereich ist zu klein"
+  },
   "genericErrorTitle": {
     "message": "Firefox Screenshots funktioniert nicht richtig."
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/dsb/messages.json b/browser/extensions/screenshots/webextension/_locales/dsb/messages.json
index 151719f291147021d367c37f04ba83c551e70e25..ea306cba5fd8b1dcb781f7e96505535644b28008 100644
--- a/browser/extensions/screenshots/webextension/_locales/dsb/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/dsb/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Njamóžośo wobrazowku boka Firefox Screenshots fotografěrowaś!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Waš wuběrk jo pśemały"
+  },
   "genericErrorTitle": {
     "message": "Hopla! Firefox Screenshots njeźěła."
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/en_US/messages.json b/browser/extensions/screenshots/webextension/_locales/en_US/messages.json
index 6202f89a9a578530f5698e55773173403cac8d71..2d233e959980c4692454f579bb9736ad72e09803 100644
--- a/browser/extensions/screenshots/webextension/_locales/en_US/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/en_US/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "You can’t take a shot of a Firefox Screenshots page!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Your selection is too small"
+  },
   "genericErrorTitle": {
     "message": "Whoa! Firefox Screenshots went haywire."
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/es_MX/messages.json b/browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
index d2a5891f80b3bb69b7948e02412d770635193eec..4cd41ceb4d125514e443ae1156ca0a5a3eced070 100644
--- a/browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "¡No puedes tomar una captura de la página de capturas de pantalla de Firefox!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Tu selección es demasiado pequeña"
+  },
   "genericErrorTitle": {
     "message": "¡Oye! Las capturas de pantalla de Firefox salieron mal."
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/fr/messages.json b/browser/extensions/screenshots/webextension/_locales/fr/messages.json
index 6eef6f70ef7a4ba0a00e0cc16e0e9e1ad53ec76a..44c9fa59bcef86fdb57b3ab039757684f4397754 100644
--- a/browser/extensions/screenshots/webextension/_locales/fr/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/fr/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Vous ne pouvez pas effectuer une capture d’écran d’une page Firefox Screenshots."
   },
+  "emptySelectionErrorTitle": {
+    "message": "La zone sélectionnée est trop petite"
+  },
   "genericErrorTitle": {
     "message": "Firefox Screenshots semble avoir un problème."
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/hsb/messages.json b/browser/extensions/screenshots/webextension/_locales/hsb/messages.json
index 174a1112c30029e765dfcb1b355924c5e259f0f0..79016c62b09618326962f682715567648e870cfd 100644
--- a/browser/extensions/screenshots/webextension/_locales/hsb/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hsb/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Njemóžeće wobrazowku strony Firefox Screenshots fotografować!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Waš wuběr je přemały"
+  },
   "genericErrorTitle": {
     "message": "Hopla! Firefox Screenshots njefunguje."
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/hu/messages.json b/browser/extensions/screenshots/webextension/_locales/hu/messages.json
index 935252a58b0f30ee1d5abfa35f5b654aea70f077..dce33ef671688f1fefc5cff9e3e755db17fb6c8d 100644
--- a/browser/extensions/screenshots/webextension/_locales/hu/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hu/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Nem készíthet képet a Firefox képernyőképek oldalról!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "A kijelölés túl kicsi"
+  },
   "genericErrorTitle": {
     "message": "Húha! A Firefox képernyőképek megkergült."
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/it/messages.json b/browser/extensions/screenshots/webextension/_locales/it/messages.json
index 4b7e802add7774e4eb0d5a712a5cd829118c7838..72550f8a2afe9cc99783c30f74af2d573e4f57e7 100644
--- a/browser/extensions/screenshots/webextension/_locales/it/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/it/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Non è possibile salvare uno screenshot di una pagina di Firefox Screenshots"
   },
+  "emptySelectionErrorTitle": {
+    "message": "L’area selezionata è troppo piccola"
+  },
   "genericErrorTitle": {
     "message": "Wow! Firefox Screenshots è andato in tilt"
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/ja/messages.json b/browser/extensions/screenshots/webextension/_locales/ja/messages.json
index ae78e2d6a3f5ea60c3a54fa15ceab45eff476234..b85cbb71eac6b8c159fdcb3c2bcadff394df1fec 100644
--- a/browser/extensions/screenshots/webextension/_locales/ja/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ja/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Firefox Screenshots ページのショットは撮れません。"
   },
+  "emptySelectionErrorTitle": {
+    "message": "選択範囲が小さすぎます"
+  },
   "genericErrorTitle": {
     "message": "Firefox Screenshots に問題が発生しました。"
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json b/browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
index 80aaf33596baddfc6d27a56f39ce0c9974a94bc3..658601915244820fad19d0067fb65a774a07993e 100644
--- a/browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
@@ -12,7 +12,7 @@
     "message": "Minhas capturas"
   },
   "screenshotInstructions": {
-    "message": "Arraste ou clique na página para selecionar uma área. Pressione ESC para cancelar."
+    "message": "Arraste ou clique na página para selecionar uma região. Pressione ESC para cancelar."
   },
   "saveScreenshotSelectedArea": {
     "message": "Salvar"
@@ -41,7 +41,7 @@
     }
   },
   "requestErrorTitle": {
-    "message": "Fora de ordem."
+    "message": "Com defeito."
   },
   "requestErrorDetails": {
     "message": "Desculpa! Não pudemos salvar a sua captura de tela. Por favor, tente novamente mais tarde."
diff --git a/browser/extensions/screenshots/webextension/_locales/sk/messages.json b/browser/extensions/screenshots/webextension/_locales/sk/messages.json
index b03d130267da56c18e87b873c9f5d69eb1328d8c..30406d66cd4ab5cc0fafe68d804783aa697ef5a5 100644
--- a/browser/extensions/screenshots/webextension/_locales/sk/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sk/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Nemôžete vytvoriť snímku obrazovky stránky Firefox Screenshots!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Váš výber je príliš malý"
+  },
   "genericErrorTitle": {
     "message": "Ups! Služba Firefox Screenshots prestala pracovať."
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/sl/messages.json b/browser/extensions/screenshots/webextension/_locales/sl/messages.json
index cfd27cb32f23bc943b5ab27562144e5b04981433..7027897960769fa39ed2269ce0569d38e33f1e4a 100644
--- a/browser/extensions/screenshots/webextension/_locales/sl/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sl/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Posnetka strani Firefox Screenshots ni mogoče zajeti!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Vaš izbor je premajhen"
+  },
   "genericErrorTitle": {
     "message": "Uf! Firefox Screenshots se je pokvaril."
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/sr/messages.json b/browser/extensions/screenshots/webextension/_locales/sr/messages.json
index e09ffbe4147eb82207a76d5380a2ffc051f1f8c4..ed925c64df93ac67a0e3db1b1fcef2792a15fc2d 100644
--- a/browser/extensions/screenshots/webextension/_locales/sr/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sr/messages.json
@@ -6,7 +6,7 @@
     "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
-    "message": "Усликајте екран"
+    "message": "Усликај екран"
   },
   "myShotsLink": {
     "message": "Моји снимци"
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Не можете усликати Firefox Screenshots страницу!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Ваша селекција је премала"
+  },
   "genericErrorTitle": {
     "message": "Ајој! Firefox Screenshots је пошашавио."
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json b/browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
index b03b54500052fe8e4cfea4d330c19d97423b0756..52351812bd71c330a8fff31a197c3bfa4fa33c6e 100644
--- a/browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Du kan inte ta en skärmbild av sidan Firefox Screenshots!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Ditt val är för litet"
+  },
   "genericErrorTitle": {
     "message": "Oj! Firefox Screenshots verkar inte fungera korrekt."
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/te/messages.json b/browser/extensions/screenshots/webextension/_locales/te/messages.json
index 662cc763ea999fb65e3aa11077f65ae68b6765e5..f04aa187ffbf9817310e493364f4ebf85e40524d 100644
--- a/browser/extensions/screenshots/webextension/_locales/te/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/te/messages.json
@@ -11,6 +11,9 @@
   "saveScreenshotSelectedArea": {
     "message": "భద్రపరచు"
   },
+  "saveScreenshotVisibleArea": {
+    "message": "కనిపించే దానిని బద్రపరచండి"
+  },
   "saveScreenshotFullPage": {
     "message": "పూర్తి పేజీని భద్రపరచు"
   },
@@ -23,9 +26,15 @@
   "notificationLinkCopiedTitle": {
     "message": "లంకె కాపీ అయింది"
   },
+  "requestErrorTitle": {
+    "message": "పని చెయుట లేదు."
+  },
   "requestErrorDetails": {
     "message": "క్షమిచండి! మీ తెరను భద్రపరచలేకపోయాం. దయచేసి కాసేపాగి మళ్ళీ ప్రయత్నించండి."
   },
+  "tourHeaderTwo": {
+    "message": ""
+  },
   "tourHeaderThree": {
     "message": "మీకు నచ్చినట్టుగా"
   },
diff --git a/browser/extensions/screenshots/webextension/_locales/uk/messages.json b/browser/extensions/screenshots/webextension/_locales/uk/messages.json
index e8cc5f6a3ff24d74296e815efafbf5caa46351f5..4451dfd1910532e78bb115700a237cabc988f288 100644
--- a/browser/extensions/screenshots/webextension/_locales/uk/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/uk/messages.json
@@ -64,6 +64,9 @@
   "selfScreenshotErrorTitle": {
     "message": "Ви не можете зробити знімок сторінки Firefox Screenshots!"
   },
+  "emptySelectionErrorTitle": {
+    "message": "Обрана область є замалою"
+  },
   "genericErrorTitle": {
     "message": "Оу! З Firefox Screenshots щось негаразд."
   },
diff --git a/browser/extensions/screenshots/webextension/background/auth.js b/browser/extensions/screenshots/webextension/background/auth.js
index 168409707c7e1d2c90561929b6e016b98f575a27..7bdf7d1754575d940c3da788e84b0bdea0d425b2 100644
--- a/browser/extensions/screenshots/webextension/background/auth.js
+++ b/browser/extensions/screenshots/webextension/background/auth.js
@@ -12,7 +12,7 @@ this.auth = (function() {
   let sentryPublicDSN = null;
   let abTests = {};
 
-  catcher.watchPromise(browser.storage.local.get(["registrationInfo", "abTests"]).then((result) => {
+  let registrationInfoFetched = catcher.watchPromise(browser.storage.local.get(["registrationInfo", "abTests"]).then((result) => {
     if (result.abTests) {
       abTests = result.abTests;
     }
@@ -177,33 +177,37 @@ this.auth = (function() {
   };
 
   exports.setDeviceInfoFromOldAddon = function(newDeviceInfo) {
-    if (!(newDeviceInfo.deviceId && newDeviceInfo.secret)) {
-      throw new Error("Bad deviceInfo");
-    }
-    if (registrationInfo.deviceId === newDeviceInfo.deviceId &&
-      registrationInfo.secret === newDeviceInfo.secret) {
-      // Probably we already imported the information
-      return Promise.resolve(false);
-    }
-    registrationInfo = {
-      deviceId: newDeviceInfo.deviceId,
-      secret: newDeviceInfo.secret,
-      registered: true
-    };
-    initialized = false;
-    return browser.storage.local.set({registrationInfo}).then(() => {
-      return true;
+    return registrationInfoFetched.then(() => {
+      if (!(newDeviceInfo.deviceId && newDeviceInfo.secret)) {
+        throw new Error("Bad deviceInfo");
+      }
+      if (registrationInfo.deviceId === newDeviceInfo.deviceId &&
+        registrationInfo.secret === newDeviceInfo.secret) {
+        // Probably we already imported the information
+        return Promise.resolve(false);
+      }
+      registrationInfo = {
+        deviceId: newDeviceInfo.deviceId,
+        secret: newDeviceInfo.secret,
+        registered: true
+      };
+      initialized = false;
+      return browser.storage.local.set({registrationInfo}).then(() => {
+        return true;
+      });
     });
   };
 
   communication.register("getAuthInfo", (sender, ownershipCheck) => {
-    let info = registrationInfo;
-    if (info.registered) {
-      return login({ownershipCheck}).then((result) => {
-        return {isOwner: result && result.isOwner, deviceId: registrationInfo.deviceId};
-      });
-    }
-    return Promise.resolve(info);
+    return registrationInfoFetched.then(() => {
+      let info = registrationInfo;
+      if (info.registered) {
+        return login({ownershipCheck}).then((result) => {
+          return {isOwner: result && result.isOwner, deviceId: registrationInfo.deviceId};
+        });
+      }
+      return info;
+    });
   });
 
   return exports;
diff --git a/browser/extensions/screenshots/webextension/background/senderror.js b/browser/extensions/screenshots/webextension/background/senderror.js
index 192a6160797067c2790aa0f6406b7ebbbc9e6438..0983c1dcbf4d7c361382b3e1ba36dda28515e470 100644
--- a/browser/extensions/screenshots/webextension/background/senderror.js
+++ b/browser/extensions/screenshots/webextension/background/senderror.js
@@ -37,6 +37,9 @@ this.senderror = (function() {
     MY_SHOTS: {
       title: browser.i18n.getMessage("selfScreenshotErrorTitle")
     },
+    EMPTY_SELECTION: {
+      title: browser.i18n.getMessage("emptySelectionErrorTitle")
+    },
     generic: {
       title: browser.i18n.getMessage("genericErrorTitle"),
       info: browser.i18n.getMessage("genericErrorDetails"),
@@ -89,7 +92,7 @@ this.senderror = (function() {
       return;
     }
     if (!Raven.isSetup()) {
-      Raven.config(dsn).install();
+      Raven.config(dsn, {allowSecretKey: true}).install();
     }
     let exception = new Error(e.message);
     exception.stack = e.multilineStack || e.stack || undefined;
@@ -112,7 +115,9 @@ this.senderror = (function() {
     if (!errorObj.noPopup) {
       exports.showError(errorObj);
     }
-    exports.reportError(errorObj);
+    if (!errorObj.noReport) {
+      exports.reportError(errorObj);
+    }
   });
 
   return exports;
diff --git a/browser/extensions/screenshots/webextension/build/buildSettings.js b/browser/extensions/screenshots/webextension/build/buildSettings.js
index 6dfe230ad1a03efb14c89f4317b8e3c046cd8ad0..ac5d165fd33eceb8ab20b3593094528bc99986b6 100644
--- a/browser/extensions/screenshots/webextension/build/buildSettings.js
+++ b/browser/extensions/screenshots/webextension/build/buildSettings.js
@@ -1,6 +1,7 @@
 window.buildSettings = {
-  defaultSentryDsn: "https://97d8afa496f94764ae255e739b147f4b@sentry.prod.mozaws.net/139",
-  logLevel: "" || "warn"
+  defaultSentryDsn: "https://904ccdd4866247c092ae8fc1a4764a63:940d44bdc71d4daea133c19080ccd38d@sentry.prod.mozaws.net/224",
+  logLevel: "" || "warn",
+  captureText: ("" === "true")
 };
 null;
 
diff --git a/browser/extensions/screenshots/webextension/build/inlineSelectionCss.js b/browser/extensions/screenshots/webextension/build/inlineSelectionCss.js
index fd5088abe8f98082745cbf0b27e829a818d2c3ca..34e78aeed0c8f7d4d15e901f442b74e8e8fa32bb 100644
--- a/browser/extensions/screenshots/webextension/build/inlineSelectionCss.js
+++ b/browser/extensions/screenshots/webextension/build/inlineSelectionCss.js
@@ -421,6 +421,9 @@ window.inlineSelectionCss = `
   position: absolute;
   right: 5px;
   top: 5px; }
+  html[dir="rtl"] .myshots-all-buttons-container {
+    left: 5px;
+    right: inherit; }
   .myshots-all-buttons-container .spacer {
     background-color: #c9c9c9;
     flex: 0 0 1px;
diff --git a/browser/extensions/screenshots/webextension/build/shot.js b/browser/extensions/screenshots/webextension/build/shot.js
index 7f0e0e5154e90a742ae08492b1b90515282e8eb0..eee02ed4519b8c7dc8a1bc7665741ee892807767 100644
--- a/browser/extensions/screenshots/webextension/build/shot.js
+++ b/browser/extensions/screenshots/webextension/build/shot.js
@@ -493,6 +493,9 @@ class AbstractShot {
     }
     delete this._clips[name];
   }
+  delAllClips() {
+    this._clips = {};
+  }
   biggestClipSortOrder() {
     let biggest = 0;
     for (let clipId in this._clips) {
diff --git a/browser/extensions/screenshots/webextension/manifest.json b/browser/extensions/screenshots/webextension/manifest.json
index f4ff303f510b73eb5af7fb1e72f1ad29a39641f8..9dae2b5acc59e149553eceb0dfac6c453e756369 100644
--- a/browser/extensions/screenshots/webextension/manifest.json
+++ b/browser/extensions/screenshots/webextension/manifest.json
@@ -1,7 +1,7 @@
 {
   "manifest_version": 2,
   "name": "Firefox Screenshots",
-  "version": "8.1.0",
+  "version": "9.0.0",
   "description": "__MSG_addonDescription__",
   "author": "__MSG_addonAuthorsList__",
   "homepage_url": "https://github.com/mozilla-services/screenshots",
@@ -16,7 +16,7 @@
       "16": "icons/icon-16.svg",
       "32": "icons/icon-32.svg"
     },
-    "default_title": "__MSG_contextMenuLabel__",
+    "default_title": "Firefox Screenshots",
     "browser_style": false
   },
   "background": {
diff --git a/browser/extensions/screenshots/webextension/onboarding/slides.js b/browser/extensions/screenshots/webextension/onboarding/slides.js
index c1eea7b4a09933949dc5afc69a93e7114967106e..f5acbcf4c7ed580dbd1cea62c81be4fc08b84d60 100644
--- a/browser/extensions/screenshots/webextension/onboarding/slides.js
+++ b/browser/extensions/screenshots/webextension/onboarding/slides.js
@@ -46,6 +46,8 @@ this.slides = (function() {
           doc.documentElement
         );
         doc.addEventListener("keyup", onKeyUp);
+        doc.documentElement.dir = browser.i18n.getMessage("@@bidi_dir");
+        doc.documentElement.lang = browser.i18n.getMessage("@@ui_locale");
         localizeText(doc);
         activateSlide(doc);
         resolve();
diff --git a/browser/extensions/screenshots/webextension/selector/shooter.js b/browser/extensions/screenshots/webextension/selector/shooter.js
index e3c7e309cf7236a243242094c9746e782518a8e1..cf23709a834108d75e483693ab320d1fa71f787c 100644
--- a/browser/extensions/screenshots/webextension/selector/shooter.js
+++ b/browser/extensions/screenshots/webextension/selector/shooter.js
@@ -1,5 +1,5 @@
 /* globals global, documentMetadata, util, uicontrol, ui, catcher */
-/* globals domainFromUrl, randomString */
+/* globals buildSettings, domainFromUrl, randomString */
 
 "use strict";
 
@@ -67,18 +67,31 @@ this.shooter = (function() { // eslint-disable-line no-unused-vars
     // isSaving indicates we're aleady in the middle of saving
     // we use a timeout so in the case of a failure the button will
     // still start working again
+    if (Math.floor(selectedPos.left) == Math.floor(selectedPos.right) ||
+        Math.floor(selectedPos.top) == Math.floor(selectedPos.bottom)) {
+        let exc = new Error("Empty selection");
+        exc.popupMessage = "EMPTY_SELECTION";
+        exc.noReport = true;
+        catcher.unhandled(exc);
+        return;
+    }
     const uicontrol = global.uicontrol;
     let deactivateAfterFinish = true;
     if (isSaving) {
       return;
     }
     isSaving = setTimeout(() => {
+      ui.Box.clearSaveDisabled();
       isSaving = null;
     }, 1000);
     selectedPos = selectedPos.asJson();
-    let captureText = util.captureEnclosedText(selectedPos);
+    let captureText = "";
+    if (buildSettings.captureText) {
+      captureText = util.captureEnclosedText(selectedPos);
+    }
     let dataUrl = screenshotPage(selectedPos);
     if (dataUrl) {
+      shot.delAllClips();
       shot.addClip({
         createdDate: Date.now(),
         image: {
diff --git a/browser/extensions/screenshots/webextension/selector/ui.js b/browser/extensions/screenshots/webextension/selector/ui.js
index d286ebb0fbfad6d2bb270c277a77de8ae9ea3745..8a5d3de69b43c76a828ffb4fcc72ae5f0586d950 100644
--- a/browser/extensions/screenshots/webextension/selector/ui.js
+++ b/browser/extensions/screenshots/webextension/selector/ui.js
@@ -104,6 +104,8 @@ this.ui = (function() { // eslint-disable-line no-unused-vars
             if (this.addClassName) {
               this.document.body.className = this.addClassName;
             }
+            this.document.documentElement.dir = browser.i18n.getMessage("@@bidi_dir");
+            this.document.documentElement.lang = browser.i18n.getMessage("@@ui_locale");
             resolve();
           });
           document.body.appendChild(this.element);
@@ -246,6 +248,8 @@ this.ui = (function() { // eslint-disable-line no-unused-vars
             if (this.addClassName) {
               this.document.body.className = this.addClassName;
             }
+            this.document.documentElement.dir = browser.i18n.getMessage("@@bidi_dir");
+            this.document.documentElement.lang = browser.i18n.getMessage("@@ui_locale");
             const overlay = this.document.querySelector(".preview-overlay");
             overlay.querySelector(".preview-instructions").textContent = browser.i18n.getMessage("screenshotInstructions");
             overlay.querySelector(".myshots-link").textContent = browser.i18n.getMessage("myShotsLink");
@@ -537,6 +541,10 @@ this.ui = (function() { // eslint-disable-line no-unused-vars
       return false;
     },
 
+    clearSaveDisabled() {
+      this.save.removeAttribute("disabled");
+    },
+
     el: null,
     boxTopEl: null,
     boxLeftEl: null,
diff --git a/browser/extensions/screenshots/webextension/selector/uicontrol.js b/browser/extensions/screenshots/webextension/selector/uicontrol.js
index c3cd016296582a572e93d46211c77aeeb45c00cb..7b3bb014f6df667d080bddab238000fdb9460706 100644
--- a/browser/extensions/screenshots/webextension/selector/uicontrol.js
+++ b/browser/extensions/screenshots/webextension/selector/uicontrol.js
@@ -376,7 +376,7 @@ this.uicontrol = (function() {
         ui.Box.remove();
         const handler = watchFunction(assertIsTrusted(keyupHandler));
         document.addEventListener("keyup", handler);
-        registeredDocumentHandlers.push({name: "keyup", doc: document, handler});
+        registeredDocumentHandlers.push({name: "keyup", doc: document, handler, useCapture: false});
       }));
     },
 
@@ -874,15 +874,21 @@ this.uicontrol = (function() {
     window.addEventListener('beforeunload', beforeunloadHandler);
   }
 
+  let mousedownSetOnDocument = false;
+
   function installHandlersOnDocument(docObj) {
     for (let [eventName, handler] of primedDocumentHandlers) {
       let watchHandler = watchFunction(handler);
-      docObj.addEventListener(eventName, watchHandler, eventName !== "keyup");
-      registeredDocumentHandlers.push({name: eventName, doc: docObj, watchHandler});
+      let useCapture = eventName !== "keyup";
+      docObj.addEventListener(eventName, watchHandler, useCapture);
+      registeredDocumentHandlers.push({name: eventName, doc: docObj, handler: watchHandler, useCapture});
+    }
+    if (!mousedownSetOnDocument) {
+      let mousedownHandler = primedDocumentHandlers.get("mousedown");
+      document.addEventListener("mousedown", mousedownHandler, true);
+      registeredDocumentHandlers.push({name: "mousedown", doc: document, handler: mousedownHandler, useCapture: true});
+      mousedownSetOnDocument = true;
     }
-    let mousedownHandler = primedDocumentHandlers.get("mousedown");
-    document.addEventListener("mousedown", mousedownHandler, true);
-    registeredDocumentHandlers.push({name: "mousedown", doc: document, watchHandler: mousedownHandler, useCapture: true});
   }
 
   function beforeunloadHandler() {