Merge mozilla-central to mozilla-inbound. a=merge on a CLOSED TREE
authorRazvan Maries <rmaries@mozilla.com>
Fri, 28 Jun 2019 06:41:53 +0300
changeset 543490 ed8177bac14e50fabf3a8a080b0508f40eb1d009
parent 543489 0c9f712f57891d37c83687c52731ed4b81d70c5b (current diff)
parent 543275 a72f0a08f652ab309328230659c97660e13cfd27 (diff)
child 543491 0372b25e5147b4acf57ca7a800f63b18f2509055
push id2131
push userffxbld-merge
push dateMon, 26 Aug 2019 18:30:20 +0000
treeherdermozilla-release@b19ffb3ca153 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone69.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 mozilla-inbound. a=merge on a CLOSED TREE
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream.html
browser/components/urlbar/tests/browser/browser_tabMatchesInAwesomebar.js
layout/generic/nsFrame.cpp
layout/reftests/w3c-css/submitted/contain/contain-size-select-001-ref.html
layout/reftests/w3c-css/submitted/contain/contain-size-select-001.html
layout/reftests/w3c-css/submitted/contain/contain-size-select-002-ref.html
layout/reftests/w3c-css/submitted/contain/contain-size-select-002.html
modules/libpref/init/StaticPrefList.h
--- a/browser/base/content/browser-context.inc
+++ b/browser/base/content/browser-context.inc
@@ -369,16 +369,21 @@
           <menuitem id="context-viewframesource"
                     label="&viewFrameSourceCmd.label;"
                     accesskey="&viewFrameSourceCmd.accesskey;"
                     oncommand="gContextMenu.viewFrameSource();"/>
           <menuitem id="context-viewframeinfo"
                     label="&viewFrameInfoCmd.label;"
                     accesskey="&viewFrameInfoCmd.accesskey;"
                     oncommand="gContextMenu.viewFrameInfo();"/>
+#ifdef NIGHTLY_BUILD
+          <menuitem id="context-frameOsPid"
+                    label="PID: Unknown"
+                    disabled="true"/>
+#endif
         </menupopup>
       </menu>
       <menuitem id="context-viewpartialsource-selection"
                 label="&viewPartialSourceForSelectionCmd.label;"
                 accesskey="&viewPartialSourceCmd.accesskey;"
                 oncommand="gContextMenu.viewPartialSource();"/>
       <menuseparator id="context-sep-viewsource"/>
       <menuitem id="context-viewsource"
--- a/browser/base/content/nsContextMenu.js
+++ b/browser/base/content/nsContextMenu.js
@@ -520,16 +520,23 @@ nsContextMenu.prototype = {
                     this.onCanvas || this.inWebExtBrowser));
 
     this.showItem("context-bookmarklink", (this.onLink && !this.onMailtoLink &&
                                            !this.onMozExtLink) || this.onPlainTextLink);
     this.showItem("context-keywordfield",
                   this.onTextInput && this.onKeywordField);
     this.showItem("frame", this.inFrame);
 
+    if (this.inFrame) {
+      // To make it easier to debug the browser running with out-of-process iframes, we
+      // display the process PID of the iframe in the context menu for the subframe.
+      let frameOsPid = this.actor.manager.browsingContext.currentWindowGlobal.osPid;
+      this.setItemAttr("context-frameOsPid", "label", "PID: " + frameOsPid);
+    }
+
     let showSearchSelect = !this.inAboutDevtoolsToolbox &&
                            (this.isTextSelected || this.onLink) && !this.onImage;
     this.showItem("context-searchselect", showSearchSelect);
     if (showSearchSelect) {
       this.formatSearchContextItem();
     }
 
     // srcdoc cannot be opened separately due to concerns about web
--- a/browser/base/content/test/contextMenu/browser_contextmenu.js
+++ b/browser/base/content/test/contextMenu/browser_contextmenu.js
@@ -18,16 +18,24 @@ const chrome_base = "chrome://mochitests
 const head_base = "chrome://mochitests/content/browser/browser/base/content/test/contextMenu/";
 
 /* import-globals-from contextmenu_common.js */
 Services.scriptloader.loadSubScript(chrome_base + "contextmenu_common.js", this);
 
 /* import-globals-from ../general/head.js */
 Services.scriptloader.loadSubScript(head_base + "head.js", this);
 
+function getThisFrameSubMenu(base_menu) {
+  if (AppConstants.NIGHTLY_BUILD) {
+    let osPidItem = ["context-frameOsPid", false];
+    base_menu = base_menu.concat(osPidItem);
+  }
+  return base_menu;
+}
+
 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() {
@@ -408,29 +416,31 @@ add_task(async function test_iframe() {
      "context-savepage",     true,
      ...(hasPocket ? ["context-pocket", true] : []),
      "---", null,
      "context-sendpagetodevice", true, [], null,
      "---",                  null,
      "context-viewbgimage",  false,
      "context-selectall",    true,
      "frame",                null,
-         ["context-showonlythisframe", true,
+        getThisFrameSubMenu(
+          ["context-showonlythisframe", true,
           "context-openframeintab",    true,
           "context-openframe",         true,
           "---",                       null,
           "context-reloadframe",       true,
           "---",                       null,
           "context-bookmarkframe",     true,
           "context-saveframe",         true,
           "---",                       null,
           "context-printframe",        true,
           "---",                       null,
           "context-viewframesource",   true,
-          "context-viewframeinfo",     true], null,
+          "context-viewframeinfo",     true]
+        ), null,
      "---",                  null,
      "context-viewsource",   true,
      "context-viewinfo",     true,
     ]
   );
 });
 
 add_task(async function test_video_in_iframe() {
@@ -454,28 +464,30 @@ add_task(async function test_video_in_if
      "---",                        null,
      "context-viewvideo",          true,
      "context-copyvideourl",       true,
      "---",                        null,
      "context-savevideo",          true,
      "context-video-saveimage",    true,
      "context-sendvideo",          true,
      "frame",                null,
-         ["context-showonlythisframe", true,
+        getThisFrameSubMenu(
+          ["context-showonlythisframe", true,
           "context-openframeintab",    true,
           "context-openframe",         true,
           "---",                       null,
           "context-reloadframe",       true,
           "---",                       null,
           "context-bookmarkframe",     true,
           "context-saveframe",         true,
           "---",                       null,
           "context-printframe",        true,
           "---",                       null,
-          "context-viewframeinfo",     true], null]
+          "context-viewframeinfo",     true]
+        ), null]
   );
 
   await SpecialPowers.popPrefEnv();
 
   await SpecialPowers.pushPrefEnv({
     set: [["media.videocontrols.picture-in-picture.enabled", false]],
   });
 
@@ -494,28 +506,30 @@ add_task(async function test_video_in_if
      "---",                        null,
      "context-viewvideo",          true,
      "context-copyvideourl",       true,
      "---",                        null,
      "context-savevideo",          true,
      "context-video-saveimage",    true,
      "context-sendvideo",          true,
      "frame",                null,
-         ["context-showonlythisframe", true,
+        getThisFrameSubMenu(
+          ["context-showonlythisframe", true,
           "context-openframeintab",    true,
           "context-openframe",         true,
           "---",                       null,
           "context-reloadframe",       true,
           "---",                       null,
           "context-bookmarkframe",     true,
           "context-saveframe",         true,
           "---",                       null,
           "context-printframe",        true,
           "---",                       null,
-          "context-viewframeinfo",     true], null]
+          "context-viewframeinfo",     true]
+        ), null]
   );
 
   await SpecialPowers.popPrefEnv();
 });
 
 add_task(async function test_audio_in_iframe() {
   await test_contextmenu("#test-audio-in-iframe",
     ["context-media-play",         true,
@@ -528,54 +542,58 @@ add_task(async function test_audio_in_if
           "context-media-playbackrate-200x", true], null,
      "context-media-loop",         true,
      "---",                        null,
      "context-copyaudiourl",       true,
      "---",                        null,
      "context-saveaudio",          true,
      "context-sendaudio",          true,
      "frame",                null,
-         ["context-showonlythisframe", true,
+        getThisFrameSubMenu(
+          ["context-showonlythisframe", true,
           "context-openframeintab",    true,
           "context-openframe",         true,
           "---",                       null,
           "context-reloadframe",       true,
           "---",                       null,
           "context-bookmarkframe",     true,
           "context-saveframe",         true,
           "---",                       null,
           "context-printframe",        true,
           "---",                       null,
-          "context-viewframeinfo",     true], null]
+          "context-viewframeinfo",     true]
+        ), null]
   );
 });
 
 add_task(async function test_image_in_iframe() {
   await test_contextmenu("#test-image-in-iframe",
     ["context-viewimage",            true,
      "context-copyimage-contents",   true,
      "context-copyimage",            true,
      "---",                          null,
      "context-saveimage",            true,
      "context-sendimage",            true,
      "context-setDesktopBackground", true,
      "context-viewimageinfo",        true,
      "frame",                null,
-         ["context-showonlythisframe", true,
+        getThisFrameSubMenu(
+          ["context-showonlythisframe", true,
           "context-openframeintab",    true,
           "context-openframe",         true,
           "---",                       null,
           "context-reloadframe",       true,
           "---",                       null,
           "context-bookmarkframe",     true,
           "context-saveframe",         true,
           "---",                       null,
           "context-printframe",        true,
           "---",                       null,
-          "context-viewframeinfo",     true], null]
+          "context-viewframeinfo",     true]
+        ), null]
   );
 });
 
 add_task(async function test_textarea() {
   // Disabled since this is seeing spell-check-enabled
   // instead of spell-add-dictionaries-main
   todo(false, "spell checker tests are failing, bug 1246296");
 
@@ -1073,24 +1091,26 @@ add_task(async function test_srcdoc() {
      "context-savepage",     true,
      ...(hasPocket ? ["context-pocket", true] : []),
      "---",                  null,
      "context-sendpagetodevice", true, [], null,
      "---",                  null,
      "context-viewbgimage",  false,
      "context-selectall",    true,
      "frame",                null,
-         ["context-reloadframe",       true,
+        getThisFrameSubMenu(
+          ["context-reloadframe",       true,
           "---",                       null,
           "context-saveframe",         true,
           "---",                       null,
           "context-printframe",        true,
           "---",                       null,
           "context-viewframesource",   true,
-          "context-viewframeinfo",     true], null,
+          "context-viewframeinfo",     true]
+        ), null,
      "---",                  null,
      "context-viewsource",   true,
      "context-viewinfo",     true,
     ]
   );
 });
 
 add_task(async function test_input_spell_false() {
--- a/browser/base/content/test/contextMenu/contextmenu_common.js
+++ b/browser/base/content/test/contextMenu/contextmenu_common.js
@@ -1,12 +1,13 @@
 // This file expects contextMenu to be defined in the scope it is loaded into.
 /* global contextMenu:true */
 
 var lastElement;
+const FRAME_OS_PID = "context-frameOsPid";
 
 function openContextMenuFor(element, shiftkey, waitForSpellCheck) {
     // Context menu should be closed before we open it again.
     is(SpecialPowers.wrap(contextMenu).state, "closed", "checking if popup is closed");
 
     if (lastElement)
       lastElement.blur();
     element.focus();
@@ -68,17 +69,19 @@ function getVisibleMenuItems(aMenu, aDat
                        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-menuitem-_create-screenshot") {
-              ok(key, "menuitem " + item.id + " has an access key");
+              if (item.id != FRAME_OS_PID) {
+                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);
             }
--- a/browser/components/newtab/.eslintrc.js
+++ b/browser/components/newtab/.eslintrc.js
@@ -44,16 +44,19 @@ module.exports = {
     "NewTabPagePreloading": true,
   },
   "overrides": [
     {
       // These files use fluent-dom to insert content
       "files": [
         "content-src/asrouter/templates/OnboardingMessage/**",
         "content-src/asrouter/templates/Trailhead/**",
+        "content-src/components/TopSites/**",
+        "content-src/components/MoreRecommendations/MoreRecommendations.jsx",
+        "content-src/components/CollapsibleSection/CollapsibleSection.jsx"
       ],
       "rules": {
         "jsx-a11y/anchor-has-content": 0,
         "jsx-a11y/heading-has-content": 0,
       }
     },
     {
       // Use a configuration that's more appropriate for JSMs
--- a/browser/components/newtab/.nvmrc
+++ b/browser/components/newtab/.nvmrc
@@ -1,1 +1,1 @@
-8.*
+8.16
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/bin/bug_1485002_newtab.py
@@ -0,0 +1,269 @@
+# coding=utf8
+
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+from __future__ import absolute_import
+import fluent.syntax.ast as FTL
+from fluent.migrate.helpers import transforms_from
+from fluent.migrate.helpers import TERM_REFERENCE, VARIABLE_REFERENCE
+from fluent.migrate import COPY, REPLACE
+
+TARGET_FILE = 'browser/browser/newtab/newtab.ftl'
+SOURCE_FILE = TARGET_FILE
+
+"""
+For now while we're testing, use a recipe with slightly different paths for
+testing from activity-stream instead of the usual steps:
+https://firefox-source-docs.mozilla.org/intl/l10n/l10n/fluent_migrations.html#how-to-test-migration-recipes
+
+
+One-time setup starting from activity-stream directory:
+
+```
+cd ..
+git clone hg::https://hg.mozilla.org/l10n/fluent-migration
+cd fluent-migration
+pip install -e .
+
+cd ..
+hg clone https://hg.mozilla.org/l10n/gecko-strings
+```
+NB: gecko-strings needs to be cloned with mercurial not git-cinnabar
+
+
+Testing from activity-stream directory:
+
+```
+rm -f ../gecko-strings/browser/browser/newtab/newtab.ftl
+PYTHONPATH=./bin migrate-l10n bug_1485002_newtab --lang en-US --reference-dir . \
+  --localization-dir ../gecko-strings
+diff -B locales-src/newtab.ftl ../gecko-strings/browser/browser/newtab/newtab.ftl
+```
+NB: migrate-l10n will make local commits to gecko-strings
+
+The diff should result in no differences if the migration recipe matches the
+fluent file.
+
+
+NB: Move the following line out of this comment to test from activity-stream
+SOURCE_FILE = 'locales-src/newtab.ftl'
+"""
+
+
+def migrate(ctx):
+    """Bug 1485002 - Migrate newtab.properties to newtab.ftl, part {index}"""
+
+    ctx.add_transforms(
+        TARGET_FILE,
+        SOURCE_FILE,
+        transforms_from("""
+
+newtab-page-title = { COPY(from_path, "newtab_page_title") }
+newtab-settings-button =
+    .title = { COPY(from_path, "settings_pane_button_label") }
+
+newtab-search-box-search-button =
+    .title = { COPY(from_path, "search_button") }
+    .aria-label = { COPY(from_path, "search_button") }
+
+newtab-search-box-search-the-web-text = { COPY(from_path, "search_web_placeholder") }
+newtab-search-box-search-the-web-input =
+    .placeholder = { COPY(from_path, "search_web_placeholder") }
+    .title = { COPY(from_path, "search_web_placeholder") }
+    .aria-label = { COPY(from_path, "search_web_placeholder") }
+
+newtab-topsites-add-search-engine-header =
+    { COPY(from_path, "section_menu_action_add_search_engine") }
+newtab-topsites-add-topsites-header = { COPY(from_path, "topsites_form_add_header") }
+newtab-topsites-edit-topsites-header = { COPY(from_path, "topsites_form_edit_header") }
+newtab-topsites-title-label = { COPY(from_path, "topsites_form_title_label") }
+newtab-topsites-title-input =
+    .placeholder = { COPY(from_path, "topsites_form_title_placeholder") }
+
+newtab-topsites-url-label = { COPY(from_path, "topsites_form_url_label") }
+newtab-topsites-url-input =
+    .placeholder = { COPY(from_path, "topsites_form_url_placeholder") }
+newtab-topsites-url-validation = { COPY(from_path, "topsites_form_url_validation") }
+
+newtab-topsites-image-url-label = { COPY(from_path, "topsites_form_image_url_label") }
+newtab-topsites-use-image-link = { COPY(from_path, "topsites_form_use_image_link") }
+newtab-topsites-image-validation = { COPY(from_path, "topsites_form_image_validation") }
+
+newtab-topsites-cancel-button = { COPY(from_path, "topsites_form_cancel_button") }
+newtab-topsites-delete-history-button = { COPY(from_path, "menu_action_delete") }
+newtab-topsites-save-button = { COPY(from_path, "topsites_form_save_button") }
+newtab-topsites-preview-button = { COPY(from_path, "topsites_form_preview_button") }
+newtab-topsites-add-button = { COPY(from_path, "topsites_form_add_button") }
+
+newtab-confirm-delete-history-p1 = { COPY(from_path, "confirm_history_delete_p1") }
+newtab-confirm-delete-history-p2 = { COPY(from_path, "confirm_history_delete_notice_p2") }
+
+newtab-menu-section-tooltip =
+    .title = { COPY(from_path, "context_menu_title") }
+    .aria-label = { COPY(from_path, "context_menu_title") }
+
+newtab-menu-topsites-placeholder-tooltip =
+    .title = { COPY(from_path, "edit_topsites_edit_button") }
+    .aria-label = { COPY(from_path, "edit_topsites_edit_button") }
+newtab-menu-edit-topsites = { COPY(from_path, "edit_topsites_button_text") }
+newtab-menu-open-new-window = { COPY(from_path, "menu_action_open_new_window") }
+newtab-menu-open-new-private-window = { COPY(from_path, "menu_action_open_private_window") }
+newtab-menu-dismiss = { COPY(from_path, "menu_action_dismiss") }
+newtab-menu-pin = { COPY(from_path, "menu_action_pin") }
+newtab-menu-unpin = { COPY(from_path, "menu_action_unpin") }
+newtab-menu-delete-history = { COPY(from_path, "menu_action_delete") }
+newtab-menu-remove-bookmark = { COPY(from_path, "menu_action_remove_bookmark") }
+newtab-menu-bookmark = { COPY(from_path, "menu_action_bookmark") }
+
+newtab-menu-copy-download-link = { COPY(from_path, "menu_action_copy_download_link") }
+newtab-menu-go-to-download-page = { COPY(from_path, "menu_action_go_to_download_page") }
+newtab-menu-remove-download = { COPY(from_path, "menu_action_remove_download") }
+
+
+newtab-menu-show-file =
+    { PLATFORM() ->
+      [macos] { COPY(from_path, "menu_action_show_file_mac_os") }
+       *[other] { COPY(from_path, "menu_action_show_file_windows") }
+    }
+newtab-menu-open-file = { COPY(from_path, "menu_action_open_file") }
+
+newtab-label-visited = { COPY(from_path, "type_label_visited") }
+newtab-label-bookmarked = { COPY(from_path, "type_label_bookmarked") }
+newtab-label-recommended = { COPY(from_path, "type_label_recommended") }
+newtab-label-download = { COPY(from_path, "type_label_downloaded") }
+
+newtab-section-menu-remove-section = { COPY(from_path, "section_menu_action_remove_section") }
+newtab-section-menu-collapse-section = { COPY(from_path, "section_menu_action_collapse_section") }
+newtab-section-menu-expand-section = { COPY(from_path, "section_menu_action_expand_section") }
+newtab-section-menu-manage-section = { COPY(from_path, "section_menu_action_manage_section") }
+newtab-section-menu-manage-webext = { COPY(from_path, "section_menu_action_manage_webext") }
+newtab-section-menu-add-topsite = { COPY(from_path, "section_menu_action_add_topsite") }
+newtab-section-menu-add-search-engine =
+    { COPY(from_path, "section_menu_action_add_search_engine") }
+newtab-section-menu-move-up = { COPY(from_path, "section_menu_action_move_up") }
+newtab-section-menu-move-down = { COPY(from_path, "section_menu_action_move_down") }
+newtab-section-menu-privacy-notice = { COPY(from_path, "section_menu_action_privacy_notice") }
+newtab-section-header-topsites = { COPY(from_path, "header_top_sites") }
+newtab-section-header-highlights = { COPY(from_path, "header_highlights") }
+newtab-empty-section-highlights = { COPY(from_path, "highlights_empty_state") }
+
+newtab-pocket-read-more = { COPY(from_path, "pocket_read_more") }
+newtab-pocket-more-recommendations = { COPY(from_path, "pocket_more_reccommendations") }
+newtab-pocket-how-it-works = { COPY(from_path, "pocket_how_it_works") }
+
+newtab-error-fallback-info = { COPY(from_path, "error_fallback_default_info") }
+newtab-error-fallback-refresh-link =
+    { COPY(from_path, "error_fallback_default_refresh_suggestion") }
+
+        """, from_path='browser/chrome/browser/activity-stream/newtab.properties')
+    )
+
+    ctx.add_transforms(
+        TARGET_FILE,
+        SOURCE_FILE,
+        [
+            FTL.Message(
+                id=FTL.Identifier("newtab-menu-save-to-pocket"),
+                value=REPLACE(
+                    "browser/chrome/browser/activity-stream/newtab.properties",
+                    "menu_action_save_to_pocket",
+                    {
+                        "Pocket": TERM_REFERENCE("pocket-brand-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("newtab-menu-archive-pocket"),
+                value=REPLACE(
+                    "browser/chrome/browser/activity-stream/newtab.properties",
+                    "menu_action_archive_pocket",
+                    {
+                        "Pocket": TERM_REFERENCE("pocket-brand-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("newtab-menu-delete-pocket"),
+                value=REPLACE(
+                    "browser/chrome/browser/activity-stream/newtab.properties",
+                    "menu_action_delete_pocket",
+                    {
+                        "Pocket": TERM_REFERENCE("pocket-brand-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("newtab-menu-content-tooltip"),
+                attributes=[
+                    FTL.Attribute(
+                        id=FTL.Identifier("title"),
+                        value=COPY(
+                            "browser/chrome/browser/activity-stream/newtab.properties",
+                            "context_menu_title"
+                        )
+                    ),
+                    FTL.Attribute(
+                        id=FTL.Identifier("aria-label"),
+                        value=REPLACE(
+                            "browser/chrome/browser/activity-stream/newtab.properties",
+                            "context_menu_button_sr",
+                            {
+                                "{title}": VARIABLE_REFERENCE("title")
+                            },
+                        )
+                    ),
+                ]
+            ),
+            FTL.Message(
+                id=FTL.Identifier("newtab-label-saved"),
+                value=REPLACE(
+                    "browser/chrome/browser/activity-stream/newtab.properties",
+                    "type_label_pocket",
+                    {
+                        "Pocket": TERM_REFERENCE("pocket-brand-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("newtab-section-header-pocket"),
+                value=REPLACE(
+                    "browser/chrome/browser/activity-stream/newtab.properties",
+                    "header_recommended_by",
+                    {
+                        "{provider}": VARIABLE_REFERENCE("provider")
+                    },
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("newtab-empty-section-topstories"),
+                value=REPLACE(
+                    "browser/chrome/browser/activity-stream/newtab.properties",
+                    "topstories_empty_state",
+                    {
+                        "{provider}": VARIABLE_REFERENCE("provider")
+                    },
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("newtab-pocket-cta-button"),
+                value=REPLACE(
+                    "browser/chrome/browser/activity-stream/newtab.properties",
+                    "pocket_cta_button",
+                    {
+                        "Pocket": TERM_REFERENCE("pocket-brand-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("newtab-pocket-cta-text"),
+                value=REPLACE(
+                    "browser/chrome/browser/activity-stream/newtab.properties",
+                    "pocket_cta_text",
+                    {
+                        "Pocket": TERM_REFERENCE("pocket-brand-name")
+                    },
+                )
+            ),
+        ]
+    )
--- a/browser/components/newtab/bin/render-activity-stream-html.js
+++ b/browser/components/newtab/bin/render-activity-stream-html.js
@@ -81,18 +81,20 @@ function templateHTML(options) {
   // Add spacing and script tags
   const scriptRender = `\n${scripts.map(script => `    <script src="${script}"></script>`).join("\n")}`;
 
   return `<!doctype html>
 <html lang="${options.locale}" dir="${options.direction}">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>${options.strings.newtab_page_title}</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="${options.baseUrl}css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>${options.noscripts ? "" : scriptRender}
   </body>
--- a/browser/components/newtab/content-src/components/ASRouterAdmin/ASRouterAdmin.jsx
+++ b/browser/components/newtab/content-src/components/ASRouterAdmin/ASRouterAdmin.jsx
@@ -813,19 +813,20 @@ export class CollapseToggle extends Reac
   render() {
     const {props} = this;
     const {renderAdmin} = this;
     const isCollapsed = this.state.collapsed || !renderAdmin;
     const label = `${isCollapsed ? "Expand" : "Collapse"} devtools`;
     return (<React.Fragment>
       <a href="#devtools"
         title={label}
+        aria-label={label}
         className={`asrouter-toggle ${isCollapsed ? "collapsed" : "expanded"}`}
         onClick={this.renderAdmin ? this.onCollapseToggle : null}>
-        <span className="sr-only">{label}</span><span className="icon icon-devtools" />
+        <span className="icon icon-devtools" />
       </a>
       {renderAdmin ? <ASRouterAdminInner {...props} collapsed={this.state.collapsed} /> : null}
     </React.Fragment>);
   }
 }
 
 const _ASRouterAdmin = props => <SimpleHashRouter><CollapseToggle {...props} /></SimpleHashRouter>;
 
--- a/browser/components/newtab/content-src/components/Base/Base.jsx
+++ b/browser/components/newtab/content-src/components/Base/Base.jsx
@@ -1,25 +1,25 @@
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
-import {addLocaleData, injectIntl, IntlProvider} from "react-intl";
+import {addLocaleData, IntlProvider} from "react-intl";
 import {ASRouterAdmin} from "content-src/components/ASRouterAdmin/ASRouterAdmin";
 import {ASRouterUISurface} from "../../asrouter/asrouter-content";
 import {ConfirmDialog} from "content-src/components/ConfirmDialog/ConfirmDialog";
 import {connect} from "react-redux";
 import {DiscoveryStreamBase} from "content-src/components/DiscoveryStreamBase/DiscoveryStreamBase";
 import {ErrorBoundary} from "content-src/components/ErrorBoundary/ErrorBoundary";
 import React from "react";
 import {Search} from "content-src/components/Search/Search";
 import {Sections} from "content-src/components/Sections/Sections";
 
-const PrefsButton = injectIntl(props => (
+const PrefsButton = props => (
   <div className="prefs-button">
-    <button className="icon icon-settings" onClick={props.onClick} title={props.intl.formatMessage({id: "settings_pane_button_label"})} />
+    <button className="icon icon-settings" onClick={props.onClick} data-l10n-id="newtab-settings-button" />
   </div>
-));
+);
 
 // Add the locale data for pluralization and relative-time formatting for now,
 // this just uses english locale data. We can make this more sophisticated if
 // more features are needed.
 function addLocaleDataForReactIntl(locale) {
   addLocaleData([{locale, parentLocale: "en"}]);
 }
 
--- a/browser/components/newtab/content-src/components/Card/Card.jsx
+++ b/browser/components/newtab/content-src/components/Card/Card.jsx
@@ -1,13 +1,12 @@
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
-import {FormattedMessage, injectIntl} from "react-intl";
 import {cardContextTypes} from "./types";
 import {connect} from "react-redux";
-import {GetPlatformString} from "content-src/lib/link-menu-options";
+import {injectIntl} from "react-intl";
 import {LinkMenu} from "content-src/components/LinkMenu/LinkMenu";
 import React from "react";
 import {ScreenshotUtils} from "content-src/lib/screenshot-utils";
 
 // Keep track of pending image loads to only request once
 const gImageLoading = new Map();
 
 /**
@@ -195,19 +194,20 @@ export class _Card extends React.PureCom
 
   componentWillUnmount() {
     ScreenshotUtils.maybeRevokeBlobObjectURL(this.state.cardImage);
   }
 
   render() {
     const {index, className, link, dispatch, contextMenuOptions, eventSource, shouldSendImpressionStats} = this.props;
     const {props} = this;
+    const title = link.title || link.hostname;
     const isContextMenuOpen = this.state.showContextMenu && this.state.activeCard === index;
     // Display "now" as "trending" until we have new strings #3402
-    const {icon, intlID} = cardContextTypes[link.type === "now" ? "trending" : link.type] || {};
+    const {icon, fluentID} = cardContextTypes[link.type === "now" ? "trending" : link.type] || {};
     const hasImage = this.state.cardImage || link.hasImage;
     const imageStyle = {backgroundImage: this.state.cardImage ? `url(${this.state.cardImage.url})` : "none"};
     const outerClassName = [
       "card-outer",
       className,
       isContextMenuOpen && "active",
       props.placeholder && "placeholder",
     ].filter(v => v).join(" ");
@@ -216,17 +216,17 @@ export class _Card extends React.PureCom
       <a href={link.type === "pocket" ? link.open_url : link.url} onClick={!props.placeholder ? this.onLinkClick : undefined}>
         <div className="card">
           <div className="card-preview-image-outer">
             {hasImage &&
               <div className={`card-preview-image${this.state.imageLoaded ? " loaded" : ""}`} style={imageStyle} />
             }
           </div>
           <div className="card-details">
-            {link.type === "download" && <div className="card-host-name alternate"><FormattedMessage id={GetPlatformString(this.props.platform)} /></div>}
+          {link.type === "download" && <div className="card-host-name alternate" data-l10n-id="newtab-menu-show-file" />}
             {link.hostname &&
               <div className="card-host-name">
                 {link.hostname.slice(0, 100)}{link.type === "download" && `  \u2014 ${link.description}`}
               </div>
             }
             <div className={[
               "card-text",
               icon ? "" : "no-context",
@@ -234,26 +234,27 @@ export class _Card extends React.PureCom
               link.hostname ? "" : "no-host-name",
             ].join(" ")}>
               <h4 className="card-title" dir="auto">{link.title}</h4>
               <p className="card-description" dir="auto">{link.description}</p>
             </div>
             <div className="card-context">
               {icon && !link.context && <span aria-haspopup="true" className={`card-context-icon icon icon-${icon}`} />}
               {link.icon && link.context && <span aria-haspopup="true" className="card-context-icon icon" style={{backgroundImage: `url('${link.icon}')`}} />}
-              {intlID && !link.context && <div className="card-context-label"><FormattedMessage id={intlID} defaultMessage="Visited" /></div>}
+              {fluentID && !link.context && <div className="card-context-label" data-l10n-id={fluentID} />}
               {link.context && <div className="card-context-label">{link.context}</div>}
             </div>
           </div>
         </div>
       </a>
-      {!props.placeholder && <button aria-haspopup="true" className="context-menu-button icon" title={this.props.intl.formatMessage({id: "context_menu_title"})}
-        onClick={this.onMenuButtonClick}>
-        <span aria-haspopup="true" className="sr-only">{`Open context menu for ${link.title}`}</span>
-      </button>}
+      {!props.placeholder && <button aria-haspopup="true"
+        data-l10n-id="newtab-menu-content-tooltip"
+        data-l10n-args={`{ "title": "${title}" }`}
+        className="context-menu-button icon"
+        onClick={this.onMenuButtonClick} />}
       {isContextMenuOpen &&
         <LinkMenu
           dispatch={dispatch}
           index={index}
           source={eventSource}
           onUpdate={this.onMenuUpdate}
           options={link.contextMenuOptions || contextMenuOptions}
           site={link}
--- a/browser/components/newtab/content-src/components/Card/types.js
+++ b/browser/components/newtab/content-src/components/Card/types.js
@@ -1,26 +1,22 @@
 export const cardContextTypes = {
   history: {
-    intlID: "type_label_visited",
+    fluentID: "newtab-label-visited",
     icon: "history-item",
   },
   bookmark: {
-    intlID: "type_label_bookmarked",
+    fluentID: "newtab-label-bookmarked",
     icon: "bookmark-added",
   },
   trending: {
-    intlID: "type_label_recommended",
+    fluentID: "newtab-label-recommended",
     icon: "trending",
   },
-  now: {
-    intlID: "type_label_now",
-    icon: "now",
-  },
   pocket: {
-    intlID: "type_label_pocket",
+    fluentID: "newtab-label-saved",
     icon: "pocket",
   },
   download: {
-    intlID: "type_label_downloaded",
+    fluentID: "newtab-label-download",
     icon: "download",
   },
 };
--- a/browser/components/newtab/content-src/components/CollapsibleSection/CollapsibleSection.jsx
+++ b/browser/components/newtab/content-src/components/CollapsibleSection/CollapsibleSection.jsx
@@ -1,23 +1,19 @@
-import {FormattedMessage, injectIntl} from "react-intl";
 import {actionCreators as ac} from "common/Actions.jsm";
 import {ErrorBoundary} from "content-src/components/ErrorBoundary/ErrorBoundary";
+import {FluentOrText} from "content-src/components/FluentOrText/FluentOrText";
 import React from "react";
 import {SectionMenu} from "content-src/components/SectionMenu/SectionMenu";
 import {SectionMenuOptions} from "content-src/lib/section-menu-options";
 
 const VISIBLE = "visible";
 const VISIBILITY_CHANGE_EVENT = "visibilitychange";
 
-function getFormattedMessage(message) {
-  return typeof message === "string" ? <span>{message}</span> : <FormattedMessage {...message} />;
-}
-
-export class _CollapsibleSection extends React.PureComponent {
+export class CollapsibleSection extends React.PureComponent {
   constructor(props) {
     super(props);
     this.onBodyMount = this.onBodyMount.bind(this);
     this.onHeaderClick = this.onHeaderClick.bind(this);
     this.onKeyPress = this.onKeyPress.bind(this);
     this.onTransitionEnd = this.onTransitionEnd.bind(this);
     this.enableOrDisableAnimation = this.enableOrDisableAnimation.bind(this);
     this.onMenuButtonClick = this.onMenuButtonClick.bind(this);
@@ -159,43 +155,39 @@ export class _CollapsibleSection extends
         // Note: data-section-id is used for web extension api tests in mozilla central
         data-section-id={id}>
         <div className="section-top-bar">
           <h3 className="section-title">
             <span className="click-target-container">
             {/* Click-targets that toggle a collapsible section should have an aria-expanded attribute; see bug 1553234 */}
               <span className="click-target" role="button" tabIndex="0" onKeyPress={this.onKeyPress} onClick={this.onHeaderClick}>
                 {this.renderIcon()}
-                {getFormattedMessage(title)}
+                <FluentOrText message={title} />
               </span>
               <span className="click-target" role="button" tabIndex="0" onKeyPress={this.onKeyPress} onClick={this.onHeaderClick}>
                 {isCollapsible && <span className={`collapsible-arrow icon ${collapsed ? "icon-arrowhead-forward-small" : "icon-arrowhead-down-small"}`} />}
               </span>
               <span className="learn-more-link-wrapper">
                 {learnMore &&
                   <span className="learn-more-link">
-                    <a href={learnMore.link.href}>
-                      <FormattedMessage id={learnMore.link.id} />
-                    </a>
+                    <FluentOrText message={learnMore.link.message}>
+                      <a href={learnMore.link.href} />
+                    </FluentOrText>
                   </span>
                 }
               </span>
             </span>
           </h3>
           <div>
             <button
               aria-haspopup="true"
               className="context-menu-button icon"
-              title={this.props.intl.formatMessage({id: "context_menu_title"})}
+              data-l10n-id="newtab-menu-section-tooltip"
               onClick={this.onMenuButtonClick}
-              ref={this.setContextMenuButtonRef}>
-              <span className="sr-only">
-                <FormattedMessage id="section_context_menu_button_sr" />
-              </span>
-            </button>
+              ref={this.setContextMenuButtonRef} />
             {showContextMenu &&
               <SectionMenu
                 id={id}
                 extraOptions={extraMenuOptions}
                 eventSource={eventSource}
                 showPrefName={showPrefName}
                 privacyNoticeURL={privacyNoticeURL}
                 collapsed={collapsed}
@@ -217,18 +209,16 @@ export class _CollapsibleSection extends
             {this.props.children}
           </div>
         </ErrorBoundary>
       </section>
     );
   }
 }
 
-_CollapsibleSection.defaultProps = {
+CollapsibleSection.defaultProps = {
   document: global.document || {
     addEventListener: () => {},
     removeEventListener: () => {},
     visibilityState: "hidden",
   },
   Prefs: {values: {}},
 };
-
-export const CollapsibleSection = injectIntl(_CollapsibleSection);
--- a/browser/components/newtab/content-src/components/CollapsibleSection/_CollapsibleSection.scss
+++ b/browser/components/newtab/content-src/components/CollapsibleSection/_CollapsibleSection.scss
@@ -4,16 +4,17 @@
   transition-duration: 100ms;
   transition-property: background-color;
 
   .section-title {
     font-size: $section-title-font-size;
     font-weight: bold;
     margin: 0;
 
+    &.grey-title,
     span {
       color: var(--newtab-section-header-text-color);
       display: inline-block;
       fill: var(--newtab-section-header-text-color);
       vertical-align: middle;
     }
 
     .click-target-container {
@@ -60,17 +61,17 @@
       opacity: 0;
       position: absolute;
       top: 0;
       transition-duration: 200ms;
       transition-property: opacity;
       width: $context-menu-button-size;
 
       &:-moz-any(:active, :focus, :hover) {
-        fill: $grey-90;
+        fill: var(--newtab-section-header-text-color);
         opacity: 1;
       }
     }
 
     .context-menu {
       top: 16px;
     }
 
@@ -98,17 +99,17 @@
       }
     }
   }
 
   .learn-more-link {
     font-size: 11px;
     margin-inline-start: 12px;
 
-    a span {
+    a {
       color: var(--newtab-link-secondary-color);
     }
   }
 
   .section-body-fallback {
     height: $card-height;
   }
 
--- a/browser/components/newtab/content-src/components/ConfirmDialog/ConfirmDialog.jsx
+++ b/browser/components/newtab/content-src/components/ConfirmDialog/ConfirmDialog.jsx
@@ -1,11 +1,10 @@
 import {actionCreators as ac, actionTypes} from "common/Actions.jsm";
 import {connect} from "react-redux";
-import {FormattedMessage} from "react-intl";
 import React from "react";
 
 /**
  * ConfirmDialog component.
  * One primary action button, one cancel button.
  *
  * Content displayed is controlled by `data` prop the component receives.
  * Example:
@@ -41,38 +40,34 @@ export class _ConfirmDialog extends Reac
   _renderModalMessage() {
     const message_body = this.props.data.body_string_id;
 
     if (!message_body) {
       return null;
     }
 
     return (<span>
-      {message_body.map(msg => <p key={msg}><FormattedMessage id={msg} /></p>)}
+      {message_body.map(msg => <p key={msg} data-l10n-id={msg} />)}
     </span>);
   }
 
   render() {
     if (!this.props.visible) {
       return null;
     }
 
     return (<div className="confirmation-dialog">
       <div className="modal-overlay" onClick={this._handleCancelBtn} role="presentation" />
       <div className="modal">
         <section className="modal-message">
           {this.props.data.icon && <span className={`icon icon-spacer icon-${this.props.data.icon}`} />}
           {this._renderModalMessage()}
         </section>
         <section className="actions">
-          <button onClick={this._handleCancelBtn}>
-            <FormattedMessage id={this.props.data.cancel_button_string_id} />
-          </button>
-          <button className="done" onClick={this._handleConfirmBtn}>
-            <FormattedMessage id={this.props.data.confirm_button_string_id} />
-          </button>
+          <button onClick={this._handleCancelBtn} data-l10n-id={this.props.data.cancel_button_string_id} />
+          <button className="done" onClick={this._handleConfirmBtn} data-l10n-id={this.props.data.confirm_button_string_id} />
         </section>
       </div>
     </div>);
   }
 }
 
 export const ConfirmDialog = connect(state => state.Dialog)(_ConfirmDialog);
--- a/browser/components/newtab/content-src/components/ContextMenu/ContextMenu.jsx
+++ b/browser/components/newtab/content-src/components/ContextMenu/ContextMenu.jsx
@@ -51,23 +51,30 @@ export class ContextMenu extends React.P
   }
 }
 
 export class ContextMenuItem extends React.PureComponent {
   constructor(props) {
     super(props);
     this.onClick = this.onClick.bind(this);
     this.onKeyDown = this.onKeyDown.bind(this);
+    this.focusFirst = this.focusFirst.bind(this);
   }
 
   onClick() {
     this.props.hideContext();
     this.props.option.onClick();
   }
 
+  focusFirst(button) {
+    if (button) {
+      button.focus();
+    }
+  }
+
   // This selects the correct node based on the key pressed
   focusSibling(target, key) {
     const parent = target.parentNode;
     const closestSiblingSelector = (key === "ArrowUp") ? "previousSibling" : "nextSibling";
     if (!parent[closestSiblingSelector]) {
       return;
     }
     if (parent[closestSiblingSelector].firstElementChild) {
@@ -102,15 +109,15 @@ export class ContextMenuItem extends Rea
         break;
     }
   }
 
   render() {
     const {option} = this.props;
     return (
       <li role="menuitem" className="context-menu-item" >
-        <button className={option.disabled ? "disabled" : ""} tabIndex="0" onClick={this.onClick} onKeyDown={this.onKeyDown}>
+        <button className={option.disabled ? "disabled" : ""} tabIndex="0" onClick={this.onClick} onKeyDown={this.onKeyDown} ref={option.first ? this.focusFirst : null}>
           {option.icon && <span className={`icon icon-spacer icon-${option.icon}`} />}
-          {option.label}
+          <span data-l10n-id={option.string_id || option.id} />
         </button>
       </li>);
   }
 }
--- a/browser/components/newtab/content-src/components/DiscoveryStreamBase/DiscoveryStreamBase.jsx
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamBase/DiscoveryStreamBase.jsx
@@ -212,17 +212,17 @@ export class _DiscoveryStreamBase extend
     if (!topStories) {
       return null;
     }
 
     // Extract TopSites to render before the rest and Message to use for header
     const topSites = extractComponent("TopSites");
     const message = extractComponent("Message") || {
       header: {
-        link_text: topStories.learnMore.link.id,
+        link_text: topStories.learnMore.link.message,
         link_url: topStories.learnMore.link.href,
         title: topStories.title,
       },
     };
 
     // Render a DS-style TopSites then the rest if any in a collapsible section
     return (
       <React.Fragment>
@@ -235,17 +235,17 @@ export class _DiscoveryStreamBase extend
           collapsed={topStories.pref.collapsed}
           dispatch={this.props.dispatch}
           icon={topStories.icon}
           id={topStories.id}
           isFixed={true}
           learnMore={{
             link: {
               href: message.header.link_url,
-              id: message.header.link_text,
+              message: message.header.link_text,
             },
           }}
           privacyNoticeURL={topStories.privacyNoticeURL}
           showPrefName={topStories.pref.feed}
           title={message.header.title}>
           {this.renderLayout(layoutRender)}
         </CollapsibleSection>}
         {this.renderLayout([{
--- a/browser/components/newtab/content-src/components/DiscoveryStreamBase/_DiscoveryStreamBase.scss
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamBase/_DiscoveryStreamBase.scss
@@ -48,17 +48,17 @@
 
 .collapsible-section.ds-layout {
   margin: auto;
   width: $ds-width + 2 * $section-horizontal-padding;
 
   .section-top-bar {
     margin-bottom: 0;
 
-    .learn-more-link a span {
+    .learn-more-link a {
       color: var(--newtab-link-primary-color);
       font-weight: normal;
 
       &:-moz-any(:focus, :hover) {
         text-decoration: underline;
       }
     }
   }
--- a/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSCard/_DSCard.scss
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSCard/_DSCard.scss
@@ -51,16 +51,18 @@
       }
 
       color: $blue-60;
     }
   }
 
   .ds-card-link {
     height: 100%;
+    display: flex;
+    flex-direction: column;
 
     &:focus {
       @include ds-fade-in;
 
       @include dark-theme-only {
         @include ds-fade-in($blue-40-40);
       }
 
@@ -83,20 +85,24 @@
       }
     }
   }
 
   .meta {
     display: flex;
     flex-direction: column;
     padding: 12px 16px;
+    flex-grow: 1;
 
     .info-wrap {
       flex-grow: 1;
-      margin: 0 0 12px;
+    }
+
+    .context {
+      margin: 12px 0 0;
     }
 
     .title {
       // show only 3 lines of copy
       @include limit-visibile-lines(3, $header-line-height, $header-font-size);
       font-weight: 600;
     }
 
--- a/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSLinkMenu/DSLinkMenu.jsx
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSLinkMenu/DSLinkMenu.jsx
@@ -1,9 +1,9 @@
-import {FormattedMessage, injectIntl} from "react-intl";
+import {injectIntl} from "react-intl";
 import {LinkMenu} from "content-src/components/LinkMenu/LinkMenu";
 import React from "react";
 
 export class _DSLinkMenu extends React.PureComponent {
   constructor(props) {
     super(props);
     this.state = {
       activeCard: null,
@@ -27,41 +27,44 @@ export class _DSLinkMenu extends React.P
   onMenuUpdate(showContextMenu) {
     if (!showContextMenu) {
       const dsLinkMenuHostDiv = this.contextMenuButtonRef.current.parentElement;
       dsLinkMenuHostDiv.parentElement.classList.remove("active", "last-item");
     }
     this.setState({showContextMenu});
   }
 
-  onMenuShow() {
+  nextAnimationFrame() {
+   return new Promise(resolve => requestAnimationFrame(resolve));
+  }
+
+  async onMenuShow() {
     const dsLinkMenuHostDiv = this.contextMenuButtonRef.current.parentElement;
+    // Wait for next frame before computing scrollMaxX to allow fluent menu strings to be visible
+    await this.nextAnimationFrame();
     if (this.windowObj.scrollMaxX > 0) {
       dsLinkMenuHostDiv.parentElement.classList.add("last-item");
     }
     dsLinkMenuHostDiv.parentElement.classList.add("active");
   }
 
   render() {
     const {index, dispatch} = this.props;
     const isContextMenuOpen = this.state.showContextMenu && this.state.activeCard === index;
     const TOP_STORIES_CONTEXT_MENU_OPTIONS = ["CheckBookmarkOrArchive", "CheckSavedToPocket", "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"];
+    const type = this.props.type || "DISCOVERY_STREAM";
     const title = this.props.title || this.props.source;
-    const type = this.props.type || "DISCOVERY_STREAM";
 
     return (<div>
       <button ref={this.contextMenuButtonRef}
               aria-haspopup="true"
               className="context-menu-button icon"
-              title={this.props.intl.formatMessage({id: "context_menu_title"})}
-              onClick={this.onMenuButtonClick}>
-        <span className="sr-only">
-          <FormattedMessage id="context_menu_button_sr" values={{title}} />
-        </span>
-      </button>
+              data-l10n-id="newtab-menu-content-tooltip"
+              data-l10n-args={`{ "title": "${title}" }`}
+              onClick={this.onMenuButtonClick} />
       {isContextMenuOpen &&
         <LinkMenu
           dispatch={dispatch}
           index={index}
           source={type.toUpperCase()}
           onUpdate={this.onMenuUpdate}
           onShow={this.onMenuShow}
           options={TOP_STORIES_CONTEXT_MENU_OPTIONS}
--- a/browser/components/newtab/content-src/components/DiscoveryStreamComponents/Hero/Hero.jsx
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/Hero/Hero.jsx
@@ -87,17 +87,17 @@ export class Hero extends React.PureComp
                 ) : (
                   <p className="source clamp">{heroRec.domain}</p>
                 )}
                 <header className="clamp">{heroRec.title}</header>
                 <p className="excerpt clamp">{heroRec.excerpt}</p>
               </div>
             </div>
             <ImpressionStats
-              campaignId={heroRec.campaignId}
+              campaignId={heroRec.campaign_id}
               rows={[{
                 id: heroRec.id,
                 pos: heroRec.pos,
                 ...(heroRec.shim && heroRec.shim.impression ? {shim: heroRec.shim.impression} : {}),
               }]}
               dispatch={this.props.dispatch}
               source={this.props.type} />
           </SafeAnchor>
--- a/browser/components/newtab/content-src/components/ErrorBoundary/ErrorBoundary.jsx
+++ b/browser/components/newtab/content-src/components/ErrorBoundary/ErrorBoundary.jsx
@@ -1,10 +1,9 @@
 import {A11yLinkButton} from "content-src/components/A11yLinkButton/A11yLinkButton";
-import {FormattedMessage} from "react-intl";
 import React from "react";
 
 export class ErrorBoundaryFallback extends React.PureComponent {
   constructor(props) {
     super(props);
     this.windowObj = this.props.windowObj || window;
     this.onClick = this.onClick.bind(this);
   }
@@ -24,27 +23,19 @@ export class ErrorBoundaryFallback exten
       className = `${this.props.className} ${defaultClass}`;
     } else {
       className = defaultClass;
     }
 
     // "A11yLinkButton" to force normal link styling stuff (eg cursor on hover)
     return (
       <div className={className}>
-        <div>
-          <FormattedMessage
-            defaultMessage="Oops, something went wrong loading this content."
-            id="error_fallback_default_info" />
-        </div>
+        <div data-l10n-id="newtab-error-fallback-info" />
         <span>
-          <A11yLinkButton className="reload-button" onClick={this.onClick}>
-            <FormattedMessage
-              defaultMessage="Refresh page to try again."
-              id="error_fallback_default_refresh_suggestion" />
-          </A11yLinkButton>
+          <A11yLinkButton className="reload-button" onClick={this.onClick} data-l10n-id="newtab-error-fallback-refresh-link" />
         </span>
       </div>
     );
   }
 }
 ErrorBoundaryFallback.defaultProps = {className: "as-error-fallback"};
 
 export class ErrorBoundary extends React.PureComponent {
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/content-src/components/FluentOrText/FluentOrText.jsx
@@ -0,0 +1,32 @@
+import React from "react";
+
+/**
+ * Set text on a child element/component depending on if the message is already
+ * translated plain text or a fluent id with optional args.
+ */
+export class FluentOrText extends React.PureComponent {
+  render() {
+    // Ensure we have a single child to attach attributes
+    const { children, message } = this.props;
+    const child = children ? React.Children.only(children) : <span />;
+
+    // For a string message, just use it as the child's text
+    let grandChildren = message;
+    let extraProps;
+
+    // Convert a message object to set desired fluent-dom attributes
+    if (typeof message === "object") {
+      const args = message.args || message.values;
+      extraProps = {
+        "data-l10n-args": args && JSON.stringify(args),
+        "data-l10n-id": message.id || message.string_id,
+      };
+
+      // Use original children potentially with data-l10n-name attributes
+      grandChildren = child.props.children;
+    }
+
+    // Add the message to the child via fluent attributes or text node
+    return React.cloneElement(child, extraProps, grandChildren);
+  }
+}
--- a/browser/components/newtab/content-src/components/LinkMenu/LinkMenu.jsx
+++ b/browser/components/newtab/content-src/components/LinkMenu/LinkMenu.jsx
@@ -1,29 +1,27 @@
 import {actionCreators as ac} from "common/Actions.jsm";
 import {connect} from "react-redux";
 import {ContextMenu} from "content-src/components/ContextMenu/ContextMenu";
-import {injectIntl} from "react-intl";
 import {LinkMenuOptions} from "content-src/lib/link-menu-options";
 import React from "react";
 
 const DEFAULT_SITE_MENU_OPTIONS = ["CheckPinTopSite", "EditTopSite", "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"];
 
 export class _LinkMenu extends React.PureComponent {
   getOptions() {
     const {props} = this;
     const {site, index, source, isPrivateBrowsingEnabled, siteInfo, platform} = props;
 
     // Handle special case of default site
     const propOptions = (!site.isDefault || site.searchTopSite) ? props.options : DEFAULT_SITE_MENU_OPTIONS;
 
     const options = propOptions.map(o => LinkMenuOptions[o](site, index, source, isPrivateBrowsingEnabled, siteInfo, platform)).map(option => {
-      const {action, impression, id, string_id, type, userEvent} = option;
+      const {action, impression, id, type, userEvent} = option;
       if (!type && id) {
-        option.label = props.intl.formatMessage({id: string_id || id});
         option.onClick = () => {
           props.dispatch(action);
           if (userEvent) {
             const userEventData = Object.assign({
               event: userEvent,
               source,
               action_position: index,
             }, siteInfo);
@@ -49,9 +47,9 @@ export class _LinkMenu extends React.Pur
     return (<ContextMenu
       onUpdate={this.props.onUpdate}
       onShow={this.props.onShow}
       options={this.getOptions()} />);
   }
 }
 
 const getState = state => ({isPrivateBrowsingEnabled: state.Prefs.values.isPrivateBrowsingEnabled, platform: state.Prefs.values.platform});
-export const LinkMenu = connect(getState)(injectIntl(_LinkMenu));
+export const LinkMenu = connect(getState)(_LinkMenu);
--- a/browser/components/newtab/content-src/components/MoreRecommendations/MoreRecommendations.jsx
+++ b/browser/components/newtab/content-src/components/MoreRecommendations/MoreRecommendations.jsx
@@ -1,16 +1,13 @@
-import {FormattedMessage} from "react-intl";
 import React from "react";
 
 export class MoreRecommendations extends React.PureComponent {
   render() {
     const {read_more_endpoint} = this.props;
     if (read_more_endpoint) {
       return (
-        <a className="more-recommendations" href={read_more_endpoint}>
-          <FormattedMessage id="pocket_more_reccommendations" />
-        </a>
+        <a className="more-recommendations" href={read_more_endpoint} data-l10n-id="newtab-pocket-more-recommendations" />
       );
     }
     return null;
   }
 }
--- a/browser/components/newtab/content-src/components/PocketLoggedInCta/PocketLoggedInCta.jsx
+++ b/browser/components/newtab/content-src/components/PocketLoggedInCta/PocketLoggedInCta.jsx
@@ -1,24 +1,23 @@
 import {connect} from "react-redux";
-import {FormattedMessage} from "react-intl";
 import React from "react";
 
 export class _PocketLoggedInCta extends React.PureComponent {
   render() {
     const {pocketCta} = this.props.Pocket;
     return (
       <span className="pocket-logged-in-cta">
         <a className="pocket-cta-button" href={pocketCta.ctaUrl ? pocketCta.ctaUrl : "https://getpocket.com/"}>
-         {pocketCta.ctaButton ? pocketCta.ctaButton : <FormattedMessage id="pocket_cta_button" />}
+         {pocketCta.ctaButton ? pocketCta.ctaButton : <span data-l10n-id="newtab-pocket-cta-button" />}
         </a>
 
         <a href={pocketCta.ctaUrl ? pocketCta.ctaUrl : "https://getpocket.com/"}>
           <span className="cta-text">
-           {pocketCta.ctaText ? pocketCta.ctaText : <FormattedMessage id="pocket_cta_text" />}
+           {pocketCta.ctaText ? pocketCta.ctaText : <span data-l10n-id="newtab-pocket-cta-text" />}
           </span>
         </a>
       </span>
     );
   }
 }
 
 export const PocketLoggedInCta = connect(state => ({Pocket: state.Pocket}))(_PocketLoggedInCta);
--- a/browser/components/newtab/content-src/components/Search/Search.jsx
+++ b/browser/components/newtab/content-src/components/Search/Search.jsx
@@ -1,13 +1,12 @@
 /* globals ContentSearchUIController */
 "use strict";
 
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
-import {FormattedMessage, injectIntl} from "react-intl";
 import {connect} from "react-redux";
 import {IS_NEWTAB} from "content-src/lib/constants";
 import React from "react";
 
 export class _Search extends React.PureComponent {
   constructor(props) {
     super(props);
     this.onSearchClick = this.onSearchClick.bind(this);
@@ -113,44 +112,38 @@ export class _Search extends React.PureC
       {this.props.showLogo &&
         <div className="logo-and-wordmark">
           <div className="logo" />
           <div className="wordmark" />
         </div>
       }
       {!this.props.handoffEnabled &&
       <div className="search-inner-wrapper">
-        <label htmlFor="newtab-search-text" className="search-label">
-          <span className="sr-only"><FormattedMessage id="search_web_placeholder" /></span>
-        </label>
         <input
           id="newtab-search-text"
+          data-l10n-id="newtab-search-box-search-the-web-input"
           maxLength="256"
-          placeholder={this.props.intl.formatMessage({id: "search_web_placeholder"})}
           ref={this.onInputMount}
-          title={this.props.intl.formatMessage({id: "search_web_placeholder"})}
           type="search" />
         <button
           id="searchSubmit"
           className="search-button"
-          onClick={this.onSearchClick}
-          title={this.props.intl.formatMessage({id: "search_button"})}>
-          <span className="sr-only"><FormattedMessage id="search_button" /></span>
-        </button>
+          data-l10n-id="newtab-search-box-search-button"
+          onClick={this.onSearchClick} />
       </div>
       }
       {this.props.handoffEnabled &&
         <div className="search-inner-wrapper">
           <button
             className="search-handoff-button"
+            data-l10n-id="newtab-search-box-search-the-web-input"
             ref={this.onSearchHandoffButtonMount}
             onClick={this.onSearchHandoffClick}
-            tabIndex="-1"
-            title={this.props.intl.formatMessage({id: "search_web_placeholder"})}>
-            <div className="fake-textbox">{this.props.intl.formatMessage({id: "search_web_placeholder"})}</div>
+            tabIndex="-1">
+            <div className="fake-textbox" data-l10n-id="newtab-search-box-search-the-web-text" />
             <input type="search" className="fake-editable" tabIndex="-1" aria-hidden="true" onDrop={this.onSearchHandoffDrop} onPaste={this.onSearchHandoffPaste} />
             <div className="fake-caret" />
           </button>
           {/*
             This dummy and hidden input below is so we can load ContentSearchUIController.
             Why? It sets --newtab-search-icon for us and it isn't trivial to port over.
           */}
           <input
@@ -158,9 +151,9 @@ export class _Search extends React.PureC
             style={{display: "none"}}
             ref={this.onInputMount} />
         </div>
       }
     </div>);
   }
 }
 
-export const Search = connect()(injectIntl(_Search));
+export const Search = connect()(_Search);
--- a/browser/components/newtab/content-src/components/SectionMenu/SectionMenu.jsx
+++ b/browser/components/newtab/content-src/components/SectionMenu/SectionMenu.jsx
@@ -1,11 +1,10 @@
 import {actionCreators as ac} from "common/Actions.jsm";
 import {ContextMenu} from "content-src/components/ContextMenu/ContextMenu";
-import {injectIntl} from "react-intl";
 import React from "react";
 import {SectionMenuOptions} from "content-src/lib/section-menu-options";
 
 const DEFAULT_SECTION_MENU_OPTIONS = ["MoveUp", "MoveDown", "Separator", "RemoveSection", "CheckCollapsed", "Separator", "ManageSection"];
 const WEBEXT_SECTION_MENU_OPTIONS = ["MoveUp", "MoveDown", "Separator", "CheckCollapsed", "Separator", "ManageWebExtension"];
 
 export class _SectionMenu extends React.PureComponent {
   getOptions() {
@@ -23,17 +22,16 @@ export class _SectionMenu extends React.
     // Insert privacy notice before the last option ("ManageSection")
     if (props.privacyNoticeURL) {
       propOptions.splice(-1, 0, "PrivacyNotice");
     }
 
     const options = propOptions.map(o => SectionMenuOptions[o](props)).map(option => {
       const {action, id, type, userEvent} = option;
       if (!type && id) {
-        option.label = props.intl.formatMessage({id});
         option.onClick = () => {
           props.dispatch(action);
           if (userEvent) {
             props.dispatch(ac.UserEvent({
               event: userEvent,
               source: props.source,
             }));
           }
@@ -52,9 +50,9 @@ export class _SectionMenu extends React.
 
   render() {
     return (<ContextMenu
       onUpdate={this.props.onUpdate}
       options={this.getOptions()} />);
   }
 }
 
-export const SectionMenu = injectIntl(_SectionMenu);
+export const SectionMenu = _SectionMenu;
--- a/browser/components/newtab/content-src/components/Sections/Sections.jsx
+++ b/browser/components/newtab/content-src/components/Sections/Sections.jsx
@@ -1,29 +1,25 @@
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
 import {Card, PlaceholderCard} from "content-src/components/Card/Card";
-import {FormattedMessage, injectIntl} from "react-intl";
 import {CollapsibleSection} from "content-src/components/CollapsibleSection/CollapsibleSection";
 import {ComponentPerfTimer} from "content-src/components/ComponentPerfTimer/ComponentPerfTimer";
+import {FluentOrText} from "content-src/components/FluentOrText/FluentOrText";
 import {connect} from "react-redux";
 import {MoreRecommendations} from "content-src/components/MoreRecommendations/MoreRecommendations";
 import {PocketLoggedInCta} from "content-src/components/PocketLoggedInCta/PocketLoggedInCta";
 import React from "react";
 import {Topics} from "content-src/components/Topics/Topics";
 import {TopSites} from "content-src/components/TopSites/TopSites";
 
 const VISIBLE = "visible";
 const VISIBILITY_CHANGE_EVENT = "visibilitychange";
 const CARDS_PER_ROW_DEFAULT = 3;
 const CARDS_PER_ROW_COMPACT_WIDE = 4;
 
-function getFormattedMessage(message) {
-  return typeof message === "string" ? <span>{message}</span> : <FormattedMessage {...message} />;
-}
-
 export class Section extends React.PureComponent {
   get numRows() {
     const {rowsPref, maxRows, Prefs} = this.props;
     return rowsPref ? Prefs.values[rowsPref] : maxRows;
   }
 
   _dispatchImpressionStats() {
     const {props} = this;
@@ -237,19 +233,19 @@ export class Section extends React.PureC
           {cards}
         </ul>)}
         {shouldShowEmptyState &&
           <div className="section-empty-state">
             <div className="empty-state">
               {emptyState.icon && emptyState.icon.startsWith("moz-extension://") ?
                 <span className="empty-state-icon icon" style={{"background-image": `url('${emptyState.icon}')`}} /> :
                 <span className={`empty-state-icon icon icon-${emptyState.icon}`} />}
-              <p className="empty-state-message">
-                {getFormattedMessage(emptyState.message)}
-              </p>
+              <FluentOrText message={emptyState.message}>
+                <p className="empty-state-message" />
+              </FluentOrText>
             </div>
           </div>}
         {id === "topstories" &&
           <div className="top-stories-bottom-container">
             {shouldShowTopics &&
               <div className="wrapper-topics">
                 <Topics topics={this.props.topics} />
               </div>
@@ -274,17 +270,17 @@ export class Section extends React.PureC
 Section.defaultProps = {
   document: global.document,
   rows: [],
   emptyState: {},
   pref: {},
   title: "",
 };
 
-export const SectionIntl = connect(state => ({Prefs: state.Prefs, Pocket: state.Pocket}))(injectIntl(Section));
+export const SectionIntl = connect(state => ({Prefs: state.Prefs, Pocket: state.Pocket}))(Section);
 
 export class _Sections extends React.PureComponent {
   renderSections() {
     const sections = [];
     const enabledSections = this.props.Sections.filter(section => section.enabled);
     const {sectionOrder, "feeds.topsites": showTopSites} = this.props.Prefs.values;
     // Enabled sections doesn't include Top Sites, so we add it if enabled.
     const expectedCount = enabledSections.length + ~~showTopSites;
--- a/browser/components/newtab/content-src/components/TopSites/SearchShortcutsForm.jsx
+++ b/browser/components/newtab/content-src/components/TopSites/SearchShortcutsForm.jsx
@@ -1,10 +1,9 @@
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
-import {FormattedMessage} from "react-intl";
 import React from "react";
 import {TOP_SITES_SOURCE} from "./TopSitesConstants";
 
 export class SelectableSearchShortcut extends React.PureComponent {
   render() {
     const {shortcut, selected} = this.props;
     const imageStyle = {backgroundImage: `url("${shortcut.tippyTopIcon}")`};
     return (
@@ -115,27 +114,21 @@ export class SearchShortcutsForm extends
       searchVendor: shortcut.shortURL,
     };
   }
 
   render() {
     return (
       <form className="topsite-form">
         <div className="search-shortcuts-container">
-          <h3 className="section-title">
-            <FormattedMessage id="section_menu_action_add_search_engine" />
-          </h3>
+          <h3 className="section-title grey-title" data-l10n-id="newtab-topsites-add-search-engine-header" />
           <div>
             {this.state.shortcuts.map(shortcut => <SelectableSearchShortcut key={shortcut.keyword} shortcut={shortcut} selected={shortcut.isSelected} onChange={this.handleChange} />)}
           </div>
         </div>
         <section className="actions">
-          <button className="cancel" type="button" onClick={this.onCancelButtonClick}>
-            <FormattedMessage id="topsites_form_cancel_button" />
-          </button>
-          <button className="done" type="submit" onClick={this.onSaveButtonClick}>
-            <FormattedMessage id="topsites_form_save_button" />
-          </button>
+          <button className="cancel" type="button" onClick={this.onCancelButtonClick} data-l10n-id="newtab-topsites-cancel-button" />
+          <button className="done" type="submit" onClick={this.onSaveButtonClick} data-l10n-id="newtab-topsites-save-button" />
         </section>
       </form>
     );
   }
 }
--- a/browser/components/newtab/content-src/components/TopSites/TopSite.jsx
+++ b/browser/components/newtab/content-src/components/TopSites/TopSite.jsx
@@ -1,17 +1,17 @@
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
-import {FormattedMessage, injectIntl} from "react-intl";
 import {
   MIN_CORNER_FAVICON_SIZE,
   MIN_RICH_FAVICON_SIZE,
   TOP_SITES_CONTEXT_MENU_OPTIONS,
   TOP_SITES_SEARCH_SHORTCUTS_CONTEXT_MENU_OPTIONS,
   TOP_SITES_SOURCE,
 } from "./TopSitesConstants";
+import {injectIntl} from "react-intl";
 import {LinkMenu} from "content-src/components/LinkMenu/LinkMenu";
 import React from "react";
 import {ScreenshotUtils} from "content-src/lib/screenshot-utils";
 import {TOP_SITES_MAX_SITES_PER_ROW} from "common/Reducers.jsm";
 
 export class TopSiteLink extends React.PureComponent {
   constructor(props) {
     super(props);
@@ -276,21 +276,21 @@ export class TopSite extends React.PureC
 
   render() {
     const {props} = this;
     const {link} = props;
     const isContextMenuOpen = this.state.showContextMenu && props.activeIndex === props.index;
     const title = link.label || link.hostname;
     return (<TopSiteLink {...props} onClick={this.onLinkClick} onDragEvent={this.props.onDragEvent} className={`${props.className || ""}${isContextMenuOpen ? " active" : ""}`} title={title}>
         <div>
-          <button aria-haspopup="true" className="context-menu-button icon" title={this.props.intl.formatMessage({id: "context_menu_title"})} onClick={this.onMenuButtonClick}>
-            <span className="sr-only">
-              <FormattedMessage id="context_menu_button_sr" values={{title}} />
-            </span>
-          </button>
+          <button aria-haspopup="true"
+            className="context-menu-button icon"
+            data-l10n-id="newtab-menu-content-tooltip"
+            data-l10n-args={`{ "title": "${title}" }`}
+            onClick={this.onMenuButtonClick} />
           {isContextMenuOpen &&
             <LinkMenu
               dispatch={props.dispatch}
               index={props.index}
               onUpdate={this.onMenuUpdate}
               options={link.searchTopSite ? TOP_SITES_SEARCH_SHORTCUTS_CONTEXT_MENU_OPTIONS : TOP_SITES_CONTEXT_MENU_OPTIONS}
               site={link}
               siteInfo={this._getTelemetryInfo()}
@@ -314,17 +314,17 @@ export class TopSitePlaceholder extends 
   onEditButtonClick() {
     this.props.dispatch(
       {type: at.TOP_SITES_EDIT, data: {index: this.props.index}});
   }
 
   render() {
     return (<TopSiteLink {...this.props} className={`placeholder ${this.props.className || ""}`} isDraggable={false}>
       <button aria-haspopup="true" className="context-menu-button edit-button icon"
-       title={this.props.intl.formatMessage({id: "edit_topsites_edit_button"})}
+       data-l10n-id="newtab-menu-topsites-placeholder-tooltip"
        onClick={this.onEditButtonClick} />
     </TopSiteLink>);
   }
 }
 
 export class _TopSiteList extends React.PureComponent {
   static get DEFAULT_STATE() {
     return {
--- a/browser/components/newtab/content-src/components/TopSites/TopSiteForm.jsx
+++ b/browser/components/newtab/content-src/components/TopSites/TopSiteForm.jsx
@@ -1,11 +1,10 @@
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
 import {A11yLinkButton} from "content-src/components/A11yLinkButton/A11yLinkButton";
-import {FormattedMessage} from "react-intl";
 import React from "react";
 import {TOP_SITES_SOURCE} from "./TopSitesConstants";
 import {TopSiteFormInput} from "./TopSiteFormInput";
 import {TopSiteLink} from "./TopSite";
 
 export class TopSiteForm extends React.PureComponent {
   constructor(props) {
     super(props);
@@ -159,33 +158,31 @@ export class TopSiteForm extends React.P
     const requestFailed = this.props.previewResponse === "";
     const validationError = (this.state.validationError && !this.validateCustomScreenshotUrl()) || requestFailed;
     // Set focus on error if the url field is valid or when the input is first rendered and is empty
     const shouldFocus = (validationError && this.validateUrl(this.state.url)) || !customScreenshotUrl;
     const isLoading = this.props.previewResponse === null &&
       customScreenshotUrl && this.props.previewUrl === this.cleanUrl(customScreenshotUrl);
 
     if (!this.state.showCustomScreenshotForm) {
-      return (<A11yLinkButton onClick={this.onEnableScreenshotUrlForm} className="enable-custom-image-input">
-                <FormattedMessage id="topsites_form_use_image_link" />
-              </A11yLinkButton>);
+      return (<A11yLinkButton onClick={this.onEnableScreenshotUrlForm} className="enable-custom-image-input"
+          data-l10n-id="newtab-topsites-use-image-link" />);
     }
     return (<div className="custom-image-input-container">
       <TopSiteFormInput
-        errorMessageId={requestFailed ? "topsites_form_image_validation" : "topsites_form_url_validation"}
+        errorMessageId={requestFailed ? "newtab-topsites-image-validation" : "newtab-topsites-url-validation"}
         loading={isLoading}
         onChange={this.onCustomScreenshotUrlChange}
         onClear={this.onClearScreenshotInput}
         shouldFocus={shouldFocus}
         typeUrl={true}
         value={customScreenshotUrl}
         validationError={validationError}
-        titleId="topsites_form_image_url_label"
-        placeholderId="topsites_form_url_placeholder"
-        intl={this.props.intl} />
+        titleId="newtab-topsites-image-url-label"
+        placeholderId="newtab-topsites-url-input" />
     </div>);
   }
 
   render() {
     const {customScreenshotUrl} = this.state;
     const requestFailed = this.props.previewResponse === "";
     // For UI purposes, editing without an existing link is "add"
     const showAsAdd = !this.props.site;
@@ -199,54 +196,47 @@ export class TopSiteForm extends React.P
       previewLink.screenshot = this.props.previewResponse;
       previewLink.customScreenshotURL = this.props.previewUrl;
     }
     // Handles the form submit so an enter press performs the correct action
     const onSubmit = previewMode ? this.onPreviewButtonClick : this.onDoneButtonClick;
     return (
       <form className="topsite-form" onSubmit={onSubmit}>
         <div className="form-input-container">
-          <h3 className="section-title">
-            <FormattedMessage id={showAsAdd ? "topsites_form_add_header" : "topsites_form_edit_header"} />
-          </h3>
+          <h3 className="section-title grey-title" data-l10n-id={showAsAdd ? "newtab-topsites-add-topsites-header" : "newtab-topsites-edit-topsites-header"} />
           <div className="fields-and-preview">
             <div className="form-wrapper">
               <TopSiteFormInput onChange={this.onLabelChange}
                 value={this.state.label}
-                titleId="topsites_form_title_label"
-                placeholderId="topsites_form_title_placeholder"
-                intl={this.props.intl} />
+                titleId="newtab-topsites-title-label"
+                placeholderId="newtab-topsites-title-input" />
               <TopSiteFormInput onChange={this.onUrlChange}
                 shouldFocus={this.state.validationError && !this.validateUrl(this.state.url)}
                 value={this.state.url}
                 onClear={this.onClearUrlClick}
                 validationError={this.state.validationError && !this.validateUrl(this.state.url)}
-                titleId="topsites_form_url_label"
+                titleId="newtab-topsites-url-label"
                 typeUrl={true}
-                placeholderId="topsites_form_url_placeholder"
-                errorMessageId="topsites_form_url_validation"
-                intl={this.props.intl} />
+                placeholderId="newtab-topsites-url-input"
+                errorMessageId="newtab-topsites-url-validation" />
               {this._renderCustomScreenshotInput()}
             </div>
             <TopSiteLink link={previewLink}
               defaultStyle={requestFailed}
               title={this.state.label} />
           </div>
         </div>
         <section className="actions">
-          <button className="cancel" type="button" onClick={this.onCancelButtonClick} >
-            <FormattedMessage id="topsites_form_cancel_button" />
-          </button>
+          <button className="cancel" type="button" onClick={this.onCancelButtonClick}
+            data-l10n-id="newtab-topsites-cancel-button" />
           {previewMode ?
-            <button className="done preview" type="submit" >
-              <FormattedMessage id="topsites_form_preview_button" />
-            </button> :
-            <button className="done" type="submit" >
-              <FormattedMessage id={showAsAdd ? "topsites_form_add_button" : "topsites_form_save_button"} />
-            </button>}
+            <button className="done preview" type="submit" data-l10n-id="newtab-topsites-preview-button" /> :
+            <button className="done" type="submit"
+              data-l10n-id={showAsAdd ? "newtab-topsites-add-button" : "newtab-topsites-save-button"} />
+          }
         </section>
       </form>
     );
   }
 }
 
 TopSiteForm.defaultProps = {
   site: null,
--- a/browser/components/newtab/content-src/components/TopSites/TopSiteFormInput.jsx
+++ b/browser/components/newtab/content-src/components/TopSites/TopSiteFormInput.jsx
@@ -1,9 +1,8 @@
-import {FormattedMessage} from "react-intl";
 import React from "react";
 
 export class TopSiteFormInput extends React.PureComponent {
   constructor(props) {
     super(props);
     this.state = {validationError: this.props.validationError};
     this.onChange = this.onChange.bind(this);
     this.onMount = this.onMount.bind(this);
@@ -55,32 +54,32 @@ export class TopSiteFormInput extends Re
     }
     return null;
   }
 
   render() {
     const {typeUrl} = this.props;
     const {validationError} = this.state;
 
-    return (<label><FormattedMessage id={this.props.titleId} />
+    return (<label>
+      <span data-l10n-id={this.props.titleId} />
       <div className={`field ${typeUrl ? "url" : ""}${validationError ? " invalid" : ""}`}>
         <input type="text"
           value={this.props.value}
           ref={this.onMount}
           onChange={this.onChange}
-          placeholder={this.props.intl.formatMessage({id: this.props.placeholderId})}
+          data-l10n-id={this.props.placeholderId}
           // Set focus on error if the url field is valid or when the input is first rendered and is empty
           // eslint-disable-next-line jsx-a11y/no-autofocus
           autoFocus={this.props.shouldFocus}
           disabled={this.props.loading} />
         {this.renderLoadingOrCloseButton()}
         {validationError &&
-          <aside className="error-tooltip">
-            <FormattedMessage id={this.props.errorMessageId} />
-          </aside>}
+          <aside className="error-tooltip" data-l10n-id={this.props.errorMessageId} />
+          }
       </div>
     </label>);
   }
 }
 
 TopSiteFormInput.defaultProps = {
   showClearButton: false,
   value: "",
--- a/browser/components/newtab/content-src/components/TopSites/TopSites.jsx
+++ b/browser/components/newtab/content-src/components/TopSites/TopSites.jsx
@@ -1,14 +1,13 @@
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
 import {MIN_CORNER_FAVICON_SIZE, MIN_RICH_FAVICON_SIZE, TOP_SITES_SOURCE} from "./TopSitesConstants";
 import {CollapsibleSection} from "content-src/components/CollapsibleSection/CollapsibleSection";
 import {ComponentPerfTimer} from "content-src/components/ComponentPerfTimer/ComponentPerfTimer";
 import {connect} from "react-redux";
-import {injectIntl} from "react-intl";
 import {ModalOverlayWrapper} from "../../asrouter/components/ModalOverlay/ModalOverlay";
 import React from "react";
 import {SearchShortcutsForm} from "./SearchShortcutsForm";
 import {TOP_SITES_MAX_SITES_PER_ROW} from "common/Reducers.jsm";
 import {TopSiteForm} from "./TopSiteForm";
 import {TopSiteList} from "./TopSite";
 
 function topSiteIconType(link) {
@@ -122,17 +121,17 @@ export class _TopSites extends React.Pur
       extraMenuOptions.push("AddSearchShortcut");
     }
 
     return (<ComponentPerfTimer id="topsites" initialized={props.TopSites.initialized} dispatch={props.dispatch}>
       <CollapsibleSection
         className="top-sites"
         icon="topsites"
         id="topsites"
-        title={this.props.title || {id: "header_top_sites"}}
+        title={this.props.title || {id: "newtab-section-header-topsites"}}
         extraMenuOptions={extraMenuOptions}
         showPrefName="feeds.topsites"
         eventSource={TOP_SITES_SOURCE}
         collapsed={props.TopSites.pref ? props.TopSites.pref.collapsed : undefined}
         isFixed={props.isFixed}
         isFirst={props.isFirst}
         isLast={props.isLast}
         dispatch={props.dispatch}>
@@ -165,9 +164,9 @@ export class _TopSites extends React.Pur
     </ComponentPerfTimer>);
   }
 }
 
 export const TopSites = connect(state => ({
   TopSites: state.TopSites,
   Prefs: state.Prefs,
   TopSitesRows: state.Prefs.values.topSitesRows,
-}))(injectIntl(_TopSites));
+}))(_TopSites);
--- a/browser/components/newtab/content-src/components/Topics/Topics.jsx
+++ b/browser/components/newtab/content-src/components/Topics/Topics.jsx
@@ -1,21 +1,20 @@
-import {FormattedMessage} from "react-intl";
 import React from "react";
 
 export class Topic extends React.PureComponent {
   render() {
     const {url, name} = this.props;
     return (<li><a key={name} href={url}>{name}</a></li>);
   }
 }
 
 export class Topics extends React.PureComponent {
   render() {
     const {topics} = this.props;
     return (
       <span className="topics">
-        <span><FormattedMessage id="pocket_read_more" /></span>
+        <span data-l10n-id="newtab-pocket-read-more" />
         <ul>{topics && topics.map(t => <Topic key={t.name} url={t.url} name={t.name} />)}</ul>
       </span>
     );
   }
 }
--- a/browser/components/newtab/content-src/lib/link-menu-options.js
+++ b/browser/components/newtab/content-src/lib/link-menu-options.js
@@ -1,74 +1,61 @@
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
 
 const _OpenInPrivateWindow = site => ({
-  id: "menu_action_open_private_window",
+  id: "newtab-menu-open-new-private-window",
   icon: "new-window-private",
   action: ac.OnlyToMain({
     type: at.OPEN_PRIVATE_WINDOW,
     data: {url: site.url, referrer: site.referrer},
   }),
   userEvent: "OPEN_PRIVATE_WINDOW",
 });
 
-export const GetPlatformString = platform => {
-  switch (platform) {
-    case "win":
-      return "menu_action_show_file_windows";
-    case "macosx":
-      return "menu_action_show_file_mac_os";
-    case "linux":
-      return "menu_action_show_file_linux";
-    default:
-      return "menu_action_show_file_default";
-  }
-};
-
 /**
  * List of functions that return items that can be included as menu options in a
  * LinkMenu. All functions take the site as the first parameter, and optionally
  * the index of the site.
  */
 export const LinkMenuOptions = {
   Separator: () => ({type: "separator"}),
   EmptyItem: () => ({type: "empty"}),
   RemoveBookmark: site => ({
-    id: "menu_action_remove_bookmark",
+    id: "newtab-menu-remove-bookmark",
     icon: "bookmark-added",
     action: ac.AlsoToMain({
       type: at.DELETE_BOOKMARK_BY_ID,
       data: site.bookmarkGuid,
     }),
     userEvent: "BOOKMARK_DELETE",
   }),
   AddBookmark: site => ({
-    id: "menu_action_bookmark",
+    id: "newtab-menu-bookmark",
     icon: "bookmark-hollow",
     action: ac.AlsoToMain({
       type: at.BOOKMARK_URL,
       data: {url: site.url, title: site.title, type: site.type},
     }),
     userEvent: "BOOKMARK_ADD",
   }),
   OpenInNewWindow: site => ({
-    id: "menu_action_open_new_window",
+    id: "newtab-menu-open-new-window",
     icon: "new-window",
     action: ac.AlsoToMain({
       type: at.OPEN_NEW_WINDOW,
       data: {
         referrer: site.referrer,
         typedBonus: site.typedBonus,
         url: site.url,
       },
     }),
     userEvent: "OPEN_NEW_WINDOW",
   }),
   BlockUrl: (site, index, eventSource) => ({
-    id: "menu_action_dismiss",
+    id: "newtab-menu-dismiss",
     icon: "dismiss",
     action: ac.AlsoToMain({
       type: at.BLOCK_URL,
       data: {url: site.open_url || site.url, pocket_id: site.pocket_id},
     }),
     impression: ac.ImpressionStats({
       source: eventSource,
       block: 0,
@@ -80,110 +67,110 @@ export const LinkMenuOptions = {
     }),
     userEvent: "BLOCK",
   }),
 
   // This is an option for web extentions which will result in remove items from
   // memory and notify the web extenion, rather than using the built-in block list.
   WebExtDismiss: (site, index, eventSource) => ({
     id: "menu_action_webext_dismiss",
-    string_id: "menu_action_dismiss",
+    string_id: "newtab-menu-dismiss",
     icon: "dismiss",
     action: ac.WebExtEvent(at.WEBEXT_DISMISS, {
       source: eventSource,
       url: site.url,
       action_position: index,
     }),
   }),
   DeleteUrl: (site, index, eventSource, isEnabled, siteInfo) => ({
-    id: "menu_action_delete",
+    id: "newtab-menu-delete-history",
     icon: "delete",
     action: {
       type: at.DIALOG_OPEN,
       data: {
         onConfirm: [
           ac.AlsoToMain({type: at.DELETE_HISTORY_URL, data: {url: site.url, pocket_id: site.pocket_id, forceBlock: site.bookmarkGuid}}),
           ac.UserEvent(Object.assign({event: "DELETE", source: eventSource, action_position: index}, siteInfo)),
         ],
         eventSource,
-        body_string_id: ["confirm_history_delete_p1", "confirm_history_delete_notice_p2"],
-        confirm_button_string_id: "menu_action_delete",
-        cancel_button_string_id: "topsites_form_cancel_button",
+        body_string_id: ["newtab-confirm-delete-history-p1", "newtab-confirm-delete-history-p2"],
+        confirm_button_string_id: "newtab-topsites-delete-history-button",
+        cancel_button_string_id: "newtab-topsites-cancel-button",
         icon: "modal-delete",
       },
     },
     userEvent: "DIALOG_OPEN",
   }),
-  ShowFile: (site, index, eventSource, isEnabled, siteInfo, platform) => ({
-    id: GetPlatformString(platform),
+  ShowFile: site => ({
+    id: "newtab-menu-show-file",
     icon: "search",
     action: ac.OnlyToMain({
       type: at.SHOW_DOWNLOAD_FILE,
       data: {url: site.url},
     }),
   }),
   OpenFile: site => ({
-    id: "menu_action_open_file",
+    id: "newtab-menu-open-file",
     icon: "open-file",
     action: ac.OnlyToMain({
       type: at.OPEN_DOWNLOAD_FILE,
       data: {url: site.url},
     }),
   }),
   CopyDownloadLink: site => ({
-    id: "menu_action_copy_download_link",
+    id: "newtab-menu-copy-download-link",
     icon: "copy",
     action: ac.OnlyToMain({
       type: at.COPY_DOWNLOAD_LINK,
       data: {url: site.url},
     }),
   }),
   GoToDownloadPage: site => ({
-    id: "menu_action_go_to_download_page",
+    id: "newtab-menu-go-to-download-page",
     icon: "download",
     action: ac.OnlyToMain({
       type: at.OPEN_LINK,
       data: {url: site.referrer},
     }),
     disabled: !site.referrer,
   }),
   RemoveDownload: site => ({
-    id: "menu_action_remove_download",
+    id: "newtab-menu-remove-download",
     icon: "delete",
     action: ac.OnlyToMain({
       type: at.REMOVE_DOWNLOAD_FILE,
       data: {url: site.url},
     }),
   }),
   PinTopSite: ({url, searchTopSite, label}, index) => ({
-    id: "menu_action_pin",
+    id: "newtab-menu-pin",
     icon: "pin",
     action: ac.AlsoToMain({
       type: at.TOP_SITES_PIN,
       data: {
         site: {
           url,
           ...(searchTopSite && {searchTopSite, label}),
         },
         index,
       },
     }),
     userEvent: "PIN",
   }),
   UnpinTopSite: site => ({
-    id: "menu_action_unpin",
+    id: "newtab-menu-unpin",
     icon: "unpin",
     action: ac.AlsoToMain({
       type: at.TOP_SITES_UNPIN,
       data: {site: {url: site.url}},
     }),
     userEvent: "UNPIN",
   }),
   SaveToPocket: (site, index, eventSource) => ({
-    id: "menu_action_save_to_pocket",
+    id: "newtab-menu-save-to-pocket",
     icon: "pocket-save",
     action: ac.AlsoToMain({
       type: at.SAVE_TO_POCKET,
       data: {site: {url: site.url, title: site.title}},
     }),
     impression: ac.ImpressionStats({
       source: eventSource,
       pocket: 0,
@@ -191,35 +178,35 @@ export const LinkMenuOptions = {
         id: site.guid,
         pos: index,
         ...(site.shim && site.shim.save ? {shim: site.shim.save} : {}),
       }],
     }),
     userEvent: "SAVE_TO_POCKET",
   }),
   DeleteFromPocket: site => ({
-    id: "menu_action_delete_pocket",
+    id: "newtab-menu-delete-pocket",
     icon: "pocket-delete",
     action: ac.AlsoToMain({
       type: at.DELETE_FROM_POCKET,
       data: {pocket_id: site.pocket_id},
     }),
     userEvent: "DELETE_FROM_POCKET",
   }),
   ArchiveFromPocket: site => ({
-    id: "menu_action_archive_pocket",
+    id: "newtab-menu-archive-pocket",
     icon: "pocket-archive",
     action: ac.AlsoToMain({
       type: at.ARCHIVE_FROM_POCKET,
       data: {pocket_id: site.pocket_id},
     }),
     userEvent: "ARCHIVE_FROM_POCKET",
   }),
   EditTopSite: (site, index) => ({
-    id: "edit_topsites_button_text",
+    id: "newtab-menu-edit-topsites",
     icon: "edit",
     action: {
       type: at.TOP_SITES_EDIT,
       data: {index},
     },
   }),
   CheckBookmark: site => (site.bookmarkGuid ? LinkMenuOptions.RemoveBookmark(site) : LinkMenuOptions.AddBookmark(site)),
   CheckPinTopSite: (site, index) => (site.isPinned ? LinkMenuOptions.UnpinTopSite(site) : LinkMenuOptions.PinTopSite(site, index)),
--- a/browser/components/newtab/content-src/lib/section-menu-options.js
+++ b/browser/components/newtab/content-src/lib/section-menu-options.js
@@ -2,78 +2,78 @@ import {actionCreators as ac, actionType
 
 /**
  * List of functions that return items that can be included as menu options in a
  * SectionMenu. All functions take the section as the only parameter.
  */
 export const SectionMenuOptions = {
   Separator: () => ({type: "separator"}),
   MoveUp: section => ({
-    id: "section_menu_action_move_up",
+    id: "newtab-section-menu-move-up",
     icon: "arrowhead-up",
     action: ac.OnlyToMain({
       type: at.SECTION_MOVE,
       data: {id: section.id, direction: -1},
     }),
     userEvent: "MENU_MOVE_UP",
     disabled: !!section.isFirst,
   }),
   MoveDown: section => ({
-    id: "section_menu_action_move_down",
+    id: "newtab-section-menu-move-down",
     icon: "arrowhead-down",
     action: ac.OnlyToMain({
       type: at.SECTION_MOVE,
       data: {id: section.id, direction: +1},
     }),
     userEvent: "MENU_MOVE_DOWN",
     disabled: !!section.isLast,
   }),
   RemoveSection: section => ({
-    id: "section_menu_action_remove_section",
+    id: "newtab-section-menu-remove-section",
     icon: "dismiss",
     action: ac.SetPref(section.showPrefName, false),
     userEvent: "MENU_REMOVE",
   }),
   CollapseSection: section => ({
-    id: "section_menu_action_collapse_section",
+    id: "newtab-section-menu-collapse-section",
     icon: "minimize",
     action: ac.OnlyToMain({type: at.UPDATE_SECTION_PREFS, data: {id: section.id, value: {collapsed: true}}}),
     userEvent: "MENU_COLLAPSE",
   }),
   ExpandSection: section => ({
-    id: "section_menu_action_expand_section",
+    id: "newtab-section-menu-expand-section",
     icon: "maximize",
     action: ac.OnlyToMain({type: at.UPDATE_SECTION_PREFS, data: {id: section.id, value: {collapsed: false}}}),
     userEvent: "MENU_EXPAND",
   }),
   ManageSection: section => ({
-    id: "section_menu_action_manage_section",
+    id: "newtab-section-menu-manage-section",
     icon: "settings",
     action: ac.OnlyToMain({type: at.SETTINGS_OPEN}),
     userEvent: "MENU_MANAGE",
   }),
   ManageWebExtension: section => ({
-    id: "section_menu_action_manage_webext",
+    id: "newtab-section-menu-manage-webext",
     icon: "settings",
     action: ac.OnlyToMain({type: at.OPEN_WEBEXT_SETTINGS, data: section.id}),
   }),
   AddTopSite: section => ({
-    id: "section_menu_action_add_topsite",
+    id: "newtab-section-menu-add-topsite",
     icon: "add",
     action: {type: at.TOP_SITES_EDIT, data: {index: -1}},
     userEvent: "MENU_ADD_TOPSITE",
   }),
   AddSearchShortcut: section => ({
-    id: "section_menu_action_add_search_engine",
+    id: "newtab-section-menu-add-search-engine",
     icon: "search",
     action: {type: at.TOP_SITES_OPEN_SEARCH_SHORTCUTS_MODAL},
     userEvent: "MENU_ADD_SEARCH",
   }),
   PrivacyNotice: section => ({
-    id: "section_menu_action_privacy_notice",
+    id: "newtab-section-menu-privacy-notice",
     icon: "info",
     action: ac.OnlyToMain({
       type: at.OPEN_LINK,
       data: {url: section.privacyNoticeURL},
     }),
     userEvent: "MENU_PRIVACY_NOTICE",
   }),
   CheckCollapsed: section => (section.collapsed ? SectionMenuOptions.ExpandSection(section) : SectionMenuOptions.CollapseSection(section)),
--- a/browser/components/newtab/content-src/styles/_activity-stream.scss
+++ b/browser/components/newtab/content-src/styles/_activity-stream.scss
@@ -31,28 +31,16 @@ h1,
 h2 {
   font-weight: normal;
 }
 
 a {
   text-decoration: none;
 }
 
-// For screen readers
-.sr-only {
-  border: 0;
-  clip: rect(0, 0, 0, 0);
-  height: 1px;
-  margin: -1px;
-  overflow: hidden;
-  padding: 0;
-  position: absolute;
-  width: 1px;
-}
-
 .inner-border {
   border: $border-secondary;
   border-radius: $border-radius;
   height: 100%;
   left: 0;
   pointer-events: none;
   position: absolute;
   top: 0;
--- a/browser/components/newtab/css/activity-stream-linux.css
+++ b/browser/components/newtab/css/activity-stream-linux.css
@@ -271,26 +271,16 @@ body {
 
 h1,
 h2 {
   font-weight: normal; }
 
 a {
   text-decoration: none; }
 
-.sr-only {
-  border: 0;
-  clip: rect(0, 0, 0, 0);
-  height: 1px;
-  margin: -1px;
-  overflow: hidden;
-  padding: 0;
-  position: absolute;
-  width: 1px; }
-
 .inner-border {
   border: 1px solid var(--newtab-border-secondary-color);
   border-radius: 3px;
   height: 100%;
   left: 0;
   pointer-events: none;
   position: absolute;
   top: 0;
@@ -1578,16 +1568,17 @@ main {
   padding: 10px 25px;
   transition-delay: 100ms;
   transition-duration: 100ms;
   transition-property: background-color; }
   .collapsible-section .section-title {
     font-size: 13px;
     font-weight: bold;
     margin: 0; }
+    .collapsible-section .section-title.grey-title,
     .collapsible-section .section-title span {
       color: var(--newtab-section-header-text-color);
       display: inline-block;
       fill: var(--newtab-section-header-text-color);
       vertical-align: middle; }
     .collapsible-section .section-title .click-target-container {
       vertical-align: top; }
       @media (max-width: 609px) {
@@ -1617,17 +1608,17 @@ main {
       inset-inline-end: 0;
       opacity: 0;
       position: absolute;
       top: 0;
       transition-duration: 200ms;
       transition-property: opacity;
       width: 27px; }
       .collapsible-section .section-top-bar .context-menu-button:-moz-any(:active, :focus, :hover) {
-        fill: #0C0C0D;
+        fill: var(--newtab-section-header-text-color);
         opacity: 1; }
     .collapsible-section .section-top-bar .context-menu {
       top: 16px; }
     @media (max-width: 1458px) {
       .collapsible-section .section-top-bar .context-menu {
         margin-inline-end: 5px;
         margin-inline-start: auto;
         inset-inline-end: 0;
@@ -1637,17 +1628,17 @@ main {
   .collapsible-section.active {
     background: var(--newtab-element-hover-color);
     border-radius: 4px; }
     .collapsible-section.active .section-top-bar .context-menu-button {
       fill: var(--newtab-section-active-contextmenu-color); }
   .collapsible-section .learn-more-link {
     font-size: 11px;
     margin-inline-start: 12px; }
-    .collapsible-section .learn-more-link a span {
+    .collapsible-section .learn-more-link a {
       color: var(--newtab-link-secondary-color); }
   .collapsible-section .section-body-fallback {
     height: 266px; }
   .collapsible-section .section-body {
     margin: 0 -7px;
     padding: 0 7px; }
     .collapsible-section .section-body.animating {
       overflow: hidden;
@@ -1909,20 +1900,20 @@ main {
   .ds-layout .section-title span .icon {
     fill: var(--newtab-text-secondary-color); }
 
 .collapsible-section.ds-layout {
   margin: auto;
   width: 986px; }
   .collapsible-section.ds-layout .section-top-bar {
     margin-bottom: 0; }
-    .collapsible-section.ds-layout .section-top-bar .learn-more-link a span {
+    .collapsible-section.ds-layout .section-top-bar .learn-more-link a {
       color: var(--newtab-link-primary-color);
       font-weight: normal; }
-      .collapsible-section.ds-layout .section-top-bar .learn-more-link a span:-moz-any(:focus, :hover) {
+      .collapsible-section.ds-layout .section-top-bar .learn-more-link a:-moz-any(:focus, :hover) {
         text-decoration: underline; }
 
 .ds-card-grid {
   display: grid;
   grid-gap: 24px;
   margin: 16px 0; }
   .ds-card-grid .ds-card {
     background: #FFF;
@@ -2678,17 +2669,19 @@ main {
       transition: box-shadow 150ms;
       border-radius: 4px;
       outline: none; }
     .ds-card:not(.placeholder):hover .ds-card-link header {
       color: #0060DF; }
       [lwt-newtab-brighttext] .ds-card:not(.placeholder):hover .ds-card-link header {
         color: #45A1FF; }
   .ds-card .ds-card-link {
-    height: 100%; }
+    height: 100%;
+    display: flex;
+    flex-direction: column; }
     .ds-card .ds-card-link:focus {
       box-shadow: 0 0 0 5px rgba(10, 132, 255, 0.3);
       transition: box-shadow 150ms;
       border-radius: 4px;
       outline: none; }
       [lwt-newtab-brighttext] .ds-card .ds-card-link:focus {
         box-shadow: 0 0 0 5px rgba(69, 161, 255, 0.4);
         transition: box-shadow 150ms;
@@ -2700,20 +2693,22 @@ main {
           color: #45A1FF; }
     .ds-card .ds-card-link:active header {
       color: #003EAA; }
       [lwt-newtab-brighttext] .ds-card .ds-card-link:active header {
         color: #0A84FF; }
   .ds-card .meta {
     display: flex;
     flex-direction: column;
-    padding: 12px 16px; }
+    padding: 12px 16px;
+    flex-grow: 1; }
     .ds-card .meta .info-wrap {
-      flex-grow: 1;
-      margin: 0 0 12px; }
+      flex-grow: 1; }
+    .ds-card .meta .context {
+      margin: 12px 0 0; }
     .ds-card .meta .title {
       font-size: 17px;
       -webkit-line-clamp: 3;
       line-height: 24px;
       font-weight: 600; }
     .ds-card .meta .excerpt {
       font-size: 14px;
       -webkit-line-clamp: 3;
--- a/browser/components/newtab/css/activity-stream-mac.css
+++ b/browser/components/newtab/css/activity-stream-mac.css
@@ -274,26 +274,16 @@ body {
 
 h1,
 h2 {
   font-weight: normal; }
 
 a {
   text-decoration: none; }
 
-.sr-only {
-  border: 0;
-  clip: rect(0, 0, 0, 0);
-  height: 1px;
-  margin: -1px;
-  overflow: hidden;
-  padding: 0;
-  position: absolute;
-  width: 1px; }
-
 .inner-border {
   border: 1px solid var(--newtab-border-secondary-color);
   border-radius: 3px;
   height: 100%;
   left: 0;
   pointer-events: none;
   position: absolute;
   top: 0;
@@ -1581,16 +1571,17 @@ main {
   padding: 10px 25px;
   transition-delay: 100ms;
   transition-duration: 100ms;
   transition-property: background-color; }
   .collapsible-section .section-title {
     font-size: 13px;
     font-weight: bold;
     margin: 0; }
+    .collapsible-section .section-title.grey-title,
     .collapsible-section .section-title span {
       color: var(--newtab-section-header-text-color);
       display: inline-block;
       fill: var(--newtab-section-header-text-color);
       vertical-align: middle; }
     .collapsible-section .section-title .click-target-container {
       vertical-align: top; }
       @media (max-width: 609px) {
@@ -1620,17 +1611,17 @@ main {
       inset-inline-end: 0;
       opacity: 0;
       position: absolute;
       top: 0;
       transition-duration: 200ms;
       transition-property: opacity;
       width: 27px; }
       .collapsible-section .section-top-bar .context-menu-button:-moz-any(:active, :focus, :hover) {
-        fill: #0C0C0D;
+        fill: var(--newtab-section-header-text-color);
         opacity: 1; }
     .collapsible-section .section-top-bar .context-menu {
       top: 16px; }
     @media (max-width: 1458px) {
       .collapsible-section .section-top-bar .context-menu {
         margin-inline-end: 5px;
         margin-inline-start: auto;
         inset-inline-end: 0;
@@ -1640,17 +1631,17 @@ main {
   .collapsible-section.active {
     background: var(--newtab-element-hover-color);
     border-radius: 4px; }
     .collapsible-section.active .section-top-bar .context-menu-button {
       fill: var(--newtab-section-active-contextmenu-color); }
   .collapsible-section .learn-more-link {
     font-size: 11px;
     margin-inline-start: 12px; }
-    .collapsible-section .learn-more-link a span {
+    .collapsible-section .learn-more-link a {
       color: var(--newtab-link-secondary-color); }
   .collapsible-section .section-body-fallback {
     height: 266px; }
   .collapsible-section .section-body {
     margin: 0 -7px;
     padding: 0 7px; }
     .collapsible-section .section-body.animating {
       overflow: hidden;
@@ -1912,20 +1903,20 @@ main {
   .ds-layout .section-title span .icon {
     fill: var(--newtab-text-secondary-color); }
 
 .collapsible-section.ds-layout {
   margin: auto;
   width: 986px; }
   .collapsible-section.ds-layout .section-top-bar {
     margin-bottom: 0; }
-    .collapsible-section.ds-layout .section-top-bar .learn-more-link a span {
+    .collapsible-section.ds-layout .section-top-bar .learn-more-link a {
       color: var(--newtab-link-primary-color);
       font-weight: normal; }
-      .collapsible-section.ds-layout .section-top-bar .learn-more-link a span:-moz-any(:focus, :hover) {
+      .collapsible-section.ds-layout .section-top-bar .learn-more-link a:-moz-any(:focus, :hover) {
         text-decoration: underline; }
 
 .ds-card-grid {
   display: grid;
   grid-gap: 24px;
   margin: 16px 0; }
   .ds-card-grid .ds-card {
     background: #FFF;
@@ -2681,17 +2672,19 @@ main {
       transition: box-shadow 150ms;
       border-radius: 4px;
       outline: none; }
     .ds-card:not(.placeholder):hover .ds-card-link header {
       color: #0060DF; }
       [lwt-newtab-brighttext] .ds-card:not(.placeholder):hover .ds-card-link header {
         color: #45A1FF; }
   .ds-card .ds-card-link {
-    height: 100%; }
+    height: 100%;
+    display: flex;
+    flex-direction: column; }
     .ds-card .ds-card-link:focus {
       box-shadow: 0 0 0 5px rgba(10, 132, 255, 0.3);
       transition: box-shadow 150ms;
       border-radius: 4px;
       outline: none; }
       [lwt-newtab-brighttext] .ds-card .ds-card-link:focus {
         box-shadow: 0 0 0 5px rgba(69, 161, 255, 0.4);
         transition: box-shadow 150ms;
@@ -2703,20 +2696,22 @@ main {
           color: #45A1FF; }
     .ds-card .ds-card-link:active header {
       color: #003EAA; }
       [lwt-newtab-brighttext] .ds-card .ds-card-link:active header {
         color: #0A84FF; }
   .ds-card .meta {
     display: flex;
     flex-direction: column;
-    padding: 12px 16px; }
+    padding: 12px 16px;
+    flex-grow: 1; }
     .ds-card .meta .info-wrap {
-      flex-grow: 1;
-      margin: 0 0 12px; }
+      flex-grow: 1; }
+    .ds-card .meta .context {
+      margin: 12px 0 0; }
     .ds-card .meta .title {
       font-size: 17px;
       -webkit-line-clamp: 3;
       line-height: 24px;
       font-weight: 600; }
     .ds-card .meta .excerpt {
       font-size: 14px;
       -webkit-line-clamp: 3;
--- a/browser/components/newtab/css/activity-stream-windows.css
+++ b/browser/components/newtab/css/activity-stream-windows.css
@@ -271,26 +271,16 @@ body {
 
 h1,
 h2 {
   font-weight: normal; }
 
 a {
   text-decoration: none; }
 
-.sr-only {
-  border: 0;
-  clip: rect(0, 0, 0, 0);
-  height: 1px;
-  margin: -1px;
-  overflow: hidden;
-  padding: 0;
-  position: absolute;
-  width: 1px; }
-
 .inner-border {
   border: 1px solid var(--newtab-border-secondary-color);
   border-radius: 3px;
   height: 100%;
   left: 0;
   pointer-events: none;
   position: absolute;
   top: 0;
@@ -1578,16 +1568,17 @@ main {
   padding: 10px 25px;
   transition-delay: 100ms;
   transition-duration: 100ms;
   transition-property: background-color; }
   .collapsible-section .section-title {
     font-size: 13px;
     font-weight: bold;
     margin: 0; }
+    .collapsible-section .section-title.grey-title,
     .collapsible-section .section-title span {
       color: var(--newtab-section-header-text-color);
       display: inline-block;
       fill: var(--newtab-section-header-text-color);
       vertical-align: middle; }
     .collapsible-section .section-title .click-target-container {
       vertical-align: top; }
       @media (max-width: 609px) {
@@ -1617,17 +1608,17 @@ main {
       inset-inline-end: 0;
       opacity: 0;
       position: absolute;
       top: 0;
       transition-duration: 200ms;
       transition-property: opacity;
       width: 27px; }
       .collapsible-section .section-top-bar .context-menu-button:-moz-any(:active, :focus, :hover) {
-        fill: #0C0C0D;
+        fill: var(--newtab-section-header-text-color);
         opacity: 1; }
     .collapsible-section .section-top-bar .context-menu {
       top: 16px; }
     @media (max-width: 1458px) {
       .collapsible-section .section-top-bar .context-menu {
         margin-inline-end: 5px;
         margin-inline-start: auto;
         inset-inline-end: 0;
@@ -1637,17 +1628,17 @@ main {
   .collapsible-section.active {
     background: var(--newtab-element-hover-color);
     border-radius: 4px; }
     .collapsible-section.active .section-top-bar .context-menu-button {
       fill: var(--newtab-section-active-contextmenu-color); }
   .collapsible-section .learn-more-link {
     font-size: 11px;
     margin-inline-start: 12px; }
-    .collapsible-section .learn-more-link a span {
+    .collapsible-section .learn-more-link a {
       color: var(--newtab-link-secondary-color); }
   .collapsible-section .section-body-fallback {
     height: 266px; }
   .collapsible-section .section-body {
     margin: 0 -7px;
     padding: 0 7px; }
     .collapsible-section .section-body.animating {
       overflow: hidden;
@@ -1909,20 +1900,20 @@ main {
   .ds-layout .section-title span .icon {
     fill: var(--newtab-text-secondary-color); }
 
 .collapsible-section.ds-layout {
   margin: auto;
   width: 986px; }
   .collapsible-section.ds-layout .section-top-bar {
     margin-bottom: 0; }
-    .collapsible-section.ds-layout .section-top-bar .learn-more-link a span {
+    .collapsible-section.ds-layout .section-top-bar .learn-more-link a {
       color: var(--newtab-link-primary-color);
       font-weight: normal; }
-      .collapsible-section.ds-layout .section-top-bar .learn-more-link a span:-moz-any(:focus, :hover) {
+      .collapsible-section.ds-layout .section-top-bar .learn-more-link a:-moz-any(:focus, :hover) {
         text-decoration: underline; }
 
 .ds-card-grid {
   display: grid;
   grid-gap: 24px;
   margin: 16px 0; }
   .ds-card-grid .ds-card {
     background: #FFF;
@@ -2678,17 +2669,19 @@ main {
       transition: box-shadow 150ms;
       border-radius: 4px;
       outline: none; }
     .ds-card:not(.placeholder):hover .ds-card-link header {
       color: #0060DF; }
       [lwt-newtab-brighttext] .ds-card:not(.placeholder):hover .ds-card-link header {
         color: #45A1FF; }
   .ds-card .ds-card-link {
-    height: 100%; }
+    height: 100%;
+    display: flex;
+    flex-direction: column; }
     .ds-card .ds-card-link:focus {
       box-shadow: 0 0 0 5px rgba(10, 132, 255, 0.3);
       transition: box-shadow 150ms;
       border-radius: 4px;
       outline: none; }
       [lwt-newtab-brighttext] .ds-card .ds-card-link:focus {
         box-shadow: 0 0 0 5px rgba(69, 161, 255, 0.4);
         transition: box-shadow 150ms;
@@ -2700,20 +2693,22 @@ main {
           color: #45A1FF; }
     .ds-card .ds-card-link:active header {
       color: #003EAA; }
       [lwt-newtab-brighttext] .ds-card .ds-card-link:active header {
         color: #0A84FF; }
   .ds-card .meta {
     display: flex;
     flex-direction: column;
-    padding: 12px 16px; }
+    padding: 12px 16px;
+    flex-grow: 1; }
     .ds-card .meta .info-wrap {
-      flex-grow: 1;
-      margin: 0 0 12px; }
+      flex-grow: 1; }
+    .ds-card .meta .context {
+      margin: 12px 0 0; }
     .ds-card .meta .title {
       font-size: 17px;
       -webkit-line-clamp: 3;
       line-height: 24px;
       font-weight: 600; }
     .ds-card .meta .excerpt {
       font-size: 14px;
       -webkit-line-clamp: 3;
--- a/browser/components/newtab/data/content/activity-stream.bundle.js
+++ b/browser/components/newtab/data/content/activity-stream.bundle.js
@@ -87,25 +87,25 @@
 /******/ ([
 /* 0 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var content_src_components_Base_Base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
-/* harmony import */ var content_src_lib_detect_user_session_start__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(50);
+/* harmony import */ var content_src_lib_detect_user_session_start__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(49);
 /* harmony import */ var content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(25);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_4__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(10);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);
 /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(15);
 /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_6__);
-/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(55);
+/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(54);
 
 
 
 
 
 
 
 
@@ -558,47 +558,47 @@ var actionUtils = {
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
 /* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
 /* harmony import */ var content_src_components_ASRouterAdmin_ASRouterAdmin__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5);
 /* harmony import */ var _asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);
 /* harmony import */ var content_src_components_ConfirmDialog_ConfirmDialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(28);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_5__);
-/* harmony import */ var content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(51);
-/* harmony import */ var content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(34);
+/* harmony import */ var content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(50);
+/* harmony import */ var content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(32);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(10);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__);
-/* harmony import */ var content_src_components_Search_Search__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(49);
-/* harmony import */ var content_src_components_Sections_Sections__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(38);
+/* harmony import */ var content_src_components_Search_Search__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(48);
+/* harmony import */ var content_src_components_Sections_Sections__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(37);
 function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
 
 
 
 
 
 
 
 
 
 
 
 
-const PrefsButton = Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["injectIntl"])(props => react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", {
+
+const PrefsButton = props => react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", {
   className: "prefs-button"
 }, react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("button", {
   className: "icon icon-settings",
   onClick: props.onClick,
-  title: props.intl.formatMessage({
-    id: "settings_pane_button_label"
-  })
-}))); // Add the locale data for pluralization and relative-time formatting for now,
+  "data-l10n-id": "newtab-settings-button"
+})); // Add the locale data for pluralization and relative-time formatting for now,
 // this just uses english locale data. We can make this more sophisticated if
 // more features are needed.
 
+
 function addLocaleDataForReactIntl(locale) {
   Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["addLocaleData"])([{
     locale,
     parentLocale: "en"
   }]);
 } // Returns a function will not be continuously triggered when called. The
 // function will be triggered if called again after `wait` milliseconds.
 
@@ -1702,21 +1702,20 @@ class CollapseToggle extends react__WEBP
     const {
       renderAdmin
     } = this;
     const isCollapsed = this.state.collapsed || !renderAdmin;
     const label = `${isCollapsed ? "Expand" : "Collapse"} devtools`;
     return react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_4___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("a", {
       href: "#devtools",
       title: label,
+      "aria-label": label,
       className: `asrouter-toggle ${isCollapsed ? "collapsed" : "expanded"}`,
       onClick: this.renderAdmin ? this.onCollapseToggle : null
     }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("span", {
-      className: "sr-only"
-    }, label), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("span", {
       className: "icon icon-devtools"
     })), renderAdmin ? react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ASRouterAdminInner, _extends({}, props, {
       collapsed: this.state.collapsed
     })) : null);
   }
 
 }
 
@@ -1736,27 +1735,27 @@ const ASRouterAdmin = Object(react_redux
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterUtils", function() { return ASRouterUtils; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterUISurface", function() { return ASRouterUISurface; });
 /* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);
 /* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_0__);
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
 /* harmony import */ var content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7);
-/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(54);
+/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(53);
 /* harmony import */ var _components_ImpressionsWrapper_ImpressionsWrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9);
-/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(52);
+/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(51);
 /* harmony import */ var content_src_lib_constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(12);
 /* harmony import */ var _templates_OnboardingMessage_OnboardingMessage__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(13);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(10);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__);
 /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(15);
 /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_9__);
 /* harmony import */ var _templates_ReturnToAMO_ReturnToAMO__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(16);
-/* harmony import */ var _templates_template_manifest__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(53);
+/* harmony import */ var _templates_template_manifest__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(52);
 /* harmony import */ var _templates_StartupOverlay_StartupOverlay__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(24);
 /* harmony import */ var _templates_Trailhead_Trailhead__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(26);
 function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
 
 
 
 
 
@@ -2804,20 +2803,20 @@ class ReturnToAMO extends react__WEBPACK
 /***/ }),
 /* 17 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "convertLinks", function() { return convertLinks; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RichText", function() { return RichText; });
-/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(52);
+/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(54);
+/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(53);
 /* harmony import */ var _template_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(18);
 function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
 
 
 
 
  // Elements allowed in snippet content
 
@@ -3735,21 +3734,18 @@ class SimpleHashRouter extends react__WE
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_ConfirmDialog", function() { return _ConfirmDialog; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConfirmDialog", function() { return ConfirmDialog; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
-
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
 
 
 
 /**
  * ConfirmDialog component.
  * One primary action button, one cancel button.
  *
  * Content displayed is controlled by `data` prop the component receives.
@@ -3763,17 +3759,17 @@ class SimpleHashRouter extends react__WE
  *   userEvent: "DELETE",
  *   // Array of locale ids to display.
  *   message_body: ["confirm_history_delete_p1", "confirm_history_delete_notice_p2"],
  *   // Text for primary button.
  *   confirm_button_string_id: "menu_action_delete"
  * },
  */
 
-class _ConfirmDialog extends react__WEBPACK_IMPORTED_MODULE_3___default.a.PureComponent {
+class _ConfirmDialog extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
   constructor(props) {
     super(props);
     this._handleCancelBtn = this._handleCancelBtn.bind(this);
     this._handleConfirmBtn = this._handleConfirmBtn.bind(this);
   }
 
   _handleCancelBtn() {
     this.props.dispatch({
@@ -3791,162 +3787,60 @@ class _ConfirmDialog extends react__WEBP
 
   _renderModalMessage() {
     const message_body = this.props.data.body_string_id;
 
     if (!message_body) {
       return null;
     }
 
-    return react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", null, message_body.map(msg => react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("p", {
-      key: msg
-    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
-      id: msg
-    }))));
+    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", null, message_body.map(msg => react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("p", {
+      key: msg,
+      "data-l10n-id": msg
+    })));
   }
 
   render() {
     if (!this.props.visible) {
       return null;
     }
 
-    return react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
+    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
       className: "confirmation-dialog"
-    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
+    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
       className: "modal-overlay",
       onClick: this._handleCancelBtn,
       role: "presentation"
-    }), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
+    }), react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
       className: "modal"
-    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("section", {
+    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("section", {
       className: "modal-message"
-    }, this.props.data.icon && react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", {
+    }, this.props.data.icon && react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", {
       className: `icon icon-spacer icon-${this.props.data.icon}`
-    }), this._renderModalMessage()), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("section", {
+    }), this._renderModalMessage()), react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("section", {
       className: "actions"
-    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
-      onClick: this._handleCancelBtn
-    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
-      id: this.props.data.cancel_button_string_id
-    })), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
+    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
+      onClick: this._handleCancelBtn,
+      "data-l10n-id": this.props.data.cancel_button_string_id
+    }), react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
       className: "done",
-      onClick: this._handleConfirmBtn
-    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
-      id: this.props.data.confirm_button_string_id
-    })))));
+      onClick: this._handleConfirmBtn,
+      "data-l10n-id": this.props.data.confirm_button_string_id
+    }))));
   }
 
 }
 const ConfirmDialog = Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])(state => state.Dialog)(_ConfirmDialog);
 
 /***/ }),
 /* 29 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_LinkMenu", function() { return _LinkMenu; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinkMenu", function() { return LinkMenu; });
-/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var content_src_components_ContextMenu_ContextMenu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(30);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_3__);
-/* harmony import */ var content_src_lib_link_menu_options__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(31);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);
-
-
-
-
-
-
-const DEFAULT_SITE_MENU_OPTIONS = ["CheckPinTopSite", "EditTopSite", "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"];
-class _LinkMenu extends react__WEBPACK_IMPORTED_MODULE_5___default.a.PureComponent {
-  getOptions() {
-    const {
-      props
-    } = this;
-    const {
-      site,
-      index,
-      source,
-      isPrivateBrowsingEnabled,
-      siteInfo,
-      platform
-    } = props; // Handle special case of default site
-
-    const propOptions = !site.isDefault || site.searchTopSite ? props.options : DEFAULT_SITE_MENU_OPTIONS;
-    const options = propOptions.map(o => content_src_lib_link_menu_options__WEBPACK_IMPORTED_MODULE_4__["LinkMenuOptions"][o](site, index, source, isPrivateBrowsingEnabled, siteInfo, platform)).map(option => {
-      const {
-        action,
-        impression,
-        id,
-        string_id,
-        type,
-        userEvent
-      } = option;
-
-      if (!type && id) {
-        option.label = props.intl.formatMessage({
-          id: string_id || id
-        });
-
-        option.onClick = () => {
-          props.dispatch(action);
-
-          if (userEvent) {
-            const userEventData = Object.assign({
-              event: userEvent,
-              source,
-              action_position: index
-            }, siteInfo);
-            props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent(userEventData));
-          }
-
-          if (impression && props.shouldSendImpressionStats) {
-            props.dispatch(impression);
-          }
-        };
-      }
-
-      return option;
-    }); // This is for accessibility to support making each item tabbable.
-    // We want to know which item is the first and which item
-    // is the last, so we can close the context menu accordingly.
-
-    options[0].first = true;
-    options[options.length - 1].last = true;
-    return options;
-  }
-
-  render() {
-    return react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(content_src_components_ContextMenu_ContextMenu__WEBPACK_IMPORTED_MODULE_2__["ContextMenu"], {
-      onUpdate: this.props.onUpdate,
-      onShow: this.props.onShow,
-      options: this.getOptions()
-    });
-  }
-
-}
-
-const getState = state => ({
-  isPrivateBrowsingEnabled: state.Prefs.values.isPrivateBrowsingEnabled,
-  platform: state.Prefs.values.platform
-});
-
-const LinkMenu = Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])(getState)(Object(react_intl__WEBPACK_IMPORTED_MODULE_3__["injectIntl"])(_LinkMenu));
-
-/***/ }),
-/* 30 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContextMenu", function() { return ContextMenu; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContextMenuItem", function() { return ContextMenuItem; });
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
 
 class ContextMenu extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
   constructor(props) {
     super(props);
@@ -4006,21 +3900,28 @@ class ContextMenu extends react__WEBPACK
   }
 
 }
 class ContextMenuItem extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
   constructor(props) {
     super(props);
     this.onClick = this.onClick.bind(this);
     this.onKeyDown = this.onKeyDown.bind(this);
+    this.focusFirst = this.focusFirst.bind(this);
   }
 
   onClick() {
     this.props.hideContext();
     this.props.option.onClick();
+  }
+
+  focusFirst(button) {
+    if (button) {
+      button.focus();
+    }
   } // This selects the correct node based on the key pressed
 
 
   focusSibling(target, key) {
     const parent = target.parentNode;
     const closestSiblingSelector = key === "ArrowUp" ? "previousSibling" : "nextSibling";
 
     if (!parent[closestSiblingSelector]) {
@@ -4073,326 +3974,30 @@ class ContextMenuItem extends react__WEB
     } = this.props;
     return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", {
       role: "menuitem",
       className: "context-menu-item"
     }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
       className: option.disabled ? "disabled" : "",
       tabIndex: "0",
       onClick: this.onClick,
-      onKeyDown: this.onKeyDown
+      onKeyDown: this.onKeyDown,
+      ref: option.first ? this.focusFirst : null
     }, option.icon && react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", {
       className: `icon icon-spacer icon-${option.icon}`
-    }), option.label));
+    }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", {
+      "data-l10n-id": option.string_id || option.id
+    })));
   }
 
 }
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 31 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GetPlatformString", function() { return GetPlatformString; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinkMenuOptions", function() { return LinkMenuOptions; });
-/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-
-
-const _OpenInPrivateWindow = site => ({
-  id: "menu_action_open_private_window",
-  icon: "new-window-private",
-  action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
-    type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].OPEN_PRIVATE_WINDOW,
-    data: {
-      url: site.url,
-      referrer: site.referrer
-    }
-  }),
-  userEvent: "OPEN_PRIVATE_WINDOW"
-});
-
-const GetPlatformString = platform => {
-  switch (platform) {
-    case "win":
-      return "menu_action_show_file_windows";
-
-    case "macosx":
-      return "menu_action_show_file_mac_os";
-
-    case "linux":
-      return "menu_action_show_file_linux";
-
-    default:
-      return "menu_action_show_file_default";
-  }
-};
-/**
- * List of functions that return items that can be included as menu options in a
- * LinkMenu. All functions take the site as the first parameter, and optionally
- * the index of the site.
- */
-
-const LinkMenuOptions = {
-  Separator: () => ({
-    type: "separator"
-  }),
-  EmptyItem: () => ({
-    type: "empty"
-  }),
-  RemoveBookmark: site => ({
-    id: "menu_action_remove_bookmark",
-    icon: "bookmark-added",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].DELETE_BOOKMARK_BY_ID,
-      data: site.bookmarkGuid
-    }),
-    userEvent: "BOOKMARK_DELETE"
-  }),
-  AddBookmark: site => ({
-    id: "menu_action_bookmark",
-    icon: "bookmark-hollow",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].BOOKMARK_URL,
-      data: {
-        url: site.url,
-        title: site.title,
-        type: site.type
-      }
-    }),
-    userEvent: "BOOKMARK_ADD"
-  }),
-  OpenInNewWindow: site => ({
-    id: "menu_action_open_new_window",
-    icon: "new-window",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].OPEN_NEW_WINDOW,
-      data: {
-        referrer: site.referrer,
-        typedBonus: site.typedBonus,
-        url: site.url
-      }
-    }),
-    userEvent: "OPEN_NEW_WINDOW"
-  }),
-  BlockUrl: (site, index, eventSource) => ({
-    id: "menu_action_dismiss",
-    icon: "dismiss",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].BLOCK_URL,
-      data: {
-        url: site.open_url || site.url,
-        pocket_id: site.pocket_id
-      }
-    }),
-    impression: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].ImpressionStats({
-      source: eventSource,
-      block: 0,
-      tiles: [{
-        id: site.guid,
-        pos: index,
-        ...(site.shim && site.shim.delete ? {
-          shim: site.shim.delete
-        } : {})
-      }]
-    }),
-    userEvent: "BLOCK"
-  }),
-  // This is an option for web extentions which will result in remove items from
-  // memory and notify the web extenion, rather than using the built-in block list.
-  WebExtDismiss: (site, index, eventSource) => ({
-    id: "menu_action_webext_dismiss",
-    string_id: "menu_action_dismiss",
-    icon: "dismiss",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].WebExtEvent(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].WEBEXT_DISMISS, {
-      source: eventSource,
-      url: site.url,
-      action_position: index
-    })
-  }),
-  DeleteUrl: (site, index, eventSource, isEnabled, siteInfo) => ({
-    id: "menu_action_delete",
-    icon: "delete",
-    action: {
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].DIALOG_OPEN,
-      data: {
-        onConfirm: [common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
-          type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].DELETE_HISTORY_URL,
-          data: {
-            url: site.url,
-            pocket_id: site.pocket_id,
-            forceBlock: site.bookmarkGuid
-          }
-        }), common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent(Object.assign({
-          event: "DELETE",
-          source: eventSource,
-          action_position: index
-        }, siteInfo))],
-        eventSource,
-        body_string_id: ["confirm_history_delete_p1", "confirm_history_delete_notice_p2"],
-        confirm_button_string_id: "menu_action_delete",
-        cancel_button_string_id: "topsites_form_cancel_button",
-        icon: "modal-delete"
-      }
-    },
-    userEvent: "DIALOG_OPEN"
-  }),
-  ShowFile: (site, index, eventSource, isEnabled, siteInfo, platform) => ({
-    id: GetPlatformString(platform),
-    icon: "search",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].SHOW_DOWNLOAD_FILE,
-      data: {
-        url: site.url
-      }
-    })
-  }),
-  OpenFile: site => ({
-    id: "menu_action_open_file",
-    icon: "open-file",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].OPEN_DOWNLOAD_FILE,
-      data: {
-        url: site.url
-      }
-    })
-  }),
-  CopyDownloadLink: site => ({
-    id: "menu_action_copy_download_link",
-    icon: "copy",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].COPY_DOWNLOAD_LINK,
-      data: {
-        url: site.url
-      }
-    })
-  }),
-  GoToDownloadPage: site => ({
-    id: "menu_action_go_to_download_page",
-    icon: "download",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].OPEN_LINK,
-      data: {
-        url: site.referrer
-      }
-    }),
-    disabled: !site.referrer
-  }),
-  RemoveDownload: site => ({
-    id: "menu_action_remove_download",
-    icon: "delete",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].REMOVE_DOWNLOAD_FILE,
-      data: {
-        url: site.url
-      }
-    })
-  }),
-  PinTopSite: ({
-    url,
-    searchTopSite,
-    label
-  }, index) => ({
-    id: "menu_action_pin",
-    icon: "pin",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].TOP_SITES_PIN,
-      data: {
-        site: {
-          url,
-          ...(searchTopSite && {
-            searchTopSite,
-            label
-          })
-        },
-        index
-      }
-    }),
-    userEvent: "PIN"
-  }),
-  UnpinTopSite: site => ({
-    id: "menu_action_unpin",
-    icon: "unpin",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].TOP_SITES_UNPIN,
-      data: {
-        site: {
-          url: site.url
-        }
-      }
-    }),
-    userEvent: "UNPIN"
-  }),
-  SaveToPocket: (site, index, eventSource) => ({
-    id: "menu_action_save_to_pocket",
-    icon: "pocket-save",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].SAVE_TO_POCKET,
-      data: {
-        site: {
-          url: site.url,
-          title: site.title
-        }
-      }
-    }),
-    impression: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].ImpressionStats({
-      source: eventSource,
-      pocket: 0,
-      tiles: [{
-        id: site.guid,
-        pos: index,
-        ...(site.shim && site.shim.save ? {
-          shim: site.shim.save
-        } : {})
-      }]
-    }),
-    userEvent: "SAVE_TO_POCKET"
-  }),
-  DeleteFromPocket: site => ({
-    id: "menu_action_delete_pocket",
-    icon: "pocket-delete",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].DELETE_FROM_POCKET,
-      data: {
-        pocket_id: site.pocket_id
-      }
-    }),
-    userEvent: "DELETE_FROM_POCKET"
-  }),
-  ArchiveFromPocket: site => ({
-    id: "menu_action_archive_pocket",
-    icon: "pocket-archive",
-    action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].ARCHIVE_FROM_POCKET,
-      data: {
-        pocket_id: site.pocket_id
-      }
-    }),
-    userEvent: "ARCHIVE_FROM_POCKET"
-  }),
-  EditTopSite: (site, index) => ({
-    id: "edit_topsites_button_text",
-    icon: "edit",
-    action: {
-      type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].TOP_SITES_EDIT,
-      data: {
-        index
-      }
-    }
-  }),
-  CheckBookmark: site => site.bookmarkGuid ? LinkMenuOptions.RemoveBookmark(site) : LinkMenuOptions.AddBookmark(site),
-  CheckPinTopSite: (site, index) => site.isPinned ? LinkMenuOptions.UnpinTopSite(site) : LinkMenuOptions.PinTopSite(site, index),
-  CheckSavedToPocket: (site, index) => site.pocket_id ? LinkMenuOptions.DeleteFromPocket(site) : LinkMenuOptions.SaveToPocket(site, index),
-  CheckBookmarkOrArchive: site => site.pocket_id ? LinkMenuOptions.ArchiveFromPocket(site) : LinkMenuOptions.CheckBookmark(site),
-  OpenInPrivateWindow: (site, index, eventSource, isEnabled) => isEnabled ? _OpenInPrivateWindow(site) : LinkMenuOptions.EmptyItem()
-};
-
-/***/ }),
-/* 32 */
+/* 30 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "INTERSECTION_RATIO", function() { return INTERSECTION_RATIO; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ImpressionStats", function() { return ImpressionStats; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10);
@@ -4606,45 +4211,38 @@ ImpressionStats.defaultProps = {
   IntersectionObserver: global.IntersectionObserver,
   document: global.document,
   rows: [],
   source: ""
 };
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 33 */
+/* 31 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_CollapsibleSection", function() { return _CollapsibleSection; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollapsibleSection", function() { return CollapsibleSection; });
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
-/* harmony import */ var content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34);
+/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollapsibleSection", function() { return CollapsibleSection; });
+/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
+/* harmony import */ var content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(32);
+/* harmony import */ var content_src_components_FluentOrText_FluentOrText__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(34);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
-/* harmony import */ var content_src_components_SectionMenu_SectionMenu__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(36);
-/* harmony import */ var content_src_lib_section_menu_options__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(37);
+/* harmony import */ var content_src_components_SectionMenu_SectionMenu__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(35);
+/* harmony import */ var content_src_lib_section_menu_options__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(36);
 
 
 
 
 
 
 const VISIBLE = "visible";
 const VISIBILITY_CHANGE_EVENT = "visibilitychange";
-
-function getFormattedMessage(message) {
-  return typeof message === "string" ? react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", null, message) : react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], message);
-}
-
-class _CollapsibleSection extends react__WEBPACK_IMPORTED_MODULE_3___default.a.PureComponent {
+class CollapsibleSection extends react__WEBPACK_IMPORTED_MODULE_3___default.a.PureComponent {
   constructor(props) {
     super(props);
     this.onBodyMount = this.onBodyMount.bind(this);
     this.onHeaderClick = this.onHeaderClick.bind(this);
     this.onKeyPress = this.onKeyPress.bind(this);
     this.onTransitionEnd = this.onTransitionEnd.bind(this);
     this.enableOrDisableAnimation = this.enableOrDisableAnimation.bind(this);
     this.onMenuButtonClick = this.onMenuButtonClick.bind(this);
@@ -4719,17 +4317,17 @@ class _CollapsibleSection extends react_
       isAnimating: true,
       maxHeight: `${this._getSectionBodyHeight()}px`
     });
     const {
       action,
       userEvent
     } = content_src_lib_section_menu_options__WEBPACK_IMPORTED_MODULE_5__["SectionMenuOptions"].CheckCollapsed(this.props);
     this.props.dispatch(action);
-    this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_1__["actionCreators"].UserEvent({
+    this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
       event: userEvent,
       source: this.props.source
     }));
   }
 
   onKeyPress(event) {
     if (event.key === "Enter" || event.key === " ") {
       this.onHeaderClick();
@@ -4851,98 +4449,90 @@ class _CollapsibleSection extends react_
     }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", {
       className: "click-target-container"
     }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", {
       className: "click-target",
       role: "button",
       tabIndex: "0",
       onKeyPress: this.onKeyPress,
       onClick: this.onHeaderClick
-    }, this.renderIcon(), getFormattedMessage(title)), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", {
+    }, this.renderIcon(), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(content_src_components_FluentOrText_FluentOrText__WEBPACK_IMPORTED_MODULE_2__["FluentOrText"], {
+      message: title
+    })), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", {
       className: "click-target",
       role: "button",
       tabIndex: "0",
       onKeyPress: this.onKeyPress,
       onClick: this.onHeaderClick
     }, isCollapsible && react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", {
       className: `collapsible-arrow icon ${collapsed ? "icon-arrowhead-forward-small" : "icon-arrowhead-down-small"}`
     })), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", {
       className: "learn-more-link-wrapper"
     }, learnMore && react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", {
       className: "learn-more-link"
+    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(content_src_components_FluentOrText_FluentOrText__WEBPACK_IMPORTED_MODULE_2__["FluentOrText"], {
+      message: learnMore.link.message
     }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("a", {
       href: learnMore.link.href
-    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
-      id: learnMore.link.id
     })))))), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", null, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
       "aria-haspopup": "true",
       className: "context-menu-button icon",
-      title: this.props.intl.formatMessage({
-        id: "context_menu_title"
-      }),
+      "data-l10n-id": "newtab-menu-section-tooltip",
       onClick: this.onMenuButtonClick,
       ref: this.setContextMenuButtonRef
-    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", {
-      className: "sr-only"
-    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
-      id: "section_context_menu_button_sr"
-    }))), showContextMenu && react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(content_src_components_SectionMenu_SectionMenu__WEBPACK_IMPORTED_MODULE_4__["SectionMenu"], {
+    }), showContextMenu && react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(content_src_components_SectionMenu_SectionMenu__WEBPACK_IMPORTED_MODULE_4__["SectionMenu"], {
       id: id,
       extraOptions: extraMenuOptions,
       eventSource: eventSource,
       showPrefName: showPrefName,
       privacyNoticeURL: privacyNoticeURL,
       collapsed: collapsed,
       onUpdate: this.onMenuUpdate,
       isFixed: isFixed,
       isFirst: isFirst,
       isLast: isLast,
       dispatch: dispatch,
       isWebExtension: isWebExtension
-    }))), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_2__["ErrorBoundary"], {
+    }))), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_1__["ErrorBoundary"], {
       className: "section-body-fallback"
     }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
       className: `section-body${isAnimating ? " animating" : ""}`,
       onTransitionEnd: this.onTransitionEnd,
       ref: this.onBodyMount,
       style: bodyStyle
     }, this.props.children)));
   }
 
 }
-_CollapsibleSection.defaultProps = {
+CollapsibleSection.defaultProps = {
   document: global.document || {
     addEventListener: () => {},
     removeEventListener: () => {},
     visibilityState: "hidden"
   },
   Prefs: {
     values: {}
   }
 };
-const CollapsibleSection = Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["injectIntl"])(_CollapsibleSection);
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 34 */
+/* 32 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorBoundaryFallback", function() { return ErrorBoundaryFallback; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorBoundary", function() { return ErrorBoundary; });
-/* harmony import */ var content_src_components_A11yLinkButton_A11yLinkButton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(35);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
-
-
-
-class ErrorBoundaryFallback extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
+/* harmony import */ var content_src_components_A11yLinkButton_A11yLinkButton__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
+
+
+class ErrorBoundaryFallback extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
   constructor(props) {
     super(props);
     this.windowObj = this.props.windowObj || window;
     this.onClick = this.onClick.bind(this);
   }
   /**
    * Since we only get here if part of the page has crashed, do a
    * forced reload to give us the best chance at recovering.
@@ -4959,35 +4549,32 @@ class ErrorBoundaryFallback extends reac
 
     if ("className" in this.props) {
       className = `${this.props.className} ${defaultClass}`;
     } else {
       className = defaultClass;
     } // "A11yLinkButton" to force normal link styling stuff (eg cursor on hover)
 
 
-    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
+    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
       className: className
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", null, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
-      defaultMessage: "Oops, something went wrong loading this content.",
-      id: "error_fallback_default_info"
-    })), react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", null, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(content_src_components_A11yLinkButton_A11yLinkButton__WEBPACK_IMPORTED_MODULE_0__["A11yLinkButton"], {
+    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
+      "data-l10n-id": "newtab-error-fallback-info"
+    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", null, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(content_src_components_A11yLinkButton_A11yLinkButton__WEBPACK_IMPORTED_MODULE_0__["A11yLinkButton"], {
       className: "reload-button",
-      onClick: this.onClick
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
-      defaultMessage: "Refresh page to try again.",
-      id: "error_fallback_default_refresh_suggestion"
-    }))));
+      onClick: this.onClick,
+      "data-l10n-id": "newtab-error-fallback-refresh-link"
+    })));
   }
 
 }
 ErrorBoundaryFallback.defaultProps = {
   className: "as-error-fallback"
 };
-class ErrorBoundary extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
+class ErrorBoundary extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
   constructor(props) {
     super(props);
     this.state = {
       hasError: false
     };
   }
 
   componentDidCatch(error, info) {
@@ -4996,28 +4583,28 @@ class ErrorBoundary extends react__WEBPA
     });
   }
 
   render() {
     if (!this.state.hasError) {
       return this.props.children;
     }
 
-    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(this.props.FallbackComponent, {
+    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(this.props.FallbackComponent, {
       className: this.props.className
     });
   }
 
 }
 ErrorBoundary.defaultProps = {
   FallbackComponent: ErrorBoundaryFallback
 };
 
 /***/ }),
-/* 35 */
+/* 33 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "A11yLinkButton", function() { return A11yLinkButton; });
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
 function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@@ -5034,38 +4621,78 @@ function A11yLinkButton(props) {
   return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", _extends({
     type: "button"
   }, props, {
     className: className
   }), props.children);
 }
 
 /***/ }),
-/* 36 */
+/* 34 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FluentOrText", function() { return FluentOrText; });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+/**
+ * Set text on a child element/component depending on if the message is already
+ * translated plain text or a fluent id with optional args.
+ */
+
+class FluentOrText extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
+  render() {
+    // Ensure we have a single child to attach attributes
+    const {
+      children,
+      message
+    } = this.props;
+    const child = children ? react__WEBPACK_IMPORTED_MODULE_0___default.a.Children.only(children) : react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", null); // For a string message, just use it as the child's text
+
+    let grandChildren = message;
+    let extraProps; // Convert a message object to set desired fluent-dom attributes
+
+    if (typeof message === "object") {
+      const args = message.args || message.values;
+      extraProps = {
+        "data-l10n-args": args && JSON.stringify(args),
+        "data-l10n-id": message.id || message.string_id
+      }; // Use original children potentially with data-l10n-name attributes
+
+      grandChildren = child.props.children;
+    } // Add the message to the child via fluent attributes or text node
+
+
+    return react__WEBPACK_IMPORTED_MODULE_0___default.a.cloneElement(child, extraProps, grandChildren);
+  }
+
+}
+
+/***/ }),
+/* 35 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_SectionMenu", function() { return _SectionMenu; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SectionMenu", function() { return SectionMenu; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var content_src_components_ContextMenu_ContextMenu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(30);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
-/* harmony import */ var content_src_lib_section_menu_options__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(37);
-
+/* harmony import */ var content_src_components_ContextMenu_ContextMenu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(29);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var content_src_lib_section_menu_options__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(36);
 
 
 
 
 const DEFAULT_SECTION_MENU_OPTIONS = ["MoveUp", "MoveDown", "Separator", "RemoveSection", "CheckCollapsed", "Separator", "ManageSection"];
 const WEBEXT_SECTION_MENU_OPTIONS = ["MoveUp", "MoveDown", "Separator", "CheckCollapsed", "Separator", "ManageWebExtension"];
-class _SectionMenu extends react__WEBPACK_IMPORTED_MODULE_3___default.a.PureComponent {
+class _SectionMenu extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
   getOptions() {
     const {
       props
     } = this;
     const propOptions = props.isWebExtension ? [...WEBEXT_SECTION_MENU_OPTIONS] : [...DEFAULT_SECTION_MENU_OPTIONS]; // Remove the move related options if the section is fixed
 
     if (props.isFixed) {
       propOptions.splice(propOptions.indexOf("MoveUp"), 3);
@@ -5076,29 +4703,25 @@ class _SectionMenu extends react__WEBPAC
       propOptions.splice(0, 0, ...props.extraOptions, "Separator");
     } // Insert privacy notice before the last option ("ManageSection")
 
 
     if (props.privacyNoticeURL) {
       propOptions.splice(-1, 0, "PrivacyNotice");
     }
 
-    const options = propOptions.map(o => content_src_lib_section_menu_options__WEBPACK_IMPORTED_MODULE_4__["SectionMenuOptions"][o](props)).map(option => {
+    const options = propOptions.map(o => content_src_lib_section_menu_options__WEBPACK_IMPORTED_MODULE_3__["SectionMenuOptions"][o](props)).map(option => {
       const {
         action,
         id,
         type,
         userEvent
       } = option;
 
       if (!type && id) {
-        option.label = props.intl.formatMessage({
-          id
-        });
-
         option.onClick = () => {
           props.dispatch(action);
 
           if (userEvent) {
             props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
               event: userEvent,
               source: props.source
             }));
@@ -5112,27 +4735,27 @@ class _SectionMenu extends react__WEBPAC
     // is the last, so we can close the context menu accordingly.
 
     options[0].first = true;
     options[options.length - 1].last = true;
     return options;
   }
 
   render() {
-    return react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(content_src_components_ContextMenu_ContextMenu__WEBPACK_IMPORTED_MODULE_1__["ContextMenu"], {
+    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(content_src_components_ContextMenu_ContextMenu__WEBPACK_IMPORTED_MODULE_1__["ContextMenu"], {
       onUpdate: this.props.onUpdate,
       options: this.getOptions()
     });
   }
 
 }
-const SectionMenu = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["injectIntl"])(_SectionMenu);
+const SectionMenu = _SectionMenu;
 
 /***/ }),
-/* 37 */
+/* 36 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SectionMenuOptions", function() { return SectionMenuOptions; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 
 /**
@@ -5140,148 +4763,147 @@ const SectionMenu = Object(react_intl__W
  * SectionMenu. All functions take the section as the only parameter.
  */
 
 const SectionMenuOptions = {
   Separator: () => ({
     type: "separator"
   }),
   MoveUp: section => ({
-    id: "section_menu_action_move_up",
+    id: "newtab-section-menu-move-up",
     icon: "arrowhead-up",
     action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
       type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].SECTION_MOVE,
       data: {
         id: section.id,
         direction: -1
       }
     }),
     userEvent: "MENU_MOVE_UP",
     disabled: !!section.isFirst
   }),
   MoveDown: section => ({
-    id: "section_menu_action_move_down",
+    id: "newtab-section-menu-move-down",
     icon: "arrowhead-down",
     action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
       type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].SECTION_MOVE,
       data: {
         id: section.id,
         direction: +1
       }
     }),
     userEvent: "MENU_MOVE_DOWN",
     disabled: !!section.isLast
   }),
   RemoveSection: section => ({
-    id: "section_menu_action_remove_section",
+    id: "newtab-section-menu-remove-section",
     icon: "dismiss",
     action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].SetPref(section.showPrefName, false),
     userEvent: "MENU_REMOVE"
   }),
   CollapseSection: section => ({
-    id: "section_menu_action_collapse_section",
+    id: "newtab-section-menu-collapse-section",
     icon: "minimize",
     action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
       type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].UPDATE_SECTION_PREFS,
       data: {
         id: section.id,
         value: {
           collapsed: true
         }
       }
     }),
     userEvent: "MENU_COLLAPSE"
   }),
   ExpandSection: section => ({
-    id: "section_menu_action_expand_section",
+    id: "newtab-section-menu-expand-section",
     icon: "maximize",
     action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
       type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].UPDATE_SECTION_PREFS,
       data: {
         id: section.id,
         value: {
           collapsed: false
         }
       }
     }),
     userEvent: "MENU_EXPAND"
   }),
   ManageSection: section => ({
-    id: "section_menu_action_manage_section",
+    id: "newtab-section-menu-manage-section",
     icon: "settings",
     action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
       type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].SETTINGS_OPEN
     }),
     userEvent: "MENU_MANAGE"
   }),
   ManageWebExtension: section => ({
-    id: "section_menu_action_manage_webext",
+    id: "newtab-section-menu-manage-webext",
     icon: "settings",
     action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
       type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].OPEN_WEBEXT_SETTINGS,
       data: section.id
     })
   }),
   AddTopSite: section => ({
-    id: "section_menu_action_add_topsite",
+    id: "newtab-section-menu-add-topsite",
     icon: "add",
     action: {
       type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].TOP_SITES_EDIT,
       data: {
         index: -1
       }
     },
     userEvent: "MENU_ADD_TOPSITE"
   }),
   AddSearchShortcut: section => ({
-    id: "section_menu_action_add_search_engine",
+    id: "newtab-section-menu-add-search-engine",
     icon: "search",
     action: {
       type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].TOP_SITES_OPEN_SEARCH_SHORTCUTS_MODAL
     },
     userEvent: "MENU_ADD_SEARCH"
   }),
   PrivacyNotice: section => ({
-    id: "section_menu_action_privacy_notice",
+    id: "newtab-section-menu-privacy-notice",
     icon: "info",
     action: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({
       type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].OPEN_LINK,
       data: {
         url: section.privacyNoticeURL
       }
     }),
     userEvent: "MENU_PRIVACY_NOTICE"
   }),
   CheckCollapsed: section => section.collapsed ? SectionMenuOptions.ExpandSection(section) : SectionMenuOptions.CollapseSection(section)
 };
 
 /***/ }),
-/* 38 */
+/* 37 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Section", function() { return Section; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SectionIntl", function() { return SectionIntl; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_Sections", function() { return _Sections; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sections", function() { return Sections; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var content_src_components_Card_Card__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);
-/* harmony import */ var content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(33);
-/* harmony import */ var content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(40);
+/* harmony import */ var content_src_components_Card_Card__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55);
+/* harmony import */ var content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(31);
+/* harmony import */ var content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(39);
+/* harmony import */ var content_src_components_FluentOrText_FluentOrText__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(34);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_5__);
-/* harmony import */ var content_src_components_MoreRecommendations_MoreRecommendations__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(42);
-/* harmony import */ var content_src_components_PocketLoggedInCta_PocketLoggedInCta__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(43);
+/* harmony import */ var content_src_components_MoreRecommendations_MoreRecommendations__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(41);
+/* harmony import */ var content_src_components_PocketLoggedInCta_PocketLoggedInCta__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(42);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(10);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__);
-/* harmony import */ var content_src_components_Topics_Topics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(44);
-/* harmony import */ var content_src_components_TopSites_TopSites__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(45);
+/* harmony import */ var content_src_components_Topics_Topics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(43);
+/* harmony import */ var content_src_components_TopSites_TopSites__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(44);
 function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
 
 
 
 
 
 
 
@@ -5289,21 +4911,16 @@ function _extends() { _extends = Object.
 
 
 
 
 const VISIBLE = "visible";
 const VISIBILITY_CHANGE_EVENT = "visibilitychange";
 const CARDS_PER_ROW_DEFAULT = 3;
 const CARDS_PER_ROW_COMPACT_WIDE = 4;
-
-function getFormattedMessage(message) {
-  return typeof message === "string" ? react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("span", null, message) : react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], message);
-}
-
 class Section extends react__WEBPACK_IMPORTED_MODULE_8___default.a.PureComponent {
   get numRows() {
     const {
       rowsPref,
       maxRows,
       Prefs
     } = this.props;
     return rowsPref ? Prefs.values[rowsPref] : maxRows;
@@ -5514,17 +5131,17 @@ class Section extends react__WEBPACK_IMP
           className: className
         }));
       }
     }
 
     const sectionClassName = ["section", compactCards ? "compact-cards" : "normal-cards"].join(" "); // <Section> <-- React component
     // <section> <-- HTML5 element
 
-    return react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_4__["ComponentPerfTimer"], this.props, react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_3__["CollapsibleSection"], {
+    return react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_3__["ComponentPerfTimer"], this.props, react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_2__["CollapsibleSection"], {
       className: sectionClassName,
       icon: icon,
       title: title,
       id: id,
       eventSource: eventSource,
       collapsed: this.props.pref.collapsed,
       showPrefName: pref && pref.feed || id,
       privacyNoticeURL: privacyNoticeURL,
@@ -5546,19 +5163,21 @@ class Section extends react__WEBPACK_IMP
       className: "empty-state"
     }, emptyState.icon && emptyState.icon.startsWith("moz-extension://") ? react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("span", {
       className: "empty-state-icon icon",
       style: {
         "background-image": `url('${emptyState.icon}')`
       }
     }) : react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("span", {
       className: `empty-state-icon icon icon-${emptyState.icon}`
-    }), react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("p", {
+    }), react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(content_src_components_FluentOrText_FluentOrText__WEBPACK_IMPORTED_MODULE_4__["FluentOrText"], {
+      message: emptyState.message
+    }, react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("p", {
       className: "empty-state-message"
-    }, getFormattedMessage(emptyState.message)))), id === "topstories" && react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", {
+    })))), id === "topstories" && react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", {
       className: "top-stories-bottom-container"
     }, shouldShowTopics && react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", {
       className: "wrapper-topics"
     }, react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(content_src_components_Topics_Topics__WEBPACK_IMPORTED_MODULE_9__["Topics"], {
       topics: this.props.topics
     })), shouldShowPocketCta && react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", {
       className: "wrapper-cta"
     }, react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(content_src_components_PocketLoggedInCta_PocketLoggedInCta__WEBPACK_IMPORTED_MODULE_7__["PocketLoggedInCta"], null)), react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", {
@@ -5574,17 +5193,17 @@ Section.defaultProps = {
   rows: [],
   emptyState: {},
   pref: {},
   title: ""
 };
 const SectionIntl = Object(react_redux__WEBPACK_IMPORTED_MODULE_5__["connect"])(state => ({
   Prefs: state.Prefs,
   Pocket: state.Pocket
-}))(Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["injectIntl"])(Section));
+}))(Section);
 class _Sections extends react__WEBPACK_IMPORTED_MODULE_8___default.a.PureComponent {
   renderSections() {
     const sections = [];
     const enabledSections = this.props.Sections.filter(section => section.enabled);
     const {
       sectionOrder,
       "feeds.topsites": showTopSites
     } = this.props.Prefs.values; // Enabled sections doesn't include Top Sites, so we add it if enabled.
@@ -5621,17 +5240,17 @@ class _Sections extends react__WEBPACK_I
 }
 const Sections = Object(react_redux__WEBPACK_IMPORTED_MODULE_5__["connect"])(state => ({
   Sections: state.Sections,
   Prefs: state.Prefs
 }))(_Sections);
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 39 */
+/* 38 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ScreenshotUtils", function() { return ScreenshotUtils; });
 /**
  * List of helper functions for screenshot-based images.
  *
@@ -5686,24 +5305,24 @@ const ScreenshotUtils = {
 
     return !remoteImage && !localImage;
   }
 
 };
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 40 */
+/* 39 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ComponentPerfTimer", function() { return ComponentPerfTimer; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var common_PerfService_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(41);
+/* harmony import */ var common_PerfService_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(40);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
 
 
  // Currently record only a fixed set of sections. This will prevent data
 // from custom sections from showing up or from topstories.
 
 const RECORDED_SECTIONS = ["highlights", "topsites"];
@@ -5863,17 +5482,17 @@ class ComponentPerfTimer extends react__
     }
 
     return this.props.children;
   }
 
 }
 
 /***/ }),
-/* 41 */
+/* 40 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_PerfService", function() { return _PerfService; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "perfService", function() { return perfService; });
 
 
@@ -5992,174 +5611,161 @@ function _PerfService(options) {
     let mostRecentEntry = entries[entries.length - 1];
     return this._perf.timeOrigin + mostRecentEntry.startTime;
   }
 
 };
 var perfService = new _PerfService();
 
 /***/ }),
-/* 42 */
+/* 41 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MoreRecommendations", function() { return MoreRecommendations; });
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-
-
-class MoreRecommendations extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+class MoreRecommendations extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
   render() {
     const {
       read_more_endpoint
     } = this.props;
 
     if (read_more_endpoint) {
-      return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("a", {
+      return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a", {
         className: "more-recommendations",
-        href: read_more_endpoint
-      }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
-        id: "pocket_more_reccommendations"
-      }));
+        href: read_more_endpoint,
+        "data-l10n-id": "newtab-pocket-more-recommendations"
+      });
     }
 
     return null;
   }
 
 }
 
 /***/ }),
-/* 43 */
+/* 42 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_PocketLoggedInCta", function() { return _PocketLoggedInCta; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PocketLoggedInCta", function() { return PocketLoggedInCta; });
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
-
-
-
-class _PocketLoggedInCta extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
+
+
+class _PocketLoggedInCta extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
   render() {
     const {
       pocketCta
     } = this.props.Pocket;
-    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", {
+    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
       className: "pocket-logged-in-cta"
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("a", {
+    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("a", {
       className: "pocket-cta-button",
       href: pocketCta.ctaUrl ? pocketCta.ctaUrl : "https://getpocket.com/"
-    }, pocketCta.ctaButton ? pocketCta.ctaButton : react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
-      id: "pocket_cta_button"
-    })), react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("a", {
+    }, pocketCta.ctaButton ? pocketCta.ctaButton : react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
+      "data-l10n-id": "newtab-pocket-cta-button"
+    })), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("a", {
       href: pocketCta.ctaUrl ? pocketCta.ctaUrl : "https://getpocket.com/"
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", {
+    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
       className: "cta-text"
-    }, pocketCta.ctaText ? pocketCta.ctaText : react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
-      id: "pocket_cta_text"
+    }, pocketCta.ctaText ? pocketCta.ctaText : react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
+      "data-l10n-id": "newtab-pocket-cta-text"
     }))));
   }
 
 }
 const PocketLoggedInCta = Object(react_redux__WEBPACK_IMPORTED_MODULE_0__["connect"])(state => ({
   Pocket: state.Pocket
 }))(_PocketLoggedInCta);
 
 /***/ }),
-/* 44 */
+/* 43 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Topic", function() { return Topic; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Topics", function() { return Topics; });
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-
-
-class Topic extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+
+class Topic extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
   render() {
     const {
       url,
       name
     } = this.props;
-    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("li", null, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("a", {
+    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("li", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("a", {
       key: name,
       href: url
     }, name));
   }
 
 }
-class Topics extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
+class Topics extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
   render() {
     const {
       topics
     } = this.props;
-    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
+    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", {
       className: "topics"
-    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", null, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["FormattedMessage"], {
-      id: "pocket_read_more"
-    })), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("ul", null, topics && topics.map(t => react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(Topic, {
+    }, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", {
+      "data-l10n-id": "newtab-pocket-read-more"
+    }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("ul", null, topics && topics.map(t => react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(Topic, {
       key: t.name,
       url: t.url,
       name: t.name
     }))));
   }
 
 }
 
 /***/ }),
-/* 45 */
+/* 44 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_TopSites", function() { return _TopSites; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSites", function() { return TopSites; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(46);
-/* harmony import */ var content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(33);
-/* harmony import */ var content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(40);
+/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(45);
+/* harmony import */ var content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(31);
+/* harmony import */ var content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(39);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(25);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_4__);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_5__);
-/* harmony import */ var _asrouter_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(14);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__);
-/* harmony import */ var _SearchShortcutsForm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(47);
-/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(55);
-/* harmony import */ var _TopSiteForm__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(57);
-/* harmony import */ var _TopSite__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(48);
+/* harmony import */ var _asrouter_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(14);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(10);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _SearchShortcutsForm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(46);
+/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(54);
+/* harmony import */ var _TopSiteForm__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(56);
+/* harmony import */ var _TopSite__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(47);
 function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
 
 
 
 
 
 
 
 
 
 
 
 
 
-
 function topSiteIconType(link) {
   if (link.customScreenshotURL) {
     return "custom_screenshot";
   }
 
   if (link.tippyTopIcon || link.faviconRef === "tippytop") {
     return "tippytop";
   }
@@ -6196,17 +5802,17 @@ function countTopSitesIconsTypes(topSite
     "screenshot_with_icon": 0,
     "screenshot": 0,
     "tippytop": 0,
     "rich_icon": 0,
     "no_image": 0
   });
 }
 
-class _TopSites extends react__WEBPACK_IMPORTED_MODULE_7___default.a.PureComponent {
+class _TopSites extends react__WEBPACK_IMPORTED_MODULE_6___default.a.PureComponent {
   constructor(props) {
     super(props);
     this.onEditFormClose = this.onEditFormClose.bind(this);
     this.onSearchShortcutsFormClose = this.onSearchShortcutsFormClose.bind(this);
   }
   /**
    * Dispatch session statistics about the quality of TopSites icons and pinned count.
    */
@@ -6230,17 +5836,17 @@ class _TopSites extends react__WEBPACK_I
   }
   /**
    * Return the TopSites that are visible based on prefs and window width.
    */
 
 
   _getVisibleTopSites() {
     // We hide 2 sites per row when not in the wide layout.
-    let sitesPerRow = common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_9__["TOP_SITES_MAX_SITES_PER_ROW"]; // $break-point-widest = 1072px (from _variables.scss)
+    let sitesPerRow = common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_8__["TOP_SITES_MAX_SITES_PER_ROW"]; // $break-point-widest = 1072px (from _variables.scss)
 
     if (!global.matchMedia(`(min-width: 1072px)`).matches) {
       sitesPerRow -= 2;
     }
 
     return this.props.TopSites.rows.slice(0, this.props.TopSitesRows * sitesPerRow);
   }
 
@@ -6281,77 +5887,77 @@ class _TopSites extends react__WEBPACK_I
       showSearchShortcutsForm
     } = props.TopSites;
     const extraMenuOptions = ["AddTopSite"];
 
     if (props.Prefs.values["improvesearch.topSiteSearchShortcuts"]) {
       extraMenuOptions.push("AddSearchShortcut");
     }
 
-    return react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_3__["ComponentPerfTimer"], {
+    return react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_3__["ComponentPerfTimer"], {
       id: "topsites",
       initialized: props.TopSites.initialized,
       dispatch: props.dispatch
-    }, react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_2__["CollapsibleSection"], {
+    }, react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_2__["CollapsibleSection"], {
       className: "top-sites",
       icon: "topsites",
       id: "topsites",
       title: this.props.title || {
-        id: "header_top_sites"
+        id: "newtab-section-header-topsites"
       },
       extraMenuOptions: extraMenuOptions,
       showPrefName: "feeds.topsites",
       eventSource: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__["TOP_SITES_SOURCE"],
       collapsed: props.TopSites.pref ? props.TopSites.pref.collapsed : undefined,
       isFixed: props.isFixed,
       isFirst: props.isFirst,
       isLast: props.isLast,
       dispatch: props.dispatch
-    }, react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_TopSite__WEBPACK_IMPORTED_MODULE_11__["TopSiteList"], {
+    }, react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_TopSite__WEBPACK_IMPORTED_MODULE_10__["TopSiteList"], {
       TopSites: props.TopSites,
       TopSitesRows: props.TopSitesRows,
       dispatch: props.dispatch,
       intl: props.intl,
       topSiteIconType: topSiteIconType
-    }), react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
+    }), react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement("div", {
       className: "edit-topsites-wrapper"
-    }, editForm && react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
+    }, editForm && react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement("div", {
       className: "edit-topsites"
-    }, react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_asrouter_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_6__["ModalOverlayWrapper"], {
+    }, react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_asrouter_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_5__["ModalOverlayWrapper"], {
       unstyled: true,
       onClose: this.onEditFormClose,
       innerClassName: "modal"
-    }, react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_TopSiteForm__WEBPACK_IMPORTED_MODULE_10__["TopSiteForm"], _extends({
+    }, react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_TopSiteForm__WEBPACK_IMPORTED_MODULE_9__["TopSiteForm"], _extends({
       site: props.TopSites.rows[editForm.index],
       onClose: this.onEditFormClose,
       dispatch: this.props.dispatch,
       intl: this.props.intl
-    }, editForm)))), showSearchShortcutsForm && react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("div", {
+    }, editForm)))), showSearchShortcutsForm && react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement("div", {
       className: "edit-search-shortcuts"
-    }, react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_asrouter_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_6__["ModalOverlayWrapper"], {
+    }, react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_asrouter_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_5__["ModalOverlayWrapper"], {
       unstyled: true,
       onClose: this.onSearchShortcutsFormClose,
       innerClassName: "modal"
-    }, react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_SearchShortcutsForm__WEBPACK_IMPORTED_MODULE_8__["SearchShortcutsForm"], {
+    }, react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_SearchShortcutsForm__WEBPACK_IMPORTED_MODULE_7__["SearchShortcutsForm"], {
       TopSites: props.TopSites,
       onClose: this.onSearchShortcutsFormClose,
       dispatch: this.props.dispatch
     }))))));
   }
 
 }
 const TopSites = Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(state => ({
   TopSites: state.TopSites,
   Prefs: state.Prefs,
   TopSitesRows: state.Prefs.values.topSitesRows
-}))(Object(react_intl__WEBPACK_IMPORTED_MODULE_5__["injectIntl"])(_TopSites));
+}))(_TopSites);
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 46 */
+/* 45 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TOP_SITES_SOURCE", function() { return TOP_SITES_SOURCE; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TOP_SITES_CONTEXT_MENU_OPTIONS", function() { return TOP_SITES_CONTEXT_MENU_OPTIONS; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TOP_SITES_SEARCH_SHORTCUTS_CONTEXT_MENU_OPTIONS", function() { return TOP_SITES_SEARCH_SHORTCUTS_CONTEXT_MENU_OPTIONS; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MIN_RICH_FAVICON_SIZE", function() { return MIN_RICH_FAVICON_SIZE; });
@@ -6361,71 +5967,68 @@ const TOP_SITES_CONTEXT_MENU_OPTIONS = [
 
 const TOP_SITES_SEARCH_SHORTCUTS_CONTEXT_MENU_OPTIONS = ["CheckPinTopSite", "Separator", "BlockUrl"]; // minimum size necessary to show a rich icon instead of a screenshot
 
 const MIN_RICH_FAVICON_SIZE = 96; // minimum size necessary to show any icon in the top left corner with a screenshot
 
 const MIN_CORNER_FAVICON_SIZE = 16;
 
 /***/ }),
-/* 47 */
+/* 46 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SelectableSearchShortcut", function() { return SelectableSearchShortcut; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SearchShortcutsForm", function() { return SearchShortcutsForm; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
-/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(46);
-
-
-
-
-class SelectableSearchShortcut extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);
+
+
+
+class SelectableSearchShortcut extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
   render() {
     const {
       shortcut,
       selected
     } = this.props;
     const imageStyle = {
       backgroundImage: `url("${shortcut.tippyTopIcon}")`
     };
-    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
+    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
       className: "top-site-outer search-shortcut"
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("input", {
+    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("input", {
       type: "checkbox",
       id: shortcut.keyword,
       name: shortcut.keyword,
       checked: selected,
       onChange: this.props.onChange
-    }), react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("label", {
+    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("label", {
       htmlFor: shortcut.keyword
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
+    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
       className: "top-site-inner"
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", null, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
+    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", null, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
       className: "tile"
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
+    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
       className: "top-site-icon rich-icon",
       style: imageStyle,
       "data-fallback": "@"
-    }), react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
+    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
       className: "top-site-icon search-topsite"
-    })), react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
+    })), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
       className: "title"
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("span", {
+    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("span", {
       dir: "auto"
     }, shortcut.keyword))))));
   }
 
 }
-class SearchShortcutsForm extends react__WEBPACK_IMPORTED_MODULE_2___default.a.PureComponent {
+class SearchShortcutsForm extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
   constructor(props) {
     super(props);
     this.handleChange = this.handleChange.bind(this);
     this.onCancelButtonClick = this.onCancelButtonClick.bind(this);
     this.onSaveButtonClick = this.onSaveButtonClick.bind(this); // clone the shortcuts and add them to the state so we can add isSelected property
 
     const shortcuts = [];
     const {
@@ -6493,26 +6096,26 @@ class SearchShortcutsForm extends react_
       data: {
         addedShortcuts: pinQueue,
         deletedShortcuts: unpinQueue
       }
     })); // Send the Telemetry pings.
 
     pinQueue.forEach(shortcut => {
       this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
-        source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_3__["TOP_SITES_SOURCE"],
+        source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__["TOP_SITES_SOURCE"],
         event: "SEARCH_EDIT_ADD",
         value: {
           search_vendor: shortcut.searchVendor
         }
       }));
     });
     unpinQueue.forEach(shortcut => {
       this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
-        source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_3__["TOP_SITES_SOURCE"],
+        source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__["TOP_SITES_SOURCE"],
         event: "SEARCH_EDIT_DELETE",
         value: {
           search_vendor: shortcut.searchVendor
         }
       }));
     });
     this.props.onClose();
   }
@@ -6522,68 +6125,65 @@ class SearchShortcutsForm extends react_
       url: shortcut.url,
       searchTopSite: true,
       label: shortcut.keyword,
       searchVendor: shortcut.shortURL
     };
   }
 
   render() {
-    return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("form", {
+    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("form", {
       className: "topsite-form"
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", {
+    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", {
       className: "search-shortcuts-container"
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("h3", {
-      className: "section-title"
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
-      id: "section_menu_action_add_search_engine"
-    })), react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("div", null, this.state.shortcuts.map(shortcut => react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(SelectableSearchShortcut, {
+    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("h3", {
+      className: "section-title grey-title",
+      "data-l10n-id": "newtab-topsites-add-search-engine-header"
+    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", null, this.state.shortcuts.map(shortcut => react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(SelectableSearchShortcut, {
       key: shortcut.keyword,
       shortcut: shortcut,
       selected: shortcut.isSelected,
       onChange: this.handleChange
-    })))), react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("section", {
+    })))), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("section", {
       className: "actions"
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
+    }, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
       className: "cancel",
       type: "button",
-      onClick: this.onCancelButtonClick
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
-      id: "topsites_form_cancel_button"
-    })), react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("button", {
+      onClick: this.onCancelButtonClick,
+      "data-l10n-id": "newtab-topsites-cancel-button"
+    }), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
       className: "done",
       type: "submit",
-      onClick: this.onSaveButtonClick
-    }, react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
-      id: "topsites_form_save_button"
-    }))));
+      onClick: this.onSaveButtonClick,
+      "data-l10n-id": "newtab-topsites-save-button"
+    })));
   }
 
 }
 
 /***/ }),
-/* 48 */
+/* 47 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSiteLink", function() { return TopSiteLink; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSite", function() { return TopSite; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSitePlaceholder", function() { return TopSitePlaceholder; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_TopSiteList", function() { return _TopSiteList; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSiteList", function() { return TopSiteList; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(46);
-/* harmony import */ var content_src_components_LinkMenu_LinkMenu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(29);
+/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(45);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var content_src_components_LinkMenu_LinkMenu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(57);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(10);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
-/* harmony import */ var content_src_lib_screenshot_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(39);
-/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(55);
+/* harmony import */ var content_src_lib_screenshot_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(38);
+/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(54);
 function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
 
 
 
 
 
 
 
@@ -6752,31 +6352,31 @@ class TopSiteLink extends react__WEBPACK
       };
     } else if (link.customScreenshotURL) {
       // assume high quality custom screenshot and use rich icon styles and class names
       imageClassName = "top-site-icon rich-icon";
       imageStyle = {
         backgroundColor: link.backgroundColor,
         backgroundImage: hasScreenshotImage ? `url(${this.state.screenshotImage.url})` : "none"
       };
-    } else if (tippyTopIcon || faviconSize >= _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__["MIN_RICH_FAVICON_SIZE"]) {
+    } else if (tippyTopIcon || faviconSize >= _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__["MIN_RICH_FAVICON_SIZE"]) {
       // styles and class names for top sites with rich icons
       imageClassName = "top-site-icon rich-icon";
       imageStyle = {
         backgroundColor: link.backgroundColor,
         backgroundImage: `url(${tippyTopIcon || link.favicon})`
       };
     } else {
       // styles and class names for top sites with screenshot + small icon in top left corner
       imageClassName = `screenshot${hasScreenshotImage ? " active" : ""}`;
       imageStyle = {
         backgroundImage: hasScreenshotImage ? `url(${this.state.screenshotImage.url})` : "none"
       }; // only show a favicon in top left if it's greater than 16x16
 
-      if (faviconSize >= _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__["MIN_CORNER_FAVICON_SIZE"]) {
+      if (faviconSize >= _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__["MIN_CORNER_FAVICON_SIZE"]) {
         showSmallFavicon = true;
         smallFaviconStyle = {
           backgroundImage: `url(${link.favicon})`
         };
       } else if (hasScreenshotImage) {
         // Don't show a small favicon if there is no screenshot, because that
         // would result in two fallback icons
         showSmallFavicon = true;
@@ -6871,17 +6471,17 @@ class TopSite extends react__WEBPACK_IMP
     return {
       value
     };
   }
 
   userEvent(event) {
     this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent(Object.assign({
       event,
-      source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__["TOP_SITES_SOURCE"],
+      source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__["TOP_SITES_SOURCE"],
       action_position: this.props.index
     }, this._getTelemetryInfo())));
   }
 
   onLinkClick(event) {
     this.userEvent("CLICK"); // Specially handle a top site link click for "typed" frecency bonus as
     // specified as a property on the link.
 
@@ -6943,35 +6543,27 @@ class TopSite extends react__WEBPACK_IMP
     return react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(TopSiteLink, _extends({}, props, {
       onClick: this.onLinkClick,
       onDragEvent: this.props.onDragEvent,
       className: `${props.className || ""}${isContextMenuOpen ? " active" : ""}`,
       title: title
     }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", null, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("button", {
       "aria-haspopup": "true",
       className: "context-menu-button icon",
-      title: this.props.intl.formatMessage({
-        id: "context_menu_title"
-      }),
+      "data-l10n-id": "newtab-menu-content-tooltip",
+      "data-l10n-args": `{ "title": "${title}" }`,
       onClick: this.onMenuButtonClick
-    }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("span", {
-      className: "sr-only"
-    }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
-      id: "context_menu_button_sr",
-      values: {
-        title
-      }
-    }))), isContextMenuOpen && react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(content_src_components_LinkMenu_LinkMenu__WEBPACK_IMPORTED_MODULE_3__["LinkMenu"], {
+    }), isContextMenuOpen && react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(content_src_components_LinkMenu_LinkMenu__WEBPACK_IMPORTED_MODULE_3__["LinkMenu"], {
       dispatch: props.dispatch,
       index: props.index,
       onUpdate: this.onMenuUpdate,
-      options: link.searchTopSite ? _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__["TOP_SITES_SEARCH_SHORTCUTS_CONTEXT_MENU_OPTIONS"] : _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__["TOP_SITES_CONTEXT_MENU_OPTIONS"],
+      options: link.searchTopSite ? _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__["TOP_SITES_SEARCH_SHORTCUTS_CONTEXT_MENU_OPTIONS"] : _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__["TOP_SITES_CONTEXT_MENU_OPTIONS"],
       site: link,
       siteInfo: this._getTelemetryInfo(),
-      source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__["TOP_SITES_SOURCE"]
+      source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__["TOP_SITES_SOURCE"]
     })));
   }
 
 }
 TopSite.defaultProps = {
   link: {},
 
   onActivate() {}
@@ -6994,19 +6586,17 @@ class TopSitePlaceholder extends react__
 
   render() {
     return react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(TopSiteLink, _extends({}, this.props, {
       className: `placeholder ${this.props.className || ""}`,
       isDraggable: false
     }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("button", {
       "aria-haspopup": "true",
       className: "context-menu-button edit-button icon",
-      title: this.props.intl.formatMessage({
-        id: "edit_topsites_edit_button"
-      }),
+      "data-l10n-id": "newtab-menu-topsites-placeholder-tooltip",
       onClick: this.onEditButtonClick
     }));
   }
 
 }
 class _TopSiteList extends react__WEBPACK_IMPORTED_MODULE_4___default.a.PureComponent {
   static get DEFAULT_STATE() {
     return {
@@ -7035,17 +6625,17 @@ class _TopSiteList extends react__WEBPAC
         this.setState(_TopSiteList.DEFAULT_STATE);
       }
     }
   }
 
   userEvent(event, index) {
     this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
       event,
-      source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_2__["TOP_SITES_SOURCE"],
+      source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__["TOP_SITES_SOURCE"],
       action_position: index
     }));
   }
 
   onDragEvent(event, index, link, title) {
     switch (event.type) {
       case "dragstart":
         this.dropped = false;
@@ -7213,43 +6803,40 @@ class _TopSiteList extends react__WEBPAC
     }
 
     return react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("ul", {
       className: `top-sites-list${this.state.draggedSite ? " dnd-active" : ""}`
     }, topSitesUI);
   }
 
 }
-const TopSiteList = Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["injectIntl"])(_TopSiteList);
+const TopSiteList = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__["injectIntl"])(_TopSiteList);
 
 /***/ }),
-/* 49 */
+/* 48 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_Search", function() { return _Search; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Search", function() { return Search; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(25);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_2__);
-/* harmony import */ var content_src_lib_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var content_src_lib_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
 /* globals ContentSearchUIController */
 
 
 
 
 
 
-
-class _Search extends react__WEBPACK_IMPORTED_MODULE_4___default.a.PureComponent {
+class _Search extends react__WEBPACK_IMPORTED_MODULE_3___default.a.PureComponent {
   constructor(props) {
     super(props);
     this.onSearchClick = this.onSearchClick.bind(this);
     this.onSearchHandoffClick = this.onSearchHandoffClick.bind(this);
     this.onSearchHandoffPaste = this.onSearchHandoffPaste.bind(this);
     this.onSearchHandoffDrop = this.onSearchHandoffDrop.bind(this);
     this.onInputMount = this.onInputMount.bind(this);
     this.onSearchHandoffButtonMount = this.onSearchHandoffButtonMount.bind(this);
@@ -7318,23 +6905,23 @@ class _Search extends react__WEBPACK_IMP
 
   onInputMount(input) {
     if (input) {
       // The "healthReportKey" and needs to be "newtab" or "abouthome" so that
       // BrowserUsageTelemetry.jsm knows to handle events with this name, and
       // can add the appropriate telemetry probes for search. Without the correct
       // name, certain tests like browser_UsageTelemetry_content.js will fail
       // (See github ticket #2348 for more details)
-      const healthReportKey = content_src_lib_constants__WEBPACK_IMPORTED_MODULE_3__["IS_NEWTAB"] ? "newtab" : "abouthome"; // The "searchSource" needs to be "newtab" or "homepage" and is sent with
+      const healthReportKey = content_src_lib_constants__WEBPACK_IMPORTED_MODULE_2__["IS_NEWTAB"] ? "newtab" : "abouthome"; // The "searchSource" needs to be "newtab" or "homepage" and is sent with
       // the search data and acts as context for the search request (See
       // nsISearchEngine.getSubmission). It is necessary so that search engine
       // plugins can correctly atribute referrals. (See github ticket #3321 for
       // more details)
 
-      const searchSource = content_src_lib_constants__WEBPACK_IMPORTED_MODULE_3__["IS_NEWTAB"] ? "newtab" : "homepage"; // gContentSearchController needs to exist as a global so that tests for
+      const searchSource = content_src_lib_constants__WEBPACK_IMPORTED_MODULE_2__["IS_NEWTAB"] ? "newtab" : "homepage"; // gContentSearchController needs to exist as a global so that tests for
       // the existing about:home can find it; and so it allows these tests to pass.
       // In the future, when activity stream is default about:home, this can be renamed
 
       window.gContentSearchController = new ContentSearchUIController(input, input.parentNode, healthReportKey, searchSource);
       addEventListener("ContentSearchClient", this);
     } else {
       window.gContentSearchController = null;
       removeEventListener("ContentSearchClient", this);
@@ -7349,99 +6936,78 @@ class _Search extends react__WEBPACK_IMP
    * Do not change the ID on the input field, as legacy newtab code
    * specifically looks for the id 'newtab-search-text' on input fields
    * in order to execute searches in various tests
    */
 
 
   render() {
     const wrapperClassName = ["search-wrapper", this.props.hide && "search-hidden", this.props.fakeFocus && "fake-focus"].filter(v => v).join(" ");
-    return react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
+    return react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
       className: wrapperClassName
-    }, this.props.showLogo && react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
+    }, this.props.showLogo && react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
       className: "logo-and-wordmark"
-    }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
+    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
       className: "logo"
-    }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
+    }), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
       className: "wordmark"
-    })), !this.props.handoffEnabled && react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
+    })), !this.props.handoffEnabled && react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
       className: "search-inner-wrapper"
-    }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("label", {
-      htmlFor: "newtab-search-text",
-      className: "search-label"
-    }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("span", {
-      className: "sr-only"
-    }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
-      id: "search_web_placeholder"
-    }))), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("input", {
+    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
       id: "newtab-search-text",
+      "data-l10n-id": "newtab-search-box-search-the-web-input",
       maxLength: "256",
-      placeholder: this.props.intl.formatMessage({
-        id: "search_web_placeholder"
-      }),
       ref: this.onInputMount,
-      title: this.props.intl.formatMessage({
-        id: "search_web_placeholder"
-      }),
       type: "search"
-    }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("button", {
+    }), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
       id: "searchSubmit",
       className: "search-button",
-      onClick: this.onSearchClick,
-      title: this.props.intl.formatMessage({
-        id: "search_button"
-      })
-    }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("span", {
-      className: "sr-only"
-    }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
-      id: "search_button"
-    })))), this.props.handoffEnabled && react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
+      "data-l10n-id": "newtab-search-box-search-button",
+      onClick: this.onSearchClick
+    })), this.props.handoffEnabled && react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
       className: "search-inner-wrapper"
-    }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("button", {
+    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
       className: "search-handoff-button",
+      "data-l10n-id": "newtab-search-box-search-the-web-input",
       ref: this.onSearchHandoffButtonMount,
       onClick: this.onSearchHandoffClick,
-      tabIndex: "-1",
-      title: this.props.intl.formatMessage({
-        id: "search_web_placeholder"
-      })
-    }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
-      className: "fake-textbox"
-    }, this.props.intl.formatMessage({
-      id: "search_web_placeholder"
-    })), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("input", {
+      tabIndex: "-1"
+    }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
+      className: "fake-textbox",
+      "data-l10n-id": "newtab-search-box-search-the-web-text"
+    }), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
       type: "search",
       className: "fake-editable",
       tabIndex: "-1",
       "aria-hidden": "true",
       onDrop: this.onSearchHandoffDrop,
       onPaste: this.onSearchHandoffPaste
-    }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
+    }), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
       className: "fake-caret"
-    })), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("input", {
+    })), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
       type: "search",
       style: {
         display: "none"
       },
       ref: this.onInputMount
     })));
   }
 
 }
-const Search = Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])()(Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["injectIntl"])(_Search));
+const Search = Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])()(_Search);
 
 /***/ }),
-/* 50 */
+/* 49 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DetectUserSessionStart", function() { return DetectUserSessionStart; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var common_PerfService_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(41);
+/* harmony import */ var common_PerfService_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(40);
 
 
 const VISIBLE = "visible";
 const VISIBILITY_CHANGE_EVENT = "visibilitychange";
 class DetectUserSessionStart {
   constructor(store, options = {}) {
     this._store = store; // Overrides for testing
 
@@ -7503,17 +7069,17 @@ class DetectUserSessionStart {
       this.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
     }
   }
 
 }
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 51 */
+/* 50 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: ./common/Actions.jsm
 var Actions = __webpack_require__(2);
 
@@ -7640,18 +7206,18 @@ DSImage_DSImage.defaultProps = {
   extraClassNames: null,
   // Additional classnames to append to component
   optimize: true // Measure parent container to request exact sizes
 
 };
 // EXTERNAL MODULE: external "ReactIntl"
 var external_ReactIntl_ = __webpack_require__(4);
 
-// EXTERNAL MODULE: ./content-src/components/LinkMenu/LinkMenu.jsx
-var LinkMenu = __webpack_require__(29);
+// EXTERNAL MODULE: ./content-src/components/LinkMenu/LinkMenu.jsx + 1 modules
+var LinkMenu = __webpack_require__(57);
 
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/DSLinkMenu/DSLinkMenu.jsx
 
 
 
 class DSLinkMenu_DSLinkMenu extends external_React_default.a.PureComponent {
   constructor(props) {
     super(props);
@@ -7681,51 +7247,49 @@ class DSLinkMenu_DSLinkMenu extends exte
       dsLinkMenuHostDiv.parentElement.classList.remove("active", "last-item");
     }
 
     this.setState({
       showContextMenu
     });
   }
 
-  onMenuShow() {
-    const dsLinkMenuHostDiv = this.contextMenuButtonRef.current.parentElement;
+  nextAnimationFrame() {
+    return new Promise(resolve => requestAnimationFrame(resolve));
+  }
+
+  async onMenuShow() {
+    const dsLinkMenuHostDiv = this.contextMenuButtonRef.current.parentElement; // Wait for next frame before computing scrollMaxX to allow fluent menu strings to be visible
+
+    await this.nextAnimationFrame();
 
     if (this.windowObj.scrollMaxX > 0) {
       dsLinkMenuHostDiv.parentElement.classList.add("last-item");
     }
 
     dsLinkMenuHostDiv.parentElement.classList.add("active");
   }
 
   render() {
     const {
       index,
       dispatch
     } = this.props;
     const isContextMenuOpen = this.state.showContextMenu && this.state.activeCard === index;
     const TOP_STORIES_CONTEXT_MENU_OPTIONS = ["CheckBookmarkOrArchive", "CheckSavedToPocket", "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"];
+    const type = this.props.type || "DISCOVERY_STREAM";
     const title = this.props.title || this.props.source;
-    const type = this.props.type || "DISCOVERY_STREAM";
     return external_React_default.a.createElement("div", null, external_React_default.a.createElement("button", {
       ref: this.contextMenuButtonRef,
       "aria-haspopup": "true",
       className: "context-menu-button icon",
-      title: this.props.intl.formatMessage({
-        id: "context_menu_title"
-      }),
+      "data-l10n-id": "newtab-menu-content-tooltip",
+      "data-l10n-args": `{ "title": "${title}" }`,
       onClick: this.onMenuButtonClick
-    }, external_React_default.a.createElement("span", {
-      className: "sr-only"
-    }, external_React_default.a.createElement(external_ReactIntl_["FormattedMessage"], {
-      id: "context_menu_button_sr",
-      values: {
-        title
-      }
-    }))), isContextMenuOpen && external_React_default.a.createElement(LinkMenu["LinkMenu"], {
+    }), isContextMenuOpen && external_React_default.a.createElement(LinkMenu["LinkMenu"], {
       dispatch: dispatch,
       index: index,
       source: type.toUpperCase(),
       onUpdate: this.onMenuUpdate,
       onShow: this.onMenuShow,
       options: TOP_STORIES_CONTEXT_MENU_OPTIONS,
       shouldSendImpressionStats: true,
       site: {
@@ -7739,17 +7303,17 @@ class DSLinkMenu_DSLinkMenu extends exte
         bookmarkGuid: this.props.bookmarkGuid
       }
     }));
   }
 
 }
 const DSLinkMenu = Object(external_ReactIntl_["injectIntl"])(DSLinkMenu_DSLinkMenu);
 // EXTERNAL MODULE: ./content-src/components/DiscoveryStreamImpressionStats/ImpressionStats.jsx
-var ImpressionStats = __webpack_require__(32);
+var ImpressionStats = __webpack_require__(30);
 
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/SafeAnchor/SafeAnchor.jsx
 
 
 class SafeAnchor_SafeAnchor extends external_React_default.a.PureComponent {
   constructor(props) {
     super(props);
     this.onClick = this.onClick.bind(this);
@@ -8065,17 +7629,17 @@ class CardGrid_CardGrid extends external
 
 }
 CardGrid_CardGrid.defaultProps = {
   border: `border`,
   items: 4 // Number of stories to display
 
 };
 // EXTERNAL MODULE: ./content-src/components/CollapsibleSection/CollapsibleSection.jsx
-var CollapsibleSection = __webpack_require__(33);
+var CollapsibleSection = __webpack_require__(31);
 
 // EXTERNAL MODULE: external "ReactRedux"
 var external_ReactRedux_ = __webpack_require__(25);
 
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/DSMessage/DSMessage.jsx
 
 
 class DSMessage_DSMessage extends external_React_default.a.PureComponent {
@@ -8359,17 +7923,17 @@ class Hero_Hero extends external_React_d
         className: "context"
       }, heroRec.context) : external_React_default.a.createElement("p", {
         className: "source clamp"
       }, heroRec.domain), external_React_default.a.createElement("header", {
         className: "clamp"
       }, heroRec.title), external_React_default.a.createElement("p", {
         className: "excerpt clamp"
       }, heroRec.excerpt))), external_React_default.a.createElement(ImpressionStats["ImpressionStats"], {
-        campaignId: heroRec.campaignId,
+        campaignId: heroRec.campaign_id,
         rows: [{
           id: heroRec.id,
           pos: heroRec.pos,
           ...(heroRec.shim && heroRec.shim.impression ? {
             shim: heroRec.shim.impression
           } : {})
         }],
         dispatch: this.props.dispatch,
@@ -8430,17 +7994,17 @@ class Hero_Hero extends external_React_d
 }
 Hero_Hero.defaultProps = {
   data: {},
   border: `border`,
   items: 1 // Number of stories to display
 
 };
 // EXTERNAL MODULE: ./content-src/components/Sections/Sections.jsx
-var Sections = __webpack_require__(38);
+var Sections = __webpack_require__(37);
 
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/Highlights/Highlights.jsx
 function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
 
 
 
 
 class Highlights_Highlights extends external_React_default.a.PureComponent {
@@ -8723,17 +8287,17 @@ const selectLayoutRender = (state, prefs
   }
 
   return {
     spocsFill,
     layoutRender
   };
 };
 // EXTERNAL MODULE: ./content-src/components/TopSites/TopSites.jsx
-var TopSites = __webpack_require__(45);
+var TopSites = __webpack_require__(44);
 
 // CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/TopSites/TopSites.jsx
 
 
 
 class TopSites_TopSites extends external_React_default.a.PureComponent {
   render() {
     const header = this.props.header || {};
@@ -8984,17 +8548,17 @@ class DiscoveryStreamBase_DiscoveryStrea
     if (!topStories) {
       return null;
     } // Extract TopSites to render before the rest and Message to use for header
 
 
     const topSites = extractComponent("TopSites");
     const message = extractComponent("Message") || {
       header: {
-        link_text: topStories.learnMore.link.id,
+        link_text: topStories.learnMore.link.message,
         link_url: topStories.learnMore.link.href,
         title: topStories.title
       }
     }; // Render a DS-style TopSites then the rest if any in a collapsible section
 
     return external_React_default.a.createElement(external_React_default.a.Fragment, null, topSites && this.renderLayout([{
       width: 12,
       components: [topSites]
@@ -9003,17 +8567,17 @@ class DiscoveryStreamBase_DiscoveryStrea
       collapsed: topStories.pref.collapsed,
       dispatch: this.props.dispatch,
       icon: topStories.icon,
       id: topStories.id,
       isFixed: true,
       learnMore: {
         link: {
           href: message.header.link_url,
-          id: message.header.link_text
+          message: message.header.link_text
         }
       },
       privacyNoticeURL: topStories.privacyNoticeURL,
       showPrefName: topStories.pref.feed,
       title: message.header.title
     }, this.renderLayout(layoutRender)), this.renderLayout([{
       width: 12,
       components: [{
@@ -9046,17 +8610,17 @@ class DiscoveryStreamBase_DiscoveryStrea
 }
 const DiscoveryStreamBase = Object(external_ReactRedux_["connect"])(state => ({
   DiscoveryStream: state.DiscoveryStream,
   Prefs: state.Prefs,
   Sections: state.Sections
 }))(DiscoveryStreamBase_DiscoveryStreamBase);
 
 /***/ }),
-/* 52 */
+/* 51 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: external "React"
 var external_React_ = __webpack_require__(10);
 
@@ -9843,17 +9407,17 @@ localized_Localized.propTypes = {
  * components for more information.
  */
 
 
 
 
 
 /***/ }),
-/* 53 */
+/* 52 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: external "React"
 var external_React_ = __webpack_require__(10);
 var external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);
@@ -10894,17 +10458,17 @@ const SnippetsTemplates = {
   newsletter_snippet: NewsletterSnippet,
   fxa_signup_snippet: FXASignupSnippet,
   send_to_device_snippet: SendToDeviceSnippet,
   eoy_snippet: EOYSnippet,
   simple_below_search_snippet: SimpleBelowSearchSnippet_SimpleBelowSearchSnippet
 };
 
 /***/ }),
-/* 54 */
+/* 53 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // CONCATENATED MODULE: ./node_modules/fluent/src/types.js
 /* global Intl */
 
@@ -12311,17 +11875,17 @@ function generateBundles(content) {
     }
 
     bundle.addMessages(`${key} = ${string}`);
   });
   return [bundle];
 }
 
 /***/ }),
-/* 55 */
+/* 54 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: ./common/Actions.jsm
 var Actions = __webpack_require__(2);
 
@@ -13159,82 +12723,74 @@ var reducers = {
   Dialog,
   Sections,
   Pocket,
   DiscoveryStream,
   Search
 };
 
 /***/ }),
-/* 56 */
+/* 55 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: ./common/Actions.jsm
 var Actions = __webpack_require__(2);
 
-// EXTERNAL MODULE: external "ReactIntl"
-var external_ReactIntl_ = __webpack_require__(4);
-
 // CONCATENATED MODULE: ./content-src/components/Card/types.js
 const cardContextTypes = {
   history: {
-    intlID: "type_label_visited",
+    fluentID: "newtab-label-visited",
     icon: "history-item"
   },
   bookmark: {
-    intlID: "type_label_bookmarked",
+    fluentID: "newtab-label-bookmarked",
     icon: "bookmark-added"
   },
   trending: {
-    intlID: "type_label_recommended",
+    fluentID: "newtab-label-recommended",
     icon: "trending"
   },
-  now: {
-    intlID: "type_label_now",
-    icon: "now"
-  },
   pocket: {
-    intlID: "type_label_pocket",
+    fluentID: "newtab-label-saved",
     icon: "pocket"
   },
   download: {
-    intlID: "type_label_downloaded",
+    fluentID: "newtab-label-download",
     icon: "download"
   }
 };
 // EXTERNAL MODULE: external "ReactRedux"
 var external_ReactRedux_ = __webpack_require__(25);
 
-// EXTERNAL MODULE: ./content-src/lib/link-menu-options.js
-var link_menu_options = __webpack_require__(31);
-
-// EXTERNAL MODULE: ./content-src/components/LinkMenu/LinkMenu.jsx
-var LinkMenu = __webpack_require__(29);
+// EXTERNAL MODULE: external "ReactIntl"
+var external_ReactIntl_ = __webpack_require__(4);
+
+// EXTERNAL MODULE: ./content-src/components/LinkMenu/LinkMenu.jsx + 1 modules
+var LinkMenu = __webpack_require__(57);
 
 // EXTERNAL MODULE: external "React"
 var external_React_ = __webpack_require__(10);
 var external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);
 
 // EXTERNAL MODULE: ./content-src/lib/screenshot-utils.js
-var screenshot_utils = __webpack_require__(39);
+var screenshot_utils = __webpack_require__(38);
 
 // CONCATENATED MODULE: ./content-src/components/Card/Card.jsx
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_Card", function() { return Card_Card; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Card", function() { return Card; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PlaceholderCard", function() { return PlaceholderCard; });
 
 
 
 
 
 
-
  // Keep track of pending image loads to only request once
 
 const gImageLoading = new Map();
 /**
  * Card component.
  * Cards are found within a Section component and contain information about a link such
  * as preview image, page title, page description, and some context about if the page
  * was visited, bookmarked, trending etc...
@@ -13463,21 +13019,22 @@ class Card_Card extends external_React_d
       dispatch,
       contextMenuOptions,
       eventSource,
       shouldSendImpressionStats
     } = this.props;
     const {
       props
     } = this;
+    const title = link.title || link.hostname;
     const isContextMenuOpen = this.state.showContextMenu && this.state.activeCard === index; // Display "now" as "trending" until we have new strings #3402
 
     const {
       icon,
-      intlID
+      fluentID
     } = cardContextTypes[link.type === "now" ? "trending" : link.type] || {};
     const hasImage = this.state.cardImage || link.hasImage;
     const imageStyle = {
       backgroundImage: this.state.cardImage ? `url(${this.state.cardImage.url})` : "none"
     };
     const outerClassName = ["card-outer", className, isContextMenuOpen && "active", props.placeholder && "placeholder"].filter(v => v).join(" ");
     return external_React_default.a.createElement("li", {
       className: outerClassName
@@ -13489,20 +13046,19 @@ class Card_Card extends external_React_d
     }, external_React_default.a.createElement("div", {
       className: "card-preview-image-outer"
     }, hasImage && external_React_default.a.createElement("div", {
       className: `card-preview-image${this.state.imageLoaded ? " loaded" : ""}`,
       style: imageStyle
     })), external_React_default.a.createElement("div", {
       className: "card-details"
     }, link.type === "download" && external_React_default.a.createElement("div", {
-      className: "card-host-name alternate"
-    }, external_React_default.a.createElement(external_ReactIntl_["FormattedMessage"], {
-      id: Object(link_menu_options["GetPlatformString"])(this.props.platform)
-    })), link.hostname && external_React_default.a.createElement("div", {
+      className: "card-host-name alternate",
+      "data-l10n-id": "newtab-menu-show-file"
+    }), link.hostname && external_React_default.a.createElement("div", {
       className: "card-host-name"
     }, link.hostname.slice(0, 100), link.type === "download" && `  \u2014 ${link.description}`), external_React_default.a.createElement("div", {
       className: ["card-text", icon ? "" : "no-context", link.description ? "" : "no-description", link.hostname ? "" : "no-host-name"].join(" ")
     }, external_React_default.a.createElement("h4", {
       className: "card-title",
       dir: "auto"
     }, link.title), external_React_default.a.createElement("p", {
       className: "card-description",
@@ -13513,34 +13069,28 @@ class Card_Card extends external_React_d
       "aria-haspopup": "true",
       className: `card-context-icon icon icon-${icon}`
     }), link.icon && link.context && external_React_default.a.createElement("span", {
       "aria-haspopup": "true",
       className: "card-context-icon icon",
       style: {
         backgroundImage: `url('${link.icon}')`
       }
-    }), intlID && !link.context && external_React_default.a.createElement("div", {
-      className: "card-context-label"
-    }, external_React_default.a.createElement(external_ReactIntl_["FormattedMessage"], {
-      id: intlID,
-      defaultMessage: "Visited"
-    })), link.context && external_React_default.a.createElement("div", {
+    }), fluentID && !link.context && external_React_default.a.createElement("div", {
+      className: "card-context-label",
+      "data-l10n-id": fluentID
+    }), link.context && external_React_default.a.createElement("div", {
       className: "card-context-label"
     }, link.context))))), !props.placeholder && external_React_default.a.createElement("button", {
       "aria-haspopup": "true",
+      "data-l10n-id": "newtab-menu-content-tooltip",
+      "data-l10n-args": `{ "title": "${title}" }`,
       className: "context-menu-button icon",
-      title: this.props.intl.formatMessage({
-        id: "context_menu_title"
-      }),
       onClick: this.onMenuButtonClick
-    }, external_React_default.a.createElement("span", {
-      "aria-haspopup": "true",
-      className: "sr-only"
-    }, `Open context menu for ${link.title}`)), isContextMenuOpen && external_React_default.a.createElement(LinkMenu["LinkMenu"], {
+    }), isContextMenuOpen && external_React_default.a.createElement(LinkMenu["LinkMenu"], {
       dispatch: dispatch,
       index: index,
       source: eventSource,
       onUpdate: this.onMenuUpdate,
       options: link.contextMenuOptions || contextMenuOptions,
       site: link,
       siteInfo: this._getTelemetryInfo(),
       shouldSendImpressionStats: shouldSendImpressionStats
@@ -13555,41 +13105,37 @@ const Card = Object(external_ReactRedux_
   platform: state.Prefs.values.platform
 }))(Object(external_ReactIntl_["injectIntl"])(Card_Card));
 const PlaceholderCard = props => external_React_default.a.createElement(Card, {
   placeholder: true,
   className: props.className
 });
 
 /***/ }),
-/* 57 */
+/* 56 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 
 // EXTERNAL MODULE: ./common/Actions.jsm
 var Actions = __webpack_require__(2);
 
 // EXTERNAL MODULE: ./content-src/components/A11yLinkButton/A11yLinkButton.jsx
-var A11yLinkButton = __webpack_require__(35);
-
-// EXTERNAL MODULE: external "ReactIntl"
-var external_ReactIntl_ = __webpack_require__(4);
+var A11yLinkButton = __webpack_require__(33);
 
 // EXTERNAL MODULE: external "React"
 var external_React_ = __webpack_require__(10);
 var external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);
 
 // EXTERNAL MODULE: ./content-src/components/TopSites/TopSitesConstants.js
-var TopSitesConstants = __webpack_require__(46);
+var TopSitesConstants = __webpack_require__(45);
 
 // CONCATENATED MODULE: ./content-src/components/TopSites/TopSiteFormInput.jsx
 
-
 class TopSiteFormInput_TopSiteFormInput extends external_React_default.a.PureComponent {
   constructor(props) {
     super(props);
     this.state = {
       validationError: this.props.validationError
     };
     this.onChange = this.onChange.bind(this);
     this.onMount = this.onMount.bind(this);
@@ -13661,57 +13207,53 @@ class TopSiteFormInput_TopSiteFormInput 
 
   render() {
     const {
       typeUrl
     } = this.props;
     const {
       validationError
     } = this.state;
-    return external_React_default.a.createElement("label", null, external_React_default.a.createElement(external_ReactIntl_["FormattedMessage"], {
-      id: this.props.titleId
+    return external_React_default.a.createElement("label", null, external_React_default.a.createElement("span", {
+      "data-l10n-id": this.props.titleId
     }), external_React_default.a.createElement("div", {
       className: `field ${typeUrl ? "url" : ""}${validationError ? " invalid" : ""}`
     }, external_React_default.a.createElement("input", {
       type: "text",
       value: this.props.value,
       ref: this.onMount,
       onChange: this.onChange,
-      placeholder: this.props.intl.formatMessage({
-        id: this.props.placeholderId
-      }) // Set focus on error if the url field is valid or when the input is first rendered and is empty
+      "data-l10n-id": this.props.placeholderId // Set focus on error if the url field is valid or when the input is first rendered and is empty
       // eslint-disable-next-line jsx-a11y/no-autofocus
       ,
       autoFocus: this.props.shouldFocus,
       disabled: this.props.loading
     }), this.renderLoadingOrCloseButton(), validationError && external_React_default.a.createElement("aside", {
-      className: "error-tooltip"
-    }, external_React_default.a.createElement(external_ReactIntl_["FormattedMessage"], {
-      id: this.props.errorMessageId
-    }))));
+      className: "error-tooltip",
+      "data-l10n-id": this.props.errorMessageId
+    })));
   }
 
 }
 TopSiteFormInput_TopSiteFormInput.defaultProps = {
   showClearButton: false,
   value: "",
   validationError: false
 };
 // EXTERNAL MODULE: ./content-src/components/TopSites/TopSite.jsx
-var TopSite = __webpack_require__(48);
+var TopSite = __webpack_require__(47);
 
 // CONCATENATED MODULE: ./content-src/components/TopSites/TopSiteForm.jsx
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TopSiteForm", function() { return TopSiteForm_TopSiteForm; });
 
 
 
 
 
 
-
 class TopSiteForm_TopSiteForm extends external_React_default.a.PureComponent {
   constructor(props) {
     super(props);
     const {
       site
     } = props;
     this.state = {
       label: site ? site.label || site.hostname : "",
@@ -13888,36 +13430,34 @@ class TopSiteForm_TopSiteForm extends ex
     const validationError = this.state.validationError && !this.validateCustomScreenshotUrl() || requestFailed; // Set focus on error if the url field is valid or when the input is first rendered and is empty
 
     const shouldFocus = validationError && this.validateUrl(this.state.url) || !customScreenshotUrl;
     const isLoading = this.props.previewResponse === null && customScreenshotUrl && this.props.previewUrl === this.cleanUrl(customScreenshotUrl);
 
     if (!this.state.showCustomScreenshotForm) {
       return external_React_default.a.createElement(A11yLinkButton["A11yLinkButton"], {
         onClick: this.onEnableScreenshotUrlForm,
-        className: "enable-custom-image-input"
-      }, external_React_default.a.createElement(external_ReactIntl_["FormattedMessage"], {
-        id: "topsites_form_use_image_link"
-      }));
+        className: "enable-custom-image-input",
+        "data-l10n-id": "newtab-topsites-use-image-link"
+      });
     }
 
     return external_React_default.a.createElement("div", {
       className: "custom-image-input-container"
     }, external_React_default.a.createElement(TopSiteFormInput_TopSiteFormInput, {
-      errorMessageId: requestFailed ? "topsites_form_image_validation" : "topsites_form_url_validation",
+      errorMessageId: requestFailed ? "newtab-topsites-image-validation" : "newtab-topsites-url-validation",
       loading: isLoading,
       onChange: this.onCustomScreenshotUrlChange,
       onClear: this.onClearScreenshotInput,
       shouldFocus: shouldFocus,
       typeUrl: true,
       value: customScreenshotUrl,
       validationError: validationError,
-      titleId: "topsites_form_image_url_label",
-      placeholderId: "topsites_form_url_placeholder",
-      intl: this.props.intl
+      titleId: "newtab-topsites-image-url-label",
+      placeholderId: "newtab-topsites-url-input"
     }));
   }
 
   render() {
     const {
       customScreenshotUrl
     } = this.state;
     const requestFailed = this.props.previewResponse === ""; // For UI purposes, editing without an existing link is "add"
@@ -13938,65 +13478,433 @@ class TopSiteForm_TopSiteForm extends ex
 
     const onSubmit = previewMode ? this.onPreviewButtonClick : this.onDoneButtonClick;
     return external_React_default.a.createElement("form", {
       className: "topsite-form",
       onSubmit: onSubmit
     }, external_React_default.a.createElement("div", {
       className: "form-input-container"
     }, external_React_default.a.createElement("h3", {
-      className: "section-title"
-    }, external_React_default.a.createElement(external_ReactIntl_["FormattedMessage"], {
-      id: showAsAdd ? "topsites_form_add_header" : "topsites_form_edit_header"
-    })), external_React_default.a.createElement("div", {
+      className: "section-title grey-title",
+      "data-l10n-id": showAsAdd ? "newtab-topsites-add-topsites-header" : "newtab-topsites-edit-topsites-header"
+    }), external_React_default.a.createElement("div", {
       className: "fields-and-preview"
     }, external_React_default.a.createElement("div", {
       className: "form-wrapper"
     }, external_React_default.a.createElement(TopSiteFormInput_TopSiteFormInput, {
       onChange: this.onLabelChange,
       value: this.state.label,
-      titleId: "topsites_form_title_label",
-      placeholderId: "topsites_form_title_placeholder",
-      intl: this.props.intl
+      titleId: "newtab-topsites-title-label",
+      placeholderId: "newtab-topsites-title-input"
     }), external_React_default.a.createElement(TopSiteFormInput_TopSiteFormInput, {
       onChange: this.onUrlChange,
       shouldFocus: this.state.validationError && !this.validateUrl(this.state.url),
       value: this.state.url,
       onClear: this.onClearUrlClick,
       validationError: this.state.validationError && !this.validateUrl(this.state.url),
-      titleId: "topsites_form_url_label",
+      titleId: "newtab-topsites-url-label",
       typeUrl: true,
-      placeholderId: "topsites_form_url_placeholder",
-      errorMessageId: "topsites_form_url_validation",
-      intl: this.props.intl
+      placeholderId: "newtab-topsites-url-input",
+      errorMessageId: "newtab-topsites-url-validation"
     }), this._renderCustomScreenshotInput()), external_React_default.a.createElement(TopSite["TopSiteLink"], {
       link: previewLink,
       defaultStyle: requestFailed,
       title: this.state.label
     }))), external_React_default.a.createElement("section", {
       className: "actions"
     }, external_React_default.a.createElement("button", {
       className: "cancel",
       type: "button",
-      onClick: this.onCancelButtonClick
-    }, external_React_default.a.createElement(external_ReactIntl_["FormattedMessage"], {
-      id: "topsites_form_cancel_button"
-    })), previewMode ? external_React_default.a.createElement("button", {
+      onClick: this.onCancelButtonClick,
+      "data-l10n-id": "newtab-topsites-cancel-button"
+    }), previewMode ? external_React_default.a.createElement("button", {
       className: "done preview",
-      type: "submit"
-    }, external_React_default.a.createElement(external_ReactIntl_["FormattedMessage"], {
-      id: "topsites_form_preview_button"
-    })) : external_React_default.a.createElement("button", {
+      type: "submit",
+      "data-l10n-id": "newtab-topsites-preview-button"
+    }) : external_React_default.a.createElement("button", {
       className: "done",
-      type: "submit"
-    }, external_React_default.a.createElement(external_ReactIntl_["FormattedMessage"], {
-      id: showAsAdd ? "topsites_form_add_button" : "topsites_form_save_button"
-    }))));
+      type: "submit",
+      "data-l10n-id": showAsAdd ? "newtab-topsites-add-button" : "newtab-topsites-save-button"
+    })));
   }
 
 }
 TopSiteForm_TopSiteForm.defaultProps = {
   site: null,
   index: -1
 };
 
+/***/ }),
+/* 57 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+// EXTERNAL MODULE: ./common/Actions.jsm
+var Actions = __webpack_require__(2);
+
+// EXTERNAL MODULE: external "ReactRedux"
+var external_ReactRedux_ = __webpack_require__(25);
+
+// EXTERNAL MODULE: ./content-src/components/ContextMenu/ContextMenu.jsx
+var ContextMenu = __webpack_require__(29);
+
+// CONCATENATED MODULE: ./content-src/lib/link-menu-options.js
+
+
+const _OpenInPrivateWindow = site => ({
+  id: "newtab-menu-open-new-private-window",
+  icon: "new-window-private",
+  action: Actions["actionCreators"].OnlyToMain({
+    type: Actions["actionTypes"].OPEN_PRIVATE_WINDOW,
+    data: {
+      url: site.url,
+      referrer: site.referrer
+    }
+  }),
+  userEvent: "OPEN_PRIVATE_WINDOW"
+});
+/**
+ * List of functions that return items that can be included as menu options in a
+ * LinkMenu. All functions take the site as the first parameter, and optionally
+ * the index of the site.
+ */
+
+
+const LinkMenuOptions = {
+  Separator: () => ({
+    type: "separator"
+  }),
+  EmptyItem: () => ({
+    type: "empty"
+  }),
+  RemoveBookmark: site => ({
+    id: "newtab-menu-remove-bookmark",
+    icon: "bookmark-added",
+    action: Actions["actionCreators"].AlsoToMain({
+      type: Actions["actionTypes"].DELETE_BOOKMARK_BY_ID,
+      data: site.bookmarkGuid
+    }),
+    userEvent: "BOOKMARK_DELETE"
+  }),
+  AddBookmark: site => ({
+    id: "newtab-menu-bookmark",
+    icon: "bookmark-hollow",
+    action: Actions["actionCreators"].AlsoToMain({
+      type: Actions["actionTypes"].BOOKMARK_URL,
+      data: {
+        url: site.url,
+        title: site.title,
+        type: site.type
+      }
+    }),
+    userEvent: "BOOKMARK_ADD"
+  }),
+  OpenInNewWindow: site => ({
+    id: "newtab-menu-open-new-window",
+    icon: "new-window",
+    action: Actions["actionCreators"].AlsoToMain({
+      type: Actions["actionTypes"].OPEN_NEW_WINDOW,
+      data: {
+        referrer: site.referrer,
+        typedBonus: site.typedBonus,
+        url: site.url
+      }
+    }),
+    userEvent: "OPEN_NEW_WINDOW"
+  }),
+  BlockUrl: (site, index, eventSource) => ({
+    id: "newtab-menu-dismiss",
+    icon: "dismiss",
+    action: Actions["actionCreators"].AlsoToMain({
+      type: Actions["actionTypes"].BLOCK_URL,
+      data: {
+        url: site.open_url || site.url,
+        pocket_id: site.pocket_id
+      }
+    }),
+    impression: Actions["actionCreators"].ImpressionStats({
+      source: eventSource,
+      block: 0,
+      tiles: [{
+        id: site.guid,
+        pos: index,
+        ...(site.shim && site.shim.delete ? {
+          shim: site.shim.delete
+        } : {})
+      }]
+    }),
+    userEvent: "BLOCK"
+  }),
+  // This is an option for web extentions which will result in remove items from
+  // memory and notify the web extenion, rather than using the built-in block list.
+  WebExtDismiss: (site, index, eventSource) => ({
+    id: "menu_action_webext_dismiss",
+    string_id: "newtab-menu-dismiss",
+    icon: "dismiss",
+    action: Actions["actionCreators"].WebExtEvent(Actions["actionTypes"].WEBEXT_DISMISS, {
+      source: eventSource,
+      url: site.url,
+      action_position: index
+    })
+  }),
+  DeleteUrl: (site, index, eventSource, isEnabled, siteInfo) => ({
+    id: "newtab-menu-delete-history",
+    icon: "delete",
+    action: {
+      type: Actions["actionTypes"].DIALOG_OPEN,
+      data: {
+        onConfirm: [Actions["actionCreators"].AlsoToMain({
+          type: Actions["actionTypes"].DELETE_HISTORY_URL,
+          data: {
+            url: site.url,
+            pocket_id: site.pocket_id,
+            forceBlock: site.bookmarkGuid
+          }
+        }), Actions["actionCreators"].UserEvent(Object.assign({
+          event: "DELETE",
+          source: eventSource,
+          action_position: index
+        }, siteInfo))],
+        eventSource,
+        body_string_id: ["newtab-confirm-delete-history-p1", "newtab-confirm-delete-history-p2"],
+        confirm_button_string_id: "newtab-topsites-delete-history-button",
+        cancel_button_string_id: "newtab-topsites-cancel-button",
+        icon: "modal-delete"
+      }
+    },
+    userEvent: "DIALOG_OPEN"
+  }),
+  ShowFile: site => ({
+    id: "newtab-menu-show-file",
+    icon: "search",
+    action: Actions["actionCreators"].OnlyToMain({
+      type: Actions["actionTypes"].SHOW_DOWNLOAD_FILE,
+      data: {
+        url: site.url
+      }
+    })
+  }),
+  OpenFile: site => ({
+    id: "newtab-menu-open-file",
+    icon: "open-file",
+    action: Actions["actionCreators"].OnlyToMain({
+      type: Actions["actionTypes"].OPEN_DOWNLOAD_FILE,
+      data: {
+        url: site.url
+      }
+    })
+  }),
+  CopyDownloadLink: site => ({
+    id: "newtab-menu-copy-download-link",
+    icon: "copy",
+    action: Actions["actionCreators"].OnlyToMain({
+      type: Actions["actionTypes"].COPY_DOWNLOAD_LINK,
+      data: {
+        url: site.url
+      }
+    })
+  }),
+  GoToDownloadPage: site => ({
+    id: "newtab-menu-go-to-download-page",
+    icon: "download",
+    action: Actions["actionCreators"].OnlyToMain({
+      type: Actions["actionTypes"].OPEN_LINK,
+      data: {
+        url: site.referrer
+      }
+    }),
+    disabled: !site.referrer
+  }),
+  RemoveDownload: site => ({
+    id: "newtab-menu-remove-download",
+    icon: "delete",
+    action: Actions["actionCreators"].OnlyToMain({
+      type: Actions["actionTypes"].REMOVE_DOWNLOAD_FILE,
+      data: {
+        url: site.url
+      }
+    })
+  }),
+  PinTopSite: ({
+    url,
+    searchTopSite,
+    label
+  }, index) => ({
+    id: "newtab-menu-pin",
+    icon: "pin",
+    action: Actions["actionCreators"].AlsoToMain({
+      type: Actions["actionTypes"].TOP_SITES_PIN,
+      data: {
+        site: {
+          url,
+          ...(searchTopSite && {
+            searchTopSite,
+            label
+          })
+        },
+        index
+      }
+    }),
+    userEvent: "PIN"
+  }),
+  UnpinTopSite: site => ({
+    id: "newtab-menu-unpin",
+    icon: "unpin",
+    action: Actions["actionCreators"].AlsoToMain({
+      type: Actions["actionTypes"].TOP_SITES_UNPIN,
+      data: {
+        site: {
+          url: site.url
+        }
+      }
+    }),
+    userEvent: "UNPIN"
+  }),
+  SaveToPocket: (site, index, eventSource) => ({
+    id: "newtab-menu-save-to-pocket",
+    icon: "pocket-save",
+    action: Actions["actionCreators"].AlsoToMain({
+      type: Actions["actionTypes"].SAVE_TO_POCKET,
+      data: {
+        site: {
+          url: site.url,
+          title: site.title
+        }
+      }
+    }),
+    impression: Actions["actionCreators"].ImpressionStats({
+      source: eventSource,
+      pocket: 0,
+      tiles: [{
+        id: site.guid,
+        pos: index,
+        ...(site.shim && site.shim.save ? {
+          shim: site.shim.save
+        } : {})
+      }]
+    }),
+    userEvent: "SAVE_TO_POCKET"
+  }),
+  DeleteFromPocket: site => ({
+    id: "newtab-menu-delete-pocket",
+    icon: "pocket-delete",
+    action: Actions["actionCreators"].AlsoToMain({
+      type: Actions["actionTypes"].DELETE_FROM_POCKET,
+      data: {
+        pocket_id: site.pocket_id
+      }
+    }),
+    userEvent: "DELETE_FROM_POCKET"
+  }),
+  ArchiveFromPocket: site => ({
+    id: "newtab-menu-archive-pocket",
+    icon: "pocket-archive",
+    action: Actions["actionCreators"].AlsoToMain({
+      type: Actions["actionTypes"].ARCHIVE_FROM_POCKET,
+      data: {
+        pocket_id: site.pocket_id
+      }
+    }),
+    userEvent: "ARCHIVE_FROM_POCKET"
+  }),
+  EditTopSite: (site, index) => ({
+    id: "newtab-menu-edit-topsites",
+    icon: "edit",
+    action: {
+      type: Actions["actionTypes"].TOP_SITES_EDIT,
+      data: {
+        index
+      }
+    }
+  }),
+  CheckBookmark: site => site.bookmarkGuid ? LinkMenuOptions.RemoveBookmark(site) : LinkMenuOptions.AddBookmark(site),
+  CheckPinTopSite: (site, index) => site.isPinned ? LinkMenuOptions.UnpinTopSite(site) : LinkMenuOptions.PinTopSite(site, index),
+  CheckSavedToPocket: (site, index) => site.pocket_id ? LinkMenuOptions.DeleteFromPocket(site) : LinkMenuOptions.SaveToPocket(site, index),
+  CheckBookmarkOrArchive: site => site.pocket_id ? LinkMenuOptions.ArchiveFromPocket(site) : LinkMenuOptions.CheckBookmark(site),
+  OpenInPrivateWindow: (site, index, eventSource, isEnabled) => isEnabled ? _OpenInPrivateWindow(site) : LinkMenuOptions.EmptyItem()
+};
+// EXTERNAL MODULE: external "React"
+var external_React_ = __webpack_require__(10);
+var external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);
+
+// CONCATENATED MODULE: ./content-src/components/LinkMenu/LinkMenu.jsx
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_LinkMenu", function() { return LinkMenu_LinkMenu; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinkMenu", function() { return LinkMenu; });
+
+
+
+
+
+const DEFAULT_SITE_MENU_OPTIONS = ["CheckPinTopSite", "EditTopSite", "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"];
+class LinkMenu_LinkMenu extends external_React_default.a.PureComponent {
+  getOptions() {
+    const {
+      props
+    } = this;
+    const {
+      site,
+      index,
+      source,
+      isPrivateBrowsingEnabled,
+      siteInfo,
+      platform
+    } = props; // Handle special case of default site
+
+    const propOptions = !site.isDefault || site.searchTopSite ? props.options : DEFAULT_SITE_MENU_OPTIONS;
+    const options = propOptions.map(o => LinkMenuOptions[o](site, index, source, isPrivateBrowsingEnabled, siteInfo, platform)).map(option => {
+      const {
+        action,
+        impression,
+        id,
+        type,
+        userEvent
+      } = option;
+
+      if (!type && id) {
+        option.onClick = () => {
+          props.dispatch(action);
+
+          if (userEvent) {
+            const userEventData = Object.assign({
+              event: userEvent,
+              source,
+              action_position: index
+            }, siteInfo);
+            props.dispatch(Actions["actionCreators"].UserEvent(userEventData));
+          }
+
+          if (impression && props.shouldSendImpressionStats) {
+            props.dispatch(impression);
+          }
+        };
+      }
+
+      return option;
+    }); // This is for accessibility to support making each item tabbable.
+    // We want to know which item is the first and which item
+    // is the last, so we can close the context menu accordingly.
+
+    options[0].first = true;
+    options[options.length - 1].last = true;
+    return options;
+  }
+
+  render() {
+    return external_React_default.a.createElement(ContextMenu["ContextMenu"], {
+      onUpdate: this.props.onUpdate,
+      onShow: this.props.onShow,
+      options: this.getOptions()
+    });
+  }
+
+}
+
+const getState = state => ({
+  isPrivateBrowsingEnabled: state.Prefs.values.isPrivateBrowsingEnabled,
+  platform: state.Prefs.values.platform
+});
+
+const LinkMenu = Object(external_ReactRedux_["connect"])(getState)(LinkMenu_LinkMenu);
+
 /***/ })
 /******/ ]);
\ No newline at end of file
--- a/browser/components/newtab/lib/DiscoveryStreamFeed.jsm
+++ b/browser/components/newtab/lib/DiscoveryStreamFeed.jsm
@@ -411,16 +411,17 @@ this.DiscoveryStreamFeed = class Discove
         const apiKeyPref = this._prefCache.config.api_key_pref;
         const apiKey = Services.prefs.getCharPref(apiKeyPref, "");
 
         const spocsResponse = await this.fetchFromEndpoint(endpoint, {
           method: "POST",
           headers,
           body: JSON.stringify({
             pocket_id: this._impressionId,
+            version: 1,
             consumer_key: apiKey,
           }),
         });
 
         if (spocsResponse) {
           this.spocsRequestTime = Math.round(perfService.absNow() - start);
           spocs = {
             lastUpdated: Date.now(),
@@ -1067,237 +1068,123 @@ this.DiscoveryStreamFeed = class Discove
             await this.loadSpocs(update => this.store.dispatch(ac.BroadcastToContent(update)));
             break;
         }
         break;
     }
   }
 };
 
+// Hardcoded version of layout_variant `3-col-7-row-octr`
 defaultLayoutResp = {
   "spocs": {
     "url": "https://getpocket.cdn.mozilla.net/v3/firefox/unique-spocs",
-    "spocs_per_domain": 1,
+    "spocs_per_domain": 1
   },
   "layout": [
     {
       "width": 12,
       "components": [
         {
           "type": "TopSites",
           "header": {
-            "title": "Top Sites",
+            "title": "Top Sites"
           },
-          "properties": {},
-        },
-      ],
+          "properties": {}
+        }
+      ]
     },
     {
       "width": 12,
       "components": [
         {
           "type": "Message",
           "header": {
             "title": "Recommended by Pocket",
             "subtitle": "",
             "link_text": "How it works",
             "link_url": "https://getpocket.com/firefox/new_tab_learn_more",
-            "icon": "resource://activity-stream/data/content/assets/glyph-pocket-16.svg",
+            "icon": "resource://activity-stream/data/content/assets/glyph-pocket-16.svg"
           },
           "properties": {},
           "styles": {
-            ".ds-message": "margin-bottom: -20px",
-          },
-        },
-      ],
+            ".ds-message": "margin-bottom: -20px"
+          }
+        }
+      ]
     },
     {
       "width": 12,
       "components": [
         {
           "type": "CardGrid",
           "properties": {
-            "items": 3,
+            "items": 21
           },
           "header": {
-            "title": "",
+            "title": ""
           },
           "feed": {
             "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?version=3&consumer_key=$apiKey&locale_lang=en-US",
-          },
-          "spocs": {
-            "probability": 1,
-            "positions": [
-              {
-                "index": 2,
-              },
-            ],
-          },
-        },
-      ],
-    },
-    {
-      "width": 12,
-      "components": [
-        {
-          "type": "CardGrid",
-          "header": {
-            "title": "Health & Fitness 💪",
-          },
-          "feed": {
-            "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=4&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
-          },
-          "properties": {
-            "items": 4,
-            "has_numbers": false,
-            "has_images": true,
-          },
-          "styles": {
-            ".ds-header": "margin-top: 4px;",
+            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?version=3&consumer_key=$apiKey&locale_lang=en-US&count=30"
           },
           "spocs": {
             "probability": 1,
             "positions": [
               {
-                "index": 2,
+                "index": 2
+              },
+              {
+                "index": 4
               },
-            ],
-          },
+              {
+                "index": 11
+              },
+              {
+                "index": 20
+              }
+            ]
+          }
         },
-      ],
-    },
-    {
-      "width": 12,
-      "components": [
         {
-          "type": "CardGrid",
-          "header": {
-            "title": "Tech 💻",
-          },
-          "feed": {
-            "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=5&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
-          },
+          "type": "Navigation",
           "properties": {
-            "items": 4,
-            "has_numbers": false,
-            "has_images": true,
-          },
-          "styles": {
-            ".ds-header": "margin-top: 4px;",
+            "alignment": "left-align",
+            "links": [
+              {
+                "name": "Must Reads",
+                "url": "https://getpocket.com/explore/must-reads?src=fx_new_tab"
+              },
+              {
+                "name": "Productivity",
+                "url": "https://getpocket.com/explore/productivity?src=fx_new_tab"
+              },
+              {
+                "name": "Health",
+                "url": "https://getpocket.com/explore/health?src=fx_new_tab"
+              },
+              {
+                "name": "Finance",
+                "url": "https://getpocket.com/explore/finance?src=fx_new_tab"
+              },
+              {
+                "name": "Technology",
+                "url": "https://getpocket.com/explore/technology?src=fx_new_tab"
+              },
+              {
+                "name": "More Recommendations ›",
+                "url": "https://getpocket.com/explore/trending?src=fx_new_tab"
+              }
+            ]
           },
-        },
-      ],
-    },
-    {
-      "width": 12,
-      "components": [
-        {
-          "type": "CardGrid",
           "header": {
-            "title": "Entertainment 🍿",
-          },
-          "feed": {
-            "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=8&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
-          },
-          "properties": {
-            "items": 4,
-            "has_numbers": false,
-            "has_images": true,
+            "title": "Popular Topics"
           },
           "styles": {
-            ".ds-header": "margin-top: 4px;",
-          },
-          "spocs": {
-            "probability": 1,
-            "positions": [
-              {
-                "index": 3,
-              },
-            ],
-          },
-        },
-      ],
-    },
-    {
-      "width": 12,
-      "components": [
-        {
-          "type": "CardGrid",
-          "header": {
-            "title": "Personal Finance 💰",
-          },
-          "feed": {
-            "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=2&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
-          },
-          "styles": {
-            ".ds-header": "margin-top: 4px;",
-          },
-          "properties": {
-            "items": 4,
-            "has_numbers": false,
-            "has_images": true,
-          },
-        },
-      ],
-    },
-    {
-      "width": 12,
-      "components": [
-        {
-          "type": "CardGrid",
-          "header": {
-            "title": "Business 💼",
-          },
-          "feed": {
-            "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=1&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
-          },
-          "properties": {
-            "items": 4,
-            "has_numbers": false,
-            "has_images": true,
-          },
-          "styles": {
-            ".ds-header": "margin-top: 4px;",
-          },
-        },
-      ],
-    },
-    {
-      "width": 12,
-      "components": [
-        {
-          "type": "CardGrid",
-          "header": {
-            "title": "Science 🔬",
-          },
-          "feed": {
-            "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=7&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
-          },
-          "properties": {
-            "items": 4,
-            "has_numbers": false,
-            "has_images": true,
-          },
-          "styles": {
-            ".ds-header": "margin-top: 4px;",
-          },
-          "spocs": {
-            "probability": 1,
-            "positions": [
-              {
-                "index": 3,
-              },
-            ],
-          },
-        },
-      ],
-    },
-  ],
+            ".ds-navigation": "margin-top: -10px;"
+          }
+        }
+      ]
+    }
+  ]
 };
 
 const EXPORTED_SYMBOLS = ["DiscoveryStreamFeed"];
--- a/browser/components/newtab/lib/HighlightsFeed.jsm
+++ b/browser/components/newtab/lib/HighlightsFeed.jsm
@@ -98,19 +98,17 @@ this.HighlightsFeed = class HighlightsFe
    * Chronologically sort highlights of all types except 'visited'. Then just append
    * the rest at the end of highlights.
    * @param {Array} pages The full list of links to order.
    * @return {Array} A sorted array of highlights
    */
   _orderHighlights(pages) {
     const splitHighlights = {chronologicalCandidates: [], visited: []};
     for (let page of pages) {
-      // If we have a page that is both a history item and a bookmark, treat it
-      // as a bookmark
-      if (page.type === "history" && !page.bookmarkGuid) {
+      if (page.type === "history") {
         splitHighlights.visited.push(page);
       } else {
         splitHighlights.chronologicalCandidates.push(page);
       }
     }
 
     return splitHighlights.chronologicalCandidates
             .sort((a, b) => a.date_added < b.date_added)
--- a/browser/components/newtab/lib/SectionsManager.jsm
+++ b/browser/components/newtab/lib/SectionsManager.jsm
@@ -25,30 +25,31 @@ const BUILT_IN_SECTIONS = {
         name: "showSponsored",
         titleString: "prefs_topstories_options_sponsored_label",
         icon: "icon-info",
       }] : [],
     },
     shouldHidePref: options.hidden,
     eventSource: "TOP_STORIES",
     icon: options.provider_icon,
-    title: {id: "header_recommended_by", values: {provider: options.provider_name}},
+    title: {id: "newtab-section-header-pocket", values: {provider: options.provider_name}},
     learnMore: {
       link: {
         href: "https://getpocket.com/firefox/new_tab_learn_more",
+        message: {id: "newtab-pocket-how-it-works"},
         id: "pocket_how_it_works",
       },
     },
     privacyNoticeURL: "https://www.mozilla.org/privacy/firefox/#suggest-relevant-content",
     compactCards: false,
     rowsPref: "section.topstories.rows",
     maxRows: 4,
     availableLinkMenuOptions: ["CheckBookmarkOrArchive", "CheckSavedToPocket", "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"],
     emptyState: {
-      message: {id: "topstories_empty_state", values: {provider: options.provider_name}},
+      message: {id: "newtab-empty-section-topstories", values: {provider: options.provider_name}},
       icon: "check",
     },
     shouldSendImpressionStats: true,
     dedupeFrom: ["highlights"],
   }),
   "feeds.section.highlights": options => ({
     id: "highlights",
     pref: {
@@ -66,22 +67,22 @@ const BUILT_IN_SECTIONS = {
       }, {
         name: "section.highlights.includePocket",
         titleString: "prefs_highlights_options_pocket_label",
       }],
     },
     shouldHidePref:  false,
     eventSource: "HIGHLIGHTS",
     icon: "highlights",
-    title: {id: "header_highlights"},
+    title: {id: "newtab-section-header-highlights"},
     compactCards: true,
     rowsPref: "section.highlights.rows",
     maxRows: 4,
     emptyState: {
-      message: {id: "highlights_empty_state"},
+      message: {id: "newtab-empty-section-highlights"},
       icon: "highlights",
     },
     shouldSendImpressionStats: false,
   }),
 };
 
 const SectionsManager = {
   ACTIONS_TO_PROXY: ["WEBEXT_CLICK", "WEBEXT_DISMISS"],
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/locales-src/asrouter.ftl
@@ -0,0 +1,73 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+cfr-doorhanger-extension-heading = Recommended Extension
+cfr-doorhanger-pintab-heading = Try This: Pin Tab
+
+cfr-doorhanger-extension-sumo-link =
+  .tooltiptext = Why am I seeing this
+
+cfr-doorhanger-extension-cancel-button = Not Now
+  .accesskey = N
+
+cfr-doorhanger-extension-ok-button = Add Now
+  .accesskey = A
+cfr-doorhanger-pintab-ok-button = Pin This Tab
+  .accesskey = P
+
+cfr-doorhanger-extension-manage-settings-button = Manage Recommendation Settings
+  .accesskey = M
+
+cfr-doorhanger-extension-never-show-recommendation = Don’t Show Me This Recommendation
+  .accesskey = S
+
+cfr-doorhanger-extension-learn-more-link = Learn more
+
+# This string is used on a new line below the add-on name
+# Variables:
+#   $name (String) - Add-on author name
+cfr-doorhanger-extension-author = by { $name }
+
+# This is a notification displayed in the address bar.
+# When clicked it opens a panel with a message for the user.
+cfr-doorhanger-extension-notification = Recommendation
+
+## Add-on statistics
+## These strings are used to display the total number of
+## users and rating for an add-on. They are shown next to each other.
+
+# Variables:
+#   $total (Number) - The rating of the add-on from 1 to 5
+cfr-doorhanger-extension-rating =
+  .tooltiptext =
+    { $total ->
+        [one] { $total } star
+       *[other] { $total } stars
+    }
+# Variables:
+#   $total (Number) - The total number of users using the add-on
+cfr-doorhanger-extension-total-users =
+  { $total ->
+      [one] { $total } user
+     *[other] { $total } users
+  }
+
+cfr-doorhanger-pintab-description = Get easy access to your most-used sites. Keep sites open in a tab (even when you restart).
+
+## These messages are steps on how to use the feature and are shown together.
+cfr-doorhanger-pintab-step1 = <b>Right-click</b> on the tab you want to pin.
+cfr-doorhanger-pintab-step2 = Select <b>Pin Tab</b> from the menu.
+cfr-doorhanger-pintab-step3 = If the site has an update you’ll see a blue dot on your pinned tab.
+
+cfr-doorhanger-pintab-animation-pause = Pause
+cfr-doorhanger-pintab-animation-resume = Resume
+
+
+## Firefox Accounts Message
+cfr-doorhanger-bookmark-fxa-header = Sync your bookmarks everywhere.
+cfr-doorhanger-bookmark-fxa-body = Great find! Now don’t be left without this bookmark on your mobile devices. Get Started with a { -fxaccount-brand-name }.
+cfr-doorhanger-bookmark-fxa-link-text = Sync bookmarks now…
+cfr-doorhanger-bookmark-fxa-close-btn-tooltip =
+  .aria-label = Close button
+  .title = Close
--- a/browser/components/newtab/locales-src/en-US/strings.properties
+++ b/browser/components/newtab/locales-src/en-US/strings.properties
@@ -1,94 +1,12 @@
-newtab_page_title=New Tab
-
-header_top_sites=Top Sites
-header_highlights=Highlights
 # LOCALIZATION NOTE(header_recommended_by): This is followed by the name
 # of the corresponding content provider.
 header_recommended_by=Recommended by {provider}
 
-# LOCALIZATION NOTE(context_menu_button_sr): This is for screen readers when
-# the context menu button is focused/active. Title is the label or hostname of
-# the site.
-context_menu_button_sr=Open context menu for {title}
-
-# LOCALIZATION NOTE(section_context_menu_button_sr): This is for screen readers when
-# the section edit context menu button is focused/active.
-section_context_menu_button_sr=Open the section context menu
-
-# LOCALIZATION NOTE (type_label_*): These labels are associated to pages to give
-# context on how the element is related to the user, e.g. type indicates that
-# the page is bookmarked, or is currently open on another device
-type_label_visited=Visited
-type_label_bookmarked=Bookmarked
-type_label_recommended=Trending
-type_label_pocket=Saved to Pocket
-type_label_downloaded=Downloaded
-
-# LOCALIZATION NOTE (menu_action_*): These strings are displayed in a context
-# menu and are meant as a call to action for a given page.
-# LOCALIZATION NOTE (menu_action_bookmark): Bookmark is a verb, as in "Add to
-# bookmarks"
-menu_action_bookmark=Bookmark
-menu_action_remove_bookmark=Remove Bookmark
-menu_action_open_new_window=Open in a New Window
-menu_action_open_private_window=Open in a New Private Window
-menu_action_dismiss=Dismiss
-menu_action_delete=Delete from History
-menu_action_pin=Pin
-menu_action_unpin=Unpin
-confirm_history_delete_p1=Are you sure you want to delete every instance of this page from your history?
-# LOCALIZATION NOTE (confirm_history_delete_notice_p2): this string is displayed in
-# the same dialog as confirm_history_delete_p1. "This action" refers to deleting a
-# page from history.
-confirm_history_delete_notice_p2=This action cannot be undone.
-menu_action_save_to_pocket=Save to Pocket
-menu_action_delete_pocket=Delete from Pocket
-menu_action_archive_pocket=Archive in Pocket
-
-# LOCALIZATION NOTE (menu_action_show_file_*): These are platform specific strings
-# found in the context menu of an item that has been downloaded. The intention behind
-# "this action" is that it will show where the downloaded file exists on the file system
-# for each operating system.
-menu_action_show_file_mac_os=Show in Finder
-menu_action_show_file_windows=Open Containing Folder
-menu_action_show_file_linux=Open Containing Folder
-menu_action_show_file_default=Show File
-menu_action_open_file=Open File
-
-# LOCALIZATION NOTE (menu_action_copy_download_link, menu_action_go_to_download_page):
-# "Download" here, in both cases, is not a verb, it is a noun. As in, "Copy the
-# link that belongs to this downloaded item"
-menu_action_copy_download_link=Copy Download Link
-menu_action_go_to_download_page=Go to Download Page
-menu_action_remove_download=Remove from History
-
-# LOCALIZATION NOTE (search_button): This is screenreader only text for the
-# search button.
-search_button=Search
-
-# LOCALIZATION NOTE (search_header): Displayed at the top of the panel
-# showing search suggestions. {search_engine_name} is replaced with the name of
-# the current default search engine. e.g. 'Google Search'
-search_header={search_engine_name} Search
-
-# LOCALIZATION NOTE (search_web_placeholder): This is shown in the searchbox when
-# the user hasn't typed anything yet.
-search_web_placeholder=Search the Web
-
-# LOCALIZATION NOTE (section_disclaimer_topstories): This is shown below
-# the topstories section title to provide additional information about
-# how the stories are selected.
-section_disclaimer_topstories=The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.
-section_disclaimer_topstories_linktext=Learn how it works.
-# LOCALIZATION NOTE (section_disclaimer_topstories_buttontext): The text of
-# the button used to acknowledge, and hide this disclaimer in the future.
-section_disclaimer_topstories_buttontext=Okay, got it
-
 # LOCALIZATION NOTE (prefs_*, settings_*): These are shown in about:preferences
 # for a "Firefox Home" section. "Firefox" should be treated as a brand and kept
 # in English, while "Home" should be localized matching the about:preferences
 # sidebar mozilla-central string for the panel that has preferences related to
 # what is shown for the homepage, new windows, and new tabs.
 prefs_home_header=Firefox Home Content
 prefs_home_description=Choose what content you want on your Firefox Home screen.
 
@@ -103,82 +21,26 @@ prefs_topsites_description=The sites you
 prefs_topstories_description2=Great content from around the web, personalized for you
 prefs_topstories_options_sponsored_label=Sponsored Stories
 prefs_topstories_sponsored_learn_more=Learn more
 prefs_highlights_description=A selection of sites that you’ve saved or visited
 prefs_highlights_options_visited_label=Visited Pages
 prefs_highlights_options_download_label=Most Recent Download
 prefs_highlights_options_pocket_label=Pages Saved to Pocket
 prefs_snippets_description=Updates from Mozilla and Firefox
-settings_pane_button_label=Customize your New Tab page
 settings_pane_topsites_header=Top Sites
 settings_pane_highlights_header=Highlights
 settings_pane_highlights_options_bookmarks=Bookmarks
 # LOCALIZATION NOTE(settings_pane_snippets_header): For the "Snippets" feature
 # traditionally on about:home. Alternative translation options: "Small Note" or
 # something that expresses the idea of "a small message, shortened from
 # something else, and non-essential but also not entirely trivial and useless."
 settings_pane_snippets_header=Snippets
 
-# LOCALIZATION NOTE (edit_topsites_*): This is shown in the Edit Top Sites modal
-# dialog.
-edit_topsites_button_text=Edit
-edit_topsites_edit_button=Edit this site
-
-# LOCALIZATION NOTE (topsites_form_*): This is shown in the New/Edit Topsite modal.
-topsites_form_add_header=New Top Site
-topsites_form_edit_header=Edit Top Site
-topsites_form_title_label=Title
-topsites_form_title_placeholder=Enter a title
-topsites_form_url_label=URL
-topsites_form_image_url_label=Custom Image URL
-topsites_form_url_placeholder=Type or paste a URL
-topsites_form_use_image_link=Use a custom image…
-# LOCALIZATION NOTE (topsites_form_*_button): These are verbs/actions.
-topsites_form_preview_button=Preview
-topsites_form_add_button=Add
-topsites_form_save_button=Save
-topsites_form_cancel_button=Cancel
-topsites_form_url_validation=Valid URL required
-topsites_form_image_validation=Image failed to load. Try a different URL.
-
-# LOCALIZATION NOTE (pocket_read_more): This is shown at the bottom of the
-# trending stories section and precedes a list of links to popular topics.
-pocket_read_more=Popular Topics:
-# LOCALIZATION NOTE (pocket_read_even_more): This is shown as a link at the
-# end of the list of popular topic links.
-pocket_read_even_more=View More Stories
-pocket_more_reccommendations=More Recommendations
 pocket_how_it_works=How it works
-pocket_cta_button=Get Pocket
-pocket_cta_text=Save the stories you love in Pocket, and fuel your mind with fascinating reads.
-
-highlights_empty_state=Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.
-# LOCALIZATION NOTE (topstories_empty_state): When there are no recommendations,
-# in the space that would have shown a few stories, this is shown instead.
-# {provider} is replaced by the name of the content provider for this section.
-topstories_empty_state=You’ve caught up. Check back later for more top stories from {provider}. Can’t wait? Select a popular topic to find more great stories from around the web.
-
-# LOCALIZATION NOTE (error_fallback_default_*): This message and suggested
-# action link are shown in each section of UI that fails to render
-error_fallback_default_info=Oops, something went wrong loading this content.
-error_fallback_default_refresh_suggestion=Refresh page to try again.
-
-# LOCALIZATION NOTE (section_menu_action_*).  These strings are displayed in the section
-# context menu and are meant as a call to action for the given section.
-section_menu_action_remove_section=Remove Section
-section_menu_action_collapse_section=Collapse Section
-section_menu_action_expand_section=Expand Section
-section_menu_action_manage_section=Manage Section
-section_menu_action_manage_webext=Manage Extension
-section_menu_action_add_topsite=Add Top Site
-section_menu_action_add_search_engine=Add Search Engine
-section_menu_action_move_up=Move Up
-section_menu_action_move_down=Move Down
-section_menu_action_privacy_notice=Privacy Notice
 
 # LOCALIZATION NOTE (firstrun_*). These strings are displayed only once, on the
 # firstrun of the browser, they give an introduction to Firefox and Sync.
 firstrun_title=Take Firefox with You
 firstrun_content=Get your bookmarks, history, passwords and other settings on all your devices.
 firstrun_learn_more_link=Learn more about Firefox Accounts
 
 # LOCALIZATION NOTE (firstrun_form_header and firstrun_form_sub_header):
@@ -193,11 +55,8 @@ firstrun_invalid_input=Valid email requi
 # LOCALIZATION NOTE (firstrun_extra_legal_links): {terms} is equal to firstrun_terms_of_service, and
 # {privacy} is equal to firstrun_privacy_notice. {terms} and {privacy} are clickable links.
 firstrun_extra_legal_links=By proceeding, you agree to the {terms} and {privacy}.
 firstrun_terms_of_service=Terms of Service
 firstrun_privacy_notice=Privacy Notice
 
 firstrun_continue_to_login=Continue
 firstrun_skip_login=Skip this step
-
-# LOCALIZATION NOTE (context_menu_title): Action tooltip to open a context menu
-context_menu_title=Open menu
--- a/browser/components/newtab/locales-src/et/strings.properties
+++ b/browser/components/newtab/locales-src/et/strings.properties
@@ -86,16 +86,22 @@ section_disclaimer_topstories_buttontext
 
 # LOCALIZATION NOTE (prefs_*, settings_*): These are shown in about:preferences
 # for a "Firefox Home" section. "Firefox" should be treated as a brand and kept
 # in English, while "Home" should be localized matching the about:preferences
 # sidebar mozilla-central string for the panel that has preferences related to
 # what is shown for the homepage, new windows, and new tabs.
 prefs_home_header=Firefoxi avalehe sisu
 prefs_home_description=Vali sisu, mida soovid Firefoxi avalehel näha.
+
+prefs_content_discovery_header=Firefoxi avaleht
+
+prefs_content_discovery_description=Sisu avastamise funktsionaalsus Firefoxi avalehel võimaldab sul leida kõrge kvaliteediga seonduvaid artikleid kogu internetist.
+prefs_content_discovery_button=Lülita sisu avastamise funktsionaalsus välja
+
 # LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
 # plural forms used in a drop down of multiple row options (1 row, 2 rows).
 # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
 prefs_section_rows_option={num} rida;{num} rida
 prefs_search_header=Veebiotsing
 prefs_topsites_description=Enim külastatud saidid
 prefs_topstories_description2=Parim veebisisu sinu huvidest lähtuvalt
 prefs_topstories_options_sponsored_label=Sponsitud postitused
@@ -139,17 +145,16 @@ topsites_form_image_validation=Pildi laadimine ebaõnnestus. Proovi teistsugust URLi.
 
 # LOCALIZATION NOTE (pocket_read_more): This is shown at the bottom of the
 # trending stories section and precedes a list of links to popular topics.
 pocket_read_more=Populaarsed teemad:
 # LOCALIZATION NOTE (pocket_read_even_more): This is shown as a link at the
 # end of the list of popular topic links.
 pocket_read_even_more=Rohkem lugusid
 pocket_more_reccommendations=Rohkem soovitusi
-pocket_learn_more=Rohkem teavet
 pocket_how_it_works=Kuidas see töötab?
 pocket_cta_button=Hangi Pocket
 pocket_cta_text=Salvesta oma lemmiklood Pocketisse.
 
 highlights_empty_state=Alusta veebilehitsemist ja me näitame siin häid artikleid, videoid ja muid lehti, mida hiljuti külastasid või järjehoidjatesse lisasid.
 # LOCALIZATION NOTE (topstories_empty_state): When there are no recommendations,
 # in the space that would have shown a few stories, this is shown instead.
 # {provider} is replaced by the name of the content provider for this section.
--- a/browser/components/newtab/locales-src/ga-IE/strings.properties
+++ b/browser/components/newtab/locales-src/ga-IE/strings.properties
@@ -1,133 +1,150 @@
 newtab_page_title=Cluaisín Nua
-default_label_loading=Á Lódáil…
 
 header_top_sites=Barrshuímh
-header_stories=Barrscéalta
-header_visit_again=Cuairt Arís
-header_bookmarks=Leabharmharcanna Le Déanaí
-# LOCALIZATION NOTE(header_bookmarks_placeholder): This message is
-# meant to inform that section contains no information because
-# the user hasn't added any bookmarks.
-header_bookmarks_placeholder=Níl aon leabharmharcanna agat.
-# LOCALIZATION NOTE(header_stories_from): This is followed by a logo of the
-# corresponding content (stories) provider
-header_stories_from=ó
+header_highlights=Buaicphointí
+# LOCALIZATION NOTE(header_recommended_by): This is followed by the name
+# of the corresponding content provider.
+header_recommended_by=Molta ag {provider}
+
+# LOCALIZATION NOTE(context_menu_button_sr): This is for screen readers when
+# the context menu button is focused/active. Title is the label or hostname of
+# the site.
+
+# LOCALIZATION NOTE(section_context_menu_button_sr): This is for screen readers when
+# the section edit context menu button is focused/active.
 
 # LOCALIZATION NOTE (type_label_*): These labels are associated to pages to give
 # context on how the element is related to the user, e.g. type indicates that
 # the page is bookmarked, or is currently open on another device
 type_label_visited=Feicthe
 type_label_bookmarked=Leabharmharcáilte
-type_label_synced=Sioncronaithe ó ghléas eile
 type_label_recommended=Treochtáil
-# LOCALIZATION NOTE(type_label_open): Open is an adjective, as in "page is open"
-type_label_open=Oscailte
-type_label_topic=Ábhar
+type_label_downloaded=Íoslódáilte
 
 # LOCALIZATION NOTE (menu_action_*): These strings are displayed in a context
 # menu and are meant as a call to action for a given page.
 # LOCALIZATION NOTE (menu_action_bookmark): Bookmark is a verb, as in "Add to
 # bookmarks"
 menu_action_bookmark=Cruthaigh leabharmharc
 menu_action_remove_bookmark=Scrios an Leabharmharc
-menu_action_copy_address=Cóipeáil an Seoladh
-menu_action_email_link=Seol an Nasc trí Ríomhphost…
 menu_action_open_new_window=Oscail i bhFuinneog Nua
 menu_action_open_private_window=Oscail i bhFuinneog Nua Phríobháideach
 menu_action_dismiss=Ruaig
 menu_action_delete=Scrios ón Stair
 menu_action_pin=Pionnáil
 menu_action_unpin=Díphionnáil
 confirm_history_delete_p1=An bhfuil tú cinnte gur mhaith leat an leathanach seo a scriosadh go hiomlán ó do stair?
 # LOCALIZATION NOTE (confirm_history_delete_notice_p2): this string is displayed in
 # the same dialog as confirm_history_delete_p1. "This action" refers to deleting a
 # page from history.
 confirm_history_delete_notice_p2=Ní féidir an gníomh seo a chur ar ceal.
 menu_action_save_to_pocket=Sábháil in Pocket
 
-# LOCALIZATION NOTE (search_for_something_with): {search_term} is a placeholder
-# for what the user has typed in the search input field, e.g. 'Search for ' +
-# search_term + 'with:' becomes 'Search for abc with:'
-# The search engine name is displayed as an icon and does not need a translation
-search_for_something_with=Déan cuardach ar {search_term} le:
+# LOCALIZATION NOTE (menu_action_show_file_*): These are platform specific strings
+# found in the context menu of an item that has been downloaded. The intention behind
+# "this action" is that it will show where the downloaded file exists on the file system
+# for each operating system.
+
+# LOCALIZATION NOTE (menu_action_copy_download_link, menu_action_go_to_download_page):
+# "Download" here, in both cases, is not a verb, it is a noun. As in, "Copy the
+# link that belongs to this downloaded item"
 
 # LOCALIZATION NOTE (search_button): This is screenreader only text for the
 # search button.
 search_button=Cuardach
 
 # LOCALIZATION NOTE (search_header): Displayed at the top of the panel
 # showing search suggestions. {search_engine_name} is replaced with the name of
 # the current default search engine. e.g. 'Google Search'
 search_header=Cuardach {search_engine_name}
 
 # LOCALIZATION NOTE (search_web_placeholder): This is shown in the searchbox when
 # the user hasn't typed anything yet.
 search_web_placeholder=Cuardaigh an Gréasán
-search_settings=Socruithe Cuardaigh
 
-# LOCALIZATION NOTE (welcome_*): This is shown as a modal dialog, typically on a
-# first-run experience when there's no data to display yet
-welcome_title=Fáilte go dtí cluaisín nua
-welcome_body=Úsáidfidh Firefox an spás seo chun na leabharmharcanna, ailt, físeáin, agus leathanaigh is tábhachtaí a thaispeáint duit, ionas go mbeidh tú in ann filleadh orthu gan stró.
-welcome_label=Buaicphointí á lorg
+# LOCALIZATION NOTE (section_disclaimer_topstories): This is shown below
+# the topstories section title to provide additional information about
+# how the stories are selected.
+# LOCALIZATION NOTE (section_disclaimer_topstories_buttontext): The text of
+# the button used to acknowledge, and hide this disclaimer in the future.
+section_disclaimer_topstories_buttontext=OK, tuigim
 
-# LOCALIZATION NOTE (time_label_*): {number} is a placeholder for a number which
-# represents a shortened timestamp format, e.g. '10m' means '10 minutes ago'.
-time_label_less_than_minute=< 1 n
-time_label_minute={number}n
-time_label_hour={number}u
-time_label_day={number}l
+# LOCALIZATION NOTE (prefs_*, settings_*): These are shown in about:preferences
+# for a "Firefox Home" section. "Firefox" should be treated as a brand and kept
+# in English, while "Home" should be localized matching the about:preferences
+# sidebar mozilla-central string for the panel that has preferences related to
+# what is shown for the homepage, new windows, and new tabs.
+
 
-# LOCALIZATION NOTE (settings_pane_*): This is shown in the Settings Pane sidebar.
+
+# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
+# plural forms used in a drop down of multiple row options (1 row, 2 rows).
+# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
+prefs_topstories_sponsored_learn_more=Tuilleadh eolais
 settings_pane_button_label=Saincheap an Leathanach do Chluaisín Nua
-settings_pane_header=Sainroghanna do Chluaisín Nua
-settings_pane_body=Roghnaigh na rudaí a fheicfidh tú nuair a osclóidh tú cluaisín nua.
-settings_pane_search_header=Cuardach
-settings_pane_search_body=Cuardaigh an Gréasán go díreach ón gcluaisín nua.
 settings_pane_topsites_header=Barrshuímh
-settings_pane_topsites_body=Na suímh Ghréasáin a dtugann tú cuairt orthu is minice.
-settings_pane_topsites_options_showmore=Taispeáin dhá shraith
-settings_pane_bookmarks_header=Leabharmharcanna Le Déanaí
-settings_pane_bookmarks_body=Do chuid leabharmharcanna nua in áit amháin.
-settings_pane_visit_again_header=Cuairt Arís
-settings_pane_visit_again_body=Taispeánann Firefox nascanna ó do stair bhrabhsála a mbeadh suim agat filleadh orthu amach anseo.
-settings_pane_pocketstories_header=Barrscéalta
-settings_pane_pocketstories_body=Le Pocket, ball de theaghlach Mozilla, beidh tú ábalta teacht ar ábhar den chéad scoth go héasca.
-settings_pane_done_button=Déanta
+settings_pane_highlights_header=Buaicphointí
+settings_pane_highlights_options_bookmarks=Leabharmharcanna
+# LOCALIZATION NOTE(settings_pane_snippets_header): For the "Snippets" feature
+# traditionally on about:home. Alternative translation options: "Small Note" or
+# something that expresses the idea of "a small message, shortened from
+# something else, and non-essential but also not entirely trivial and useless."
+settings_pane_snippets_header=Gearrthóga
 
 # LOCALIZATION NOTE (edit_topsites_*): This is shown in the Edit Top Sites modal
 # dialog.
 edit_topsites_button_text=Eagar
-edit_topsites_button_label=Saincheap na Barrshuímh
-edit_topsites_showmore_button=Taispeáin níos mó
-edit_topsites_showless_button=Taispeáin níos lú
-edit_topsites_done_button=Déanta
-edit_topsites_pin_button=Greamaigh an suíomh seo
-edit_topsites_unpin_button=Díghreamaigh an suíomh seo
 edit_topsites_edit_button=Cuir an suíomh seo in eagar
-edit_topsites_dismiss_button=Ruaig an suíomh seo
-edit_topsites_add_button=Cuir leis
 
 # LOCALIZATION NOTE (topsites_form_*): This is shown in the New/Edit Topsite modal.
 topsites_form_add_header=Barrshuíomh Nua
 topsites_form_edit_header=Cuir an Barrshuíomh in Eagar
+topsites_form_title_label=Teideal
 topsites_form_title_placeholder=Cuir teideal isteach
+topsites_form_url_label=URL
 topsites_form_url_placeholder=Clóscríobh nó greamaigh URL
+# LOCALIZATION NOTE (topsites_form_*_button): These are verbs/actions.
+topsites_form_preview_button=Réamhamharc
 topsites_form_add_button=Cuir leis
 topsites_form_save_button=Sábháil
 topsites_form_cancel_button=Cealaigh
 topsites_form_url_validation=URL neamhbhailí
 
 # LOCALIZATION NOTE (pocket_read_more): This is shown at the bottom of the
 # trending stories section and precedes a list of links to popular topics.
 pocket_read_more=Topaicí i mbéal an phobail:
 # LOCALIZATION NOTE (pocket_read_even_more): This is shown as a link at the
 # end of the list of popular topic links.
 pocket_read_even_more=Tuilleadh Scéalta
-# LOCALIZATION NOTE (pocket_feedback_header): This is shown as an introduction
-# to Pocket as part of the feedback form.
-pocket_feedback_header=Ábhar den chéad scoth ón Ghréasán, le níos mó ná 25 milliún duine i mbun coimeádaíochta.
-# LOCALIZATION NOTE (pocket_feedback_body): This is shown below
-# (pocket_feedback_header) to provide more information about Pocket.
-pocket_feedback_body=Le Pocket, ball de theaghlach Mozilla, beidh tú ábalta teacht ar ábhar den chéad scoth go héasca.
-pocket_send_feedback=Tabhair Aiseolas Dúinn
+
+# LOCALIZATION NOTE (topstories_empty_state): When there are no recommendations,
+# in the space that would have shown a few stories, this is shown instead.
+# {provider} is replaced by the name of the content provider for this section.
+
+# LOCALIZATION NOTE (manual_migration_explanation2): This message is shown to encourage users to
+# import their browser profile from another browser they might be using.
+# LOCALIZATION NOTE (manual_migration_cancel_button): This message is shown on a button that cancels the
+# process of importing another browser’s profile into Firefox.
+# LOCALIZATION NOTE (manual_migration_import_button): This message is shown on a button that starts the process
+# of importing another browser’s profile profile into Firefox.
+manual_migration_import_button=Iompórtáil Anois
+
+# LOCALIZATION NOTE (error_fallback_default_*): This message and suggested
+# action link are shown in each section of UI that fails to render
+
+# LOCALIZATION NOTE (section_menu_action_*).  These strings are displayed in the section
+# context menu and are meant as a call to action for the given section.
+
+# LOCALIZATION NOTE (firstrun_*). These strings are displayed only once, on the
+# firstrun of the browser, they give an introduction to Firefox and Sync.
+
+# LOCALIZATION NOTE (firstrun_form_header and firstrun_form_sub_header):
+# firstrun_form_sub_header is a continuation of firstrun_form_header, they are one sentence.
+# firstrun_form_header is displayed more boldly as the call to action.
+
+
+# LOCALIZATION NOTE (firstrun_extra_legal_links): {terms} is equal to firstrun_terms_of_service, and
+# {privacy} is equal to firstrun_privacy_notice. {terms} and {privacy} are clickable links.
+
+
+# LOCALIZATION NOTE (context_menu_title): Action tooltip to open a context menu
--- a/browser/components/newtab/locales-src/ia/strings.properties
+++ b/browser/components/newtab/locales-src/ia/strings.properties
@@ -26,17 +26,17 @@ type_label_downloaded=Discargate
 
 # LOCALIZATION NOTE (menu_action_*): These strings are displayed in a context
 # menu and are meant as a call to action for a given page.
 # LOCALIZATION NOTE (menu_action_bookmark): Bookmark is a verb, as in "Add to
 # bookmarks"
 menu_action_bookmark=Adder marcapaginas
 menu_action_remove_bookmark=Remover le marcapaginas
 menu_action_open_new_window=Aperir in un nove fenestra
-menu_action_open_private_window=Aperir in un nove Fenestra private
+menu_action_open_private_window=Aperir in un nove fenestra private
 menu_action_dismiss=Dimitter
 menu_action_delete=Deler del chronologia
 menu_action_pin=Clavar
 menu_action_unpin=Disclavar
 confirm_history_delete_p1=Desira tu vermente deler cata instantia de iste pagina de tu chronologia?
 # LOCALIZATION NOTE (confirm_history_delete_notice_p2): this string is displayed in
 # the same dialog as confirm_history_delete_p1. "This action" refers to deleting a
 # page from history.
--- a/browser/components/newtab/locales-src/kab/strings.properties
+++ b/browser/components/newtab/locales-src/kab/strings.properties
@@ -89,16 +89,17 @@ section_disclaimer_topstories_buttontext
 # in English, while "Home" should be localized matching the about:preferences
 # sidebar mozilla-central string for the panel that has preferences related to
 # what is shown for the homepage, new windows, and new tabs.
 prefs_home_header=Agbur agejdan Firefox
 prefs_home_description=Fren agbur i tebɣiḍ deg ugdil agejdan Firefox.
 
 prefs_content_discovery_header=Asebter agejdan Firefox
 
+prefs_content_discovery_description=Agbur n usebter agejdan n Firefox yessumur imagraden usdiden n tɣara ifazen i d-yekkan seg kuẓ n tɣemmaṛ n Web.
 prefs_content_discovery_button=Sens asnirem n ubur
 
 # LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
 # plural forms used in a drop down of multiple row options (1 row, 2 rows).
 # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
 prefs_section_rows_option={num} izirig;{num} izirigen
 prefs_search_header=Anadi Web
 prefs_topsites_description=Ismal i tettwaliḍ aṭas
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/locales-src/newtab.ftl
@@ -0,0 +1,164 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+### Firefox Home / New Tab strings for about:home / about:newtab.
+
+newtab-page-title = New Tab
+newtab-settings-button =
+    .title = Customize your New Tab page
+
+## Search box component.
+
+# "Search" is a verb/action
+newtab-search-box-search-button =
+    .title = Search
+    .aria-label = Search
+
+newtab-search-box-search-the-web-text = Search the Web
+newtab-search-box-search-the-web-input =
+    .placeholder = Search the Web
+    .title = Search the Web
+    .aria-label = Search the Web
+
+## Top Sites - General form dialog.
+
+newtab-topsites-add-search-engine-header = Add Search Engine
+newtab-topsites-add-topsites-header = New Top Site
+newtab-topsites-edit-topsites-header = Edit Top Site
+newtab-topsites-title-label = Title
+newtab-topsites-title-input =
+    .placeholder = Enter a title
+
+newtab-topsites-url-label = URL
+newtab-topsites-url-input =
+    .placeholder = Type or paste a URL
+newtab-topsites-url-validation = Valid URL required
+
+newtab-topsites-image-url-label = Custom Image URL
+newtab-topsites-use-image-link = Use a custom image…
+newtab-topsites-image-validation = Image failed to load. Try a different URL.
+
+## Top Sites - General form dialog buttons. These are verbs/actions.
+
+newtab-topsites-cancel-button = Cancel
+newtab-topsites-delete-history-button = Delete from History
+newtab-topsites-save-button = Save
+newtab-topsites-preview-button = Preview
+newtab-topsites-add-button = Add
+
+## Top Sites - Delete history confirmation dialog. 
+
+newtab-confirm-delete-history-p1 = Are you sure you want to delete every instance of this page from your history?
+# "This action" refers to deleting a page from history.
+newtab-confirm-delete-history-p2 = This action cannot be undone.
+
+## Context Menu - Action Tooltips.
+
+# General tooltip for context menus.
+newtab-menu-section-tooltip =
+    .title = Open menu
+    .aria-label = Open menu
+
+# This tooltip is for the context menu of Pocket cards or Topsites
+# Variables:
+#  $title (String): The label or hostname of the site. This is for screen readers when the context menu button is focused/active.
+newtab-menu-content-tooltip =
+    .title = Open menu
+    .aria-label = Open context menu for { $title }
+# Tooltip on an empty topsite box to open the New Top Site dialog.
+newtab-menu-topsites-placeholder-tooltip =
+    .title = Edit this site
+    .aria-label = Edit this site
+
+## Context Menu: These strings are displayed in a context menu and are meant as a call to action for a given page.
+
+newtab-menu-edit-topsites = Edit
+newtab-menu-open-new-window = Open in a New Window
+newtab-menu-open-new-private-window = Open in a New Private Window
+newtab-menu-dismiss = Dismiss
+newtab-menu-pin = Pin
+newtab-menu-unpin = Unpin
+newtab-menu-delete-history = Delete from History
+newtab-menu-save-to-pocket = Save to { -pocket-brand-name }
+newtab-menu-delete-pocket = Delete from { -pocket-brand-name }
+newtab-menu-archive-pocket = Archive in { -pocket-brand-name }
+
+# Bookmark is a noun in this case, "Remove bookmark".
+newtab-menu-remove-bookmark = Remove Bookmark
+# Bookmark is a verb here.
+newtab-menu-bookmark = Bookmark
+
+## Context Menu - Downloaded Menu. "Download" in these cases is not a verb, 
+## it is a noun. As in, "Copy the link that belongs to this downloaded item".
+
+newtab-menu-copy-download-link = Copy Download Link
+newtab-menu-go-to-download-page = Go to Download Page
+newtab-menu-remove-download = Remove from History
+
+## Context Menu - Download Menu: These are platform specific strings found in the context menu of an item that has
+## been downloaded. The intention behind "this action" is that it will show where the downloaded file exists on the file
+## system for each operating system.
+
+newtab-menu-show-file =
+    { PLATFORM() ->
+        [macos] Show in Finder
+       *[other] Open Containing Folder
+    }
+newtab-menu-open-file = Open File
+
+## Card Labels: These labels are associated to pages to give
+## context on how the element is related to the user, e.g. type indicates that
+## the page is bookmarked, or is currently open on another device.
+
+newtab-label-visited = Visited
+newtab-label-bookmarked = Bookmarked
+newtab-label-recommended = Trending
+newtab-label-saved = Saved to { -pocket-brand-name }
+newtab-label-download = Downloaded
+
+## Section Menu: These strings are displayed in the section context menu and are 
+## meant as a call to action for the given section.
+
+newtab-section-menu-remove-section = Remove Section
+newtab-section-menu-collapse-section = Collapse Section
+newtab-section-menu-expand-section = Expand Section
+newtab-section-menu-manage-section = Manage Section
+newtab-section-menu-manage-webext = Manage Extension
+newtab-section-menu-add-topsite = Add Top Site
+newtab-section-menu-add-search-engine = Add Search Engine
+newtab-section-menu-move-up = Move Up
+newtab-section-menu-move-down = Move Down
+newtab-section-menu-privacy-notice = Privacy Notice
+
+## Section Headers.
+
+newtab-section-header-topsites = Top Sites
+newtab-section-header-highlights = Highlights
+# Variables:
+#  $provider (String): Name of the corresponding content provider.
+newtab-section-header-pocket = Recommended by { $provider }
+
+## Empty Section States: These show when there are no more items in a section. Ex. When there are no more Pocket story recommendations, in the space where there would have been stories, this is shown instead.
+
+newtab-empty-section-highlights = Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.
+
+# Ex. When there are no more Pocket story recommendations, in the space where there would have been stories, this is shown instead.
+# Variables:
+#  $provider (String): Name of the content provider for this section, e.g "Pocket".
+newtab-empty-section-topstories = You’ve caught up. Check back later for more top stories from { $provider }. Can’t wait? Select a popular topic to find more great stories from around the web.
+
+## Pocket Content Section.
+
+# This is shown at the bottom of the trending stories section and precedes a list of links to popular topics.
+newtab-pocket-read-more = Popular Topics:
+newtab-pocket-more-recommendations = More Recommendations
+newtab-pocket-how-it-works = How it works
+newtab-pocket-cta-button = Get { -pocket-brand-name }
+newtab-pocket-cta-text = Save the stories you love in { -pocket-brand-name }, and fuel your mind with fascinating reads.
+
+## Error Fallback Content.
+## This message and suggested action link are shown in each section of UI that fails to render.
+
+newtab-error-fallback-info = Oops, something went wrong loading this content.
+newtab-error-fallback-refresh-link = Refresh page to try again.
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/locales-src/onboarding.ftl
@@ -0,0 +1,127 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+### UI strings for the simplified onboarding modal / about:welcome
+### Various strings use a non-breaking space to avoid a single dangling /
+### widowed word, so test on various window sizes if you also want this.
+
+## These button action text can be split onto multiple lines, so use explicit
+## newlines in translations to control where the line break appears (e.g., to
+## avoid breaking quoted text).
+
+onboarding-button-label-learn-more = Learn More
+onboarding-button-label-try-now = Try It Now
+onboarding-button-label-get-started = Get Started
+
+## Welcome modal dialog strings
+
+onboarding-welcome-header = Welcome to { -brand-short-name }
+onboarding-welcome-body = You’ve got the browser.<br/>Meet the rest of { -brand-product-name }.
+onboarding-welcome-learn-more = Learn more about the benefits.
+
+onboarding-join-form-header = Join { -brand-product-name }
+onboarding-join-form-body = Enter your email address to get started.
+onboarding-join-form-email =
+    .placeholder = Enter email
+onboarding-join-form-email-error = Valid email required
+onboarding-join-form-legal = By proceeding, you agree to the <a data-l10n-name="terms">Terms of Service</a> and <a data-l10n-name="privacy">Privacy Notice</a>.
+onboarding-join-form-continue = Continue
+
+onboarding-start-browsing-button-label = Start Browsing
+
+## These are individual benefit messages shown with an image, title and
+## description.
+
+onboarding-benefit-products-title = Useful Products
+onboarding-benefit-products-text = Get things done with a family of tools that respects your privacy across your devices.
+
+onboarding-benefit-knowledge-title = Practical Knowledge
+onboarding-benefit-knowledge-text = Learn everything you need to know to stay smarter and safer online.
+
+onboarding-benefit-privacy-title = True Privacy
+# "Personal Data Promise" is a concept that should be translated consistently
+# across the product. It refers to a concept shown elsewhere to the user: "The
+# Firefox Personal Data Promise is the way we honor your data in everything we
+# make and do. We take less data. We keep it safe. And we make sure that we are
+# transparent about how we use it."
+onboarding-benefit-privacy-text = Everything we do honors our Personal Data Promise: Take less. Keep it safe. No secrets.
+
+
+## These strings belong to the individual onboarding messages.
+
+## Each message has a title and a description of what the browser feature is.
+## Each message also has an associated button for the user to try the feature.
+## The string for the button is found above, in the UI strings section
+onboarding-private-browsing-title = Private Browsing
+onboarding-private-browsing-text = Browse by yourself. Private Browsing with Content Blocking blocks online trackers that follow you around the web.
+
+onboarding-screenshots-title = Screenshots
+onboarding-screenshots-text = Take, save and share screenshots - without leaving { -brand-short-name }. Capture a region or an entire page as you browse. Then save to the web for easy access and sharing.
+
+onboarding-addons-title = Add-ons
+onboarding-addons-text = Add even more features that make { -brand-short-name } work harder for you. Compare prices, check the weather or express your personality with a custom theme.
+
+onboarding-ghostery-title = Ghostery
+onboarding-ghostery-text = Browse faster, smarter, or safer with extensions like Ghostery, which lets you block annoying ads.
+
+# Note: "Sync" in this case is a generic verb, as in "to synchronize"
+onboarding-fxa-title = Sync
+onboarding-fxa-text = Sign up for a { -fxaccount-brand-name } and sync your bookmarks, passwords, and open tabs everywhere you use { -brand-short-name }.
+
+onboarding-tracking-protection-title2 = Protection From Tracking
+onboarding-tracking-protection-text2 = { -brand-short-name } helps stop websites from tracking you online, making it harder for ads to follow you around the web.
+onboarding-tracking-protection-button2 = How it Works
+
+onboarding-data-sync-title = Take Your Settings with You
+# "Sync" is short for synchronize.
+onboarding-data-sync-text2 = Sync your bookmarks, passwords, and more everywhere you use { -brand-product-name }.
+onboarding-data-sync-button2 = Sign in to { -sync-brand-short-name }
+
+onboarding-firefox-monitor-title = Stay Alert to Data Breaches
+onboarding-firefox-monitor-text = { -monitor-brand-name } monitors if your email has appeared in a data breach and alerts you if it appears in a new breach.
+onboarding-firefox-monitor-button = Sign up for Alerts
+
+onboarding-browse-privately-title = Browse Privately
+onboarding-browse-privately-text = Private Browsing clears your search and browsing history to keep it secret from anyone who uses your computer.
+onboarding-browse-privately-button = Open a Private Window
+
+onboarding-firefox-send-title = Keep Your Shared Files Private
+onboarding-firefox-send-text2 = Upload your files to { -send-brand-name } to share them with end-to-end encryption and a link that automatically expires.
+onboarding-firefox-send-button = Try { -send-brand-name }
+
+onboarding-mobile-phone-title = Get { -brand-product-name } on Your Phone
+onboarding-mobile-phone-text = Download { -brand-product-name } for iOS or Android and sync your data across devices.
+# "Mobile" is short for mobile/cellular phone, "Browser" is short for web
+# browser.
+onboarding-mobile-phone-button = Download Mobile Browser
+
+onboarding-send-tabs-title = Instantly Send Yourself Tabs
+# "Send Tabs" refers to "Send Tab to Device" feature that appears when opening a
+# tab's context menu.
+onboarding-send-tabs-text = Send Tabs instantly shares pages between your devices without having to copy, paste, or leave the browser.
+onboarding-send-tabs-button = Start Using Send Tabs
+
+onboarding-pocket-anywhere-title = Read and Listen Anywhere
+onboarding-pocket-anywhere-text2 = Save your favorite content offline with the { -pocket-brand-name } App and read, listen, and watch whenever it’s convenient for you.
+onboarding-pocket-anywhere-button = Try { -pocket-brand-name }
+
+onboarding-lockwise-passwords-title = Take Your Passwords Everywhere
+onboarding-lockwise-passwords-text2 = Keep the passwords you save secure and easily log in to your accounts with { -lockwise-brand-name }.
+onboarding-lockwise-passwords-button2 = Get the App
+
+onboarding-facebook-container-title = Set Boundaries with Facebook
+onboarding-facebook-container-text2 = { -facebook-container-brand-name } keeps your profile separate from everything else, making it harder for Facebook to target you with ads.
+onboarding-facebook-container-button = Add the Extension
+
+
+## Message strings belonging to the Return to AMO flow
+return-to-amo-sub-header = Great, you’ve got { -brand-short-name }
+
+# <icon></icon> will be replaced with the icon belonging to the extension
+#
+# Variables:
+#   $addon-name (String) - Name of the add-on
+return-to-amo-addon-header = Now let’s get you <icon></icon><b>{ $addon-name }.</b>
+return-to-amo-extension-button = Add the Extension
+return-to-amo-get-started-button = Get Started with { -brand-short-name }
--- a/browser/components/newtab/mochitest.sh
+++ b/browser/components/newtab/mochitest.sh
@@ -10,16 +10,17 @@ export DISPLAY=:99.0
 cd /mozilla-central && hg pull && hg update -C
 
 # Build Activity Stream and copy the output to m-c
 cd /activity-stream && npm install . && npm run buildmc
 
 # Build latest m-c with Activity Stream changes
 cd /mozilla-central && ./mach build \
   && ./mach lint browser/components/newtab \
+  && ./mach lint -l codespell browser/locales/en-US/browser/newtab \
   && ./mach test browser/components/newtab/test/browser --headless \
   && ./mach test browser/components/newtab/test/xpcshell \
   && ./mach test --log-tbpl test_run_log \
     browser/base/content/test/about/browser_aboutHome_search_telemetry.js \
     browser/base/content/test/static/browser_parsable_css.js \
     browser/base/content/test/tabs/browser_new_tab_in_privileged_process_pref.js \
     browser/components/enterprisepolicies/tests/browser/browser_policy_set_homepage.js \
     browser/components/preferences/in-content/tests/browser_hometab_restore_defaults.js \
--- a/browser/components/newtab/package-lock.json
+++ b/browser/components/newtab/package-lock.json
@@ -4113,17 +4113,18 @@
           "version": "1.1.1",
           "bundled": true,
           "dev": true,
           "optional": true
         },
         "ansi-regex": {
           "version": "2.1.1",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "aproba": {
           "version": "1.2.0",
           "bundled": true,
           "dev": true,
           "optional": true
         },
         "are-we-there-yet": {
@@ -4134,47 +4135,52 @@
           "requires": {
             "delegates": "^1.0.0",
             "readable-stream": "^2.0.6"
           }
         },
         "balanced-match": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "brace-expansion": {
           "version": "1.1.11",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "balanced-match": "^1.0.0",
             "concat-map": "0.0.1"
           }
         },
         "chownr": {
           "version": "1.1.1",
           "bundled": true,
           "dev": true,
           "optional": true
         },
         "code-point-at": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "concat-map": {
           "version": "0.0.1",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "console-control-strings": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "core-util-is": {
           "version": "1.0.2",
           "bundled": true,
           "dev": true,
           "optional": true
         },
         "debug": {
@@ -4281,55 +4287,60 @@
           "requires": {
             "once": "^1.3.0",
             "wrappy": "1"
           }
         },
         "inherits": {
           "version": "2.0.3",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "ini": {
           "version": "1.3.5",
           "bundled": true,
           "dev": true,
           "optional": true
         },
         "is-fullwidth-code-point": {
           "version": "1.0.0",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "number-is-nan": "^1.0.0"
           }
         },
         "isarray": {
           "version": "1.0.0",
           "bundled": true,
           "dev": true,
           "optional": true
         },
         "minimatch": {
           "version": "3.0.4",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "brace-expansion": "^1.1.7"
           }
         },
         "minimist": {
           "version": "0.0.8",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "minipass": {
           "version": "2.3.5",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "safe-buffer": "^5.1.2",
             "yallist": "^3.0.0"
           }
         },
         "minizlib": {
           "version": "1.2.1",
           "bundled": true,
@@ -4338,16 +4349,17 @@
           "requires": {
             "minipass": "^2.2.1"
           }
         },
         "mkdirp": {
           "version": "0.5.1",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "minimist": "0.0.8"
           }
         },
         "ms": {
           "version": "2.0.0",
           "bundled": true,
           "dev": true,
@@ -4418,28 +4430,30 @@
             "console-control-strings": "~1.1.0",
             "gauge": "~2.7.3",
             "set-blocking": "~2.0.0"
           }
         },
         "number-is-nan": {
           "version": "1.0.1",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "object-assign": {
           "version": "4.1.1",
           "bundled": true,
           "dev": true,
           "optional": true
         },
         "once": {
           "version": "1.4.0",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "wrappy": "1"
           }
         },
         "os-homedir": {
           "version": "1.0.2",
           "bundled": true,
           "dev": true,
@@ -4515,17 +4529,18 @@
           "optional": true,
           "requires": {
             "glob": "^7.1.3"
           }
         },
         "safe-buffer": {
           "version": "5.1.2",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "safer-buffer": {
           "version": "2.1.2",
           "bundled": true,
           "dev": true,
           "optional": true
         },
         "sax": {
@@ -4551,16 +4566,17 @@
           "bundled": true,
           "dev": true,
           "optional": true
         },
         "string-width": {
           "version": "1.0.2",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
             "strip-ansi": "^3.0.0"
           }
         },
         "string_decoder": {
           "version": "1.1.1",
@@ -4570,16 +4586,17 @@
           "requires": {
             "safe-buffer": "~5.1.0"
           }
         },
         "strip-ansi": {
           "version": "3.0.1",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "ansi-regex": "^2.0.0"
           }
         },
         "strip-json-comments": {
           "version": "2.0.1",
           "bundled": true,
           "dev": true,
@@ -4613,22 +4630,24 @@
           "optional": true,
           "requires": {
             "string-width": "^1.0.2 || 2"
           }
         },
         "wrappy": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "yallist": {
           "version": "3.0.3",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         }
       }
     },
     "fstream": {
       "version": "1.0.11",
       "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
       "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
       "dev": true,
--- a/browser/components/newtab/package.json
+++ b/browser/components/newtab/package.json
@@ -71,17 +71,17 @@
     "webpack": "4.32.2",
     "webpack-cli": "3.3.2",
     "yamscripts": "0.1.0"
   },
   "engines": {
     "firefox": ">=45.0 <=*",
     "//": "when changing node versions, also edit .travis.yml and .nvmrc",
     "node": "8.*",
-    "npm": "6.4.1"
+    "npm": "6.9"
   },
   "homepage": "https://github.com/mozilla/activity-stream",
   "keywords": [
     "mozilla",
     "firefox",
     "activity-stream"
   ],
   "license": "MPL-2.0",
@@ -103,32 +103,36 @@
     "bundle:webpack": "webpack --config webpack.system-addon.config.js",
     "bundle:css": "node-sass content-src/styles -o css",
     "bundle:html": "rimraf prerendered && node ./bin/render-activity-stream-html.js",
     "buildmc": "npm-run-all buildmc:*",
     "prebuildmc": "rimraf $npm_package_config_mc_dir/browser/components/newtab/",
     "buildmc:bundle": "npm run  bundle",
     "buildmc:copy": "rsync --exclude-from .mcignore -a . $npm_package_config_mc_dir/browser/components/newtab/",
     "buildmc:stringsExport": "cp $npm_package_config_locales_dir/$npm_package_config_default_locale/strings.properties $npm_package_config_mc_dir/browser/locales/$npm_package_config_default_locale/chrome/browser/activity-stream/newtab.properties",
+    "buildmc:fluentExport": "cpx \"$npm_package_config_locales_dir/*.ftl\" $npm_package_config_mc_dir/browser/locales/$npm_package_config_default_locale/browser/newtab/",
     "buildmc:copyPingCentre": "cpx \"ping-centre/PingCentre.jsm\" $npm_package_config_mc_dir/browser/modules",
     "builduplift": "npm-run-all builduplift:*",
     "prebuilduplift": "npm run prebuildmc",
     "builduplift:bundle": "npm run  bundle",
     "builduplift:copy": "npm run buildmc:copy",
     "buildlibrary": "npm-run-all buildlibrary:*",
     "buildlibrary:webpack": "webpack --config webpack.aboutlibrary.config.js",
     "buildlibrary:css": "node-sass --source-map true --source-map-contents content-src/aboutlibrary -o aboutlibrary/content",
     "buildlibrary:copy": "cpx \"aboutlibrary/**/{,.}*\" $npm_package_config_mc_dir/browser/components/library",
     "startmc": "npm-run-all --parallel startmc:*",
     "prestartmc": "npm run buildmc",
     "startmc:copy": "cpx \"{{,.}*,!(node_modules)/**/{,.}*}\" $npm_package_config_mc_dir/browser/components/newtab/ -w",
+    "startmc:copyFluent": "npm run buildmc:fluentExport -- -w",
     "startmc:copyPingCentre": "npm run buildmc:copyPingCentre -- -w",
     "startmc:webpack": "npm run bundle:webpack -- --env.development -w",
     "startmc:css": "npm run bundle:css && npm run bundle:css -- --source-map-embed --source-map-contents -w",
-    "importmc": "rsync --exclude-from .mcignore -a $npm_package_config_mc_dir/browser/components/newtab/ .",
+    "importmc": "npm-run-all importmc:*",
+    "importmc:src": "rsync --exclude-from .mcignore -a $npm_package_config_mc_dir/browser/components/newtab/ .",
+    "importmc:ftl": "rsync -a $npm_package_config_mc_dir/browser/locales/$npm_package_config_default_locale/browser/newtab/ $npm_package_config_locales_dir",
     "testmc": "npm-run-all testmc:*",
     "testmc:lint": "npm run lint",
     "testmc:build": "npm run bundle:webpack && npm run bundle:locales",
     "testmc:unit": "karma start karma.mc.config.js",
     "tddmc": "karma start karma.mc.config.js --tdd",
     "debugcoverage": "open logs/coverage/index.html",
     "lint": "npm-run-all lint:*",
     "lint:eslint-check": "eslint --print-config . | eslint-config-prettier-check",
--- a/browser/components/newtab/prerendered/locales/ach/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/ach/activity-stream-noscripts.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="ach" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Dirica matidi manyen</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
   </body>
--- a/browser/components/newtab/prerendered/locales/ach/activity-stream-strings.js
+++ b/browser/components/newtab/prerendered/locales/ach/activity-stream-strings.js
@@ -1,109 +1,35 @@
 // Note - this is a generated ach file.
 window.gActivityStreamStrings = {
-  "newtab_page_title": "Dirica matidi manyen",
-  "header_top_sites": "Kakube maloyo",
-  "header_highlights": "Wiye madito",
   "header_recommended_by": "Lami tam obedo {provider}",
-  "context_menu_button_sr": "Yab jami ayera pi {title}",
-  "section_context_menu_button_sr": "Open the section context menu",
-  "type_label_visited": "Kilimo",
-  "type_label_bookmarked": "Kiketo alamabuk",
-  "type_label_recommended": "Ma cuke lamal",
-  "type_label_pocket": "Kigwoko i Pocket",
-  "type_label_downloaded": "Ki gamo",
-  "menu_action_bookmark": "Alamabuk",
-  "menu_action_remove_bookmark": "Kwany alamabuk",
-  "menu_action_open_new_window": "Yab i dirica manyen",
-  "menu_action_open_private_window": "Yab i dirica manyen me mung",
-  "menu_action_dismiss": "Kwer",
-  "menu_action_delete": "Kwany ki ii gin mukato",
-  "menu_action_pin": "Mwon",
-  "menu_action_unpin": "War",
-  "confirm_history_delete_p1": "Imoko ni imito kwanyo nyig jami weng me potbuk man ki i gin mukato mamegi?",
-  "confirm_history_delete_notice_p2": "Pe ki twero gonyo tic man.",
-  "menu_action_save_to_pocket": "Gwok i Pocket",
-  "menu_action_delete_pocket": "Kwany ki ii Pocket",
-  "menu_action_archive_pocket": "Kan i Pocket",
-  "menu_action_show_file_mac_os": "Nyut i Gin nongo",
-  "menu_action_show_file_windows": "Yab boc manonge iyie",
-  "menu_action_show_file_linux": "Yab boc manonge iyie",
-  "menu_action_show_file_default": "Nyut Pwail",
-  "menu_action_open_file": "Yab Pwail",
-  "menu_action_copy_download_link": "Lok Kakube me Gam",
-  "menu_action_go_to_download_page": "Cit i Potbuk me Gam",
-  "menu_action_remove_download": "Kwany ki i Gin mukato",
-  "search_button": "Yeny",
-  "search_header": "Yeny me {search_engine_name}",
-  "search_web_placeholder": "Yeny kakube",
-  "section_disclaimer_topstories": "Lok ma mit loyo i kakube, ki yero malube ki ngo ma ikwano. Ki ii Pocket, kombedi dong but Mozilla.",
-  "section_disclaimer_topstories_linktext": "Nong ngec kit ma tyo kwede.",
-  "section_disclaimer_topstories_buttontext": "Eyo, aniang",
   "prefs_home_header": "Jami me Acakki Firefox",
   "prefs_home_description": "Yer jami ma imito ii kio me Acakki Firefox.",
   "prefs_content_discovery_description": "Content Discovery in Firefox Home allows you to discover high-quality, relevant articles from across the web.",
   "prefs_section_rows_option": "{num} row;{num} rows",
   "prefs_search_header": "Yeny me kakube",
   "prefs_topsites_description": "Kakube ma ilimo loyo",
   "prefs_topstories_description2": "Jami mabeco loyo ki ii kakube, kiyubo piri",
   "prefs_topstories_options_sponsored_label": "Lok ma kicwako",
   "prefs_topstories_sponsored_learn_more": "Nong ngec mapol",
   "prefs_highlights_description": "Yer me kakube ma igwoko nyo ilimo",
   "prefs_highlights_options_visited_label": "Potbuk ma kilimo",
   "prefs_highlights_options_download_label": "Gam ma cokcoki loyo",
   "prefs_highlights_options_pocket_label": "Kigwoko potbuk i Pocket",
   "prefs_snippets_description": "Ngec manyen ki bot Mozilla ki Firefox",
-  "settings_pane_button_label": "Yub potbuk me dirica matidi mamegi manyen",
   "settings_pane_topsites_header": "Kakube ma gi loyo",
   "settings_pane_highlights_header": "Wiye madito",
   "settings_pane_highlights_options_bookmarks": "Alamabuk",
   "settings_pane_snippets_header": "Kwena macek",
-  "edit_topsites_button_text": "Yubi",
-  "edit_topsites_edit_button": "Yub kakube man",
-  "topsites_form_add_header": "Kakube maloyo manyen",
-  "topsites_form_edit_header": "Yub Kakube maloyo",
-  "topsites_form_title_label": "Wiye madit",
-  "topsites_form_title_placeholder": "Ket wiye",
-  "topsites_form_url_label": "URL",
-  "topsites_form_image_url_label": "URL me cal ma kiyubo",
-  "topsites_form_url_placeholder": "Coo onyo mwon URL",
-  "topsites_form_use_image_link": "Tii ki cal ma kiyubo…",
-  "topsites_form_preview_button": "Nen",
-  "topsites_form_add_button": "Medi",
-  "topsites_form_save_button": "Gwoki",
-  "topsites_form_cancel_button": "Kwer",
-  "topsites_form_url_validation": "URL ma tye atir mite",
-  "topsites_form_image_validation": "Cano cal pe olare. Tem URL mukene.",
-  "pocket_read_more": "Lok macuk gi lamal:",
-  "pocket_read_even_more": "Nen Lok mapol",
-  "pocket_more_reccommendations": "More Recommendations",
   "pocket_how_it_works": "Kit ma tiyo kwede",
-  "pocket_cta_button": "Nong Pocket",
-  "pocket_cta_text": "Gwok lok ma imaro ii Pocket, ka i pik wii ki jami me akwana ma mako wii.",
-  "highlights_empty_state": "Cak yeny, ka wa binyuto coc akwana mabeco, video, ki potbuk mukene ma ilimo cokcokki onyo ma kiketo alamabuk kany.",
-  "topstories_empty_state": "Ityeko weng. Rot doki lacen pi lok madito mapol ki bot {provider}. Pe itwero kuro? Yer lok macuke lamal me nongo lok mabeco mapol ki i but kakube.",
-  "error_fallback_default_info": "Aii, gin mo otime marac i cano jami man.",
-  "error_fallback_default_refresh_suggestion": "Nwo cano potbuk me temo odoco.",
-  "section_menu_action_remove_section": "Kwany bute",
-  "section_menu_action_collapse_section": "Kan bute",
-  "section_menu_action_expand_section": "Yar bute",
-  "section_menu_action_manage_section": "Lo bute",
-  "section_menu_action_manage_webext": "Lo Lamed",
-  "section_menu_action_add_topsite": "Med Kakube maloyo",
-  "section_menu_action_add_search_engine": "Med ingin me yeny",
-  "section_menu_action_move_up": "Kob Malo",
-  "section_menu_action_move_down": "Kob Piny",
-  "section_menu_action_privacy_notice": "Ngec me mung",
   "firstrun_title": "Wot ki Firefox",
   "firstrun_content": "Nong alamabuk mamegi, gin mukato, mung me donyo ki ter mukene i nyonyo ni weng.",
   "firstrun_learn_more_link": "Nong ngec mapol ikom Akaunt me Firefox",
   "firstrun_form_header": "Ket email mamegi",
   "firstrun_form_sub_header": "to continue to Firefox Sync",
   "firstrun_email_input_placeholder": "Email",
   "firstrun_invalid_input": "Email ma tye atir mite",
   "firstrun_extra_legal_links": "Mede anyim nyuto ni i yee {terms} ki {privacy}.",
   "firstrun_terms_of_service": "Cik me Tic",
   "firstrun_privacy_notice": "Ngec me mung",
   "firstrun_continue_to_login": "Mede",
-  "firstrun_skip_login": "Kal citep man",
-  "context_menu_title": "Yab jami ayera"
+  "firstrun_skip_login": "Kal citep man"
 };
--- a/browser/components/newtab/prerendered/locales/ach/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/ach/activity-stream.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="ach" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Dirica matidi manyen</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
--- a/browser/components/newtab/prerendered/locales/an/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/an/activity-stream-noscripts.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="an" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Nueva Pestanya</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
   </body>
--- a/browser/components/newtab/prerendered/locales/an/activity-stream-strings.js
+++ b/browser/components/newtab/prerendered/locales/an/activity-stream-strings.js
@@ -1,109 +1,35 @@
 // Note - this is a generated an file.
 window.gActivityStreamStrings = {
-  "newtab_page_title": "Nueva Pestanya",
-  "header_top_sites": "Mas freqüents",
-  "header_highlights": "Destacaus",
   "header_recommended_by": "Recomendau per {provider}",
-  "context_menu_button_sr": "Ubrir menú contextual pa {title}",
-  "section_context_menu_button_sr": "Ubrir lo menú contextual d'a sección",
-  "type_label_visited": "Vesitau",
-  "type_label_bookmarked": "Con marcapachinas",
-  "type_label_recommended": "Tendencia",
-  "type_label_pocket": "Alzau en Pocket",
-  "type_label_downloaded": "Descargau",
-  "menu_action_bookmark": "Anyadir marcapachinas",
-  "menu_action_remove_bookmark": "Sacar lo marcapachinas",
-  "menu_action_open_new_window": "Ubrir en una nueva finestra",
-  "menu_action_open_private_window": "Ubrir en una nueva finestra privada",
-  "menu_action_dismiss": "Descartar",
-  "menu_action_delete": "Eliminar de l'historial",
-  "menu_action_pin": "Clavar",
-  "menu_action_unpin": "Desclavar",
-  "confirm_history_delete_p1": "Yes seguro que quiers borrar totas las instancias d'esta pachina en o tuyo historial?",
-  "confirm_history_delete_notice_p2": "Esta acción no se puede desfer.",
-  "menu_action_save_to_pocket": "Alzar en Pocket",
-  "menu_action_delete_pocket": "Borrar de Pocket",
-  "menu_action_archive_pocket": "Archivar en Pocket",
-  "menu_action_show_file_mac_os": "Amostrar en o Finder",
-  "menu_action_show_file_windows": "Ubrir la carpeta an que se troba",
-  "menu_action_show_file_linux": "Ubrir la carpeta an que se troba",
-  "menu_action_show_file_default": "Amostrar lo fichero",
-  "menu_action_open_file": "Ubrir fichero",
-  "menu_action_copy_download_link": "Copiar vinclo de descarga",
-  "menu_action_go_to_download_page": "Ir ta la pachina de descarga",
-  "menu_action_remove_download": "Borrar de l'historial",
-  "search_button": "Mirar",
-  "search_header": "Mirar con {search_engine_name}",
-  "search_web_placeholder": "Mirar en o Web",
-  "section_disclaimer_topstories": "Los articlos mas interesants d'o web, triaus en función d'o que gosas leyer. Gracias a lo Pocket, que agora ya fa parte de Mozilla.",
-  "section_disclaimer_topstories_linktext": "Aprende cómo funciona",
-  "section_disclaimer_topstories_buttontext": "Entendiu",
   "prefs_home_header": "Conteniu d'inicio de Firefox",
   "prefs_home_description": "Tría qué contenisu quiers veyer en a tuya pachina d'inicio de Firefox.",
   "prefs_content_discovery_description": "Content Discovery in Firefox Home allows you to discover high-quality, relevant articles from across the web.",
   "prefs_section_rows_option": "{num} ringlera;{num} ringleras",
   "prefs_search_header": "Busqueda web",
   "prefs_topsites_description": "Los puestos que mas vesitas",
   "prefs_topstories_description2": "Contenius interesants de tot lo web, personalizau pa tu",
   "prefs_topstories_options_sponsored_label": "Articlos esponsorizaus",
   "prefs_topstories_sponsored_learn_more": "Saber-ne mas",
   "prefs_highlights_description": "Una tría d'os puestos que has alzau u vesitau",
   "prefs_highlights_options_visited_label": "Pachinas visitadas",
   "prefs_highlights_options_download_label": "Descarga mas recient",
   "prefs_highlights_options_pocket_label": "Pachinas alzadas en Pocket",
   "prefs_snippets_description": "Actualizacions de Mozilla y Firefox",
-  "settings_pane_button_label": "Personaliza la tuya pachina de Nueva Pestanya",
   "settings_pane_topsites_header": "Puestos mas vesitaus",
   "settings_pane_highlights_header": "Destacaus",
   "settings_pane_highlights_options_bookmarks": "Marcapachinas",
   "settings_pane_snippets_header": "Retallos",
-  "edit_topsites_button_text": "Editar",
-  "edit_topsites_edit_button": "Editar este puesto",
-  "topsites_form_add_header": "Nuevo puesto popular",
-  "topsites_form_edit_header": "Editar lo puesto popular",
-  "topsites_form_title_label": "Titol",
-  "topsites_form_title_placeholder": "Escribir un titol",
-  "topsites_form_url_label": "URL",
-  "topsites_form_image_url_label": "URL d'imachen personalizada",
-  "topsites_form_url_placeholder": "Triar u apegar una adreza web",
-  "topsites_form_use_image_link": "Usar una imachen personalizada…",
-  "topsites_form_preview_button": "Previsualizar",
-  "topsites_form_add_button": "Anyadir",
-  "topsites_form_save_button": "Alzar",
-  "topsites_form_cancel_button": "Cancelar",
-  "topsites_form_url_validation": "Fa falta una URL valida",
-  "topsites_form_image_validation": "Ha fallau la carga d'a imachen. Preba con una URL diferent.",
-  "pocket_read_more": "Temas populars:",
-  "pocket_read_even_more": "Amostrar mas articlos",
-  "pocket_more_reccommendations": "More Recommendations",
   "pocket_how_it_works": "How it works",
-  "pocket_cta_button": "Get Pocket",
-  "pocket_cta_text": "Save the stories you love in Pocket, and fuel your mind with fascinating reads.",
-  "highlights_empty_state": "Empecipia a navegar, y t'iremos amostrando aquí grans articlos, videos y atras pachinas que has vesitau u marcau en zagueras.",
-  "topstories_empty_state": "Ya ye tot per agora. Torna mas ta debant pa veyer mas articlos populars de {provider}. No i puetz aguardar? Tría un tema popular pa descubrir los articlos mas interesants de tot lo web.",
-  "error_fallback_default_info": "Oi, ha fallau bella cosa en a carga d'este conteniu.",
-  "error_fallback_default_refresh_suggestion": "Refrescar la pachina pa tornar-lo a intentar.",
-  "section_menu_action_remove_section": "Borrar la sección",
-  "section_menu_action_collapse_section": "Plegar la sección",
-  "section_menu_action_expand_section": "Desplegar la sección",
-  "section_menu_action_manage_section": "Chestionar la sección",
-  "section_menu_action_manage_webext": "Chestionar la extensión",
-  "section_menu_action_add_topsite": "Anyadir un puesto popular",
-  "section_menu_action_add_search_engine": "Anyadir motor de busqueda",
-  "section_menu_action_move_up": "Puyar",
-  "section_menu_action_move_down": "Baixar",
-  "section_menu_action_privacy_notice": "Nota sobre privacidat",
   "firstrun_title": "Prene lo Firefox con tu",
   "firstrun_content": "Obtiene los tuyos marcapachinas, historials, claus y atros achustes en totz los tuyos dispositivos.",
   "firstrun_learn_more_link": "Aprende mas sobre las cuentas de Firefox",
   "firstrun_form_header": "Escribe lo tuyo email",
   "firstrun_form_sub_header": "pa continar enta Firefox Sync.",
   "firstrun_email_input_placeholder": "Correu-e",
   "firstrun_invalid_input": "Valid email required",
   "firstrun_extra_legal_links": "Si contina, ye confirmando que ye d'acuerdo con as {terms} y {privacy}.",
   "firstrun_terms_of_service": "Condicions d'uso",
   "firstrun_privacy_notice": "Nota sobre privacidat",
   "firstrun_continue_to_login": "Continar",
-  "firstrun_skip_login": "Blinca-te este paso",
-  "context_menu_title": "Open menu"
+  "firstrun_skip_login": "Blinca-te este paso"
 };
--- a/browser/components/newtab/prerendered/locales/an/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/an/activity-stream.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="an" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Nueva Pestanya</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
--- a/browser/components/newtab/prerendered/locales/ar/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/ar/activity-stream-noscripts.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="ar" dir="rtl">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>لسان جديد</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
   </body>
--- a/browser/components/newtab/prerendered/locales/ar/activity-stream-strings.js
+++ b/browser/components/newtab/prerendered/locales/ar/activity-stream-strings.js
@@ -1,109 +1,35 @@
 // Note - this is a generated ar file.
 window.gActivityStreamStrings = {
-  "newtab_page_title": "لسان جديد",
-  "header_top_sites": "المواقع الأكثر زيارة",
-  "header_highlights": "أهم الأحداث",
   "header_recommended_by": "ينصح به {provider}",
-  "context_menu_button_sr": "افتح قائمة {title} السياقية",
-  "section_context_menu_button_sr": "افتح قائمة القسم السياقية",
-  "type_label_visited": "مُزارة",
-  "type_label_bookmarked": "معلّمة",
-  "type_label_recommended": "مُتداول",
-  "type_label_pocket": "حُفِظت في بوكِت",
-  "type_label_downloaded": "نُزّل",
-  "menu_action_bookmark": "علّم",
-  "menu_action_remove_bookmark": "أزل العلامة",
-  "menu_action_open_new_window": "افتح في نافذة جديدة",
-  "menu_action_open_private_window": "افتح في نافذة خاصة جديدة",
-  "menu_action_dismiss": "ألغِ",
-  "menu_action_delete": "احذف من التأريخ",
-  "menu_action_pin": "ثبّت",
-  "menu_action_unpin": "أزل",
-  "confirm_history_delete_p1": "هل أنت متأكد أنك تريد حذف كل وجود لهذه الصفحة من تأريخك؟",
-  "confirm_history_delete_notice_p2": "لا يمكن التراجع عن هذا الإجراء.",
-  "menu_action_save_to_pocket": "احفظ في Pocket",
-  "menu_action_delete_pocket": "احذف من بوكِت",
-  "menu_action_archive_pocket": "أرشِف في بوكِت",
-  "menu_action_show_file_mac_os": "أظهِر في فايندر",
-  "menu_action_show_file_windows": "افتح المجلد المحتوي",
-  "menu_action_show_file_linux": "افتح المجلد المحتوي",
-  "menu_action_show_file_default": "أظهِر الملف",
-  "menu_action_open_file": "افتح الملف",
-  "menu_action_copy_download_link": "انسخ رابط التنزيل",
-  "menu_action_go_to_download_page": "انتقل إلى صفحة التنزيل",
-  "menu_action_remove_download": "احذف من التأريخ",
-  "search_button": "ابحث",
-  "search_header": "بحث {search_engine_name}",
-  "search_web_placeholder": "ابحث في الوِب",
-  "section_disclaimer_topstories": "أكثر القصص تشويقًا على الإنترنت، مختارة بعناية بناء على ما تقرأه. من بوكِت، و الذي أصبح جزءًا من موزيلا.",
-  "section_disclaimer_topstories_linktext": "اطلع على طريقة عملها.",
-  "section_disclaimer_topstories_buttontext": "حسنًا، فهمت",
   "prefs_home_header": "محتوى فَيَرفُكس الرئيسي",
   "prefs_home_description": "اختر المحتوى الذي تريد عرضه في شاشة بداية فَيَرفُكس.",
   "prefs_content_discovery_description": "تتيح لك ميزة ”اكتشاف المحتوى“ في صفحة بداية فَيَرفُكس رؤية مقالات عالية الجودة لها علاقة بما تتابع، تأتيك من أرجاء الوِب.",
   "prefs_section_rows_option": "صف واحد;صفان;{num} صفوف;{num} صفا;{num} صف;لا صفوف",
   "prefs_search_header": "ابحث في الوِب",
   "prefs_topsites_description": "أكثر المواقع المزارة",
   "prefs_topstories_description2": "محتوى مميز من أرجاء الوِب انتقيناه لك أنت",
   "prefs_topstories_options_sponsored_label": "الأخبار الممولة",
   "prefs_topstories_sponsored_learn_more": "اطّلع على المزيد",
   "prefs_highlights_description": "مجموعة المواقع التي حفظتها أو زرتها",
   "prefs_highlights_options_visited_label": "الصفحات المزارة",
   "prefs_highlights_options_download_label": "آخر ما نُزّل",
   "prefs_highlights_options_pocket_label": "الصفحات المحفوظة في بوكِت",
   "prefs_snippets_description": "التحديثات من موزيلا وفَيَرفُكس",
-  "settings_pane_button_label": "خصص صفحة اللسان الجديد",
   "settings_pane_topsites_header": "المواقع الأكثر زيارة",
   "settings_pane_highlights_header": "أهم الأحداث",
   "settings_pane_highlights_options_bookmarks": "العلامات",
   "settings_pane_snippets_header": "المقتطفات",
-  "edit_topsites_button_text": "حرِّر",
-  "edit_topsites_edit_button": "حرّر هذا الموقع",
-  "topsites_form_add_header": "موقع شائع جديد",
-  "topsites_form_edit_header": "حرّر الموقع الشائع",
-  "topsites_form_title_label": "العنوان",
-  "topsites_form_title_placeholder": "أدخل عنوانًا",
-  "topsites_form_url_label": "المسار",
-  "topsites_form_image_url_label": "مسار الصورة المخصصة",
-  "topsites_form_url_placeholder": "اكتب أو ألصق مسارًا",
-  "topsites_form_use_image_link": "استخدم صورة مخصصة…",
-  "topsites_form_preview_button": "عايِن",
-  "topsites_form_add_button": "أضِفْ",
-  "topsites_form_save_button": "احفظ",
-  "topsites_form_cancel_button": "ألغِ",
-  "topsites_form_url_validation": "مطلوب مسار صالح",
-  "topsites_form_image_validation": "فشل تحميل الصورة. جرّب مسارا آخر.",
-  "pocket_read_more": "المواضيع الشائعة:",
-  "pocket_read_even_more": "اعرض المزيد من الأخبار",
-  "pocket_more_reccommendations": "مقترحات أخرى",
   "pocket_how_it_works": "آلية العمل",
-  "pocket_cta_button": "نزِّل بوكِت",
-  "pocket_cta_text": "احفظ القصص التي تحبّها في بوكِت، وزوّد عقلك بمقالات رائعة.",
-  "highlights_empty_state": "ابدأ التصفح وسنعرض أمامك بعض المقالات والفيديوهات والمواقع الأخرى التي زرتها حديثا أو أضفتها إلى العلامات هنا.",
-  "topstories_empty_state": "لا جديد. تحقق لاحقًا للحصول على مزيد من أهم الأخبار من {provider}. لا يمكنك الانتظار؟ اختر موضوعًا شائعًا للعثور على المزيد من القصص الرائعة من جميع أنحاء الوِب.",
-  "error_fallback_default_info": "أخ! حدث خطب ما أثناء تحميل المحتوى.",
-  "error_fallback_default_refresh_suggestion": "أنعِش الصفحة لإعادة المحاولة.",
-  "section_menu_action_remove_section": "أزِل القسم",
-  "section_menu_action_collapse_section": "اطوِ القسم",
-  "section_menu_action_expand_section": "وسّع القسم",
-  "section_menu_action_manage_section": "أدِر القسم",
-  "section_menu_action_manage_webext": "أدِر الامتداد",
-  "section_menu_action_add_topsite": "أضف موقعًا شائعًا",
-  "section_menu_action_add_search_engine": "أضِف محرك بحث",
-  "section_menu_action_move_up": "انقل لأعلى",
-  "section_menu_action_move_down": "انقل لأسفل",
-  "section_menu_action_privacy_notice": "تنويه الخصوصية",
   "firstrun_title": "خذ معك فَيَرفُكس أينما ذهبت",
   "firstrun_content": "تشارك العلامات، وتأريخ التصفح، وكلمات السر وباقي الإعدادات على جميع أجهزتك.",
   "firstrun_learn_more_link": "اطّلع على المزيد عن حسابات فَيَرفُكس",
   "firstrun_form_header": "أدخِل بريدك الإلكتروني",
   "firstrun_form_sub_header": "لمواصلة استخدام «تزامُن فَيَرفُكس»",
   "firstrun_email_input_placeholder": "البريد الإلكتروني",
   "firstrun_invalid_input": "مطلوب بريد إلكتروني صالح",
   "firstrun_extra_legal_links": "بمواصلة هذه العملية أنت توافق على {terms} و{privacy}.",
   "firstrun_terms_of_service": "بنود الخدمة",
   "firstrun_privacy_notice": "تنويه الخصوصية",
   "firstrun_continue_to_login": "تابِع",
-  "firstrun_skip_login": "تجاوز هذه الخطوة",
-  "context_menu_title": "افتح القائمة"
+  "firstrun_skip_login": "تجاوز هذه الخطوة"
 };
--- a/browser/components/newtab/prerendered/locales/ar/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/ar/activity-stream.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="ar" dir="rtl">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>لسان جديد</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
--- a/browser/components/newtab/prerendered/locales/ast/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/ast/activity-stream-noscripts.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="ast" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Llingüeta nueva</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
   </body>
--- a/browser/components/newtab/prerendered/locales/ast/activity-stream-strings.js
+++ b/browser/components/newtab/prerendered/locales/ast/activity-stream-strings.js
@@ -1,109 +1,35 @@
 // Note - this is a generated ast file.
 window.gActivityStreamStrings = {
-  "newtab_page_title": "Llingüeta nueva",
-  "header_top_sites": "Más visitaos",
-  "header_highlights": "Destacaos",
   "header_recommended_by": "Recomendáu por {provider}",
-  "context_menu_button_sr": "Open context menu for {title}",
-  "section_context_menu_button_sr": "Open the section context menu",
-  "type_label_visited": "Visitóse",
-  "type_label_bookmarked": "Amestóse a marcadores",
-  "type_label_recommended": "Tendencia",
-  "type_label_pocket": "Saved to Pocket",
-  "type_label_downloaded": "Downloaded",
-  "menu_action_bookmark": "Amestar a marcadores",
-  "menu_action_remove_bookmark": "Desaniciar marcador",
-  "menu_action_open_new_window": "Abrir nuna ventana nueva",
-  "menu_action_open_private_window": "Abrir nuna ventana privada nueva",
-  "menu_action_dismiss": "Escartar",
-  "menu_action_delete": "Desaniciar del historial",
-  "menu_action_pin": "Fixar",
-  "menu_action_unpin": "Desfixar",
-  "confirm_history_delete_p1": "¿De xuru que quies desaniciar cada instancia d'esta páxina del to historial?",
-  "confirm_history_delete_notice_p2": "Esta aición nun pue desfacese.",
-  "menu_action_save_to_pocket": "Guardar en Pocket",
-  "menu_action_delete_pocket": "Delete from Pocket",
-  "menu_action_archive_pocket": "Archive in Pocket",
-  "menu_action_show_file_mac_os": "Show in Finder",
-  "menu_action_show_file_windows": "Open Containing Folder",
-  "menu_action_show_file_linux": "Open Containing Folder",
-  "menu_action_show_file_default": "Show File",
-  "menu_action_open_file": "Open File",
-  "menu_action_copy_download_link": "Copy Download Link",
-  "menu_action_go_to_download_page": "Go to Download Page",
-  "menu_action_remove_download": "Remove from History",
-  "search_button": "Guetar",
-  "search_header": "Gueta en {search_engine_name}",
-  "search_web_placeholder": "Guetar na web",
-  "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.",
-  "section_disclaimer_topstories_linktext": "Deprendi cómo furrula.",
-  "section_disclaimer_topstories_buttontext": "Val, píllolo",
   "prefs_home_header": "Firefox Home Content",
   "prefs_home_description": "Choose what content you want on your Firefox Home screen.",
   "prefs_content_discovery_description": "Content Discovery in Firefox Home allows you to discover high-quality, relevant articles from across the web.",
   "prefs_section_rows_option": "{num} row;{num} rows",
   "prefs_search_header": "Web Search",
   "prefs_topsites_description": "The sites you visit most",
   "prefs_topstories_description2": "Great content from around the web, personalized for you",
   "prefs_topstories_options_sponsored_label": "Sponsored Stories",
   "prefs_topstories_sponsored_learn_more": "Learn more",
   "prefs_highlights_description": "A selection of sites that you’ve saved or visited",
   "prefs_highlights_options_visited_label": "Visited Pages",
   "prefs_highlights_options_download_label": "Most Recent Download",
   "prefs_highlights_options_pocket_label": "Pages Saved to Pocket",
   "prefs_snippets_description": "Updates from Mozilla and Firefox",
-  "settings_pane_button_label": "Personalizar páxina Llingüeta nueva",
   "settings_pane_topsites_header": "Más visitaos",
   "settings_pane_highlights_header": "Destacaos",
   "settings_pane_highlights_options_bookmarks": "Marcadores",
   "settings_pane_snippets_header": "Retayos",
-  "edit_topsites_button_text": "Editar",
-  "edit_topsites_edit_button": "Editar esti sitiu",
-  "topsites_form_add_header": "Nuevu Sitiu más visitáu",
-  "topsites_form_edit_header": "Editar Sitiu más visitáu",
-  "topsites_form_title_label": "Title",
-  "topsites_form_title_placeholder": "Introducir títulu",
-  "topsites_form_url_label": "URL",
-  "topsites_form_image_url_label": "Custom Image URL",
-  "topsites_form_url_placeholder": "Escribi o apega una URL",
-  "topsites_form_use_image_link": "Use a custom image…",
-  "topsites_form_preview_button": "Preview",
-  "topsites_form_add_button": "Amestar",
-  "topsites_form_save_button": "Guardar",
-  "topsites_form_cancel_button": "Encaboxar",
-  "topsites_form_url_validation": "Ríquese una URL válida",
-  "topsites_form_image_validation": "Image failed to load. Try a different URL.",
-  "pocket_read_more": "Temes populares:",
-  "pocket_read_even_more": "Ver más histories",
-  "pocket_more_reccommendations": "More Recommendations",
   "pocket_how_it_works": "How it works",
-  "pocket_cta_button": "Get Pocket",
-  "pocket_cta_text": "Save the stories you love in Pocket, and fuel your mind with fascinating reads.",
-  "highlights_empty_state": "Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.",
-  "topstories_empty_state": "You’ve caught up. Check back later for more top stories from {provider}. Can’t wait? Select a popular topic to find more great stories from around the web.",
-  "error_fallback_default_info": "Oops, something went wrong loading this content.",
-  "error_fallback_default_refresh_suggestion": "Refresh page to try again.",
-  "section_menu_action_remove_section": "Remove Section",
-  "section_menu_action_collapse_section": "Collapse Section",
-  "section_menu_action_expand_section": "Expand Section",
-  "section_menu_action_manage_section": "Manage Section",
-  "section_menu_action_manage_webext": "Manage Extension",
-  "section_menu_action_add_topsite": "Add Top Site",
-  "section_menu_action_add_search_engine": "Add Search Engine",
-  "section_menu_action_move_up": "Move Up",
-  "section_menu_action_move_down": "Move Down",
-  "section_menu_action_privacy_notice": "Privacy Notice",
   "firstrun_title": "Take Firefox with You",
   "firstrun_content": "Get your bookmarks, history, passwords and other settings on all your devices.",
   "firstrun_learn_more_link": "Learn more about Firefox Accounts",
   "firstrun_form_header": "Enter your email",
   "firstrun_form_sub_header": "to continue to Firefox Sync",
   "firstrun_email_input_placeholder": "Email",
   "firstrun_invalid_input": "Valid email required",
   "firstrun_extra_legal_links": "By proceeding, you agree to the {terms} and {privacy}.",
   "firstrun_terms_of_service": "Terms of Service",
   "firstrun_privacy_notice": "Privacy Notice",
   "firstrun_continue_to_login": "Continue",
-  "firstrun_skip_login": "Skip this step",
-  "context_menu_title": "Open menu"
+  "firstrun_skip_login": "Skip this step"
 };
--- a/browser/components/newtab/prerendered/locales/ast/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/ast/activity-stream.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="ast" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Llingüeta nueva</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
--- a/browser/components/newtab/prerendered/locales/az/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/az/activity-stream-noscripts.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="az" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Yeni Vərəq</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
   </body>
--- a/browser/components/newtab/prerendered/locales/az/activity-stream-strings.js
+++ b/browser/components/newtab/prerendered/locales/az/activity-stream-strings.js
@@ -1,109 +1,35 @@
 // Note - this is a generated az file.
 window.gActivityStreamStrings = {
-  "newtab_page_title": "Yeni Vərəq",
-  "header_top_sites": "Qabaqcıl Saytlar",
-  "header_highlights": "Seçilmişlər",
   "header_recommended_by": "{provider} məsləhət görür",
-  "context_menu_button_sr": "{title} üçün kontekst menyusunu aç",
-  "section_context_menu_button_sr": "Kontekst menyusu bölməsini aç",
-  "type_label_visited": "Ziyarət edilib",
-  "type_label_bookmarked": "Əlfəcinlənib",
-  "type_label_recommended": "Populyar",
-  "type_label_pocket": "Pocket-ə saxlandı",
-  "type_label_downloaded": "Endirildi",
-  "menu_action_bookmark": "Əlfəcinlə",
-  "menu_action_remove_bookmark": "Əlfəcini sil",
-  "menu_action_open_new_window": "Yeni Pəncərədə Aç",
-  "menu_action_open_private_window": "Yeni Məxfi Pəncərədə Aç",
-  "menu_action_dismiss": "Rədd et",
-  "menu_action_delete": "Tarixçədən Sil",
-  "menu_action_pin": "Bərkid",
-  "menu_action_unpin": "Çıxart",
-  "confirm_history_delete_p1": "Bu səhifənin bütün parçalarını tarixçənizdən silmək istədiyinizə əminsiniz?",
-  "confirm_history_delete_notice_p2": "Bu əməliyyat geri alına bilməz.",
-  "menu_action_save_to_pocket": "Pocket-ə Saxla",
-  "menu_action_delete_pocket": "Pocket-dən sil",
-  "menu_action_archive_pocket": "Pocket-də arxivləşdir",
-  "menu_action_show_file_mac_os": "Finder-də Göstər",
-  "menu_action_show_file_windows": "Yerləşdiyi Qovluğu Aç",
-  "menu_action_show_file_linux": "Yerləşdiyi Qovluğu Aç",
-  "menu_action_show_file_default": "Faylı Göster",
-  "menu_action_open_file": "Faylı Aç",
-  "menu_action_copy_download_link": "Endirmə Ünvanını Köçür",
-  "menu_action_go_to_download_page": "Endirmə səhifəsinə get",
-  "menu_action_remove_download": "Tarixçədən Sil",
-  "search_button": "Axtar",
-  "search_header": "{search_engine_name} Axtarış",
-  "search_web_placeholder": "İnternetdə Axtar",
-  "section_disclaimer_topstories": "Nələr oxuduğunuza əsasən seçilmiş internetin ən maraqlı hekayələri. Pocket-dən, artıq Mozillanın bir hissəsi.",
-  "section_disclaimer_topstories_linktext": "Necə işlədiyini öyrənin.",
-  "section_disclaimer_topstories_buttontext": "Tamam, başa düşdüm",
   "prefs_home_header": "Firefox Ev Məzmunu",
   "prefs_home_description": "Firefox Evdə hansı məzmunları görmək istədiyinizi seçin.",
   "prefs_content_discovery_description": "Firefox Evdəki Məzmun Kəşfi yüksək keyfiyyətli və sizə uyğun internet məqalələrini kəşf etməyinizə imkan verir.",
   "prefs_section_rows_option": "{num} sətir;{num} sətir",
   "prefs_search_header": "Web Axtarış",
   "prefs_topsites_description": "Ən çox ziyarət etdiyiniz saytlar",
   "prefs_topstories_description2": "İnternetin ən yaxşı məzmunları, sizə görə fərdiləşdirilmiş",
   "prefs_topstories_options_sponsored_label": "Sponsorlaşdırılmış Hekayələr",
   "prefs_topstories_sponsored_learn_more": "Ətraflı öyrən",
   "prefs_highlights_description": "Saxladığınız və ya ziyarət etdiyiniz saytlardan seçmələr",
   "prefs_highlights_options_visited_label": "Baxılmış Səhifələr",
   "prefs_highlights_options_download_label": "Son Endirmələr",
   "prefs_highlights_options_pocket_label": "Pocket-ə Saxlanılan Səhifələr",
   "prefs_snippets_description": "Mozilla və Firefoxdan yeniliklər",
-  "settings_pane_button_label": "Yeni Vərəq səhifənizi fərdiləşdirin",
   "settings_pane_topsites_header": "Qabaqcıl Saytlar",
   "settings_pane_highlights_header": "Seçilmişlər",
   "settings_pane_highlights_options_bookmarks": "Əlfəcinlər",
   "settings_pane_snippets_header": "Hissələr",
-  "edit_topsites_button_text": "Redaktə et",
-  "edit_topsites_edit_button": "Bu saytı düzəlt",
-  "topsites_form_add_header": "Yeni Qabaqcıl Saytlar",
-  "topsites_form_edit_header": "Qabaqcıl Saytları Dəyişdir",
-  "topsites_form_title_label": "Başlıq",
-  "topsites_form_title_placeholder": "Başlıq daxil et",
-  "topsites_form_url_label": "URL",
-  "topsites_form_image_url_label": "Fərdi şəkil ünvanı",
-  "topsites_form_url_placeholder": "Ünvanı yazın və ya yapışdırın",
-  "topsites_form_use_image_link": "Fərdi şəkil işlət…",
-  "topsites_form_preview_button": "Ön baxış",
-  "topsites_form_add_button": "Əlavə et",
-  "topsites_form_save_button": "Saxla",
-  "topsites_form_cancel_button": "Ləğv et",
-  "topsites_form_url_validation": "Doğru ünvan tələb olunur",
-  "topsites_form_image_validation": "Şəkli yükləmək mümkün olmadı. Fərqli ünvan yoxlayın.",
-  "pocket_read_more": "Məşhur Mövzular:",
-  "pocket_read_even_more": "Daha çox hekayə gör",
-  "pocket_more_reccommendations": "Daha Çox Tövsiyyələr",
   "pocket_how_it_works": "Bu necə işləyir",
-  "pocket_cta_button": "Pocket əldə edin",
-  "pocket_cta_text": "Sevdiyiniz məqalələri Pocket-də saxlayın və möhtəşəm yeni yazıları kəşf edin.",
-  "highlights_empty_state": "İnternetdə gəzməyə başlayın, burada ziyarət edəcəyiniz və ya əlfəcinləyəcəyiniz məqalə, video və digər səhifələri göstərəcəyik.",
-  "topstories_empty_state": "Hamısını oxudunuz. Yeni {provider} məqalələri üçün daha sonra təkrar yoxlayın. Gözləyə bilmirsiz? Məşhur mövzu seçərək internetdən daha çox gözəl məqalələr tapın.",
-  "error_fallback_default_info": "Uups, bu məzmunu yüklərkən nəsə səhv getdi.",
-  "error_fallback_default_refresh_suggestion": "Təkrar yoxlamaq üçün səhifəni yeniləyin.",
-  "section_menu_action_remove_section": "Bölməni Sil",
-  "section_menu_action_collapse_section": "Bölməni Daralt",
-  "section_menu_action_expand_section": "Bölməni Genişlət",
-  "section_menu_action_manage_section": "Bölməni İdarə et",
-  "section_menu_action_manage_webext": "Uzantını idarə et",
-  "section_menu_action_add_topsite": "Qabaqcıl Sayt əlavə et",
-  "section_menu_action_add_search_engine": "Axtarış mühərriyi əlavə et",
-  "section_menu_action_move_up": "Yuxarı daşı",
-  "section_menu_action_move_down": "Aşağı daşı",
-  "section_menu_action_privacy_notice": "Məxfilik Bildirişi",
   "firstrun_title": "Firefox-u özünüzlə gəzdirin",
   "firstrun_content": "Əlfəcin, tarixçə, parol və digər tənzimləmələrinizi bütün cihazlarınızda əldə edin.",
   "firstrun_learn_more_link": "Firefox Hesabları haqqında ətraflı öyrənin",
   "firstrun_form_header": "E-poçtunuzu daxil edin",
   "firstrun_form_sub_header": "və Firefox Sync ilə davam edin.",
   "firstrun_email_input_placeholder": "E-poçt",
   "firstrun_invalid_input": "Doğru e-poçt tələb olunur",
   "firstrun_extra_legal_links": "Davam etməklə {terms} və {privacy} ilə razılaşmış olursuz.",
   "firstrun_terms_of_service": "İstifadə Şərtləri",
   "firstrun_privacy_notice": "Məxfilik Bildirişi",
   "firstrun_continue_to_login": "Davam et",
-  "firstrun_skip_login": "Bu addımı keç",
-  "context_menu_title": "Menyunu aç"
+  "firstrun_skip_login": "Bu addımı keç"
 };
--- a/browser/components/newtab/prerendered/locales/az/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/az/activity-stream.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="az" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Yeni Vərəq</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
--- a/browser/components/newtab/prerendered/locales/be/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/be/activity-stream-noscripts.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="be" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Новая картка</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
   </body>
--- a/browser/components/newtab/prerendered/locales/be/activity-stream-strings.js
+++ b/browser/components/newtab/prerendered/locales/be/activity-stream-strings.js
@@ -1,109 +1,35 @@
 // Note - this is a generated be file.
 window.gActivityStreamStrings = {
-  "newtab_page_title": "Новая картка",
-  "header_top_sites": "Папулярныя сайты",
-  "header_highlights": "Выбранае",
   "header_recommended_by": "Рэкамендавана {provider}",
-  "context_menu_button_sr": "Адкрыць кантэкстнае меню для {title}",
-  "section_context_menu_button_sr": "Адкрыць кантэкстнае меню раздзела",
-  "type_label_visited": "Наведанае",
-  "type_label_bookmarked": "У закладках",
-  "type_label_recommended": "Тэндэнцыі",
-  "type_label_pocket": "Захавана ў Pocket",
-  "type_label_downloaded": "Сцягнута",
-  "menu_action_bookmark": "У закладкі",
-  "menu_action_remove_bookmark": "Выдаліць закладку",
-  "menu_action_open_new_window": "Адкрыць у новым акне",
-  "menu_action_open_private_window": "Адкрыць у новым прыватным акне",
-  "menu_action_dismiss": "Адхіліць",
-  "menu_action_delete": "Выдаліць з гісторыі",
-  "menu_action_pin": "Замацаваць",
-  "menu_action_unpin": "Адмацаваць",
-  "confirm_history_delete_p1": "Вы сапраўды жадаеце выдаліць усе запісы аб гэтай старонцы з гісторыі?",
-  "confirm_history_delete_notice_p2": "Гэта дзеянне немагчыма адмяніць.",
-  "menu_action_save_to_pocket": "Захаваць у Pocket",
-  "menu_action_delete_pocket": "Выдаліць з Pocket",
-  "menu_action_archive_pocket": "Архіваваць у Pocket",
-  "menu_action_show_file_mac_os": "Паказаць у Finder",
-  "menu_action_show_file_windows": "Адкрыць змяшчальную папку",
-  "menu_action_show_file_linux": "Адкрыць папку з файлам",
-  "menu_action_show_file_default": "Паказаць файл",
-  "menu_action_open_file": "Адкрыць файл",
-  "menu_action_copy_download_link": "Капіяваць спасылку сцягвання",
-  "menu_action_go_to_download_page": "Перайсці на старонку сцягвання",
-  "menu_action_remove_download": "Выдаліць з гісторыі",
-  "search_button": "Шукаць",
-  "search_header": "Шукаць у {search_engine_name}",
-  "search_web_placeholder": "Пошук у Інтэрнэце",
-  "section_disclaimer_topstories": "Самыя цікавыя гісторыі з інтэрнэту на аснове таго, што вы чытаеце. Падборка ад Pocket, які цяпер частка Mozilla.",
-  "section_disclaimer_topstories_linktext": "Даведайцеся, як гэта працуе.",
-  "section_disclaimer_topstories_buttontext": "Зразумела",
   "prefs_home_header": "Хатні экран Firefox",
   "prefs_home_description": "Выберыце пажаданае змесціва для хатняга экрана Firefox.",
   "prefs_content_discovery_description": "Выяўленне змесціва на хатняй старонцы Firefox дазволіць вам знаходзіць высакаякасныя рэлевантныя артыкулы з усяго сеціва.",
   "prefs_section_rows_option": "{num} радок;{num} радкі;{num} радкоў",
   "prefs_search_header": "Пошук у сеціве",
   "prefs_topsites_description": "Сайты, якія вы наведваеце найчасцей",
   "prefs_topstories_description2": "Выдатнае змесціва з усяго інтэрнэту, выбранае спецыяльна для вас",
   "prefs_topstories_options_sponsored_label": "Артыкулы ад спонсараў",
   "prefs_topstories_sponsored_learn_more": "Даведацца больш",
   "prefs_highlights_description": "Выбраныя сайты, якія вы захавалі ці наведалі",
   "prefs_highlights_options_visited_label": "Наведаныя старонкі",
   "prefs_highlights_options_download_label": "Нядаўнія сцягванні",
   "prefs_highlights_options_pocket_label": "Захаваныя ў Pocket старонкі",
   "prefs_snippets_description": "Абнаўленні ад Mozilla і Firefox",
-  "settings_pane_button_label": "Наладзіць вашу старонку новай карткі",
   "settings_pane_topsites_header": "Папулярныя сайты",
   "settings_pane_highlights_header": "Выбранае",
   "settings_pane_highlights_options_bookmarks": "Закладкі",
   "settings_pane_snippets_header": "Урыўкі",
-  "edit_topsites_button_text": "Правіць",
-  "edit_topsites_edit_button": "Рэдагаваць гэты сайт",
-  "topsites_form_add_header": "Новы папулярны сайт",
-  "topsites_form_edit_header": "Рэдагаваць папулярны сайт",
-  "topsites_form_title_label": "Загаловак",
-  "topsites_form_title_placeholder": "Увядзіце назву",
-  "topsites_form_url_label": "URL",
-  "topsites_form_image_url_label": "URL уласнага відарыса",
-  "topsites_form_url_placeholder": "Увядзіце або ўстаўце URL",
-  "topsites_form_use_image_link": "Выкарыстоўваць уласны відарыс…",
-  "topsites_form_preview_button": "Перадпрагляд",
-  "topsites_form_add_button": "Дадаць",
-  "topsites_form_save_button": "Захаваць",
-  "topsites_form_cancel_button": "Скасаваць",
-  "topsites_form_url_validation": "Патрабуецца сапраўдны URL",
-  "topsites_form_image_validation": "Не ўдалося атрымаць відарыс. Паспрабуйце іншы URL.",
-  "pocket_read_more": "Папулярныя тэмы:",
-  "pocket_read_even_more": "Іншыя навіны",
-  "pocket_more_reccommendations": "Больш рэкамендацый",
   "pocket_how_it_works": "Як гэта працуе",
-  "pocket_cta_button": "Атрымаць Pocket",
-  "pocket_cta_text": "Захоўвайце ўлюбёныя гісторыі ў Pocket, і сілкуйце свой розум добрай чытанкай.",
-  "highlights_empty_state": "Пачніце агляданне, і мы пакажам вам тут некаторыя з найлепшых артыкулаў, відэаролікаў і іншых старонак, якія вы нядаўна наведалі або дадалі ў закладкі.",
-  "topstories_empty_state": "Гатова. Праверце пазней, каб убачыць больш матэрыялаў ад {provider}. Не жадаеце чакаць? Выберыце папулярную тэму, каб знайсці больш цікавых матэрыялаў з усяго Інтэрнэту.",
-  "error_fallback_default_info": "Ох, нешта пайшло не так пры загрузцы гэтага змесціва.",
-  "error_fallback_default_refresh_suggestion": "Абнавіць старонку, каб паўтарыць спробу.",
-  "section_menu_action_remove_section": "Выдаліць раздзел",
-  "section_menu_action_collapse_section": "Згарнуць раздзел",
-  "section_menu_action_expand_section": "Разгарнуць раздзел",
-  "section_menu_action_manage_section": "Наладзіць раздзел",
-  "section_menu_action_manage_webext": "Кіраваць пашырэннем",
-  "section_menu_action_add_topsite": "Дадаць папулярны сайт",
-  "section_menu_action_add_search_engine": "Дадаць пашукавік",
-  "section_menu_action_move_up": "Пасунуць вышэй",
-  "section_menu_action_move_down": "Пасунуць ніжэй",
-  "section_menu_action_privacy_notice": "Паведамленне аб прыватнасці",
   "firstrun_title": "Вазьміце Firefox з сабой",
   "firstrun_content": "Атрымайце доступ да вашых закладак, гісторыі, пароляў і іншых налад на ўсіх вашых прыладах.",
   "firstrun_learn_more_link": "Даведайцеся больш пра ўліковыя запісы Firefox",
   "firstrun_form_header": "Увядзіце сваю электронную пошту",
   "firstrun_form_sub_header": "каб прадоўжыць з Firefox Sync.",
   "firstrun_email_input_placeholder": "Эл.пошта",
   "firstrun_invalid_input": "Патрабуецца сапраўдны адрас эл.пошты",
   "firstrun_extra_legal_links": "Працягваючы, вы згаджаецеся з {terms} і {privacy}.",
   "firstrun_terms_of_service": "умовамі абслугоўвання",
   "firstrun_privacy_notice": "паведамленнем аб прыватнасці",
   "firstrun_continue_to_login": "Працягнуць",
-  "firstrun_skip_login": "Прапусціць гэты крок",
-  "context_menu_title": "Адкрыць меню"
+  "firstrun_skip_login": "Прапусціць гэты крок"
 };
--- a/browser/components/newtab/prerendered/locales/be/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/be/activity-stream.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="be" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Новая картка</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
--- a/browser/components/newtab/prerendered/locales/bg/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/bg/activity-stream-noscripts.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="bg" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Нов раздел</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
   </body>
--- a/browser/components/newtab/prerendered/locales/bg/activity-stream-strings.js
+++ b/browser/components/newtab/prerendered/locales/bg/activity-stream-strings.js
@@ -1,109 +1,35 @@
 // Note - this is a generated bg file.
 window.gActivityStreamStrings = {
-  "newtab_page_title": "Нов раздел",
-  "header_top_sites": "Често посещавани страници",
-  "header_highlights": "Акценти",
   "header_recommended_by": "Препоръчано от {provider}",
-  "context_menu_button_sr": "Отваряне на контекстуалното меню на {title}",
-  "section_context_menu_button_sr": "Отваряне на контекстното меню на раздела",
-  "type_label_visited": "Посетена",
-  "type_label_bookmarked": "Отметната",
-  "type_label_recommended": "Тенденции",
-  "type_label_pocket": "Запазено в Pocket",
-  "type_label_downloaded": "Изтеглено",
-  "menu_action_bookmark": "Отметка",
-  "menu_action_remove_bookmark": "Премахване на отметка",
-  "menu_action_open_new_window": "Отваряне в раздел",
-  "menu_action_open_private_window": "Отваряне в поверителен прозорец",
-  "menu_action_dismiss": "Отхвърляне",
-  "menu_action_delete": "Премахване",
-  "menu_action_pin": "Закачане",
-  "menu_action_unpin": "Откачане",
-  "confirm_history_delete_p1": "Сигурни ли сте, че желаете да премахнете страницата навсякъде от историята?",
-  "confirm_history_delete_notice_p2": "Действието е необратимо.",
-  "menu_action_save_to_pocket": "Запазване в Pocket",
-  "menu_action_delete_pocket": "Изтриване от Pocket",
-  "menu_action_archive_pocket": "Архивиране в Pocket",
-  "menu_action_show_file_mac_os": "Показване във Finder",
-  "menu_action_show_file_windows": "Отваряне на съдържащата папка",
-  "menu_action_show_file_linux": "Отваряне на съдържащата папка",
-  "menu_action_show_file_default": "Показване на файла",
-  "menu_action_open_file": "Отваряне на файла",
-  "menu_action_copy_download_link": "Копиране на препратка за изтегляне",
-  "menu_action_go_to_download_page": "Към страницата за изтегляне",
-  "menu_action_remove_download": "Премахване от историята",
-  "search_button": "Търсене",
-  "search_header": "Търсене с {search_engine_name}",
-  "search_web_placeholder": "Търсене в интернет",
-  "section_disclaimer_topstories": "Най-интересните истории в Мрежата на основата на прочетеното от вас. От Pocket, вече част от Mozilla.",
-  "section_disclaimer_topstories_linktext": "Разберете как работи.",
-  "section_disclaimer_topstories_buttontext": "Ясно, разбрах",
   "prefs_home_header": "Начална страница на Firefox",
   "prefs_home_description": "Изберете съдържанието, което искате да виждате на началната страница на Firefox.",
   "prefs_content_discovery_description": "Content Discovery in Firefox Home allows you to discover high-quality, relevant articles from across the web.",
   "prefs_section_rows_option": "{num} ред;{num} реда",
   "prefs_search_header": "Търсене в Мрежата",
   "prefs_topsites_description": "Най-посещаваните от вас страници",
   "prefs_topstories_description2": "Отлично съдържание от цялата Мрежа, подбрано лично за вас",
   "prefs_topstories_options_sponsored_label": "Платени публикации",
   "prefs_topstories_sponsored_learn_more": "Научете повече",
   "prefs_highlights_description": "Избрани страници, които сте запазили или посетили",
   "prefs_highlights_options_visited_label": "Посетени страници",
   "prefs_highlights_options_download_label": "Последни изтегляния",
   "prefs_highlights_options_pocket_label": "Страници, запазени в Pocket",
   "prefs_snippets_description": "Новости от Mozilla и Firefox",
-  "settings_pane_button_label": "Настройки на новия раздел",
   "settings_pane_topsites_header": "Често посещавани страници",
   "settings_pane_highlights_header": "Акценти",
   "settings_pane_highlights_options_bookmarks": "Отметки",
   "settings_pane_snippets_header": "Изрезки",
-  "edit_topsites_button_text": "Променяне",
-  "edit_topsites_edit_button": "Променяне",
-  "topsites_form_add_header": "Нова често посещавана страница",
-  "topsites_form_edit_header": "Променяне на често посещавана страница",
-  "topsites_form_title_label": "Заглавие",
-  "topsites_form_title_placeholder": "Въведете заглавие",
-  "topsites_form_url_label": "Адрес",
-  "topsites_form_image_url_label": "Адрес на изображение по желание",
-  "topsites_form_url_placeholder": "Адрес",
-  "topsites_form_use_image_link": "Използване изображение по желание…",
-  "topsites_form_preview_button": "Преглед",
-  "topsites_form_add_button": "Добавяне",
-  "topsites_form_save_button": "Запазване",
-  "topsites_form_cancel_button": "Отказ",
-  "topsites_form_url_validation": "Необходим е валиден URL",
-  "topsites_form_image_validation": "Изображението не може да бъде заредено. Опитайте с друг адрес.",
-  "pocket_read_more": "Популярни теми:",
-  "pocket_read_even_more": "Повече публикации",
-  "pocket_more_reccommendations": "Повече препоръчани",
   "pocket_how_it_works": "Как работи",
-  "pocket_cta_button": "Вземете Pocket",
-  "pocket_cta_text": "Запазете статиите, които харесвате в Pocket и заредете ума си с увлекателни четива.",
-  "highlights_empty_state": "Разглеждайте и тук ще ви покажем някои от най-добрите статии, видео и други страници, които сте посетили или отметнали наскоро.",
-  "topstories_empty_state": "Разгледахте всичко. Проверете по-късно за повече истории от {provider}. Нямате търпение? Изберете популярна тема, за да откриете повече истории от цялата Мрежа.",
-  "error_fallback_default_info": "Ааах, нещо се обърка и съдържанието не е заредено.",
-  "error_fallback_default_refresh_suggestion": "Презаредете страницата за повторен опит.",
-  "section_menu_action_remove_section": "Премахване на раздела",
-  "section_menu_action_collapse_section": "Свиване на раздела",
-  "section_menu_action_expand_section": "Разгъване на раздела",
-  "section_menu_action_manage_section": "Управление на раздела",
-  "section_menu_action_manage_webext": "Управление на добавката",
-  "section_menu_action_add_topsite": "Добавяне на често посещавана страница",
-  "section_menu_action_add_search_engine": "Добавяне на търсеща машина",
-  "section_menu_action_move_up": "Преместване нагоре",
-  "section_menu_action_move_down": "Преместване надолу",
-  "section_menu_action_privacy_notice": "Политика за личните данни",
   "firstrun_title": "Вземете Firefox с вас",
   "firstrun_content": "Вземете своите отметки, история, пароли и всички други настройки на всички ваши устройства.",
   "firstrun_learn_more_link": "Научете повече за Firefox Accounts",
   "firstrun_form_header": "Въведете своята ел. поща,",
   "firstrun_form_sub_header": "за да продължите към Firefox Sync",
   "firstrun_email_input_placeholder": "адрес на електронна поща",
   "firstrun_invalid_input": "Необходим е валиден адрес на ел. поща",
   "firstrun_extra_legal_links": "Продължавайки, вие се съгласявате с {terms} и {privacy}.",
   "firstrun_terms_of_service": "условията на услугата",
   "firstrun_privacy_notice": "политиката за лични данни",
   "firstrun_continue_to_login": "Продължаване",
-  "firstrun_skip_login": "Пропускане",
-  "context_menu_title": "Open menu"
+  "firstrun_skip_login": "Пропускане"
 };
--- a/browser/components/newtab/prerendered/locales/bg/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/bg/activity-stream.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="bg" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Нов раздел</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
--- a/browser/components/newtab/prerendered/locales/bn/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/bn/activity-stream-noscripts.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="bn" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>নতুন ট্যাব</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
   </body>
--- a/browser/components/newtab/prerendered/locales/bn/activity-stream-strings.js
+++ b/browser/components/newtab/prerendered/locales/bn/activity-stream-strings.js
@@ -1,109 +1,35 @@
 // Note - this is a generated bn file.
 window.gActivityStreamStrings = {
-  "newtab_page_title": "নতুন ট্যাব",
-  "header_top_sites": "শীর্ঘ সাইট",
-  "header_highlights": "হাইলাইটস",
   "header_recommended_by": "{provider} দ্বারা সুপারিশকৃত",
-  "context_menu_button_sr": "{title} থেকে কনটেক্সট মেনু খুলুন",
-  "section_context_menu_button_sr": "কনটেক্স মেন্যু তে সেকশনটি খুলুন",
-  "type_label_visited": "পরিদর্শিত",
-  "type_label_bookmarked": "বুকমার্ক করা হয়েছে",
-  "type_label_recommended": "ঝোঁক",
-  "type_label_pocket": "Pocket এ সংরক্ষণ করুন",
-  "type_label_downloaded": "ডাউনলোড হয়েছে",
-  "menu_action_bookmark": "বুকমার্ক",
-  "menu_action_remove_bookmark": "বুকমার্ক মুছে দিন",
-  "menu_action_open_new_window": "নতুন উইন্ডোতে খুলুন",
-  "menu_action_open_private_window": "নতুন ব্যক্তিগত উইন্ডোতে খুলুন",
-  "menu_action_dismiss": "বাতিল",
-  "menu_action_delete": "ইতিহাস থেকে মুছে ফেলুন",
-  "menu_action_pin": "পিন",
-  "menu_action_unpin": "আনপিন",
-  "confirm_history_delete_p1": "আপনি কি নিশ্চিতভাবে আপনার ইতিহাস থেকে এই পাতার সকল কিছু মুছে ফেলতে চান?",
-  "confirm_history_delete_notice_p2": "এই পরিবর্তনটি অপরিবর্তনীয়।",
-  "menu_action_save_to_pocket": "Pocket এ সংরক্ষণ করুন",
-  "menu_action_delete_pocket": "Pocket থেকে মুছে দিন",
-  "menu_action_archive_pocket": "Pocket এ আর্কাইভ করুন",
-  "menu_action_show_file_mac_os": "ফাইন্ডারে প্রদর্শন করুন",
-  "menu_action_show_file_windows": "ধারণকারী ফোল্ডার খুলুন",
-  "menu_action_show_file_linux": "ধারণকারী ফোল্ডার খুলুন",
-  "menu_action_show_file_default": "ফাইল দেখান",
-  "menu_action_open_file": "ফাইল খুলুন",
-  "menu_action_copy_download_link": "ডাউনলোডের লিঙ্ক অনুলিপি করুন",
-  "menu_action_go_to_download_page": "ডাউনলোড পাতায় যাও",
-  "menu_action_remove_download": "ইতিহাস থেকে মুছে ফেলুন",
-  "search_button": "অনুসন্ধান",
-  "search_header": "{search_engine_name} খুঁজুন",
-  "search_web_placeholder": "ওয়েবে সন্ধান করুন",
-  "section_disclaimer_topstories": "মজার মজার সব গল্প নির্বাচিত হয়েছে, আপনি যেমনটা পড়েন। Pocket এখন থেকে Mozilla এর অংশ।",
-  "section_disclaimer_topstories_linktext": "কিভাবে কাজ করে জানুন।",
-  "section_disclaimer_topstories_buttontext": "ঠিক আছে, বুঝেছি",
   "prefs_home_header": "Firefox Home কনটেন্ট",
   "prefs_home_description": "আপনার Firefox Home স্ক্রিনে যেসব কনটেন্ট রাখতে চান তা পছন্দ করুন।",
   "prefs_content_discovery_description": "Content Discovery in Firefox Home allows you to discover high-quality, relevant articles from across the web.",
   "prefs_section_rows_option": "{num} সারি; {num} সারিগুলি",
   "prefs_search_header": "ওয়েব অনুসন্ধান",
   "prefs_topsites_description": "যে সাইটগুলিতে আপনি বেশি যান",
   "prefs_topstories_description2": "ওয়েবের দারুন সব কন্টেন্ট, নিজের মত করে সাঁজিয়ে নিন",
   "prefs_topstories_options_sponsored_label": "স্পন্সর করা স্টোরি",
   "prefs_topstories_sponsored_learn_more": "আরও জানুন",
   "prefs_highlights_description": "সাইটের একটি সেকশন যা আপনি সংরক্ষণ অথবা গিয়েছিলেন",
   "prefs_highlights_options_visited_label": "ঘুরে আসা পেজ",
   "prefs_highlights_options_download_label": "সর্বশেষ ডাউনলোড",
   "prefs_highlights_options_pocket_label": "পেজটি Pocket এ সংরক্ষণ করা হয়েছে",
   "prefs_snippets_description": "Mozilla and Firefox থেকে হালনাগাদ",
-  "settings_pane_button_label": "আপনার নতুন ট্যাব পেজটি কাস্টমাইজ করুন",
   "settings_pane_topsites_header": "শীর্ষ সাইট",
   "settings_pane_highlights_header": "হাইলাইটস",
   "settings_pane_highlights_options_bookmarks": "বুকমার্ক",
   "settings_pane_snippets_header": "টুকিটাকি",
-  "edit_topsites_button_text": "সম্পাদনা",
-  "edit_topsites_edit_button": "সাইটটি সম্পাদনা করুন",
-  "topsites_form_add_header": "নতুন শীর্ষ সাইট",
-  "topsites_form_edit_header": "শীর্ষ সাইট সম্পাদনা করুন",
-  "topsites_form_title_label": "শিরোনাম",
-  "topsites_form_title_placeholder": "নাম দিন",
-  "topsites_form_url_label": "URL",
-  "topsites_form_image_url_label": "কাস্টম ছবির URL",
-  "topsites_form_url_placeholder": "টাইপ করুন অথবা পেস্ট করুন URL",
-  "topsites_form_use_image_link": "কাস্টম ছবি ব্যবহার করুন…",
-  "topsites_form_preview_button": "প্রাকদর্শন",
-  "topsites_form_add_button": "যোগ",
-  "topsites_form_save_button": "সংরক্ষণ",
-  "topsites_form_cancel_button": "বাতিল",
-  "topsites_form_url_validation": "কার্যকর URL প্রয়োজন",
-  "topsites_form_image_validation": "ছবি লোড করতে ব্যর্থ। ভিন্ন URL এ চেস্টা করুন।",
-  "pocket_read_more": "জনপ্রিয় বিষয়:",
-  "pocket_read_even_more": "আরও গল্প দেখুন",
-  "pocket_more_reccommendations": "আরও সুপারিশ",
   "pocket_how_it_works": "কিভাবে এটা কাজ করে",
-  "pocket_cta_button": "Pocket ব্যবহার করুন",
-  "pocket_cta_text": "Pocket এ আপনার পছন্দের গল্পগুলো সংরক্ষণ করুন, এবং চমৎকার সব লেখা পড়ে আপনার মনের ইন্ধন যোগান।",
-  "highlights_empty_state": "ব্রাউজি করা শুরু করুন, এবং কিছু গুরুত্বপূর্ণ নিবন্ধ, ভিডিও, এবং আপনি সম্প্রতি পরিদর্শন বা বুকমার্ক করেছেন এমন কিছু পৃষ্ঠা আমরা এখানে প্রদর্শন করব।",
-  "topstories_empty_state": "কিছু একটা ঠিক নেই। {provider} এর শীর্ষ গল্পগুলো পেতে কিছুক্ষণ পর আবার দেখুন। অপেক্ষা করতে চান না? বিশ্বের সেরা গল্পগুলো পেতে কোন জনপ্রিয় বিষয় নির্বাচন করুন।",
-  "error_fallback_default_info": "ওহো, কনটেন্টটি লোড করতে কিছু ভুল হয়েছে।",
-  "error_fallback_default_refresh_suggestion": "পুনরায় চেস্টা করার জন্য পেজটি রিফ্রেশ করুন।",
-  "section_menu_action_remove_section": "সেকশনটি সরান",
-  "section_menu_action_collapse_section": "সেকশনটি সংকোচন করুন",
-  "section_menu_action_expand_section": "সেকশনটি প্রসারিত করুন",
-  "section_menu_action_manage_section": "সেকশনটি পরিচালনা করুন",
-  "section_menu_action_manage_webext": "এক্সটেনসন ব্যবহার করুন",
-  "section_menu_action_add_topsite": "টপ সাইট যোগ করুন",
-  "section_menu_action_add_search_engine": "অনুসন্ধান ইঞ্জিন যোগ করুন",
-  "section_menu_action_move_up": "উপরে উঠাও",
-  "section_menu_action_move_down": "নীচে নামাও",
-  "section_menu_action_privacy_notice": "গোপনীয়তা নীতি",
   "firstrun_title": "অাপনি Firefox ব্যবহার করুন",
   "firstrun_content": "আপনার সমস্ত ডিভাইসে আপনার বুকমার্ক, ইতিহাস, পাসওয়ার্ড এবং অন্যান্য সেটিংস পাওয়া যাবে।",
   "firstrun_learn_more_link": "Firefox অ্যাকাউন্ট সম্পর্কে আরও জানুন",
   "firstrun_form_header": "আপনার ই-মেইল লিখুন",
   "firstrun_form_sub_header": "Firefox সিঙ্ক চালিয়ে যেতে",
   "firstrun_email_input_placeholder": "ইমেইল",
   "firstrun_invalid_input": "কার্যকর ইমেইল আবশ্যক",
   "firstrun_extra_legal_links": "অগ্রসর হওয়ার মাধ্যমে আপনি {terms} এবং {privacy} এর সাথে সম্মত হচ্ছেন।",
   "firstrun_terms_of_service": "সেবার শর্ত",
   "firstrun_privacy_notice": "গোপনীয়তা নীতি",
   "firstrun_continue_to_login": "চালিয়ে যান",
-  "firstrun_skip_login": "এই ধাপটি বাদ দিন",
-  "context_menu_title": "মেনু খুলুন"
+  "firstrun_skip_login": "এই ধাপটি বাদ দিন"
 };
--- a/browser/components/newtab/prerendered/locales/bn/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/bn/activity-stream.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="bn" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>নতুন ট্যাব</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
--- a/browser/components/newtab/prerendered/locales/br/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/br/activity-stream-noscripts.html
@@ -1,15 +1,17 @@
 <!doctype html>
 <html lang="br" dir="ltr">
   <head>
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
-    <title>Ivinell nevez</title>
+    <title data-l10n-id="newtab-page-title"></title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="localization" href="browser/branding/brandings.ftl" />
+    <link rel="localization" href="browser/newtab/newtab.ftl" />
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"></div>
     <div id="footer-asrouter-container" role="presentation"></div>
   </body>
--- a/browser/components/newtab/prerendered/locales/br/activity-stream-strings.js
+++ b/browser/components/newtab/prerendered/locales/br/activity-stream-strings.js
@@ -1,109 +1,35 @@
 // Note - this is a generated br file.
 window.gActivityStreamStrings = {
-  "newtab_page_title": "Ivinell nevez",
-  "header_top_sites": "Lec'hiennoù pennañ",
-  "header_highlights": "Mareoù pouezus",
   "header_recommended_by": "Erbedet gant {provider}",
-  "context_menu_button_sr": "Digeriñ al lañser kemperzhel evit {title}",
-  "section_context_menu_button_sr": "Digeriñ lañser kemperzhel al lodenn-mañ",
-  "type_label_visited": "Gweladennet",
-  "type_label_bookmarked": "Lakaet er sinedoù",
-  "type_label_recommended": "Brudet",
-  "type_label_pocket": "Enrollet e Pocket",
-  "type_label_downloaded": "Pellgarget",
-  "menu_action_bookmark": "Sined",
-  "menu_action_remove_bookmark": "Dilemel ar sined",
-  "menu_action_open_new_window": "Digeriñ e-barzh ur prenestr nevez",
-  "menu_action_open_private_window": "Digeriñ e-barzh ur prenestr merdeiñ prevez nevez",
-  "menu_action_dismiss": "Argas",
-  "menu_action_delete": "Dilemel eus ar roll istor",
-  "menu_action_pin": "Spilhennañ",
-  "menu_action_unpin": "Dispilhennañ",
-  "confirm_history_delete_p1