Merge mozilla-central to inbound. a=merge CLOSED TREE
authorNoemi Erli <nerli@mozilla.com>
Tue, 16 Oct 2018 07:30:03 +0300
changeset 499880 b9fec5dd4ff5ed4a098f5254c701d8c47d3100c5
parent 499879 24d8d0ea578a8d683794237561a825abe8b1d32e (current diff)
parent 499868 3c8790a73b7f31b253704a07e1bf7d0a65696b04 (diff)
child 499881 08174b4a8022f1a0b29bacb9d8f3a247e1497042
push id1864
push userffxbld-merge
push dateMon, 03 Dec 2018 15:51:40 +0000
treeherdermozilla-release@f040763d99ad [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone64.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to inbound. a=merge CLOSED TREE
browser/extensions/screenshots/bootstrap.js
browser/extensions/screenshots/install.rdf
browser/extensions/screenshots/test/browser/head.js
browser/extensions/screenshots/webextension/_locales/ach/messages.json
browser/extensions/screenshots/webextension/_locales/ar/messages.json
browser/extensions/screenshots/webextension/_locales/ast/messages.json
browser/extensions/screenshots/webextension/_locales/az/messages.json
browser/extensions/screenshots/webextension/_locales/be/messages.json
browser/extensions/screenshots/webextension/_locales/bg/messages.json
browser/extensions/screenshots/webextension/_locales/bn_BD/messages.json
browser/extensions/screenshots/webextension/_locales/br/messages.json
browser/extensions/screenshots/webextension/_locales/bs/messages.json
browser/extensions/screenshots/webextension/_locales/ca/messages.json
browser/extensions/screenshots/webextension/_locales/cak/messages.json
browser/extensions/screenshots/webextension/_locales/crh/messages.json
browser/extensions/screenshots/webextension/_locales/cs/messages.json
browser/extensions/screenshots/webextension/_locales/cy/messages.json
browser/extensions/screenshots/webextension/_locales/da/messages.json
browser/extensions/screenshots/webextension/_locales/de/messages.json
browser/extensions/screenshots/webextension/_locales/dsb/messages.json
browser/extensions/screenshots/webextension/_locales/el/messages.json
browser/extensions/screenshots/webextension/_locales/en_GB/messages.json
browser/extensions/screenshots/webextension/_locales/en_US/messages.json
browser/extensions/screenshots/webextension/_locales/eo/messages.json
browser/extensions/screenshots/webextension/_locales/es_AR/messages.json
browser/extensions/screenshots/webextension/_locales/es_CL/messages.json
browser/extensions/screenshots/webextension/_locales/es_ES/messages.json
browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
browser/extensions/screenshots/webextension/_locales/et/messages.json
browser/extensions/screenshots/webextension/_locales/eu/messages.json
browser/extensions/screenshots/webextension/_locales/fa/messages.json
browser/extensions/screenshots/webextension/_locales/ff/messages.json
browser/extensions/screenshots/webextension/_locales/fi/messages.json
browser/extensions/screenshots/webextension/_locales/fr/messages.json
browser/extensions/screenshots/webextension/_locales/fy_NL/messages.json
browser/extensions/screenshots/webextension/_locales/ga_IE/messages.json
browser/extensions/screenshots/webextension/_locales/gd/messages.json
browser/extensions/screenshots/webextension/_locales/gl/messages.json
browser/extensions/screenshots/webextension/_locales/gn/messages.json
browser/extensions/screenshots/webextension/_locales/gu_IN/messages.json
browser/extensions/screenshots/webextension/_locales/he/messages.json
browser/extensions/screenshots/webextension/_locales/hi_IN/messages.json
browser/extensions/screenshots/webextension/_locales/hr/messages.json
browser/extensions/screenshots/webextension/_locales/hsb/messages.json
browser/extensions/screenshots/webextension/_locales/hu/messages.json
browser/extensions/screenshots/webextension/_locales/hy_AM/messages.json
browser/extensions/screenshots/webextension/_locales/ia/messages.json
browser/extensions/screenshots/webextension/_locales/id/messages.json
browser/extensions/screenshots/webextension/_locales/it/messages.json
browser/extensions/screenshots/webextension/_locales/ja/messages.json
browser/extensions/screenshots/webextension/_locales/ka/messages.json
browser/extensions/screenshots/webextension/_locales/kab/messages.json
browser/extensions/screenshots/webextension/_locales/kk/messages.json
browser/extensions/screenshots/webextension/_locales/km/messages.json
browser/extensions/screenshots/webextension/_locales/kn/messages.json
browser/extensions/screenshots/webextension/_locales/ko/messages.json
browser/extensions/screenshots/webextension/_locales/lij/messages.json
browser/extensions/screenshots/webextension/_locales/lo/messages.json
browser/extensions/screenshots/webextension/_locales/lt/messages.json
browser/extensions/screenshots/webextension/_locales/mai/messages.json
browser/extensions/screenshots/webextension/_locales/mk/messages.json
browser/extensions/screenshots/webextension/_locales/ml/messages.json
browser/extensions/screenshots/webextension/_locales/mn/messages.json
browser/extensions/screenshots/webextension/_locales/mr/messages.json
browser/extensions/screenshots/webextension/_locales/ms/messages.json
browser/extensions/screenshots/webextension/_locales/my/messages.json
browser/extensions/screenshots/webextension/_locales/nb_NO/messages.json
browser/extensions/screenshots/webextension/_locales/ne_NP/messages.json
browser/extensions/screenshots/webextension/_locales/nl/messages.json
browser/extensions/screenshots/webextension/_locales/nn_NO/messages.json
browser/extensions/screenshots/webextension/_locales/pa_IN/messages.json
browser/extensions/screenshots/webextension/_locales/pl/messages.json
browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
browser/extensions/screenshots/webextension/_locales/pt_PT/messages.json
browser/extensions/screenshots/webextension/_locales/rm/messages.json
browser/extensions/screenshots/webextension/_locales/ro/messages.json
browser/extensions/screenshots/webextension/_locales/ru/messages.json
browser/extensions/screenshots/webextension/_locales/sk/messages.json
browser/extensions/screenshots/webextension/_locales/sl/messages.json
browser/extensions/screenshots/webextension/_locales/sq/messages.json
browser/extensions/screenshots/webextension/_locales/sr/messages.json
browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
browser/extensions/screenshots/webextension/_locales/ta/messages.json
browser/extensions/screenshots/webextension/_locales/te/messages.json
browser/extensions/screenshots/webextension/_locales/th/messages.json
browser/extensions/screenshots/webextension/_locales/tl/messages.json
browser/extensions/screenshots/webextension/_locales/tr/messages.json
browser/extensions/screenshots/webextension/_locales/uk/messages.json
browser/extensions/screenshots/webextension/_locales/ur/messages.json
browser/extensions/screenshots/webextension/_locales/uz/messages.json
browser/extensions/screenshots/webextension/_locales/vi/messages.json
browser/extensions/screenshots/webextension/_locales/zh_CN/messages.json
browser/extensions/screenshots/webextension/_locales/zh_TW/messages.json
browser/extensions/screenshots/webextension/assertIsBlankDocument.js
browser/extensions/screenshots/webextension/assertIsTrusted.js
browser/extensions/screenshots/webextension/background/analytics.js
browser/extensions/screenshots/webextension/background/auth.js
browser/extensions/screenshots/webextension/background/communication.js
browser/extensions/screenshots/webextension/background/deviceInfo.js
browser/extensions/screenshots/webextension/background/main.js
browser/extensions/screenshots/webextension/background/selectorLoader.js
browser/extensions/screenshots/webextension/background/senderror.js
browser/extensions/screenshots/webextension/background/startBackground.js
browser/extensions/screenshots/webextension/background/takeshot.js
browser/extensions/screenshots/webextension/blank.html
browser/extensions/screenshots/webextension/blobConverters.js
browser/extensions/screenshots/webextension/build/buildSettings.js
browser/extensions/screenshots/webextension/build/inlineSelectionCss.js
browser/extensions/screenshots/webextension/build/onboardingCss.js
browser/extensions/screenshots/webextension/build/onboardingHtml.js
browser/extensions/screenshots/webextension/build/raven.js
browser/extensions/screenshots/webextension/build/selection.js
browser/extensions/screenshots/webextension/build/shot.js
browser/extensions/screenshots/webextension/build/thumbnailGenerator.js
browser/extensions/screenshots/webextension/catcher.js
browser/extensions/screenshots/webextension/clipboard.js
browser/extensions/screenshots/webextension/domainFromUrl.js
browser/extensions/screenshots/webextension/icons/back-highlight.svg
browser/extensions/screenshots/webextension/icons/back.svg
browser/extensions/screenshots/webextension/icons/cancel.svg
browser/extensions/screenshots/webextension/icons/cloud.svg
browser/extensions/screenshots/webextension/icons/copied-notification.svg
browser/extensions/screenshots/webextension/icons/copy.svg
browser/extensions/screenshots/webextension/icons/done.svg
browser/extensions/screenshots/webextension/icons/download.svg
browser/extensions/screenshots/webextension/icons/help-16.svg
browser/extensions/screenshots/webextension/icons/icon-highlight-32-v2.svg
browser/extensions/screenshots/webextension/icons/icon-v2.svg
browser/extensions/screenshots/webextension/icons/icon-welcome-face-without-eyes.svg
browser/extensions/screenshots/webextension/icons/menu-fullpage.svg
browser/extensions/screenshots/webextension/icons/menu-myshot-white.svg
browser/extensions/screenshots/webextension/icons/menu-myshot.svg
browser/extensions/screenshots/webextension/icons/menu-visible.svg
browser/extensions/screenshots/webextension/icons/onboarding-1.png
browser/extensions/screenshots/webextension/icons/onboarding-2.png
browser/extensions/screenshots/webextension/icons/onboarding-3.png
browser/extensions/screenshots/webextension/icons/onboarding-4.png
browser/extensions/screenshots/webextension/icons/onboarding-5.png
browser/extensions/screenshots/webextension/log.js
browser/extensions/screenshots/webextension/makeUuid.js
browser/extensions/screenshots/webextension/manifest.json
browser/extensions/screenshots/webextension/onboarding/slides.html
browser/extensions/screenshots/webextension/onboarding/slides.js
browser/extensions/screenshots/webextension/randomString.js
browser/extensions/screenshots/webextension/selector/callBackground.js
browser/extensions/screenshots/webextension/selector/documentMetadata.js
browser/extensions/screenshots/webextension/selector/shooter.js
browser/extensions/screenshots/webextension/selector/ui.js
browser/extensions/screenshots/webextension/selector/uicontrol.js
browser/extensions/screenshots/webextension/selector/util.js
browser/extensions/screenshots/webextension/sitehelper.js
js/src/vm/JSFunction.cpp
--- a/browser/base/content/test/general/browser_contextmenu.js
+++ b/browser/base/content/test/general/browser_contextmenu.js
@@ -14,16 +14,22 @@ let hasPocket = Services.prefs.getBoolPr
 let hasContainers = Services.prefs.getBoolPref("privacy.userContext.enabled");
 
 const example_base = "http://example.com/browser/browser/base/content/test/general/";
 const chrome_base = "chrome://mochitests/content/browser/browser/base/content/test/general/";
 
 /* import-globals-from contextmenu_common.js */
 Services.scriptloader.loadSubScript(chrome_base + "contextmenu_common.js", this);
 
+add_task(async function init() {
+  // Ensure screenshots is really disabled (bug 1498738)
+  const addon = await AddonManager.getAddonByID("screenshots@mozilla.org");
+  await addon.disable({allowSystemAddons: true});
+});
+
 // Below are test cases for XUL element
 add_task(async function test_xul_text_link_label() {
   let url = chrome_base + "subtst_contextmenu_xul.xul";
 
   await BrowserTestUtils.openNewForegroundTab({
     gBrowser,
     url,
     waitForLoad: true,
--- a/browser/base/content/test/general/browser_contextmenu_input.js
+++ b/browser/base/content/test/general/browser_contextmenu_input.js
@@ -7,16 +7,20 @@ add_task(async function test_setup() {
   const example_base = "http://example.com/browser/browser/base/content/test/general/";
   const url = example_base + "subtst_contextmenu_input.html";
   await BrowserTestUtils.openNewForegroundTab(gBrowser, url);
 
   const chrome_base = "chrome://mochitests/content/browser/browser/base/content/test/general/";
   const contextmenu_common = chrome_base + "contextmenu_common.js";
   /* import-globals-from contextmenu_common.js */
   Services.scriptloader.loadSubScript(contextmenu_common, this);
+
+  // Ensure screenshots is really disabled (bug 1498738)
+  const addon = await AddonManager.getAddonByID("screenshots@mozilla.org");
+  await addon.disable({allowSystemAddons: true});
 });
 
 add_task(async function test_text_input() {
   await test_contextmenu("#input_text",
     ["context-undo",        false,
      "---",                 null,
      "context-cut",         true,
      "context-copy",        true,
@@ -170,20 +174,16 @@ add_task(async function test_tel_email_u
       ["context-undo",        false,
        "---",                 null,
        "context-cut",         true,
        "context-copy",        true,
        "context-paste",       null, // ignore clipboard state
        "context-delete",      false,
        "---",                 null,
        "context-selectall",   null], {
-      // XXX Bug 1345081. Currently the Screenshots menu option is shown for
-      // various text elements even though it is set to type "page". That bug
-      // should remove the need for next line.
-      maybeScreenshotsPresent: true,
       skipFocusChange: true,
     });
   }
 });
 
 add_task(async function test_date_time_color_range_month_week_datetimelocal_input() {
   for (let selector of ["#input_date", "#input_time", "#input_color",
                         "#input_range", "#input_month", "#input_week",
--- a/browser/base/content/test/general/contextmenu_common.js
+++ b/browser/base/content/test/general/contextmenu_common.js
@@ -67,17 +67,17 @@ function getVisibleMenuItems(aMenu, aDat
             } else if (item.id.indexOf("spell-check-dictionary-") != 0 &&
                        item.id != "spell-no-suggestions" &&
                        item.id != "spell-add-dictionaries-main" &&
                        item.id != "context-savelinktopocket" &&
                        item.id != "fill-login-saved-passwords" &&
                        item.id != "fill-login-no-logins" &&
                        // XXX Screenshots doesn't have an access key. This needs
                        // at least bug 1320462 fixing first.
-                       item.id != "screenshots_mozilla_org_create-screenshot") {
+                       item.id != "screenshots_mozilla_org-menuitem-_create-screenshot") {
               ok(key, "menuitem " + item.id + " has an access key");
               if (accessKeys[key])
                   ok(false, "menuitem " + item.id + " has same accesskey as " + accessKeys[key]);
               else
                   accessKeys[key] = item.id;
             }
             if (!isGenerated && !isPageMenuItem) {
               items.push(item.id);
@@ -326,17 +326,17 @@ async function test_contextmenu(selector
       let inspectA11YItems = ["context-inspect-a11y", true];
       menuItems = menuItems.concat(inspectA11YItems);
     }
 
     if (options.maybeScreenshotsPresent &&
         !Services.prefs.getBoolPref("extensions.screenshots.disabled", false)) {
       let screenshotItems = [
         "---", null,
-        "screenshots_mozilla_org_create-screenshot", true,
+        "screenshots_mozilla_org-menuitem-_create-screenshot", true,
       ];
 
       menuItems = menuItems.concat(screenshotItems);
     }
 
     checkContextMenu(menuItems);
   }
 
--- a/browser/base/content/test/performance/browser_preferences_usage.js
+++ b/browser/base/content/test/performance/browser_preferences_usage.js
@@ -87,34 +87,25 @@ add_task(async function startup() {
       max: 350,
     },
     "layout.css.prefixes.webkit": {
       min: 135,
       max: 170,
     },
     "layout.css.dpi": {
       min: 45,
-      max: 75,
+      max: 81,
     },
     "network.loadinfo.skip_type_assertion": {
       // This is accessed in debug only.
     },
     "extensions.getAddons.cache.enabled": {
-      min: 6,
+      min: 5,
       max: 55,
     },
-
-    // Disabling screenshots in the default test profile triggers some
-    // work in the chrome registry that reads this pref.  This can be removed
-    // when bootstrapped extensions are gone, or even when screenshots
-    // moves away from bootstrap (bug 1422437)
-    "chrome.override_package.global": {
-      min: 0,
-      max: 70,
-    },
   };
 
   let startupRecorder = Cc["@mozilla.org/test/startuprecorder;1"].getService().wrappedJSObject;
   await startupRecorder.done;
 
   ok(startupRecorder.data.prefStats, "startupRecorder has prefStats");
 
   checkPrefGetters(startupRecorder.data.prefStats, max, whitelist);
--- a/browser/base/content/test/siteIdentity/browser_navigation_failures.js
+++ b/browser/base/content/test/siteIdentity/browser_navigation_failures.js
@@ -1,17 +1,18 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests that the site identity indicator is properly updated for navigations
 // that fail for various reasons. In particular, we currently test TLS handshake
-// failures and about: pages that don't actually exist.
-// See bug 1492424 and bug 1493427.
+// failures, about: pages that don't actually exist, and situations where the
+// TLS handshake completes but the server then closes the connection.
+// See bug 1492424, bug 1493427, and bug 1391207.
 
 const kSecureURI = getRootDirectory(gTestPath).replace("chrome://mochitests/content",
                                                        "https://example.com") + "dummy_page.html";
 add_task(async function() {
   await BrowserTestUtils.withNewTab(kSecureURI, async (browser) => {
     let identityMode = window.document.getElementById("identity-box").className;
     is(identityMode, "verifiedDomain", "identity should be secure before");
 
@@ -34,8 +35,101 @@ add_task(async function() {
     // Try to load an about: page that doesn't exist
     BrowserTestUtils.loadURI(browser, BAD_ABOUT_PAGE_URI);
     await BrowserTestUtils.browserLoaded(browser, false, BAD_ABOUT_PAGE_URI, true);
 
     let newIdentityMode = window.document.getElementById("identity-box").className;
     is(newIdentityMode, "unknownIdentity", "identity should be unknown (not secure) after");
   });
 });
+
+// Helper function to start a TLS server that will accept a connection, complete
+// the TLS handshake, but then close the connection.
+function startServer(cert) {
+  let tlsServer = Cc["@mozilla.org/network/tls-server-socket;1"]
+                    .createInstance(Ci.nsITLSServerSocket);
+  tlsServer.init(-1, true, -1);
+  tlsServer.serverCert = cert;
+
+  let input, output;
+
+  let listener = {
+    onSocketAccepted(socket, transport) {
+      let connectionInfo = transport.securityInfo
+                           .QueryInterface(Ci.nsITLSServerConnectionInfo);
+      connectionInfo.setSecurityObserver(listener);
+      input = transport.openInputStream(0, 0, 0);
+      output = transport.openOutputStream(0, 0, 0);
+    },
+
+    onHandshakeDone(socket, status) {
+      input.asyncWait({
+        onInputStreamReady(readyInput) {
+          try {
+            input.close();
+            output.close();
+          } catch (e) {
+            info(e);
+          }
+        },
+      }, 0, 0, Services.tm.currentThread);
+    },
+
+    onStopListening() {
+    },
+  };
+
+  tlsServer.setSessionTickets(false);
+  tlsServer.asyncListen(listener);
+
+  return tlsServer;
+}
+
+// Test that if we complete a TLS handshake but the server closes the connection
+// just after doing so (resulting in a "connection reset" error page), the site
+// identity information gets updated appropriately (it should indicate "not
+// secure").
+add_task(async function() {
+  await SpecialPowers.pushPrefEnv({
+    // This test fails on some platforms if we leave IPv6 enabled.
+    set: [["network.dns.disableIPv6", true]],
+  });
+  let certService = Cc["@mozilla.org/security/local-cert-service;1"]
+                      .getService(Ci.nsILocalCertService);
+  let certOverrideService = Cc["@mozilla.org/security/certoverride;1"]
+                              .getService(Ci.nsICertOverrideService);
+
+  let cert = await new Promise((resolve, reject) => {
+    certService.getOrCreateCert("broken-tls-server", {
+      handleCert(c, rv) {
+        if (!Components.isSuccessCode(rv)) {
+          reject(rv);
+          return;
+        }
+        resolve(c);
+      },
+    });
+  });
+  // Start a server and trust its certificate.
+  let server = startServer(cert);
+  let overrideBits = Ci.nsICertOverrideService.ERROR_UNTRUSTED |
+                     Ci.nsICertOverrideService.ERROR_MISMATCH;
+  certOverrideService.rememberValidityOverride("localhost", server.port, cert,
+                                               overrideBits, true);
+
+  // Un-do configuration changes we've made when the test is done.
+  registerCleanupFunction(() => {
+    certOverrideService.clearValidityOverride("localhost", server.port);
+    server.close();
+  });
+
+  // Open up a new tab...
+  await BrowserTestUtils.withNewTab("about:blank", async (browser) => {
+    const TLS_HANDSHAKE_FAILURE_URI = `https://localhost:${server.port}/`;
+    // Try to connect to a server where the TLS handshake will succeed, but then
+    // the server closes the connection right after.
+    BrowserTestUtils.loadURI(browser, TLS_HANDSHAKE_FAILURE_URI);
+    await BrowserTestUtils.browserLoaded(browser, false, TLS_HANDSHAKE_FAILURE_URI, true);
+
+    let identityMode = window.document.getElementById("identity-box").className;
+    is(identityMode, "unknownIdentity", "identity should be 'unknown'");
+  });
+});
--- a/browser/components/extensions/parent/ext-commands.js
+++ b/browser/components/extensions/parent/ext-commands.js
@@ -155,16 +155,27 @@ this.commands = class extends ExtensionA
     let keyset = doc.createXULElement("keyset");
     keyset.id = `ext-keyset-id-${this.id}`;
     if (this.keysetsMap.has(window)) {
       this.keysetsMap.get(window).remove();
     }
     let sidebarKey;
     commands.forEach((command, name) => {
       if (command.shortcut) {
+        let parts = command.shortcut.split("+");
+
+        // The key is always the last element.
+        let key = parts.pop();
+
+        if (/^[0-9]$/.test(key)) {
+          let shortcutWithNumpad = command.shortcut.replace(/[0-9]$/, "Numpad$&");
+          let numpadKeyElement = this.buildKey(doc, name, shortcutWithNumpad);
+          keyset.appendChild(numpadKeyElement);
+        }
+
         let keyElement = this.buildKey(doc, name, command.shortcut);
         keyset.appendChild(keyElement);
         if (name == EXECUTE_SIDEBAR_ACTION) {
           sidebarKey = keyElement;
         }
       }
     });
     doc.documentElement.appendChild(keyset);
@@ -234,17 +245,20 @@ this.commands = class extends ExtensionA
 
     let parts = shortcut.split("+");
 
     // The key is always the last element.
     let chromeKey = parts.pop();
 
     // The modifiers are the remaining elements.
     keyElement.setAttribute("modifiers", this.getModifiersAttribute(parts));
-    if (name == EXECUTE_SIDEBAR_ACTION) {
+
+    // A keyElement with key "NumpadX" is created above and isn't from the
+    // manifest. The id will be set on the keyElement with key "X" only.
+    if (name == EXECUTE_SIDEBAR_ACTION && !chromeKey.startsWith("Numpad")) {
       let id = `ext-key-id-${this.id}-sidebar-action`;
       keyElement.setAttribute("id", id);
     }
 
     if (/^[A-Z]$/.test(chromeKey)) {
       // We use the key attribute for all single digits and characters.
       keyElement.setAttribute("key", chromeKey);
     } else {
@@ -264,17 +278,17 @@ this.commands = class extends ExtensionA
    *    ---------------------------------------
    *    "PageUP"  |  "VK_PAGE_UP"
    *    "Delete"  |  "VK_DELETE"
    *
    * @param {string} chromeKey The chrome key (e.g. "PageUp", "Space", ...)
    * @returns {string} The constructed value for the Key's 'keycode' attribute.
    */
   getKeycodeAttribute(chromeKey) {
-    if (/[0-9]/.test(chromeKey)) {
+    if (/^[0-9]$/.test(chromeKey)) {
       return `VK_${chromeKey}`;
     }
     return `VK${chromeKey.replace(/([A-Z])/g, "_$&").toUpperCase()}`;
   }
 
   /**
    * Determines the corresponding XUL modifiers from the chrome modifiers.
    *
--- a/browser/components/extensions/parent/ext-sidebarAction.js
+++ b/browser/components/extensions/parent/ext-sidebarAction.js
@@ -263,81 +263,95 @@ this.sidebarAction = class extends Exten
     } else {
       for (let window of windowTracker.browserWindows()) {
         this.updateWindow(window);
       }
     }
   }
 
   /**
-   * Gets the target object and its associated values corresponding to
-   * the `details` parameter of the various get* and set* API methods.
+   * Gets the target object corresponding to the `details` parameter of the various
+   * get* and set* API methods.
    *
    * @param {Object} details
    *        An object with optional `tabId` or `windowId` properties.
    * @throws if both `tabId` and `windowId` are specified, or if they are invalid.
-   * @returns {Object}
-   *        An object with two properties: `target` and `values`.
-   *        - If a `tabId` was specified, `target` will be the corresponding
-   *          XULElement tab. If a `windowId` was specified, `target` will be
-   *          the corresponding ChromeWindow. Otherwise it will be `null`.
-   *        - `values` will contain the icon, title and panel associated with
-   *          the target.
+   * @returns {XULElement|ChromeWindow|null}
+   *        If a `tabId` was specified, the corresponding XULElement tab.
+   *        If a `windowId` was specified, the corresponding ChromeWindow.
+   *        Otherwise, `null`.
    */
-  getContextData({tabId, windowId}) {
+  getTargetFromDetails({tabId, windowId}) {
     if (tabId != null && windowId != null) {
       throw new ExtensionError("Only one of tabId and windowId can be specified.");
     }
-    let target, values;
     if (tabId != null) {
-      target = tabTracker.getTab(tabId);
-      values = this.tabContext.get(target);
+      return tabTracker.getTab(tabId);
     } else if (windowId != null) {
-      target = windowTracker.getWindow(windowId);
-      values = this.tabContext.get(target);
-    } else {
-      target = null;
-      values = this.globals;
+      return windowTracker.getWindow(windowId);
     }
-    return {target, values};
+    return null;
+  }
+
+  /**
+   * Gets the data associated with a tab, window, or the global one.
+   *
+   * @param {XULElement|ChromeWindow|null} target
+   *        A XULElement tab, a ChromeWindow, or null for the global data.
+   * @returns {Object}
+   *        The icon, title, panel, etc. associated with the target.
+   */
+  getContextData(target) {
+    if (target) {
+      return this.tabContext.get(target);
+    }
+    return this.globals;
   }
 
   /**
    * Set a global, window specific or tab specific property.
    *
-   * @param {Object} details
-   *        An object with optional `tabId` or `windowId` properties.
+   * @param {XULElement|ChromeWindow|null} target
+   *        A XULElement tab, a ChromeWindow, or null for the global data.
    * @param {string} prop
    *        String property to set ["icon", "title", or "panel"].
    * @param {string} value
    *        Value for property.
    */
-  setProperty(details, prop, value) {
-    let {target, values} = this.getContextData(details);
+  setProperty(target, prop, value) {
+    let values = this.getContextData(target);
     if (value === null) {
       delete values[prop];
     } else {
       values[prop] = value;
     }
 
     this.updateOnChange(target);
   }
 
   /**
    * Retrieve the value of a global, window specific or tab specific property.
    *
-   * @param {Object} details
-   *        An object with optional `tabId` or `windowId` properties.
+   * @param {XULElement|ChromeWindow|null} target
+   *        A XULElement tab, a ChromeWindow, or null for the global data.
    * @param {string} prop
    *        String property to retrieve ["icon", "title", or "panel"]
    * @returns {string} value
    *          Value of prop.
    */
-  getProperty(details, prop) {
-    return this.getContextData(details).values[prop];
+  getProperty(target, prop) {
+    return this.getContextData(target)[prop];
+  }
+
+  setPropertyFromDetails(details, prop, value) {
+    return this.setProperty(this.getTargetFromDetails(details), prop, value);
+  }
+
+  getPropertyFromDetails(details, prop) {
+    return this.getProperty(this.getTargetFromDetails(details), prop);
   }
 
   /**
    * Triggers this sidebar action for the given window, with the same effects as
    * if it were toggled via menu or toolbarbutton by a user.
    *
    * @param {ChromeWindow} window
    */
@@ -384,48 +398,48 @@ this.sidebarAction = class extends Exten
 
   getAPI(context) {
     let {extension} = context;
     const sidebarAction = this;
 
     return {
       sidebarAction: {
         async setTitle(details) {
-          sidebarAction.setProperty(details, "title", details.title);
+          sidebarAction.setPropertyFromDetails(details, "title", details.title);
         },
 
         getTitle(details) {
-          return sidebarAction.getProperty(details, "title");
+          return sidebarAction.getPropertyFromDetails(details, "title");
         },
 
         async setIcon(details) {
           let icon = IconDetails.normalize(details, extension, context);
           if (!Object.keys(icon).length) {
             icon = null;
           }
-          sidebarAction.setProperty(details, "icon", icon);
+          sidebarAction.setPropertyFromDetails(details, "icon", icon);
         },
 
         async setPanel(details) {
           let url;
           // Clear the url when given null or empty string.
           if (!details.panel) {
             url = null;
           } else {
             url = context.uri.resolve(details.panel);
             if (!context.checkLoadURL(url)) {
               return Promise.reject({message: `Access denied for URL ${url}`});
             }
           }
 
-          sidebarAction.setProperty(details, "panel", url);
+          sidebarAction.setPropertyFromDetails(details, "panel", url);
         },
 
         getPanel(details) {
-          return sidebarAction.getProperty(details, "panel");
+          return sidebarAction.getPropertyFromDetails(details, "panel");
         },
 
         open() {
           let window = windowTracker.topWindow;
           sidebarAction.open(window);
         },
 
         close() {
--- a/browser/components/extensions/test/browser/browser_ext_commands_onCommand.js
+++ b/browser/components/extensions/test/browser/browser_ext_commands_onCommand.js
@@ -185,16 +185,17 @@ add_task(async function test_user_define
   // Create a window before the extension is loaded.
   let win1 = await BrowserTestUtils.openNewBrowserWindow();
   await BrowserTestUtils.loadURI(win1.gBrowser.selectedBrowser, "about:robots");
   await BrowserTestUtils.browserLoaded(win1.gBrowser.selectedBrowser);
 
   let commands = {};
   let isMac = AppConstants.platform == "macosx";
   let totalMacOnlyCommands = 0;
+  let numberNumericCommands = 4;
 
   for (let testCommand of testCommands) {
     let command = {
       suggested_key: {},
     };
 
     if (testCommand.shortcut) {
       command.suggested_key.default = testCommand.shortcut;
@@ -249,17 +250,17 @@ add_task(async function test_user_define
     }
   }
 
   // Create another window after the extension is loaded.
   let win2 = await BrowserTestUtils.openNewBrowserWindow();
   await BrowserTestUtils.loadURI(win2.gBrowser.selectedBrowser, "about:robots");
   await BrowserTestUtils.browserLoaded(win2.gBrowser.selectedBrowser);
 
-  let totalTestCommands = Object.keys(testCommands).length;
+  let totalTestCommands = Object.keys(testCommands).length + numberNumericCommands;
   let expectedCommandsRegistered = isMac ? totalTestCommands : totalTestCommands - totalMacOnlyCommands;
 
   // Confirm the keysets have been added to both windows.
   let keysetID = `ext-keyset-id-${makeWidgetId(extension.id)}`;
   let keyset = win1.document.getElementById(keysetID);
   ok(keyset != null, "Expected keyset to exist");
   is(keyset.children.length, expectedCommandsRegistered, "Expected keyset to have the correct number of children");
 
--- a/browser/components/extensions/test/browser/browser_ext_commands_update.js
+++ b/browser/components/extensions/test/browser/browser_ext_commands_update.js
@@ -107,26 +107,26 @@ add_task(async function test_update_defi
         browser.test.assertEq("foo", command.name, "The name is unchanged");
         browser.test.assertEq("The only command", command.description, "The description is updated");
         browser.test.assertEq("Ctrl+Shift+L", command.shortcut, "The shortcut is unchanged");
 
         // Update the description and shortcut.
         await browser.commands.update({
           name: "foo",
           description: "The new command",
-          shortcut: "   Alt+  Shift +P",
+          shortcut: "   Alt+  Shift +9",
         });
 
         // Test the updated shortcut.
         commands = await browser.commands.getAll();
         browser.test.assertEq(1, commands.length, "There is still 1 command");
         command = commands[0];
         browser.test.assertEq("foo", command.name, "The name is unchanged");
         browser.test.assertEq("The new command", command.description, "The description is updated");
-        browser.test.assertEq("Alt+Shift+P", command.shortcut, "The shortcut is updated");
+        browser.test.assertEq("Alt+Shift+9", command.shortcut, "The shortcut is updated");
 
         // Test a bad shortcut update.
         browser.test.assertThrows(
           () => browser.commands.update({name: "foo", shortcut: "Ctl+Shift+L"}),
           /Type error for parameter detail/,
           "It rejects for a bad shortcut");
 
         // Try to update a command that doesn't exist.
@@ -150,74 +150,86 @@ add_task(async function test_update_defi
   function checkKey(extensionId, shortcutKey, modifiers) {
     let keyset = extensionKeyset(extensionId);
     is(keyset.children.length, 1, "There is 1 key in the keyset");
     let key = keyset.children[0];
     is(key.getAttribute("key"), shortcutKey, "The key is correct");
     is(key.getAttribute("modifiers"), modifiers, "The modifiers are correct");
   }
 
+  function checkNumericKey(extensionId, key, modifiers) {
+    let keyset = extensionKeyset(extensionId);
+    is(keyset.children.length, 2, "There are 2 keys in the keyset now, 1 of which contains a keycode.");
+    let numpadKey = keyset.children[0];
+    is(numpadKey.getAttribute("keycode"), `VK_NUMPAD${key}`, "The numpad keycode is correct.");
+    is(numpadKey.getAttribute("modifiers"), modifiers, "The modifiers are correct");
+
+    let originalNumericKey = keyset.children[1];
+    is(originalNumericKey.getAttribute("keycode"), `VK_${key}`, "The original key is correct.");
+    is(originalNumericKey.getAttribute("modifiers"), modifiers, "The modifiers are correct");
+  }
+
   // Check that the <key> is set for the original shortcut.
   checkKey(extension.id, "I", "accel shift");
 
   await extension.awaitMessage("ready");
   extension.sendMessage("run");
   await extension.awaitFinish("commands");
 
-  // Check that the <key> has been updated.
-  checkKey(extension.id, "P", "alt shift");
+  // Check that the <keycode> has been updated.
+  checkNumericKey(extension.id, "9", "alt shift");
 
   // Check that the updated command is stored in ExtensionSettingsStore.
   let storedCommands = ExtensionSettingsStore.getAllForExtension(
     extension.id, "commands");
   is(storedCommands.length, 1, "There is only one stored command");
   let command = ExtensionSettingsStore.getSetting("commands", "foo", extension.id).value;
   is(command.description, "The new command", "The description is stored");
-  is(command.shortcut, "Alt+Shift+P", "The shortcut is stored");
+  is(command.shortcut, "Alt+Shift+9", "The shortcut is stored");
 
   // Check that the key is updated immediately.
   extension.sendMessage("update", {name: "foo", shortcut: "Ctrl+Shift+M"});
   await extension.awaitMessage("updateDone");
   checkKey(extension.id, "M", "accel shift");
 
   // Ensure all successive updates are stored.
   // Force the command to only have a description saved.
   await ExtensionSettingsStore.addSetting(
     extension.id, "commands", "foo", {description: "description only"});
   // This command now only has a description set in storage, also update the shortcut.
-  extension.sendMessage("update", {name: "foo", shortcut: "Alt+Shift+P"});
+  extension.sendMessage("update", {name: "foo", shortcut: "Alt+Shift+9"});
   await extension.awaitMessage("updateDone");
   let storedCommand = await ExtensionSettingsStore.getSetting(
     "commands", "foo", extension.id);
-  is(storedCommand.value.shortcut, "Alt+Shift+P", "The shortcut is saved correctly");
+  is(storedCommand.value.shortcut, "Alt+Shift+9", "The shortcut is saved correctly");
   is(storedCommand.value.description, "description only", "The description is saved correctly");
 
   // Calling browser.commands.reset("foo") should reset to manifest version.
   extension.sendMessage("reset", "foo");
   await extension.awaitMessage("resetDone");
 
   checkKey(extension.id, "I", "accel shift");
 
   // Check that enable/disable removes the keyset and reloads the saved command.
   let addon = await AddonManager.getAddonByID(extension.id);
   await disableAddon(addon);
   let keyset = extensionKeyset(extension.id);
   is(keyset, null, "The extension keyset is removed when disabled");
   // Add some commands to storage, only "foo" should get loaded.
   await ExtensionSettingsStore.addSetting(
-    extension.id, "commands", "foo", {shortcut: "Alt+Shift+P"});
+    extension.id, "commands", "foo", {shortcut: "Alt+Shift+9"});
   await ExtensionSettingsStore.addSetting(
     extension.id, "commands", "unknown", {shortcut: "Ctrl+Shift+P"});
   storedCommands = ExtensionSettingsStore.getAllForExtension(extension.id, "commands");
   is(storedCommands.length, 2, "There are now 2 commands stored");
   await enableAddon(addon);
   // Wait for the keyset to appear (it's async on enable).
   await TestUtils.waitForCondition(() => extensionKeyset(extension.id));
   // The keyset is back with the value from ExtensionSettingsStore.
-  checkKey(extension.id, "P", "alt shift");
+  checkNumericKey(extension.id, "9", "alt shift");
 
   // Check that an update to a shortcut in the manifest is mapped correctly.
   updatedExtension = ExtensionTestUtils.loadExtension({
     useAddonManager: "permanent",
     manifest: {
       version: "1.0",
       applications: {gecko: {id: "commands@mochi.test"}},
       commands: {
@@ -229,17 +241,17 @@ add_task(async function test_update_defi
         },
       },
     },
   });
   await updatedExtension.startup();
 
   await TestUtils.waitForCondition(() => extensionKeyset(extension.id));
   // Shortcut is unchanged since it was previously updated.
-  checkKey(extension.id, "P", "alt shift");
+  checkNumericKey(extension.id, "9", "alt shift");
 });
 
 add_task(async function updateSidebarCommand() {
   let extension = ExtensionTestUtils.loadExtension({
     useAddonManager: "temporary",
     manifest: {
       commands: {
         _execute_sidebar_action: {
--- a/browser/components/preferences/in-content/main.js
+++ b/browser/components/preferences/in-content/main.js
@@ -769,21 +769,20 @@ var gMainPane = {
   updateBrowserStartupUI() {
     const pbAutoStartPref = Preferences.get("browser.privatebrowsing.autostart");
     const startupPref = Preferences.get("browser.startup.page");
 
     let newValue;
     let checkbox = document.getElementById("browserRestoreSession");
     if (pbAutoStartPref.value || startupPref.locked) {
       checkbox.setAttribute("disabled", "true");
-      newValue = false;
     } else {
       checkbox.removeAttribute("disabled");
-      newValue = startupPref.value === this.STARTUP_PREF_RESTORE_SESSION;
     }
+    newValue = pbAutoStartPref.value ? false : startupPref.value === this.STARTUP_PREF_RESTORE_SESSION;
     if (checkbox.checked !== newValue) {
       checkbox.checked = newValue;
     }
   },
 
   initBrowserLocale() {
     gMainPane.setBrowserLocales(Services.locale.requestedLocale);
   },
rename from browser/extensions/screenshots/webextension/_locales/ach/messages.json
rename to browser/extensions/screenshots/_locales/ach/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ach/messages.json
+++ b/browser/extensions/screenshots/_locales/ach/messages.json
@@ -24,16 +24,19 @@
     "message": "Gwok potbuk weng"
   },
   "cancelScreenshot": {
     "message": "Juki"
   },
   "downloadScreenshot": {
     "message": "Gam"
   },
+  "downloadOnlyNotice": {
+    "message": "Kombedi itye i kit me gam keken."
+  },
   "downloadOnlyDetailsESR": {
     "message": "Itye ka tic ki Firefox pi ESR."
   },
   "notificationLinkCopiedTitle": {
     "message": "Ki loko kakube"
   },
   "notificationLinkCopiedDetails": {
     "message": "Ki loko kakube me cal mamegi i bao me coc. Dii $META_KEY$-V me mwono ne.",
@@ -41,24 +44,16 @@
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "copyScreenshot": {
     "message": "Loki"
   },
-  "imageCroppedWarning": {
-    "message": "Ki ngolo cal ma odoko $PIXELS$px.",
-    "placeholders": {
-      "pixels": {
-        "content": "$1"
-      }
-    }
-  },
   "requestErrorTitle": {
     "message": "Pe tye katic."
   },
   "requestErrorDetails": {
     "message": "Timwa kica! Pe onongo wa twero gwoko cal mamegi. Tim ber item doki lacen."
   },
   "connectionErrorTitle": {
     "message": "Pe watwero kube ki cal me wang kio mamegi."
rename from browser/extensions/screenshots/webextension/_locales/ar/messages.json
rename to browser/extensions/screenshots/_locales/ar/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ar/messages.json
+++ b/browser/extensions/screenshots/_locales/ar/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "نُسخت اللقطة إلى الحافظة. اضغط $META_KEY$-V للصقها.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "اقتُصّت هذه الصورة لتصبح $PIXELS$بكسل.",
+  "imageCropPopupWarning": {
+    "message": "ستُقص الصورة المحفوظة ليصبح ارتفاعها $PIXELS$بكسل.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "خارج الخدمة."
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/_locales/ast/messages.json
@@ -0,0 +1,126 @@
+{
+  "addonAuthorsList": {
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
+  },
+  "contextMenuLabel": {
+    "message": "Facer una captura"
+  },
+  "myShotsLink": {
+    "message": "Les mios captures"
+  },
+  "screenshotInstructions": {
+    "message": "Arrastra o primi na páxina pa esbillar una rexón. Primi ESC pa encaboxar."
+  },
+  "saveScreenshotSelectedArea": {
+    "message": "Guardar"
+  },
+  "saveScreenshotVisibleArea": {
+    "message": "Guardar lo visible"
+  },
+  "saveScreenshotFullPage": {
+    "message": "Guardar la páxina completa"
+  },
+  "cancelScreenshot": {
+    "message": "Encaboxar"
+  },
+  "downloadScreenshot": {
+    "message": "Baxar"
+  },
+  "downloadOnlyNotice": {
+    "message": "Anguaño tas nel mou de namái descarga."
+  },
+  "downloadOnlyDetails": {
+    "message": "Firefox Screenshots camuda automáticamente al mou namái descarga nestes situaciones:"
+  },
+  "downloadOnlyDetailsPrivate": {
+    "message": "Na ventana de resotalar en privao."
+  },
+  "downloadOnlyDetailsThirdParty": {
+    "message": "Les cookies de terceros tán desactivaes."
+  },
+  "downloadOnlyDetailsNeverRemember": {
+    "message": "«Enxamás nun recordar l'historial» ta desactiváu."
+  },
+  "downloadOnlyDetailsESR": {
+    "message": "Tas usando Firefox ESR."
+  },
+  "downloadOnlyDetailsNoUploadPref": {
+    "message": "Desactiváronse les xubes."
+  },
+  "notificationLinkCopiedTitle": {
+    "message": "Copióse l'enllaz"
+  },
+  "notificationLinkCopiedDetails": {
+    "message": "L'enllaz a la captura copióse al cartafueyu. Primi $META_KEY$-V p'apegar.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "copyScreenshot": {
+    "message": "Copiar"
+  },
+  "notificationImageCopiedTitle": {
+    "message": "Copióse la captura"
+  },
+  "notificationImageCopiedDetails": {
+    "message": "La captura copióse al cartafueyu. Primi $META_KEY$-V p'apegar.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "requestErrorDetails": {
+    "message": "¡Perdón, pero nun pudimos guardar la to captura! Volvi tentalo más sero, por favor."
+  },
+  "connectionErrorDetails": {
+    "message": "Comprueba la conexón a internet. Si yes a coneutate a internet, quiciabes heba un problema temporal col serviciu de Firefox Screenshots."
+  },
+  "loginErrorDetails": {
+    "message": "Nun podemos guardar la captura porque hai un problema col serviciu de Firefox Screenshots. Volvi tentalo más sero."
+  },
+  "unshootablePageErrorTitle": {
+    "message": "Nun pue capturase esta páxina."
+  },
+  "unshootablePageErrorDetails": {
+    "message": "Esta páxina web nun ye estándar, asina que nun pues capturala."
+  },
+  "selfScreenshotErrorTitle": {
+    "message": "¡Nun pues facer captures de pantalla de Firefox Screenshots!"
+  },
+  "emptySelectionErrorTitle": {
+    "message": "La esbilla ye perpequeña"
+  },
+  "privateWindowErrorTitle": {
+    "message": "Les captures de pantalla tán desactivaes nel mou Restolar en privao"
+  },
+  "privateWindowErrorDetails": {
+    "message": "Perdón poles molesties. Tamos trabayando nesta carauterística pa llanzamientos futuros."
+  },
+  "tourBodyIntro": {
+    "message": "Fai, guarda y comparti captures de pantalla ensin colar de Firefox."
+  },
+  "tourHeaderPageAction": {
+    "message": "Un mou nuevu de guardar"
+  },
+  "tourHeaderClickAndDrag": {
+    "message": "Captura lo que quies"
+  },
+  "tourHeaderDownloadUpload": {
+    "message": "Como te preste"
+  },
+  "tourSkip": {
+    "message": "SALTAR"
+  },
+  "tourDone": {
+    "message": "Fecho"
+  },
+  "termsAndPrivacyNoticeTermsLink": {
+    "message": "Términos"
+  },
+  "libraryLabel": {
+    "message": "Captures de pantalla"
+  }
+}
\ No newline at end of file
rename from browser/extensions/screenshots/webextension/_locales/az/messages.json
rename to browser/extensions/screenshots/_locales/az/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/az/messages.json
+++ b/browser/extensions/screenshots/_locales/az/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Görüntünüz mübadilə buferinə köçürüldü. Yapışdırmaq üçün $META_KEY$-V basın.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Şəkil $PIXELS$px ölçülərinə kəsildi.",
+  "imageCropPopupWarning": {
+    "message": "Saxlanmış şəkil hündürlüyü $PIXELS$px olaraq kəsiləcək.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Xəta baş verdi."
@@ -144,16 +144,22 @@
     "message": "Sadəcə pəncərədə görünən hissəni və ya bütün səhifəni çəkmək üçün sağ üstdəki düymələrdən birini seçin."
   },
   "tourHeaderDownloadUpload": {
     "message": "İstədiyiniz kimi"
   },
   "tourBodyDownloadUpload": {
     "message": "Kəsdiyiniz hissələri rahat paylaşmaq üçün internetdə saxlayın və ya kompüterinizə endirin. Həmçinin Ekran Görüntülərim düyməsinə basaraq çəkdiyiniz bütün ekran görüntülərini görə bilərsiz."
   },
+  "tourHeaderAccounts": {
+    "message": "Ekran Görüntülərin həmişə yanında"
+  },
+  "tourBodyAccounts": {
+    "message": "Firefox Hesabınız ilə daxil olun və istənilən yerdə bütün alətlərinizdən görüntülərinizi görün və seçdiklərinizi daimi olaraq saxlayın."
+  },
   "tourSkip": {
     "message": "Ötür"
   },
   "tourNext": {
     "message": "Növbəti Slayd"
   },
   "tourPrevious": {
     "message": "Əvvəlki Slayd"
rename from browser/extensions/screenshots/webextension/_locales/be/messages.json
rename to browser/extensions/screenshots/_locales/be/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/be/messages.json
+++ b/browser/extensions/screenshots/_locales/be/messages.json
@@ -70,26 +70,26 @@
   "notificationImageCopiedDetails": {
     "message": "Скрыншот скапіраваны ў буфер абмену. Націсніце $META_KEY$-V, каб уставіць.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Гэта выява была абрэзана да $PIXELS$пікселяў.",
+  "imageCropPopupWarning": {
+    "message": "Захаваны відарыс будзе абрэзаны да $PIXELS$ пкс па вышыні.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
-    "message": "Адбылася памылка."
+    "message": "Здарылася памылка."
   },
   "requestErrorDetails": {
     "message": "Выбачайце! Нам не ўдалося захаваць ваш здымак. Паспрабуйце пазней."
   },
   "connectionErrorTitle": {
     "message": "Мы не можам атрымаць доступ да вашых скрыншотаў."
   },
   "connectionErrorDetails": {
@@ -144,18 +144,24 @@
     "message": "З дапамогай кнопак у верхнім правым куце выбірайце захоп бачнай вобласці акна або старонкі цалкам."
   },
   "tourHeaderDownloadUpload": {
     "message": "Як вам падабаецца"
   },
   "tourBodyDownloadUpload": {
     "message": "Захоўваеце свае здымкі ў Інтэрнэце, каб лёгка імі дзяліцца, або загружайце іх на свой камп'ютар. Вы таксама можаце прагледзець усе захаваныя здымкі, націснуўшы на кнопку Мае здымкі."
   },
+  "tourHeaderAccounts": {
+    "message": "Здымкі экрана на вынас"
+  },
+  "tourBodyAccounts": {
+    "message": "Увайдзіце ў уліковы запіс Firefox, каб мець доступ да сваіх здымкаў экрана на ўсіх вашых прыладах і захоўваць улюбёныя здымкі безтэрмінова."
+  },
   "tourSkip": {
-    "message": "Прапусьціць"
+    "message": "Прапусціць"
   },
   "tourNext": {
     "message": "Наступны слайд"
   },
   "tourPrevious": {
     "message": "Папярэдні слайд"
   },
   "tourDone": {
rename from browser/extensions/screenshots/webextension/_locales/bg/messages.json
rename to browser/extensions/screenshots/_locales/bg/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/bg/messages.json
+++ b/browser/extensions/screenshots/_locales/bg/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Снимката е копирана в системния буфер. За да я поставите натиснете $META_KEY$-V.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Изображението е отрязано до $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Запазеното изображение ще бъде отрязано до височина $PIXELS$px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Повреда."
rename from browser/extensions/screenshots/webextension/_locales/bn_BD/messages.json
rename to browser/extensions/screenshots/_locales/bn_BD/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/bn_BD/messages.json
+++ b/browser/extensions/screenshots/_locales/bn_BD/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "আপনার শট ক্লিপবোর্ডে অনুলিপি করা হয়েছে। প্রতিলেপন করতে $META_KEY$-V চাপুন।",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "ইমেজটিকে $PIXELS$পিক্সেলে ক্রপ করা হয়েছে।",
+  "imageCropPopupWarning": {
+    "message": "সংরক্ষিত ইমেজ $PIXELS$পিক্সেল উচ্চতায় ক্রপ করা হবে।",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "বিকল।"
rename from browser/extensions/screenshots/webextension/_locales/br/messages.json
rename to browser/extensions/screenshots/_locales/br/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/br/messages.json
+++ b/browser/extensions/screenshots/_locales/br/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Eilet eo bet ho tapadenn er golver. Pouezit war $META_KEY$-V evit pegañ.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Digresket eo bet ho skeudenn da $PIXELS$ piksel.",
+  "imageCropPopupWarning": {
+    "message": "Ar skeudenn enrollet a vo krennet eus $PIXELS$ px en uhelder.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Degouezhet ez eus bet ur fazi."
@@ -144,16 +144,22 @@
     "message": "Diuzit an afelloù a-us a-zehou evit skeudenniñ ar vaezienn welus er prenestr pe evit skeudenniñ ar bajenn a-bezh."
   },
   "tourHeaderDownloadUpload": {
     "message": "Evel ma fell deoc'h"
   },
   "tourBodyDownloadUpload": {
     "message": "Enrollit ho tapadennoù didroc'het evit ar web evit skignañ aesoc'h, pe pellgargit anezho war ho urzhiataer. Gallout a rit ivez klikañ war an afell Ma zapadennoù evit kavout an holl dapadennoù kemeret ganeoc'h."
   },
+  "tourHeaderAccounts": {
+    "message": "Tapadennoù da gas ganeoc'h"
+  },
+  "tourBodyAccounts": {
+    "message": "Kennaskit gant ho kont Firefox evit haeziñ ho tapadennoù war ho holl trevnadoù hag enrollañ pennrolloù da viken."
+  },
   "tourSkip": {
     "message": "TREMEN"
   },
   "tourNext": {
     "message": "Treyonenn da-heul"
   },
   "tourPrevious": {
     "message": "Treyonenn gent"
rename from browser/extensions/screenshots/webextension/_locales/bs/messages.json
rename to browser/extensions/screenshots/_locales/bs/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/bs/messages.json
+++ b/browser/extensions/screenshots/_locales/bs/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Vaš snimak je kopiran u međuspremnik. Pritisnite $META_KEY$-V da zalijepite.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Slika je isječena na $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Sačuvana slika će biti izrezana na $PIXELS$px u visinu.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Nije u funkciji."
rename from browser/extensions/screenshots/webextension/_locales/ca/messages.json
rename to browser/extensions/screenshots/_locales/ca/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ca/messages.json
+++ b/browser/extensions/screenshots/_locales/ca/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "La captura s'ha copiat al porta-retalls. Premeu $META_KEY$-V per enganxar-la.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Aquesta imatge s'ha retallat a $PIXELS$ px.",
+  "imageCropPopupWarning": {
+    "message": "La imatge desada es retallarà a $PIXELS$ px d'alçada.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "No funciona."
@@ -118,17 +118,17 @@
   },
   "genericErrorTitle": {
     "message": "El Firefox Screenshots ha tingut un problema."
   },
   "genericErrorDetails": {
     "message": "S'ha produït un error inesperat. Torneu-ho a provar o captureu una altra pàgina."
   },
   "tourBodyIntro": {
-    "message": "Feu, deseu i compartiu captures de pantalla sense sortir del Firefox."
+    "message": "Feu captures de pantalla, deseu-les i compartiu-les sense sortir del Firefox."
   },
   "tourHeaderPageAction": {
     "message": "Una forma nova de desar les captures"
   },
   "tourBodyPageAction": {
     "message": "Amplieu el menú d'accions de la pàgina de la barra d'adreces quan vulgueu fer una captura de pantalla."
   },
   "tourHeaderClickAndDrag": {
@@ -144,16 +144,22 @@
     "message": "Seleccioneu amb els botons de la part superior dreta si voleu capturar l'àrea visible de la finestra o la pàgina sencera."
   },
   "tourHeaderDownloadUpload": {
     "message": "Com vulgueu"
   },
   "tourBodyDownloadUpload": {
     "message": "Deseu les vostres captures al web per compartir-les fàcilment o baixeu-les a l'ordinador. També podeu fer clic al botó «Les meves captures» per veure totes les captures que heu fet."
   },
+  "tourHeaderAccounts": {
+    "message": "Les vostres captures, a tot arreu"
+  },
+  "tourBodyAccounts": {
+    "message": "Inicieu la sessió amb el compte del Firefox per accedir a les vostres captures en tots els dispositius i conservar les vostres preferides per sempre."
+  },
   "tourSkip": {
     "message": "OMET"
   },
   "tourNext": {
     "message": "Diapositiva següent"
   },
   "tourPrevious": {
     "message": "Diapositiva anterior"
rename from browser/extensions/screenshots/webextension/_locales/cak/messages.json
rename to browser/extensions/screenshots/_locales/cak/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/cak/messages.json
+++ b/browser/extensions/screenshots/_locales/cak/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Xwachib'ëx pa molwuj ri ruchapoj awachib'al. Tapitz'a' $META_KEY$-V richin natz'äm.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Re wachib'äl re' xqupïx pa $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Ri wachib'äl xyak xtiqupïx rik'in $PIXELS$px rupalem.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Man nisamäj ta."
rename from browser/extensions/screenshots/webextension/_locales/crh/messages.json
rename to browser/extensions/screenshots/_locales/crh/messages.json
rename from browser/extensions/screenshots/webextension/_locales/cs/messages.json
rename to browser/extensions/screenshots/_locales/cs/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/cs/messages.json
+++ b/browser/extensions/screenshots/_locales/cs/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Váš snímek byl zkopírován do schránky. Pro vložení stiskněte $META_KEY$-V.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Tento obrázek byl oříznutý na $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Uložený obrázek bude oříznut na maximální výšku $PIXELS$px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Mimo provoz."
@@ -144,16 +144,22 @@
     "message": "Pomocí tlačítek vpravo nahoře můžete pořídit snímek jen viditelné části nebo úplně celé stránky."
   },
   "tourHeaderDownloadUpload": {
     "message": "Jak sami chcete"
   },
   "tourBodyDownloadUpload": {
     "message": "Uložte si oříznutý snímek stránky na web pro rychlejší sdílení, nebo si ho stáhněte do počítače. Pro zobrazení všech snímků stačí klepnout na tlačítko Mé snímky."
   },
+  "tourHeaderAccounts": {
+    "message": "Snímky stránek vždy s sebou"
+  },
+  "tourBodyAccounts": {
+    "message": "Pro přístup ke snímkům z jiných zařízení nebo jejich ukládání se prosím přihlaste svým účtem Firefoxu."
+  },
   "tourSkip": {
     "message": "Přeskočit"
   },
   "tourNext": {
     "message": "Další snímek"
   },
   "tourPrevious": {
     "message": "Předchozí snímek"
rename from browser/extensions/screenshots/webextension/_locales/cy/messages.json
rename to browser/extensions/screenshots/_locales/cy/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/cy/messages.json
+++ b/browser/extensions/screenshots/_locales/cy/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Mae eich llun wedi ei gopïo i'r clipfwrdd. Pwyswch $META_KEY$-V i'w ludo.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Mae'r ddelwedd wedi ei thocio i $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Bydd y ddelwedd wedi ei chadw'n cael ei thocio i uchder o $PIXELS$ px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Ddim yn gweithio."
@@ -144,16 +144,22 @@
     "message": "Dewiswch y botymau ar y dde uchod i gipio ardal gweladwy mewn ffenestr neu i gipio tudalen gyfan."
   },
   "tourHeaderDownloadUpload": {
     "message": "Yn Ôl eich Dewis"
   },
   "tourBodyDownloadUpload": {
     "message": "Cadwch eich lluniau wedi eu golygu i'r We ar gyfer rhannu haws, neu eu llwytho i lawr i'ch cyfrifiadur. Gallwch hefyd glicio ar Fy Lluniau i weld pob llun sydd gennych."
   },
+  "tourHeaderAccounts": {
+    "message": "Lluniau i Fynd"
+  },
+  "tourBodyAccounts": {
+    "message": "Mewngofnodwch gyda'ch Cyfrif Firefox i gael mynediad i'ch lluniau ar eich holl ddyfeisiau a chadw eich hoff luniau am byth."
+  },
   "tourSkip": {
     "message": "SKIP"
   },
   "tourNext": {
     "message": "Sleid Nesaf"
   },
   "tourPrevious": {
     "message": "Sleid Flaenorol"
rename from browser/extensions/screenshots/webextension/_locales/da/messages.json
rename to browser/extensions/screenshots/_locales/da/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/da/messages.json
+++ b/browser/extensions/screenshots/_locales/da/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Dit skærmbillede er blevet kopieret til udklipsholderen. Tryk $META_KEY$-V for at indsætte.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Billedet er blevet beskåret til $PIXELS$ px.",
+  "imageCropPopupWarning": {
+    "message": "Gemt billede vil blive beskåret til $PIXELS$px i højden.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Ude af funktion"
@@ -144,16 +144,22 @@
     "message": "Brug knapperne øverst til højre for at tage et skærmbillede af det synlige område i vinduet eller for at tage et skærmbillede af hele siden."
   },
   "tourHeaderDownloadUpload": {
     "message": "Som du vil have det."
   },
   "tourBodyDownloadUpload": {
     "message": "Gem dine beskårne skærmbilleder på nettet for nemmere at dele dem - eller hent dem ned på din computer. Du kan også klikke på knappen \"Mine skærmbilleder\" for at finde de skærmbilleder, du har taget."
   },
+  "tourHeaderAccounts": {
+    "message": "Skærmbilleder på farten"
+  },
+  "tourBodyAccounts": {
+    "message": "Log ind med din Firefox-konto for at få adgang til dine skærmbilleder på alle dine enheder, og gem dine favoritter for evigt."
+  },
   "tourSkip": {
     "message": "SPRING OVER"
   },
   "tourNext": {
     "message": "Næste side"
   },
   "tourPrevious": {
     "message": "Forrige side"
rename from browser/extensions/screenshots/webextension/_locales/de/messages.json
rename to browser/extensions/screenshots/_locales/de/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/de/messages.json
+++ b/browser/extensions/screenshots/_locales/de/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Ihr Bildschirmfoto wurde in die Zwischenablage kopiert. Drücken Sie Strg-V zum Einfügen.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Diese Grafik wurde auf $PIXELS$ px zugeschnitten.",
+  "imageCropPopupWarning": {
+    "message": "Gespeicherte Grafik wird auf eine Höhe von $PIXELS$ Pixel zugeschnitten.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Außer Betrieb."
@@ -144,16 +144,22 @@
     "message": "Nutzen Sie die Schaltflächen rechts oben, um den sichtbaren Bereich im Fenster oder eine ganze Seite zu speichern."
   },
   "tourHeaderDownloadUpload": {
     "message": "Wie Sie möchten"
   },
   "tourBodyDownloadUpload": {
     "message": "Speichern Sie Ihre zugeschnittenen Bildschirmfotos im Internet, sodass sie leicht zu teilen sind, oder laden Sie sie auf Ihren Computer herunter. Sie können auch auf die Schaltfläche „Meine Bildschirmfotos“ klicken, um alle Ihre Bildschirmfotos zu finden."
   },
+  "tourHeaderAccounts": {
+    "message": "Screenshots zum Mitnehmen"
+  },
+  "tourBodyAccounts": {
+    "message": "Melden Sie sich mit Ihrem Firefox-Konto an, um auf all Ihren Geräten auf Ihre Bildschirmfotos zuzugreifen und Ihre Favoriten dauerhaft zu speichern."
+  },
   "tourSkip": {
     "message": "Überspringen"
   },
   "tourNext": {
     "message": "Nächste Folie"
   },
   "tourPrevious": {
     "message": "Vorherige Folie"
rename from browser/extensions/screenshots/webextension/_locales/dsb/messages.json
rename to browser/extensions/screenshots/_locales/dsb/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/dsb/messages.json
+++ b/browser/extensions/screenshots/_locales/dsb/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Wašo foto jo se do mjezywótkłada kopěrowało. Tłocćo $META_KEY$-V, aby jo zasajźił.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Toś ten wobraz jo se na $PIXELS$px pśirězał.",
+  "imageCropPopupWarning": {
+    "message": "Skłaźony wobraz buźo se na wusokosć $PIXELS$ px pśirězowaś.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Njeźěła."
@@ -144,16 +144,22 @@
     "message": "Wubjeŕśo tłocašk górjejce napšawo, aby widobny wobcerk we woknje abo ceły bok fotografěrowaś."
   },
   "tourHeaderDownloadUpload": {
     "message": "Tak, kaž se wam spódoba"
   },
   "tourBodyDownloadUpload": {
     "message": "Składujśo swóje pśirězane fota wobrazowki w interneśe, aby je lažcej źělił, abo ześěgniśo je na swójo licadło. Móžośo teke na tłocašk „Móje fota wobrazowki“ kliknuś, abye wšě fota wobrazowki namakał, kótarež sćo gótował."
   },
+  "tourHeaderAccounts": {
+    "message": "Fota wobrazowki za drogu"
+  },
+  "tourBodyAccounts": {
+    "message": "Pśizjawśo se pla swójogo konta Firefox, aby pśistup k swójim fotam wobrazowki na wšych wašych rědach měł a składujśo swóje nejlubše fota wobrazowki na pśecej."
+  },
   "tourSkip": {
     "message": "Pśeskócyś"
   },
   "tourNext": {
     "message": "Pśiduce foto"
   },
   "tourPrevious": {
     "message": "Pjerwjejšne foto"
rename from browser/extensions/screenshots/webextension/_locales/el/messages.json
rename to browser/extensions/screenshots/_locales/el/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/el/messages.json
+++ b/browser/extensions/screenshots/_locales/el/messages.json
@@ -24,22 +24,31 @@
     "message": "Αποθήκευση ολόκληρης σελίδας"
   },
   "cancelScreenshot": {
     "message": "Ακύρωση"
   },
   "downloadScreenshot": {
     "message": "Λήψη"
   },
+  "downloadOnlyNotice": {
+    "message": "Αυτή τη στιγμή βρίσκεστε σε λειτουργία \"Μόνο-λήψη\"."
+  },
+  "downloadOnlyDetails": {
+    "message": "Το Firefox Screenshots αλλάζει αυτόματα σε λειτουργία \"Μόνο-λήψη\" σε αυτές τις περιπτώσεις:"
+  },
   "downloadOnlyDetailsPrivate": {
     "message": "Σε ένα παράθυρο ιδιωτικής περιήγησης."
   },
   "downloadOnlyDetailsThirdParty": {
     "message": "Τα cookies τρίτων είναι απενεργοποιημένα."
   },
+  "downloadOnlyDetailsNeverRemember": {
+    "message": "Είναι ενεργή η επιλογή “Να μην αποθηκεύεται ποτέ το ιστορικό”."
+  },
   "downloadOnlyDetailsESR": {
     "message": "Χρησιμοποιείτε το Firefox ESR."
   },
   "downloadOnlyDetailsNoUploadPref": {
     "message": "Οι μεταφορτώσεις έχουν απενεργοποιηθεί."
   },
   "notificationLinkCopiedTitle": {
     "message": "Ο σύνδεσμος αντιγράφηκε"
@@ -53,18 +62,26 @@
     }
   },
   "copyScreenshot": {
     "message": "Αντιγραφή"
   },
   "notificationImageCopiedTitle": {
     "message": "Το στιγμιότυπο αντιγράφηκε"
   },
-  "imageCroppedWarning": {
-    "message": "Αυτή η εικόνα έχει περικοπεί σε $PIXELS$px.",
+  "notificationImageCopiedDetails": {
+    "message": "Το στιγμιότυπο έχει αντιγραφεί στο πρόχειρο. Πατήστε $META_KEY$-V για επικόλληση.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "imageCropPopupWarning": {
+    "message": "Η αποθηκευμένη εικόνα θα περικοπεί σε $PIXELS$px στο ύψος.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Εκτός λειτουργίας."
@@ -106,16 +123,19 @@
     "message": "Δεν είμαστε σίγουροι για το τι ακριβώς συνέβη. Προσπαθήστε ξανά ή κάντε λήψη σε μια άλλη σελίδα."
   },
   "tourBodyIntro": {
     "message": "Λήψη, αποθήκευση και διαμοιρασμός στιγμιοτύπων μέσα από το Firefox."
   },
   "tourHeaderPageAction": {
     "message": "Ένας νέος τρόπος αποθήκευσης"
   },
+  "tourBodyPageAction": {
+    "message": "Αναπτύξτε το μενού ενεργειών σελίδας στη γραμμή διευθύνσεων όποτε θέλετε να κάνετε λήψη στιγμιότυπου."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Καταγράψτε αυτό που εσείς επιθυμείτε"
   },
   "tourBodyClickAndDrag": {
     "message": "Κάντε κλικ και σύρετε για την καταγραφή ενός τμήματος της σελίδας. Μπορείτε να επισημάνετε την επιλογή σας μετακινώντας τον ποντίκι σας επάνω της."
   },
   "tourHeaderFullPage": {
     "message": "Λήψη παραθύρων ή ολόκληρων σελίδων"
rename from browser/extensions/screenshots/webextension/_locales/en_US/messages.json
rename to browser/extensions/screenshots/_locales/en_CA/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/en_US/messages.json
+++ b/browser/extensions/screenshots/_locales/en_CA/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Your shot has been copied to the clipboard. Press $META_KEY$-V to paste.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "This image has been cropped to $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Saved image will be cropped to $PIXELS$px in height.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Out of order."
@@ -144,16 +144,22 @@
     "message": "Select the buttons in the upper right to capture the visible area in the window or to capture an entire page."
   },
   "tourHeaderDownloadUpload": {
     "message": "As You Like It"
   },
   "tourBodyDownloadUpload": {
     "message": "Save your cropped shots to the web for easier sharing, or download them to your computer. You also can click on the My Shots button to find all the shots you’ve taken."
   },
+  "tourHeaderAccounts": {
+    "message": "Screenshots to Go"
+  },
+  "tourBodyAccounts": {
+    "message": "Sign in with your Firefox Account to access your shots on all of your devices and save your favourite shots forever."
+  },
   "tourSkip": {
     "message": "SKIP"
   },
   "tourNext": {
     "message": "Next Slide"
   },
   "tourPrevious": {
     "message": "Previous Slide"
rename from browser/extensions/screenshots/webextension/_locales/en_GB/messages.json
rename to browser/extensions/screenshots/_locales/en_GB/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/en_GB/messages.json
+++ b/browser/extensions/screenshots/_locales/en_GB/messages.json
@@ -65,22 +65,17 @@
     "message": "Your shot has been copied to the clipboard. Press $META_KEY$-V to paste.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "imageCroppedWarning": {
-    "message": "This image has been cropped to $PIXELS$px.",
-    "placeholders": {
-      "pixels": {
-        "content": "$1"
-      }
-    }
+    "message": "This image has been cropped to {pixels}px."
   },
   "requestErrorTitle": {
     "message": "Out of order."
   },
   "requestErrorDetails": {
     "message": "Sorry! We couldn’t save your shot. Please try again later."
   },
   "connectionErrorTitle": {
copy from browser/extensions/screenshots/webextension/_locales/en_US/messages.json
copy to browser/extensions/screenshots/_locales/en_US/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/en_US/messages.json
+++ b/browser/extensions/screenshots/_locales/en_US/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Your shot has been copied to the clipboard. Press $META_KEY$-V to paste.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "This image has been cropped to $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Saved image will be cropped to $PIXELS$px in height.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Out of order."
@@ -144,16 +144,22 @@
     "message": "Select the buttons in the upper right to capture the visible area in the window or to capture an entire page."
   },
   "tourHeaderDownloadUpload": {
     "message": "As You Like It"
   },
   "tourBodyDownloadUpload": {
     "message": "Save your cropped shots to the web for easier sharing, or download them to your computer. You also can click on the My Shots button to find all the shots you’ve taken."
   },
+  "tourHeaderAccounts": {
+    "message": "Screenshots to Go"
+  },
+  "tourBodyAccounts": {
+    "message": "Sign in with your Firefox Account to access your shots on all of your devices and save your favorite shots forever."
+  },
   "tourSkip": {
     "message": "SKIP"
   },
   "tourNext": {
     "message": "Next Slide"
   },
   "tourPrevious": {
     "message": "Previous Slide"
rename from browser/extensions/screenshots/webextension/_locales/eo/messages.json
rename to browser/extensions/screenshots/_locales/eo/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/eo/messages.json
+++ b/browser/extensions/screenshots/_locales/eo/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Via ekrankopio estis kopiita al la tondujo. Premu $META_KEY$-V por alglui.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Tiu ĉi bildo estis pritondita je $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "La konservita bildo estos tondita alte je $PIXELS$px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Ne funkcianta."
rename from browser/extensions/screenshots/webextension/_locales/es_AR/messages.json
rename to browser/extensions/screenshots/_locales/es_AR/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/es_AR/messages.json
+++ b/browser/extensions/screenshots/_locales/es_AR/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Tu captura ha sido copiada al portapapeles. Presioná $META_KEY$-V para pegar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Esta imagen ha sido recortada a $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "La imagen guardada será recortada a $PIXELS$px de alto.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "No funciona."
@@ -144,16 +144,22 @@
     "message": "Seleccioná los botones arriba a la derecha para capturar el área visible en la ventana o la página completa."
   },
   "tourHeaderDownloadUpload": {
     "message": "Como te guste"
   },
   "tourBodyDownloadUpload": {
     "message": "Guardá tus capturas recortadas a la web para compartir o descargarlas más fácilmente a tu computadora. También podés hacer clic en el botón Mis capturas para encontrar todas las capturas hechas."
   },
+  "tourHeaderAccounts": {
+    "message": "Screenshots siempre con vos"
+  },
+  "tourBodyAccounts": {
+    "message": "Iniciá sesión con tu cuenta de Firefox para acceder a tus fotos en todos los dispositivos y guardar tus fotos favoritas para siempre."
+  },
   "tourSkip": {
     "message": "SALTEAR"
   },
   "tourNext": {
     "message": "Próxima diapositiva"
   },
   "tourPrevious": {
     "message": "Diapositiva anterior"
rename from browser/extensions/screenshots/webextension/_locales/es_CL/messages.json
rename to browser/extensions/screenshots/_locales/es_CL/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/es_CL/messages.json
+++ b/browser/extensions/screenshots/_locales/es_CL/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Tu captura ha sido copiada al portapapeles. Presiona $META_KEY$-V para pegarla.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Esta imagen ha sido recortada a $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "La imagen guardada será recortada a $PIXELS$px de altura.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Fuera de orden."
@@ -144,16 +144,22 @@
     "message": "Selecciona los botones en la parte superior derecha para capturar el área visible ne la ventana o para capturar una página completa."
   },
   "tourHeaderDownloadUpload": {
     "message": "Como tu quieras"
   },
   "tourBodyDownloadUpload": {
     "message": "Guarda tus capturas recortadas en la Web para compartirlas fácilmente o descargarlas a tu computador. También puedes hacer clic en el botón Mis capturas para encontrar todas las que hayas tomado."
   },
+  "tourHeaderAccounts": {
+    "message": "Screenshots en todas partes"
+  },
+  "tourBodyAccounts": {
+    "message": "Conéctate con tu cuenta de Firefox para acceder a tus capturas en todos tus dispositivos y guardar tus favoritas para siempre."
+  },
   "tourSkip": {
     "message": "SALTAR"
   },
   "tourNext": {
     "message": "Siguiente diapositiva"
   },
   "tourPrevious": {
     "message": "Diapositiva anterior"
rename from browser/extensions/screenshots/webextension/_locales/es_ES/messages.json
rename to browser/extensions/screenshots/_locales/es_ES/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/es_ES/messages.json
+++ b/browser/extensions/screenshots/_locales/es_ES/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Tu captura ha ido copiada al portapapeles. Presiona $META_KEY$-V para pegar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Se recortó la imagen a $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "La imagen guardada será recortada a $PIXELS$px de altura.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "No funciona."
rename from browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
rename to browser/extensions/screenshots/_locales/es_MX/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
+++ b/browser/extensions/screenshots/_locales/es_MX/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Tu captura ha sido copiada al portapapeles. Presiona $META_KEY$-V para pegar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Esta imagen ha sido recortada a $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "La imagen guardada será recortada a $PIXELS$px de alto.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Fuera de orden."
@@ -144,16 +144,22 @@
     "message": "Selecciona los botones en la parte superior derecha para capturar el área visible en la ventana o para capturar una página completa."
   },
   "tourHeaderDownloadUpload": {
     "message": "Como te gusta"
   },
   "tourBodyDownloadUpload": {
     "message": "Guarda tus capturas recortadas en la Web para compartirlas más fácilmente o descárgalas en tu computadora. También puedes hacer clic en el botón Mis Capturas para encontrar todas las fotos que has tomado."
   },
+  "tourHeaderAccounts": {
+    "message": "Screenshots to Go"
+  },
+  "tourBodyAccounts": {
+    "message": "Inicia sesión con tu cuenta de Firefox para acceder a tus capturas en todos tus dispositivos y guarda tus capturas favoritas para siempre."
+  },
   "tourSkip": {
     "message": "Ignorar"
   },
   "tourNext": {
     "message": "Siguiente diapositiva"
   },
   "tourPrevious": {
     "message": "Diapositiva anterior"
rename from browser/extensions/screenshots/webextension/_locales/et/messages.json
rename to browser/extensions/screenshots/_locales/et/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/et/messages.json
+++ b/browser/extensions/screenshots/_locales/et/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Sinu pilt kopeeriti vahemällu. Asetamiseks vajuta $META_KEY$-V.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "See pilt on vähendatud $PIXELS$-le pikslile.",
+  "imageCropPopupWarning": {
+    "message": "Salvestatud pildi kõrgus kärbitakse $PIXELS$ piksli peale.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Tekkis viga."
@@ -144,16 +144,22 @@
     "message": "Kasuta nuppe ülal paremal aknas nähtava ala või terve lehe salvestamiseks."
   },
   "tourHeaderDownloadUpload": {
     "message": "Nii, kuidas sulle meeldib"
   },
   "tourBodyDownloadUpload": {
     "message": "Salvesta kärbitud pilte lihtsamaks jagamiseks veebi või laadi need alla enda arvutisse. Võid ka klõpsata Minu pildid nupul kõigi tehtud piltide vaatamiseks."
   },
+  "tourHeaderAccounts": {
+    "message": "Ekraanipildid"
+  },
+  "tourBodyAccounts": {
+    "message": "Logi sisse oma Firefoxi kontoga, et pääseda ligi ekraanipiltidele kõigist oma seadmetest ning salvestada lemmikud jäädavalt."
+  },
   "tourSkip": {
     "message": "Jäta vahele"
   },
   "tourNext": {
     "message": "Järgmine slaid"
   },
   "tourPrevious": {
     "message": "Eelmine slaid"
rename from browser/extensions/screenshots/webextension/_locales/eu/messages.json
rename to browser/extensions/screenshots/_locales/eu/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/eu/messages.json
+++ b/browser/extensions/screenshots/_locales/eu/messages.json
@@ -35,16 +35,19 @@
   "notificationLinkCopiedDetails": {
     "message": "Zure argazkirako lotura arbelean kopiatu da. Itsasteko, sakatu $META_KEY$-V.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "copyScreenshot": {
+    "message": "Kopiatu"
+  },
   "requestErrorTitle": {
     "message": "Zerbitzuz kanpo."
   },
   "requestErrorDetails": {
     "message": "Barkatu! Ezin izan dugu zure argazkia gorde. Saiatu berriro geroago."
   },
   "connectionErrorTitle": {
     "message": "Ezin gara zure pantaila-argazkietara konektatu."
rename from browser/extensions/screenshots/webextension/_locales/fa/messages.json
rename to browser/extensions/screenshots/_locales/fa/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/fa/messages.json
+++ b/browser/extensions/screenshots/_locales/fa/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "عکس شما در کلیپ‌بورد رونوشت شد. $META_KEY$-V را برای جای‌گذاری فشار دهید.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "این تصویر برید شده است به $PIXELS$ پیکسل.",
+  "imageCropPopupWarning": {
+    "message": "تصویر ذخیره شده با اندازهٔ ارتفاعِ $PIXELS$ پیکسل بریده خواهد شد.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "خارج از سرویس."
rename from browser/extensions/screenshots/webextension/_locales/ff/messages.json
rename to browser/extensions/screenshots/_locales/ff/messages.json
rename from browser/extensions/screenshots/webextension/_locales/fi/messages.json
rename to browser/extensions/screenshots/_locales/fi/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/fi/messages.json
+++ b/browser/extensions/screenshots/_locales/fi/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Kaappauksesi on kopioitu leikepöydälle. Liitä se painamalla $META_KEY$-V.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Tämä kuva on rajattu $PIXELS$ kuvapisteeseen.",
+  "imageCropPopupWarning": {
+    "message": "Tallennetun kuvan korkeus rajautuu $PIXELS$ kuvapisteeseen.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Epäkunnossa."
rename from browser/extensions/screenshots/webextension/_locales/fr/messages.json
rename to browser/extensions/screenshots/_locales/fr/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/fr/messages.json
+++ b/browser/extensions/screenshots/_locales/fr/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Votre capture a été copiée dans le presse-papiers. Appuyez sur $META_KEY$-V pour la coller.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Cette image a été rognée à $PIXELS$ px.",
+  "imageCropPopupWarning": {
+    "message": "La hauteur de l’image sauvegardée sera limitée à $PIXELS$ px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Impossible d’effectuer cette action."
@@ -144,16 +144,22 @@
     "message": "Utilisez les boutons en haut à droite pour capturer au choix la zone visible dans la fenêtre ou la page entière."
   },
   "tourHeaderDownloadUpload": {
     "message": "À votre guise"
   },
   "tourBodyDownloadUpload": {
     "message": "Sauvegardez en ligne vos captures recadrées pour les partager plus facilement, ou téléchargez-les sur votre ordinateur. Vous pouvez aussi cliquer sur « Mes captures d’écran » pour retrouver toutes vos captures."
   },
+  "tourHeaderAccounts": {
+    "message": "Captures à emporter"
+  },
+  "tourBodyAccounts": {
+    "message": "Connectez-vous avec votre compte Firefox pour accéder à vos captures sur tous vos appareils et enregistrer définitivement vos préférées."
+  },
   "tourSkip": {
     "message": "IGNORER"
   },
   "tourNext": {
     "message": "Écran suivant"
   },
   "tourPrevious": {
     "message": "Écran précédent"
rename from browser/extensions/screenshots/webextension/_locales/fy_NL/messages.json
rename to browser/extensions/screenshots/_locales/fy_NL/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/fy_NL/messages.json
+++ b/browser/extensions/screenshots/_locales/fy_NL/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Jo ôfbylding is nei it klamboerd kopiearre. Druk op $META_KEY$-V om te plakken.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Dizze ôfbylding is ferlytse nei $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Bewarre ôfbylding wurdt nei $PIXELS$px yn hichte bysnien.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Bûten tsjinst."
@@ -144,16 +144,22 @@
     "message": "Selektearje knoppen rjochts boppe-oan om it sichtbere gebiet yn it finster te fetsjen, of fetsje in folsleine side."
   },
   "tourHeaderDownloadUpload": {
     "message": "Nei jo winsk"
   },
   "tourBodyDownloadUpload": {
     "message": "Bewarje jo byknippe skermôfdrukken nei it web om se maklik te dielen, of download se nei jo kompjûter. Jo kinne ek op de knop Myn skermôfdrukken klikke om al jo makke skermôfdrukken te finen."
   },
+  "tourHeaderAccounts": {
+    "message": "Skermôfbyldingen om mei te nimmen"
+  },
+  "tourBodyAccounts": {
+    "message": "Meld jo oan mei jo Firefox-account om jo ôfbyldingen op al jo apparaten te besjen en jo favorite ôfbyldingen foar altyd te bewarjen."
+  },
   "tourSkip": {
     "message": "Oerslaan"
   },
   "tourNext": {
     "message": "Folgjende ôfbylding"
   },
   "tourPrevious": {
     "message": "Foarige ôfbylding"
rename from browser/extensions/screenshots/webextension/_locales/ga_IE/messages.json
rename to browser/extensions/screenshots/_locales/ga_IE/messages.json
rename from browser/extensions/screenshots/webextension/_locales/gd/messages.json
rename to browser/extensions/screenshots/_locales/gd/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/gd/messages.json
+++ b/browser/extensions/screenshots/_locales/gd/messages.json
@@ -71,22 +71,17 @@
     "message": "Chaidh lethbhreac dhen ghlacadh agad a chur air an stòr-bhòrd. Brùth $META_KEY$-V airson a chur ann.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "imageCroppedWarning": {
-    "message": "Chaidh an dealbh a bhearradh is tha e $PIXELS$px a-nis.",
-    "placeholders": {
-      "pixels": {
-        "content": "$1"
-      }
-    }
+    "message": "Chaidh an dealbh a bhearradh is tha e {pixels}px a-nis."
   },
   "requestErrorTitle": {
     "message": "Tuibriste."
   },
   "requestErrorDetails": {
     "message": "Tha sinn duilich! Cha b’ urrainn dhuinn an glacadh agad a shàbhaladh. Feuch ris a-rithist an ceann greis."
   },
   "connectionErrorTitle": {
rename from browser/extensions/screenshots/webextension/_locales/gl/messages.json
rename to browser/extensions/screenshots/_locales/gl/messages.json
rename from browser/extensions/screenshots/webextension/_locales/gn/messages.json
rename to browser/extensions/screenshots/_locales/gn/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/gn/messages.json
+++ b/browser/extensions/screenshots/_locales/gn/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Nde japyhypy ohóma kuatiajokohápe. Ejopy $META_KEY$ -V emboja hag̃ua.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Ko ta'anga oñekytĩkuri $PIXELS$ px.",
+  "imageCropPopupWarning": {
+    "message": "Pe ta’anga ñongatupyre oñekytĩta $PIXELS$px yvatekue.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Ndoikói hína."
@@ -144,16 +144,22 @@
     "message": "Eiporavo umi votõ yvate akatúa gotyogua ejapyhy hag̃ua ovetãme térã kuatiarogue tuichaháicha."
   },
   "tourHeaderDownloadUpload": {
     "message": "Nde eipotaháicha"
   },
   "tourBodyDownloadUpload": {
     "message": "Eñongatu nde japyhypy kytĩmbyre ñandutígui moherakuãrã térã ñemboguejyrã ne mohendahápe. Ikatu avei ehesakutu pe votõ Che japyhypy ejuhu hag̃ua opaite japyhypy ejapova'kue."
   },
+  "tourHeaderAccounts": {
+    "message": "Ejapyhy mba'erechaha eho hag̃ua"
+  },
+  "tourBodyAccounts": {
+    "message": "Emoñepyrũ tembiapo ne mba’ete Firefox pegua ndive ehecha hag̃ua ne ra’anga opaite mba’e’okápe ha eñongatu ne ra’anga eguerohoryvéva opa árape g̃uarã."
+  },
   "tourSkip": {
     "message": "SKIP"
   },
   "tourNext": {
     "message": "Ta’angarechaha tenondegua"
   },
   "tourPrevious": {
     "message": "Ta’angarechaha mboyvegua"
rename from browser/extensions/screenshots/webextension/_locales/gu_IN/messages.json
rename to browser/extensions/screenshots/_locales/gu_IN/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/gu_IN/messages.json
+++ b/browser/extensions/screenshots/_locales/gu_IN/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "તમારા શોટ ક્લિપબોર્ડ પર નકલ કરવામાં આવ્યાં છે. પેસ્ટ કરવા માટે $META_KEY$-V દબાવો.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "આ છબીને $PIXELS$px પર કાપવામાં આવી છે.",
+  "imageCropPopupWarning": {
+    "message": "સાચવેલી ઇમેજ $PIXELS$px ઊંચાઈ પર કાપવામાં આવશે.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "હુકમ બહાર."
rename from browser/extensions/screenshots/webextension/_locales/he/messages.json
rename to browser/extensions/screenshots/_locales/he/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/he/messages.json
+++ b/browser/extensions/screenshots/_locales/he/messages.json
@@ -71,22 +71,17 @@
     "message": "צילום המסך שלך הועתק ללוח העריכה. יש ללחוץ על $META_KEY$-V כדי להדביק.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "imageCroppedWarning": {
-    "message": "תמונה זו נחתכה לגודל של $PIXELS$ פיקסלים.",
-    "placeholders": {
-      "pixels": {
-        "content": "$1"
-      }
-    }
+    "message": "תמונה זו נחתכה לגודל של {pixels} פיקסלים."
   },
   "requestErrorTitle": {
     "message": "לא תקין."
   },
   "requestErrorDetails": {
     "message": "אנו מצטערים, אך לא ניתן היה לשמור את התמונה. נא לנסות שוב מאוחר יותר."
   },
   "connectionErrorTitle": {
rename from browser/extensions/screenshots/webextension/_locales/hi_IN/messages.json
rename to browser/extensions/screenshots/_locales/hi_IN/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/hi_IN/messages.json
+++ b/browser/extensions/screenshots/_locales/hi_IN/messages.json
@@ -27,16 +27,19 @@
     "message": "रद्द करें"
   },
   "downloadScreenshot": {
     "message": "डाउनलोड करें"
   },
   "downloadOnlyNotice": {
     "message": "आप अभी केवल-डाउनलोड मोड में हैं."
   },
+  "downloadOnlyDetails": {
+    "message": "Firefox स्क्रीनशॉट स्वचालित रूप से इन स्थितियों में डाउनलोड-केवल मोड में बदल देता हैं:"
+  },
   "downloadOnlyDetailsPrivate": {
     "message": "एक निजी ब्राउज़िंग विंडो में."
   },
   "downloadOnlyDetailsThirdParty": {
     "message": "तृतीय-पक्ष कुकीज़ अक्षम हैं."
   },
   "downloadOnlyDetailsNeverRemember": {
     "message": "“कभी इतिहास याद न रखें” सक्षम है."
@@ -67,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "आपके शॉट के लिंक क्लिपबोर्ड पर कॉपी किए गए हैं. पेस्ट करने के लिए $META_KEY$-V दबाएँ.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "इस छवि को $PIXELS$px में छोटा किया गया है.",
+  "imageCropPopupWarning": {
+    "message": "सहेजी गई छवि को ऊंचाई में $PIXELS$पिक्सेल तक काट दिया जाएगा।",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "कार्यरत नहीं है."
@@ -120,16 +123,19 @@
     "message": "हम सुनिश्चित नहीं हैं कि अभी क्या हुआ. पुन: प्रयास या एक भिन्न पृष्ठ का एक शॉट लेना चाहते हैं?"
   },
   "tourBodyIntro": {
     "message": "Firefox छोड़े बिना स्क्रीनशॉट लें, सहेजें, और साझा करें."
   },
   "tourHeaderPageAction": {
     "message": "सहेजने का एक नया तरीका"
   },
+  "tourBodyPageAction": {
+    "message": "किसी भी समय आप स्क्रीनशॉट लेना चाहते हैं तो पता पट्टी में पृष्ठ क्रियाएँ मेनू का विस्तार करें।"
+  },
   "tourHeaderClickAndDrag": {
     "message": "जो आप चाहते हैं उसे कैद करें"
   },
   "tourBodyClickAndDrag": {
     "message": "पृष्ठ के बस एक हिस्से को कैद करने के लिए क्लिक करें और खींचें. आप अपने चयन को हाइलाइट करने के लिए भी जा सकते हैं."
   },
   "tourHeaderFullPage": {
     "message": "विंडोज़ या संपूर्ण पृष्ठों को कैद करें"
@@ -138,16 +144,19 @@
     "message": "विंडो में दिखाई देने वाले क्षेत्र या एक पूरे पृष्ठ को कैद करने के लिए ऊपर में दाहिनी तरफ़ के बटन का चयन करें."
   },
   "tourHeaderDownloadUpload": {
     "message": "जैसा आप इसे चाहते हैं"
   },
   "tourBodyDownloadUpload": {
     "message": "आसानी से साझा करने या उन्हें अपने कंप्यूटर पर डाउनलोड करने के लिए अपने क्रॉप किये गये शॉट को वेब पर सहेजें. आपके द्वारा लिए गये सभी शॉट्स को ढूंढने के लिए आप मेरे शॉट्स बटन पर भी क्लिक कर सकते हैं."
   },
+  "tourBodyAccounts": {
+    "message": "हमेशा के लिए पसंदीदा स्क्रीनशॉटों को सहेजने तथा सभी उपकरणों पर अपने स्क्रीनशॉट एक्सेस करने हेतु अपने Firefox खाते में साइन इन करें।"
+  },
   "tourSkip": {
     "message": "SKIP"
   },
   "tourNext": {
     "message": "अगली स्लाइड"
   },
   "tourPrevious": {
     "message": "पिछली स्लाइड"
rename from browser/extensions/screenshots/webextension/_locales/hr/messages.json
rename to browser/extensions/screenshots/_locales/hr/messages.json
rename from browser/extensions/screenshots/webextension/_locales/hsb/messages.json
rename to browser/extensions/screenshots/_locales/hsb/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/hsb/messages.json
+++ b/browser/extensions/screenshots/_locales/hsb/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Waše foto je so do mjezyskłada kopěrowało. Tłóčće $META_KEY$-V, zo byšće jo zasadźił.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Tutón wobraz je so na $PIXELS$px přitřihał.",
+  "imageCropPopupWarning": {
+    "message": "Składowany wobraz budźe so na wysokosć $PIXELS$ px přitřihować.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Skóncowany."
@@ -144,16 +144,22 @@
     "message": "Wubjerće tłóčatka horjeka naprawo, zo byšće widźomny wobwod we woknje abo cyłu stronu fotografować."
   },
   "tourHeaderDownloadUpload": {
     "message": "Tak, kaž so wam spodoba"
   },
   "tourBodyDownloadUpload": {
     "message": "Składujće swoje přitřihane fota wobrazowki w interneće, zo byšće je lóšo dźělił, abo sćehńće je na swój ličak. Móžeće tež na tłóčatko „Moje fota wobrazowki“ kliknyć, zo byšće wšě fota wobrazowki namakał, kotrež sće činił."
   },
+  "tourHeaderAccounts": {
+    "message": "Fota wobrazowki za puć"
+  },
+  "tourBodyAccounts": {
+    "message": "Přizjewće so pola swojeho konta Firefox, zo byšće přistup na swoje fota wobrazowki na wšěch wašich gratach měł a składujće swoje najlubše fota wobrazowki na přeco."
+  },
   "tourSkip": {
     "message": "Přeskočić"
   },
   "tourNext": {
     "message": "Přichodne foto"
   },
   "tourPrevious": {
     "message": "Předchadne foto"
rename from browser/extensions/screenshots/webextension/_locales/hu/messages.json
rename to browser/extensions/screenshots/_locales/hu/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/hu/messages.json
+++ b/browser/extensions/screenshots/_locales/hu/messages.json
@@ -1,29 +1,29 @@
 {
   "addonDescription": {
     "message": "Készítsen videoklipeket és képernyőképeket a webről, és mentse őket ideiglenesen vagy véglegesen."
   },
   "addonAuthorsList": {
     "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
-    "message": "Készítsen képernyőképet"
+    "message": "Képernyőkép készítése"
   },
   "myShotsLink": {
     "message": "Az Ön képei"
   },
   "screenshotInstructions": {
-    "message": "Húzza, vagy kattintson a lapra a terület kiválasztásához. Nyomjon ESC-t a megszakításhoz."
+    "message": "Húzza, vagy kattintson a lapra a terület kiválasztásához. A megszakításhoz nyomja meg az ESC billentyűt."
   },
   "saveScreenshotSelectedArea": {
     "message": "Mentés"
   },
   "saveScreenshotVisibleArea": {
-    "message": "Láthatóak mentése"
+    "message": "Látható rész mentése"
   },
   "saveScreenshotFullPage": {
     "message": "Teljes oldal mentése"
   },
   "cancelScreenshot": {
     "message": "Mégse"
   },
   "downloadScreenshot": {
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "A képernyőkép a vágólapra lett másolva. Nyomjon $META_KEY$-V-t a beillesztéshez.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "A kép $PIXELS$px méretűre lett vágva.",
+  "imageCropPopupWarning": {
+    "message": "A mentett képek $PIXELS$ képpont magasra lesznek vágva.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Nem működik."
@@ -144,16 +144,22 @@
     "message": "Válassza a jobb felső sarokban lévő gombokat, hogy egy látható területet mentsen az ablakból, vagy elmentsen egy teljes oldalt."
   },
   "tourHeaderDownloadUpload": {
     "message": "Ahogy tetszik"
   },
   "tourBodyDownloadUpload": {
     "message": "Mentse a kivágott képeket a webre a könnyebb megosztáshoz, vagy töltse le a számítógépére. Rá is kattinthat a Képernyőképek gombra, hogy megtalálja az összes képét."
   },
+  "tourHeaderAccounts": {
+    "message": "Hordozható képernyőképek"
+  },
+  "tourBodyAccounts": {
+    "message": "Jelentkezzen be a Firefox fiókjával, hogy elérje az összes képernyőképét az összes eszközén, és örökre elmentse a kedvenceit."
+  },
   "tourSkip": {
     "message": "Kihagyás"
   },
   "tourNext": {
     "message": "Következő dia"
   },
   "tourPrevious": {
     "message": "Előző dia"
rename from browser/extensions/screenshots/webextension/_locales/hy_AM/messages.json
rename to browser/extensions/screenshots/_locales/hy_AM/messages.json
rename from browser/extensions/screenshots/webextension/_locales/ia/messages.json
rename to browser/extensions/screenshots/_locales/ia/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ia/messages.json
+++ b/browser/extensions/screenshots/_locales/ia/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Tu instantaneo ha essite copiate al area de transferentia. Pulsa $META_KEY$-V pro collar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Iste imagine ha essite retaliate a $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Le imagine salvate essera retaliate pro $PIXELS$px in altitude.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Foras de servicio."
@@ -144,16 +144,22 @@
     "message": "Elige le buttones in alto a dextra pro capturar le area visibile in le fenestra o pro capturar un pagina integre."
   },
   "tourHeaderDownloadUpload": {
     "message": "Como tu lo agrada"
   },
   "tourBodyDownloadUpload": {
     "message": "Salvar tu instantaneos retaliate al web pro los compartir plus facilemente, o los discargar a tu computator. Tu alsi pote cliccar sur le button Mi Instantaneos pro trovar tote le instantaneos que tu ha prendite."
   },
+  "tourHeaderAccounts": {
+    "message": "Tu instantaneos sempre con te"
+  },
+  "tourBodyAccounts": {
+    "message": "Authentica te con tu conto Firefox pro acceder a tu instantaneos sur tote tu apparatos e salva per sempre tu instantaneos favorite."
+  },
   "tourSkip": {
     "message": "SKIP"
   },
   "tourNext": {
     "message": "Diapositiva sequente"
   },
   "tourPrevious": {
     "message": "Previe diapositiva"
rename from browser/extensions/screenshots/webextension/_locales/id/messages.json
rename to browser/extensions/screenshots/_locales/id/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/id/messages.json
+++ b/browser/extensions/screenshots/_locales/id/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Tangkapan Anda telah disalin ke papan klip. Tekan $META_KEY$-V untuk menempelkan.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Gambar ini telah dipotong menjadi $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Lebar gambar yang disimpan akan dipotong menjadi $PIXELS$px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Tak dapat digunakan."
@@ -144,16 +144,22 @@
     "message": "Pilih tombol di kanan atas untuk merekam area yang terlihat pada jendela atau rekam seluruh laman."
   },
   "tourHeaderDownloadUpload": {
     "message": "Sesuka Anda"
   },
   "tourBodyDownloadUpload": {
     "message": "Simpan potongan tangkapan Anda ke Web agar mudah dibagikan, atau unduh ke komputer. Anda pun dapat mengeklik pada tombol Gambar Saya untuk menemukan semua tangkapan yang pernah Anda rekam."
   },
+  "tourHeaderAccounts": {
+    "message": "Screenshots to Go"
+  },
+  "tourBodyAccounts": {
+    "message": "Masuk dengan Firefox Account untuk mengakses tangkapan Anda di semua peranti Anda dan menyimpan tangkapan favorit Anda selamanya."
+  },
   "tourSkip": {
     "message": "LEWATI"
   },
   "tourNext": {
     "message": "Salindia Selanjutnya"
   },
   "tourPrevious": {
     "message": "Salindia Sebelumnya"
rename from browser/extensions/screenshots/webextension/_locales/it/messages.json
rename to browser/extensions/screenshots/_locales/it/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/it/messages.json
+++ b/browser/extensions/screenshots/_locales/it/messages.json
@@ -1,20 +1,20 @@
 {
   "addonDescription": {
-    "message": "Crea screenshot di contenuti sul Web e salvali, solo per un periodo di tempo o in modo permanente."
+    "message": "Cattura schermate di contenuti sul Web e salvali, per un periodo di tempo limitato o in modo permanente."
   },
   "addonAuthorsList": {
     "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
-    "message": "Cattura screenshot"
+    "message": "Cattura schermata"
   },
   "myShotsLink": {
-    "message": "I miei screenshot"
+    "message": "Le mie immagini"
   },
   "screenshotInstructions": {
     "message": "Trascina o fai clic su una pagina per selezionare un’area della pagina. Premi ESC per annullare."
   },
   "saveScreenshotSelectedArea": {
     "message": "Salva"
   },
   "saveScreenshotVisibleArea": {
@@ -70,47 +70,47 @@
   "notificationImageCopiedDetails": {
     "message": "L’immagine è stata copiata negli appunti. Premi $META_KEY$-V per incollarla.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Questa immagine è stata ritagliata a $PIXELS$ px.",
+  "imageCropPopupWarning": {
+    "message": "L’immagine salvata verrà ritagliata a $PIXELS$px in altezza.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Fuori servizio"
   },
   "requestErrorDetails": {
     "message": "Siamo spiacenti, non è stato possibile salvare l’immagine. Riprova più tardi."
   },
   "connectionErrorTitle": {
-    "message": "Non è possibile accedere agli screenshot salvati."
+    "message": "Non è possibile accedere alle immagini salvate."
   },
   "connectionErrorDetails": {
     "message": "Verifica che la connessione a Internet stia funzionando correttamente. Se è possibile accedere ad altri siti, potrebbe trattarsi di un problema temporaneo con il servizio Firefox Screenshots."
   },
   "loginErrorDetails": {
     "message": "Non è stato possibile salvare l’immagine in quanto si è verificato un problema con il servizio Firefox Screenshots. Riprova più tardi."
   },
   "unshootablePageErrorTitle": {
-    "message": "Non è possibile salvare uno screenshot di questa pagina."
+    "message": "Non è possibile catturare una schermata di questa pagina."
   },
   "unshootablePageErrorDetails": {
-    "message": "Non è possibile salvare uno screenshot in quanto non si tratta di una normale pagina web."
+    "message": "Non è possibile catturare una schermata in quanto non si tratta di una normale pagina web."
   },
   "selfScreenshotErrorTitle": {
-    "message": "Non è possibile salvare uno screenshot di una pagina di Firefox Screenshots"
+    "message": "Non è possibile catturare una schermata di una pagina di Firefox Screenshots"
   },
   "emptySelectionErrorTitle": {
     "message": "L’area selezionata è troppo piccola"
   },
   "privateWindowErrorTitle": {
     "message": "Screenshots è disattivato in navigazione anonima."
   },
   "privateWindowErrorDetails": {
@@ -118,17 +118,17 @@
   },
   "genericErrorTitle": {
     "message": "Wow! Firefox Screenshots è andato in tilt"
   },
   "genericErrorDetails": {
     "message": "Non sappiamo che cosa sia successo. Riprova, magari con una pagina diversa."
   },
   "tourBodyIntro": {
-    "message": "Cattura, salva e condividi screenshot senza mai uscire da Firefox."
+    "message": "Cattura, salva e condividi schermate senza mai uscire da Firefox."
   },
   "tourHeaderPageAction": {
     "message": "Un nuovo modo per salvare informazioni"
   },
   "tourBodyPageAction": {
     "message": "Hai bisogno di catturare un’istantanea della pagina? Ti basta aprire il menu nella barra degli indirizzi."
   },
   "tourHeaderClickAndDrag": {
@@ -142,17 +142,23 @@
   },
   "tourBodyFullPage": {
     "message": "Utilizza i pulsanti in alto a destra per catturare una parte della finestra o l’intera pagina."
   },
   "tourHeaderDownloadUpload": {
     "message": "Come piace a te"
   },
   "tourBodyDownloadUpload": {
-    "message": "Cattura lo screenshot di una pagina web, ritaglialo e salvalo online per condividerlo in modo più veloce, oppure scaricalo sul tuo computer. Puoi anche utilizzare il pulsante “I miei screenshot” per ritrovare tutte le immagini che hai salvato."
+    "message": "Cattura una schermata di una pagina web, ritagliala e salvala online per condividerla in modo più veloce, oppure scaricala sul tuo computer. Puoi anche utilizzare il pulsante “Le mie immagini” per ritrovare tutte le immagini che hai salvato."
+  },
+  "tourHeaderAccounts": {
+    "message": "I tuoi screenshot, sempre con te"
+  },
+  "tourBodyAccounts": {
+    "message": "Accedi al tuo account Firefox per avere sempre a disposizione gli screenshot salvati su tutti i tuoi dispositivi e conservare le tue immagini preferite senza limiti di tempo."
   },
   "tourSkip": {
     "message": "Ignora"
   },
   "tourNext": {
     "message": "Schermata successiva"
   },
   "tourPrevious": {
@@ -174,11 +180,11 @@
   },
   "termsAndPrivacyNoticeTermsLink": {
     "message": "condizioni di utilizzo"
   },
   "termsAndPrivacyNoticyPrivacyLink": {
     "message": "informativa sulla privacy"
   },
   "libraryLabel": {
-    "message": "Screenshot"
+    "message": "Schermate"
   }
 }
\ No newline at end of file
rename from browser/extensions/screenshots/webextension/_locales/ja/messages.json
rename to browser/extensions/screenshots/_locales/ja/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ja/messages.json
+++ b/browser/extensions/screenshots/_locales/ja/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "ショットがクリップボードへコピーされました。$META_KEY$+V キーで貼り付けられます。",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "この画像は $PIXELS$px にトリミングされました。",
+  "imageCropPopupWarning": {
+    "message": "保存される画像は高さ $PIXELS$px で切り落とされます。",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "問題が発生しました。"
rename from browser/extensions/screenshots/webextension/_locales/ka/messages.json
rename to browser/extensions/screenshots/_locales/ka/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ka/messages.json
+++ b/browser/extensions/screenshots/_locales/ka/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "თქვენი სურათი დაკოპირებულია. ჩასმისთვის დააწექით $META_KEY$-V.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "სურათი მოიჭრა $PIXELS$ პიქსელამდე.",
+  "imageCropPopupWarning": {
+    "message": "შენახული სურათები მოიჭრება $PIXELS$px სიმაღლით.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "გაფუჭებულია."
@@ -144,16 +144,22 @@
     "message": "მარჯვენა ზედა კუთხეში არსებული ღილაკების საშუალებით, შეგიძლიათ გადაუღოთ სურათი ხილულ ნაწილს ან მთლიან გვერდს."
   },
   "tourHeaderDownloadUpload": {
     "message": "როგორც გენებოთ"
   },
   "tourBodyDownloadUpload": {
     "message": "ამოჭრილი სურათები შეგიძლიათ განათავსოთ ინტერნეტში, მარტივად გასაზიარებლად, ან ჩამოტვირთოთ კომპიუტერში. ასევე, „ჩემი გადაღებულების“ ღილაკზე დაწკაპებით, იხილავთ თქვენ მიერ გადაღებულ ყველა სურათს."
   },
+  "tourHeaderAccounts": {
+    "message": "თან წაიყოლეთ Screenshots"
+  },
+  "tourBodyAccounts": {
+    "message": "შედით Firefox-ანგარიშზე თქვენს გადაღებულ სურათებთან წვდომის მისაღებად ყველა თქვენი მოწყობილობიდან და სასურველი სურათების სამუდამოდ შესანახად."
+  },
   "tourSkip": {
     "message": "გამოტოვება"
   },
   "tourNext": {
     "message": "შემდეგი"
   },
   "tourPrevious": {
     "message": "წინა"
rename from browser/extensions/screenshots/webextension/_locales/kab/messages.json
rename to browser/extensions/screenshots/_locales/kab/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/kab/messages.json
+++ b/browser/extensions/screenshots/_locales/kab/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Tuṭṭfa-inek tettwanγel yer ufus. Senned yef $META_KEY$-V akken ad tsenṭḍeḍ.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Tugna-agi tettwaẓreg ɣer $PIXELS$ ipiksilen.",
+  "imageCropPopupWarning": {
+    "message": "Tugna yettwakelsen ad tuɣal ar $PIXELS$ px di teɣzi.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Yeffeγ i talast."
@@ -144,16 +144,22 @@
     "message": "Fren tiqeffalin s afella ayeffus akken ad teṭṭfeḍ tamnaṭ yettbanen deg usfaylu neɣ asebter i meṛṛa."
   },
   "tourHeaderDownloadUpload": {
     "message": "Akken tebγiḍ"
   },
   "tourBodyDownloadUpload": {
     "message": "Sekles tuṭṭfiwin-ik ar Web i beṭṭu fessusen, neɣ sider-itent-id ar uselkim-ik. Tzemr€d daɣen ad tiseḍ ɣef tqeffalt Tiṭṭfiwin-iw akken ad tafeḍ akk tuṭṭfiwin n ugdil i teggid."
   },
+  "tourHeaderAccounts": {
+    "message": "Tuṭṭfiwin n wegdil ara yeddun"
+  },
+  "tourBodyAccounts": {
+    "message": "Jerred s umiḍan-ik n Firefox akken ad tkecmeḍ ɣer tuṭṭfiwin-inek deg ibenkan-ik meṛṛa  wa ad tkelseḍ tuṭṭfiwin-inek i tḥemleḍ i lebda."
+  },
   "tourSkip": {
     "message": "Zgel"
   },
   "tourNext": {
     "message": "Tigri n zdat"
   },
   "tourPrevious": {
     "message": "Tigri n deffir"
rename from browser/extensions/screenshots/webextension/_locales/kk/messages.json
rename to browser/extensions/screenshots/_locales/kk/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/kk/messages.json
+++ b/browser/extensions/screenshots/_locales/kk/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Сіздің скриншотыңыз алмасу буферіне көшірілді. Кірістіру үшін $META_KEY$-V басыңыз.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Бұл сурет $PIXELS$ пиксельге дейін қиылды.",
+  "imageCropPopupWarning": {
+    "message": "Сақталатын сурет биіктігі бойынша $PIXELS$ пиксельге дейін қиылады.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Жұмыс істемейді."
@@ -144,16 +144,22 @@
     "message": "Жоғарғы оң жақта орналасқан батырмаларды терезенің көрінетін аймағын, немесе толық бетті түсіру үшін қолданыңыз."
   },
   "tourHeaderDownloadUpload": {
     "message": "Өзіңізге керек түрде"
   },
   "tourBodyDownloadUpload": {
     "message": "Қиылған скриншоттармен оңай бөлісу үшін оларды интернетте сақтауға, немесе сіздің компьютеріңізге жүктеп алуға болады. Сонымен қатар, сіз жасаған барлық скриншоттарды табу үшін Менің скриншоттарым батырмасына шерте аласыз."
   },
+  "tourHeaderAccounts": {
+    "message": "Ұстап жүретін скриншоттар"
+  },
+  "tourBodyAccounts": {
+    "message": "Барлық құрылғыларыңыздаға скриншоттарға қатынау және таңдамалы скриншоттарыңызды мәңгі сақтау үшін өз Firefox тіркелгіңізге кіріңіз."
+  },
   "tourSkip": {
     "message": "Аттап кету"
   },
   "tourNext": {
     "message": "Келесі слайд"
   },
   "tourPrevious": {
     "message": "Алдыңғы слайд"
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/_locales/km/messages.json
@@ -0,0 +1,17 @@
+{
+  "saveScreenshotSelectedArea": {
+    "message": "រក្សា​ទុក"
+  },
+  "cancelScreenshot": {
+    "message": "បោះបង់"
+  },
+  "downloadScreenshot": {
+    "message": "ទាញយក"
+  },
+  "copyScreenshot": {
+    "message": "ចម្លង"
+  },
+  "tourDone": {
+    "message": "បានធ្វើ"
+  }
+}
\ No newline at end of file
rename from browser/extensions/screenshots/webextension/_locales/kn/messages.json
rename to browser/extensions/screenshots/_locales/kn/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/kn/messages.json
+++ b/browser/extensions/screenshots/_locales/kn/messages.json
@@ -1,12 +1,24 @@
 {
+  "myShotsLink": {
+    "message": "ನನ್ನ ಫೋಟೋಗಳು‍"
+  },
   "saveScreenshotSelectedArea": {
     "message": "ಉಳಿಸು"
   },
+  "cancelScreenshot": {
+    "message": "ರದ್ದುಗೊಳಿಸು"
+  },
+  "downloadScreenshot": {
+    "message": "ಡೌನ್‌ಲೋಡ್"
+  },
+  "copyScreenshot": {
+    "message": "ನಕಲಿಸು"
+  },
   "tourSkip": {
     "message": "SKIP"
   },
   "tourDone": {
     "message": "ಆಯಿತು"
   },
   "termsAndPrivacyNoticeTermsLink": {
     "message": "ನಿಯಮಗಳು"
rename from browser/extensions/screenshots/webextension/_locales/ko/messages.json
rename to browser/extensions/screenshots/_locales/ko/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ko/messages.json
+++ b/browser/extensions/screenshots/_locales/ko/messages.json
@@ -71,22 +71,17 @@
     "message": "스크린샷이 클립보드에 복사되었습니다. 붙여넣으려면 $META_KEY$-V를 누르세요.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "imageCroppedWarning": {
-    "message": "이 이미지는 $PIXELS$px로 잘렸습니다.",
-    "placeholders": {
-      "pixels": {
-        "content": "$1"
-      }
-    }
+    "message": "이 이미지는 {pixels}px로 잘렸습니다."
   },
   "requestErrorTitle": {
     "message": "문제가 발생했습니다."
   },
   "requestErrorDetails": {
     "message": "죄송합니다. 스크린샷을 저장하지 못했습니다. 잠시 후에 다시 시도해주세요."
   },
   "connectionErrorTitle": {
rename from browser/extensions/screenshots/webextension/_locales/lij/messages.json
rename to browser/extensions/screenshots/_locales/lij/messages.json
rename from browser/extensions/screenshots/webextension/_locales/lo/messages.json
rename to browser/extensions/screenshots/_locales/lo/messages.json
rename from browser/extensions/screenshots/webextension/_locales/lt/messages.json
rename to browser/extensions/screenshots/_locales/lt/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/lt/messages.json
+++ b/browser/extensions/screenshots/_locales/lt/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Jūsų nuotrauka nukopijuota į iškarpinę. Spustelėkite $META_KEY$-V, norėdami įdėti.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Ši nuotrauka buvo apkirpta iki $PIXELS$ taškų.",
+  "imageCropPopupWarning": {
+    "message": "Įrašytas paveikslas bus apkirptas iki $PIXELS$ taškų aukščio.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Neveikia."
@@ -144,16 +144,22 @@
     "message": "Pasirinkite mygtukus aukščiau dešinėje, norėdami užfiksuoti matomą lango dalį arba visą tinklalapį."
   },
   "tourHeaderDownloadUpload": {
     "message": "Kaip jums patogiau"
   },
   "tourBodyDownloadUpload": {
     "message": "Įrašykite padarytas nuotraukas saityne patogesniam dalinimuisi, arba atsisiųskite jas į savo kompiuterį. Spustelėję mygtuką „Mano nuotraukos“, matysite visas savo padarytas nuotraukas."
   },
+  "tourHeaderAccounts": {
+    "message": "Nuotraukos visur"
+  },
+  "tourBodyAccounts": {
+    "message": "Prisijungę su savo „Firefox“ paskyra, nuotraukas galėsite pasiekti visuose savo įrenginiuose, ir visam laikui įrašyti patinkančias."
+  },
   "tourSkip": {
     "message": "SKIP"
   },
   "tourNext": {
     "message": "Kita skaidrė"
   },
   "tourPrevious": {
     "message": "Buvusi skaidrė"
@@ -168,17 +174,17 @@
         "content": "$1"
       },
       "termsandprivacynoticeprivacylink": {
         "content": "$2"
       }
     }
   },
   "termsAndPrivacyNoticeTermsLink": {
-    "message": "sąlygomis"
+    "message": "Sąlygomis"
   },
   "termsAndPrivacyNoticyPrivacyLink": {
-    "message": "privatumo nuostatais"
+    "message": "Privatumo pranešimu"
   },
   "libraryLabel": {
     "message": "Ekrano nuotraukos"
   }
 }
\ No newline at end of file
rename from browser/extensions/screenshots/webextension/_locales/mai/messages.json
rename to browser/extensions/screenshots/_locales/mai/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/mai/messages.json
+++ b/browser/extensions/screenshots/_locales/mai/messages.json
@@ -68,22 +68,17 @@
     "message": "अहाँक शॉट क्लिपबोर्ड पर नकल कएल गेल. साटबाक लेल $META_KEY$ दाबू.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "imageCroppedWarning": {
-    "message": "ई छवि केँ $PIXELS$px छोट बनाएल गेल.",
-    "placeholders": {
-      "pixels": {
-        "content": "$1"
-      }
-    }
+    "message": "ई छवि केँ {pixels}px छोट बनाएल गेल."
   },
   "requestErrorTitle": {
     "message": "कार्यरत नहि अछि."
   },
   "requestErrorDetails": {
     "message": "माफ करू! हम अहाँक शॉट नहि सहेज सकलहुँ. कृपया बाद मे फेन प्रयास करू."
   },
   "connectionErrorTitle": {
rename from browser/extensions/screenshots/webextension/_locales/mk/messages.json
rename to browser/extensions/screenshots/_locales/mk/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/mk/messages.json
+++ b/browser/extensions/screenshots/_locales/mk/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Вашата слика беше ископирана во меморија. Притиснете $META_KEY$-V за да ја вметнете.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Оваа слика е скратена до $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Снимените слики ќе бидат пресечени на висина од $PIXELS$px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Не работи."
rename from browser/extensions/screenshots/webextension/_locales/ml/messages.json
rename to browser/extensions/screenshots/_locales/ml/messages.json
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/_locales/mn/messages.json
@@ -0,0 +1,17 @@
+{
+  "addonDescription": {
+    "message": "Вэбээс авсан клип болон дэлгэцийн зургийг аваад тэдгээрийг түр эсвэл бүрмөсөн хадгал."
+  },
+  "saveScreenshotSelectedArea": {
+    "message": "Хадгалах"
+  },
+  "saveScreenshotFullPage": {
+    "message": "Бүтэн хуудсыг хадгалах"
+  },
+  "cancelScreenshot": {
+    "message": "Цуцлах"
+  },
+  "downloadScreenshot": {
+    "message": "Татаж авах"
+  }
+}
\ No newline at end of file
rename from browser/extensions/screenshots/webextension/_locales/mr/messages.json
rename to browser/extensions/screenshots/_locales/mr/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/mr/messages.json
+++ b/browser/extensions/screenshots/_locales/mr/messages.json
@@ -24,27 +24,70 @@
     "message": "संपूर्ण पृष्ठ साठवा"
   },
   "cancelScreenshot": {
     "message": "रद्द करा"
   },
   "downloadScreenshot": {
     "message": "डाउनलोड करा"
   },
+  "downloadOnlyNotice": {
+    "message": "आपण सध्या केवळ-डाउनलोड मोडमध्ये आहात."
+  },
+  "downloadOnlyDetails": {
+    "message": "या स्थितींमध्ये Firefox स्क्रीनशॉट आपोआप फक्त-डाउनलोड या मोड वर बदलते:"
+  },
+  "downloadOnlyDetailsPrivate": {
+    "message": "खाजगी ब्राउझिंग विंडोमध्ये."
+  },
+  "downloadOnlyDetailsThirdParty": {
+    "message": "तृतीय-पक्षाच्या कुकीज निष्क्रीय आहेत."
+  },
+  "downloadOnlyDetailsNeverRemember": {
+    "message": "“इतिहास कधीच लक्षात ठेवु नका” कार्यान्वित आहे."
+  },
+  "downloadOnlyDetailsESR": {
+    "message": "आपण Firefox ESR वापरात आहात."
+  },
+  "downloadOnlyDetailsNoUploadPref": {
+    "message": "अपलोड निष्क्रिय आहेत."
+  },
   "notificationLinkCopiedTitle": {
     "message": "दुवा कॉपी केला"
   },
   "notificationLinkCopiedDetails": {
     "message": "आपल्या शॉटचा दुवा क्लिपबोर्डवर कॉपी झाला आहे. चिटकवण्यासाठी $META_KEY$ -V दाबा.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "copyScreenshot": {
+    "message": "प्रत बनवा"
+  },
+  "notificationImageCopiedTitle": {
+    "message": "शॉट प्रतिकृत केला"
+  },
+  "notificationImageCopiedDetails": {
+    "message": "आपला शॉट क्लिपबोर्डवर कॉपी झाला आहे. चिटकवण्यासाठी $META_KEY$ -V दाबा.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "imageCropPopupWarning": {
+    "message": "साठवलेल्या प्रतिमा $PIXELS$px उंचीला कापल्या जातील.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "नादुरुस्त."
   },
   "requestErrorDetails": {
     "message": "क्षमस्व! आम्ही आपला शॉट साठवु शकलो नाही. कृपया नंतर प्रयत्न करा."
   },
   "connectionErrorTitle": {
     "message": "आम्ही आपल्या स्क्रीनशॉटशी जोडणी करु शकत नाही."
@@ -77,16 +120,22 @@
     "message": "हुअ! Firefox स्क्रीनशॉट अव्यवस्थित झाले आहे."
   },
   "genericErrorDetails": {
     "message": "काय घडले याची आम्हाला खात्री नाही. पुन्हा प्रयत्न करा किंवा भिन्न पृष्ठाचा शॉट घ्या?"
   },
   "tourBodyIntro": {
     "message": "Firefox न सोडता स्क्रीनशॉट घ्या, जतन करा आणि सामायिक करा."
   },
+  "tourHeaderPageAction": {
+    "message": "जतन करण्याचा एक नवीन मार्ग"
+  },
+  "tourBodyPageAction": {
+    "message": "जेव्हा आपल्याला स्क्रीनशॉट घ्यायचा असेल तेव्हा पत्ता पट्टीवरील पृष्ठ क्रिया मेनू वाढवा."
+  },
   "tourHeaderClickAndDrag": {
     "message": "आपल्याला पाहिजे असलेल्या गोष्टी फक्त कॅप्चर करा"
   },
   "tourBodyClickAndDrag": {
     "message": "पृष्ठाचा फक्त एक भाग कॅप्चर करण्यासाठी क्लिक आणि ड्रॅग करा. आपण आपल्या निवडीवर ठळकपणे होव्हर देखील करू शकता."
   },
   "tourHeaderFullPage": {
     "message": "Windows किंवा संपूर्ण पृष्ठे कॅप्चर करा"
rename from browser/extensions/screenshots/webextension/_locales/ms/messages.json
rename to browser/extensions/screenshots/_locales/ms/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ms/messages.json
+++ b/browser/extensions/screenshots/_locales/ms/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Syot anda telah disalin ke klipbod. Tekan $META_KEY$-V untuk tampal.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Imej ini akan dipangkas menjadi $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Ketinggian imej yang disimpan akan dipangkas ke $PIXELS$px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Tidak berfungsi."
@@ -144,16 +144,22 @@
     "message": "Pilih butang di bahagian atas kanan untuk merakam kawasan paparan dalam tetingkap atau untuk merakamkan keseluruhan halaman."
   },
   "tourHeaderDownloadUpload": {
     "message": "Seperti Yang Anda Suka"
   },
   "tourBodyDownloadUpload": {
     "message": "Simpan rakaman yang dipotong ke Web, cara yang lebih mudah untuk berkongsi, atau memuat turun ke komputer anda. Anda juga boleh klik pada butang Syot Saya untuk mencari semua rakaman yang telah dibuat."
   },
+  "tourHeaderAccounts": {
+    "message": "Screenshots to Go"
+  },
+  "tourBodyAccounts": {
+    "message": "Daftar masuk dengan Akaun Firefox untuk mengakses semua syot dalam semua peranti dan simpan syot kegemaran anda selama-lamanya."
+  },
   "tourSkip": {
     "message": "SKIP"
   },
   "tourNext": {
     "message": "Slaid Seterusnya"
   },
   "tourPrevious": {
     "message": "Slaid Dahulu"
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/_locales/my/messages.json
@@ -0,0 +1,184 @@
+{
+  "addonDescription": {
+    "message": "ဝဘ်ထံမှ ဓါတ်ပုံများနှင့် မျက်နှာပြင်ပုံဖမ်းချက်များကို ရိုက်ယူပြီး ယာယီ သို့မဟုတ် အမြဲတမ်းသိုလှောင်ရာတွင် သိမ်းဆည်းပါ။"
+  },
+  "addonAuthorsList": {
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
+  },
+  "contextMenuLabel": {
+    "message": "မျက်နှာပြင်ပုံရိပ် ဖမ်းယူပါ"
+  },
+  "myShotsLink": {
+    "message": "ရိုက်ကူးထားသော ပုံများ"
+  },
+  "screenshotInstructions": {
+    "message": "နယ်ပယ်ရွေးရန်စာမျက်နှာကို ဆွဲတင်သို့မဟုတ်ကလစ်နှိပ်ပါ. မလုပ်ဆောင်လိုလှျင်ESC နှိပ်ပါ"
+  },
+  "saveScreenshotSelectedArea": {
+    "message": "သိမ်းရန်"
+  },
+  "saveScreenshotVisibleArea": {
+    "message": "မြင်ရသည်များကို သိမ်းပါ"
+  },
+  "saveScreenshotFullPage": {
+    "message": "စာမျက်နှာတစ်ခုလုံးကို သိမ်းပါ"
+  },
+  "cancelScreenshot": {
+    "message": "မဆောင်ရွက်တော့ပါ"
+  },
+  "downloadScreenshot": {
+    "message": "ဆွဲယူရန်"
+  },
+  "downloadOnlyNotice": {
+    "message": "ဆွဲချမှု တစ်မျိုးသာသုံးသော ပုံစံဖြင့် သင်အခုသုံးနေသည်"
+  },
+  "downloadOnlyDetails": {
+    "message": "ဒီအခြေအနေတွင် Firefoxမှ ရိုက်ချက်များသည် အလိုအလျောက် ဆွဲချမှုတစ်မျိုးတည်းသာသုံးသောပုံစံသို့ ပြောင်းလဲသည်"
+  },
+  "downloadOnlyDetailsPrivate": {
+    "message": "သီးသန့်ကြည့်ရှုခြင်းပုံစံ"
+  },
+  "downloadOnlyDetailsThirdParty": {
+    "message": "အခြားအပြင်ကွတ်ကီးများကို ပိတ်ထားပါ"
+  },
+  "downloadOnlyDetailsNeverRemember": {
+    "message": "“မှတ်တမ်းဖျက်ခြင်း” ကို လုပ်ပါ"
+  },
+  "downloadOnlyDetailsESR": {
+    "message": "Firefoxမှ ESR ကို သင့်သုံးနေပါပြီ"
+  },
+  "downloadOnlyDetailsNoUploadPref": {
+    "message": "ဆွဲတင်မှုပြုလုပ်မှု ပိတ်ထားပြီးပြီ"
+  },
+  "notificationLinkCopiedTitle": {
+    "message": "လင့်ခ်ကို ကူယူပြီး"
+  },
+  "notificationLinkCopiedDetails": {
+    "message": "သင်ဖမ်းယူခဲ့သော ပုံ၏ လင့်ခ်ကို ကလစ်ဘုတ်သို့ ကူးယူပြီးပြီ။ ပွားယူရန် $META_KEY$-V ကို နှိပ်ပါ။",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "copyScreenshot": {
+    "message": "ကူးပါ"
+  },
+  "notificationImageCopiedTitle": {
+    "message": "ရိုက်ချက်ကူးပါ"
+  },
+  "notificationImageCopiedDetails": {
+    "message": "သင်ဖမ်းယူခဲ့သော ပုံကို ကလစ်ဘုတ်သို့ ကူးယူပြီးပြီ။ ပွားယူရန် $META_KEY$-V ကို နှိပ်ပါ။",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "imageCropPopupWarning": {
+    "message": "သိမ်းထားသောပုံကို အမြင့်အားဖြင့် $PIXELS$px ဖြတ်ထုတ်ပါမည်။",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
+  "requestErrorTitle": {
+    "message": "ပျက်နေသည်"
+  },
+  "requestErrorDetails": {
+    "message": "စိတ်မကောင်းပါ၊ သင်ရိုက်ကူးထားသော ပုံကို မသိမ်းနိုင်ပါ။ နောင်တွင် ပြန်စမ်းကြည့်ပါ။"
+  },
+  "connectionErrorTitle": {
+    "message": "သင်ရိုက်ကူးထားသော မျက်နှာပြင်ပုံရိပ်များထံ မချိတ်ဆက်နိုင်ပါ။"
+  },
+  "connectionErrorDetails": {
+    "message": "အင်တာနက်ချိတ်ဆက်မှုကို ကျေးဇူးပြု၍ စစ်ဆေးပါ။ အကယ်၍ အင်တာနက်ကို ချိတ်ဆက်နိုင်ပါက Firefox Screenshots ဝန်ဆောင်မှုတွင် ယာယီအမှားတစ်ခု ရှိကောင်း ရှိနေလိမ့်မည်။"
+  },
+  "loginErrorDetails": {
+    "message": "သင်ဖမ်းယူခဲ့သော ပုံကို မသိမ်းနိုင်ခဲ့ပါ။ အဘယ့်ကြောင့်ဆိုသော် Firefox Screenshots ဝန်ဆောင်မှုတွင် အမှားတစ်ခု ဖြစ်ပေါ်နေ၍ ဖြစ်သည်။ ကျေးဇူးပြု၍ ထပ်ကြိုးစားကြည့်ပါ။"
+  },
+  "unshootablePageErrorTitle": {
+    "message": "ဒီစာမျက်နှာ၏ မျက်နှာပြင်ပုံရိပ်ကို မရိုက်ကူးနိုင်ပါ။"
+  },
+  "unshootablePageErrorDetails": {
+    "message": "ယခုဝဘ်စာမျက်နှာသည် စံနှင့်ကိုက်ညီသော ဝဘ်စာမျက်နှာ မဟုတ်ပါ။ ထို့ကြောင့် မျက်နှာပြင်ပုံဖမ်းခြင်း ပြုလုပ်နိုင်မည် မဟုတ်ပါ။"
+  },
+  "selfScreenshotErrorTitle": {
+    "message": "စာမျက်နှာတွင် Firefoxမှ ပုံဖမ်းရိုက်ချက်များကို သင်မရယူနိုင်ပါ"
+  },
+  "emptySelectionErrorTitle": {
+    "message": "သင့်ရွေးချယ်မှု အရမ်းသေးလွန်းပါသည်"
+  },
+  "privateWindowErrorTitle": {
+    "message": "သီးသန့်ကြည့်ရှုခြင်းပုံစံတွင် ပုံဖမ်းရိုက်ချက်ရယူခြင်းပိတ်ပါ"
+  },
+  "privateWindowErrorDetails": {
+    "message": "အဆင်မပြေမှုများအတွက် တောင်းပန်ပါတယ်။ ယခုလုပ်ဆောင်ချက်ကို နောင်ထုတ်ကုန်တွင် ပါဝင်စေရန် ဆောင်ရွက်နေပါသည်။"
+  },
+  "genericErrorTitle": {
+    "message": "ဝိုး။ Firefox Screenshots မှာ အမှားဖြစ်ပေါ်ခဲ့သည်။"
+  },
+  "genericErrorDetails": {
+    "message": "ဘာဖြစ်သွားခဲ့မှန်း သေချာမသိခဲ့ပါ။ ထပ်စမ်းကြည့်လိုပါသလား သို့မဟုတ် အခြားဝဘ်စာမျက်နှာကို ပုံရိပ်ဖမ်းလိုပါသလား။"
+  },
+  "tourBodyIntro": {
+    "message": "Firefox ကနေ ထွက်ခွာရန် မလိုဘဲ မျက်နှာပြင်ပုံရိပ်များကို ရိုက်ကူး၊ သိမ်းဆည်း၊ မျှဝေပါ။"
+  },
+  "tourHeaderPageAction": {
+    "message": "သိမ်းဆဲရန် နည်းလမ်းအသစ်"
+  },
+  "tourBodyPageAction": {
+    "message": "သင် မျက်နှာပြင်ပုံရိပ်ဖမ်းလိုသည့် အခါတိုင်း လိပ်စာဘားတန်းရှိ စာမျက်နှာလုပ်ဆောင်ချက်များ မီနူးကို ဖြန့်ချပါ။"
+  },
+  "tourHeaderClickAndDrag": {
+    "message": "ကိုယ်နှစ်သက်ရာ စာမျက်နှာများကို ဖမ်းယူပါ"
+  },
+  "tourBodyClickAndDrag": {
+    "message": "စာမျက်နှာ၏ အစိတ်အပိုင်းကို ဖမ်းယူရန် ကလစ်နှိပ်ပြီး ဖိဆွဲပါ။ သင့်ရွေးချယ်မှုကို ထင်ရှားစေရန် ညွှန်တံမြားကို ဆိုင်ရာအစိတ်အပိုင်းပေါ် ရွှေ့နိုင်သည်။"
+  },
+  "tourHeaderFullPage": {
+    "message": "ဝင်ဒိုးများ သို့မဟုတ် စာမျက်နှာတစ်ခုလုံးကို ဖမ်းယူပါ"
+  },
+  "tourBodyFullPage": {
+    "message": "ဝင်းဒိုးထဲရှိ မြင်ရသော အကျယ်အဝန်းကို ဖမ်းယူရန် သို့မဟုတ် စာမျက်နှာတစ်ခုလုံးကို ဖမ်းယူရန် ညာဘက်အပေါ်ဘက်ရှိ ခလုတ်များကို ရွေးပါ။"
+  },
+  "tourHeaderDownloadUpload": {
+    "message": "နှစ်သက်သလို"
+  },
+  "tourBodyDownloadUpload": {
+    "message": "ဝဘ်တွင် အလွယ်တကူ မျှဝေရန် သို့မဟုတ် ကွန်ပျူတာထဲသို့ ဆွဲယူကူးရန် ဖြတ်တောက်ထားသော ပုံဖမ်းချက်များကို သိမ်းပါ။ ရိုက်ထားသမျှပုံများအားလုံးကို ရှာဖွေကြည့်ရှုရန် ရိုက်ထားသောပုံများတွင်လည်း ကလစ်နှိပ်ကြည့်နိုင်သည်။"
+  },
+  "tourSkip": {
+    "message": "SKIP"
+  },
+  "tourNext": {
+    "message": "နောက်ဆလိုက်"
+  },
+  "tourPrevious": {
+    "message": "အရင်ကဆလိုက်"
+  },
+  "tourDone": {
+    "message": "ပြီးပြီ"
+  },
+  "termsAndPrivacyNotice2": {
+    "message": "Firefoxမှ ပုံဖမ်းယူခြင်းများကို သုံးစွဲခြင်းဖြင့် သင် $TERMSANDPRIVACYNOTICETERMSLINK$ နှင့် $TERMSANDPRIVACYNOTICEPRIVACYLINK$များတွင်ပါသောအရာများကို သဘောတူညီပါသည်",
+    "placeholders": {
+      "termsandprivacynoticetermslink": {
+        "content": "$1"
+      },
+      "termsandprivacynoticeprivacylink": {
+        "content": "$2"
+      }
+    }
+  },
+  "termsAndPrivacyNoticeTermsLink": {
+    "message": "စကားရပ်များ"
+  },
+  "termsAndPrivacyNoticyPrivacyLink": {
+    "message": "ကိုယ်ရေးကာကွယ်မှု သတိပေးချက်"
+  },
+  "libraryLabel": {
+    "message": "ပုံဖမ်းရိုက်ချက်များ"
+  }
+}
\ No newline at end of file
rename from browser/extensions/screenshots/webextension/_locales/nb_NO/messages.json
rename to browser/extensions/screenshots/_locales/nb_NO/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/nb_NO/messages.json
+++ b/browser/extensions/screenshots/_locales/nb_NO/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Bildet ditt er kopiert til utklippstavlen. Trykk på $META_KEY$-V for å lime det inn.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Dette bildet har blitt beskåret til $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Det lagrede bildet vil bli beskåret til $PIXELS$px i høyden.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "I ustand."
@@ -144,16 +144,22 @@
     "message": "Bruk knappene i det øvre høyre hjørnet for å ta skjermbilde av det synlige området i vinduet eller for å ta skjermbilde av en hel side."
   },
   "tourHeaderDownloadUpload": {
     "message": "Som du vil ha det"
   },
   "tourBodyDownloadUpload": {
     "message": "Lagre de beskjærte skjermbildene dine på nettet for enklere deling, eller last de ned til din datamaskin. Du kan også klikke på knappen Mine skjermbilde for å finne alle skjermbildene du har tatt."
   },
+  "tourHeaderAccounts": {
+    "message": "Skjermbilder til å ta med"
+  },
+  "tourBodyAccounts": {
+    "message": "Logg på med din Firefox-konto for å få tilgang til bildene dine på alle enhetene dine og lagre favorittbildene dine for alltid."
+  },
   "tourSkip": {
     "message": "Hopp over"
   },
   "tourNext": {
     "message": "Neste slide"
   },
   "tourPrevious": {
     "message": "Forrige slide"
rename from browser/extensions/screenshots/webextension/_locales/ne_NP/messages.json
rename to browser/extensions/screenshots/_locales/ne_NP/messages.json
rename from browser/extensions/screenshots/webextension/_locales/nl/messages.json
rename to browser/extensions/screenshots/_locales/nl/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/nl/messages.json
+++ b/browser/extensions/screenshots/_locales/nl/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Uw afbeelding is naar het klembord gekopieerd. Druk op $META_KEY$-V om te plakken.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Deze afbeelding is bijgesneden naar $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Opgeslagen afbeelding wordt naar $PIXELS$px in hoogte bijgesneden.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Buiten werking."
@@ -94,17 +94,17 @@
   },
   "connectionErrorDetails": {
     "message": "Controleer uw internetverbinding. Als u verbinding met het internet kunt maken, kan er sprake zijn van een tijdelijk probleem met de Firefox Screenshots-service."
   },
   "loginErrorDetails": {
     "message": "Uw afbeelding kon niet worden opgeslagen, omdat er een probleem is met de Firefox Screenshots-service. Probeer het later opnieuw."
   },
   "unshootablePageErrorTitle": {
-    "message": "Van deze pagina kan geen schermafbeelding worden gemaakt."
+    "message": "Een schermafbeelding van deze pagina is niet mogelijk."
   },
   "unshootablePageErrorDetails": {
     "message": "Dit is geen standaardwebpagina, dus u kunt er geen schermafbeelding van maken."
   },
   "selfScreenshotErrorTitle": {
     "message": "U kunt geen afbeelding van een Firefox Screenshots-pagina maken!"
   },
   "emptySelectionErrorTitle": {
@@ -144,16 +144,22 @@
     "message": "Selecteer de knoppen rechtsboven om het zichtbare gebied in het venster vast te leggen, of om een hele pagina vast te leggen."
   },
   "tourHeaderDownloadUpload": {
     "message": "Zoals u wilt"
   },
   "tourBodyDownloadUpload": {
     "message": "Bewaar uw bijgesneden afbeeldingen op het web voor makkelijker delen, of download ze naar uw computer. U kunt ook op de knop Mijn afbeeldingen klikken om al uw gemaakte afbeeldingen te vinden."
   },
+  "tourHeaderAccounts": {
+    "message": "Schermafbeeldingen om mee te nemen"
+  },
+  "tourBodyAccounts": {
+    "message": "Meld u aan met uw Firefox-account om uw afbeeldingen op al uw apparaten te bekijken en uw favoriete afbeeldingen voor altijd te bewaren."
+  },
   "tourSkip": {
     "message": "Overslaan"
   },
   "tourNext": {
     "message": "Volgende slide"
   },
   "tourPrevious": {
     "message": "Vorige slide"
rename from browser/extensions/screenshots/webextension/_locales/nn_NO/messages.json
rename to browser/extensions/screenshots/_locales/nn_NO/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/nn_NO/messages.json
+++ b/browser/extensions/screenshots/_locales/nn_NO/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Bildet ditt er kopiert til utklippstavla. Trykk på $META_KEY$-V for å lime det inn.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Dette bildet har vorte skore til til $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Lagra bilde vil bli skore til, til dei er $PIXELS$px i høgda.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "I ustand."
@@ -142,17 +142,23 @@
   },
   "tourBodyFullPage": {
     "message": "Vel knappane i det øvre høgre hjørnet for å knipse det synlege området i vindauget eller for å knipse ei heil side."
   },
   "tourHeaderDownloadUpload": {
     "message": "Som du vil ha det"
   },
   "tourBodyDownloadUpload": {
-    "message": "Lagre dei tilskjerte bilda dine på nettet for enklare deling, eller last dei ned til datamaskina di. Du kan også klikke på knappen Mine skjermbilde for å finne alle bilda du har tatt."
+    "message": "Lagre dei tilskorne bilda dine på nettet for enklare deling, eller last dei ned til datamaskina di. Du kan også klikke på knappen Mine skjermbilde for å finne alle bilda du har tatt."
+  },
+  "tourHeaderAccounts": {
+    "message": "Skjermbilde til å ta med"
+  },
+  "tourBodyAccounts": {
+    "message": "Logg på med Firefox-kontoen din for å få tilgang til bilda dine på alle einingane dine og lagre favorittbilda dine for alltid."
   },
   "tourSkip": {
     "message": "Hopp over"
   },
   "tourNext": {
     "message": "Neste slide"
   },
   "tourPrevious": {
rename from browser/extensions/screenshots/webextension/_locales/pa_IN/messages.json
rename to browser/extensions/screenshots/_locales/pa_IN/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/pa_IN/messages.json
+++ b/browser/extensions/screenshots/_locales/pa_IN/messages.json
@@ -92,12 +92,18 @@
     "message": "ਅਗਲੀ ਸਲਾਈਡ"
   },
   "tourPrevious": {
     "message": "ਪਿਛਲੀ ਸਲਾਈਡ"
   },
   "tourDone": {
     "message": "ਮੁਕੰਮਲ"
   },
+  "termsAndPrivacyNoticeTermsLink": {
+    "message": "ਸ਼ਰਤਾਂ"
+  },
   "termsAndPrivacyNoticyPrivacyLink": {
     "message": "ਨਿੱਜੀ ਨੋਟਿਸ"
+  },
+  "libraryLabel": {
+    "message": "ਸਕਰੀਨਸ਼ਾੱਟ"
   }
 }
\ No newline at end of file
rename from browser/extensions/screenshots/webextension/_locales/pl/messages.json
rename to browser/extensions/screenshots/_locales/pl/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/pl/messages.json
+++ b/browser/extensions/screenshots/_locales/pl/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Zrzut został skopiowany do schowka. Naciśnij $META_KEY$-V, aby go wkleić.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Ten obraz został przycięty do $PIXELS$ px.",
+  "imageCropPopupWarning": {
+    "message": "Zapisany obraz zostanie przycięty do $PIXELS$ px wysokości.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Awaria."
@@ -144,16 +144,22 @@
     "message": "Kliknij przycisk w górnym prawym rogu, aby zapisać obszar widoczny w oknie lub całą stronę."
   },
   "tourHeaderDownloadUpload": {
     "message": "Tak, jak lubisz"
   },
   "tourBodyDownloadUpload": {
     "message": "Zapisuj przycięte zrzuty w Internecie, aby łatwiej je udostępniać, albo pobierz je na swój komputer. Możesz też kliknąć przycisk „Moje zrzuty”, aby przeglądać wszystkie wykonane zrzuty."
   },
+  "tourHeaderAccounts": {
+    "message": "Zrzuty ekranu na wynos"
+  },
+  "tourBodyAccounts": {
+    "message": "Zaloguj się na konto Firefoksa, aby mieć dostęp do swoich zrzutów na wszystkich urządzeniach i zachować ulubione na zawsze."
+  },
   "tourSkip": {
     "message": "Pomiń"
   },
   "tourNext": {
     "message": "Dalej"
   },
   "tourPrevious": {
     "message": "Wstecz"
rename from browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
rename to browser/extensions/screenshots/_locales/pt_BR/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
+++ b/browser/extensions/screenshots/_locales/pt_BR/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Sua captura de tela foi copiada para a área de transferência. Pressione $META_KEY$-V para colar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Esta imagem foi recortada para $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "As imagens salvas serão cortadas em $PIXELS$px de altura.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Oops! Fora do ar."
rename from browser/extensions/screenshots/webextension/_locales/pt_PT/messages.json
rename to browser/extensions/screenshots/_locales/pt_PT/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/pt_PT/messages.json
+++ b/browser/extensions/screenshots/_locales/pt_PT/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "A sua captura foi copiada para a área de transferência. Pressione $META_KEY$-V para colar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Esta imagem foi recortada para $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "A imagem guardada será recortada para $PIXELS$px de altura.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Fora de serviço."
@@ -144,16 +144,19 @@
     "message": "Selecione os botões no canto superior direito para capturar a área visível na janela ou para capturar uma página inteira."
   },
   "tourHeaderDownloadUpload": {
     "message": "Como você gosta"
   },
   "tourBodyDownloadUpload": {
     "message": "Guarde as suas capturas na web para partilhar mais facilmente ou transfira-as para o seu computador. Pode também clicar no botão Minhas capturas para encontrar todas as capturas que tirou."
   },
+  "tourBodyAccounts": {
+    "message": "Inicie sessão com a sua Conta Firefox para aceder às suas capturas em todos os seus dispositivos e guardar as suas capturas favoritas para sempre."
+  },
   "tourSkip": {
     "message": "SALTAR"
   },
   "tourNext": {
     "message": "Diapositivo seguinte"
   },
   "tourPrevious": {
     "message": "Diapositivo anterior"
rename from browser/extensions/screenshots/webextension/_locales/rm/messages.json
rename to browser/extensions/screenshots/_locales/rm/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/rm/messages.json
+++ b/browser/extensions/screenshots/_locales/rm/messages.json
@@ -39,16 +39,22 @@
     "message": "Sche ti navigheschas en il modus privat."
   },
   "downloadOnlyDetailsThirdParty": {
     "message": "Sche cookies da terzs èn deactivads."
   },
   "downloadOnlyDetailsNeverRemember": {
     "message": "Sche l'opziun «Mai memorisar la cronologia» è activada."
   },
+  "downloadOnlyDetailsESR": {
+    "message": "Ti utiliseschas Firefox ESR."
+  },
+  "downloadOnlyDetailsNoUploadPref": {
+    "message": "La transmissiun da datotecas è deactivada."
+  },
   "notificationLinkCopiedTitle": {
     "message": "Copià la colliaziun"
   },
   "notificationLinkCopiedDetails": {
     "message": "La colliaziun tar tes maletg da visur è vegnida copiada en l'archiv provisoric. Smatga $META_KEY$-V per l'encollar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
@@ -64,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Tes maletg dal visur è vegnì copià en l'archiv provisoric. Smatga $META_KEY$-V per l'encollar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Quest maletg è vegnì retaglià a $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Il maletg memorisà vegn retaglià ad ina autezza da $PIXELS$px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Ord funcziun."
rename from browser/extensions/screenshots/webextension/_locales/ro/messages.json
rename to browser/extensions/screenshots/_locales/ro/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ro/messages.json
+++ b/browser/extensions/screenshots/_locales/ro/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Captura a fost copiată în clipboard. Apasă $META_KEY$-V pentru a lipi.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Imaginea a fost decupată la $PIXELS$ px.",
+  "imageCropPopupWarning": {
+    "message": "Imaginea salvată va fi decupată la înălțimea de $PIXELS$px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Nefuncțional."
@@ -144,16 +144,22 @@
     "message": "Selectează butoanele din partea dreaptă sus pentru a captura zona vizibilă din fereastră sau pentru a captura o pagină întreagă."
   },
   "tourHeaderDownloadUpload": {
     "message": "Pe placul tău"
   },
   "tourBodyDownloadUpload": {
     "message": "Salvează capturile decupate pe web pentru a le împărtăși mai ușor, sau descarcă-le pe calculator. Mai poți face clic pe butonul My Shots (capturile mele) pentru a găsi toate capturile luate."
   },
+  "tourHeaderAccounts": {
+    "message": "Capturi de ecran de luat cu tine"
+  },
+  "tourBodyAccounts": {
+    "message": "Autentifică-te în contul Firefox pentru accesarea capturilor de pe toate dispozitivele și salvează definitiv capturile favorite."
+  },
   "tourSkip": {
     "message": "OMITE"
   },
   "tourNext": {
     "message": "Diapozitivul următor"
   },
   "tourPrevious": {
     "message": "Diapozitivul anterior"
rename from browser/extensions/screenshots/webextension/_locales/ru/messages.json
rename to browser/extensions/screenshots/_locales/ru/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ru/messages.json
+++ b/browser/extensions/screenshots/_locales/ru/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Ваш снимок был скопирован в буфер обмена. Нажмите $META_KEY$-V для его вставки.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Это изображение было обрезано до $PIXELS$ пикселей.",
+  "imageCropPopupWarning": {
+    "message": "Сохранённое изображение будет обрезано до $PIXELS$ пикселей в высоту.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Произошла ошибка."
@@ -144,16 +144,22 @@
     "message": "С помощью кнопок в верхнем правом углу выбирайте захват видимой области окна или страницы целиком."
   },
   "tourHeaderDownloadUpload": {
     "message": "Как вам нравится"
   },
   "tourBodyDownloadUpload": {
     "message": "Сохраняйте свои снимки в Интернете, чтобы легко ими делиться, или загружайте их на свой компьютер. Вы также можете просмотреть все сохранённые снимки, нажав на кнопку Мои снимки."
   },
+  "tourHeaderAccounts": {
+    "message": "Скриншоты на ходу"
+  },
+  "tourBodyAccounts": {
+    "message": "Войдите в свой Аккаунт Firefox, чтобы получить доступ к вашим снимкам на всех ваших устройствах и сохраняйте любимые вами навсегда."
+  },
   "tourSkip": {
     "message": "Пропустить"
   },
   "tourNext": {
     "message": "Следующий слайд"
   },
   "tourPrevious": {
     "message": "Предыдущий слайд"
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/_locales/si/messages.json
@@ -0,0 +1,52 @@
+{
+  "contextMenuLabel": {
+    "message": "තිර දර්ශනයක් ලබා ගන්න"
+  },
+  "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": "කරුණාකර ඔබේ අන්තර්ජාල සබදතාව පරීක්ෂා කරන්න. ඔබට අන්තර්ජාලය හා සබද විය හැකි නම්, Firefox තිරදසුන් සේවයේ තාවකාළික ගැටළුවක් විය හැක."
+  },
+  "loginErrorDetails": {
+    "message": "Firefox තිරදසුන් සේවයේ ගැටළුවක් නිසා අපට ඔබේ දසුන සුරැකීමට නොහැකි විය. කරුණාකර පසුව උත්සාහ කරන්න."
+  },
+  "unshootablePageErrorTitle": {
+    "message": "අපට මෙම පිටුවේ තිරදසුන් ලබා ගැනීමට නොහැකි."
+  },
+  "unshootablePageErrorDetails": {
+    "message": "මෙය සම්මත වෙබ් පිටුවක් නොවේ, එම නිසා මෙහි තිරදසුන් ලබා ගැනීමට ඔබට නොහැකිය."
+  }
+}
\ No newline at end of file
rename from browser/extensions/screenshots/webextension/_locales/sk/messages.json
rename to browser/extensions/screenshots/_locales/sk/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/sk/messages.json
+++ b/browser/extensions/screenshots/_locales/sk/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Vaša snímka bola skopírovaná do schránky. Stlačením $META_KEY$-V ju prilepíte.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Tento obrázok bol orezaný na $PIXELS$ px.",
+  "imageCropPopupWarning": {
+    "message": "Uložený obrázok bude orezaný na výšku $PIXELS$px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Mimo prevádzky."
@@ -144,16 +144,22 @@
     "message": "Kliknutím na tlačidlo v pravom hornom rohu môžete zachytiť viditeľnú časť stránky. Pomocou ďalšieho tlačidla zachytíte celú stránku."
   },
   "tourHeaderDownloadUpload": {
     "message": "Urobte to, čo chcete"
   },
   "tourBodyDownloadUpload": {
     "message": "Uložte si orezanú snímku na web, aby ste ju mohli ľahšie zdieľať alebo si ju prevziať do počítača. Môžete si taktiež pozrieť všetky vaše snímky - stačí, ak kliknete na tlačidlo Moje snímky."
   },
+  "tourHeaderAccounts": {
+    "message": "Snímky stránok vždy so sebou"
+  },
+  "tourBodyAccounts": {
+    "message": "Prihláste sa so svojím účtom Firefox a majte prístup ku všetkým svojich snímkam zo všetkých vašich zariadení."
+  },
   "tourSkip": {
     "message": "Preskočiť"
   },
   "tourNext": {
     "message": "Ďalšia snímka"
   },
   "tourPrevious": {
     "message": "Predchádzajúca snímka"
rename from browser/extensions/screenshots/webextension/_locales/sl/messages.json
rename to browser/extensions/screenshots/_locales/sl/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/sl/messages.json
+++ b/browser/extensions/screenshots/_locales/sl/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Posnetek zaslona je bil kopiran na odložišče. Pritisnite $META_KEY$-V, da ga prilepite.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Ta slika je bila obrezana na $PIXELS$ pikslov.",
+  "imageCropPopupWarning": {
+    "message": "Shranjena slika bo obrezana na $PIXELS$ pik v višino.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Ne dela."
@@ -144,16 +144,22 @@
     "message": "V zgornjem desnem kotu izberite gumb za zajem vidnega območja v oknu ali celotne strani."
   },
   "tourHeaderDownloadUpload": {
     "message": "Kot vi želite"
   },
   "tourBodyDownloadUpload": {
     "message": "Shranite obrezane posnetke na splet za lažje deljenje ali jih prenesite na svoj računalnik. Vse zajete posnetke lahko najdete s klikom na gumb Moji posnetki."
   },
+  "tourHeaderAccounts": {
+    "message": "Posnetki za na pot"
+  },
+  "tourBodyAccounts": {
+    "message": "Prijavite se s Firefox Računom za dostop do posnetkov na vseh svojih napravah in trajno shranjevanje priljubljenih posnetkov."
+  },
   "tourSkip": {
     "message": "Preskoči"
   },
   "tourNext": {
     "message": "Naslednji diapozitiv"
   },
   "tourPrevious": {
     "message": "Prejšnji diapozitiv"
rename from browser/extensions/screenshots/webextension/_locales/sq/messages.json
rename to browser/extensions/screenshots/_locales/sq/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/sq/messages.json
+++ b/browser/extensions/screenshots/_locales/sq/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Fotoja juaj u kopjua në të papastër. Për ta ngjitur diku, shtypni $META_KEY$-V.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Kjo figurë është qethur në $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Figura e ruajtur do të qethet në lartësinë $PIXELS$px.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "S’ka gjendje."
@@ -144,16 +144,22 @@
     "message": "Përzgjidhni butonat në cepin e sipërm djathtas që të fotografoni zonën e dukshme te dritarja ose një faqe të tërë."
   },
   "tourHeaderDownloadUpload": {
     "message": "Si T’ju Pëlqejë"
   },
   "tourBodyDownloadUpload": {
     "message": "Ruajini fotot tuaja në web, për ndarje më të lehtë me të tjerët, ose shkarkojini në kompjuterin tuaj. Mund edhe të klikoni te butoni Shkrepjet e Mia që të gjeni krejt shkrepjet që keni bërë."
   },
+  "tourHeaderAccounts": {
+    "message": "Foto ekrani Kudo Me Vete"
+  },
+  "tourBodyAccounts": {
+    "message": "Hyni në Llogarinë tuaj Firefox që të përdorni shkrepjet tuaja në krejt pajisjet tuaja dhe t’i ruani shkrepjet e parapëlqyera përgjithmonë."
+  },
   "tourSkip": {
     "message": "ANASHKALOJE"
   },
   "tourNext": {
     "message": "Diapozitivi Pasues"
   },
   "tourPrevious": {
     "message": "Diapozitivi i Mëparshëm"
rename from browser/extensions/screenshots/webextension/_locales/sr/messages.json
rename to browser/extensions/screenshots/_locales/sr/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/sr/messages.json
+++ b/browser/extensions/screenshots/_locales/sr/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Ваш снимак је копиран. Притисните $META_KEY$-V да налепите.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Слика је исечена на $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Сачуване слике ће бити исечене на $PIXELS$px у висину.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Не ради."
rename from browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
rename to browser/extensions/screenshots/_locales/sv_SE/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
+++ b/browser/extensions/screenshots/_locales/sv_SE/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Din bild har kopierats till urklipp. Tryck på $META_KEY$-V för att klistra in.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Den här bilden har beskurits till $PIXELS$px.",
+  "imageCropPopupWarning": {
+    "message": "Den sparade bilden kommer att beskäras till $PIXELS$ pixlar i höjd.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Ur funktion."
@@ -144,16 +144,22 @@
     "message": "Välj knapparna i det övre högra hörnet för att fånga det synliga området i fönstret eller för att fånga en hel sida."
   },
   "tourHeaderDownloadUpload": {
     "message": "Som du vill ha det"
   },
   "tourBodyDownloadUpload": {
     "message": "Spara dina beskurna bilder till webben för enklare delning, eller hämta dem till datorn. Du kan också klicka på knappen Mina skärmbilder för att hitta alla bilder du tagit."
   },
+  "tourHeaderAccounts": {
+    "message": "Skärmbilder att ta med"
+  },
+  "tourBodyAccounts": {
+    "message": "Logga in med ditt Firefox-konto för att komma åt dina bilder på alla dina enheter och spara dina favoritbilder för alltid."
+  },
   "tourSkip": {
     "message": "Hoppa över"
   },
   "tourNext": {
     "message": "Nästa sida"
   },
   "tourPrevious": {
     "message": "Föregående sida"
rename from browser/extensions/screenshots/webextension/_locales/ta/messages.json
rename to browser/extensions/screenshots/_locales/ta/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ta/messages.json
+++ b/browser/extensions/screenshots/_locales/ta/messages.json
@@ -24,27 +24,65 @@
     "message": "முழு பக்கத்தைச் சேமி"
   },
   "cancelScreenshot": {
     "message": "இரத்து"
   },
   "downloadScreenshot": {
     "message": "பதிவிறக்கு"
   },
+  "downloadOnlyNotice": {
+    "message": "நீங்கள் தற்போது பதிவிறக்க முறையில் உள்ளீர்கள்."
+  },
+  "downloadOnlyDetails": {
+    "message": "இந்த சூழ்நிலைகளில் பயர்பாக்சு திரைப்பிடிப்பு தானாகவே பதிவிறக்க-முறைக்கு மாறும்:"
+  },
+  "downloadOnlyDetailsPrivate": {
+    "message": "அந்தரங்க உலாவல் சாளரத்தில்."
+  },
+  "downloadOnlyDetailsThirdParty": {
+    "message": "மூன்றாம் தரப்பு நினைவிகள் முடக்கப்பட்டுள்ளன."
+  },
+  "downloadOnlyDetailsNeverRemember": {
+    "message": "“வரலாற்றை ஒருபோதும் நினைவு கொள்ளாதே” செயல்படுத்தப்பட்டது."
+  },
+  "downloadOnlyDetailsESR": {
+    "message": "நீங்கள் பயர்பாக்சு ESR பயன்படுத்துகிறீர்கள்."
+  },
+  "downloadOnlyDetailsNoUploadPref": {
+    "message": "பதிவேற்றங்கள் முடக்கப்பட்டுள்ளன."
+  },
   "notificationLinkCopiedTitle": {
     "message": "தொடுப்பு நகலெடுக்கப்பட்டது"
   },
   "notificationLinkCopiedDetails": {
     "message": "நீங்கள் எடுத்த திரைப்பிடிப்பிற்கான தொடுப்பு ஒட்டுபலகைக்கு நகலெடுக்கப்பட்டது. ஒட்ட $META_KEY$ விசையை அழுத்தவும்.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "copyScreenshot": {
+    "message": "நகலெடு"
+  },
+  "notificationImageCopiedTitle": {
+    "message": "ஷாட் நகலெடுக்கப்பட்டது"
+  },
+  "notificationImageCopiedDetails": {
+    "message": "நீங்கள் எடுத்த திரைப்பிடிப்பிற்கான தொடுப்பு ஒட்டுபலகைக்கு நகலெடுக்கப்பட்டது. ஒட்ட $META_KEY$-V விசையை அழுத்தவும்.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "imageCroppedWarning": {
+    "message": "இந்த படம் {pixels}px அளவுக்கு கத்தரிக்கப்பட்டது."
+  },
   "requestErrorTitle": {
     "message": "சேவை இணைப்பில் இல்லை."
   },
   "requestErrorDetails": {
     "message": "மன்னிக்க! உங்களின் திரைப்பிடிப்பைச் சேமிக்க முடியவில்லை. மீண்டும் முயற்சிக்கவும்."
   },
   "connectionErrorTitle": {
     "message": "உங்களின் திரைப்பிடிப்பு சேவையகத்தை அணுக முடியவில்லை."
@@ -80,16 +118,19 @@
     "message": "என்ன நடந்தது என எங்களுக்குத் தெரியவில்லை. முடிந்தால் மீண்டும் முயற்சியுங்கள் (அ) வேறொரு பக்கத்தில் முயற்சியுங்கள்?"
   },
   "tourBodyIntro": {
     "message": "பயர்பாஃசை விட்டு வெளியேறாமல் திரைப்பிடிப்புகளை எடுக்கலாம், சேமித்து மற்றவருடன் பகிர்ந்துக்கொள்ளலாம்."
   },
   "tourHeaderPageAction": {
     "message": "சேமிப்பதற்கானபுதியவழி"
   },
+  "tourBodyPageAction": {
+    "message": "நீங்கள் திரைப்பிடிப்பு எடுக்க விரும்பும் வேளையில் முகவரி பட்டையின் பக்க செயல்பாடுகள் பட்டியலை விரியுங்கள்."
+  },
   "tourHeaderClickAndDrag": {
     "message": "உங்களுக்கு என்ன வேண்டுமோ அதைக் கைப்பற்றுங்கள்"
   },
   "tourBodyClickAndDrag": {
     "message": "சொடுக்கி இழுத்து சும்மா ஒரு பகுதியைத் தேர்வுச்செய்க. நீங்கள் இங்கும் அங்குமாக நகர்த்திக் கூட நீங்கள் தேர்வுச்செய்த பக்கத்தை மிளிர்க்கச் செய்யலாம்."
   },
   "tourHeaderFullPage": {
     "message": "சாளரங்களை (அ) முழுப் பக்கங்களை கைப்பற்றவும்"
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/_locales/te/messages.json
@@ -0,0 +1,175 @@
+{
+  "addonDescription": {
+    "message": "జాలం నుండి కత్తిరింపులను తెరపట్లను తీసుకొని, వాటిని తాత్కాలికంగా లేదా శాశ్వతంగా భద్రపరచకోండి."
+  },
+  "addonAuthorsList": {
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
+  },
+  "contextMenuLabel": {
+    "message": "ఒక తెరపట్టు తీసుకోండి"
+  },
+  "myShotsLink": {
+    "message": "నా తెరపట్లు"
+  },
+  "screenshotInstructions": {
+    "message": "ఒక ప్రాంతాన్ని ఎంచుకోవడానికి పేజీని లాగండి లేదా నొక్కండి. రద్దు చేయడానికి ESC నొక్కండి."
+  },
+  "saveScreenshotSelectedArea": {
+    "message": "భద్రపరచు"
+  },
+  "saveScreenshotVisibleArea": {
+    "message": "కనిపించే దానిని బద్రపరచండి"
+  },
+  "saveScreenshotFullPage": {
+    "message": "పూర్తి పేజీని భద్రపరచు"
+  },
+  "cancelScreenshot": {
+    "message": "రద్దుచేయి"
+  },
+  "downloadScreenshot": {
+    "message": "దింపుకోండి"
+  },
+  "downloadOnlyNotice": {
+    "message": "మీరు ప్రస్తుతం దింపుకోలు-మాత్రమే రీతిలో ఉన్నారు."
+  },
+  "downloadOnlyDetailsPrivate": {
+    "message": "అంతరంగిక విహారణ కిటికీలో."
+  },
+  "downloadOnlyDetailsThirdParty": {
+    "message": "మూడవ-పక్ష కుకీలు అచేతనమయ్యాయి."
+  },
+  "downloadOnlyDetailsNeverRemember": {
+    "message": "“చరిత్రని ఎప్పటికి గుర్తుపెట్టుకోకు” చేతనమైవుంది."
+  },
+  "downloadOnlyDetailsESR": {
+    "message": "మీరు Firefox ESR ఉపయోగిస్తున్నారు."
+  },
+  "downloadOnlyDetailsNoUploadPref": {
+    "message": "ఎక్కింపులు అచేతమై ఉన్నాయి."
+  },
+  "notificationLinkCopiedTitle": {
+    "message": "లంకె కాపీ అయింది"
+  },
+  "notificationLinkCopiedDetails": {
+    "message": "మీ తెరపట్టుకి లంకె క్లిప్‌బోర్డుకి కాపీ అయింది. అతికించడానికి $META_KEY$-V నొక్కండి.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "copyScreenshot": {
+    "message": "కాపీచెయ్యి"
+  },
+  "notificationImageCopiedTitle": {
+    "message": "పట్టు కాపీఅయ్యింది"
+  },
+  "notificationImageCopiedDetails": {
+    "message": "మీ షాట్ క్లిప్‌బోర్డుకి కాపీ చేయబడింది. అతికించడానికి $META_KEY$-V ని నొక్కండి.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "imageCropPopupWarning": {
+    "message": "భద్రపరచిన బొమ్మ $PIXELS$px ఎత్తుకి కత్తిరించబడుతుంది.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
+  "requestErrorTitle": {
+    "message": "పని చేయడంలేదు."
+  },
+  "requestErrorDetails": {
+    "message": "క్షమిచండి! మీ తెరను భద్రపరచలేకపోయాం. దయచేసి కాసేపాగి మళ్ళీ ప్రయత్నించండి."
+  },
+  "connectionErrorTitle": {
+    "message": "మీ తెరపట్లకు అనుసంధానించలేకున్నాం."
+  },
+  "connectionErrorDetails": {
+    "message": "దయచేసి మీ అంతర్జాల అనుసంధానాన్ని సరిచూసుకోండి. మీరు జాలానికి అనుసంధానం కాగలుగుతూంటే, Firefox Screenshots సేవలోనే తాత్కాలిక సమస్య ఉండవచ్చు."
+  },
+  "loginErrorDetails": {
+    "message": "Firefox Screenshots సేవలో ఏదో సమస్య ఉన్నందున మేము మీ తెరపట్టును భద్రపరచలేక పోయాము. దయచేసి కాసేపాగి ప్రయత్నించండి."
+  },
+  "unshootablePageErrorTitle": {
+    "message": "మేము ఈ పేజీని స్క్రీన్షాట్ చేయలేము."
+  },
+  "unshootablePageErrorDetails": {
+    "message": "ఇది ప్రామాణిక వెబ్ పేజీ కాదు, కాబట్టి దాని తెరపట్టు మీరు తీసుకోలేరు."
+  },
+  "selfScreenshotErrorTitle": {
+    "message": "మీరు Firefox స్క్రీన్షాట్స్ పేజీ యొక్క షాట్ ను తీసుకోలేరు!"
+  },
+  "emptySelectionErrorTitle": {
+    "message": "మీ ఎంపిక చాలా చిన్నదిగా ఉంది"
+  },
+  "privateWindowErrorTitle": {
+    "message": "అంతరంగిత విహరణ రీతిలో తెరపట్లు అచేతనమవుతాయి"
+  },
+  "privateWindowErrorDetails": {
+    "message": "అసౌకర్యానికి చింతిస్తున్నాము. మేము భవిష్యత్ విడుదలలో ఈ సౌలభ్యంపై పని చేస్తాము."
+  },
+  "genericErrorTitle": {
+    "message": "అయ్యో! Firefox Screenshots గల్లంతయ్యింది."
+  },
+  "genericErrorDetails": {
+    "message": "ఏమి జరిగిందో మాకు ఖచ్చితంగా తెలియలేదు. మళ్లీ ప్రయత్నించాలనుకుంటున్నారా లేదా మరొక పేజీ తెరపట్టు తీసుకోవాలనుకుంటున్నారా?"
+  },
+  "tourBodyIntro": {
+    "message": "Firefoxను వదలకుండానే తెరపట్లు తీసుకోండి, భద్రపరచుకోండి, పంచుకోండి."
+  },
+  "tourHeaderPageAction": {
+    "message": "భద్రపరచుకోడానికి కొత్త మార్గం"
+  },
+  "tourBodyPageAction": {
+    "message": "తెరపట్లను తీసుకోవాలనుకున్నప్పుడు చిరునామా పట్టీలో వున్న పేజీ చర్యల మెనూని విస్తరించండి."
+  },
+  "tourHeaderClickAndDrag": {
+    "message": "మీకు ఏం కావాలో దాన్ని మాత్రమే బంధించండి"
+  },
+  "tourBodyClickAndDrag": {
+    "message": "పేజీలోని కొంత భాగాన్నే తీసుకోడానికి నొక్కి లాగండి. పేజీలోని భాగాలను ఎంపిక చేసుకోడానికి వాటిపైకి వెళ్ళండి."
+  },
+  "tourHeaderDownloadUpload": {
+    "message": "మీకు నచ్చినట్టుగా"
+  },
+  "tourBodyDownloadUpload": {
+    "message": "తెలిగ్గా పంచుకోడానికి మీ కత్తిరింపులను జాలంలో భద్రపరచుకోండి, లేదా మీ కంప్యూటర్లోనికి దించుకోండి. మీరు తీసుకున్న తెరపట్లన్నిటినీ చూడటానికి నా షాట్లు అనే బొత్తాన్ని కూడా నొక్కవచ్చు."
+  },
+  "tourSkip": {
+    "message": "దాటవేయి"
+  },
+  "tourNext": {
+    "message": "తర్వాతి ఫలకం"
+  },
+  "tourPrevious": {
+    "message": "మునుపటి ఫలకం"
+  },
+  "tourDone": {
+    "message": "పూర్తయింది"
+  },
+  "termsAndPrivacyNotice2": {
+    "message": "Firefox Screenshots వాడుకోవడం ద్వారా, మా $TERMSANDPRIVACYNOTICETERMSLINK$, $TERMSANDPRIVACYNOTICEPRIVACYLINK$ లకు మీరు అంగీకరిస్తున్నారు.",
+    "placeholders": {
+      "termsandprivacynoticetermslink": {
+        "content": "$1"
+      },
+      "termsandprivacynoticeprivacylink": {
+        "content": "$2"
+      }
+    }
+  },
+  "termsAndPrivacyNoticeTermsLink": {
+    "message": "నియమాలు"
+  },
+  "termsAndPrivacyNoticyPrivacyLink": {
+    "message": "గోప్యతా నోటీసు"
+  },
+  "libraryLabel": {
+    "message": "తెరపట్లు"
+  }
+}
\ No newline at end of file
rename from browser/extensions/screenshots/webextension/_locales/th/messages.json
rename to browser/extensions/screenshots/_locales/th/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/th/messages.json
+++ b/browser/extensions/screenshots/_locales/th/messages.json
@@ -4,17 +4,17 @@
   },
   "addonAuthorsList": {
     "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
     "message": "จับภาพหน้าจอ"
   },
   "myShotsLink": {
-    "message": "ภาพของฉัน"
+    "message": "ภาพหน้าจอของฉัน"
   },
   "screenshotInstructions": {
     "message": "ลากหรือคลิกที่หน้าเพื่อเลือกบริเวณ กด ESC เพื่อยกเลิก"
   },
   "saveScreenshotSelectedArea": {
     "message": "บันทึก"
   },
   "saveScreenshotVisibleArea": {
@@ -40,75 +40,67 @@
   },
   "downloadOnlyDetailsESR": {
     "message": "คุณกำลังใช้ Firefox ESR"
   },
   "notificationLinkCopiedTitle": {
     "message": "คัดลอกลิงก์แล้ว"
   },
   "notificationLinkCopiedDetails": {
-    "message": "คัดลอกลิงก์ไปยังภาพของคุณไปยังคลิปบอร์ดแล้ว กด $META_KEY$-V เพื่อวาง",
+    "message": "คัดลอกลิงก์ไปยังภาพหน้าจอของคุณไปยังคลิปบอร์ดแล้ว กด $META_KEY$-V เพื่อวาง",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "copyScreenshot": {
     "message": "คัดลอก"
   },
   "notificationImageCopiedTitle": {
-    "message": "คัดลอกภาพแล้ว"
-  },
-  "imageCroppedWarning": {
-    "message": "ภาพนี้ถูกตัดเป็น $PIXELS$ พิกเซล",
-    "placeholders": {
-      "pixels": {
-        "content": "$1"
-      }
-    }
+    "message": "คัดลอกภาพหน้าจอแล้ว"
   },
   "requestErrorTitle": {
     "message": "ใช้งานไม่ได้"
   },
   "requestErrorDetails": {
-    "message": "ขออภัย! เราไม่สามารถบันทึกภาพของคุณ โปรดลองอีกครั้งในภายหลัง"
+    "message": "ขออภัย! เราไม่สามารถบันทึกภาพหน้าจอของคุณ โปรดลองอีกครั้งในภายหลัง"
   },
   "connectionErrorTitle": {
     "message": "เราไม่สามารถเชื่อมต่อกับภาพหน้าจอของคุณ"
   },
   "connectionErrorDetails": {
     "message": "โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณ หากคุณสามารถเชื่อมต่ออินเทอร์เน็ต บริการ Firefox Screenshots อาจมีปัญหาชั่วคราว"
   },
   "loginErrorDetails": {
-    "message": "เราไม่สามารถบันทึกภาพของคุณเนื่องจากบริการ Firefox Screenshots มีปัญหา โปรดลองอีกครั้งในภายหลัง"
+    "message": "เราไม่สามารถบันทึกภาพหน้าจอของคุณเนื่องจากบริการ Firefox Screenshots มีปัญหา โปรดลองอีกครั้งในภายหลัง"
   },
   "unshootablePageErrorTitle": {
     "message": "เราไม่สามารถจับภาพหน้าจอหน้านี้"
   },
   "unshootablePageErrorDetails": {
     "message": "นี่ไม่ใช่หน้าเว็บมาตรฐาน คุณจึงไม่สามารถจับภาพหน้าจอได้"
   },
   "selfScreenshotErrorTitle": {
-    "message": "คุณไม่สามารถจับภาพของหน้า Firefox Screenshots!"
+    "message": "คุณไม่สามารถจับภาพหน้าจอของหน้า Firefox Screenshots!"
   },
   "emptySelectionErrorTitle": {
     "message": "การเลือกของคุณเล็กเกินไป"
   },
   "privateWindowErrorTitle": {
     "message": "Screenshots ถูกปิดใช้งานในโหมดการท่องเว็บแบบส่วนตัว"
   },
   "privateWindowErrorDetails": {
     "message": "ขออภัยในความไม่สะดวก เรากำลังพัฒนาคุณลักษณะนี้สำหรับรุ่นในอนาคต"
   },
   "genericErrorTitle": {
     "message": "โอ๊ย! Firefox Screenshots รวน"
   },
   "genericErrorDetails": {
-    "message": "เราไม่แน่ใจว่าเกิดอะไรขึ้น ต้องการลองอีกครั้งหรือจับภาพของหน้าอื่น?"
+    "message": "เราไม่แน่ใจว่าเกิดอะไรขึ้น ต้องการลองอีกครั้งหรือจับภาพหน้าจอของหน้าอื่น?"
   },
   "tourBodyIntro": {
     "message": "จับ บันทึก และแบ่งปันภาพหน้าจอโดยไม่ต้องออกจาก Firefox"
   },
   "tourHeaderPageAction": {
     "message": "หนทางใหม่ในการบันทึก"
   },
   "tourHeaderClickAndDrag": {
@@ -122,17 +114,17 @@
   },
   "tourBodyFullPage": {
     "message": "คลิกที่ปุ่มด้านบนขวาเพื่อจับภาพพื้นที่ที่มองเห็นในหน้าต่างหรือเพื่อจับภาพทั้งหน้า"
   },
   "tourHeaderDownloadUpload": {
     "message": "ตามใจชอบ"
   },
   "tourBodyDownloadUpload": {
-    "message": "บันทึกภาพที่ครอบตัดของคุณไปยังเว็บเพื่อการแบ่งปันที่ง่ายขึ้น หรือดาวน์โหลดไปยังคอมพิวเตอร์ของคุณ คุณยังสามารถคลิกที่ปุ่ม ภาพของฉัน เพื่อค้นหาภาพทั้งหมดที่คุณจับไว้"
+    "message": "บันทึกภาพหน้าจอที่ครอบตัดของคุณไปยังเว็บเพื่อการแบ่งปันที่ง่ายขึ้น หรือดาวน์โหลดไปยังคอมพิวเตอร์ของคุณ คุณยังสามารถคลิกที่ปุ่ม ภาพหน้าจอของฉัน เพื่อค้นหาภาพหน้าจอทั้งหมดที่คุณได้จับไว้"
   },
   "tourSkip": {
     "message": "ข้าม"
   },
   "tourNext": {
     "message": "ภาพนิ่งถัดไป"
   },
   "tourPrevious": {
rename from browser/extensions/screenshots/webextension/_locales/tl/messages.json
rename to browser/extensions/screenshots/_locales/tl/messages.json
rename from browser/extensions/screenshots/webextension/_locales/tr/messages.json
rename to browser/extensions/screenshots/_locales/tr/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/tr/messages.json
+++ b/browser/extensions/screenshots/_locales/tr/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Ekran görüntünüz panoya kopyalandı. Yapıştırmak için $META_KEY$-V tuşlarına basabilirsiniz.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Resim $PIXELS$ piksele kırpıldı.",
+  "imageCropPopupWarning": {
+    "message": "Kaydedilen resmin yüksekliği $PIXELS$ olarak kırpılacaktır.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Arıza var."
@@ -144,16 +144,22 @@
     "message": "Yalnızca pencerede gördüğünüz alanı veya sayfanın tamamını yakalamak için sağ üstteki düğmelerden uygun olanı seçin."
   },
   "tourHeaderDownloadUpload": {
     "message": "İstediğin gibi yakala"
   },
   "tourBodyDownloadUpload": {
     "message": "Ekran görüntülerinizi daha kolay paylaşmak web’e kaydedebilir veya bilgisayarınıza indirebilirsiniz. Kaydettiğiniz tüm görüntüleri bulmak için “Ekran görüntülerim” düğmesine tıklayabilirsiniz."
   },
+  "tourHeaderAccounts": {
+    "message": "Screenshots her yerde"
+  },
+  "tourBodyAccounts": {
+    "message": "Ekran görüntülerinize tüm cihazlarınızdan erişmek ve favori görüntülerinizi sonsuza dek saklamak için Firefox Hesabınıza giriş yapın."
+  },
   "tourSkip": {
     "message": "GEÇ"
   },
   "tourNext": {
     "message": "Sonraki slayt"
   },
   "tourPrevious": {
     "message": "Önceki slayt"
rename from browser/extensions/screenshots/webextension/_locales/uk/messages.json
rename to browser/extensions/screenshots/_locales/uk/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/uk/messages.json
+++ b/browser/extensions/screenshots/_locales/uk/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "Ваш знімок був скопійований в буфер обміну. Натисніть $META_KEY$-V, щоб вставити.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Зображення було обрізано до $PIXELS$ пікселів.",
+  "imageCropPopupWarning": {
+    "message": "Збережене зображення буде обрізано до $PIXELS$ пікселів по висоті.",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "Сталася помилка."
@@ -144,16 +144,22 @@
     "message": "За допомогою кнопок у верхній правій частині обирайте захоплення видимої області вікна, або сторінки повністю."
   },
   "tourHeaderDownloadUpload": {
     "message": "Як вам подобається"
   },
   "tourBodyDownloadUpload": {
     "message": "Зберігайте свої знімки в Інтернеті, щоб легко ними ділитися, або завантажуйте їх на свій комп'ютер. Ви також можете переглянути всі збережені знімки, натиснувши на кнопку Мої знімки."
   },
+  "tourHeaderAccounts": {
+    "message": "Знімки екрану на ходу"
+  },
+  "tourBodyAccounts": {
+    "message": "Увійдіть в обліковий запис Firefox, щоб отримати доступ до своїх знімків на всіх пристроях і зберігати обрані знімки без обмежень."
+  },
   "tourSkip": {
     "message": "Пропустити"
   },
   "tourNext": {
     "message": "Наступний слайд"
   },
   "tourPrevious": {
     "message": "Попередній слайд"
rename from browser/extensions/screenshots/webextension/_locales/ur/messages.json
rename to browser/extensions/screenshots/_locales/ur/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/ur/messages.json
+++ b/browser/extensions/screenshots/_locales/ur/messages.json
@@ -24,33 +24,42 @@
     "message": "پورا صفحہ محفوظ کریں"
   },
   "cancelScreenshot": {
     "message": "منسوخ کریں"
   },
   "downloadScreenshot": {
     "message": "ڈاؤن لوڈ"
   },
+  "downloadOnlyDetailsPrivate": {
+    "message": "اایک نجی برائوزنگ دریچہ میں۔"
+  },
   "downloadOnlyDetailsESR": {
     "message": "آپ Firefox ESR استعمال کر رہے ہیں۔"
   },
+  "downloadOnlyDetailsNoUploadPref": {
+    "message": "اپلوڈ کو نا اہل بنا دیا گیا ہے۔"
+  },
   "notificationLinkCopiedTitle": {
     "message": "تبط نقل کر دیا گیا"
   },
   "notificationLinkCopiedDetails": {
     "message": "آُپ کی شاٹس کا ربط و تختہ تراشہ پر نقل کر دیا گیا ہے۔ چسپاں کرنے کے لیئے $META_KEY$-V دبائِں۔",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "copyScreenshot": {
     "message": "نقل کریں"
   },
+  "notificationImageCopiedTitle": {
+    "message": "نقل شدہ شاٹ"
+  },
   "requestErrorTitle": {
     "message": "خراب ہے۔"
   },
   "requestErrorDetails": {
     "message": "معاف کیجیئے گا! ہم آپ کی شاٹ محفوظ نہیں کر سکے۔ براہ مہربانی کچھ دیر بعد کوشش کریں۔"
   },
   "connectionErrorTitle": {
     "message": "ہم آپ کی اسکرین شاٹس سے نہیں جڑ سکتے۔"
@@ -68,16 +77,19 @@
     "message": "یہ ایک میعاری صفحہ نہہیں، تو آپ اسکی اسکرین شاٹ نہیں لے سکتے۔"
   },
   "selfScreenshotErrorTitle": {
     "message": "آپ Firefox اسکرین شاٹس صفحے! کی ایک شاٹ نہیں لے سکت"
   },
   "emptySelectionErrorTitle": {
     "message": "آپ کا انتخاب بہت چھوٹا ہے"
   },
+  "privateWindowErrorTitle": {
+    "message": "اسکرین شاٹ نجی برائوزنگ موڈ مییں نااہل بنایا گیا ہے"
+  },
   "genericErrorTitle": {
     "message": "لاجواب! Firefox Screenshots بہت مشہور ہو گیا۔"
   },
   "genericErrorDetails": {
     "message": "ہمیں یقین نہیں کہ کیا ہوا تھا۔ خیال رکھ کر پھر کوشش کریں یا بھر مختلف صفحہ کی تصویرلیں؟"
   },
   "tourBodyIntro": {
     "message": "۔Firefox کو چھوڑے بغیر اسکرینشاٹس لیں، محفوظ کریں اور شیئر کریں۔"
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/_locales/uz/messages.json
@@ -0,0 +1,184 @@
+{
+  "addonDescription": {
+    "message": "Internetdan lavha va skrinshotlar oling hamda ularni vaqtincha yoki butunlay saqlab oling."
+  },
+  "addonAuthorsList": {
+    "message": "Mozilla <screenshots-feedback@mozilla.com>"
+  },
+  "contextMenuLabel": {
+    "message": "Skrinshot olish"
+  },
+  "myShotsLink": {
+    "message": "Men olgan skrinshotlar"
+  },
+  "screenshotInstructions": {
+    "message": "Hududni belgilash uchun kerakli hududni tanlang va bosing. Chiqish uchun “ESC” tugmasidan foydalaning."
+  },
+  "saveScreenshotSelectedArea": {
+    "message": "Saqlash"
+  },
+  "saveScreenshotVisibleArea": {
+    "message": "Ko‘rinadiganini saqlash"
+  },
+  "saveScreenshotFullPage": {
+    "message": "To‘liq sahifani saqlash"
+  },
+  "cancelScreenshot": {
+    "message": "Bekor qilish"
+  },
+  "downloadScreenshot": {
+    "message": "Yuklab olish"
+  },
+  "downloadOnlyNotice": {
+    "message": "Siz hozirda \"Faqat yuklab olish\" rejimidasiz."
+  },
+  "downloadOnlyDetails": {
+    "message": "Firefox Screenshots bunday holatda \"Faqat yuklab olish\" rejimiga avtomatik tarzda o‘tadi:"
+  },
+  "downloadOnlyDetailsPrivate": {
+    "message": "Maxfiy ko‘rish oynasida."
+  },
+  "downloadOnlyDetailsThirdParty": {
+    "message": "Uchinchi tomon kukilari o‘chirib qo‘yilgan."
+  },
+  "downloadOnlyDetailsNeverRemember": {
+    "message": "\"Tarix saqlanmasin\" funksiyasi yoqilgan."
+  },
+  "downloadOnlyDetailsESR": {
+    "message": "Siz Firefox ESRdan foydalanyapsiz."
+  },
+  "downloadOnlyDetailsNoUploadPref": {
+    "message": "Yuklab qo‘yish o‘chirib qo‘yilgan."
+  },
+  "notificationLinkCopiedTitle": {
+    "message": "Havoladan nusxa olindi"
+  },
+  "notificationLinkCopiedDetails": {
+    "message": "Skrinshot havolasidan vaqtinchalik xotiraga nusxa olindi. Qo‘yish uchun $META_KEY$-V tugmalarini bosing.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "copyScreenshot": {
+    "message": "Nusxa olish"
+  },
+  "notificationImageCopiedTitle": {
+    "message": "Skrinshotdan nusxa olindi"
+  },
+  "notificationImageCopiedDetails": {
+    "message": "Skrinshotdan vaqtinchalik xotiraga nusxa olindi. Biror joyga qo‘yish uchun $META_KEY$-V tugmalaridan foydalaning.",
+    "placeholders": {
+      "meta_key": {
+        "content": "$1"
+      }
+    }
+  },
+  "imageCropPopupWarning": {
+    "message": "Saqlangan rasm $PIXELS$px uzunlikda kesiladi.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
+  "requestErrorTitle": {
+    "message": "Xizmat hozircha ishlamayapti."
+  },
+  "requestErrorDetails": {
+    "message": "Uzr! Rasmni saqlay olmaymiz. Keyinroq urinib ko‘ring."
+  },
+  "connectionErrorTitle": {
+    "message": "Skrinshotlaringiz sahifasiga ulana olmadik."
+  },
+  "connectionErrorDetails": {
+    "message": "Internetga ulanishni tekshiring. Ulana olsangiz, demak Firefox Screenshot xizmatida vaqtinchalik muammo bo‘lishi mumkin."
+  },
+  "loginErrorDetails": {
+    "message": "Olingan rasmni saqlay olmaymiz, chunki Firefox Screenshot xizmatida muammo mavjud. Keyinroq urinib ko‘ring."
+  },
+  "unshootablePageErrorTitle": {
+    "message": "Bu sahifani rasmga tushira olmaymiz."
+  },
+  "unshootablePageErrorDetails": {
+    "message": "Bu sahifa standart sahifa emas, shuning uchun uni rasmga tushira olmaymiz."
+  },
+  "selfScreenshotErrorTitle": {
+    "message": "Firefox Screenshot sahifasini rasmga tushirish mumkin emas!"
+  },
+  "emptySelectionErrorTitle": {
+    "message": "Tanlangan hudud juda kichik"
+  },
+  "privateWindowErrorTitle": {
+    "message": "Maxfiy ko‘rish rejimida rasmga olib bo‘lmaydi"
+  },
+  "privateWindowErrorDetails": {
+    "message": "Noqulaylik uchun uzr. Biz keyingi versiyalar uchun bu funksiya ustida ishlayapmiz."
+  },
+  "genericErrorTitle": {
+    "message": "Obbo! Firefox Screenshots ishdan chiqdi."
+  },
+  "genericErrorDetails": {
+    "message": "Nima yuz berganiga tushunmadik. Yana urinib ko‘ring yoki boshqa sahifada skrinshot olib ko‘ring."
+  },
+  "tourBodyIntro": {
+    "message": "Firefox brauzeridan chiqmasdan sahifalarni rasmga olish, saqlash va bo‘lishish mumkin."
+  },
+  "tourHeaderPageAction": {
+    "message": "Saqlashning yangi usuli"
+  },
+  "tourBodyPageAction": {
+    "message": "Skrinshot olish uchun xohlagan vaqtingizda manzil panelidagi sahifa amallari menyusidan foydalaning."
+  },
+  "tourHeaderClickAndDrag": {
+    "message": "Xohlaganingizni rasmga oling"
+  },
+  "tourBodyClickAndDrag": {
+    "message": "Sahifadan tanlash uchun sichqonchani bosing va kerakli qismni tanlang. Tanlovni ajratish uchun sichqoncha ko‘rsatkichini olib borsangiz ham bo‘ladi."
+  },
+  "tourHeaderFullPage": {
+    "message": "Oynani yoki butun sahifani rasmga olish"
+  },
+  "tourBodyFullPage": {
+    "message": "Butun sahifani yoki oynadagi ko‘rinib turgan hududni rasmga olish uchun yuqori o‘ng burchakdagi tugmalardan foydalaning."
+  },
+  "tourHeaderDownloadUpload": {
+    "message": "Sizga yoqdimi"
+  },
+  "tourBodyDownloadUpload": {
+    "message": "Oson ulashish yoki kompyuterga yuklab olish uchun kesilgan skrinshotlarni internetga saqlang. O‘zingiz olgan skrinshotlarning barchasini topish uchun \"Skrinshotlar\" tugmasiga bosing."
+  },
+  "tourSkip": {
+    "message": "TASHLAB KETISH"
+  },
+  "tourNext": {
+    "message": "Keyingi slayd"
+  },
+  "tourPrevious": {
+    "message": "Avvalgi slayd"
+  },
+  "tourDone": {
+    "message": "Tayyor"
+  },
+  "termsAndPrivacyNotice2": {
+    "message": "Firefox Skrinshot xizmatidan foydalanish orqali siz $TERMSANDPRIVACYNOTICETERMSLINK$ va $TERMSANDPRIVACYNOTICEPRIVACYLINK$ga rozilik bildirgan hisoblanasiz.",
+    "placeholders": {
+      "termsandprivacynoticetermslink": {
+        "content": "$1"
+      },
+      "termsandprivacynoticeprivacylink": {
+        "content": "$2"
+      }
+    }
+  },
+  "termsAndPrivacyNoticeTermsLink": {
+    "message": "Shartlar"
+  },
+  "termsAndPrivacyNoticyPrivacyLink": {
+    "message": "Maxfiylik eslatmasi"
+  },
+  "libraryLabel": {
+    "message": "Rasmlar"
+  }
+}
\ No newline at end of file
rename from browser/extensions/screenshots/webextension/_locales/vi/messages.json
rename to browser/extensions/screenshots/_locales/vi/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/vi/messages.json
+++ b/browser/extensions/screenshots/_locales/vi/messages.json
@@ -28,17 +28,17 @@
   },
   "downloadScreenshot": {
     "message": "Tải xuống"
   },
   "downloadOnlyNotice": {
     "message": "Bạn hiện đang ở chế độ chỉ tải về."
   },
   "downloadOnlyDetails": {
-    "message": "Ảnh chụp màn hình của Firefox sẽ tự động chuyển sang chế độ chỉ tải về trong các tình huống:"
+    "message": "Firefox Screenshots sẽ tự động chuyển sang chế độ chỉ tải về trong các tình huống:"
   },
   "downloadOnlyDetailsPrivate": {
     "message": "Trong một cửa sổ duyệt web riêng tư."
   },
   "downloadOnlyDetailsThirdParty": {
     "message": "Cookies của bên thứ ba đã bị vô hiệu hóa."
   },
   "downloadOnlyDetailsNeverRemember": {
@@ -70,24 +70,16 @@
   "notificationImageCopiedDetails": {
     "message": "Ảnh chụp màn hình của bạn đã được sao chép vào clipboard. Nhấn $META_KEY$-V để dán.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "Ảnh này đã được cắt đến $PIXELS$px.",
-    "placeholders": {
-      "pixels": {
-        "content": "$1"
-      }
-    }
-  },
   "requestErrorTitle": {
     "message": "Không sử dụng được."
   },
   "requestErrorDetails": {
     "message": "Xin lỗi! Chúng tôi không thể sao lưu ảnh chụp của bạn. Vui lòng thử lại sau."
   },
   "connectionErrorTitle": {
     "message": "Chúng tôi không thể kết nối với ảnh chụp màn hình của bạn."
@@ -100,29 +92,29 @@
   },
   "unshootablePageErrorTitle": {
     "message": "Chúng tôi không thể chụp màn hình trang này."
   },
   "unshootablePageErrorDetails": {
     "message": "Đây không phải là trang Web bình thường, bạn không thể chụp ảnh màn hình nó."
   },
   "selfScreenshotErrorTitle": {
-    "message": "Bạn không thể chụp một trang của Ảnh chụp màn hình Firefox !"
+    "message": "Bạn không thể chụp một trang của Firefox Screenshots!"
   },
   "emptySelectionErrorTitle": {
     "message": "Vùng chọn của bạn quá nhỏ"
   },
   "privateWindowErrorTitle": {
     "message": "Ảnh chụp màn hình đã bị vô hiệu hóa ở chế độ duyệt Web riêng tư"
   },
   "privateWindowErrorDetails": {
     "message": "Xin lỗi vì sự bất tiện này. Chúng tôi đang làm việc trên các tính năng này cho bản phát hành trong tương lai."
   },
   "genericErrorTitle": {
-    "message": "Whoa! Ảnh chụp màn hình của Firefox đã bị hoãn."
+    "message": "Whoa! Firefox Screenshots đã bị hoãn."
   },
   "genericErrorDetails": {
     "message": "Chúng tôi không chắc những gì vừa xảy ra. Thử lại hoặc chụp một trang khác?"
   },
   "tourBodyIntro": {
     "message": "Tạo, lưu và chia sẻ ảnh chụp màn hình mà không rời khỏi Firefox."
   },
   "tourHeaderPageAction": {
@@ -144,30 +136,33 @@
     "message": "Chọn các nút ở phía trên bên phải để chụp khu vực nhìn thấy được trong cửa sổ hoặc để chụp toàn bộ trang."
   },
   "tourHeaderDownloadUpload": {
     "message": "Như bạn thích"
   },
   "tourBodyDownloadUpload": {
     "message": "Lưu ảnh đã cắt của bạn lên web để chia sẻ dễ dàng hơn hoặc tải chúng xuống máy tính của bạn. Bạn cũng có thể nhấp vào nút Ảnh chụp của tôi để tìm tất cả ảnh bạn đã chụp."
   },
+  "tourBodyAccounts": {
+    "message": "Đăng nhập bằng tài khoản Firefox của bạn để truy cập các bức ảnh trên tất cả các thiết bị và lưu bức ảnh yêu thích của bạn mãi mãi."
+  },
   "tourSkip": {
     "message": "SKIP"
   },
   "tourNext": {
     "message": "Slide tiếp theo"
   },
   "tourPrevious": {
     "message": "Slide trước đó"
   },
   "tourDone": {
     "message": "Xong"
   },
   "termsAndPrivacyNotice2": {
-    "message": "Bằng cách sử dụng Ảnh chụp màn hình Firefox, bạn đồng ý với $TERMSANDPRIVACYNOTICETERMSLINK$ và $TERMSANDPRIVACYNOTICEPRIVACYLINK$ của chúng tôi.",
+    "message": "Bằng cách sử dụng Firefox Screenshots, bạn đồng ý với $TERMSANDPRIVACYNOTICETERMSLINK$ và $TERMSANDPRIVACYNOTICEPRIVACYLINK$ của chúng tôi.",
     "placeholders": {
       "termsandprivacynoticetermslink": {
         "content": "$1"
       },
       "termsandprivacynoticeprivacylink": {
         "content": "$2"
       }
     }
rename from browser/extensions/screenshots/webextension/_locales/zh_CN/messages.json
rename to browser/extensions/screenshots/_locales/zh_CN/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/zh_CN/messages.json
+++ b/browser/extensions/screenshots/_locales/zh_CN/messages.json
@@ -49,39 +49,39 @@
   },
   "downloadOnlyDetailsNoUploadPref": {
     "message": "上传已被禁用。"
   },
   "notificationLinkCopiedTitle": {
     "message": "链接已复制"
   },
   "notificationLinkCopiedDetails": {
-    "message": "您的截图的链接已复制到剪贴板。按 $META_KEY$-V 可粘贴。",
+    "message": "已将您的截图的链接复制到剪贴板。按 $META_KEY$-V 即可粘贴。",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
   "copyScreenshot": {
     "message": "复制"
   },
   "notificationImageCopiedTitle": {
     "message": "截图已复制"
   },
   "notificationImageCopiedDetails": {
-    "message": "您的截图已复制到剪贴板。按 $META_KEY$+-V 粘贴。",
+    "message": "已将您的截图复制到剪贴板。按 $META_KEY$-V 即可粘贴。",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "此图片已裁剪为 $PIXELS$px。",
+  "imageCropPopupWarning": {
+    "message": "保存的图片高度将被裁剪至 $PIXELS$ 像素。",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "出故障了。"
@@ -144,16 +144,22 @@
     "message": "选择右上角的按钮可以截取窗口中的可见区域或者整个页面。"
   },
   "tourHeaderDownloadUpload": {
     "message": "做您所想"
   },
   "tourBodyDownloadUpload": {
     "message": "将您裁剪后的截图保存到网上以便共享,或者下载到您的计算机。您也可以点击“我的截图”按钮找到您截取的所有截图。"
   },
+  "tourHeaderAccounts": {
+    "message": "Screenshots to Go"
+  },
+  "tourBodyAccounts": {
+    "message": "登录您的 Firefox 账户,即可访问您在所有设备上的截图,并永久保存您收藏的截图。"
+  },
   "tourSkip": {
     "message": "跳过"
   },
   "tourNext": {
     "message": "下一页"
   },
   "tourPrevious": {
     "message": "上一页"
@@ -168,17 +174,17 @@
         "content": "$1"
       },
       "termsandprivacynoticeprivacylink": {
         "content": "$2"
       }
     }
   },
   "termsAndPrivacyNoticeTermsLink": {
-    "message": "条款"
+    "message": "使用条款"
   },
   "termsAndPrivacyNoticyPrivacyLink": {
     "message": "隐私声明"
   },
   "libraryLabel": {
     "message": "屏幕截图"
   }
 }
\ No newline at end of file
rename from browser/extensions/screenshots/webextension/_locales/zh_TW/messages.json
rename to browser/extensions/screenshots/_locales/zh_TW/messages.json
--- a/browser/extensions/screenshots/webextension/_locales/zh_TW/messages.json
+++ b/browser/extensions/screenshots/_locales/zh_TW/messages.json
@@ -70,18 +70,18 @@
   "notificationImageCopiedDetails": {
     "message": "已將擷圖複製到剪貼簿,按下 $META_KEY$-V 即可貼上。",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
-  "imageCroppedWarning": {
-    "message": "已將圖片裁切為 $PIXELS$px 大小。",
+  "imageCropPopupWarning": {
+    "message": "儲存的圖片高度將被裁切至 $PIXELS$px。",
     "placeholders": {
       "pixels": {
         "content": "$1"
       }
     }
   },
   "requestErrorTitle": {
     "message": "系統維護中。"
@@ -144,16 +144,22 @@
     "message": "透過右上角的不同按鈕來選擇只拍攝視窗中的可見區域,或是整張網頁。"
   },
   "tourHeaderDownloadUpload": {
     "message": "用您想要的方式分享"
   },
   "tourBodyDownloadUpload": {
     "message": "裁切過的擷圖,可直接傳到網路上方便分享,也能下載到電腦裡;也可以點擊「我的擷圖」按鈕,尋找拍過的所有擷圖。"
   },
+  "tourHeaderAccounts": {
+    "message": "Screenshots to Go"
+  },
+  "tourBodyAccounts": {
+    "message": "使用您的 Firefox 帳號登入,即可存取您在所有裝置上拍攝的擷取圖,並永久保留您最愛的擷取圖。"
+  },
   "tourSkip": {
     "message": "略過"
   },
   "tourNext": {
     "message": "下一頁"
   },
   "tourPrevious": {
     "message": "上一頁"
rename from browser/extensions/screenshots/webextension/assertIsBlankDocument.js
rename to browser/extensions/screenshots/assertIsBlankDocument.js
rename from browser/extensions/screenshots/webextension/assertIsTrusted.js
rename to browser/extensions/screenshots/assertIsTrusted.js
rename from browser/extensions/screenshots/webextension/background/analytics.js
rename to browser/extensions/screenshots/background/analytics.js
--- a/browser/extensions/screenshots/webextension/background/analytics.js
+++ b/browser/extensions/screenshots/background/analytics.js
@@ -1,9 +1,9 @@
-/* globals main, auth, catcher, deviceInfo, communication, log */
+/* globals main, auth, browser, catcher, deviceInfo, communication, log */
 
 "use strict";
 
 this.analytics = (function() {
   const exports = {};
 
   let telemetryPrefKnown = false;
   let telemetryEnabled;
@@ -11,17 +11,17 @@ this.analytics = (function() {
   const EVENT_BATCH_DURATION = 1000; // ms for setTimeout
   let pendingEvents = [];
   let pendingTimings = [];
   let eventsTimeoutHandle, timingsTimeoutHandle;
   const fetchOptions = {
     method: "POST",
     mode: "cors",
     headers: { "content-type": "application/json" },
-    credentials: "include"
+    credentials: "include",
   };
 
   function flushEvents() {
     if (pendingEvents.length === 0) {
       return;
     }
 
     const eventsUrl = `${main.getBackend()}/event`;
@@ -58,17 +58,17 @@ this.analytics = (function() {
   function sendTiming(timingLabel, timingVar, timingValue) {
     // sendTiming is only called in response to sendEvent, so no need to check
     // the telemetry pref again here.
     const timingCategory = "addon";
     pendingTimings.push({
       timingCategory,
       timingLabel,
       timingVar,
-      timingValue
+      timingValue,
     });
     if (!timingsTimeoutHandle) {
       timingsTimeoutHandle = setTimeout(() => {
         timingsTimeoutHandle = null;
         flushTimings();
       }, EVENT_BATCH_DURATION);
     }
   }
@@ -110,37 +110,45 @@ this.analytics = (function() {
     for (const [gaField, value] of Object.entries(abTests)) {
       options[gaField] = value;
     }
     pendingEvents.push({
       eventTime: Date.now(),
       event: eventCategory,
       action,
       label,
-      options
+      options,
     });
     if (!eventsTimeoutHandle) {
       eventsTimeoutHandle = setTimeout(() => {
         eventsTimeoutHandle = null;
         flushEvents();
       }, EVENT_BATCH_DURATION);
     }
     // This function used to return a Promise that was not used at any of the
     // call sites; doing this simply maintains that interface.
     return Promise.resolve();
   };
 
+  exports.incrementCount = function(scalar) {
+    const allowedScalars = ["download", "upload", "copy"];
+    if (!allowedScalars.includes(scalar)) {
+      const err = `incrementCount passed an unrecognized scalar ${scalar}`;
+      log.warn(err);
+      return Promise.resolve();
+    }
+    return browser.telemetry.scalarAdd(`screenshots.${scalar}`, 1).catch(err => {
+      log.warn(`incrementCount failed with error: ${err}`);
+    });
+  };
+
   exports.refreshTelemetryPref = function() {
-    return communication.sendToBootstrap("isTelemetryEnabled").then((result) => {
+    return browser.telemetry.canUpload().then((result) => {
       telemetryPrefKnown = true;
-      if (result === communication.NO_BOOTSTRAP) {
-        telemetryEnabled = true;
-      } else {
-        telemetryEnabled = result;
-      }
+      telemetryEnabled = result;
     }, (error) => {
       // If there's an error reading the pref, we should assume that we shouldn't send data
       telemetryPrefKnown = true;
       telemetryEnabled = false;
       throw error;
     });
   };
 
@@ -160,121 +168,121 @@ this.analytics = (function() {
   // is deleted.
   const rules = [{
     name: "page-action",
     start: { action: "start-shot", label: "toolbar-button" },
     end: { action: "internal", label: "unhide-preselection-frame" },
     cancel: [
       { action: "cancel-shot" },
       { action: "internal", label: "document-hidden" },
-      { action: "internal", label: "unhide-onboarding-frame" }
-    ]
+      { action: "internal", label: "unhide-onboarding-frame" },
+    ],
   }, {
     name: "context-menu",
     start: { action: "start-shot", label: "context-menu" },
     end: { action: "internal", label: "unhide-preselection-frame" },
     cancel: [
       { action: "cancel-shot" },
       { action: "internal", label: "document-hidden" },
-      { action: "internal", label: "unhide-onboarding-frame" }
-    ]
+      { action: "internal", label: "unhide-onboarding-frame" },
+    ],
   }, {
     name: "page-action-onboarding",
     start: { action: "start-shot", label: "toolbar-button" },
     end: { action: "internal", label: "unhide-onboarding-frame" },
     cancel: [
       { action: "cancel-shot" },
       { action: "internal", label: "document-hidden" },
-      { action: "internal", label: "unhide-preselection-frame" }
-    ]
+      { action: "internal", label: "unhide-preselection-frame" },
+    ],
   }, {
     name: "context-menu-onboarding",
     start: { action: "start-shot", label: "context-menu" },
     end: { action: "internal", label: "unhide-onboarding-frame" },
     cancel: [
       { action: "cancel-shot" },
       { action: "internal", label: "document-hidden" },
-      { action: "internal", label: "unhide-preselection-frame" }
-    ]
+      { action: "internal", label: "unhide-preselection-frame" },
+    ],
   }, {
     name: "capture-full-page",
     start: { action: "capture-full-page" },
     end: { action: "internal", label: "unhide-preview-frame" },
     cancel: [
       { action: "cancel-shot" },
-      { action: "internal", label: "document-hidden" }
-    ]
+      { action: "internal", label: "document-hidden" },
+    ],
   }, {
     name: "capture-visible",
     start: { action: "capture-visible" },
     end: { action: "internal", label: "unhide-preview-frame" },
     cancel: [
       { action: "cancel-shot" },
-      { action: "internal", label: "document-hidden" }
-    ]
+      { action: "internal", label: "document-hidden" },
+    ],
   }, {
     name: "make-selection",
     start: { action: "make-selection" },
     end: { action: "internal", label: "unhide-selection-frame" },
     cancel: [
       { action: "cancel-shot" },
-      { action: "internal", label: "document-hidden" }
-    ]
+      { action: "internal", label: "document-hidden" },
+    ],
   }, {
     name: "save-shot",
     start: { action: "save-shot" },
     end: { action: "internal", label: "open-shot-tab" },
-    cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }]
+    cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }],
   }, {
     name: "save-visible",
     start: { action: "save-visible" },
     end: { action: "internal", label: "open-shot-tab" },
-    cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }]
+    cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }],
   }, {
     name: "save-full-page",
     start: { action: "save-full-page" },
     end: { action: "internal", label: "open-shot-tab" },
-    cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }]
+    cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }],
   }, {
     name: "save-full-page-truncated",
     start: { action: "save-full-page-truncated" },
     end: { action: "internal", label: "open-shot-tab" },
-    cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }]
+    cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }],
   }, {
     name: "download-shot",
     start: { action: "download-shot" },
     end: { action: "internal", label: "deactivate" },
     cancel: [
       { action: "cancel-shot" },
-      { action: "internal", label: "document-hidden" }
-    ]
+      { action: "internal", label: "document-hidden" },
+    ],
   }, {
     name: "download-full-page",
     start: { action: "download-full-page" },
     end: { action: "internal", label: "deactivate" },
     cancel: [
       { action: "cancel-shot" },
-      { action: "internal", label: "document-hidden" }
-    ]
+      { action: "internal", label: "document-hidden" },
+    ],
   }, {
     name: "download-full-page-truncated",
     start: { action: "download-full-page-truncated" },
     end: { action: "internal", label: "deactivate" },
     cancel: [
       { action: "cancel-shot" },
-      { action: "internal", label: "document-hidden" }
-    ]
+      { action: "internal", label: "document-hidden" },
+    ],
   }, {
     name: "download-visible",
     start: { action: "download-visible" },
     end: { action: "internal", label: "deactivate" },
     cancel: [
       { action: "cancel-shot" },
-      { action: "internal", label: "document-hidden" }
-    ]
+      { action: "internal", label: "document-hidden" },
+    ],
   }];
 
   // Match a filter (action and optional label) against an action and label.
   function match(filter, action, label) {
     return filter.label ?
       filter.action === action && filter.label === label :
       filter.action === action;
   }
rename from browser/extensions/screenshots/webextension/background/auth.js
rename to browser/extensions/screenshots/background/auth.js
--- a/browser/extensions/screenshots/webextension/background/auth.js
+++ b/browser/extensions/screenshots/background/auth.js
@@ -6,39 +6,46 @@
 this.auth = (function() {
   const exports = {};
 
   let registrationInfo;
   let initialized = false;
   let authHeader = null;
   let sentryPublicDSN = null;
   let abTests = {};
+  let accountId = null;
 
-  const registrationInfoFetched = catcher.watchPromise(browser.storage.local.get(["registrationInfo", "abTests"]).then((result) => {
-    if (result.abTests) {
-      abTests = result.abTests;
-    }
-    if (result.registrationInfo) {
-      registrationInfo = result.registrationInfo;
-    } else {
+  const fetchStoredInfo = catcher.watchPromise(
+    browser.storage.local.get(["registrationInfo", "abTests"]).then((result) => {
+      if (result.abTests) {
+        abTests = result.abTests;
+      }
+      if (result.registrationInfo) {
+        registrationInfo = result.registrationInfo;
+      }
+  }));
+
+  function getRegistrationInfo() {
+    if (!registrationInfo) {
       registrationInfo = generateRegistrationInfo();
       log.info("Generating new device authentication ID", registrationInfo);
       browser.storage.local.set({registrationInfo});
     }
-  }));
+    return registrationInfo;
+  }
 
   exports.getDeviceId = function() {
     return registrationInfo && registrationInfo.deviceId;
   };
 
   function generateRegistrationInfo() {
     const info = {
       deviceId: `anon${makeUuid()}`,
       secret: makeUuid(),
-      registered: false
+      registered: false,
     };
     return info;
   }
 
   function register() {
     return new Promise((resolve, reject) => {
       const registerUrl = main.getBackend() + "/api/register";
       // TODO: replace xhr with Fetch #2261
@@ -64,95 +71,103 @@ this.auth = (function() {
         analytics.sendEvent("register-failed", "connection-error");
         const exc = new Error("Error contacting server");
         exc.popupMessage = "LOGIN_CONNECTION_ERROR";
         reject(exc);
       });
       req.send(JSON.stringify({
         deviceId: registrationInfo.deviceId,
         secret: registrationInfo.secret,
-        deviceInfo: JSON.stringify(deviceInfo())
+        deviceInfo: JSON.stringify(deviceInfo()),
       }));
     });
   }
 
   function login(options) {
     const { ownershipCheck, noRegister } = options || {};
     return new Promise((resolve, reject) => {
-      const loginUrl = main.getBackend() + "/api/login";
-      // TODO: replace xhr with Fetch #2261
-      const req = new XMLHttpRequest();
-      req.open("POST", loginUrl);
-      req.onload = catcher.watchFunction(() => {
-        if (req.status === 404) {
-          if (noRegister) {
-            resolve(false);
+      return fetchStoredInfo.then(() => {
+        const registrationInfo = getRegistrationInfo();
+        const loginUrl = main.getBackend() + "/api/login";
+        // TODO: replace xhr with Fetch #2261
+        const req = new XMLHttpRequest();
+        req.open("POST", loginUrl);
+        req.onload = catcher.watchFunction(() => {
+          if (req.status === 404) {
+            if (noRegister) {
+              resolve(false);
+            } else {
+              resolve(register());
+            }
+          } else if (req.status >= 300) {
+            log.warn("Error in response:", req.responseText);
+            const exc = new Error("Could not log in: " + req.status);
+            exc.popupMessage = "LOGIN_ERROR";
+            analytics.sendEvent("login-failed", `bad-response-${req.status}`);
+            reject(exc);
+          } else if (req.status === 0) {
+            const error = new Error("Could not log in, server unavailable");
+            error.popupMessage = "LOGIN_CONNECTION_ERROR";
+            analytics.sendEvent("login-failed", "connection-error");
+            reject(error);
           } else {
-            resolve(register());
+            initialized = true;
+            const jsonResponse = JSON.parse(req.responseText);
+            log.info("Screenshots logged in");
+            analytics.sendEvent("login");
+            saveAuthInfo(jsonResponse);
+            if (ownershipCheck) {
+              resolve({isOwner: jsonResponse.isOwner});
+            } else {
+              resolve(true);
+            }
           }
-        } else if (req.status >= 300) {
-          log.warn("Error in response:", req.responseText);
-          const exc = new Error("Could not log in: " + req.status);
-          exc.popupMessage = "LOGIN_ERROR";
-          analytics.sendEvent("login-failed", `bad-response-${req.status}`);
-          reject(exc);
-        } else if (req.status === 0) {
-          const error = new Error("Could not log in, server unavailable");
-          error.popupMessage = "LOGIN_CONNECTION_ERROR";
+        });
+        req.onerror = catcher.watchFunction(() => {
           analytics.sendEvent("login-failed", "connection-error");
-          reject(error);
-        } else {
-          initialized = true;
-          const jsonResponse = JSON.parse(req.responseText);
-          log.info("Screenshots logged in");
-          analytics.sendEvent("login");
-          saveAuthInfo(jsonResponse);
-          if (ownershipCheck) {
-            resolve({isOwner: jsonResponse.isOwner});
-          } else {
-            resolve(true);
-          }
-        }
+          const exc = new Error("Connection failed");
+          exc.url = loginUrl;
+          exc.popupMessage = "CONNECTION_ERROR";
+          reject(exc);
+        });
+        req.setRequestHeader("content-type", "application/json");
+        req.send(JSON.stringify({
+          deviceId: registrationInfo.deviceId,
+          secret: registrationInfo.secret,
+          deviceInfo: JSON.stringify(deviceInfo()),
+          ownershipCheck,
+        }));
       });
-      req.onerror = catcher.watchFunction(() => {
-        analytics.sendEvent("login-failed", "connection-error");
-        const exc = new Error("Connection failed");
-        exc.url = loginUrl;
-        exc.popupMessage = "CONNECTION_ERROR";
-        reject(exc);
-      });
-      req.setRequestHeader("content-type", "application/json");
-      req.send(JSON.stringify({
-        deviceId: registrationInfo.deviceId,
-        secret: registrationInfo.secret,
-        deviceInfo: JSON.stringify(deviceInfo()),
-        ownershipCheck
-      }));
     });
   }
 
   function saveAuthInfo(responseJson) {
+    accountId = responseJson.accountId;
     if (responseJson.sentryPublicDSN) {
       sentryPublicDSN = responseJson.sentryPublicDSN;
     }
     if (responseJson.authHeader) {
       authHeader = responseJson.authHeader;
       if (!registrationInfo.registered) {
         registrationInfo.registered = true;
         catcher.watchPromise(browser.storage.local.set({registrationInfo}));
       }
     }
     if (responseJson.abTests) {
       abTests = responseJson.abTests;
       catcher.watchPromise(browser.storage.local.set({abTests}));
     }
   }
 
-  exports.getDeviceId = function() {
-    return registrationInfo.deviceId;
+  exports.maybeLogin = function() {
+    if (!registrationInfo) {
+      return Promise.resolve();
+    }
+
+    return exports.authHeaders();
   };
 
   exports.authHeaders = function() {
     let initPromise = Promise.resolve();
     if (!initialized) {
       initPromise = login();
     }
     return initPromise.then(() => {
@@ -168,32 +183,38 @@ this.auth = (function() {
     return sentryPublicDSN || buildSettings.defaultSentryDsn;
   };
 
   exports.getAbTests = function() {
     return abTests;
   };
 
   exports.isRegistered = function() {
-    return registrationInfo.registered;
+    return registrationInfo && registrationInfo.registered;
   };
 
   communication.register("getAuthInfo", (sender, ownershipCheck) => {
-    return registrationInfoFetched.then(() => {
-      return exports.authHeaders();
-    }).then((authHeaders) => {
-      let info = registrationInfo;
-      if (info.registered) {
-        return login({ownershipCheck}).then((result) => {
-          return {
-            isOwner: result && result.isOwner,
-            deviceId: registrationInfo.deviceId,
-            authHeaders
-          };
-        });
+    return fetchStoredInfo.then(() => {
+      // If a device id was never generated, report back accordingly.
+      if (!registrationInfo) {
+        return null;
       }
-      info = Object.assign({authHeaders}, info);
-      return info;
-    });
+
+      return exports.authHeaders().then((authHeaders) => {
+        let info = registrationInfo;
+        if (info.registered) {
+          return login({ownershipCheck}).then((result) => {
+            return {
+              isOwner: result && result.isOwner,
+              deviceId: registrationInfo.deviceId,
+              accountId,
+              authHeaders,
+            };
+          });
+        }
+        info = Object.assign({authHeaders}, info);
+        return info;
+      });
   });
+});
 
   return exports;
 })();
rename from browser/extensions/screenshots/webextension/background/communication.js
rename to browser/extensions/screenshots/background/communication.js
--- a/browser/extensions/screenshots/webextension/background/communication.js
+++ b/browser/extensions/screenshots/background/communication.js
@@ -40,39 +40,10 @@ this.communication = (function() {
     }
     sendResponse({type: "success", value: result});
   });
 
   exports.register = function(name, func) {
     registeredFunctions[name] = func;
   };
 
-  /** Send a message to bootstrap.js
-      Technically any worker can listen to this.  If the bootstrap wrapper is not in place, then this
-      will *not* fail, and will return a value of exports.NO_BOOTSTRAP  */
-  exports.sendToBootstrap = function(funcName, ...args) {
-    return browser.runtime.sendMessage({funcName, args}).then((result) => {
-      if (result.type === "success") {
-        return result.value;
-      }
-      throw new Error(`Error in ${funcName}: ${result.name || "unknown"}`);
-    }, (error) => {
-      if (isBootstrapMissingError(error)) {
-        return exports.NO_BOOTSTRAP;
-      }
-      throw error;
-    });
-  };
-
-  function isBootstrapMissingError(error) {
-    if (!error) {
-      return false;
-    }
-    return ("errorCode" in error && error.errorCode === "NO_RECEIVING_END") ||
-      (!error.errorCode && error.message === "Could not establish connection. Receiving end does not exist.");
-  }
-
-
-  // A singleton/sentinel (with a name):
-  exports.NO_BOOTSTRAP = {name: "communication.NO_BOOTSTRAP"};
-
   return exports;
 })();
rename from browser/extensions/screenshots/webextension/background/deviceInfo.js
rename to browser/extensions/screenshots/background/deviceInfo.js
--- a/browser/extensions/screenshots/webextension/background/deviceInfo.js
+++ b/browser/extensions/screenshots/background/deviceInfo.js
@@ -22,13 +22,13 @@ this.deviceInfo = (function() {
       platform: platformInfo.os,
       architecture: platformInfo.arch,
       version: firefoxVersion || chromeVersion,
       // These don't seem to apply to Chrome:
       // build: system.build,
       // platformVersion: system.platformVersion,
       userAgent: navigator.userAgent,
       appVendor: appName,
-      appName
+      appName,
     };
   };
 
 })();
rename from browser/extensions/screenshots/webextension/background/main.js
rename to browser/extensions/screenshots/background/main.js
--- a/browser/extensions/screenshots/webextension/background/main.js
+++ b/browser/extensions/screenshots/background/main.js
@@ -1,17 +1,17 @@
 /* globals selectorLoader, analytics, communication, catcher, log, makeUuid, auth, senderror, startBackground, blobConverters buildSettings */
 
 "use strict";
 
 this.main = (function() {
   const exports = {};
 
   const pasteSymbol = (window.navigator.platform.match(/Mac/i)) ? "\u2318" : "Ctrl";
-  const { sendEvent } = analytics;
+  const { sendEvent, incrementCount } = analytics;
 
   const manifest = browser.runtime.getManifest();
   let backend;
 
   let hasSeenOnboarding = browser.storage.local.get(["hasSeenOnboarding"]).then((result) => {
     const onboarded = !!result.hasSeenOnboarding;
     hasSeenOnboarding = Promise.resolve(onboarded);
     return hasSeenOnboarding;
@@ -66,17 +66,17 @@ this.main = (function() {
 
   function startSelectionWithOnboarding(tab) {
     return analytics.refreshTelemetryPref().then(() => {
       return selectorLoader.testIfLoaded(tab.id);
     }).then((isLoaded) => {
       if (!isLoaded) {
         sendEvent("start-shot", "site-request", {incognito: tab.incognito});
         setIconActive(true, tab.id);
-        selectorLoader.toggle(tab.id, false);
+        selectorLoader.toggle(tab.id, Promise.resolve(false));
       }
     });
   }
 
   function shouldOpenMyShots(url) {
     return /^about:(?:newtab|blank|home)/i.test(url) || /^resource:\/\/activity-streams\//i.test(url);
   }
 
@@ -91,17 +91,17 @@ this.main = (function() {
             return forceOnboarding();
           }));
           return;
         }
         catcher.watchPromise(analytics.refreshTelemetryPref().then(() => {
           sendEvent("goto-myshots", "about-newtab", {incognito: tab.incognito});
         }));
         catcher.watchPromise(
-          auth.authHeaders()
+          auth.maybeLogin()
           .then(() => browser.tabs.update({url: backend + "/shots"})));
       } else {
         catcher.watchPromise(
           toggleSelector(tab)
             .then(active => {
               const event = active ? "start-shot" : "cancel-shot";
               sendEvent(event, "toolbar-button", {incognito: tab.incognito});
             }, (error) => {
@@ -127,17 +127,17 @@ this.main = (function() {
       }
       if (!urlEnabled(tab.url)) {
         if (!onboarded) {
           sendEvent("goto-onboarding", "selection-button", {incognito: tab.incognito});
           forceOnboarding();
           return;
         }
         senderror.showError({
-          popupMessage: "UNSHOOTABLE_PAGE"
+          popupMessage: "UNSHOOTABLE_PAGE",
         });
         return;
       }
       // No need to catch() here because of watchPromise().
       // eslint-disable-next-line promise/catch-or-return
       toggleSelector(tab)
         .then(() => sendEvent("start-shot", "context-menu", {incognito: tab.incognito}));
     }));
@@ -184,28 +184,28 @@ this.main = (function() {
   communication.register("sendEvent", (sender, ...args) => {
     catcher.watchPromise(sendEvent(...args));
     // We don't wait for it to complete:
     return null;
   });
 
   communication.register("openMyShots", (sender) => {
     return catcher.watchPromise(
-      auth.authHeaders()
+      auth.maybeLogin()
       .then(() => browser.tabs.create({url: backend + "/shots"})));
   });
 
   communication.register("openShot", (sender, {url, copied}) => {
     if (copied) {
       const id = makeUuid();
       return browser.notifications.create(id, {
         type: "basic",
         iconUrl: "../icons/copied-notification.svg",
         title: browser.i18n.getMessage("notificationLinkCopiedTitle"),
-        message: browser.i18n.getMessage("notificationLinkCopiedDetails", pasteSymbol)
+        message: browser.i18n.getMessage("notificationLinkCopiedDetails", pasteSymbol),
       });
     }
     return null;
   });
 
   // This is used for truncated full page downloads and copy to clipboards.
   // Those longer operations need to display an animated spinner/loader, so
   // it's preferable to perform toDataURL() in the background.
@@ -224,22 +224,22 @@ this.main = (function() {
     }
     return dataUrl;
   });
 
   communication.register("copyShotToClipboard", (sender, blob) => {
     return blobConverters.blobToArray(blob).then(buffer => {
       return browser.clipboard.setImageData(
         buffer, blob.type.split("/", 2)[1]).then(() => {
-          catcher.watchPromise(communication.sendToBootstrap("incrementCount", {scalar: "copy"}));
+          catcher.watchPromise(incrementCount("copy"));
           return browser.notifications.create({
             type: "basic",
             iconUrl: "../icons/copied-notification.svg",
             title: browser.i18n.getMessage("notificationImageCopiedTitle"),
-            message: browser.i18n.getMessage("notificationImageCopiedDetails", pasteSymbol)
+            message: browser.i18n.getMessage("notificationImageCopiedDetails", pasteSymbol),
           });
         });
     });
   });
 
   communication.register("downloadShot", (sender, info) => {
     // 'data:' urls don't work directly, let's use a Blob
     // see http://stackoverflow.com/questions/40269862/save-data-uri-as-file-using-downloads-download-api
@@ -251,22 +251,22 @@ this.main = (function() {
         return;
       }
       if (change.state && change.state.current !== "in_progress") {
         URL.revokeObjectURL(url);
         browser.downloads.onChanged.removeListener(onChangedCallback);
       }
     });
     browser.downloads.onChanged.addListener(onChangedCallback);
-    catcher.watchPromise(communication.sendToBootstrap("incrementCount", {scalar: "download"}));
+    catcher.watchPromise(incrementCount("download"));
     return browser.windows.getLastFocused().then(windowInfo => {
       return browser.downloads.download({
         url,
         incognito: windowInfo.incognito,
-        filename: info.filename
+        filename: info.filename,
       }).catch((error) => {
         // We are not logging error message when user cancels download
         if (error && error.message && !error.message.includes("canceled")) {
           log.error(error.message);
         }
       }).then((id) => {
         downloadId = id;
       });
@@ -281,25 +281,30 @@ this.main = (function() {
     hasSeenOnboarding = Promise.resolve(true);
     catcher.watchPromise(browser.storage.local.set({hasSeenOnboarding: true}));
   });
 
   communication.register("abortStartShot", () => {
     // Note, we only show the error but don't report it, as we know that we can't
     // take shots of these pages:
     senderror.showError({
-      popupMessage: "UNSHOOTABLE_PAGE"
+      popupMessage: "UNSHOOTABLE_PAGE",
     });
   });
 
   // A Screenshots page wants us to start/force onboarding
   communication.register("requestOnboarding", (sender) => {
     return startSelectionWithOnboarding(sender.tab);
   });
 
   communication.register("getPlatformOs", () => {
     return catcher.watchPromise(browser.runtime.getPlatformInfo().then(platformInfo => {
       return platformInfo.os;
     }));
   });
 
+  // This allows the web site show notifications through sitehelper.js
+  communication.register("showNotification", (sender, notification) => {
+    return browser.notifications.create(notification);
+  });
+
   return exports;
 })();
rename from browser/extensions/screenshots/webextension/background/selectorLoader.js
rename to browser/extensions/screenshots/background/selectorLoader.js
--- a/browser/extensions/screenshots/webextension/background/selectorLoader.js
+++ b/browser/extensions/screenshots/background/selectorLoader.js
@@ -14,56 +14,56 @@ this.selectorLoader = (function() {
     "build/buildSettings.js",
     "log.js",
     "catcher.js",
     "assertIsTrusted.js",
     "assertIsBlankDocument.js",
     "blobConverters.js",
     "background/selectorLoader.js",
     "selector/callBackground.js",
-    "selector/util.js"
+    "selector/util.js",
   ];
 
   const selectorScripts = [
     "clipboard.js",
     "makeUuid.js",
     "build/selection.js",
     "build/shot.js",
     "randomString.js",
     "domainFromUrl.js",
     "build/inlineSelectionCss.js",
     "selector/documentMetadata.js",
     "selector/ui.js",
     "selector/shooter.js",
-    "selector/uicontrol.js"
+    "selector/uicontrol.js",
   ];
 
   // These are loaded on request (by the selector worker) to activate the onboarding:
   const onboardingScripts = [
     "build/onboardingCss.js",
     "build/onboardingHtml.js",
-    "onboarding/slides.js"
+    "onboarding/slides.js",
   ];
 
   exports.unloadIfLoaded = function(tabId) {
     return browser.tabs.executeScript(tabId, {
       code: "this.selectorLoader && this.selectorLoader.unloadModules()",
-      runAt: "document_start"
+      runAt: "document_start",
     }).then(result => {
       return result && result[0];
     });
   };
 
   exports.testIfLoaded = function(tabId) {
     if (loadingTabs.has(tabId)) {
       return true;
     }
     return browser.tabs.executeScript(tabId, {
       code: "!!this.selectorLoader",
-      runAt: "document_start"
+      runAt: "document_start",
     }).then(result => {
       return result && result[0];
     });
   };
 
   const loadingTabs = new Set();
 
   exports.loadModules = function(tabId, hasSeenOnboarding) {
@@ -84,42 +84,42 @@ this.selectorLoader = (function() {
         return result;
       }, (error) => {
         loadingTabs.delete(tabId);
         throw error;
       });
     }));
   };
 
-  // TODO: since bootstrap communication is now required, would this function
-  // make more sense inside background/main?
   function downloadOnlyCheck(tabId) {
-    return communication.sendToBootstrap("isHistoryEnabled").then((historyEnabled) => {
-      return communication.sendToBootstrap("isUploadDisabled").then((uploadDisabled) => {
-        return browser.tabs.get(tabId).then(tab => {
-          const downloadOnly = !historyEnabled || uploadDisabled || tab.incognito;
-          return browser.tabs.executeScript(tabId, {
-            // Note: `window` here refers to a global accessible to content
-            // scripts, but not the scripts in the underlying page. For more
-            // details, see https://mdn.io/WebExtensions/Content_scripts#Content_script_environment
-            code: `window.downloadOnly = ${downloadOnly}`,
-            runAt: "document_start"
+    return browser.experiments.screenshots.isHistoryEnabled().then((historyEnabled) => {
+      return browser.experiments.screenshots.isUploadDisabled().then((uploadDisabled) => {
+        return browser.experiments.screenshots.getUpdateChannel().then((channel) => {
+          return browser.tabs.get(tabId).then(tab => {
+            const downloadOnly = !historyEnabled || uploadDisabled || channel === "esr" || tab.incognito;
+            return browser.tabs.executeScript(tabId, {
+              // Note: `window` here refers to a global accessible to content
+              // scripts, but not the scripts in the underlying page. For more
+              // details, see https://mdn.io/WebExtensions/Content_scripts#Content_script_environment
+              code: `window.downloadOnly = ${downloadOnly}`,
+              runAt: "document_start",
+            });
           });
         });
       });
     });
   }
 
   function executeModules(tabId, scripts) {
     let lastPromise = Promise.resolve(null);
     scripts.forEach((file) => {
       lastPromise = lastPromise.then(() => {
         return browser.tabs.executeScript(tabId, {
           file,
-          runAt: "document_start"
+          runAt: "document_start",
         }).catch((error) => {
           log.error("error in script:", file, error);
           error.scriptName = file;
           throw error;
         });
       });
     });
     return lastPromise.then(() => {
rename from browser/extensions/screenshots/webextension/background/senderror.js
rename to browser/extensions/screenshots/background/senderror.js
--- a/browser/extensions/screenshots/webextension/background/senderror.js
+++ b/browser/extensions/screenshots/background/senderror.js
@@ -8,52 +8,52 @@ this.senderror = (function() {
   const manifest = browser.runtime.getManifest();
 
   // Do not show an error more than every ERROR_TIME_LIMIT milliseconds:
   const ERROR_TIME_LIMIT = 3000;
 
   const messages = {
     REQUEST_ERROR: {
       title: browser.i18n.getMessage("requestErrorTitle"),
-      info: browser.i18n.getMessage("requestErrorDetails")
+      info: browser.i18n.getMessage("requestErrorDetails"),
     },
     CONNECTION_ERROR: {
       title: browser.i18n.getMessage("connectionErrorTitle"),
-      info: browser.i18n.getMessage("connectionErrorDetails")
+      info: browser.i18n.getMessage("connectionErrorDetails"),
     },
     LOGIN_ERROR: {
       title: browser.i18n.getMessage("requestErrorTitle"),
-      info: browser.i18n.getMessage("loginErrorDetails")
+      info: browser.i18n.getMessage("loginErrorDetails"),
     },
     LOGIN_CONNECTION_ERROR: {
       title: browser.i18n.getMessage("connectionErrorTitle"),
-      info: browser.i18n.getMessage("connectionErrorDetails")
+      info: browser.i18n.getMessage("connectionErrorDetails"),
     },
     UNSHOOTABLE_PAGE: {
       title: browser.i18n.getMessage("unshootablePageErrorTitle"),
-      info: browser.i18n.getMessage("unshootablePageErrorDetails")
+      info: browser.i18n.getMessage("unshootablePageErrorDetails"),
     },
     SHOT_PAGE: {
-      title: browser.i18n.getMessage("selfScreenshotErrorTitle")
+      title: browser.i18n.getMessage("selfScreenshotErrorTitle"),
     },
     MY_SHOTS: {
-      title: browser.i18n.getMessage("selfScreenshotErrorTitle")
+      title: browser.i18n.getMessage("selfScreenshotErrorTitle"),
     },
     EMPTY_SELECTION: {
-      title: browser.i18n.getMessage("emptySelectionErrorTitle")
+      title: browser.i18n.getMessage("emptySelectionErrorTitle"),
     },
     PRIVATE_WINDOW: {
       title: browser.i18n.getMessage("privateWindowErrorTitle"),
-      info: browser.i18n.getMessage("privateWindowErrorDetails")
+      info: browser.i18n.getMessage("privateWindowErrorDetails"),
     },
     generic: {
       title: browser.i18n.getMessage("genericErrorTitle"),
       info: browser.i18n.getMessage("genericErrorDetails"),
-      showMessage: true
-    }
+      showMessage: true,
+    },
   };
 
   communication.register("reportError", (sender, error) => {
     catcher.unhandled(error);
   });
 
   let lastErrorTime;
 
@@ -77,17 +77,17 @@ this.senderror = (function() {
         message = error.message;
       }
     }
     if (Date.now() - startBackground.startTime > 5 * 1000) {
       browser.notifications.create(id, {
         type: "basic",
         // FIXME: need iconUrl for an image, see #2239
         title,
-        message
+        message,
       });
     }
   };
 
   exports.reportError = function(e) {
     if (!analytics.isTelemetryEnabled()) {
       log.error("Telemetry disabled. Not sending critical error:", e);
       return;
@@ -118,17 +118,17 @@ this.senderror = (function() {
       }
     }
     rest.stack = exception.stack;
     Raven.captureException(exception, {
       logger: "addon",
       tags: {category: e.popupMessage},
       release: manifest.version,
       message: exception.message,
-      extra: rest
+      extra: rest,
     });
   };
 
   catcher.registerHandler((errorObj) => {
     if (!errorObj.noPopup) {
       exports.showError(errorObj);
     }
     if (!errorObj.noReport) {
rename from browser/extensions/screenshots/webextension/background/startBackground.js
rename to browser/extensions/screenshots/background/startBackground.js
--- a/browser/extensions/screenshots/webextension/background/startBackground.js
+++ b/browser/extensions/screenshots/background/startBackground.js
@@ -21,42 +21,44 @@ this.startBackground = (function() {
     "background/auth.js",
     "background/senderror.js",
     "build/raven.js",
     "build/shot.js",
     "build/thumbnailGenerator.js",
     "background/analytics.js",
     "background/deviceInfo.js",
     "background/takeshot.js",
-    "background/main.js"
+    "background/main.js",
   ];
 
   browser.pageAction.onClicked.addListener(tab => {
     loadIfNecessary().then(() => {
       main.onClicked(tab);
     }).catch(error => {
       console.error("Error loading Screenshots:", error);
     });
   });
 
   browser.contextMenus.create({
     id: "create-screenshot",
     title: browser.i18n.getMessage("contextMenuLabel"),
     contexts: ["page"],
-    documentUrlPatterns: ["<all_urls>"]
+    documentUrlPatterns: ["<all_urls>"],
   });
 
   browser.contextMenus.onClicked.addListener((info, tab) => {
     loadIfNecessary().then(() => {
       main.onClickedContextMenu(info, tab);
     }).catch((error) => {
       console.error("Error loading Screenshots:", error);
     });
   });
 
+  browser.experiments.screenshots.initLibraryButton();
+
   browser.runtime.onMessage.addListener((req, sender, sendResponse) => {
     loadIfNecessary().then(() => {
       return communication.onMessage(req, sender, sendResponse);
     }).catch((error) => {
       console.error("Error loading Screenshots:", error);
     });
     return true;
   });
rename from browser/extensions/screenshots/webextension/background/takeshot.js
rename to browser/extensions/screenshots/background/takeshot.js
--- a/browser/extensions/screenshots/webextension/background/takeshot.js
+++ b/browser/extensions/screenshots/background/takeshot.js
@@ -1,21 +1,20 @@
 /* globals communication, shot, main, auth, catcher, analytics, buildSettings, blobConverters, thumbnailGenerator */
 
 "use strict";
 
 this.takeshot = (function() {
   const exports = {};
   const Shot = shot.AbstractShot;
-  const { sendEvent } = analytics;
+  const { sendEvent, incrementCount } = analytics;
 
   communication.register("takeShot", catcher.watchFunction((sender, options) => {
     const { captureType, captureText, scroll, selectedPos, shotId } = options;
     const shot = new Shot(main.getBackend(), shotId, options.shot);
-    shot.favicon = sender.tab.favIconUrl;
     let imageBlob = options.imageBlob;
     let capturePromise = Promise.resolve();
     let openedTab;
     let thumbnailBlob;
     if (!shot.clipNames().length) {
       // canvas.drawWindow isn't available, so we fall back to captureVisibleTab
       capturePromise = screenshotPage(selectedPos, scroll).then((dataUrl) => {
         imageBlob = buildSettings.uploadBinary ? blobConverters.dataUrlToBlob(dataUrl) : null;
@@ -23,19 +22,19 @@ this.takeshot = (function() {
           createdDate: Date.now(),
           image: {
             url: buildSettings.uploadBinary ? "" : dataUrl,
             captureType,
             text: captureText,
             location: selectedPos,
             dimensions: {
               x: selectedPos.right - selectedPos.left,
-              y: selectedPos.bottom - selectedPos.top
-            }
-          }
+              y: selectedPos.bottom - selectedPos.top,
+            },
+          },
         });
       });
     }
     const shotAbTests = {};
     const abTests = auth.getAbTests();
     for (const testName of Object.keys(abTests)) {
       if (abTests[testName].shotField) {
         shotAbTests[testName] = abTests[testName].value;
@@ -51,17 +50,19 @@ this.takeshot = (function() {
       }
       return thumbnailGenerator.createThumbnailUrl(shot);
     }).then((thumbnailImage) => {
       if (buildSettings.uploadBinary) {
         thumbnailBlob = thumbnailImage;
       } else {
         shot.thumbnail = thumbnailImage;
       }
-    }).then(() => {
+      return browser.experiments.screenshots.getUpdateChannel();
+    }).then((firefoxChannel) => {
+      shot.firefoxChannel = firefoxChannel;
       return browser.tabs.create({url: shot.creatingUrl});
     }).then((tab) => {
       openedTab = tab;
       sendEvent("internal", "open-shot-tab");
       return uploadShot(shot, imageBlob, thumbnailBlob);
     }).then(() => {
       return browser.tabs.update(openedTab.id, {url: shot.viewUrl, loadReplace: true}).then(
         null,
@@ -71,34 +72,34 @@ this.takeshot = (function() {
           if ((/invalid tab id/i).test(error)) {
             // This happens if the tab was closed before the upload completed
             return browser.tabs.create({url: shot.viewUrl});
           }
           throw error;
         }
       );
     }).then(() => {
-      catcher.watchPromise(communication.sendToBootstrap("incrementCount", {scalar: "upload"}));
+      catcher.watchPromise(incrementCount("upload"));
       return shot.viewUrl;
     }).catch((error) => {
       browser.tabs.remove(openedTab.id);
       throw error;
     }));
   }));
 
   communication.register("screenshotPage", (sender, selectedPos, scroll) => {
     return screenshotPage(selectedPos, scroll);
   });
 
   function screenshotPage(pos, scroll) {
     pos = {
       top: pos.top - scroll.scrollY,
       left: pos.left - scroll.scrollX,
       bottom: pos.bottom - scroll.scrollY,
-      right: pos.right - scroll.scrollX
+      right: pos.right - scroll.scrollX,
     };
     pos.width = pos.right - pos.left;
     pos.height = pos.bottom - pos.top;
     return catcher.watchPromise(browser.tabs.captureVisibleTab(
       null,
       {format: "png"}
     ).then((dataUrl) => {
       const image = new Image();
@@ -171,17 +172,17 @@ this.takeshot = (function() {
         body = concatBuffers(body, enc.encode("\r\n").buffer);
       }
 
       let tail = `\r\n--${boundary}--`;
       tail = enc.encode(tail);
       body = concatBuffers(body, tail.buffer);
       return {
         "content-type": `multipart/form-data; boundary=${boundary}`,
-        body
+        body,
       };
     });
   }
 
   function uploadShot(shot, blob, thumbnail) {
     let headers;
     return auth.authHeaders().then((_headers) => {
       headers = _headers;
@@ -193,27 +194,27 @@ this.takeshot = (function() {
         return createMultipart(
           {shot: JSON.stringify(shot)},
 
           files
         );
       }
       return {
         "content-type": "application/json",
-        body: JSON.stringify(shot)
+        body: JSON.stringify(shot),
       };
 
     }).then((submission) => {
       headers["content-type"] = submission["content-type"];
       sendEvent("upload", "started", {eventValue: Math.floor(submission.body.length / 1000)});
       return fetch(shot.jsonUrl, {
         method: "PUT",
         mode: "cors",
         headers,
-        body: submission.body
+        body: submission.body,
       });
     }).then((resp) => {
       if (!resp.ok) {
         sendEvent("upload-failed", `status-${resp.status}`);
         const exc = new Error(`Response failed with status ${resp.status}`);
         exc.popupMessage = "REQUEST_ERROR";
         throw exc;
       } else {
rename from browser/extensions/screenshots/webextension/blank.html
rename to browser/extensions/screenshots/blank.html
rename from browser/extensions/screenshots/webextension/blobConverters.js
rename to browser/extensions/screenshots/blobConverters.js
deleted file mode 100644
--- a/browser/extensions/screenshots/bootstrap.js
+++ /dev/null
@@ -1,215 +0,0 @@
-/* globals ADDON_DISABLE Services CustomizableUI LegacyExtensionsUtils AppConstants PageActions */
-const ADDON_ID = "screenshots@mozilla.org";
-const TELEMETRY_ENABLED_PREF = "datareporting.healthreport.uploadEnabled";
-const PREF_BRANCH = "extensions.screenshots.";
-const USER_DISABLE_PREF = "extensions.screenshots.disabled";
-const UPLOAD_DISABLED_PREF = "extensions.screenshots.upload-disabled";
-const HISTORY_ENABLED_PREF = "places.history.enabled";
-
-ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
-ChromeUtils.defineModuleGetter(this, "AddonManager",
-                               "resource://gre/modules/AddonManager.jsm");
-ChromeUtils.defineModuleGetter(this, "AddonManagerPrivate",
-                               "resource://gre/modules/AddonManager.jsm");
-ChromeUtils.defineModuleGetter(this, "AppConstants",
-                               "resource://gre/modules/AppConstants.jsm");
-ChromeUtils.defineModuleGetter(this, "CustomizableUI",
-                               "resource:///modules/CustomizableUI.jsm");
-ChromeUtils.defineModuleGetter(this, "LegacyExtensionsUtils",
-                               "resource://gre/modules/LegacyExtensionsUtils.jsm");
-ChromeUtils.defineModuleGetter(this, "Services",
-                               "resource://gre/modules/Services.jsm");
-
-let addonResourceURI;
-let appStartupDone;
-let appStartupPromise = new Promise((resolve, reject) => {
-  appStartupDone = resolve;
-});
-
-const prefs = Services.prefs;
-
-const appStartupObserver = {
-  register() {
-    Services.obs.addObserver(this, "sessionstore-windows-restored", false); // eslint-disable-line mozilla/no-useless-parameters
-  },
-
-  unregister() {
-    Services.obs.removeObserver(this, "sessionstore-windows-restored", false); // eslint-disable-line mozilla/no-useless-parameters
-  },
-
-  observe() {
-    appStartupDone();
-    this.unregister();
-  }
-};
-
-const LibraryButton = {
-  ITEM_ID: "appMenu-library-screenshots",
-
-  init(webExtension) {
-    this._initialized = true;
-    const permissionPages = [...webExtension.extension.permissions].filter(p => (/^https?:\/\//i).test(p));
-    if (permissionPages.length > 1) {
-      Cu.reportError(new Error("Should not have more than 1 permission page, but got: " + JSON.stringify(permissionPages)));
-    }
-    this.PAGE_TO_OPEN = permissionPages.length === 1 ? permissionPages[0].replace(/\*$/, "") : "https://screenshots.firefox.com/";
-    this.PAGE_TO_OPEN += "shots";
-    this.ICON_URL = webExtension.extension.getURL("icons/icon-v2.svg");
-    this.LABEL = webExtension.extension.localizeMessage("libraryLabel");
-    CustomizableUI.addListener(this);
-    for (const win of CustomizableUI.windows) {
-      this.onWindowOpened(win);
-    }
-  },
-
-  uninit() {
-    if (!this._initialized) {
-      return;
-    }
-    for (const win of CustomizableUI.windows) {
-      const item = win.document.getElementById(this.ITEM_ID);
-      if (item) {
-        item.remove();
-      }
-    }
-    CustomizableUI.removeListener(this);
-    this._initialized = false;
-  },
-
-  onWindowOpened(win) {
-    const libraryViewInsertionPoint = win.document.getElementById("appMenu-library-remotetabs-button");
-    // If the library view doesn't exist (on non-photon builds, for instance),
-    // this will be null, and we bail out early.
-    if (!libraryViewInsertionPoint) {
-      return;
-    }
-    const parent = libraryViewInsertionPoint.parentNode;
-    const {nextSibling} = libraryViewInsertionPoint;
-    const item = win.document.createXULElement("toolbarbutton");
-    item.className = "subviewbutton subviewbutton-iconic";
-    item.addEventListener("command", () => win.openWebLinkIn(this.PAGE_TO_OPEN, "tab"));
-    item.id = this.ITEM_ID;
-    const iconURL = this.ICON_URL;
-    item.setAttribute("image", iconURL);
-    item.setAttribute("label", this.LABEL);
-
-    parent.insertBefore(item, nextSibling);
-  },
-};
-
-let addonData, startupReason;
-
-function startup(data, reason) { // eslint-disable-line no-unused-vars
-  addonResourceURI = data.resourceURI;
-
-  if (Services.prefs.getBoolPref(USER_DISABLE_PREF, false)) {
-    AddonManager.getActiveAddons().then(result => {
-      let addon = result.addons.find(a => a.id == ADDON_ID);
-      if (addon) {
-        addon.disable({allowSystemAddons: true});
-      }
-    });
-    return;
-  }
-
-  addonData = data;
-  startupReason = reason;
-  if (reason === AddonManagerPrivate.BOOTSTRAP_REASONS.APP_STARTUP) {
-    appStartupObserver.register();
-  } else {
-    appStartupDone();
-  }
-  // eslint-disable-next-line promise/catch-or-return
-  appStartupPromise = appStartupPromise.then(handleStartup);
-}
-
-function shutdown(data, reason) { // eslint-disable-line no-unused-vars
-  const webExtension = LegacyExtensionsUtils.getEmbeddedExtensionFor({
-    id: ADDON_ID,
-    resourceURI: addonResourceURI
-  });
-  // Immediately exit if Firefox is exiting, #3323
-  if (reason === AddonManagerPrivate.BOOTSTRAP_REASONS.APP_SHUTDOWN) {
-    stop(webExtension, reason);
-    return;
-  }
-  // Because the prefObserver is unregistered above, this _should_ terminate the promise chain.
-  appStartupPromise = appStartupPromise.then(() => { stop(webExtension, reason); });
-}
-
-function install(data, reason) {} // eslint-disable-line no-unused-vars
-
-function uninstall(data, reason) {} // eslint-disable-line no-unused-vars
-
-function getBoolPref(pref) {
-  return prefs.getPrefType(pref) && prefs.getBoolPref(pref);
-}
-
-function handleStartup() {
-  const webExtension = LegacyExtensionsUtils.getEmbeddedExtensionFor({
-    id: ADDON_ID,
-    resourceURI: addonResourceURI
-  });
-
-  if (!webExtension.started) {
-    start(webExtension);
-  }
-}
-
-function start(webExtension) {
-  let reasonStr = stringReasonFromNumericReason(startupReason);
-  return webExtension.startup(reasonStr, addonData).then((api) => {
-    api.browser.runtime.onMessage.addListener(handleMessage);
-    LibraryButton.init(webExtension);
-  }).catch((err) => {
-    // The startup() promise will be rejected if the webExtension was
-    // already started (a harmless error), or if initializing the
-    // WebExtension failed and threw (an important error).
-    console.error(err);
-    if (err.message !== "This embedded extension has already been started") {
-      // TODO: Should we send these errors to Sentry? #2420
-    }
-  });
-}
-
-function stop(webExtension, reason) {
-  if (reason !== AddonManagerPrivate.BOOTSTRAP_REASONS.APP_SHUTDOWN) {
-    LibraryButton.uninit();
-  }
-  let reasonStr = stringReasonFromNumericReason(reason);
-  return Promise.resolve(webExtension.shutdown(reasonStr));
-}
-
-function stringReasonFromNumericReason(numericReason) {
-  let { BOOTSTRAP_REASONS } = AddonManagerPrivate;
-  return Object.keys(BOOTSTRAP_REASONS).find(
-    key => BOOTSTRAP_REASONS[key] == numericReason
-  );
-}
-
-function handleMessage(msg, sender, sendReply) {
-  if (!msg) {
-    return;
-  }
-
-  if (msg.funcName === "isTelemetryEnabled") {
-    const telemetryEnabled = getBoolPref(TELEMETRY_ENABLED_PREF);
-    sendReply({type: "success", value: telemetryEnabled});
-  } else if (msg.funcName === "isUploadDisabled") {
-    const isESR = AppConstants.MOZ_UPDATE_CHANNEL === "esr";
-    const uploadDisabled = getBoolPref(UPLOAD_DISABLED_PREF);
-    sendReply({type: "success", value: uploadDisabled || isESR});
-  } else if (msg.funcName === "isHistoryEnabled") {
-    const historyEnabled = getBoolPref(HISTORY_ENABLED_PREF);
-    sendReply({type: "success", value: historyEnabled});
-  } else if (msg.funcName === "incrementCount") {
-    const allowedScalars = ["download", "upload", "copy"];
-    const scalar = msg.args && msg.args[0] && msg.args[0].scalar;
-    if (!allowedScalars.includes(scalar)) {
-      sendReply({type: "error", name: `incrementCount passed an unrecognized scalar ${scalar}`});
-    } else {
-      Services.telemetry.scalarAdd(`screenshots.${scalar}`, 1);
-      sendReply({type: "success", value: true});
-    }
-  }
-}
rename from browser/extensions/screenshots/webextension/build/buildSettings.js
rename to browser/extensions/screenshots/build/buildSettings.js
rename from browser/extensions/screenshots/webextension/build/inlineSelectionCss.js
rename to browser/extensions/screenshots/build/inlineSelectionCss.js
--- a/browser/extensions/screenshots/webextension/build/inlineSelectionCss.js
+++ b/browser/extensions/screenshots/build/inlineSelectionCss.js
@@ -14,16 +14,18 @@ window.inlineSelectionCss = `
   outline: none;
   padding: 0 10px;
   position: relative;
   text-align: center;
   text-decoration: none;
   transition: background 150ms cubic-bezier(0.07, 0.95, 0, 1), border 150ms cubic-bezier(0.07, 0.95, 0, 1);
   user-select: none;
   white-space: nowrap; }
+  .button.hidden, .hidden.highlight-button-cancel, .hidden.highlight-button-save, .hidden.highlight-button-download, .hidden.highlight-button-copy, .hidden.preview-button-save {
+    display: none; }
   .button.small, .small.highlight-button-cancel, .small.highlight-button-save, .small.highlight-button-download, .small.highlight-button-copy, .small.preview-button-save {
     height: 32px;
     line-height: 32px;
     padding: 0 8px; }
   .button.active, .active.highlight-button-cancel, .active.highlight-button-save, .active.highlight-button-download, .active.highlight-button-copy, .active.preview-button-save {
     background-color: #dedede; }
   .button.tiny, .tiny.highlight-button-cancel, .tiny.highlight-button-save, .tiny.highlight-button-download, .tiny.highlight-button-copy, .tiny.preview-button-save {
     font-size: 14px;
@@ -87,58 +89,46 @@ window.inlineSelectionCss = `
     .button.trash:active, .trash.highlight-button-cancel:active, .trash.highlight-button-save:active, .trash.highlight-button-download:active, .trash.highlight-button-copy:active, .trash.preview-button-save:active {
       background-color: #dedede; }
   .button.edit, .edit.highlight-button-cancel, .edit.highlight-button-save, .edit.highlight-button-download, .edit.highlight-button-copy, .edit.preview-button-save {
     background-image: url("../img/icon-edit.svg"); }
     .button.edit:hover, .edit.highlight-button-cancel:hover, .edit.highlight-button-save:hover, .edit.highlight-button-download:hover, .edit.highlight-button-copy:hover, .edit.preview-button-save:hover {
       background-color: #ededf0; }
     .button.edit:active, .edit.highlight-button-cancel:active, .edit.highlight-button-save:active, .edit.highlight-button-download:active, .edit.highlight-button-copy:active, .edit.preview-button-save:active {
       background-color: #dedede; }
-  .button.flag, .flag.highlight-button-cancel, .flag.highlight-button-save, .flag.highlight-button-download, .flag.highlight-button-copy, .flag.preview-button-save {
-    background-image: url("../img/icon-flag.svg"); }
-    .button.flag:hover, .flag.highlight-button-cancel:hover, .flag.highlight-button-save:hover, .flag.highlight-button-download:hover, .flag.highlight-button-copy:hover, .flag.preview-button-save:hover {
-      background-color: #ededf0; }
-    .button.flag:active, .flag.highlight-button-cancel:active, .flag.highlight-button-save:active, .flag.highlight-button-download:active, .flag.highlight-button-copy:active, .flag.preview-button-save:active {
-      background-color: #dedede; }
 
-.inverse-color-scheme {
-  background: #38383d;
-  color: #f9f9fa; }
-  .inverse-color-scheme a {
-    color: #e1e1e6; }
-
-.default-color-scheme {
+.app-body {
   background: #f9f9fa;
   color: #38383d; }
-  .default-color-scheme a {
-    color: #009ec0; }
+  .app-body a {
+    color: #0a84ff; }
 
 .highlight-color-scheme {
-  background: #009ec0;
+  background: #0a84ff;
   color: #fff; }
   .highlight-color-scheme a {
     color: #fff;
     text-decoration: underline; }
 
 .alt-color-scheme {
   background: #38383d;
   color: #f9f9fa; }
   .alt-color-scheme h1 {
     color: #6f7fb6; }
   .alt-color-scheme a {
     color: #e1e1e6;
     text-decoration: underline; }
 
 .button.primary, .primary.highlight-button-cancel, .highlight-button-save, .primary.highlight-button-download, .primary.highlight-button-copy, .preview-button-save {
-  background-color: #009ec0;
+  background-color: #0a84ff;
   color: #fff; }
   .button.primary:hover, .primary.highlight-button-cancel:hover, .highlight-button-save:hover, .primary.highlight-button-download:hover, .primary.highlight-button-copy:hover, .preview-button-save:hover, .button.primary:focus, .primary.highlight-button-cancel:focus, .highlight-button-save:focus, .primary.highlight-button-download:focus, .primary.highlight-button-copy:focus, .preview-button-save:focus {
-    background-color: #00819c; }
+    background-color: #0072e5; }
   .button.primary:active, .primary.highlight-button-cancel:active, .highlight-button-save:active, .primary.highlight-button-download:active, .primary.highlight-button-copy:active, .preview-button-save:active {
-    background-color: #006c83; }
+    background-color: #0065cc; }
 
 .button.secondary, .highlight-button-cancel, .secondary.highlight-button-save, .highlight-button-download, .highlight-button-copy, .secondary.preview-button-save {
   background-color: #f9f9fa;
   color: #38383d; }
   .button.secondary:hover, .highlight-button-cancel:hover, .secondary.highlight-button-save:hover, .highlight-button-download:hover, .highlight-button-copy:hover, .secondary.preview-button-save:hover {
     background-color: #ededf0; }
   .button.secondary:active, .highlight-button-cancel:active, .secondary.highlight-button-save:active, .highlight-button-download:active, .highlight-button-copy:active, .secondary.preview-button-save:active {
     background-color: #dedede; }
@@ -155,31 +145,29 @@ window.inlineSelectionCss = `
   color: #fff;
   background: #d92215; }
   .button.warning:hover, .warning.highlight-button-cancel:hover, .warning.highlight-button-save:hover, .warning.highlight-button-download:hover, .warning.highlight-button-copy:hover, .warning.preview-button-save:hover, .button.warning:focus, .warning.highlight-button-cancel:focus, .warning.highlight-button-save:focus, .warning.highlight-button-download:focus, .warning.highlight-button-copy:focus, .warning.preview-button-save:focus {
     background: #b81d12; }
   .button.warning:active, .warning.highlight-button-cancel:active, .warning.highlight-button-save:active, .warning.highlight-button-download:active, .warning.highlight-button-copy:active, .warning.preview-button-save:active {
     background: #a11910; }
 
 .subtitle-link {
-  color: #009ec0; }
+  color: #0a84ff; }
 
 .loader {
-  background: #2e2d30;
+  background: rgba(12, 12, 13, 0.2);
   border-radius: 2px;
   height: 4px;
   overflow: hidden;
   position: relative;
   width: 200px; }
-  #shot-index .loader {
-    background-color: #dedede; }
 
 .loader-inner {
   animation: bounce infinite alternate 1250ms cubic-bezier(0.7, 0, 0.3, 1);
-  background: #04d1e6;
+  background: #45a1ff;
   border-radius: 2px;
   height: 4px;
   transform: translateX(-40px);
   width: 50px; }
 
 @keyframes bounce {
   0% {
     transform: translateX(-40px); }
@@ -395,16 +383,24 @@ window.inlineSelectionCss = `
     font-weight: bold;
     white-space: nowrap; }
   .notice .notice-help {
     background-image: url("MOZ_EXTENSION/icons/help-16.svg");
     background-position: center center;
     background-repeat: no-repeat;
     height: 16px;
     width: 16px; }
+  .notice.middle {
+    display: none;
+    top: calc(50% - 21px); }
+
+.preview-button-save:active ~ .notice.middle,
+.preview-button-save:focus ~ .notice.middle,
+.preview-button-save:hover ~ .notice.middle {
+  display: block; }
 
 .notice-tooltip {
   background: #fff;
   border-radius: 3px;
   border: 1px solid #9d9d9e;
   bottom: 60px;
   color: #000;
   cursor: default;
rename from browser/extensions/screenshots/webextension/build/onboardingCss.js
rename to browser/extensions/screenshots/build/onboardingCss.js
--- a/browser/extensions/screenshots/webextension/build/onboardingCss.js
+++ b/browser/extensions/screenshots/build/onboardingCss.js
@@ -1,23 +1,21 @@
 /* Created from build/server/static/css/onboarding.css */
 window.onboardingCss = `
 .loader {
-  background: #2e2d30;
+  background: rgba(12, 12, 13, 0.2);
   border-radius: 2px;
   height: 4px;
   overflow: hidden;
   position: relative;
   width: 200px; }
-  #shot-index .loader {
-    background-color: #dedede; }
 
 .loader-inner {
   animation: bounce infinite alternate 1250ms cubic-bezier(0.7, 0, 0.3, 1);
-  background: #04d1e6;
+  background: #45a1ff;
   border-radius: 2px;
   height: 4px;
   transform: translateX(-40px);
   width: 50px; }
 
 @keyframes bounce {
   0% {
     transform: translateX(-40px); }
@@ -157,24 +155,26 @@ body {
     .slide.slide-1 .slide-content {
       justify-content: space-between;
       width: 100%; }
 
 .slide-1,
 .slide-2,
 .slide-3,
 .slide-4,
-.slide-5 {
+.slide-5,
+.slide-6 {
   display: none; }
 
 .active-slide-1 .slide-1,
 .active-slide-2 .slide-2,
 .active-slide-3 .slide-3,
 .active-slide-4 .slide-4,
-.active-slide-5 .slide-5 {
+.active-slide-5 .slide-5,
+.active-slide-6 .slide-6 {
   display: flex; }
 
 #slide-status-container {
   display: flex;
   align-items: center;
   justify-content: center;
   padding-top: 15px; }
 
@@ -192,17 +192,18 @@ body {
 
 .goto-slide:hover {
   opacity: 1; }
 
 .active-slide-1 .goto-slide-1,
 .active-slide-2 .goto-slide-2,
 .active-slide-3 .goto-slide-3,
 .active-slide-4 .goto-slide-4,
-.active-slide-5 .goto-slide-5 {
+.active-slide-5 .goto-slide-5,
+.active-slide-6 .goto-slide-6 {
   opacity: 1;
   transform: scale(1.1); }
 
 #prev, #next,
 #done {
   background-color: #f0f0f0;
   border-radius: 50%;
   border: 0;
@@ -276,24 +277,24 @@ body {
   top: 50%;
   transition: opacity 100ms cubic-bezier(0.07, 0.95, 0, 1);
   z-index: 10; }
 
 #skip:hover {
   opacity: 1; }
 
 .active-slide-1 #prev,
-.active-slide-5 #next {
+.active-slide-6 #next {
   display: none; }
 
 #done {
   background-image: url("MOZ_EXTENSION/icons/done.svg");
   display: none; }
 
-.active-slide-5 #done {
+.active-slide-6 #done {
   display: inline-block; }
 
 /* for smaller screen sizes */
 @media screen and (max-width: 768px) {
   .slide {
     height: 360px;
     width: 450px; }
     .slide .slide-image {
rename from browser/extensions/screenshots/webextension/build/onboardingHtml.js
rename to browser/extensions/screenshots/build/onboardingHtml.js
--- a/browser/extensions/screenshots/webextension/build/onboardingHtml.js
+++ b/browser/extensions/screenshots/build/onboardingHtml.js
@@ -1,21 +1,21 @@
-/* Created from addon/webextension/onboarding/slides.html */
+/* Created from webextension/onboarding/slides.html */
 window.onboardingHtml = `
 <!DOCTYPE html>
 <html>
   <head>
     <!-- onboarding.scss is automatically inserted here: -->
     <style></style>
     <!-- Here and in onboarding.scss use MOZ_EXTENSION/path to refer to local files -->
   </head>
   <body>
     <div id="slide-overlay">
       <!-- The current slide is set by having .active-slide-1, .active-slide-2, etc on #slide element: -->
-      <div id="slide-container" data-number-of-slides="5" class="active-slide-1">
+      <div id="slide-container" data-number-of-slides="6" class="active-slide-1">
         <div class="slide slide-1">
           <!-- Note: all images must be listed in manifest.json.template under web_accessible_resources -->
           <div class="slide-image" style="background-image: url('MOZ_EXTENSION/icons/onboarding-1.png');"></div>
           <div class="slide-content">
             <div class="slide-content-aligner">
               <h1><span><strong>Firefox</strong> Screenshots</span><sup>Beta</sup></h1>
               <p data-l10n-id="tourBodyIntro"></p>
             </div>
@@ -45,28 +45,36 @@ window.onboardingHtml = `
         </div>
         <div class="slide slide-5">
           <div class="slide-image" style="background-image: url('MOZ_EXTENSION/icons/onboarding-5.png');"></div>
           <div class="slide-content">
             <h1 data-l10n-id="tourHeaderDownloadUpload"></h1>
             <p data-l10n-id="tourBodyDownloadUpload"></p>
           </div>
         </div>
+        <div class="slide slide-6">
+          <div class="slide-image" style="background-image: url('MOZ_EXTENSION/icons/onboarding-6.png');"></div>
+          <div class="slide-content">
+            <h1 data-l10n-id="tourHeaderAccounts"></h1>
+            <p data-l10n-id="tourBodyAccounts"></p>
+          </div>
+        </div>
 
         <!-- Clickable elements should be buttons for accessibility -->
         <button id="skip" data-l10n-id="tourSkip" tabindex=1>Skip</button>
         <button id="prev" tabindex=2 data-l10n-label-id="tourPrevious"></button>
         <button id="next" tabindex=3 data-l10n-label-id="tourNext"></button>
         <button id="done" tabindex=4 data-l10n-label-id="tourDone"></button>
         <div id="slide-status-container">
           <button class="goto-slide goto-slide-1" data-number="1" tabindex=4></button>
           <button class="goto-slide goto-slide-2" data-number="2" tabindex=5></button>
           <button class="goto-slide goto-slide-3" data-number="3" tabindex=6></button>
           <button class="goto-slide goto-slide-4" data-number="4" tabindex=7></button>
           <button class="goto-slide goto-slide-5" data-number="5" tabindex=8></button>
+          <button class="goto-slide goto-slide-6" data-number="6" tabindex=9></button>
         </div>
         <!-- FIXME: Need to put in privacy / etc links -->
       </div>
     </div>
   </body>
 </html>
 
 `;
rename from browser/extensions/screenshots/webextension/build/raven.js
rename to browser/extensions/screenshots/build/raven.js
--- a/browser/extensions/screenshots/webextension/build/raven.js
+++ b/browser/extensions/screenshots/build/raven.js
@@ -1,17 +1,17 @@
-/*! Raven.js 3.25.2 (30b6d4e) | github.com/getsentry/raven-js */
+/*! Raven.js 3.27.0 (200cffcc) | github.com/getsentry/raven-js */
 
 /*
  * Includes TraceKit
  * https://github.com/getsentry/TraceKit
  *
- * Copyright 2018 Matt Robenolt and other contributors
- * Released under the BSD license
- * https://github.com/getsentry/raven-js/blob/master/LICENSE
+ * Copyright (c) 2018 Sentry (https://sentry.io) and individual contributors.
+ * All rights reserved.
+ * https://github.com/getsentry/sentry-javascript/blob/master/packages/raven-js/LICENSE
  *
  */
 
 (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Raven = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
 function RavenConfigError(message) {
   this.name = 'RavenConfigError';
   this.message = message;
 }
@@ -112,21 +112,17 @@ var dsnKeys = 'source protocol user pass
 function now() {
   return +new Date();
 }
 
 // This is to be defensive in environments where window does not exist (see https://github.com/getsentry/raven-js/pull/785)
 var _window =
   typeof window !== 'undefined'
     ? window
-    : typeof global !== 'undefined'
-      ? global
-      : typeof self !== 'undefined'
-        ? self
-        : {};
+    : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
 var _document = _window.document;
 var _navigator = _window.navigator;
 
 function keepOriginalCallback(original, callback) {
   return isFunction(callback)
     ? function(data) {
         return callback(data, original);
       }
@@ -165,17 +161,16 @@ function Raven() {
     stackTraceLimit: 50,
     autoBreadcrumbs: true,
     instrument: true,
     sampleRate: 1,
     sanitizeKeys: []
   };
   this._fetchDefaults = {
     method: 'POST',
-    keepalive: true,
     // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
     // https://caniuse.com/#feat=referrer-policy
     // It doesn't. And it throw exception instead of ignoring this parameter...
     // REF: https://github.com/getsentry/raven-js/issues/1233
     referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''
   };
   this._ignoreOnError = 0;
   this._isRavenInstalled = false;
@@ -206,17 +201,17 @@ function Raven() {
  * @this {Raven}
  */
 
 Raven.prototype = {
   // Hardcode version string so that raven source can be loaded directly via
   // webpack (using a build step causes webpack #1617). Grunt verifies that
   // this value matches package.json during build.
   //   See: https://github.com/getsentry/raven-js/issues/465
-  VERSION: '3.25.2',
+  VERSION: '3.27.0',
 
   debug: false,
 
   TraceKit: TraceKit, // alias to TraceKit
 
   /*
      * Configure Raven with a DSN and extra options
      *
@@ -372,28 +367,28 @@ Raven.prototype = {
      * @param {object} options A specific set of options for this context [optional]
      * @param {function} func The callback to be immediately executed within the context
      * @param {array} args An array of arguments to be called with the callback [optional]
      */
   context: function(options, func, args) {
     if (isFunction(options)) {
       args = func || [];
       func = options;
-      options = undefined;
+      options = {};
     }
 
     return this.wrap(options, func).apply(this, args);
   },
 
   /*
      * Wrap code within a context and returns back a new function to be executed
      *
      * @param {object} options A specific set of options for this context [optional]
      * @param {function} func The function to be wrapped in a new context
-     * @param {function} func A function to call before the try/catch wrapper [optional, private]
+     * @param {function} _before A function to call before the try/catch wrapper [optional, private]
      * @return {function} The newly wrapped functions with a context
      */
   wrap: function(options, func, _before) {
     var self = this;
     // 1 argument has been passed, and it's not a function
     // so just return it
     if (isUndefined(func) && !isFunction(options)) {
       return options;
@@ -496,18 +491,19 @@ Raven.prototype = {
    * @param {PromiseRejectionEvent} event An object containing
    *   promise: the Promise that was rejected
    *   reason: the value with which the Promise was rejected
    * @return void
    */
   _promiseRejectionHandler: function(event) {
     this._logDebug('debug', 'Raven caught unhandled promise rejection:', event);
     this.captureException(event.reason, {
-      extra: {
-        unhandledPromiseRejection: true
+      mechanism: {
+        type: 'onunhandledrejection',
+        handled: false
       }
     });
   },
 
   /**
    * Installs the global promise rejection handler.
    *
    * @return {raven}
@@ -682,17 +678,19 @@ Raven.prototype = {
 
     if (
       !!this._globalOptions.whitelistUrls.test &&
       !this._globalOptions.whitelistUrls.test(fileurl)
     ) {
       return;
     }
 
-    if (this._globalOptions.stacktrace || (options && options.stacktrace)) {
+    // Always attempt to get stacktrace if message is empty.
+    // It's the only way to provide any helpful information to the user.
+    if (this._globalOptions.stacktrace || options.stacktrace || data.message === '') {
       // fingerprint on msg, not stack trace (legacy behavior, could be revisited)
       data.fingerprint = data.fingerprint == null ? msg : data.fingerprint;
 
       options = objectMerge(
         {
           trimHeadFrames: 0
         },
         options
@@ -941,44 +939,50 @@ Raven.prototype = {
   },
 
   showReportDialog: function(options) {
     if (
       !_document // doesn't work without a document (React native)
     )
       return;
 
-    options = options || {};
-
-    var lastEventId = options.eventId || this.lastEventId();
-    if (!lastEventId) {
+    options = objectMerge(
+      {
+        eventId: this.lastEventId(),
+        dsn: this._dsn,
+        user: this._globalContext.user || {}
+      },
+      options
+    );
+
+    if (!options.eventId) {
       throw new RavenConfigError('Missing eventId');
     }
 
-    var dsn = options.dsn || this._dsn;
-    if (!dsn) {
+    if (!options.dsn) {
       throw new RavenConfigError('Missing DSN');
     }
 
     var encode = encodeURIComponent;
-    var qs = '';
-    qs += '?eventId=' + encode(lastEventId);
-    qs += '&dsn=' + encode(dsn);
-
-    var user = options.user || this._globalContext.user;
-    if (user) {
-      if (user.name) qs += '&name=' + encode(user.name);
-      if (user.email) qs += '&email=' + encode(user.email);
+    var encodedOptions = [];
+
+    for (var key in options) {
+      if (key === 'user') {
+        var user = options.user;
+        if (user.name) encodedOptions.push('name=' + encode(user.name));
+        if (user.email) encodedOptions.push('email=' + encode(user.email));
+      } else {
+        encodedOptions.push(encode(key) + '=' + encode(options[key]));
+      }
     }
-
-    var globalServer = this._getGlobalServer(this._parseDSN(dsn));
+    var globalServer = this._getGlobalServer(this._parseDSN(options.dsn));
 
     var script = _document.createElement('script');
     script.async = true;
-    script.src = globalServer + '/api/embed/error-page/' + qs;
+    script.src = globalServer + '/api/embed/error-page/?' + encodedOptions.join('&');
     (_document.head || _document.body).appendChild(script);
   },
 
   /**** Private functions ****/
   _ignoreNextOnError: function() {
     var self = this;
     this._ignoreOnError += 1;
     setTimeout(function() {
@@ -1174,17 +1178,25 @@ Raven.prototype = {
         // Make a copy of the arguments to prevent deoptimization
         // https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments
         var args = new Array(arguments.length);
         for (var i = 0; i < args.length; ++i) {
           args[i] = arguments[i];
         }
         var originalCallback = args[0];
         if (isFunction(originalCallback)) {
-          args[0] = self.wrap(originalCallback);
+          args[0] = self.wrap(
+            {
+              mechanism: {
+                type: 'instrument',
+                data: {function: orig.name || '<anonymous>'}
+              }
+            },
+            originalCallback
+          );
         }
 
         // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it
         // also supports only two arguments and doesn't care what this is, so we
         // can just call the original function directly.
         if (orig.apply) {
           return orig.apply(this, args);
         } else {
@@ -1201,17 +1213,29 @@ Raven.prototype = {
         fill(
           proto,
           'addEventListener',
           function(orig) {
             return function(evtName, fn, capture, secure) {
               // preserve arity
               try {
                 if (fn && fn.handleEvent) {
-                  fn.handleEvent = self.wrap(fn.handleEvent);
+                  fn.handleEvent = self.wrap(
+                    {
+                      mechanism: {
+                        type: 'instrument',
+                        data: {
+                          target: global,
+                          function: 'handleEvent',
+                          handler: (fn && fn.name) || '<anonymous>'
+                        }
+                      }
+                    },
+                    fn.handleEvent
+                  );
                 }
               } catch (err) {
                 // can sometimes get 'Permission denied to access property "handle Event'
               }
 
               // More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`
               // so that we don't have more than one wrapper function
               var before, clickHandler, keypressHandler;
@@ -1241,17 +1265,30 @@ Raven.prototype = {
                   }
                   if (eventType === 'click') return clickHandler(evt);
                   else if (eventType === 'keypress') return keypressHandler(evt);
                 };
               }
               return orig.call(
                 this,
                 evtName,
-                self.wrap(fn, undefined, before),
+                self.wrap(
+                  {
+                    mechanism: {
+                      type: 'instrument',
+                      data: {
+                        target: global,
+                        function: 'addEventListener',
+                        handler: (fn && fn.name) || '<anonymous>'
+                      }
+                    }
+                  },
+                  fn,
+                  before
+                ),
                 capture,
                 secure
               );
             };
           },
           wrappedBuiltIns
         );
         fill(
@@ -1275,17 +1312,30 @@ Raven.prototype = {
     fill(_window, 'setTimeout', wrapTimeFn, wrappedBuiltIns);
     fill(_window, 'setInterval', wrapTimeFn, wrappedBuiltIns);
     if (_window.requestAnimationFrame) {
       fill(
         _window,
         'requestAnimationFrame',
         function(orig) {
           return function(cb) {
-            return orig(self.wrap(cb));
+            return orig(
+              self.wrap(
+                {
+                  mechanism: {
+                    type: 'instrument',
+                    data: {
+                      function: 'requestAnimationFrame',
+                      handler: (orig && orig.name) || '<anonymous>'
+                    }
+                  }
+                },
+                cb
+              )
+            );
           };
         },
         wrappedBuiltIns
       );
     }
 
     // event targets borrowed from bugsnag-js:
     // https://github.com/bugsnag/bugsnag-js/blob/master/src/bugsnag.js#L666
@@ -1338,17 +1388,25 @@ Raven.prototype = {
     var self = this;
     var autoBreadcrumbs = this._globalOptions.autoBreadcrumbs;
 
     var wrappedBuiltIns = self._wrappedBuiltIns;
 
     function wrapProp(prop, xhr) {
       if (prop in xhr && isFunction(xhr[prop])) {
         fill(xhr, prop, function(orig) {
-          return self.wrap(orig);
+          return self.wrap(
+            {
+              mechanism: {
+                type: 'instrument',
+                data: {function: prop, handler: (orig && orig.name) || '<anonymous>'}
+              }
+            },
+            orig
+          );
         }); // intentionally don't track filled methods on XHR instances
       }
     }
 
     if (autoBreadcrumbs.xhr && 'XMLHttpRequest' in _window) {
       var xhrproto = _window.XMLHttpRequest && _window.XMLHttpRequest.prototype;
       fill(
         xhrproto,
@@ -1403,17 +1461,29 @@ Raven.prototype = {
               wrapProp(props[j], xhr);
             }
 
             if ('onreadystatechange' in xhr && isFunction(xhr.onreadystatechange)) {
               fill(
                 xhr,
                 'onreadystatechange',
                 function(orig) {
-                  return self.wrap(orig, undefined, onreadystatechangeHandler);
+                  return self.wrap(
+                    {
+                      mechanism: {
+                        type: 'instrument',
+                        data: {
+                          function: 'onreadystatechange',
+                          handler: (orig && orig.name) || '<anonymous>'
+                        }
+                      }
+                    },
+                    orig,
+                    onreadystatechangeHandler
+                  );
                 } /* intentionally don't track this instrumentation */
               );
             } else {
               // if onreadystatechange wasn't actually set by the page on this xhr, we
               // are free to set our own and capture the breadcrumb
               xhr.onreadystatechange = onreadystatechangeHandler;
             }
 
@@ -1627,20 +1697,26 @@ Raven.prototype = {
     var globalServer = '//' + uri.host + (uri.port ? ':' + uri.port : '');
 
     if (uri.protocol) {
       globalServer = uri.protocol + ':' + globalServer;
     }
     return globalServer;
   },
 
-  _handleOnErrorStackInfo: function() {
+  _handleOnErrorStackInfo: function(stackInfo, options) {
+    options = options || {};
+    options.mechanism = options.mechanism || {
+      type: 'onerror',
+      handled: false
+    };
+
     // if we are intentionally ignoring errors via onerror, bail out
     if (!this._ignoreOnError) {
-      this._handleStackInfo.apply(this, arguments);
+      this._handleStackInfo(stackInfo, options);
     }
   },
 
   _handleStackInfo: function(stackInfo, options) {
     var frames = this._prepareFrames(stackInfo, options);
 
     this._triggerEvent('handle', {
       stackInfo: stackInfo,
@@ -1767,16 +1843,37 @@ Raven.prototype = {
             }
           ]
         },
         transaction: fileurl
       },
       options
     );
 
+    var ex = data.exception.values[0];
+    if (ex.type == null && ex.value === '') {
+      ex.value = 'Unrecoverable error caught';
+    }
+
+    // Move mechanism from options to exception interface
+    // We do this, as requiring user to pass `{exception:{mechanism:{ ... }}}` would be
+    // too much
+    if (!data.exception.mechanism && data.mechanism) {
+      data.exception.mechanism = data.mechanism;
+      delete data.mechanism;
+    }
+
+    data.exception.mechanism = objectMerge(
+      {
+        type: 'generic',
+        handled: true
+      },
+      data.exception.mechanism || {}
+    );
+
     // Fire away!
     this._send(data);
   },
 
   _trimPacket: function(data) {
     // For now, we only want to truncate the two different messages
     // but this could/should be expanded to just trim everything
     var max = this._globalOptions.maxMessageLength;
@@ -2330,17 +2427,21 @@ module.exports.Client = RavenConstructor
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
 },{"3":3}],5:[function(_dereq_,module,exports){
 (function (global){
 var stringify = _dereq_(7);
 
 var _window =
   typeof window !== 'undefined'
     ? window
-    : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+    : typeof global !== 'undefined'
+      ? global
+      : typeof self !== 'undefined'
+        ? self
+        : {};
 
 function isObject(what) {
   return typeof what === 'object' && what !== null;
 }
 
 // Yanked from https://git.io/vS8DV re-used under CC0
 // with some tiny modifications
 function isError(value) {
@@ -2744,16 +2845,19 @@ function isSameException(ex1, ex2) {
  * Returns true if the two input stack trace interfaces have the same content
  */
 function isSameStacktrace(stack1, stack2) {
   if (isOnlyOneTruthy(stack1, stack2)) return false;
 
   var frames1 = stack1.frames;
   var frames2 = stack2.frames;
 
+  // Exit early if stacktrace is malformed
+  if (frames1 === undefined || frames2 === undefined) return false;
+
   // Exit early if frame count differs
   if (frames1.length !== frames2.length) return false;
 
   // Iterate through every frame; bail out if anything differs
   var a, b;
   for (var i = 0; i < frames1.length; i++) {
     a = frames1[i];
     b = frames2[i];
@@ -3014,21 +3118,22 @@ function getLocationHref() {
   return document.location.href;
 }
 
 function getLocationOrigin() {
   if (typeof document === 'undefined' || document.location == null) return '';
 
   // Oh dear IE10...
   if (!document.location.origin) {
-    document.location.origin =
+    return (
       document.location.protocol +
       '//' +
       document.location.hostname +
-      (document.location.port ? ':' + document.location.port : '');
+      (document.location.port ? ':' + document.location.port : '')
+    );
   }
 
   return document.location.origin;
 }
 
 /**
  * TraceKit.report: cross-browser processing of unhandled exceptions
  *
@@ -4002,9 +4107,9 @@ function md5(string, key, raw) {
     return hexHMACMD5(key, string);
   }
   return rawHMACMD5(key, string);
 }
 
 module.exports = md5;
 
 },{}]},{},[4])(4)
-});
\ No newline at end of file
+});
rename from browser/extensions/screenshots/webextension/build/selection.js
rename to browser/extensions/screenshots/build/selection.js
--- a/browser/extensions/screenshots/webextension/build/selection.js
+++ b/browser/extensions/screenshots/build/selection.js
@@ -57,17 +57,17 @@ this.selection = (function () {let expor
     return Math.abs(this.y2 - this.y1);
   }
 
   rect() {
     return {
       top: Math.floor(this.top),
       left: Math.floor(this.left),
       bottom: Math.floor(this.bottom),
-      right: Math.floor(this.right)
+      right: Math.floor(this.right),
     };
   }
 
   union(other) {
     return new Selection(
       Math.min(this.left, other.left),
       Math.min(this.top, other.top),
       Math.max(this.right, other.right),
@@ -89,17 +89,17 @@ this.selection = (function () {let expor
     return new Selection(this.x1, this.y1, this.x2, this.y2);
   }
 
   toJSON() {
     return {
       left: this.left,
       right: this.right,
       top: this.top,
-      bottom: this.bottom
+      bottom: this.bottom,
     };
   }
 
   static getBoundingClientRect(el) {
     if (!el.getBoundingClientRect) {
       // Typically the <html> element or somesuch
       return null;
     }
rename from browser/extensions/screenshots/webextension/build/shot.js
rename to browser/extensions/screenshots/build/shot.js
--- a/browser/extensions/screenshots/webextension/build/shot.js
+++ b/browser/extensions/screenshots/build/shot.js
@@ -186,28 +186,28 @@ class AbstractShot {
       this.origin = "";
     }
     if (this.fullUrl && !isSecureWebUri(this.fullUrl)) {
       this.fullUrl = "";
     }
     this.docTitle = attrs.docTitle || null;
     this.userTitle = attrs.userTitle || null;
     this.createdDate = attrs.createdDate || Date.now();
-    this.favicon = attrs.favicon || null;
     this.siteName = attrs.siteName || null;
     this.images = [];
     if (attrs.images) {
       this.images = attrs.images.map(
         (json) => new this.Image(json));
     }
     this.openGraph = attrs.openGraph || null;
     this.twitterCard = attrs.twitterCard || null;
     this.documentSize = attrs.documentSize || null;
     this.thumbnail = attrs.thumbnail || null;
     this.abTests = attrs.abTests || null;
+    this.firefoxChannel = attrs.firefoxChannel || null;
     this._clips = {};
     if (attrs.clips) {
       for (const clipId in attrs.clips) {
         const clip = attrs.clips[clipId];
         this._clips[clipId] = new this.Clip(this, clipId, clip);
       }
     }
 
@@ -453,25 +453,16 @@ class AbstractShot {
   get createdDate() {
     return this._createdDate;
   }
   set createdDate(val) {
     assert(val === null || typeof val === "number", "Bad createdDate:", val);
     this._createdDate = val;
   }
 
-  get favicon() {
-    return this._favicon;
-  }
-  set favicon(val) {
-    // We set the favicon with tabs.Tab.faviConUrl, which is a full URL.
-    val = val || null;
-    this._favicon = val;
-  }
-
   clipNames() {
     const names = Object.getOwnPropertyNames(this._clips);
     names.sort(function(a, b) {
       return a.sortOrder < b.sortOrder ? 1 : 0;
     });
     return names;
   }
   getClip(name) {
@@ -558,34 +549,45 @@ class AbstractShot {
     assert(typeof val === "object", "abTests should be an object, not:", typeof val);
     assert(!Array.isArray(val), "abTests should not be an Array");
     for (const name in val) {
       assert(val[name] && typeof val[name] === "string", `abTests.${name} should be a string:`, typeof val[name]);
     }
     this._abTests = val;
   }
 
+  get firefoxChannel() {
+    return this._firefoxChannel;
+  }
+  set firefoxChannel(val) {
+    if (val === null || val === undefined) {
+      this._firefoxChannel = null;
+      return;
+    }
+    assert(typeof val === "string", "firefoxChannel should be a string, not:", typeof val);
+    this._firefoxChannel = val;
+  }
+
 }
 
 AbstractShot.prototype.REGULAR_ATTRS = (`
-origin fullUrl docTitle userTitle createdDate favicon images
+origin fullUrl docTitle userTitle createdDate images
 siteName openGraph twitterCard documentSize
-thumbnail abTests
+thumbnail abTests firefoxChannel
 `).split(/\s+/g);
 
 // Attributes that will be accepted in the constructor, but ignored/dropped
 AbstractShot.prototype.DEPRECATED_ATTRS = (`
 microdata history ogTitle createdDevice head body htmlAttrs bodyAttrs headAttrs
 readable hashtags comments showPage isPublic resources deviceId url
-fullScreenThumbnail
+fullScreenThumbnail favicon
 `).split(/\s+/g);
 
 AbstractShot.prototype.RECALL_ATTRS = (`
-url docTitle userTitle createdDate favicon
-openGraph twitterCard images thumbnail
+url docTitle userTitle createdDate openGraph twitterCard images thumbnail
 `).split(/\s+/g);
 
 AbstractShot.prototype._OPENGRAPH_PROPERTIES = (`
 title type url image audio description determiner locale site_name video
 image:secure_url image:type image:width image:height
 video:secure_url video:type video:width image:height
 audio:secure_url audio:type
 article:published_time article:modified_time article:expiration_time article:author article:section article:tag
rename from browser/extensions/screenshots/webextension/build/thumbnailGenerator.js
rename to browser/extensions/screenshots/build/thumbnailGenerator.js
--- a/browser/extensions/screenshots/webextension/build/thumbnailGenerator.js
+++ b/browser/extensions/screenshots/build/thumbnailGenerator.js
@@ -1,9 +1,9 @@
-this.thumbnailGenerator = (function () {let exports={}; // This is used in addon/webextension/background/takeshot.js,
+this.thumbnailGenerator = (function () {let exports={}; // This is used in webextension/background/takeshot.js,
 // server/src/pages/shot/controller.js, and
 // server/scr/pages/shotindex/view.js. It is used in a browser
 // environment.
 
 // Resize down 1/2 at a time produces better image quality.
 // Not quite as good as using a third-party filter (which will be
 // slower), but good enough.
 const maxResizeScaleFactor = 0.5;
@@ -43,17 +43,17 @@ function getThumbnailDimensions(imageWid
     thumbnailImageHeight = Math.min(scaledY, maxThumbnailHeight,
                                     maxThumbnailHeight / (maxThumbnailWidth / imageWidth));
   }
 
   return {
     width: thumbnailImageWidth,
     height: thumbnailImageHeight,
     scaledX,
-    scaledY
+    scaledY,
   };
 }
 
 /**
  * @param {dataUrl} String Data URL of the original image.
  * @param {int} imageHeight Height in pixels of the original image.
  * @param {int} imageWidth Width in pixels of the original image.
  * @param {String} urlOrBlob 'blob' for a blob, otherwise data url.
rename from browser/extensions/screenshots/webextension/catcher.js
rename to browser/extensions/screenshots/catcher.js
--- a/browser/extensions/screenshots/webextension/catcher.js
+++ b/browser/extensions/screenshots/catcher.js
@@ -29,17 +29,17 @@ this.catcher = (function() {
     let result;
     if (exc.fromMakeError) {
       result = exc;
     } else {
       result = {
         fromMakeError: true,
         name: exc.name || "ERROR",
         message: String(exc),
-        stack: exc.stack
+        stack: exc.stack,
       };
       for (const attr in exc) {
         result[attr] = exc[attr];
       }
     }
     if (info) {
       for (const attr of Object.keys(info)) {
         result[attr] = info[attr];
rename from browser/extensions/screenshots/webextension/clipboard.js
rename to browser/extensions/screenshots/clipboard.js
rename from browser/extensions/screenshots/webextension/domainFromUrl.js
rename to browser/extensions/screenshots/domainFromUrl.js
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/experiments/screenshots/api.js
@@ -0,0 +1,115 @@
+/* globals browser, AppConstants, CustomizableUI, ExtensionCommon, Services, ExtensionAPI */
+
+"use strict";
+
+ChromeUtils.defineModuleGetter(this, "AppConstants",
+                               "resource://gre/modules/AppConstants.jsm");
+ChromeUtils.defineModuleGetter(this, "CustomizableUI",
+                               "resource:///modules/CustomizableUI.jsm");
+ChromeUtils.defineModuleGetter(this, "ExtensionCommon",
+                               "resource://gre/modules/ExtensionCommon.jsm");
+ChromeUtils.defineModuleGetter(this, "PageActions",
+                               "resource:///modules/PageActions.jsm");
+ChromeUtils.defineModuleGetter(this, "Services",
+                               "resource://gre/modules/Services.jsm");
+
+const LibraryButton = {
+  ITEM_ID: "appMenu-library-screenshots",
+
+  init(webExtension) {
+    this._initialized = true;
+    const permissionPages = [...webExtension.permissions].filter(p => (/^https?:\/\//i).test(p));
+    if (permissionPages.length > 1) {
+      Cu.reportError(new Error("Should not have more than 1 permission page, but got: " + JSON.stringify(permissionPages)));
+    }
+    this.PAGE_TO_OPEN = permissionPages.length === 1 ? permissionPages[0].replace(/\*$/, "") : "https://screenshots.firefox.com/";
+    this.PAGE_TO_OPEN += "shots";
+    this.ICON_URL = webExtension.getURL("icons/icon-v2.svg");
+    this.LABEL = webExtension.localizeMessage("libraryLabel");
+    CustomizableUI.addListener(this);
+    for (const win of CustomizableUI.windows) {
+      this.onWindowOpened(win);
+    }
+  },
+
+  uninit() {
+    if (!this._initialized) {
+      return;
+    }
+    for (const win of CustomizableUI.windows) {
+      const item = win.document.getElementById(this.ITEM_ID);
+      if (item) {
+        item.remove();
+      }
+    }
+    CustomizableUI.removeListener(this);
+    this._initialized = false;
+  },
+
+  onWindowOpened(win) {
+    const libraryViewInsertionPoint = win.document.getElementById("appMenu-library-remotetabs-button");
+    // If the library view doesn't exist (on non-photon builds, for instance),
+    // this will be null, and we bail out early.
+    if (!libraryViewInsertionPoint) {
+      return;
+    }
+    const parent = libraryViewInsertionPoint.parentNode;
+    const {nextSibling} = libraryViewInsertionPoint;
+    const item = win.document.createElement("toolbarbutton");
+    item.className = "subviewbutton subviewbutton-iconic";
+    item.addEventListener("command", () => win.openWebLinkIn(this.PAGE_TO_OPEN, "tab"));
+    item.id = this.ITEM_ID;
+    const iconURL = this.ICON_URL;
+    item.setAttribute("image", iconURL);
+    item.setAttribute("label", this.LABEL);
+
+    parent.insertBefore(item, nextSibling);
+  },
+};
+
+this.screenshots = class extends ExtensionAPI {
+  getAPI(context) {
+    const {extension} = context;
+    return {
+      experiments: {
+        screenshots: {
+          // If you are checking for 'nightly', also check for 'nightly-try'.
+          //
+          // Otherwise, just use the standard builds, but be aware of the many
+          // non-standard options that also exist (as of August 2018).
+          //
+          // Standard builds:
+          //   'esr' - ESR channel
+          //   'release' - release channel
+          //   'beta' - beta channel
+          //   'nightly' - nightly channel
+          // Non-standard / deprecated builds:
+          //   'aurora' - deprecated aurora channel (still observed in dxr)
+          //   'default' - local builds from source
+          //   'nightly-try' - nightly Try builds (QA may occasionally need to test with these)
+          getUpdateChannel() {
+            return AppConstants.MOZ_UPDATE_CHANNEL;
+          },
+          isHistoryEnabled() {
+            return Services.prefs.getBoolPref("places.history.enabled", true);
+          },
+          isUploadDisabled() {
+            return Services.prefs.getBoolPref("extensions.screenshots.upload-disabled", false);
+          },
+          initLibraryButton() {
+            context.callOnClose({
+              close: () => {
+                try {
+                  LibraryButton.uninit();
+                } catch (ex) {
+                  Services.console.logStringMessage("Firefox Screenshots LibraryButton shutdown error: ", ex);
+                }
+              },
+            });
+            return LibraryButton.init(extension);
+          },
+        },
+      },
+    };
+  }
+};
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/experiments/screenshots/schema.json
@@ -0,0 +1,36 @@
+[
+  {
+    "namespace": "experiments.screenshots",
+    "description": "Firefox Screenshots internal API",
+    "functions": [
+      {
+        "name": "getUpdateChannel",
+        "type": "function",
+        "description": "Returns the Firefox channel (AppConstants.MOZ_UPDATE_CHANNEL)",
+        "parameters": [],
+        "async": true
+      },
+      {
+        "name": "isHistoryEnabled",
+        "type": "function",
+        "description": "Returns the value of the 'places.history.enabled' preference",
+        "parameters": [],
+        "async": true
+      },
+      {
+        "name": "isUploadDisabled",
+        "type": "function",
+        "description": "Returns the value of the 'extensions.screenshots.upload-disabled' preference",
+        "parameters": [],
+        "async": true
+      },
+      {
+        "name": "initLibraryButton",
+        "type": "function",
+        "description": "Initializes the Photon-based Library menu item for Screenshots",
+        "parameters": [],
+        "async": true
+      }
+    ]
+  }
+]
rename from browser/extensions/screenshots/webextension/icons/back-highlight.svg
rename to browser/extensions/screenshots/icons/back-highlight.svg
rename from browser/extensions/screenshots/webextension/icons/back.svg
rename to browser/extensions/screenshots/icons/back.svg
rename from browser/extensions/screenshots/webextension/icons/cancel.svg
rename to browser/extensions/screenshots/icons/cancel.svg
rename from browser/extensions/screenshots/webextension/icons/cloud.svg
rename to browser/extensions/screenshots/icons/cloud.svg
rename from browser/extensions/screenshots/webextension/icons/copied-notification.svg
rename to browser/extensions/screenshots/icons/copied-notification.svg
rename from browser/extensions/screenshots/webextension/icons/copy.svg
rename to browser/extensions/screenshots/icons/copy.svg
rename from browser/extensions/screenshots/webextension/icons/done.svg
rename to browser/extensions/screenshots/icons/done.svg
rename from browser/extensions/screenshots/webextension/icons/download.svg
rename to browser/extensions/screenshots/icons/download.svg
rename from browser/extensions/screenshots/webextension/icons/help-16.svg
rename to browser/extensions/screenshots/icons/help-16.svg
rename from browser/extensions/screenshots/webextension/icons/icon-highlight-32-v2.svg
rename to browser/extensions/screenshots/icons/icon-highlight-32-v2.svg
rename from browser/extensions/screenshots/webextension/icons/icon-v2.svg
rename to browser/extensions/screenshots/icons/icon-v2.svg
rename from browser/extensions/screenshots/webextension/icons/icon-welcome-face-without-eyes.svg
rename to browser/extensions/screenshots/icons/icon-welcome-face-without-eyes.svg
rename from browser/extensions/screenshots/webextension/icons/menu-fullpage.svg
rename to browser/extensions/screenshots/icons/menu-fullpage.svg
rename from browser/extensions/screenshots/webextension/icons/menu-myshot-white.svg
rename to browser/extensions/screenshots/icons/menu-myshot-white.svg
rename from browser/extensions/screenshots/webextension/icons/menu-myshot.svg
rename to browser/extensions/screenshots/icons/menu-myshot.svg
rename from browser/extensions/screenshots/webextension/icons/menu-visible.svg
rename to browser/extensions/screenshots/icons/menu-visible.svg
rename from browser/extensions/screenshots/webextension/icons/onboarding-1.png
rename to browser/extensions/screenshots/icons/onboarding-1.png
rename from browser/extensions/screenshots/webextension/icons/onboarding-2.png
rename to browser/extensions/screenshots/icons/onboarding-2.png
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d6dd2e1a08b7033efd0e461ce170e60c5f6913a1
GIT binary patch
literal 71575
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%0AgiDf>gJD~oOnwj
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