merge autoland to mozilla-central. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Sat, 07 Oct 2017 10:37:39 +0200
changeset 384963 dde44491690467f0b59a942e5565ba5d3eed69de
parent 384774 2d7b8b5dd174bd9db5894c6cb770e05f83e95ee3 (current diff)
parent 384962 8095eff05ac94898f4c8bf28340533f5aa7eaf68 (diff)
child 384964 6b0491f83229a80462793c74825f79b1ec1d9cda
push id95880
push userarchaeopteryx@coole-files.de
push dateSat, 07 Oct 2017 08:58:44 +0000
treeherdermozilla-inbound@156942799371 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone58.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 autoland to mozilla-central. r=merge a=merge MozReview-Commit-ID: 7Ez95T2ivfR
browser/base/content/browser.css
browser/base/content/tabbrowser.xml
browser/components/extensions/test/browser/file_iframe_document.sjs
browser/themes/shared/incontent-icons/session-restore.svg
browser/themes/shared/incontentprefs/critters-postcard.png
browser/themes/shared/search/gear.svg
browser/themes/windows/browser.css
devtools/client/themes/images/tool-debugger-paused.svg
devtools/client/themes/images/tool-memory-active.svg
devtools/client/themes/images/tool-profiler-active.svg
devtools/client/webconsole/new-console-output/test/fixtures/ObjectClient.js
dom/base/Element.cpp
dom/base/nsGkAtomList.h
dom/canvas/WebGLContext.cpp
dom/interfaces/html/nsIDOMHTMLCanvasElement.idl
dom/interfaces/html/nsIDOMHTMLIFrameElement.idl
dom/media/moz.build
dom/plugins/ipc/PluginUtilsWin.cpp
gfx/2d/NativeFontResourceDWrite.cpp
gfx/layers/d3d11/TextureD3D11.cpp
gfx/layers/wr/WebRenderBridgeChild.cpp
gfx/layers/wr/WebRenderBridgeChild.h
gfx/layers/wr/WebRenderBridgeParent.cpp
gfx/layers/wr/WebRenderLayerManager.cpp
gfx/webrender_bindings/WebRenderAPI.cpp
gfx/webrender_bindings/WebRenderAPI.h
gfx/webrender_bindings/src/bindings.rs
gfx/webrender_bindings/webrender_ffi_generated.h
js/src/shell/js.cpp
layout/printing/nsPrintEngine.cpp
layout/reftests/forms/input/checkbox/checkbox-radio-auto-sized.html
mobile/android/components/extensions/test/mochitest/file_iframe_document.sjs
modules/libpref/init/all.js
servo/components/style/gecko/generated/structs_debug.rs
servo/components/style/gecko/generated/structs_release.rs
taskcluster/ci/build/windows.yml
taskcluster/ci/toolchain/windows.yml
taskcluster/taskgraph/action.py
taskcluster/taskgraph/action.yml
toolkit/themes/linux/global/icons/autoscroll.png
toolkit/themes/osx/global/icons/autoscroll.png
toolkit/themes/windows/global/icons/autoscroll.png
widget/android/GeneratedJNIWrappers.cpp
widget/android/GeneratedJNIWrappers.h
widget/windows/InkCollector.h
widget/windows/JumpListBuilder.cpp
widget/windows/PDFViaEMFPrintHelper.h
widget/windows/nsDataObj.cpp
--- a/accessible/tests/mochitest/events/a11y.ini
+++ b/accessible/tests/mochitest/events/a11y.ini
@@ -15,17 +15,16 @@ support-files =
 [test_bug1322593.html]
 [test_bug1322593-2.html]
 [test_caretmove.html]
 [test_caretmove.xul]
 [test_coalescence.html]
 [test_contextmenu.html]
 [test_descrchange.html]
 [test_docload.html]
-skip-if = stylo && os == 'win' && debug # bug 1394317
 [test_docload_aria.html]
 [test_dragndrop.html]
 [test_flush.html]
 [test_focus_aria_activedescendant.html]
 [test_focus_autocomplete.xul]
 # Disabled on Linux and Windows due to frequent failures - bug 695019, bug 890795
 skip-if = os == 'win' || os == 'linux'
 [test_focus_canvas.html]
--- a/accessible/windows/msaa/LazyInstantiator.cpp
+++ b/accessible/windows/msaa/LazyInstantiator.cpp
@@ -807,17 +807,22 @@ LazyInstantiator::accLocation(long *pxLe
   RESOLVE_ROOT;
   return mWeakAccessible->accLocation(pxLeft, pyTop, pcxWidth, pcyHeight, varChild);
 }
 
 HRESULT
 LazyInstantiator::accNavigate(long navDir, VARIANT varStart,
                               VARIANT *pvarEndUpAt)
 {
-  return E_NOTIMPL;
+  if (!pvarEndUpAt) {
+    return E_INVALIDARG;
+  }
+
+  RESOLVE_ROOT;
+  return mWeakAccessible->accNavigate(navDir, varStart, pvarEndUpAt);
 }
 
 HRESULT
 LazyInstantiator::accHitTest(long xLeft, long yTop, VARIANT *pvarChild)
 {
   if (!pvarChild) {
     return E_INVALIDARG;
   }
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1268,16 +1268,19 @@ pref("browser.newtabpage.columns", 5);
 
 // directory tiles download URL
 pref("browser.newtabpage.directory.source", "https://tiles.services.mozilla.com/v3/links/fetch/%LOCALE%/%CHANNEL%");
 
 // activates Activity Stream
 pref("browser.newtabpage.activity-stream.enabled", true);
 pref("browser.newtabpage.activity-stream.prerender", true);
 pref("browser.newtabpage.activity-stream.aboutHome.enabled", true);
+#ifndef RELEASE_OR_BETA
+pref("browser.newtabpage.activity-stream.debug", false);
+#endif
 
 pref("browser.library.activity-stream.enabled", true);
 
 // Enable the DOM fullscreen API.
 pref("full-screen-api.enabled", true);
 
 // Startup Crash Tracking
 // number of startup crashes that can occur before starting into safe mode automatically
--- a/browser/base/content/browser-pageActions.js
+++ b/browser/base/content/browser-pageActions.js
@@ -194,18 +194,17 @@ var BrowserPageActions = {
     panelNode.setAttribute("actionID", action.id);
     panelNode.setAttribute("role", "group");
     panelNode.setAttribute("type", "arrow");
     panelNode.setAttribute("flip", "slide");
     panelNode.setAttribute("noautofocus", "true");
     panelNode.setAttribute("tabspecific", "true");
     panelNode.setAttribute("photon", "true");
 
-    // For tests.
-    if (this._disableActivatedActionPanelAnimation) {
+    if (this._disablePanelAnimations) {
       panelNode.setAttribute("animate", "false");
     }
 
     let panelViewNode = null;
     let iframeNode = null;
 
     if (action.subview) {
       let multiViewNode = document.createElement("photonpanelmultiview");
@@ -247,16 +246,29 @@ var BrowserPageActions = {
 
     if (iframeNode) {
       action.onIframeShown(iframeNode, panelNode);
     }
 
     return panelNode;
   },
 
+  // For tests.
+  get _disablePanelAnimations() {
+    return this.__disablePanelAnimations || false;
+  },
+  set _disablePanelAnimations(val) {
+    this.__disablePanelAnimations = val;
+    if (val) {
+      this.panelNode.setAttribute("animate", "false");
+    } else {
+      this.panelNode.removeAttribute("animate");
+    }
+  },
+
   /**
    * Returns the node in the urlbar to which popups for the given action should
    * be anchored.  If the action is null, a sensible anchor is returned.
    *
    * @param  action (PageActions.Action, optional)
    *         The action you want to anchor.
    * @return (DOM node, nonnull) The node to which the action should be
    *         anchored.
@@ -735,26 +747,26 @@ var BrowserPageActionFeedback = {
     let anchor = BrowserPageActions.panelAnchorNodeForAction(action);
     this.panelNode.openPopup(anchor, {
       position: "bottomcenter topright",
       triggerEvent: event,
     });
 
     this.panelNode.addEventListener("popupshown", () => {
       this.feedbackAnimationBox.setAttribute("animate", "true");
+
+      // The timeout value used here allows the panel to stay open for
+      // 1 second after the text transition (duration=120ms) has finished.
+      setTimeout(() => {
+        this.panelNode.hidePopup(true);
+      }, Services.prefs.getIntPref("browser.pageActions.feedbackTimeoutMS", 1120));
     }, {once: true});
     this.panelNode.addEventListener("popuphidden", () => {
       this.feedbackAnimationBox.removeAttribute("animate");
     }, {once: true});
-
-    // The timeout value used here allows the panel to stay open for
-    // 1 second after the text transition (duration=120ms) has finished.
-    setTimeout(() => {
-      this.panelNode.hidePopup(true);
-    }, Services.prefs.getIntPref("browser.pageActions.feedbackTimeoutMS", 1120));
   },
 };
 
 // built-in actions below //////////////////////////////////////////////////////
 
 // bookmark
 BrowserPageActions.bookmark = {
   onShowingInPanel(buttonNode) {
--- a/browser/base/content/browser-tabsintitlebar.js
+++ b/browser/base/content/browser-tabsintitlebar.js
@@ -157,17 +157,18 @@ var TabsInTitlebar = {
       }
 
       // Try to avoid reflows in this code by calculating dimensions first and
       // then later set the properties affecting layout together in a batch.
 
       // Get the height of the tabs toolbar:
       let tabsToolbar = $("TabsToolbar");
       let tabsStyles = window.getComputedStyle(tabsToolbar);
-      let fullTabsHeight = rect($("TabsToolbar")).height + verticalMargins(tabsStyles);
+      let fullTabsHeight = rect(tabsToolbar).height + verticalMargins(tabsStyles);
+
       // Buttons first:
       let captionButtonsBoxWidth = rect($("titlebar-buttonbox-container")).width;
 
       let secondaryButtonsWidth, menuHeight, fullMenuHeight, menuStyles;
       if (AppConstants.platform == "macosx") {
         secondaryButtonsWidth = rect($("titlebar-secondary-buttonbox")).width;
         // No need to look up the menubar stuff on OS X:
         menuHeight = 0;
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -519,20 +519,16 @@ toolbar:not(#TabsToolbar) > #personal-bo
 
 :root[lwthemefooter=true] #browser-bottombox:-moz-lwtheme {
   background-repeat: no-repeat;
   background-position: bottom left;
   background-color: var(--lwt-accent-color);
   background-image: var(--lwt-footer-image);
 }
 
-.menuitem-iconic-tooltip {
-  -moz-binding: url("chrome://browser/content/urlbarBindings.xml#menuitem-iconic-tooltip");
-}
-
 /* Hide menu elements intended for keyboard access support */
 #main-menubar[openedwithkey=false] .show-only-for-keyboard {
   display: none;
 }
 
 /* ::::: location bar & search bar ::::: */
 
 /* url bar min-width is defined further down, together with the maximum size
--- a/browser/base/content/tabbrowser.css
+++ b/browser/base/content/tabbrowser.css
@@ -58,16 +58,20 @@
   direction: rtl;
   mask-image: linear-gradient(to right, transparent, black 2em);
 }
 
 tabpanels {
   background-color: transparent;
 }
 
+.tab-drop-indicator-box {
+  -moz-box-align: end;
+}
+
 .tab-drop-indicator {
   position: relative;
   z-index: 2;
 }
 
 /* Apply crisp rendering for favicons at exactly 2dppx resolution */
 @media (resolution: 2dppx) {
   .tab-icon-image {
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -6325,17 +6325,17 @@
 
   <binding id="tabbrowser-tabs"
            extends="chrome://global/content/bindings/tabbox.xml#tabs">
     <resources>
       <stylesheet src="chrome://browser/content/tabbrowser.css"/>
     </resources>
 
     <content>
-      <xul:hbox align="end">
+      <xul:hbox class="tab-drop-indicator-box">
         <xul:image class="tab-drop-indicator" anonid="tab-drop-indicator" collapsed="true"/>
       </xul:hbox>
       <xul:arrowscrollbox anonid="arrowscrollbox" orient="horizontal" flex="1"
                           style="min-width: 1px;"
                           class="tabbrowser-arrowscrollbox">
 <!--
  This is a hack to circumvent bug 472020, otherwise the tabs show up on the
  right of the newtab button.
@@ -7753,17 +7753,17 @@
           <xul:spacer flex="1"/>
           <xul:hbox class="tab-bottom-line"/>
         </xul:vbox>
         <xul:hbox xbl:inherits="pinned,bursting,notselectedsinceload"
                   anonid="tab-loading-burst"
                   class="tab-loading-burst"/>
         <xul:hbox xbl:inherits="pinned,selected=visuallyselected,titlechanged,attention"
                   class="tab-content" align="center">
-          <xul:hbox xbl:inherits="fadein,pinned,busy,progress,selected=visuallyselected,notselectedsinceload"
+          <xul:hbox xbl:inherits="fadein,pinned,busy,progress,selected=visuallyselected"
                     anonid="tab-throbber"
                     class="tab-throbber"
                     layer="true"/>
           <xul:image xbl:inherits="src=image,loadingprincipal=iconLoadingPrincipal,requestcontextid,fadein,pinned,selected=visuallyselected,busy,crashed,sharing"
                      anonid="tab-icon-image"
                      class="tab-icon-image"
                      validate="never"
                      role="presentation"/>
--- a/browser/base/content/test/general/contextmenu_common.js
+++ b/browser/base/content/test/general/contextmenu_common.js
@@ -317,18 +317,17 @@ async function test_contextmenu(selector
   if (menuItems) {
     if (Services.prefs.getBoolPref("devtools.inspector.enabled", true)) {
       let inspectItems = ["---", null,
                           "context-inspect", true];
       menuItems = menuItems.concat(inspectItems);
     }
 
     if (options.maybeScreenshotsPresent &&
-        !Services.prefs.getBoolPref("extensions.screenshots.disabled", false) &&
-        !Services.prefs.getBoolPref("extensions.screenshots.system-disabled", false)) {
+        !Services.prefs.getBoolPref("extensions.screenshots.disabled", false)) {
       let screenshotItems = [
         "---", null,
         "screenshots_mozilla_org_create-screenshot", true
       ];
 
       menuItems = menuItems.concat(screenshotItems);
     }
 
--- a/browser/base/content/test/static/browser_parsable_css.js
+++ b/browser/base/content/test/static/browser_parsable_css.js
@@ -82,16 +82,25 @@ if (!Services.prefs.getBoolPref("full-sc
 let allowedImageReferences = [
   // Bug 1302691
   {file: "chrome://devtools/skin/images/dock-bottom-minimize@2x.png",
    from: "chrome://devtools/skin/toolbox.css",
    isFromDevTools: true},
   {file: "chrome://devtools/skin/images/dock-bottom-maximize@2x.png",
    from: "chrome://devtools/skin/toolbox.css",
    isFromDevTools: true},
+  // Bug 1405539
+  {file: "chrome://global/skin/arrow/panelarrow-vertical@2x.png",
+   from: "resource://activity-stream/data/content/activity-stream.css",
+   isFromDevTools: false,
+   platforms: ["linux", "win"]},
+  {file: "chrome://global/skin/arrow/panelarrow-vertical-themed.svg",
+   from: "resource://activity-stream/data/content/activity-stream.css",
+   isFromDevTools: false,
+   platforms: ["macosx"]},
 ];
 
 // Add suffix to stylesheets' URI so that we always load them here and
 // have them parsed. Add a random number so that even if we run this
 // test multiple times, it would be unlikely to affect each other.
 const kPathSuffix = "?always-parse-css-" + Math.random();
 
 /**
--- a/browser/base/content/test/urlbar/browser_page_action_menu.js
+++ b/browser/base/content/test/urlbar/browser_page_action_menu.js
@@ -1,25 +1,32 @@
 "use strict";
 
-/* global sinon */
+/* global sinon, UIState */
 Services.scriptloader.loadSubScript("resource://testing-common/sinon-2.3.2.js");
 
 registerCleanupFunction(function() {
   delete window.sinon;
 });
 
-Cu.import("resource://services-sync/UIState.jsm");
-
 const mockRemoteClients = [
   { id: "0", name: "foo", type: "mobile" },
   { id: "1", name: "bar", type: "desktop" },
   { id: "2", name: "baz", type: "mobile" },
 ];
 
+add_task(async function init() {
+  // Disable panel animations.  They cause intermittent timeouts on Linux when
+  // the test tries to synthesize clicks on items in newly opened panels.
+  BrowserPageActions._disablePanelAnimations = true;
+  registerCleanupFunction(() => {
+    BrowserPageActions._disablePanelAnimations = false;
+  });
+});
+
 add_task(async function bookmark() {
   // Open a unique page.
   let url = "http://example.com/browser_page_action_menu";
   await BrowserTestUtils.withNewTab(url, async () => {
     // Open the panel.
     await promisePageActionPanelOpen();
 
     // The bookmark button should read "Bookmark This Page" and not be starred.
@@ -481,21 +488,16 @@ add_task(async function sendToDevice_inU
     sandbox.stub(gSync, "isSendableURI").returns(true);
     sandbox.stub(gSync, "remoteClients").get(() => mockRemoteClients);
 
     let cleanUp = () => {
       sandbox.restore();
     };
     registerCleanupFunction(cleanUp);
 
-    // Disable the activated-action panel animation when it opens.  Otherwise
-    // it's necessary to wait a moment before trying to click the device menu
-    // item below.
-    BrowserPageActions._disableActivatedActionPanelAnimation = true;
-
     // Add Send to Device to the urlbar.
     let action = PageActions.actionForID("sendToDevice");
     action.shownInUrlbar = true;
 
     // Click it to open its panel.
     let urlbarButton = document.getElementById(
       BrowserPageActions._urlbarButtonNodeIDForActionID(action.id)
     );
@@ -567,17 +569,16 @@ add_task(async function sendToDevice_inU
       BrowserPageActionFeedback.panelNode.anchorNode.id,
       urlbarButton.id
     );
     info("Waiting for the Sent! notification panel to close");
     await promisePanelHidden(BrowserPageActionFeedback.panelNode.id);
 
     // Remove Send to Device from the urlbar.
     action.shownInUrlbar = false;
-    BrowserPageActions._disableActivatedActionPanelAnimation = false;
 
     cleanUp();
   });
 });
 
 add_task(async function contextMenu() {
   // Open an actionable page so that the main page action button appears.
   let url = "http://example.com/";
--- a/browser/base/content/test/urlbar/browser_urlbarOneOffs_searchSuggestions.js
+++ b/browser/base/content/test/urlbar/browser_urlbarOneOffs_searchSuggestions.js
@@ -77,16 +77,43 @@ add_task(async function oneOffClickAfter
                                    `http://mochi.test:8888/?terms=foobar`);
   EventUtils.synthesizeMouseAtCenter(oneOffs[0], {});
   await resultsPromise;
 
   await PlacesTestUtils.clearHistory();
   await BrowserTestUtils.removeTab(tab);
 });
 
+add_task(async function overridden_engine_not_reused() {
+  info("An overridden search suggestion item should not be reused by a search with another engine");
+  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
+    let typedValue = "foo";
+    await promiseAutocompleteResultPopup(typedValue, window, true);
+    await BrowserTestUtils.waitForCondition(suggestionsPresent,
+                                            "waiting for suggestions");
+    // Down to select the first search suggestion.
+    EventUtils.synthesizeKey("VK_DOWN", {})
+    assertState(1, -1, "foofoo");
+    // ALT+Down to select the second search engine.
+    EventUtils.synthesizeKey("VK_DOWN", { altKey: true });
+    EventUtils.synthesizeKey("VK_DOWN", { altKey: true });
+    assertState(1, 1, "foofoo");
+
+    let label = gURLBar.popup.richlistbox.children[gURLBar.popup.richlistbox.selectedIndex].label;
+    // Run again the query, check the label has been replaced.
+    await promiseAutocompleteResultPopup(typedValue, window, true);
+    await BrowserTestUtils.waitForCondition(suggestionsPresent,
+                                            "waiting for suggestions");
+    assertState(0, -1, "foo");
+    let newLabel = gURLBar.popup.richlistbox.children[1].label;
+    Assert.notEqual(newLabel, label, "The label should have been updated");
+
+    await BrowserTestUtils.removeTab(tab);
+});
+
 function assertState(result, oneOff, textValue = undefined) {
   Assert.equal(gURLBar.popup.selectedIndex, result,
                "Expected result should be selected");
   Assert.equal(gURLBar.popup.oneOffSearchButtons.selectedButtonIndex, oneOff,
                "Expected one-off should be selected");
   if (textValue !== undefined) {
     Assert.equal(gURLBar.textValue, textValue, "Expected textValue");
   }
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -2262,16 +2262,23 @@ file, You can obtain one at http://mozil
           // 1. if a search starts we set selectedIndex to 0 here, and it will
           //    be updated by onResultsAdded. Since selectedIndex is 0,
           //    handleEnter will delay the action if a result didn't arrive yet.
           // 2. if a search doesn't start (for example if autocomplete is
           //    disabled), this won't be called, and the selectedIndex will be
           //    the default -1 value. Then handleEnter will know it should not
           //    delay the action, cause a result wont't ever arrive.
           this.input.controller.setInitiallySelectedIndex(0);
+
+          // Since we are starting a new search, reset the currently selected
+          // one-off button, to cover those cases where the oneoff buttons
+          // binding won't receive an actual DOM event. For example, a search
+          // could be started without an actual input event, and the popup may
+          // not have been closed from the previous search.
+          this.oneOffSearchButtons.selectedButton = null;
         ]]></body>
       </method>
 
       <field name="_addonIframe">null</field>
       <field name="_addonIframeOwner">null</field>
       <field name="_addonIframeOverriddenFunctionsByName">{}</field>
 
       <!-- These methods must be overridden and properly handled by the API
@@ -3102,21 +3109,9 @@ file, You can obtain one at http://mozil
       </method>
     </implementation>
     <handlers>
       <!-- The _accept method checks for .defaultPrevented so that if focus is in a button,
            enter activates the button and not this default action -->
       <handler event="keypress" keycode="VK_RETURN" group="system" action="this._accept(event);"/>
     </handlers>
   </binding>
-
-  <!-- This binding is only retained for add-ons compatibility -->
-  <binding id="menuitem-iconic-tooltip" extends="chrome://global/content/bindings/menu.xml#menuitem-iconic">
-    <implementation>
-      <constructor><![CDATA[
-        this.setAttribute("tooltiptext", this.getAttribute("acceltext"));
-        // TODO: Simplify this to this.setAttribute("acceltext", "") once bug
-        // 592424 is fixed
-        document.getAnonymousElementByAttribute(this, "anonid", "accel").firstChild.setAttribute("value", "");
-      ]]></constructor>
-    </implementation>
-  </binding>
 </bindings>
--- a/browser/components/customizableui/CustomizeMode.jsm
+++ b/browser/components/customizableui/CustomizeMode.jsm
@@ -42,16 +42,18 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 XPCOMUtils.defineLazyModuleGetter(this, "LightweightThemeManager",
                                   "resource://gre/modules/LightweightThemeManager.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "SessionStore",
                                   "resource:///modules/sessionstore/SessionStore.jsm");
 XPCOMUtils.defineLazyGetter(this, "gWidgetsBundle", function() {
   const kUrl = "chrome://browser/locale/customizableui/customizableWidgets.properties";
   return Services.strings.createBundle(kUrl);
 });
+XPCOMUtils.defineLazyPreferenceGetter(this, "gCosmeticAnimationsEnabled",
+                                      "toolkit.cosmeticAnimations.enabled");
 
 let gDebug;
 XPCOMUtils.defineLazyGetter(this, "log", () => {
   let scope = {};
   Cu.import("resource://gre/modules/Console.jsm", scope);
   gDebug = Services.prefs.getBoolPref(kPrefCustomizationDebug, false);
   let consoleOptions = {
     maxLogLevel: gDebug ? "all" : "log",
@@ -573,21 +575,49 @@ CustomizeMode.prototype = {
       if (areas.indexOf(parent.id) != -1) {
         return aNode;
       }
       aNode = parent;
     }
     return null;
   },
 
-  addToToolbar(aNode) {
+  _promiseWidgetAnimationOut(aNode) {
+    if (!gCosmeticAnimationsEnabled ||
+        aNode.getAttribute("cui-anchorid") == "nav-bar-overflow-button" ||
+        (aNode.tagName != "toolbaritem" && aNode.tagName != "toolbarbutton") ||
+        (aNode.id == "downloads-button" && aNode.hidden)) {
+      return null;
+    }
+    let animationNode;
+    if (aNode.parentNode.id.startsWith("wrapper-")) {
+      animationNode = aNode.parentNode;
+    } else {
+      animationNode = aNode;
+    }
+    return new Promise(resolve => {
+      animationNode.classList.add("animate-out");
+      animationNode.addEventListener("animationend", function cleanupWidgetAnimationEnd(e) {
+        if (e.animationName == "widget-animate-out" && e.target.id == animationNode.id) {
+          animationNode.removeEventListener("animationend", cleanupWidgetAnimationEnd);
+          resolve();
+        }
+      });
+    });
+  },
+
+  async addToToolbar(aNode) {
     aNode = this._getCustomizableChildForNode(aNode);
     if (aNode.localName == "toolbarpaletteitem" && aNode.firstChild) {
       aNode = aNode.firstChild;
     }
+    let widgetAnimationPromise = this._promiseWidgetAnimationOut(aNode);
+    if (widgetAnimationPromise) {
+      await widgetAnimationPromise;
+    }
 
     let widgetToAdd = aNode.id;
     if (CustomizableUI.isSpecialWidget(widgetToAdd) && aNode.closest("#customization-palette")) {
       widgetToAdd = widgetToAdd.match(/^customizableui-special-(spring|spacer|separator)/)[1];
     }
 
     CustomizableUI.addWidgetToArea(widgetToAdd, CustomizableUI.AREA_NAVBAR);
     if (!this._customizing) {
@@ -596,72 +626,103 @@ CustomizeMode.prototype = {
 
     // If the user explicitly moves this item, turn off autohide.
     if (aNode.id == "downloads-button") {
       Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
       if (this._customizing) {
         this._showDownloadsAutoHidePanel();
       }
     }
+
+    if (widgetAnimationPromise) {
+      if (aNode.parentNode.id.startsWith("wrapper-")) {
+        aNode.parentNode.classList.remove("animate-out");
+      } else {
+        aNode.classList.remove("animate-out")
+      }
+    }
   },
 
-  addToPanel(aNode) {
+  async addToPanel(aNode) {
     aNode = this._getCustomizableChildForNode(aNode);
     if (aNode.localName == "toolbarpaletteitem" && aNode.firstChild) {
       aNode = aNode.firstChild;
     }
+    let widgetAnimationPromise = this._promiseWidgetAnimationOut(aNode);
+    if (widgetAnimationPromise) {
+      await widgetAnimationPromise;
+    }
 
     let panel = CustomizableUI.AREA_FIXED_OVERFLOW_PANEL;
     CustomizableUI.addWidgetToArea(aNode.id, panel);
     if (!this._customizing) {
       CustomizableUI.dispatchToolboxEvent("customizationchange");
     }
 
     // If the user explicitly moves this item, turn off autohide.
     if (aNode.id == "downloads-button") {
       Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
       if (this._customizing) {
         this._showDownloadsAutoHidePanel();
       }
     }
 
-    if (Services.prefs.getBoolPref("toolkit.cosmeticAnimations.enabled")) {
+    if (widgetAnimationPromise) {
+      if (aNode.parentNode.id.startsWith("wrapper-")) {
+        aNode.parentNode.classList.remove("animate-out");
+      } else {
+        aNode.classList.remove("animate-out")
+      }
+    }
+    if (gCosmeticAnimationsEnabled) {
       let overflowButton = this.document.getElementById("nav-bar-overflow-button");
       BrowserUtils.setToolbarButtonHeightProperty(overflowButton).then(() => {
         overflowButton.setAttribute("animate", "true");
         overflowButton.addEventListener("animationend", function onAnimationEnd(event) {
           if (event.animationName.startsWith("overflow-animation")) {
             this.setAttribute("fade", "true");
           } else if (event.animationName == "overflow-fade") {
             this.removeEventListener("animationend", onAnimationEnd);
             this.removeAttribute("animate");
             this.removeAttribute("fade");
           }
         });
       });
     }
   },
 
-  removeFromArea(aNode) {
+  async removeFromArea(aNode) {
     aNode = this._getCustomizableChildForNode(aNode);
     if (aNode.localName == "toolbarpaletteitem" && aNode.firstChild) {
       aNode = aNode.firstChild;
     }
+    let widgetAnimationPromise = this._promiseWidgetAnimationOut(aNode);
+    if (widgetAnimationPromise) {
+      await widgetAnimationPromise;
+    }
+
     CustomizableUI.removeWidgetFromArea(aNode.id);
     if (!this._customizing) {
       CustomizableUI.dispatchToolboxEvent("customizationchange");
     }
 
     // If the user explicitly removes this item, turn off autohide.
     if (aNode.id == "downloads-button") {
       Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
       if (this._customizing) {
         this._showDownloadsAutoHidePanel();
       }
     }
+    if (widgetAnimationPromise) {
+      if (aNode.parentNode.id.startsWith("wrapper-")) {
+        aNode.parentNode.classList.remove("animate-out");
+      } else {
+        aNode.classList.remove("animate-out")
+      }
+    }
   },
 
   populatePalette() {
     let fragment = this.document.createDocumentFragment();
     let toolboxPalette = this.window.gNavToolbox.palette;
 
     try {
       let unusedWidgets = CustomizableUI.getUnusedWidgets(toolboxPalette);
@@ -1353,38 +1414,35 @@ CustomizeMode.prototype = {
           tbb.setAttribute("defaulttheme", "true");
         } else {
           tbb.setAttribute("image", aTheme.iconURL);
         }
         if (aTheme.description)
           tbb.setAttribute("tooltiptext", aTheme.description);
         tbb.setAttribute("tabindex", "0");
         tbb.classList.add("customization-lwtheme-menu-theme");
-        tbb.setAttribute("aria-checked", aTheme.isActive);
+        let isActive = activeThemeID == aTheme.id;
+        tbb.setAttribute("aria-checked", isActive);
         tbb.setAttribute("role", "menuitemradio");
-        if (aTheme.isActive) {
+        if (isActive) {
           tbb.setAttribute("active", "true");
         }
         tbb.addEventListener("focus", previewTheme);
         tbb.addEventListener("mouseover", previewTheme);
         tbb.addEventListener("blur", resetPreview);
         tbb.addEventListener("mouseout", resetPreview);
 
         return tbb;
       }
 
       let themes = [aDefaultTheme];
       let lwts = LightweightThemeManager.usedThemes;
       let currentLwt = LightweightThemeManager.currentTheme;
-      // The lwts besides the builtin themes don't have an isActive property:
-      for (let lwt of lwts) {
-        if (!lwt.hasOwnProperty("isActive")) {
-          lwt.isActive = !!currentLwt && (lwt.id == currentLwt.id);
-        }
-      }
+
+      let activeThemeID = currentLwt ? currentLwt.id : DEFAULT_THEME_ID;
 
       // Move the current theme (if any) and the light/dark themes to the start:
       let importantThemes = [LIGHT_THEME_ID, DARK_THEME_ID];
       if (currentLwt && !importantThemes.includes(currentLwt.id)) {
         importantThemes.push(currentLwt.id);
       }
       for (let importantTheme of importantThemes) {
         let themeIndex = lwts.findIndex(theme => theme.id == importantTheme);
--- a/browser/components/customizableui/test/browser.ini
+++ b/browser/components/customizableui/test/browser.ini
@@ -161,8 +161,9 @@ tags = fullscreen
 [browser_backfwd_enabled_post_customize.js]
 [browser_check_tooltips_in_navbar.js]
 [browser_editcontrols_update.js]
 subsuite = clipboard
 [browser_customization_context_menus.js]
 [browser_open_from_popup.js]
 [browser_sidebar_toggle.js]
 [browser_remote_tabs_button.js]
+[browser_widget_animation.js]
--- a/browser/components/customizableui/test/browser_1007336_lwthemes_in_customize_mode.js
+++ b/browser/components/customizableui/test/browser_1007336_lwthemes_in_customize_mode.js
@@ -40,28 +40,50 @@ add_task(async function() {
      "There should only be three themes (default, light, dark) in the 'My Themes' section by default");
   is(header.nextSibling.theme.id, DEFAULT_THEME_ID,
      "The first theme should be the default theme");
   is(header.nextSibling.nextSibling.theme.id, LIGHT_THEME_ID,
      "The second theme should be the light theme");
   is(header.nextSibling.nextSibling.nextSibling.theme.id, DARK_THEME_ID,
      "The third theme should be the dark theme");
 
+  let themeChangedPromise = promiseObserverNotified("lightweight-theme-changed");
+  header.nextSibling.nextSibling.doCommand(); // Select light theme
+  info("Clicked on light theme");
+  await themeChangedPromise;
+
+  popupShownPromise = popupShown(popup);
+  EventUtils.synthesizeMouseAtCenter(themesButton, {});
+  info("Clicked on themes button a third time");
+  await popupShownPromise;
+
+  let activeThemes = popup.querySelectorAll("toolbarbutton.customization-lwtheme-menu-theme[active]");
+  is(activeThemes.length, 1, "Exactly 1 theme should be selected");
+  if (activeThemes.length > 0) {
+    is(activeThemes[0].theme.id, LIGHT_THEME_ID, "Light theme should be selected");
+  }
+
   let firstLWTheme = recommendedHeader.nextSibling;
   let firstLWThemeId = firstLWTheme.theme.id;
-  let themeChangedPromise = promiseObserverNotified("lightweight-theme-changed");
+  themeChangedPromise = promiseObserverNotified("lightweight-theme-changed");
   firstLWTheme.doCommand();
   info("Clicked on first theme");
   await themeChangedPromise;
 
   popupShownPromise = popupShown(popup);
   EventUtils.synthesizeMouseAtCenter(themesButton, {});
   info("Clicked on themes button");
   await popupShownPromise;
 
+  activeThemes = popup.querySelectorAll("toolbarbutton.customization-lwtheme-menu-theme[active]");
+  is(activeThemes.length, 1, "Exactly 1 theme should be selected");
+  if (activeThemes.length > 0) {
+    is(activeThemes[0].theme.id, firstLWThemeId, "First theme should be selected");
+  }
+
   is(header.nextSibling.theme.id, DEFAULT_THEME_ID, "The first theme should be the Default theme");
   let installedThemeId = header.nextSibling.nextSibling.nextSibling.nextSibling.theme.id;
   ok(installedThemeId.startsWith(firstLWThemeId),
      "The second theme in the 'My Themes' section should be the newly installed theme: " +
      "Installed theme id: " + installedThemeId + "; First theme ID: " + firstLWThemeId);
   let themeCount = 0;
   let iterNode = header;
   while (iterNode.nextSibling && iterNode.nextSibling.theme) {
@@ -73,17 +95,17 @@ add_task(async function() {
 
   let defaultTheme = header.nextSibling;
   defaultTheme.doCommand();
   is(Services.prefs.getCharPref("lightweightThemes.selectedThemeID"), "", "No lwtheme should be selected");
 
   // ensure current theme isn't set to "Default"
   popupShownPromise = popupShown(popup);
   EventUtils.synthesizeMouseAtCenter(themesButton, {});
-  info("Clicked on themes button a second time");
+  info("Clicked on themes button a fourth time");
   await popupShownPromise;
 
   firstLWTheme = recommendedHeader.nextSibling;
   themeChangedPromise = promiseObserverNotified("lightweight-theme-changed");
   firstLWTheme.doCommand();
   info("Clicked on first theme again");
   await themeChangedPromise;
 
@@ -93,17 +115,17 @@ add_task(async function() {
 
   await endCustomizing();
   Services.prefs.setCharPref("lightweightThemes.usedThemes", "[]");
   Services.prefs.setCharPref("lightweightThemes.recommendedThemes", "[]");
   info("Removed all recommended themes");
   await startCustomizing();
   popupShownPromise = popupShown(popup);
   EventUtils.synthesizeMouseAtCenter(themesButton, {});
-  info("Clicked on themes button a second time");
+  info("Clicked on themes button a fifth time");
   await popupShownPromise;
   header = document.getElementById("customization-lwtheme-menu-header");
   is(header.hidden, false, "Header should never be hidden");
   let themeNode = header.nextSibling;
   is(themeNode.theme.id, DEFAULT_THEME_ID, "The first theme should be the Default theme");
   is(themeNode.hidden, false, "The default theme should never be hidden");
 
   themeNode = themeNode.nextSibling;
--- a/browser/components/customizableui/test/browser_972267_customizationchange_events.js
+++ b/browser/components/customizableui/test/browser_972267_customizationchange_events.js
@@ -15,17 +15,17 @@ add_task(async function() {
     handlerCalledCount++;
   };
 
   let homeButton = document.getElementById("home-button");
 
   gNavToolbox.addEventListener("customizationchange", handler);
   otherToolbox.addEventListener("customizationchange", handler);
 
-  gCustomizeMode.addToPanel(homeButton);
+  await gCustomizeMode.addToPanel(homeButton);
 
   is(handlerCalledCount, 2, "Should be called for both windows.");
 
   handlerCalledCount = 0;
   gCustomizeMode.addToToolbar(homeButton);
   is(handlerCalledCount, 2, "Should be called for both windows.");
 
   gNavToolbox.removeEventListener("customizationchange", handler);
--- a/browser/components/customizableui/test/browser_984455_bookmarks_items_reparenting.js
+++ b/browser/components/customizableui/test/browser_984455_bookmarks_items_reparenting.js
@@ -210,39 +210,39 @@ add_task(async function testOverflowingB
  * Test that the bookmarks toolbar items context menu still works if moved
  * to the menu from the overflow panel, and then back to the toolbar.
  */
 add_task(async function testOverflowingBookmarksItemsContextMenu() {
   info("Ensuring panel is ready.");
   await PanelUI.ensureReady();
 
   let bookmarksToolbarItems = document.getElementById(kBookmarksItems);
-  gCustomizeMode.addToToolbar(bookmarksToolbarItems);
+  await gCustomizeMode.addToToolbar(bookmarksToolbarItems);
   await checkPlacesContextMenu(bookmarksToolbarItems);
 
   await overflowEverything();
   checkOverflowing(kBookmarksItems)
 
-  gCustomizeMode.addToPanel(bookmarksToolbarItems);
+  await gCustomizeMode.addToPanel(bookmarksToolbarItems);
 
   await stopOverflowing();
 
-  gCustomizeMode.addToToolbar(bookmarksToolbarItems);
+  await gCustomizeMode.addToToolbar(bookmarksToolbarItems);
   await checkPlacesContextMenu(bookmarksToolbarItems);
 });
 
 /**
  * Test that overflowing the bookmarks toolbar items doesn't cause the
  * context menu in the bookmarks toolbar items chevron to stop working.
  */
 add_task(async function testOverflowingBookmarksItemsChevronContextMenu() {
   // If it's not already there, let's move the bookmarks toolbar items to
   // the nav-bar.
   let bookmarksToolbarItems = document.getElementById(kBookmarksItems);
-  gCustomizeMode.addToToolbar(bookmarksToolbarItems);
+  await gCustomizeMode.addToToolbar(bookmarksToolbarItems);
 
   // We make the PlacesToolbarItems element be super tiny in order to force
   // the bookmarks toolbar items into overflowing and making the chevron
   // show itself.
   let placesToolbarItems = document.getElementById("PlacesToolbarItems");
   let placesChevron = document.getElementById("PlacesChevron");
   placesToolbarItems.style.maxWidth = "10px";
   info("Waiting for chevron to no longer be collapsed");
--- a/browser/components/customizableui/test/browser_customization_context_menus.js
+++ b/browser/components/customizableui/test/browser_customization_context_menus.js
@@ -146,33 +146,33 @@ add_task(async function urlbar_context()
 // and back should move the search-container instead.
 add_task(async function searchbar_context_move_to_panel_and_back() {
   // This is specifically testing the addToPanel function for the search bar, so
   // we have to move it to its correct position in the navigation toolbar first.
   // The preference will be restored when the customizations are reset later.
   Services.prefs.setBoolPref("browser.search.widget.inNavBar", true);
 
   let searchbar = document.getElementById("searchbar");
-  gCustomizeMode.addToPanel(searchbar);
+  await gCustomizeMode.addToPanel(searchbar);
   let placement = CustomizableUI.getPlacementOfWidget("search-container");
   is(placement.area, CustomizableUI.AREA_FIXED_OVERFLOW_PANEL, "Should be in panel");
 
   await waitForOverflowButtonShown();
 
   let shownPanelPromise = popupShown(overflowPanel);
   overflowButton.click();
   await shownPanelPromise;
   let hiddenPanelPromise = popupHidden(overflowPanel);
   overflowPanel.hidePopup();
   await hiddenPanelPromise;
 
   gCustomizeMode.addToToolbar(searchbar);
   placement = CustomizableUI.getPlacementOfWidget("search-container");
   is(placement.area, CustomizableUI.AREA_NAVBAR, "Should be in navbar");
-  gCustomizeMode.removeFromArea(searchbar);
+  await gCustomizeMode.removeFromArea(searchbar);
   placement = CustomizableUI.getPlacementOfWidget("search-container");
   is(placement, null, "Should be in palette");
   CustomizableUI.reset();
   placement = CustomizableUI.getPlacementOfWidget("search-container");
   is(placement, null, "Should be in palette");
 });
 
 // Right-click on an item within the panel should
--- a/browser/components/customizableui/test/browser_overflow_use_subviews.js
+++ b/browser/components/customizableui/test/browser_overflow_use_subviews.js
@@ -50,17 +50,17 @@ add_task(async function check_developer_
 /**
  * This checks that non-subview-compatible items still work correctly.
  * Ideally we should make the downloads panel and bookmarks/library item
  * proper subview items, then this test can go away, and potentially we can
  * simplify some of the subview anchoring code.
  */
 add_task(async function check_downloads_panel_in_overflow() {
   let button = document.getElementById("downloads-button");
-  gCustomizeMode.addToPanel(button);
+  await gCustomizeMode.addToPanel(button);
   await waitForOverflowButtonShown();
 
   let chevron = document.getElementById("nav-bar-overflow-button");
   let shownPanelPromise = promisePanelElementShown(window, kOverflowPanel);
   chevron.click();
   await shownPanelPromise;
 
   button.click();
new file mode 100644
--- /dev/null
+++ b/browser/components/customizableui/test/browser_widget_animation.js
@@ -0,0 +1,56 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+function promiseWidgetAnimationOut(aNode) {
+  let animationNode = aNode;
+  if (animationNode.tagName != "toolbaritem" && animationNode.tagName != "toolbarbutton") {
+    animationNode = animationNode.closest("toolbaritem");
+  }
+  if (animationNode.parentNode.id.startsWith("wrapper-")) {
+    animationNode = animationNode.parentNode;
+  }
+  return new Promise(resolve => {
+    animationNode.addEventListener("animationend", function cleanupWidgetAnimationOut(e) {
+      if (e.animationName == "widget-animate-out" && e.target.id == animationNode.id) {
+        animationNode.removeEventListener("animationend", cleanupWidgetAnimationOut);
+        ok(true, "The widget`s animationend should have happened");
+        resolve();
+      }
+    });
+  });
+}
+
+function promiseOverflowAnimationEnd() {
+  return new Promise(resolve => {
+    let overflowButton = document.getElementById("nav-bar-overflow-button");
+    overflowButton.addEventListener("animationend", function cleanupOverflowAnimationOut(event) {
+      if (event.animationName == "overflow-fade") {
+        overflowButton.removeEventListener("transitionend", cleanupOverflowAnimationOut);
+        ok(true, "The overflow button`s animationend event should have happened");
+        resolve();
+      }
+    });
+  });
+}
+
+// Right-click on the home widget, use the context menu to move it to the overflow menu.
+// The home widget should animate out, and the overflow menu should animate upon adding.
+add_task(async function() {
+  let homeButton = document.getElementById("home-button");
+  let contextMenu = document.getElementById("toolbar-context-menu");
+  let shownPromise = popupShown(contextMenu);
+  EventUtils.synthesizeMouseAtCenter(homeButton, {type: "contextmenu", button: 2 });
+  await shownPromise;
+
+  let moveToPanel = contextMenu.querySelector(".customize-context-moveToPanel");
+  if (moveToPanel) {
+    moveToPanel.click();
+  }
+
+  await Promise.all([promiseWidgetAnimationOut(homeButton), promiseOverflowAnimationEnd()]);
+  ok(true, "The widget and overflow animations should have both happened.");
+});
+
+registerCleanupFunction(CustomizableUI.reset);
--- a/browser/components/downloads/test/browser/browser_downloads_autohide.js
+++ b/browser/components/downloads/test/browser/browser_downloads_autohide.js
@@ -20,40 +20,40 @@ registerCleanupFunction(async function()
 add_task(async function checkStateDuringPrefFlips() {
   ok(Services.prefs.getBoolPref(kDownloadAutoHidePref),
      "Should be autohiding the button by default");
   ok(!DownloadsIndicatorView.hasDownloads,
      "Should be no downloads when starting the test");
   let downloadsButton = document.getElementById("downloads-button");
   ok(downloadsButton.hasAttribute("hidden"),
      "Button should be hidden in the toolbar");
-  gCustomizeMode.addToPanel(downloadsButton);
+  await gCustomizeMode.addToPanel(downloadsButton);
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button shouldn't be hidden in the panel");
   ok(!Services.prefs.getBoolPref(kDownloadAutoHidePref),
      "Pref got set to false when the user moved the button");
   gCustomizeMode.addToToolbar(downloadsButton);
   ok(!Services.prefs.getBoolPref(kDownloadAutoHidePref),
      "Pref remains false when the user moved the button");
   Services.prefs.setBoolPref(kDownloadAutoHidePref, true);
   ok(downloadsButton.hasAttribute("hidden"),
      "Button should be hidden again in the toolbar " +
      "now that we flipped the pref");
   Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button shouldn't be hidden with autohide turned off");
-  gCustomizeMode.addToPanel(downloadsButton);
+  await gCustomizeMode.addToPanel(downloadsButton);
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button shouldn't be hidden with autohide turned off " +
      "after moving it to the panel");
   gCustomizeMode.addToToolbar(downloadsButton);
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button shouldn't be hidden with autohide turned off " +
      "after moving it back to the toolbar");
-  gCustomizeMode.addToPanel(downloadsButton);
+  await gCustomizeMode.addToPanel(downloadsButton);
   Services.prefs.setBoolPref(kDownloadAutoHidePref, true);
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should still not be hidden with autohide turned back on " +
      "because it's in the panel");
   // Use CUI directly instead of the customize mode APIs,
   // to avoid tripping the "automatically turn off autohide" code.
   CustomizableUI.addWidgetToArea("downloads-button", "nav-bar");
   ok(downloadsButton.hasAttribute("hidden"),
@@ -76,31 +76,31 @@ add_task(async function checkStateInCust
   await promiseCustomizeStart();
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown in customize mode.");
   await promiseCustomizeEnd();
   ok(downloadsButton.hasAttribute("hidden"),
      "Button should be hidden if it's in the toolbar " +
      "after customize mode without any moves.");
   await promiseCustomizeStart();
-  gCustomizeMode.addToPanel(downloadsButton);
+  await gCustomizeMode.addToPanel(downloadsButton);
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown in customize mode when moved to the panel");
   gCustomizeMode.addToToolbar(downloadsButton);
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown in customize mode when moved back to the toolbar");
   gCustomizeMode.removeFromArea(downloadsButton);
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown in customize mode when in the palette");
   Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
   Services.prefs.setBoolPref(kDownloadAutoHidePref, true);
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown in customize mode " +
      "even when flipping the autohide pref");
-  gCustomizeMode.addToPanel(downloadsButton);
+  await gCustomizeMode.addToPanel(downloadsButton);
   await promiseCustomizeEnd();
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown after customize mode when moved to the panel");
   await promiseCustomizeStart();
   gCustomizeMode.addToToolbar(downloadsButton);
   await promiseCustomizeEnd();
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown in the toolbar after " +
@@ -108,17 +108,17 @@ add_task(async function checkStateInCust
   await promiseCustomizeStart();
   await gCustomizeMode.reset();
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown in the toolbar in customize mode after a reset.");
   await gCustomizeMode.undoReset();
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown in the toolbar in customize mode " +
      "when undoing the reset.");
-  gCustomizeMode.addToPanel(downloadsButton);
+  await gCustomizeMode.addToPanel(downloadsButton);
   await gCustomizeMode.reset();
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown in the toolbar in customize mode " +
      "after a reset moved it.");
   await gCustomizeMode.undoReset();
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown in the panel in customize mode " +
      "when undoing the reset.");
@@ -161,17 +161,17 @@ add_task(async function checkStateInCust
 
   Services.prefs.setBoolPref(kDownloadAutoHidePref, true);
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should be shown in customize mode " +
      "even when flipping the autohide pref");
   ok(otherDownloadsButton.hasAttribute("hidden"),
      "Button should be hidden in the other window with the pref flipped again");
 
-  gCustomizeMode.addToPanel(downloadsButton);
+  await gCustomizeMode.addToPanel(downloadsButton);
   ok(!downloadsButton.hasAttribute("hidden"),
      "Button should still be shown in customize mode.");
   ok(!otherDownloadsButton.hasAttribute("hidden"),
      "Button should be shown in the other window too because it's in a panel.");
 
   gCustomizeMode.removeFromArea(downloadsButton);
   ok(!Services.prefs.getBoolPref(kDownloadAutoHidePref),
      "Autohide pref turned off by moving the button");
--- a/browser/components/downloads/test/browser/browser_overflow_anchor.js
+++ b/browser/components/downloads/test/browser/browser_overflow_anchor.js
@@ -20,17 +20,17 @@ add_task(async function test_overflow_an
   await task_resetState();
 
   // The downloads button should not be overflowed to begin with.
   let button = CustomizableUI.getWidget("downloads-button")
                              .forWindow(window);
   ok(!button.overflowed, "Downloads button should not be overflowed.");
   is(button.node.getAttribute("cui-areatype"), "toolbar", "Button should know it's in the toolbar");
 
-  gCustomizeMode.addToPanel(button.node);
+  await gCustomizeMode.addToPanel(button.node);
 
   let promise = promisePanelOpened();
   EventUtils.sendMouseEvent({ type: "mousedown", button: 0 }, button.node);
   info("waiting for panel to open");
   await promise;
 
   let panel = DownloadsPanel.panel;
   let chevron = document.getElementById("nav-bar-overflow-button");
--- a/browser/components/extensions/test/browser/browser-common.ini
+++ b/browser/components/extensions/test/browser/browser-common.ini
@@ -9,17 +9,17 @@ support-files =
   ctxmenu-image.png
   context_tabs_onUpdated_page.html
   context_tabs_onUpdated_iframe.html
   file_clearplugindata.html
   file_find_frames.html
   file_popup_api_injection_a.html
   file_popup_api_injection_b.html
   file_iframe_document.html
-  file_iframe_document.sjs
+  file_slowed_document.sjs
   file_bypass_cache.sjs
   file_language_fr_en.html
   file_language_ja.html
   file_language_tlh.html
   file_dummy.html
   file_title.html
   file_inspectedwindow_reload_target.sjs
   file_indexedDB.html
@@ -137,17 +137,16 @@ skip-if = !e10s || debug || asan
 [browser_ext_tabs_duplicate.js]
 [browser_ext_tabs_events.js]
 [browser_ext_tabs_executeScript.js]
 [browser_ext_tabs_executeScript_good.js]
 [browser_ext_tabs_executeScript_bad.js]
 [browser_ext_tabs_executeScript_multiple.js]
 [browser_ext_tabs_executeScript_no_create.js]
 [browser_ext_tabs_executeScript_runAt.js]
-skip-if = os == "win" # Bug 1398514
 [browser_ext_tabs_getCurrent.js]
 [browser_ext_tabs_insertCSS.js]
 [browser_ext_tabs_lastAccessed.js]
 [browser_ext_tabs_lazy.js]
 [browser_ext_tabs_removeCSS.js]
 [browser_ext_tabs_move_array.js]
 [browser_ext_tabs_move_window.js]
 [browser_ext_tabs_move_window_multiple.js]
--- a/browser/components/extensions/test/browser/browser_ext_find.js
+++ b/browser/components/extensions/test/browser/browser_ext_find.js
@@ -1,11 +1,12 @@
 /* global browser */
 "use strict";
 
+/* eslint-disable mozilla/no-cpows-in-tests */
 function frameScript() {
   function getSelectedText() {
     let frame = this.content.frames[0].frames[1];
     let Ci = Components.interfaces;
     let docShell = frame.QueryInterface(Ci.nsIInterfaceRequestor)
                         .getInterface(Ci.nsIWebNavigation)
                         .QueryInterface(Ci.nsIDocShell);
     let controller = docShell.QueryInterface(Ci.nsIInterfaceRequestor)
@@ -16,16 +17,17 @@ function frameScript() {
     let r1 = frame.parent.frameElement.getBoundingClientRect();
     let r2 = frame.frameElement.getBoundingClientRect();
     let r3 = range.getBoundingClientRect();
     let rect = {top: (r1.top + r2.top + r3.top), left: (r1.left + r2.left + r3.left)};
     this.sendAsyncMessage("test:find:selectionTest", {text: selection.toString(), rect});
   }
   getSelectedText();
 }
+/* eslint-enable mozilla/no-cpows-in-tests */
 
 function waitForMessage(messageManager, topic) {
   return new Promise(resolve => {
     messageManager.addMessageListener(topic, function messageListener(message) {
       messageManager.removeMessageListener(topic, messageListener);
       resolve(message);
     });
   });
@@ -130,9 +132,8 @@ add_task(async function testDuplicatePin
 
   info("Test that text was highlighted properly.");
   is(message.data.text, "bananA", `The text that was highlighted: - Expected: bananA, Actual: ${message.data.text}`);
 
   info("Test that rectangle data returned from the search matches the highlighted result.");
   is(message.data.rect.top, top, `rect.top: - Expected: ${message.data.rect.top}, Actual: ${top}`);
   is(message.data.rect.left, left, `rect.left: - Expected: ${message.data.rect.left}, Actual: ${left}`);
 });
-
--- a/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_runAt.js
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_executeScript_runAt.js
@@ -16,17 +16,17 @@
 
 add_task(async function testExecuteScript() {
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank", true);
 
   async function background() {
     let tab;
 
     const BASE = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/";
-    const URL = BASE + "file_iframe_document.sjs";
+    const URL = BASE + "file_slowed_document.sjs";
 
     const MAX_TRIES = 10;
 
     let onUpdatedPromise = (tabId, url, status) => {
       return new Promise(resolve => {
         browser.tabs.onUpdated.addListener(function listener(_, changed, tab) {
           if (tabId == tab.id && changed.status == status && tab.url == url) {
             browser.tabs.onUpdated.removeListener(listener);
@@ -36,17 +36,17 @@ add_task(async function testExecuteScrip
       });
     };
 
     try {
       [tab] = await browser.tabs.query({active: true, currentWindow: true});
 
       let success = false;
       for (let tries = 0; !success && tries < MAX_TRIES; tries++) {
-        let url = `${URL}?r=${Math.random()}`;
+        let url = `${URL}?with-iframe&r=${Math.random()}`;
 
         let loadingPromise = onUpdatedPromise(tab.id, url, "loading");
         let completePromise = onUpdatedPromise(tab.id, url, "complete");
 
         // TODO: Test allFrames and frameId.
 
         await browser.tabs.update({url});
         await loadingPromise;
rename from browser/components/extensions/test/browser/file_iframe_document.sjs
rename to browser/components/extensions/test/browser/file_slowed_document.sjs
--- a/browser/components/extensions/test/browser/file_iframe_document.sjs
+++ b/browser/components/extensions/test/browser/file_slowed_document.sjs
@@ -2,17 +2,19 @@
 /* vim: set sts=2 sw=2 et tw=80 ft=javascript: */
 "use strict";
 
 // This script slows the load of an HTML document so that we can reliably test
 // all phases of the load cycle supported by the extension API.
 
 /* eslint-disable no-unused-vars */
 
-const DELAY = 1 * 1000; // Delay one second before completing the request.
+const URL = "file_slowed_document.sjs";
+
+const DELAY = 2 * 1000; // Delay two seconds before completing the request.
 
 const Ci = Components.interfaces;
 
 let nsTimer = Components.Constructor("@mozilla.org/timer;1", "nsITimer", "initWithCallback");
 
 let timer;
 
 function handleRequest(request, response) {
@@ -27,15 +29,15 @@ function handleRequest(request, response
       <title></title>
     </head>
     <body>
   `);
 
   // Note: We need to store a reference to the timer to prevent it from being
   // canceled when it's GCed.
   timer = new nsTimer(() => {
-    response.write(`
-        <iframe src="/"></iframe>
-      </body>
-      </html>`);
+    if (request.queryString.includes("with-iframe")) {
+      response.write(`<iframe src="${URL}?r=${Math.random()}"></iframe>`);
+    }
+    response.write(`</body></html>`);
     response.finish();
   }, DELAY, Ci.nsITimer.TYPE_ONE_SHOT);
 }
--- a/browser/components/extensions/test/xpcshell/test_ext_pkcs11_management.js
+++ b/browser/components/extensions/test/xpcshell/test_ext_pkcs11_management.js
@@ -91,17 +91,17 @@ async function setupManifests(modules) {
 }
 
 add_task(async function test_pkcs11() {
   async function background() {
     try {
       let isInstalled = await browser.pkcs11.isModuleInstalled("testmodule");
       browser.test.assertFalse(isInstalled, "PKCS#11 module is not installed before we install it");
       await browser.pkcs11.installModule("testmodule", 0);
-      isInstalled = browser.pkcs11.isModuleInstalled("testmodule");
+      isInstalled = await browser.pkcs11.isModuleInstalled("testmodule");
       browser.test.assertTrue(isInstalled, "PKCS#11 module is installed after we install it");
       let slots = await browser.pkcs11.getModuleSlots("testmodule");
       browser.test.assertEq("Test PKCS11 Slot", slots[0].name, "The first slot name matches the expected name");
       browser.test.assertEq("Test PKCS11 Slot 二", slots[1].name, "The second slot name matches the expected name");
       browser.test.assertTrue(slots[1].token, "The second slot has a token");
       browser.test.assertEq("Test PKCS11 Tokeñ 2 Label", slots[1].token.name, "The token name matches the expected name");
       browser.test.assertEq("Test PKCS11 Manufacturer ID", slots[1].token.manufacturer, "The token manufacturer matches the expected manufacturer");
       browser.test.assertEq("0.0", slots[1].token.HWVersion, "The token hardware version matches the expected version");
--- a/browser/components/newtab/aboutNewTabService.js
+++ b/browser/components/newtab/aboutNewTabService.js
@@ -5,38 +5,55 @@
 */
 
 "use strict";
 
 const {utils: Cu, interfaces: Ci} = Components;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/AppConstants.jsm");
+
 XPCOMUtils.defineLazyModuleGetter(this, "AboutNewTab",
                                   "resource:///modules/AboutNewTab.jsm");
 
 const LOCAL_NEWTAB_URL = "chrome://browser/content/newtab/newTab.xhtml";
 
-const ACTIVITY_STREAM_URL = "resource://activity-stream/data/content/activity-stream.html";
-
-const ACTIVITY_STREAM_PRERENDER_URL = "resource://activity-stream/data/content/activity-stream-prerendered.html";
+// Debug versions are only available in Nightly
+const ACTIVITY_STREAM_URLS = {
+  "": "resource://activity-stream/data/content/activity-stream.html",
+  "debug": "resource://activity-stream/data/content/activity-stream-debug.html",
+  "prerender": "resource://activity-stream/data/content/activity-stream-prerendered.html",
+  "prerenderdebug": "resource://activity-stream/data/content/activity-stream-prerendered-debug.html",
+};
 
 const ABOUT_URL = "about:newtab";
 
 const IS_MAIN_PROCESS = Services.appinfo.processType === Services.appinfo.PROCESS_TYPE_DEFAULT;
 
+const IS_RELEASE_OR_BETA = AppConstants.RELEASE_OR_BETA;
+
 // Pref that tells if activity stream is enabled
 const PREF_ACTIVITY_STREAM_ENABLED = "browser.newtabpage.activity-stream.enabled";
 const PREF_ACTIVITY_STREAM_PRERENDER_ENABLED = "browser.newtabpage.activity-stream.prerender";
+const PREF_ACTIVITY_STREAM_DEBUG = "browser.newtabpage.activity-stream.debug";
+
 
 function AboutNewTabService() {
   Services.obs.addObserver(this, "quit-application-granted");
   Services.prefs.addObserver(PREF_ACTIVITY_STREAM_ENABLED, this);
   Services.prefs.addObserver(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED, this);
+  if (!IS_RELEASE_OR_BETA) {
+    Services.prefs.addObserver(PREF_ACTIVITY_STREAM_DEBUG, this);
+  }
+
+  // More initialization happens here
   this.toggleActivityStream();
+  this.initialized = true;
+
   if (IS_MAIN_PROCESS) {
     AboutNewTab.init();
   }
 }
 
 /*
  * A service that allows for the overriding, at runtime, of the newtab page's url.
  * Additionally, the service manages pref state between a activity stream, or the regular
@@ -71,16 +88,17 @@ function AboutNewTabService() {
  * LOAD_NORMAL or LOAD_REPLACE flags yield unexpected behaviors, so a roundtrip
  * to the redirector from browser chrome is avoided.
  */
 AboutNewTabService.prototype = {
 
   _newTabURL: ABOUT_URL,
   _activityStreamEnabled: false,
   _activityStreamPrerender: false,
+  _activityStreamDebug: false,
   _overridden: false,
 
   classID: Components.ID("{dfcd2adc-7867-4d3a-ba70-17501f208142}"),
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsIAboutNewTabService,
     Ci.nsIObserver
   ]),
   _xpcom_categories: [{
@@ -92,22 +110,23 @@ AboutNewTabService.prototype = {
       case "nsPref:changed":
         if (data === PREF_ACTIVITY_STREAM_ENABLED) {
           if (this.toggleActivityStream()) {
             Services.obs.notifyObservers(null, "newtab-url-changed", ABOUT_URL);
           }
         } else if (data === PREF_ACTIVITY_STREAM_PRERENDER_ENABLED) {
           this._activityStreamPrerender = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED);
           Services.obs.notifyObservers(null, "newtab-url-changed", ABOUT_URL);
+        } else if (!IS_RELEASE_OR_BETA && data === PREF_ACTIVITY_STREAM_DEBUG) {
+          this._activityStreamDebug = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_DEBUG, false);
+          Services.obs.notifyObservers(null, "newtab-url-changed", ABOUT_URL);
         }
         break;
       case "quit-application-granted":
-        Services.obs.removeObserver(this, "quit-application-granted");
-        Services.prefs.removeObserver(PREF_ACTIVITY_STREAM_ENABLED, this);
-        Services.prefs.removeObserver(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED, this);
+        this.uninit();
         if (IS_MAIN_PROCESS) {
           AboutNewTab.uninit();
         }
         break;
     }
   },
 
   /**
@@ -132,31 +151,36 @@ AboutNewTabService.prototype = {
       return false;
     }
     if (stateEnabled) {
       this._activityStreamEnabled = true;
     } else {
       this._activityStreamEnabled = false;
     }
     this._activityStreamPrerender = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED);
+    if (!IS_RELEASE_OR_BETA) {
+      this._activityStreamDebug = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_DEBUG, false);
+    }
     this._newtabURL = ABOUT_URL;
     return true;
   },
 
   /*
    * Returns the default URL.
    *
    * This URL only depends on the browser.newtabpage.activity-stream.enabled pref. Overriding
    * the newtab page has no effect on the result of this function.
    *
    * @returns {String} the default newtab URL, activity-stream or regular depending on browser.newtabpage.activity-stream.enabled
    */
   get defaultURL() {
     if (this.activityStreamEnabled) {
-      return this.activityStreamPrerender ? this.activityStreamPrerenderURL : this.activityStreamURL;
+      const prerender = this.activityStreamPrerender ? "prerender" : "";
+      const debug = this.activityStreamDebug ? "debug" : "";
+      return ACTIVITY_STREAM_URLS[prerender + debug];
     }
     return LOCAL_NEWTAB_URL;
   },
 
   get newTabURL() {
     return this._newTabURL;
   },
 
@@ -183,25 +207,34 @@ AboutNewTabService.prototype = {
   get activityStreamEnabled() {
     return this._activityStreamEnabled;
   },
 
   get activityStreamPrerender() {
     return this._activityStreamPrerender;
   },
 
-  get activityStreamURL() {
-    return ACTIVITY_STREAM_URL;
-  },
-
-  get activityStreamPrerenderURL() {
-    return ACTIVITY_STREAM_PRERENDER_URL;
+  get activityStreamDebug() {
+    return this._activityStreamDebug;
   },
 
   resetNewTabURL() {
     this._overridden = false;
     this._newTabURL = ABOUT_URL;
     this.toggleActivityStream(undefined, true);
     Services.obs.notifyObservers(null, "newtab-url-changed", this._newTabURL);
+  },
+
+  uninit() {
+    if (!this.initialized) {
+      return;
+    }
+    Services.obs.removeObserver(this, "quit-application-granted");
+    Services.prefs.removeObserver(PREF_ACTIVITY_STREAM_ENABLED, this);
+    Services.prefs.removeObserver(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED, this);
+    if (!IS_RELEASE_OR_BETA) {
+      Services.prefs.removeObserver(PREF_ACTIVITY_STREAM_DEBUG, this);
+    }
+    this.initialized = false;
   }
 };
 
 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([AboutNewTabService]);
--- a/browser/components/newtab/nsIAboutNewTabService.idl
+++ b/browser/components/newtab/nsIAboutNewTabService.idl
@@ -35,23 +35,18 @@ interface nsIAboutNewTabService : nsISup
   readonly attribute bool activityStreamEnabled;
 
   /**
    * Returns true if the the prerendering pref for activity stream is true
    */
   readonly attribute bool activityStreamPrerender;
 
   /**
-   * Returns the activity stream resource URL for the newtab page
+   * Returns true if the the debug pref for activity stream is true
    */
-  readonly attribute ACString activityStreamURL;
-
-  /**
-   * Returns the prerendered activity stream resource URL for the newtab page
-   */
-  readonly attribute ACString activityStreamPrerenderURL;
+  readonly attribute bool activityStreamDebug;
 
   /**
    * Resets to the default resource and also resets the
    * overridden attribute to false.
    */
   void resetNewTabURL();
 };
--- a/browser/components/newtab/tests/xpcshell/test_AboutNewTabService.js
+++ b/browser/components/newtab/tests/xpcshell/test_AboutNewTabService.js
@@ -7,37 +7,43 @@
 const {utils: Cu} = Components;
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Preferences.jsm");
 XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService",
                                    "@mozilla.org/browser/aboutnewtab-service;1",
                                    "nsIAboutNewTabService");
 
-const ACTIVITY_STREAM_PRERENDER_URL = aboutNewTabService.activityStreamPrerenderURL;
+const ACTIVITY_STREAM_PRERENDER_URL = "resource://activity-stream/data/content/activity-stream-prerendered.html";
+const ACTIVITY_STREAM_PRERENDER_DEBUG_URL = "resource://activity-stream/data/content/activity-stream-prerendered-debug.html";
+const ACTIVITY_STREAM_URL = "resource://activity-stream/data/content/activity-stream.html";
+const ACTIVITY_STREAM_DEBUG_URL = "resource://activity-stream/data/content/activity-stream-debug.html";
 
 const DEFAULT_CHROME_URL = "chrome://browser/content/newtab/newTab.xhtml";
 const DOWNLOADS_URL = "chrome://browser/content/downloads/contentAreaDownloadsView.xul";
 const ACTIVITY_STREAM_PREF = "browser.newtabpage.activity-stream.enabled";
 const ACTIVITY_STREAM_PRERENDER_PREF = "browser.newtabpage.activity-stream.prerender";
+const ACTIVITY_STREAM_DEBUG_PREF = "browser.newtabpage.activity-stream.debug";
 
 function cleanup() {
   Services.prefs.clearUserPref(ACTIVITY_STREAM_PREF);
   Services.prefs.clearUserPref(ACTIVITY_STREAM_PRERENDER_PREF);
+  Services.prefs.clearUserPref(ACTIVITY_STREAM_DEBUG_PREF);
   aboutNewTabService.resetNewTabURL();
 }
 
 do_register_cleanup(cleanup);
 
 add_task(async function test_as_and_prerender_initialized() {
   Assert.equal(aboutNewTabService.activityStreamEnabled, Services.prefs.getBoolPref(ACTIVITY_STREAM_PREF),
     ".activityStreamEnabled should be set to the correct initial value");
   Assert.equal(aboutNewTabService.activityStreamPrerender, Services.prefs.getBoolPref(ACTIVITY_STREAM_PRERENDER_PREF),
     ".activityStreamPrerender should be set to the correct initial value");
-  Services.prefs.getBoolPref(ACTIVITY_STREAM_PREF);
+  Assert.equal(aboutNewTabService.activityStreamDebug, Services.prefs.getBoolPref(ACTIVITY_STREAM_DEBUG_PREF),
+    ".activityStreamDebug should be set to the correct initial value");
 });
 
 /**
  * Test the overriding of the default URL
  */
 add_task(async function test_override_activity_stream_disabled() {
   let notificationPromise;
   Services.prefs.setBoolPref(ACTIVITY_STREAM_PREF, false);
@@ -92,27 +98,35 @@ add_task(async function test_override_ac
   Assert.ok(!aboutNewTabService.activityStreamEnabled, "Activity Stream should not be enabled");
 
   cleanup();
 });
 
 add_task(async function test_default_url() {
   await setupASPrerendered();
   Assert.equal(aboutNewTabService.defaultURL, ACTIVITY_STREAM_PRERENDER_URL,
-               "Newtab defaultURL initially set to prerendered AS url");
+    "Newtab defaultURL initially set to prerendered AS url");
+
+  await setBoolPrefAndWaitForChange(ACTIVITY_STREAM_DEBUG_PREF, true,
+    "A notification occurs after changing the debug pref to true");
+
+  Assert.equal(aboutNewTabService.defaultURL, ACTIVITY_STREAM_PRERENDER_DEBUG_URL,
+    "Newtab defaultURL set to debug prerendered AS url after the pref has been changed");
 
-  // Change activity-stream.prerendered to false and wait for the required event to fire
-  const notificationPromise = nextChangeNotificationPromise(
-    "about:newtab", "a notification occurs after changing prerender pref");
-  Services.prefs.setBoolPref(ACTIVITY_STREAM_PRERENDER_PREF, false);
+  await setBoolPrefAndWaitForChange(ACTIVITY_STREAM_PRERENDER_PREF, false,
+    "A notification occurs after changing the prerender pref to false");
+
+  Assert.equal(aboutNewTabService.defaultURL, ACTIVITY_STREAM_DEBUG_URL,
+    "Newtab defaultURL set to un-prerendered AS with debug if prerender is false and debug is true");
 
-  await notificationPromise;
+  await setBoolPrefAndWaitForChange(ACTIVITY_STREAM_DEBUG_PREF, false,
+    "A notification occurs after changing the debug pref to false");
 
-  Assert.equal(aboutNewTabService.defaultURL, aboutNewTabService.activityStreamURL,
-               "Newtab defaultURL set to un-prerendered AS url after the pref has been changed");
+  Assert.equal(aboutNewTabService.defaultURL, ACTIVITY_STREAM_URL,
+    "Newtab defaultURL set to un-prerendered AS if prerender is false and debug is false");
 
   cleanup();
 });
 
 /**
  * Tests reponse to updates to prefs
  */
 add_task(async function test_updates() {
@@ -154,16 +168,29 @@ function nextChangeNotificationPromise(a
     Services.obs.addObserver(function observer(aSubject, aTopic, aData) {  // jshint unused:false
       Services.obs.removeObserver(observer, aTopic);
       Assert.equal(aData, aNewURL, testMessage);
       resolve();
     }, "newtab-url-changed");
   });
 }
 
+function setBoolPrefAndWaitForChange(pref, value, testMessage) {
+  return new Promise(resolve => {
+    Services.obs.addObserver(function observer(aSubject, aTopic, aData) {  // jshint unused:false
+      Services.obs.removeObserver(observer, aTopic);
+      Assert.equal(aData, aboutNewTabService.newTabURL, testMessage);
+      resolve();
+    }, "newtab-url-changed");
+
+    Services.prefs.setBoolPref(pref, value);
+  });
+}
+
+
 function setupASPrerendered() {
   if (Services.prefs.getBoolPref(ACTIVITY_STREAM_PREF) &&
     Services.prefs.getBoolPref(ACTIVITY_STREAM_PRERENDER_PREF)) {
     return Promise.resolve();
   }
 
   let notificationPromise;
   // change newtab page to activity stream
--- a/browser/components/places/PlacesUIUtils.jsm
+++ b/browser/components/places/PlacesUIUtils.jsm
@@ -1,44 +1,37 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* 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/. */
 
 this.EXPORTED_SYMBOLS = ["PlacesUIUtils"];
 
-var Ci = Components.interfaces;
-var Cc = Components.classes;
-var Cr = Components.results;
-var Cu = Components.utils;
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/Timer.jsm");
 
-Cu.import("resource://gre/modules/PlacesUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "PluralForm",
-                                  "resource://gre/modules/PluralForm.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
-                                  "resource://gre/modules/PrivateBrowsingUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
-                                  "resource://gre/modules/NetUtil.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow",
-                                  "resource:///modules/RecentWindow.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "PromiseUtils",
-                                  "resource://gre/modules/PromiseUtils.jsm");
-
-// PlacesUtils exposes multiple symbols, so we can't use defineLazyModuleGetter.
+// PlacesUtils exposes multiple symbols, so we can't use defineLazyModuleGetter
+// until we remove legacy transactions (Bug 1131491).
 Cu.import("resource://gre/modules/PlacesUtils.jsm");
 
-XPCOMUtils.defineLazyModuleGetter(this, "PlacesTransactions",
-                                  "resource://gre/modules/PlacesTransactions.jsm");
+XPCOMUtils.defineLazyModuleGetters(this, {
+  PluralForm: "resource://gre/modules/PluralForm.jsm",
+  PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.jsm",
+  RecentWindow: "resource:///modules/RecentWindow.jsm",
+  PromiseUtils: "resource://gre/modules/PromiseUtils.jsm",
+  PlacesTransactions: "resource://gre/modules/PlacesTransactions.jsm",
+  Weave: "resource://services-sync/main.js",
+});
 
-XPCOMUtils.defineLazyModuleGetter(this, "Weave",
-                                  "resource://services-sync/main.js");
+XPCOMUtils.defineLazyGetter(this, "bundle", function() {
+  return Services.strings.createBundle("chrome://browser/locale/places/places.properties");
+});
 
 const gInContentProcess = Services.appinfo.processType == Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT;
 const FAVICON_REQUEST_TIMEOUT = 60 * 1000;
 // Map from windows to arrays of data about pending favicon loads.
 let gFaviconLoadDataMap = new Map();
 
 const ITEM_CHANGED_BATCH_NOTIFICATION_THRESHOLD = 10;
 
@@ -57,18 +50,16 @@ function IsLivemark(aItemId) {
     const LIVEMARK_ANNO = PlacesUtils.LMANNO_FEEDURI;
 
     let idsVec = PlacesUtils.annotations.getItemsWithAnnotation(LIVEMARK_ANNO);
     self.ids = new Set(idsVec);
 
     let obs = Object.freeze({
       QueryInterface: XPCOMUtils.generateQI([Ci.nsINavBookmarksObserver]),
 
-      // Ci.nsINavBookmarkObserver items.
-
       onItemChanged(itemId, property, isAnnoProperty, newValue, lastModified,
                     itemType, parentId, guid) {
         if (isAnnoProperty && property == LIVEMARK_ANNO) {
           self.ids.add(itemId);
         }
       },
 
       onItemRemoved(itemId) {
@@ -80,17 +71,17 @@ function IsLivemark(aItemId) {
       onItemAdded() {},
       onBeginUpdateBatch() {},
       onEndUpdateBatch() {},
       onItemVisited() {},
       onItemMoved() {},
       onPageAnnotationSet() { },
       onPageAnnotationRemoved() { },
       skipDescendantsOnItemRemoval: false,
-      skipTags: false,
+      skipTags: true,
     });
 
     PlacesUtils.bookmarks.addObserver(obs);
     PlacesUtils.registerShutdownFunction(() => {
       PlacesUtils.bookmarks.removeObserver(obs);
     });
   }
   return self.ids.has(aItemId);
@@ -275,17 +266,17 @@ this.PlacesUIUtils = {
 
   /**
    * Makes a URI from a spec, and do fixup
    * @param   aSpec
    *          The string spec of the URI
    * @return A URI object for the spec.
    */
   createFixedURI: function PUIU_createFixedURI(aSpec) {
-    return URIFixup.createFixupURI(aSpec, Ci.nsIURIFixup.FIXUP_FLAG_NONE);
+    return Services.uriFixup.createFixupURI(aSpec, Ci.nsIURIFixup.FIXUP_FLAG_NONE);
   },
 
   getFormattedString: function PUIU_getFormattedString(key, params) {
     return bundle.formatStringFromName(key, params, params.length);
   },
 
   /**
    * Get a localized plural string for the specified key name and numeric value
@@ -431,17 +422,17 @@ this.PlacesUIUtils = {
     if (aContainer == PlacesUtils.tagsFolderId) { // Copying into a tag folder.
       let transactions = [];
       if (!aData.livemark && aData.type == PlacesUtils.TYPE_X_MOZ_PLACE_CONTAINER) {
         let {root} = PlacesUtils.getFolderContents(aData.id, false, false);
         let urls = PlacesUtils.getURLsForContainerNode(root);
         root.containerOpen = false;
         for (let { uri } of urls) {
           transactions.push(
-            new PlacesTagURITransaction(NetUtil.newURI(uri), [aData.title])
+            new PlacesTagURITransaction(Services.io.newURI(uri), [aData.title])
           );
         }
       }
       return new PlacesAggregatedTransaction("addTags", transactions);
     }
 
     if (aData.livemark && aData.annos) { // Copying a livemark.
       return this._getLivemarkCopyTransaction(aData, aContainer, aIndex);
@@ -673,20 +664,16 @@ this.PlacesUIUtils = {
           topUndoEntry != PlacesTransactions.topUndoEntry) {
         PlacesTransactions.undo().catch(Components.utils.reportError);
       }
     }
 
     return performed;
   },
 
-  _getTopBrowserWin: function PUIU__getTopBrowserWin() {
-    return RecentWindow.getMostRecentBrowserWindow();
-  },
-
   /**
    * set and fetch a favicon. Can only be used from the parent process.
    * @param browser   {Browser}   The XUL browser element for which we're fetching a favicon.
    * @param principal {Principal} The loading principal to use for the fetch.
    * @param uri       {URI}       The URI to fetch.
    */
   loadFavicon(browser, principal, uri, requestContextID) {
     if (gInContentProcess) {
@@ -956,17 +943,17 @@ this.PlacesUIUtils = {
     if (!aItemsToOpen.length)
       return;
 
     // Prefer the caller window if it's a browser window, otherwise use
     // the top browser window.
     var browserWindow = null;
     browserWindow =
       aWindow && aWindow.document.documentElement.getAttribute("windowtype") == "navigator:browser" ?
-      aWindow : this._getTopBrowserWin();
+      aWindow : RecentWindow.getMostRecentBrowserWindow();
 
     var urls = [];
     let skipMarking = browserWindow && PrivateBrowsingUtils.isWindowPrivate(browserWindow);
     for (let item of aItemsToOpen) {
       urls.push(item.uri);
       if (skipMarking) {
         continue;
       }
@@ -1090,17 +1077,17 @@ this.PlacesUIUtils = {
           this.markPageAsTyped(aNode.uri);
       }
 
       // Check whether the node is a bookmark which should be opened as
       // a web panel
       if (aWhere == "current" && isBookmark) {
         if (PlacesUtils.annotations
                        .itemHasAnnotation(aNode.itemId, this.LOAD_IN_SIDEBAR_ANNO)) {
-          let browserWin = this._getTopBrowserWin();
+          let browserWin = RecentWindow.getMostRecentBrowserWindow();
           if (browserWin) {
             browserWin.openWebPanel(aNode.title, aNode.uri);
             return;
           }
         }
       }
 
       aWindow.openUILinkIn(aNode.uri, aWhere, {
@@ -1585,208 +1572,21 @@ PlacesUIUtils.PLACES_FLAVORS = [PlacesUt
 
 PlacesUIUtils.URI_FLAVORS = [PlacesUtils.TYPE_X_MOZ_URL,
                              TAB_DROP_TYPE,
                              PlacesUtils.TYPE_UNICODE],
 
 PlacesUIUtils.SUPPORTED_FLAVORS = [...PlacesUIUtils.PLACES_FLAVORS,
                                    ...PlacesUIUtils.URI_FLAVORS];
 
-XPCOMUtils.defineLazyServiceGetter(PlacesUIUtils, "RDF",
-                                   "@mozilla.org/rdf/rdf-service;1",
-                                   "nsIRDFService");
-
 XPCOMUtils.defineLazyGetter(PlacesUIUtils, "ellipsis", function() {
   return Services.prefs.getComplexValue("intl.ellipsis",
                                         Ci.nsIPrefLocalizedString).data;
 });
 
-XPCOMUtils.defineLazyGetter(PlacesUIUtils, "useAsyncTransactions", function() {
-  try {
-    return Services.prefs.getBoolPref("browser.places.useAsyncTransactions");
-  } catch (ex) { }
-  return false;
-});
-
+XPCOMUtils.defineLazyPreferenceGetter(PlacesUIUtils, "useAsyncTransactions",
+                                      "browser.places.useAsyncTransactions", false);
 XPCOMUtils.defineLazyPreferenceGetter(PlacesUIUtils, "loadBookmarksInBackground",
                                       PREF_LOAD_BOOKMARKS_IN_BACKGROUND, false);
 XPCOMUtils.defineLazyPreferenceGetter(PlacesUIUtils, "loadBookmarksInTabs",
                                       PREF_LOAD_BOOKMARKS_IN_TABS, false);
 XPCOMUtils.defineLazyPreferenceGetter(PlacesUIUtils, "openInTabClosesMenu",
   "browser.bookmarks.openInTabClosesMenu", false);
-
-XPCOMUtils.defineLazyServiceGetter(this, "URIFixup",
-                                   "@mozilla.org/docshell/urifixup;1",
-                                   "nsIURIFixup");
-
-XPCOMUtils.defineLazyGetter(this, "bundle", function() {
-  const PLACES_STRING_BUNDLE_URI =
-    "chrome://browser/locale/places/places.properties";
-  return Cc["@mozilla.org/intl/stringbundle;1"].
-         getService(Ci.nsIStringBundleService).
-         createBundle(PLACES_STRING_BUNDLE_URI);
-});
-
-/**
- * This is a compatibility shim for old PUIU.ptm users.
- *
- * If you're looking for transactions and writing new code using them, directly
- * use the transactions objects exported by the PlacesUtils.jsm module.
- *
- * This object will be removed once enough users are converted to the new API.
- */
-XPCOMUtils.defineLazyGetter(PlacesUIUtils, "ptm", function() {
-  // Ensure PlacesUtils is imported in scope.
-  PlacesUtils;
-
-  return {
-    aggregateTransactions: (aName, aTransactions) =>
-      new PlacesAggregatedTransaction(aName, aTransactions),
-
-    createFolder: (aName, aContainer, aIndex, aAnnotations,
-                   aChildItemsTransactions) =>
-      new PlacesCreateFolderTransaction(aName, aContainer, aIndex, aAnnotations,
-                                        aChildItemsTransactions),
-
-    createItem: (aURI, aContainer, aIndex, aTitle, aKeyword,
-                 aAnnotations, aChildTransactions) =>
-      new PlacesCreateBookmarkTransaction(aURI, aContainer, aIndex, aTitle,
-                                          aKeyword, aAnnotations,
-                                          aChildTransactions),
-
-    createSeparator: (aContainer, aIndex) =>
-      new PlacesCreateSeparatorTransaction(aContainer, aIndex),
-
-    createLivemark: (aFeedURI, aSiteURI, aName, aContainer, aIndex,
-                     aAnnotations) =>
-      new PlacesCreateLivemarkTransaction(aFeedURI, aSiteURI, aName, aContainer,
-                                          aIndex, aAnnotations),
-
-    moveItem: (aItemId, aNewContainer, aNewIndex) =>
-      new PlacesMoveItemTransaction(aItemId, aNewContainer, aNewIndex),
-
-    removeItem: (aItemId) =>
-      new PlacesRemoveItemTransaction(aItemId),
-
-    editItemTitle: (aItemId, aNewTitle) =>
-      new PlacesEditItemTitleTransaction(aItemId, aNewTitle),
-
-    editBookmarkURI: (aItemId, aNewURI) =>
-      new PlacesEditBookmarkURITransaction(aItemId, aNewURI),
-
-    setItemAnnotation: (aItemId, aAnnotationObject) =>
-      new PlacesSetItemAnnotationTransaction(aItemId, aAnnotationObject),
-
-    setPageAnnotation: (aURI, aAnnotationObject) =>
-      new PlacesSetPageAnnotationTransaction(aURI, aAnnotationObject),
-
-    editBookmarkKeyword: (aItemId, aNewKeyword) =>
-      new PlacesEditBookmarkKeywordTransaction(aItemId, aNewKeyword),
-
-    editLivemarkSiteURI: (aLivemarkId, aSiteURI) =>
-      new PlacesEditLivemarkSiteURITransaction(aLivemarkId, aSiteURI),
-
-    editLivemarkFeedURI: (aLivemarkId, aFeedURI) =>
-      new PlacesEditLivemarkFeedURITransaction(aLivemarkId, aFeedURI),
-
-    editItemDateAdded: (aItemId, aNewDateAdded) =>
-      new PlacesEditItemDateAddedTransaction(aItemId, aNewDateAdded),
-
-    editItemLastModified: (aItemId, aNewLastModified) =>
-      new PlacesEditItemLastModifiedTransaction(aItemId, aNewLastModified),
-
-    sortFolderByName: (aFolderId) =>
-      new PlacesSortFolderByNameTransaction(aFolderId),
-
-    tagURI: (aURI, aTags) =>
-      new PlacesTagURITransaction(aURI, aTags),
-
-    untagURI: (aURI, aTags) =>
-      new PlacesUntagURITransaction(aURI, aTags),
-
-    /**
-     * Transaction for setting/unsetting Load-in-sidebar annotation.
-     *
-     * @param aBookmarkId
-     *        id of the bookmark where to set Load-in-sidebar annotation.
-     * @param aLoadInSidebar
-     *        boolean value.
-     * @return nsITransaction object.
-     */
-    setLoadInSidebar(aItemId, aLoadInSidebar) {
-      let annoObj = { name: PlacesUIUtils.LOAD_IN_SIDEBAR_ANNO,
-                      type: Ci.nsIAnnotationService.TYPE_INT32,
-                      flags: 0,
-                      value: aLoadInSidebar,
-                      expires: Ci.nsIAnnotationService.EXPIRE_NEVER };
-      return new PlacesSetItemAnnotationTransaction(aItemId, annoObj);
-    },
-
-   /**
-    * Transaction for editing the description of a bookmark or a folder.
-    *
-    * @param aItemId
-    *        id of the item to edit.
-    * @param aDescription
-    *        new description.
-    * @return nsITransaction object.
-    */
-    editItemDescription(aItemId, aDescription) {
-      let annoObj = { name: PlacesUIUtils.DESCRIPTION_ANNO,
-                      type: Ci.nsIAnnotationService.TYPE_STRING,
-                      flags: 0,
-                      value: aDescription,
-                      expires: Ci.nsIAnnotationService.EXPIRE_NEVER };
-      return new PlacesSetItemAnnotationTransaction(aItemId, annoObj);
-    },
-
-    // nsITransactionManager forwarders.
-
-    beginBatch: () =>
-      PlacesUtils.transactionManager.beginBatch(null),
-
-    endBatch: () =>
-      PlacesUtils.transactionManager.endBatch(false),
-
-    doTransaction: (txn) =>
-      PlacesUtils.transactionManager.doTransaction(txn),
-
-    undoTransaction: () =>
-      PlacesUtils.transactionManager.undoTransaction(),
-
-    redoTransaction: () =>
-      PlacesUtils.transactionManager.redoTransaction(),
-
-    get numberOfUndoItems() {
-      return PlacesUtils.transactionManager.numberOfUndoItems;
-    },
-    get numberOfRedoItems() {
-      return PlacesUtils.transactionManager.numberOfRedoItems;
-    },
-    get maxTransactionCount() {
-      return PlacesUtils.transactionManager.maxTransactionCount;
-    },
-    set maxTransactionCount(val) {
-      PlacesUtils.transactionManager.maxTransactionCount = val;
-    },
-
-    clear: () =>
-      PlacesUtils.transactionManager.clear(),
-
-    peekUndoStack: () =>
-      PlacesUtils.transactionManager.peekUndoStack(),
-
-    peekRedoStack: () =>
-      PlacesUtils.transactionManager.peekRedoStack(),
-
-    getUndoStack: () =>
-      PlacesUtils.transactionManager.getUndoStack(),
-
-    getRedoStack: () =>
-      PlacesUtils.transactionManager.getRedoStack(),
-
-    AddListener: (aListener) =>
-      PlacesUtils.transactionManager.AddListener(aListener),
-
-    RemoveListener: (aListener) =>
-      PlacesUtils.transactionManager.RemoveListener(aListener)
-  }
-});
--- a/browser/components/places/content/controller.js
+++ b/browser/components/places/content/controller.js
@@ -1005,29 +1005,29 @@ PlacesController.prototype = {
    * @param   [in] aContainerNode
    *          The container node to remove.
    *
    * @note history deletes are not undoable.
    */
   _removeHistoryContainer: function PC__removeHistoryContainer(aContainerNode) {
     if (PlacesUtils.nodeIsHost(aContainerNode)) {
       // Site container.
-      PlacesUtils.bhistory.removePagesFromHost(aContainerNode.title, true);
+      PlacesUtils.history.removePagesFromHost(aContainerNode.title, true);
     } else if (PlacesUtils.nodeIsDay(aContainerNode)) {
       // Day container.
       let query = aContainerNode.getQueries()[0];
       let beginTime = query.beginTime;
       let endTime = query.endTime;
       NS_ASSERT(query && beginTime && endTime,
                 "A valid date container query should exist!");
       // We want to exclude beginTime from the removal because
       // removePagesByTimeframe includes both extremes, while date containers
       // exclude the lower extreme.  So, if we would not exclude it, we would
       // end up removing more history than requested.
-      PlacesUtils.bhistory.removePagesByTimeframe(beginTime + 1, endTime);
+      PlacesUtils.history.removePagesByTimeframe(beginTime + 1, endTime);
     }
   },
 
   /**
    * Removes the selection
    * @param   aTxnName
    *          A name for the transaction if this is being performed
    *          as part of another operation.
--- a/browser/components/places/content/editBookmarkOverlay.js
+++ b/browser/components/places/content/editBookmarkOverlay.js
@@ -16,18 +16,17 @@ var gEditItemOverlay = {
     if (!aInitInfo)
       return this._paneInfo = null;
 
     if ("uris" in aInitInfo && "node" in aInitInfo)
       throw new Error("ambiguous pane info");
     if (!("uris" in aInitInfo) && !("node" in aInitInfo))
       throw new Error("Neither node nor uris set for pane info");
 
-    // Once we stop supporting legacy add-ons the code should throw if a node is
-    // not passed.
+    // We either pass a node or uris.
     let node = "node" in aInitInfo ? aInitInfo.node : null;
 
     // Since there's no true UI for folder shortcuts (they show up just as their target
     // folders), when the pane shows for them it's opened in read-only mode, showing the
     // properties of the target folder.
     let itemId = node ? node.itemId : -1;
     let itemGuid = node ? PlacesUtils.getConcreteItemGuid(node) : null;
     let isItem = itemId != -1;
--- a/browser/components/preferences/in-content/preferences.js
+++ b/browser/components/preferences/in-content/preferences.js
@@ -72,61 +72,26 @@ function init_all() {
   });
   categories.addEventListener("mousedown", function() {
     this.removeAttribute("keyboard-navigation");
   });
 
   window.addEventListener("hashchange", onHashChange);
   gotoPref();
 
-  init_dynamic_padding();
-
-  let helpButton = document.querySelector(".help-button");
+  let helpButton = document.querySelector(".help-button > .text-link");
   let helpUrl = Services.urlFormatter.formatURLPref("app.support.baseURL") + "preferences";
   helpButton.setAttribute("href", helpUrl);
 
   document.dispatchEvent(new CustomEvent("Initialized", {
     "bubbles": true,
     "cancelable": true
   }));
 }
 
-// Make the space above the categories list shrink on low window heights
-function init_dynamic_padding() {
-  let categories = document.getElementById("categories");
-  let catPadding = Number.parseInt(getComputedStyle(categories)
-                                     .getPropertyValue("padding-top"));
-  let helpButton = document.querySelector(".help-button");
-  let helpButtonCS = getComputedStyle(helpButton);
-  let helpHeight = Number.parseInt(helpButtonCS.height);
-  let helpBottom = Number.parseInt(helpButtonCS.bottom);
-  // Reduce the padding to account for less space, but due
-  // to bug 1357841, the status panel will overlap the link.
-  const reducedHelpButtonBottomFactor = .75;
-  let reducedHelpButtonBottom = helpBottom * reducedHelpButtonBottomFactor;
-  let fullHelpHeight = helpHeight + reducedHelpButtonBottom;
-  let fullHeight = categories.lastElementChild.getBoundingClientRect().bottom +
-                   fullHelpHeight;
-  let mediaRule = `
-  @media (max-height: ${fullHeight}px) {
-    #categories {
-      padding-top: calc(100vh - ${fullHeight - catPadding}px);
-      padding-bottom: ${fullHelpHeight}px;
-    }
-    .help-button {
-      bottom: ${reducedHelpButtonBottom / 2}px;
-    }
-  }
-  `;
-  let mediaStyle = document.createElementNS("http://www.w3.org/1999/xhtml", "html:style");
-  mediaStyle.setAttribute("type", "text/css");
-  mediaStyle.appendChild(document.createCDATASection(mediaRule));
-  document.documentElement.appendChild(mediaStyle);
-}
-
 function telemetryBucketForCategory(category) {
   category = category.toLowerCase();
   switch (category) {
     case "containers":
     case "general":
     case "privacy":
     case "search":
     case "sync":
--- a/browser/components/preferences/in-content/preferences.xul
+++ b/browser/components/preferences/in-content/preferences.xul
@@ -117,74 +117,79 @@
   <stringbundleset id="appManagerBundleset">
     <stringbundle id="appManagerBundle"
                   src="chrome://browser/locale/preferences/applicationManager.properties"/>
   </stringbundleset>
 
   <stack flex="1">
   <hbox flex="1">
 
-    <!-- category list -->
-    <richlistbox id="categories">
-      <richlistitem id="category-general"
-                    class="category"
-                    value="paneGeneral"
-                    helpTopic="prefs-main"
-                    tooltiptext="&paneGeneral.title;"
-                    align="center">
-        <image class="category-icon"/>
-        <label class="category-name" flex="1">&paneGeneral.title;</label>
-      </richlistitem>
+    <vbox class="navigation">
+      <!-- category list -->
+      <richlistbox id="categories">
+        <richlistitem id="category-general"
+                      class="category"
+                      value="paneGeneral"
+                      helpTopic="prefs-main"
+                      tooltiptext="&paneGeneral.title;"
+                      align="center">
+          <image class="category-icon"/>
+          <label class="category-name" flex="1">&paneGeneral.title;</label>
+        </richlistitem>
 
-      <richlistitem id="category-search"
-                    class="category"
-                    value="paneSearch"
-                    helpTopic="prefs-search"
-                    tooltiptext="&paneSearch.title;"
-                    align="center">
-        <image class="category-icon"/>
-        <label class="category-name" flex="1">&paneSearch.title;</label>
-      </richlistitem>
+        <richlistitem id="category-search"
+                      class="category"
+                      value="paneSearch"
+                      helpTopic="prefs-search"
+                      tooltiptext="&paneSearch.title;"
+                      align="center">
+          <image class="category-icon"/>
+          <label class="category-name" flex="1">&paneSearch.title;</label>
+        </richlistitem>
+
+        <richlistitem id="category-containers"
+                      class="category"
+                      value="paneContainers"
+                      helpTopic="prefs-containers"
+                      hidden="true"/>
 
-      <richlistitem id="category-containers"
-                    class="category"
-                    value="paneContainers"
-                    helpTopic="prefs-containers"
-                    hidden="true"/>
+        <richlistitem id="category-privacy"
+                      class="category"
+                      value="panePrivacy"
+                      helpTopic="prefs-privacy"
+                      tooltiptext="&panePrivacySecurity.title;"
+                      align="center">
+          <image class="category-icon"/>
+          <label class="category-name" flex="1">&panePrivacySecurity.title;</label>
+        </richlistitem>
 
-      <richlistitem id="category-privacy"
-                    class="category"
-                    value="panePrivacy"
-                    helpTopic="prefs-privacy"
-                    tooltiptext="&panePrivacySecurity.title;"
-                    align="center">
-        <image class="category-icon"/>
-        <label class="category-name" flex="1">&panePrivacySecurity.title;</label>
-      </richlistitem>
+        <richlistitem id="category-sync"
+                      class="category"
+                      value="paneSync"
+                      helpTopic="prefs-weave"
+                      tooltiptext="&paneSync1.title;"
+                      align="center">
+          <image class="category-icon"/>
+          <label class="category-name" flex="1">&paneSync1.title;</label>
+        </richlistitem>
+      </richlistbox>
 
-      <richlistitem id="category-sync"
-                    class="category"
-                    value="paneSync"
-                    helpTopic="prefs-weave"
-                    tooltiptext="&paneSync1.title;"
-                    align="center">
-        <image class="category-icon"/>
-        <label class="category-name" flex="1">&paneSync1.title;</label>
-      </richlistitem>
-    </richlistbox>
+      <spacer flex="1"/>
+
+      <hbox class="help-button" pack="center">
+        <label class="text-link">
+          <image class="help-icon"/><label class="help-label" flex="1">&helpButton2.label;</label>
+        </label>
+      </hbox>
+    </vbox>
 
     <keyset>
       <key key="&focusSearch1.key;" modifiers="accel" id="focusSearch1" oncommand="gSearchResultsPane.searchInput.focus();"/>
     </keyset>
 
-    <html:a class="help-button" target="_blank" aria-label="&helpButton2.label;">
-      <html:img class="help-icon" src="chrome://global/skin/icons/help.svg"/>
-      <html:span class="help-label">&helpButton2.label;</html:span>
-    </html:a>
-
     <vbox class="main-content" flex="1" align="start">
       <vbox class="pane-container">
         <hbox class="search-container" pack="end">
           <textbox type="search" id="searchInput" style="width: &searchField.width;" hidden="true" clickSelectsAll="true"/>
         </hbox>
         <prefpane id="mainPrefPane">
 #include searchResults.xul
 #include main.xul
--- a/browser/components/preferences/in-content/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js
+++ b/browser/components/preferences/in-content/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js
@@ -71,18 +71,18 @@ add_task(async function() {
   ss.setTabState(tab, JSON.stringify(TAB_STATE));
 
   await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
   let doc = tab.linkedBrowser.contentDocument;
 
   // Make body scrollable
   doc.body.style.height = (doc.body.clientHeight + 100) + "px";
 
-  let tabList = doc.getElementById("tabList");
-  tabList.focus();
+  let tabsToggle = doc.getElementById("tabsToggle");
+  tabsToggle.focus();
   EventUtils.synthesizeKey(" ", {});
   await checkPageScrolling(doc.documentElement, "session restore");
 
   gBrowser.removeCurrentTab();
   finish();
 });
 
 function checkPageScrolling(container, type) {
--- a/browser/components/preferences/sitePermissions.js
+++ b/browser/components/preferences/sitePermissions.js
@@ -9,16 +9,18 @@ Components.utils.import("resource:///mod
 function Permission(principal, type, capability, capabilityString) {
   this.principal = principal;
   this.origin = principal.origin;
   this.type = type;
   this.capability = capability;
   this.capabilityString = capabilityString;
 }
 
+const PERMISSION_STATES = [SitePermissions.ALLOW, SitePermissions.BLOCK, SitePermissions.PROMPT];
+
 var gSitePermissionsManager = {
   _type: "",
   _isObserving: false,
   _permissions: new Map(),
   _permissionsToChange: new Map(),
   _permissionsToDelete: new Map(),
   _list: null,
   _bundle: null,
@@ -65,18 +67,18 @@ var gSitePermissionsManager = {
   },
 
   observe(subject, topic, data) {
     if (topic !== "perm-changed")
       return;
 
     let permission = subject.QueryInterface(Components.interfaces.nsIPermission);
 
-    // Ignore unrelated permission types.
-    if (permission.type !== this._type)
+    // Ignore unrelated permission types and permissions with unknown states.
+    if (permission.type !== this._type || !PERMISSION_STATES.includes(permission.capability))
       return;
 
     if (data == "added") {
       this._addPermissionToList(permission);
       this.buildPermissionsList();
     } else if (data == "changed") {
       let p = this._permissions.get(permission.principal.origin);
       p.capability = permission.capability;
@@ -107,17 +109,18 @@ var gSitePermissionsManager = {
     case Services.perms.PROMPT_ACTION:
       stringKey = "prompt"
       break;
     }
     return this._bundle.getString(stringKey);
   },
 
   _addPermissionToList(perm) {
-    if (perm.type !== this._type)
+    // Ignore unrelated permission types and permissions with unknown states.
+    if (perm.type !== this._type || !PERMISSION_STATES.includes(perm.capability))
       return;
     let capabilityString = this._getCapabilityString(perm.capability);
     let p = new Permission(perm.principal, perm.type, perm.capability,
                            capabilityString);
     this._permissions.set(p.origin, p);
   },
 
   _removePermissionFromList(origin) {
--- a/browser/components/sessionstore/content/aboutSessionRestore.js
+++ b/browser/components/sessionstore/content/aboutSessionRestore.js
@@ -12,16 +12,27 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   "resource://gre/modules/AppConstants.jsm");
 
 var gStateObject;
 var gTreeData;
 
 // Page initialization
 
 window.onload = function() {
+  let toggleTabs = document.getElementById("tabsToggle");
+  if (toggleTabs) {
+    let treeContainer = document.querySelector(".tree-container");
+
+    let toggleHiddenTabs = () => {
+      toggleTabs.classList.toggle("show-tabs");
+      treeContainer.classList.toggle("expanded");
+    }
+    toggleTabs.onclick = toggleHiddenTabs;
+  }
+
   // pages used by this script may have a link that needs to be updated to
   // the in-product link.
   let anchor = document.getElementById("linkMoreTroubleshooting");
   if (anchor) {
     let baseURL = Services.urlFormatter.formatURLPref("app.support.baseURL");
     anchor.setAttribute("href", baseURL + "troubleshooting");
   }
 
--- a/browser/components/sessionstore/content/aboutSessionRestore.xhtml
+++ b/browser/components/sessionstore/content/aboutSessionRestore.xhtml
@@ -20,29 +20,38 @@
     <title>&restorepage.tabtitle;</title>
     <link rel="stylesheet" href="chrome://global/skin/in-content/info-pages.css" type="text/css" media="all"/>
     <link rel="stylesheet" href="chrome://browser/skin/aboutSessionRestore.css" type="text/css" media="all"/>
     <link rel="icon" type="image/png" href="chrome://global/skin/icons/warning-16.png"/>
 
     <script type="application/javascript" src="chrome://browser/content/aboutSessionRestore.js"/>
   </head>
 
-  <body dir="&locale.dir;">
+  <body dir="&locale.dir;" class="illustrated">
 
     <div class="container restore-chosen">
+      <div class="description-wrapper">
+        <div class="title">
+          <h1 class="title-text">&restorepage.errorTitle2;</h1>
+        </div>
+        <div class="description">
+          <p>&restorepage.problemDesc2;</p>
 
-      <div class="title">
-        <h1 class="title-text">&restorepage.errorTitle2;</h1>
-      </div>
-      <div class="description">
-        <p>&restorepage.problemDesc2;</p>
-
-        <div id="errorLongDesc">
-          <p>&restorepage.tryThis2;</p>
+          <div id="errorLongDesc">
+            <p>&restorepage.tryThis2;</p>
+          </div>
         </div>
+        <button id="tabsToggle" class="show-tabs">
+          <span id="showTabs">
+            &restorepage.showTabs;
+          </span>
+          <span id="hideTabs">
+            &restorepage.hideTabs;
+          </span>
+        </button>
       </div>
       <div class="tree-container" available="true">
         <xul:tree id="tabList" seltype="single" hidecolumnpicker="true"
               onclick="onListClick(event);" onkeydown="onListKeyDown(event);"
               _window_label="&restorepage.windowLabel;">
           <xul:treecols>
             <xul:treecol cycler="true" id="restore" type="checkbox" label="&restorepage.restoreHeader;"/>
             <xul:splitter class="tree-splitter"/>
--- a/browser/components/sessionstore/test/browser_590563.js
+++ b/browser/components/sessionstore/test/browser_590563.js
@@ -20,40 +20,45 @@ function test() {
     registerCleanupFunction(() => BrowserTestUtils.closeWindow(win));
 
     is(gBrowser.tabs.length, 1, "The total number of tabs should be 1");
     is(gBrowser.visibleTabs.length, 1, "The total number of visible tabs should be 1");
 
     executeSoon(function() {
       waitForFocus(function() {
         middleClickTest(win);
-        finish();
       }, win);
     });
   });
 }
 
-function middleClickTest(win) {
+async function middleClickTest(win) {
   let browser = win.gBrowser.selectedBrowser;
+  let tabsToggle = browser.contentDocument.getElementById("tabsToggle");
+  EventUtils.synthesizeMouseAtCenter(tabsToggle, { button: 0 }, browser.contentWindow);
+  let treeContainer = browser.contentDocument.querySelector(".tree-container")
+  await BrowserTestUtils.waitForCondition(() => win.getComputedStyle(treeContainer).visibility == "visible");
+
   let tree = browser.contentDocument.getElementById("tabList");
   is(tree.view.rowCount, 3, "There should be three items");
 
   // click on the first tab item
   var rect = tree.treeBoxObject.getCoordsForCellItem(1, tree.columns[1], "text");
   EventUtils.synthesizeMouse(tree.body, rect.x, rect.y, { button: 1 },
                              browser.contentWindow);
   // click on the second tab item
   rect = tree.treeBoxObject.getCoordsForCellItem(2, tree.columns[1], "text");
   EventUtils.synthesizeMouse(tree.body, rect.x, rect.y, { button: 1 },
                              browser.contentWindow);
 
   is(win.gBrowser.tabs.length, 3,
      "The total number of tabs should be 3 after restoring 2 tabs by middle click.");
   is(win.gBrowser.visibleTabs.length, 3,
      "The total number of visible tabs should be 3 after restoring 2 tabs by middle click");
+  finish();
 }
 
 function newWindowWithState(state, callback) {
   let opts = "chrome,all,dialog=no,height=800,width=800";
   let win = window.openDialog(getBrowserURL(), "_blank", opts);
 
   win.addEventListener("load", function() {
     // The form data will be restored before SSTabRestored, so we want to listen
--- a/browser/components/uitour/test/browser_UITour_availableTargets.js
+++ b/browser/components/uitour/test/browser_UITour_availableTargets.js
@@ -149,15 +149,14 @@ var pageActionsHelper = {
       action.shownInUrlbar = originalState;
     }
     this._originalStates = null;
   }
 };
 
 function ensureScreenshotsEnabled() {
   SpecialPowers.pushPrefEnv({ set: [
-    [ "extensions.screenshots.disabled", false ],
-    [ "extensions.screenshots.system-disabled", false ]
+    [ "extensions.screenshots.disabled", false ]
   ]});
   return BrowserTestUtils.waitForCondition(() => {
     return PageActions.actionForID("screenshots");
   }, "Should enable Screenshots");
 }
new file mode 100755
--- /dev/null
+++ b/browser/config/mozconfigs/win32/mingw32
@@ -0,0 +1,81 @@
+# Sets:
+#    MOZ_AUTOMATION flags
+#    SOCORRO_SYMBOL_UPLOAD_TOKEN_FILE - shouldn't be used?
+#    TOOLTOOL_DIR
+#    MAKECAB - shouldn't be used?
+. "$topsrcdir/build/mozconfig.win-common"
+
+# MinGW does not have (or need) makecab
+unset MAKECAB
+
+# These aren't supported on mingw at this time
+# Bug 1393817
+MOZ_AUTOMATION_L10N_CHECK=0
+# This might be fixed on -central now
+MOZ_AUTOMATION_BUILD_SYMBOLS=0
+# Bug 1393803
+MOZ_AUTOMATION_INSTALLER=0
+
+# Sets:
+#  build/mozconfig.common
+#    AUTOCLOBBER=1
+#    --enable-crashreporter
+#    --enable-release
+#    LLVM_CONFIG
+#    MOZ_ADDON_SIGNING
+#    MOZ_REQUIRE_SIGNING
+#    --enable-js-shell
+#  build/mozconfig.automation
+#    MOZ_AUTOMATION_ flags
+#  build/mozconfig.rust
+#    TOOLTOOL_DIR
+#    RUSTC
+#    CARGO
+. "$topsrcdir/browser/config/mozconfigs/common"
+
+# MinGW Stuff
+ac_add_options --target=i686-w64-mingw32
+ac_add_options --with-toolchain-prefix=i686-w64-mingw32-
+
+ac_add_options --enable-debug
+ac_add_options --disable-optimize
+
+# Knock this out from above
+ac_add_options --disable-js-shell
+
+# GCC compiling for Windows exposes a lot of warnings. We are tracking them in Bug 1394433
+ac_add_options --disable-warnings-as-errors
+
+# Temporary config settings until we get these working on mingw
+ac_add_options --disable-tests
+ac_add_options --disable-accessibility # https://sourceforge.net/p/mingw-w64/bugs/648/
+
+# Long story
+ac_add_options --disable-sandbox # Bug 1230910
+ac_add_options --disable-stylo # Bug 1390583
+
+# These aren't supported on mingw at this time
+ac_add_options --disable-webrtc # Bug 1393901
+ac_add_options --disable-crashreporter # Bug 1391685
+ac_add_options --disable-maintenance-service
+
+# Find our toolchain
+CC="$TOOLTOOL_DIR/gcc/bin/i686-w64-mingw32-gcc"
+CXX="$TOOLTOOL_DIR/gcc/bin/i686-w64-mingw32-g++"
+
+HOST_CC="$TOOLTOOL_DIR/gcc/bin/gcc"
+HOST_CXX="$TOOLTOOL_DIR/gcc/bin/g++"
+
+# We want to make sure we use binutils and other binaries in the tooltool
+# package.
+mk_add_options PATH="$TOOLTOOL_DIR/gcc/bin:$TOOLTOOL_DIR/gcc/i686-w64-mingw32/bin:$TOOLTOOL_DIR/wine/bin:$TOOLTOOL_DIR/upx/bin:$TOOLTOOL_DIR/fxc2/bin:$PATH"
+
+LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOOLTOOL_DIR/gcc/lib64:$TOOLTOOL_DIR/gcc/lib
+mk_add_options "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
+
+# Do not include the visual studio related mozconfigs of course
+
+ac_add_options --with-branding=browser/branding/nightly
+
+. "$topsrcdir/build/mozconfig.common.override"
+. "$topsrcdir/build/mozconfig.cache"
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/browser/extensions/activity-stream/data/content/activity-stream-debug.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<html lang="" dir="ltr">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp">
+    <title></title>
+    <link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png"/>
+    <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
+    <link rel="stylesheet" href="resource://activity-stream/data/content/activity-stream.css" />
+  </head>
+  <body class="activity-stream">
+    <div id="root"></div>
+    <div id="snippets-container">
+      <div id="snippets"></div>
+    </div>
+    <script>
+// Don't directly load the following scripts as part of html to let the page
+// finish loading to render the content sooner.
+for (const src of [
+  "chrome://browser/content/contentSearchUI.js",
+  "resource://activity-stream/vendor/react-dev.js",
+  "resource://activity-stream/vendor/react-dom-dev.js",
+  "resource://activity-stream/vendor/react-intl.js",
+  "resource://activity-stream/vendor/redux.js",
+  "resource://activity-stream/vendor/react-redux.js",
+  "resource://activity-stream/data/content/activity-stream.bundle.js"
+]) {
+  // These dynamically inserted scripts by default are async, but we need them
+  // to load in the desired order (i.e., bundle last).
+  const script = document.body.appendChild(document.createElement("script"));
+  script.async = false;
+  script.src = src;
+}
+    </script>
+  </body>
+</html>
--- a/browser/extensions/activity-stream/data/content/activity-stream-initial-state.js
+++ b/browser/extensions/activity-stream/data/content/activity-stream-initial-state.js
@@ -40,17 +40,17 @@
       "menu_action_pin": " ",
       "menu_action_unpin": " ",
       "confirm_history_delete_p1": " ",
       "confirm_history_delete_notice_p2": " ",
       "menu_action_save_to_pocket": " ",
       "search_for_something_with": " ",
       "search_button": " ",
       "search_header": " ",
-      "search_web_placeholder": "Search the Web",
+      "search_web_placeholder": " ",
       "search_settings": " ",
       "section_info_option": " ",
       "section_info_send_feedback": " ",
       "section_info_privacy_notice": " ",
       "welcome_title": " ",
       "welcome_body": " ",
       "welcome_label": " ",
       "time_label_less_than_minute": " ",
new file mode 100644
--- /dev/null
+++ b/browser/extensions/activity-stream/data/content/activity-stream-prerendered-debug.html
@@ -0,0 +1,37 @@
+<!doctype html>
+<html lang="" dir="ltr">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp">
+    <title></title>
+    <link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png"/>
+    <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
+    <link rel="stylesheet" href="resource://activity-stream/data/content/activity-stream.css" />
+  </head>
+  <body class="activity-stream">
+    <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="645243258"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6"> </span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder=" " title=" " data-reactid="7"/><button id="searchSubmit" class="search-button" title=" " data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10"> </span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="collapsible-section top-sites" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="click-target" data-reactid="15"><span class="icon icon-small-spacer icon-topsites" data-reactid="16"></span><span data-reactid="17"> </span><span class="icon icon-arrowhead-down" data-reactid="18"></span></span></h3><span class="section-info-option" data-reactid="19"><img class="info-option-icon" title=" " aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="20"/><div class="info-option" data-reactid="21"><div class="info-option-header" role="heading" data-reactid="22"><span data-reactid="23"> </span></div><p class="info-option-body" data-reactid="24"><span data-reactid="25"> </span></p><div class="info-option-manage" data-reactid="26"><button data-reactid="27"><span data-reactid="28"> </span></button></div></div></span></div><div class="section-body" data-reactid="29"><ul class="top-sites-list" data-reactid="30"><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><span class="letter-fallback" data-reactid="34"></span><div class="screenshot" style="background-image:none;" data-reactid="35"></div></div><div class="title " data-reactid="36"><span dir="auto" data-reactid="37"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="38"><a data-reactid="39"><div class="tile" aria-hidden="true" data-reactid="40"><span class="letter-fallback" data-reactid="41"></span><div class="screenshot" style="background-image:none;" data-reactid="42"></div></div><div class="title " data-reactid="43"><span dir="auto" data-reactid="44"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="45"><a data-reactid="46"><div class="tile" aria-hidden="true" data-reactid="47"><span class="letter-fallback" data-reactid="48"></span><div class="screenshot" style="background-image:none;" data-reactid="49"></div></div><div class="title " data-reactid="50"><span dir="auto" data-reactid="51"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="52"><a data-reactid="53"><div class="tile" aria-hidden="true" data-reactid="54"><span class="letter-fallback" data-reactid="55"></span><div class="screenshot" style="background-image:none;" data-reactid="56"></div></div><div class="title " data-reactid="57"><span dir="auto" data-reactid="58"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="59"><a data-reactid="60"><div class="tile" aria-hidden="true" data-reactid="61"><span class="letter-fallback" data-reactid="62"></span><div class="screenshot" style="background-image:none;" data-reactid="63"></div></div><div class="title " data-reactid="64"><span dir="auto" data-reactid="65"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="66"><a data-reactid="67"><div class="tile" aria-hidden="true" data-reactid="68"><span class="letter-fallback" data-reactid="69"></span><div class="screenshot" style="background-image:none;" data-reactid="70"></div></div><div class="title " data-reactid="71"><span dir="auto" data-reactid="72"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="73"><div class="edit-topsites-button" data-reactid="74"><button class="edit" title=" " data-reactid="75"><span data-reactid="76"> </span></button></div></div></div></section><div class="sections-list" data-reactid="77"><section class="collapsible-section section" data-reactid="78"><div class="section-top-bar" data-reactid="79"><h3 class="section-title" data-reactid="80"><span class="click-target" data-reactid="81"><span class="icon icon-small-spacer icon-pocket" data-reactid="82"></span><span data-reactid="83"> </span><span class="icon icon-arrowhead-down" data-reactid="84"></span></span></h3></div><div class="section-body" data-reactid="85"><ul class="section-list" style="padding:0;" data-reactid="86"><li class="card-outer placeholder" data-reactid="87"><a data-reactid="88"><div class="card" data-reactid="89"><div class="card-details no-image" data-reactid="90"><div class="card-text no-context no-description no-host-name no-image" data-reactid="91"><h4 class="card-title" dir="auto" data-reactid="92"></h4><p class="card-description" dir="auto" data-reactid="93"></p></div><div class="card-context" data-reactid="94"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="95"><a data-reactid="96"><div class="card" data-reactid="97"><div class="card-details no-image" data-reactid="98"><div class="card-text no-context no-description no-host-name no-image" data-reactid="99"><h4 class="card-title" dir="auto" data-reactid="100"></h4><p class="card-description" dir="auto" data-reactid="101"></p></div><div class="card-context" data-reactid="102"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="103"><a data-reactid="104"><div class="card" data-reactid="105"><div class="card-details no-image" data-reactid="106"><div class="card-text no-context no-description no-host-name no-image" data-reactid="107"><h4 class="card-title" dir="auto" data-reactid="108"></h4><p class="card-description" dir="auto" data-reactid="109"></p></div><div class="card-context" data-reactid="110"></div></div></div></a></li></ul><div class="topic" data-reactid="111"><span data-reactid="112"><span data-reactid="113"> </span></span><ul data-reactid="114"></ul></div></div></section><section class="collapsible-section section" data-reactid="115"><div class="section-top-bar" data-reactid="116"><h3 class="section-title" data-reactid="117"><span class="click-target" data-reactid="118"><span class="icon icon-small-spacer icon-highlights" data-reactid="119"></span><span data-reactid="120"> </span><span class="icon icon-arrowhead-down" data-reactid="121"></span></span></h3></div><div class="section-body" data-reactid="122"><ul class="section-list" style="padding:0;" data-reactid="123"><li class="card-outer placeholder" data-reactid="124"><a data-reactid="125"><div class="card" data-reactid="126"><div class="card-details no-image" data-reactid="127"><div class="card-text no-context no-description no-host-name no-image" data-reactid="128"><h4 class="card-title" dir="auto" data-reactid="129"></h4><p class="card-description" dir="auto" data-reactid="130"></p></div><div class="card-context" data-reactid="131"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="132"><a data-reactid="133"><div class="card" data-reactid="134"><div class="card-details no-image" data-reactid="135"><div class="card-text no-context no-description no-host-name no-image" data-reactid="136"><h4 class="card-title" dir="auto" data-reactid="137"></h4><p class="card-description" dir="auto" data-reactid="138"></p></div><div class="card-context" data-reactid="139"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="140"><a data-reactid="141"><div class="card" data-reactid="142"><div class="card-details no-image" data-reactid="143"><div class="card-text no-context no-description no-host-name no-image" data-reactid="144"><h4 class="card-title" dir="auto" data-reactid="145"></h4><p class="card-description" dir="auto" data-reactid="146"></p></div><div class="card-context" data-reactid="147"></div></div></div></a></li></ul></div></section></div></div><!-- react-empty: 148 --></main></div></div>
+    <div id="snippets-container">
+      <div id="snippets"></div>
+    </div>
+    <script>
+// Don't directly load the following scripts as part of html to let the page
+// finish loading to render the content sooner.
+for (const src of [
+  "resource://activity-stream/data/content/activity-stream-initial-state.js",
+  "chrome://browser/content/contentSearchUI.js",
+  "resource://activity-stream/vendor/react-dev.js",
+  "resource://activity-stream/vendor/react-dom-dev.js",
+  "resource://activity-stream/vendor/react-intl.js",
+  "resource://activity-stream/vendor/redux.js",
+  "resource://activity-stream/vendor/react-redux.js",
+  "resource://activity-stream/data/content/activity-stream.bundle.js"
+]) {
+  // These dynamically inserted scripts by default are async, but we need them
+  // to load in the desired order (i.e., bundle last).
+  const script = document.body.appendChild(document.createElement("script"));
+  script.async = false;
+  script.src = src;
+}
+    </script>
+  </body>
+</html>
--- a/browser/extensions/activity-stream/data/content/activity-stream-prerendered.html
+++ b/browser/extensions/activity-stream/data/content/activity-stream-prerendered.html
@@ -4,17 +4,17 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp">
     <title></title>
     <link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png"/>
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="resource://activity-stream/data/content/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="-1695158303"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">Search the Web</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="Search the Web" title="Search the Web" data-reactid="7"/><button id="searchSubmit" class="search-button" title=" " data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10"> </span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="section top-sites" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="icon icon-small-spacer icon-topsites" data-reactid="15"></span><span data-reactid="16"> </span></h3><span class="section-info-option" data-reactid="17"><img class="info-option-icon" title=" " aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="18"/><div class="info-option" data-reactid="19"><div class="info-option-header" role="heading" data-reactid="20"><span data-reactid="21"> </span></div><p class="info-option-body" data-reactid="22"><span data-reactid="23"> </span></p><div class="info-option-manage" data-reactid="24"><button data-reactid="25"><span data-reactid="26"> </span></button></div></div></span></div><ul class="top-sites-list" data-reactid="27"><li class="top-site-outer placeholder" data-reactid="28"><a data-reactid="29"><div class="tile" aria-hidden="true" data-reactid="30"><span class="letter-fallback" data-reactid="31"></span><div class="screenshot" style="background-image:none;" data-reactid="32"></div></div><div class="title " data-reactid="33"><span dir="auto" data-reactid="34"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="35"><a data-reactid="36"><div class="tile" aria-hidden="true" data-reactid="37"><span class="letter-fallback" data-reactid="38"></span><div class="screenshot" style="background-image:none;" data-reactid="39"></div></div><div class="title " data-reactid="40"><span dir="auto" data-reactid="41"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="42"><a data-reactid="43"><div class="tile" aria-hidden="true" data-reactid="44"><span class="letter-fallback" data-reactid="45"></span><div class="screenshot" style="background-image:none;" data-reactid="46"></div></div><div class="title " data-reactid="47"><span dir="auto" data-reactid="48"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="49"><a data-reactid="50"><div class="tile" aria-hidden="true" data-reactid="51"><span class="letter-fallback" data-reactid="52"></span><div class="screenshot" style="background-image:none;" data-reactid="53"></div></div><div class="title " data-reactid="54"><span dir="auto" data-reactid="55"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="56"><a data-reactid="57"><div class="tile" aria-hidden="true" data-reactid="58"><span class="letter-fallback" data-reactid="59"></span><div class="screenshot" style="background-image:none;" data-reactid="60"></div></div><div class="title " data-reactid="61"><span dir="auto" data-reactid="62"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="63"><a data-reactid="64"><div class="tile" aria-hidden="true" data-reactid="65"><span class="letter-fallback" data-reactid="66"></span><div class="screenshot" style="background-image:none;" data-reactid="67"></div></div><div class="title " data-reactid="68"><span dir="auto" data-reactid="69"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="70"><div class="edit-topsites-button" data-reactid="71"><button class="edit" title=" " data-reactid="72"><span data-reactid="73"> </span></button></div></div></section><div class="sections-list" data-reactid="74"><section class="section" data-reactid="75"><div class="section-top-bar" data-reactid="76"><h3 class="section-title" data-reactid="77"><span class="icon icon-small-spacer icon-pocket" data-reactid="78"></span><span data-reactid="79"> </span></h3></div><ul class="section-list" style="padding:0;" data-reactid="80"><li class="card-outer placeholder" data-reactid="81"><a data-reactid="82"><div class="card" data-reactid="83"><div class="card-details no-image" data-reactid="84"><div class="card-text no-context no-description no-host-name no-image" data-reactid="85"><h4 class="card-title" dir="auto" data-reactid="86"></h4><p class="card-description" dir="auto" data-reactid="87"></p></div><div class="card-context" data-reactid="88"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="89"><a data-reactid="90"><div class="card" data-reactid="91"><div class="card-details no-image" data-reactid="92"><div class="card-text no-context no-description no-host-name no-image" data-reactid="93"><h4 class="card-title" dir="auto" data-reactid="94"></h4><p class="card-description" dir="auto" data-reactid="95"></p></div><div class="card-context" data-reactid="96"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="97"><a data-reactid="98"><div class="card" data-reactid="99"><div class="card-details no-image" data-reactid="100"><div class="card-text no-context no-description no-host-name no-image" data-reactid="101"><h4 class="card-title" dir="auto" data-reactid="102"></h4><p class="card-description" dir="auto" data-reactid="103"></p></div><div class="card-context" data-reactid="104"></div></div></div></a></li></ul><div class="topic" data-reactid="105"><span data-reactid="106"><span data-reactid="107"> </span></span><ul data-reactid="108"></ul></div></section><section class="section" data-reactid="109"><div class="section-top-bar" data-reactid="110"><h3 class="section-title" data-reactid="111"><span class="icon icon-small-spacer icon-highlights" data-reactid="112"></span><span data-reactid="113"> </span></h3></div><ul class="section-list" style="padding:0;" data-reactid="114"><li class="card-outer placeholder" data-reactid="115"><a data-reactid="116"><div class="card" data-reactid="117"><div class="card-details no-image" data-reactid="118"><div class="card-text no-context no-description no-host-name no-image" data-reactid="119"><h4 class="card-title" dir="auto" data-reactid="120"></h4><p class="card-description" dir="auto" data-reactid="121"></p></div><div class="card-context" data-reactid="122"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="123"><a data-reactid="124"><div class="card" data-reactid="125"><div class="card-details no-image" data-reactid="126"><div class="card-text no-context no-description no-host-name no-image" data-reactid="127"><h4 class="card-title" dir="auto" data-reactid="128"></h4><p class="card-description" dir="auto" data-reactid="129"></p></div><div class="card-context" data-reactid="130"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="131"><a data-reactid="132"><div class="card" data-reactid="133"><div class="card-details no-image" data-reactid="134"><div class="card-text no-context no-description no-host-name no-image" data-reactid="135"><h4 class="card-title" dir="auto" data-reactid="136"></h4><p class="card-description" dir="auto" data-reactid="137"></p></div><div class="card-context" data-reactid="138"></div></div></div></a></li></ul></section></div></div><!-- react-empty: 139 --></main></div></div>
+    <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="645243258"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6"> </span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder=" " title=" " data-reactid="7"/><button id="searchSubmit" class="search-button" title=" " data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10"> </span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="collapsible-section top-sites" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="click-target" data-reactid="15"><span class="icon icon-small-spacer icon-topsites" data-reactid="16"></span><span data-reactid="17"> </span><span class="icon icon-arrowhead-down" data-reactid="18"></span></span></h3><span class="section-info-option" data-reactid="19"><img class="info-option-icon" title=" " aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="20"/><div class="info-option" data-reactid="21"><div class="info-option-header" role="heading" data-reactid="22"><span data-reactid="23"> </span></div><p class="info-option-body" data-reactid="24"><span data-reactid="25"> </span></p><div class="info-option-manage" data-reactid="26"><button data-reactid="27"><span data-reactid="28"> </span></button></div></div></span></div><div class="section-body" data-reactid="29"><ul class="top-sites-list" data-reactid="30"><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><span class="letter-fallback" data-reactid="34"></span><div class="screenshot" style="background-image:none;" data-reactid="35"></div></div><div class="title " data-reactid="36"><span dir="auto" data-reactid="37"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="38"><a data-reactid="39"><div class="tile" aria-hidden="true" data-reactid="40"><span class="letter-fallback" data-reactid="41"></span><div class="screenshot" style="background-image:none;" data-reactid="42"></div></div><div class="title " data-reactid="43"><span dir="auto" data-reactid="44"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="45"><a data-reactid="46"><div class="tile" aria-hidden="true" data-reactid="47"><span class="letter-fallback" data-reactid="48"></span><div class="screenshot" style="background-image:none;" data-reactid="49"></div></div><div class="title " data-reactid="50"><span dir="auto" data-reactid="51"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="52"><a data-reactid="53"><div class="tile" aria-hidden="true" data-reactid="54"><span class="letter-fallback" data-reactid="55"></span><div class="screenshot" style="background-image:none;" data-reactid="56"></div></div><div class="title " data-reactid="57"><span dir="auto" data-reactid="58"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="59"><a data-reactid="60"><div class="tile" aria-hidden="true" data-reactid="61"><span class="letter-fallback" data-reactid="62"></span><div class="screenshot" style="background-image:none;" data-reactid="63"></div></div><div class="title " data-reactid="64"><span dir="auto" data-reactid="65"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="66"><a data-reactid="67"><div class="tile" aria-hidden="true" data-reactid="68"><span class="letter-fallback" data-reactid="69"></span><div class="screenshot" style="background-image:none;" data-reactid="70"></div></div><div class="title " data-reactid="71"><span dir="auto" data-reactid="72"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="73"><div class="edit-topsites-button" data-reactid="74"><button class="edit" title=" " data-reactid="75"><span data-reactid="76"> </span></button></div></div></div></section><div class="sections-list" data-reactid="77"><section class="collapsible-section section" data-reactid="78"><div class="section-top-bar" data-reactid="79"><h3 class="section-title" data-reactid="80"><span class="click-target" data-reactid="81"><span class="icon icon-small-spacer icon-pocket" data-reactid="82"></span><span data-reactid="83"> </span><span class="icon icon-arrowhead-down" data-reactid="84"></span></span></h3></div><div class="section-body" data-reactid="85"><ul class="section-list" style="padding:0;" data-reactid="86"><li class="card-outer placeholder" data-reactid="87"><a data-reactid="88"><div class="card" data-reactid="89"><div class="card-details no-image" data-reactid="90"><div class="card-text no-context no-description no-host-name no-image" data-reactid="91"><h4 class="card-title" dir="auto" data-reactid="92"></h4><p class="card-description" dir="auto" data-reactid="93"></p></div><div class="card-context" data-reactid="94"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="95"><a data-reactid="96"><div class="card" data-reactid="97"><div class="card-details no-image" data-reactid="98"><div class="card-text no-context no-description no-host-name no-image" data-reactid="99"><h4 class="card-title" dir="auto" data-reactid="100"></h4><p class="card-description" dir="auto" data-reactid="101"></p></div><div class="card-context" data-reactid="102"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="103"><a data-reactid="104"><div class="card" data-reactid="105"><div class="card-details no-image" data-reactid="106"><div class="card-text no-context no-description no-host-name no-image" data-reactid="107"><h4 class="card-title" dir="auto" data-reactid="108"></h4><p class="card-description" dir="auto" data-reactid="109"></p></div><div class="card-context" data-reactid="110"></div></div></div></a></li></ul><div class="topic" data-reactid="111"><span data-reactid="112"><span data-reactid="113"> </span></span><ul data-reactid="114"></ul></div></div></section><section class="collapsible-section section" data-reactid="115"><div class="section-top-bar" data-reactid="116"><h3 class="section-title" data-reactid="117"><span class="click-target" data-reactid="118"><span class="icon icon-small-spacer icon-highlights" data-reactid="119"></span><span data-reactid="120"> </span><span class="icon icon-arrowhead-down" data-reactid="121"></span></span></h3></div><div class="section-body" data-reactid="122"><ul class="section-list" style="padding:0;" data-reactid="123"><li class="card-outer placeholder" data-reactid="124"><a data-reactid="125"><div class="card" data-reactid="126"><div class="card-details no-image" data-reactid="127"><div class="card-text no-context no-description no-host-name no-image" data-reactid="128"><h4 class="card-title" dir="auto" data-reactid="129"></h4><p class="card-description" dir="auto" data-reactid="130"></p></div><div class="card-context" data-reactid="131"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="132"><a data-reactid="133"><div class="card" data-reactid="134"><div class="card-details no-image" data-reactid="135"><div class="card-text no-context no-description no-host-name no-image" data-reactid="136"><h4 class="card-title" dir="auto" data-reactid="137"></h4><p class="card-description" dir="auto" data-reactid="138"></p></div><div class="card-context" data-reactid="139"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="140"><a data-reactid="141"><div class="card" data-reactid="142"><div class="card-details no-image" data-reactid="143"><div class="card-text no-context no-description no-host-name no-image" data-reactid="144"><h4 class="card-title" dir="auto" data-reactid="145"></h4><p class="card-description" dir="auto" data-reactid="146"></p></div><div class="card-context" data-reactid="147"></div></div></div></a></li></ul></div></section></div></div><!-- react-empty: 148 --></main></div></div>
     <div id="snippets-container">
       <div id="snippets"></div>
     </div>
     <script>
 // Don't directly load the following scripts as part of html to let the page
 // finish loading to render the content sooner.
 for (const src of [
   "resource://activity-stream/data/content/activity-stream-initial-state.js",
--- a/browser/extensions/activity-stream/data/content/activity-stream.bundle.js
+++ b/browser/extensions/activity-stream/data/content/activity-stream.bundle.js
@@ -1089,29 +1089,21 @@ class LinkMenu extends React.PureCompone
 
 module.exports = injectIntl(LinkMenu);
 module.exports._unconnected = LinkMenu;
 
 /***/ }),
 /* 10 */
 /***/ (function(module, exports, __webpack_require__) {
 
-/* WEBPACK VAR INJECTION */(function(global) {var _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; };
+var _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; };
 
 const React = __webpack_require__(1);
-const { connect } = __webpack_require__(3);
+const { actionCreators: ac, actionTypes: at } = __webpack_require__(0);
 const { injectIntl, FormattedMessage } = __webpack_require__(2);
-const Card = __webpack_require__(20);
-const { PlaceholderCard } = Card;
-const Topics = __webpack_require__(22);
-const { actionCreators: ac, actionTypes: at } = __webpack_require__(0);
-
-const VISIBLE = "visible";
-const VISIBILITY_CHANGE_EVENT = "visibilitychange";
-const CARDS_PER_ROW = 3;
 
 function getFormattedMessage(message) {
   return typeof message === "string" ? React.createElement(
     "span",
     null,
     message
   ) : React.createElement(FormattedMessage, message);
 }
@@ -1197,205 +1189,114 @@ class Info extends React.PureComponent {
         )
       )
     );
   }
 }
 
 const InfoIntl = injectIntl(Info);
 
-class Section extends React.PureComponent {
-  _dispatchImpressionStats() {
-    const { props } = this;
-    const maxCards = 3 * props.maxRows;
-    const cards = props.rows.slice(0, maxCards);
-
-    if (this.needsImpressionStats(cards)) {
-      props.dispatch(ac.ImpressionStats({
-        source: props.eventSource,
-        tiles: cards.map(link => ({ id: link.guid })),
-        incognito: props.options && props.options.personalized
-      }));
-      this.impressionCardGuids = cards.map(link => link.guid);
+class CollapsibleSection extends React.PureComponent {
+  constructor(props) {
+    super(props);
+    this.onInfoEnter = this.onInfoEnter.bind(this);
+    this.onInfoLeave = this.onInfoLeave.bind(this);
+    this.onHeaderClick = this.onHeaderClick.bind(this);
+    this.onTransitionEnd = this.onTransitionEnd.bind(this);
+    this.state = { enableAnimation: false, isAnimating: false, infoActive: false };
+  }
+  componentDidUpdate(prevProps, prevState) {
+    // Enable animations once we get prefs loaded in to avoid animations running during loading.
+    if (prevProps.Prefs.values[this.props.prefName] === undefined && this.props.Prefs.values[this.props.prefName] !== undefined) {
+      setTimeout(() => this.setState({ enableAnimation: true }), 0);
     }
   }
-
-  // This sends an event when a user sees a set of new content. If content
-  // changes while the page is hidden (i.e. preloaded or on a hidden tab),
-  // only send the event if the page becomes visible again.
-  sendImpressionStatsOrAddListener() {
-    const { props } = this;
-
-    if (!props.shouldSendImpressionStats || !props.dispatch) {
-      return;
-    }
-
-    if (props.document.visibilityState === VISIBLE) {
-      this._dispatchImpressionStats();
-    } else {
-      // We should only ever send the latest impression stats ping, so remove any
-      // older listeners.
-      if (this._onVisibilityChange) {
-        props.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
-      }
-
-      // When the page becoems visible, send the impression stats ping.
-      this._onVisibilityChange = () => {
-        if (props.document.visibilityState === VISIBLE) {
-          this._dispatchImpressionStats();
-          props.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
-        }
-      };
-      props.document.addEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
-    }
-  }
-
-  componentDidMount() {
-    if (this.props.rows.length) {
-      this.sendImpressionStatsOrAddListener();
+  _setInfoState(nextActive) {
+    // Take a truthy value to conditionally change the infoActive state.
+    const infoActive = !!nextActive;
+    if (infoActive !== this.state.infoActive) {
+      this.setState({ infoActive });
     }
   }
-
-  componentDidUpdate(prevProps) {
-    const { props } = this;
-    if (
-    // Don't send impression stats for the empty state
-    props.rows.length &&
-    // We only want to send impression stats if the content of the cards has changed
-    props.rows !== prevProps.rows) {
-      this.sendImpressionStatsOrAddListener();
-    }
+  onInfoEnter() {
+    // We're getting focus or hover, so info state should be true if not yet.
+    this._setInfoState(true);
   }
-
-  needsImpressionStats(cards) {
-    if (!this.impressionCardGuids || this.impressionCardGuids.length !== cards.length) {
-      return true;
-    }
-
-    for (let i = 0; i < cards.length; i++) {
-      if (cards[i].guid !== this.impressionCardGuids[i]) {
-        return true;
-      }
-    }
-
-    return false;
+  onInfoLeave(event) {
+    // We currently have an active (true) info state, so keep it true only if we
+    // have a related event target that is contained "within" the current target
+    // (section-info-option) as itself or a descendant. Set to false otherwise.
+    this._setInfoState(event && event.relatedTarget && (event.relatedTarget === event.currentTarget || event.relatedTarget.compareDocumentPosition(event.currentTarget) & Node.DOCUMENT_POSITION_CONTAINS));
+  }
+  onHeaderClick() {
+    this.setState({ isAnimating: true });
+    this.props.dispatch(ac.SetPref(this.props.prefName, !this.props.Prefs.values[this.props.prefName]));
   }
-
-  numberOfPlaceholders(items) {
-    if (items === 0) {
-      return CARDS_PER_ROW;
+  onTransitionEnd() {
+    this.setState({ isAnimating: false });
+  }
+  renderIcon() {
+    const icon = this.props.icon;
+    if (icon && icon.startsWith("moz-extension://")) {
+      return React.createElement("span", { className: "icon icon-small-spacer", style: { "background-image": `url('${icon}')` } });
     }
-    const remainder = items % CARDS_PER_ROW;
-    if (remainder === 0) {
-      return 0;
-    }
-    return CARDS_PER_ROW - remainder;
+    return React.createElement("span", { className: `icon icon-small-spacer icon-${icon || "webextension"}` });
   }
-
   render() {
-    const {
-      id, eventSource, title, icon, rows,
-      infoOption, emptyState, dispatch, maxRows,
-      contextMenuOptions, initialized
-    } = this.props;
-    const maxCards = CARDS_PER_ROW * maxRows;
-
-    // Show topics only for top stories and if it's not initialized yet (so
-    // content doesn't shift when it is loaded) or has loaded with topics
-    const shouldShowTopics = id === "topstories" && (!this.props.topics || this.props.topics.length > 0);
-
-    const realRows = rows.slice(0, maxCards);
-    const placeholders = this.numberOfPlaceholders(realRows.length);
-
-    // The empty state should only be shown after we have initialized and there is no content.
-    // Otherwise, we should show placeholders.
-    const shouldShowEmptyState = initialized && !rows.length;
-
-    // <Section> <-- React component
-    // <section> <-- HTML5 element
+    const isCollapsed = this.props.Prefs.values[this.props.prefName];
+    const { enableAnimation, isAnimating } = this.state;
+    const infoOption = this.props.infoOption;
+
     return React.createElement(
       "section",
-      { className: "section" },
+      { className: `collapsible-section ${this.props.className}${isCollapsed ? " collapsed" : ""}` },
       React.createElement(
         "div",
         { className: "section-top-bar" },
         React.createElement(
           "h3",
           { className: "section-title" },
-          icon && icon.startsWith("moz-extension://") ? React.createElement("span", { className: "icon icon-small-spacer", style: { "background-image": `url('${icon}')` } }) : React.createElement("span", { className: `icon icon-small-spacer icon-${icon || "webextension"}` }),
-          getFormattedMessage(title)
+          React.createElement(
+            "span",
+            { className: "click-target", onClick: this.onHeaderClick },
+            this.renderIcon(),
+            this.props.title,
+            React.createElement("span", { className: `icon ${isCollapsed ? "icon-arrowhead-forward" : "icon-arrowhead-down"}` })
+          )
         ),
-        infoOption && React.createElement(InfoIntl, { infoOption: infoOption, dispatch: dispatch })
+        infoOption && React.createElement(InfoIntl, { infoOption: infoOption, dispatch: this.props.dispatch })
       ),
-      !shouldShowEmptyState && React.createElement(
-        "ul",
-        { className: "section-list", style: { padding: 0 } },
-        realRows.map((link, index) => link && React.createElement(Card, { key: index, index: index, dispatch: dispatch, link: link, contextMenuOptions: contextMenuOptions,
-          eventSource: eventSource, shouldSendImpressionStats: this.props.shouldSendImpressionStats })),
-        placeholders > 0 && [...new Array(placeholders)].map((_, i) => React.createElement(PlaceholderCard, { key: i }))
-      ),
-      shouldShowEmptyState && React.createElement(
+      React.createElement(
         "div",
-        { className: "section-empty-state" },
-        React.createElement(
-          "div",
-          { className: "empty-state" },
-          emptyState.icon && emptyState.icon.startsWith("moz-extension://") ? React.createElement("img", { className: "empty-state-icon icon", style: { "background-image": `url('${emptyState.icon}')` } }) : React.createElement("img", { className: `empty-state-icon icon icon-${emptyState.icon}` }),
-          React.createElement(
-            "p",
-            { className: "empty-state-message" },
-            getFormattedMessage(emptyState.message)
-          )
-        )
-      ),
-      shouldShowTopics && React.createElement(Topics, { topics: this.props.topics, read_more_endpoint: this.props.read_more_endpoint })
+        { className: `section-body${enableAnimation ? " animation-enabled" : ""}${isAnimating ? " animating" : ""}`, onTransitionEnd: this.onTransitionEnd },
+        this.props.children
+      )
     );
   }
 }
 
-Section.defaultProps = {
-  document: global.document,
-  rows: [],
-  emptyState: {},
-  title: ""
-};
-
-const SectionIntl = injectIntl(Section);
-
-class Sections extends React.PureComponent {
-  render() {
-    const sections = this.props.Sections;
-    return React.createElement(
-      "div",
-      { className: "sections-list" },
-      sections.filter(section => section.enabled).map(section => React.createElement(SectionIntl, _extends({ key: section.id }, section, { dispatch: this.props.dispatch })))
-    );
-  }
-}
-
-module.exports = connect(state => ({ Sections: state.Sections }))(Sections);
-module.exports._unconnected = Sections;
-module.exports.SectionIntl = SectionIntl;
-module.exports._unconnectedSection = Section;
+CollapsibleSection.defaultProps = { Prefs: { values: {} } };
+
+module.exports = injectIntl(CollapsibleSection);
+module.exports._unconnected = CollapsibleSection;
 module.exports.Info = Info;
 module.exports.InfoIntl = InfoIntl;
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
 
 /***/ }),
 /* 11 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* WEBPACK VAR INJECTION */(function(global) {const React = __webpack_require__(1);
 const ReactDOM = __webpack_require__(12);
 const Base = __webpack_require__(13);
 const { Provider } = __webpack_require__(3);
-const initStore = __webpack_require__(29);
+const initStore = __webpack_require__(30);
 const { reducers } = __webpack_require__(6);
-const DetectUserSessionStart = __webpack_require__(31);
-const { addSnippetsSubscriber } = __webpack_require__(32);
+const DetectUserSessionStart = __webpack_require__(32);
+const { addSnippetsSubscriber } = __webpack_require__(33);
 const { actionTypes: at, actionCreators: ac } = __webpack_require__(0);
 
 new DetectUserSessionStart().sendEventOrAddListener();
 
 const store = initStore(reducers, global.gActivityStreamPrerenderedState);
 
 // If we are starting in a prerendered state, we must wait until the first render
 // to request state rehydration (see Base.jsx). If we are NOT in a prerendered state,
@@ -1422,23 +1323,23 @@ module.exports = ReactDOM;
 /***/ }),
 /* 13 */
 /***/ (function(module, exports, __webpack_require__) {
 
 const React = __webpack_require__(1);
 const { connect } = __webpack_require__(3);
 const { addLocaleData, IntlProvider } = __webpack_require__(2);
 const TopSites = __webpack_require__(14);
-const Search = __webpack_require__(23);
-const ConfirmDialog = __webpack_require__(25);
-const ManualMigration = __webpack_require__(26);
-const PreferencesPane = __webpack_require__(27);
-const Sections = __webpack_require__(10);
+const Search = __webpack_require__(20);
+const ConfirmDialog = __webpack_require__(22);
+const ManualMigration = __webpack_require__(23);
+const PreferencesPane = __webpack_require__(24);
+const Sections = __webpack_require__(25);
 const { actionTypes: at, actionCreators: ac } = __webpack_require__(0);
-const { PrerenderData } = __webpack_require__(28);
+const { PrerenderData } = __webpack_require__(29);
 
 // 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, textDirection }) {
   addLocaleData([{ locale, parentLocale: "en" }]);
   document.documentElement.lang = locale;
   document.documentElement.dir = textDirection;
@@ -1540,59 +1441,48 @@ module.exports._unconnected = Base;
 
 const React = __webpack_require__(1);
 const { connect } = __webpack_require__(3);
 const { FormattedMessage } = __webpack_require__(2);
 
 const TopSitesPerfTimer = __webpack_require__(15);
 const TopSitesEdit = __webpack_require__(16);
 const { TopSite, TopSitePlaceholder } = __webpack_require__(8);
-const { InfoIntl } = __webpack_require__(10);
+const CollapsibleSection = __webpack_require__(10);
 
 const TopSites = props => {
   const realTopSites = props.TopSites.rows.slice(0, props.TopSitesCount);
   const placeholderCount = props.TopSitesCount - realTopSites.length;
   const infoOption = {
     header: { id: "settings_pane_topsites_header" },
     body: { id: "settings_pane_topsites_body" }
   };
   return React.createElement(
     TopSitesPerfTimer,
     null,
     React.createElement(
-      "section",
-      { className: "section top-sites" },
-      React.createElement(
-        "div",
-        { className: "section-top-bar" },
-        React.createElement(
-          "h3",
-          { className: "section-title" },
-          React.createElement("span", { className: `icon icon-small-spacer icon-topsites` }),
-          React.createElement(FormattedMessage, { id: "header_top_sites" })
-        ),
-        React.createElement(InfoIntl, { infoOption: infoOption, dispatch: props.dispatch })
-      ),
+      CollapsibleSection,
+      { className: "top-sites", icon: "topsites", title: React.createElement(FormattedMessage, { id: "header_top_sites" }), infoOption: infoOption, prefName: "collapseTopSites", Prefs: props.Prefs, dispatch: props.dispatch },
       React.createElement(
         "ul",
         { className: "top-sites-list" },
         realTopSites.map((link, index) => link && React.createElement(TopSite, {
           key: link.guid || link.url,
           dispatch: props.dispatch,
           link: link,
           index: index,
           intl: props.intl })),
         placeholderCount > 0 && [...Array(placeholderCount)].map((_, i) => React.createElement(TopSitePlaceholder, { key: i }))
       ),
       React.createElement(TopSitesEdit, props)
     )
   );
 };
 
-module.exports = connect(state => ({ TopSites: state.TopSites, TopSitesCount: state.Prefs.values.topSitesCount }))(TopSites);
+module.exports = connect(state => ({ TopSites: state.TopSites, Prefs: state.Prefs, TopSitesCount: state.Prefs.values.topSitesCount }))(TopSites);
 module.exports._unconnected = TopSites;
 
 /***/ }),
 /* 15 */
 /***/ (function(module, exports, __webpack_require__) {
 
 const React = __webpack_require__(1);
 const { connect } = __webpack_require__(3);
@@ -2288,20 +2178,711 @@ module.exports = {
 
 module.exports.CheckBookmark = site => site.bookmarkGuid ? module.exports.RemoveBookmark(site) : module.exports.AddBookmark(site);
 module.exports.CheckPinTopSite = (site, index) => site.isPinned ? module.exports.UnpinTopSite(site) : module.exports.PinTopSite(site, index);
 
 /***/ }),
 /* 20 */
 /***/ (function(module, exports, __webpack_require__) {
 
+"use strict";
+/* globals ContentSearchUIController */
+
+
+const React = __webpack_require__(1);
+const { connect } = __webpack_require__(3);
+const { FormattedMessage, injectIntl } = __webpack_require__(2);
+const { actionCreators: ac } = __webpack_require__(0);
+const { IS_NEWTAB } = __webpack_require__(21);
+
+class Search extends React.PureComponent {
+  constructor(props) {
+    super(props);
+    this.onClick = this.onClick.bind(this);
+    this.onInputMount = this.onInputMount.bind(this);
+  }
+
+  handleEvent(event) {
+    // Also track search events with our own telemetry
+    if (event.detail.type === "Search") {
+      this.props.dispatch(ac.UserEvent({ event: "SEARCH" }));
+    }
+  }
+  onClick(event) {
+    window.gContentSearchController.search(event);
+  }
+  componentWillUnmount() {
+    delete window.gContentSearchController;
+  }
+  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 = 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 = 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);
+
+      // Focus the search box if we are on about:home
+      if (!IS_NEWTAB) {
+        input.focus();
+      }
+    } else {
+      window.gContentSearchController = null;
+      removeEventListener("ContentSearchClient", this);
+    }
+  }
+
+  /*
+   * 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() {
+    return React.createElement(
+      "div",
+      { className: "search-wrapper" },
+      React.createElement(
+        "label",
+        { htmlFor: "newtab-search-text", className: "search-label" },
+        React.createElement(
+          "span",
+          { className: "sr-only" },
+          React.createElement(FormattedMessage, { id: "search_web_placeholder" })
+        )
+      ),
+      React.createElement("input", {
+        id: "newtab-search-text",
+        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.createElement(
+        "button",
+        {
+          id: "searchSubmit",
+          className: "search-button",
+          onClick: this.onClick,
+          title: this.props.intl.formatMessage({ id: "search_button" }) },
+        React.createElement(
+          "span",
+          { className: "sr-only" },
+          React.createElement(FormattedMessage, { id: "search_button" })
+        )
+      )
+    );
+  }
+}
+
+// initialized is passed to props so that Search will rerender when it receives strings
+module.exports = connect(state => ({ locale: state.App.locale }))(injectIntl(Search));
+module.exports._unconnected = Search;
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {module.exports = {
+  // constant to know if the page is about:newtab or about:home
+  IS_NEWTAB: global.document && global.document.documentURI === "about:newtab"
+};
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __webpack_require__) {
+
+const React = __webpack_require__(1);
+const { connect } = __webpack_require__(3);
+const { FormattedMessage } = __webpack_require__(2);
+const { actionTypes, actionCreators: ac } = __webpack_require__(0);
+
+/**
+ * ConfirmDialog component.
+ * One primary action button, one cancel button.
+ *
+ * Content displayed is controlled by `data` prop the component receives.
+ * Example:
+ * data: {
+ *   // Any sort of data needed to be passed around by actions.
+ *   payload: site.url,
+ *   // Primary button SendToMain action.
+ *   action: "DELETE_HISTORY_URL",
+ *   // Primary button USerEvent action.
+ *   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"
+ * },
+ */
+const ConfirmDialog = React.createClass({
+  displayName: "ConfirmDialog",
+
+  getDefaultProps() {
+    return {
+      visible: false,
+      data: {}
+    };
+  },
+
+  _handleCancelBtn() {
+    this.props.dispatch({ type: actionTypes.DIALOG_CANCEL });
+    this.props.dispatch(ac.UserEvent({ event: actionTypes.DIALOG_CANCEL }));
+  },
+
+  _handleConfirmBtn() {
+    this.props.data.onConfirm.forEach(this.props.dispatch);
+  },
+
+  _renderModalMessage() {
+    const message_body = this.props.data.body_string_id;
+
+    if (!message_body) {
+      return null;
+    }
+
+    return React.createElement(
+      "span",
+      null,
+      message_body.map(msg => React.createElement(
+        "p",
+        { key: msg },
+        React.createElement(FormattedMessage, { id: msg })
+      ))
+    );
+  },
+
+  render() {
+    if (!this.props.visible) {
+      return null;
+    }
+
+    return React.createElement(
+      "div",
+      { className: "confirmation-dialog" },
+      React.createElement("div", { className: "modal-overlay", onClick: this._handleCancelBtn }),
+      React.createElement(
+        "div",
+        { className: "modal" },
+        React.createElement(
+          "section",
+          { className: "modal-message" },
+          this._renderModalMessage()
+        ),
+        React.createElement(
+          "section",
+          { className: "actions" },
+          React.createElement(
+            "button",
+            { onClick: this._handleCancelBtn },
+            React.createElement(FormattedMessage, { id: "topsites_form_cancel_button" })
+          ),
+          React.createElement(
+            "button",
+            { className: "done", onClick: this._handleConfirmBtn },
+            React.createElement(FormattedMessage, { id: this.props.data.confirm_button_string_id })
+          )
+        )
+      )
+    );
+  }
+});
+
+module.exports = connect(state => state.Dialog)(ConfirmDialog);
+module.exports._unconnected = ConfirmDialog;
+module.exports.Dialog = ConfirmDialog;
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+const React = __webpack_require__(1);
+const { connect } = __webpack_require__(3);
+const { FormattedMessage } = __webpack_require__(2);
+const { actionTypes: at, actionCreators: ac } = __webpack_require__(0);
+
+/**
+ * Manual migration component used to start the profile import wizard.
+ * Message is presented temporarily and will go away if:
+ * 1.  User clicks "No Thanks"
+ * 2.  User completed the data import
+ * 3.  After 3 active days
+ * 4.  User clicks "Cancel" on the import wizard (currently not implemented).
+ */
+class ManualMigration extends React.PureComponent {
+  constructor(props) {
+    super(props);
+    this.onLaunchTour = this.onLaunchTour.bind(this);
+    this.onCancelTour = this.onCancelTour.bind(this);
+  }
+  onLaunchTour() {
+    this.props.dispatch(ac.SendToMain({ type: at.MIGRATION_START }));
+    this.props.dispatch(ac.UserEvent({ event: at.MIGRATION_START }));
+  }
+
+  onCancelTour() {
+    this.props.dispatch(ac.SendToMain({ type: at.MIGRATION_CANCEL }));
+    this.props.dispatch(ac.UserEvent({ event: at.MIGRATION_CANCEL }));
+  }
+
+  render() {
+    return React.createElement(
+      "div",
+      { className: "manual-migration-container" },
+      React.createElement(
+        "p",
+        null,
+        React.createElement("span", { className: "icon icon-import" }),
+        React.createElement(FormattedMessage, { id: "manual_migration_explanation2" })
+      ),
+      React.createElement(
+        "div",
+        { className: "manual-migration-actions actions" },
+        React.createElement(
+          "button",
+          { className: "dismiss", onClick: this.onCancelTour },
+          React.createElement(FormattedMessage, { id: "manual_migration_cancel_button" })
+        ),
+        React.createElement(
+          "button",
+          { onClick: this.onLaunchTour },
+          React.createElement(FormattedMessage, { id: "manual_migration_import_button" })
+        )
+      )
+    );
+  }
+}
+
+module.exports = connect()(ManualMigration);
+module.exports._unconnected = ManualMigration;
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+const React = __webpack_require__(1);
+const { connect } = __webpack_require__(3);
+const { injectIntl, FormattedMessage } = __webpack_require__(2);
+const { actionCreators: ac, actionTypes: at } = __webpack_require__(0);
+const { TOP_SITES_DEFAULT_LENGTH, TOP_SITES_SHOWMORE_LENGTH } = __webpack_require__(6);
+
+const getFormattedMessage = message => typeof message === "string" ? React.createElement(
+  "span",
+  null,
+  message
+) : React.createElement(FormattedMessage, message);
+
+const PreferencesInput = props => React.createElement(
+  "section",
+  null,
+  React.createElement("input", { type: "checkbox", id: props.prefName, name: props.prefName, checked: props.value, disabled: props.disabled, onChange: props.onChange, className: props.className }),
+  React.createElement(
+    "label",
+    { htmlFor: props.prefName, className: props.labelClassName },
+    getFormattedMessage(props.titleString)
+  ),
+  props.descString && React.createElement(
+    "p",
+    { className: "prefs-input-description" },
+    getFormattedMessage(props.descString)
+  ),
+  React.Children.map(props.children, child => React.createElement(
+    "div",
+    { className: `options${child.props.disabled ? " disabled" : ""}` },
+    child
+  ))
+);
+
+class PreferencesPane extends React.PureComponent {
+  constructor(props) {
+    super(props);
+    this.handleClickOutside = this.handleClickOutside.bind(this);
+    this.handlePrefChange = this.handlePrefChange.bind(this);
+    this.handleSectionChange = this.handleSectionChange.bind(this);
+    this.togglePane = this.togglePane.bind(this);
+    this.onWrapperMount = this.onWrapperMount.bind(this);
+  }
+  componentDidUpdate(prevProps, prevState) {
+    if (prevProps.PreferencesPane.visible !== this.props.PreferencesPane.visible) {
+      // While the sidebar is open, listen for all document clicks.
+      if (this.isSidebarOpen()) {
+        document.addEventListener("click", this.handleClickOutside);
+      } else {
+        document.removeEventListener("click", this.handleClickOutside);
+      }
+    }
+  }
+  isSidebarOpen() {
+    return this.props.PreferencesPane.visible;
+  }
+  handleClickOutside(event) {
+    // if we are showing the sidebar and there is a click outside, close it.
+    if (this.isSidebarOpen() && !this.wrapper.contains(event.target)) {
+      this.togglePane();
+    }
+  }
+  handlePrefChange(event) {
+    const target = event.target;
+    const { name, checked } = target;
+    let value = checked;
+    if (name === "topSitesCount") {
+      value = checked ? TOP_SITES_SHOWMORE_LENGTH : TOP_SITES_DEFAULT_LENGTH;
+    }
+    this.props.dispatch(ac.SetPref(name, value));
+  }
+  handleSectionChange(event) {
+    const target = event.target;
+    const id = target.name;
+    const type = target.checked ? at.SECTION_ENABLE : at.SECTION_DISABLE;
+    this.props.dispatch(ac.SendToMain({ type, data: id }));
+  }
+  togglePane() {
+    if (this.isSidebarOpen()) {
+      this.props.dispatch({ type: at.SETTINGS_CLOSE });
+      this.props.dispatch(ac.UserEvent({ event: "CLOSE_NEWTAB_PREFS" }));
+    } else {
+      this.props.dispatch({ type: at.SETTINGS_OPEN });
+      this.props.dispatch(ac.UserEvent({ event: "OPEN_NEWTAB_PREFS" }));
+    }
+  }
+  onWrapperMount(wrapper) {
+    this.wrapper = wrapper;
+  }
+  render() {
+    const props = this.props;
+    const prefs = props.Prefs.values;
+    const sections = props.Sections;
+    const isVisible = this.isSidebarOpen();
+    return React.createElement(
+      "div",
+      { className: "prefs-pane-wrapper", ref: this.onWrapperMount },
+      React.createElement(
+        "div",
+        { className: "prefs-pane-button" },
+        React.createElement("button", {
+          className: `prefs-button icon ${isVisible ? "icon-dismiss" : "icon-settings"}`,
+          title: props.intl.formatMessage({ id: isVisible ? "settings_pane_done_button" : "settings_pane_button_label" }),
+          onClick: this.togglePane })
+      ),
+      React.createElement(
+        "div",
+        { className: "prefs-pane" },
+        React.createElement(
+          "div",
+          { className: `sidebar ${isVisible ? "" : "hidden"}` },
+          React.createElement(
+            "div",
+            { className: "prefs-modal-inner-wrapper" },
+            React.createElement(
+              "h1",
+              null,
+              React.createElement(FormattedMessage, { id: "settings_pane_header" })
+            ),
+            React.createElement(
+              "p",
+              null,
+              React.createElement(FormattedMessage, { id: "settings_pane_body2" })
+            ),
+            React.createElement(PreferencesInput, {
+              className: "showSearch",
+              prefName: "showSearch",
+              value: prefs.showSearch,
+              onChange: this.handlePrefChange,
+              titleString: { id: "settings_pane_search_header" },
+              descString: { id: "settings_pane_search_body" } }),
+            React.createElement("hr", null),
+            React.createElement(
+              PreferencesInput,
+              {
+                className: "showTopSites",
+                prefName: "showTopSites",
+                value: prefs.showTopSites,
+                onChange: this.handlePrefChange,
+                titleString: { id: "settings_pane_topsites_header" },
+                descString: { id: "settings_pane_topsites_body" } },
+              React.createElement(PreferencesInput, {
+                className: "showMoreTopSites",
+                prefName: "topSitesCount",
+                disabled: !prefs.showTopSites,
+                value: prefs.topSitesCount !== TOP_SITES_DEFAULT_LENGTH,
+                onChange: this.handlePrefChange,
+                titleString: { id: "settings_pane_topsites_options_showmore" },
+                labelClassName: "icon icon-topsites" })
+            ),
+            sections.filter(section => !section.shouldHidePref).map(({ id, title, enabled, pref }) => React.createElement(
+              PreferencesInput,
+              {
+                key: id,
+                className: "showSection",
+                prefName: pref && pref.feed || id,
+                value: enabled,
+                onChange: pref && pref.feed ? this.handlePrefChange : this.handleSectionChange,
+                titleString: pref && pref.titleString || title,
+                descString: pref && pref.descString },
+              pref.nestedPrefs && pref.nestedPrefs.map(nestedPref => React.createElement(PreferencesInput, {
+                key: nestedPref.name,
+                prefName: nestedPref.name,
+                disabled: !enabled,
+                value: prefs[nestedPref.name],
+                onChange: this.handlePrefChange,
+                titleString: nestedPref.titleString,
+                labelClassName: `icon ${nestedPref.icon}` }))
+            )),
+            React.createElement("hr", null),
+            React.createElement(PreferencesInput, { className: "showSnippets", prefName: "feeds.snippets",
+              value: prefs["feeds.snippets"], onChange: this.handlePrefChange,
+              titleString: { id: "settings_pane_snippets_header" },
+              descString: { id: "settings_pane_snippets_body" } })
+          ),
+          React.createElement(
+            "section",
+            { className: "actions" },
+            React.createElement(
+              "button",
+              { className: "done", onClick: this.togglePane },
+              React.createElement(FormattedMessage, { id: "settings_pane_done_button" })
+            )
+          )
+        )
+      )
+    );
+  }
+}
+
+module.exports = connect(state => ({ Prefs: state.Prefs, PreferencesPane: state.PreferencesPane, Sections: state.Sections }))(injectIntl(PreferencesPane));
+module.exports.PreferencesPane = PreferencesPane;
+module.exports.PreferencesInput = PreferencesInput;
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {var _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; };
+
+const React = __webpack_require__(1);
+const { connect } = __webpack_require__(3);
+const { injectIntl, FormattedMessage } = __webpack_require__(2);
+const Card = __webpack_require__(26);
+const { PlaceholderCard } = Card;
+const Topics = __webpack_require__(28);
+const { actionCreators: ac } = __webpack_require__(0);
+const CollapsibleSection = __webpack_require__(10);
+
+const VISIBLE = "visible";
+const VISIBILITY_CHANGE_EVENT = "visibilitychange";
+const CARDS_PER_ROW = 3;
+
+function getFormattedMessage(message) {
+  return typeof message === "string" ? React.createElement(
+    "span",
+    null,
+    message
+  ) : React.createElement(FormattedMessage, message);
+}
+
+class Section extends React.PureComponent {
+  _dispatchImpressionStats() {
+    const { props } = this;
+    const maxCards = 3 * props.maxRows;
+    const cards = props.rows.slice(0, maxCards);
+
+    if (this.needsImpressionStats(cards)) {
+      props.dispatch(ac.ImpressionStats({
+        source: props.eventSource,
+        tiles: cards.map(link => ({ id: link.guid })),
+        incognito: props.options && props.options.personalized
+      }));
+      this.impressionCardGuids = cards.map(link => link.guid);
+    }
+  }
+
+  // This sends an event when a user sees a set of new content. If content
+  // changes while the page is hidden (i.e. preloaded or on a hidden tab),
+  // only send the event if the page becomes visible again.
+  sendImpressionStatsOrAddListener() {
+    const { props } = this;
+
+    if (!props.shouldSendImpressionStats || !props.dispatch) {
+      return;
+    }
+
+    if (props.document.visibilityState === VISIBLE) {
+      this._dispatchImpressionStats();
+    } else {
+      // We should only ever send the latest impression stats ping, so remove any
+      // older listeners.
+      if (this._onVisibilityChange) {
+        props.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
+      }
+
+      // When the page becoems visible, send the impression stats ping if the section isn't collapsed.
+      this._onVisibilityChange = () => {
+        if (props.document.visibilityState === VISIBLE) {
+          const { id, Prefs } = this.props;
+          const isCollapsed = Prefs.values[`section.${id}.collapsed`];
+          if (!isCollapsed) {
+            this._dispatchImpressionStats();
+          }
+          props.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
+        }
+      };
+      props.document.addEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
+    }
+  }
+
+  componentDidMount() {
+    const { id, rows, Prefs } = this.props;
+    const isCollapsed = Prefs.values[`section.${id}.collapsed`];
+    if (rows.length && !isCollapsed) {
+      this.sendImpressionStatsOrAddListener();
+    }
+  }
+
+  componentDidUpdate(prevProps) {
+    const { props } = this;
+    const { id, Prefs } = props;
+    const isCollapsedPref = `section.${id}.collapsed`;
+    const isCollapsed = Prefs.values[isCollapsedPref];
+    const wasCollapsed = prevProps.Prefs.values[isCollapsedPref];
+    if (
+    // Don't send impression stats for the empty state
+    props.rows.length && (
+    // We only want to send impression stats if the content of the cards has changed
+    // and the section is not collapsed...
+    props.rows !== prevProps.rows && !isCollapsed ||
+    // or if we are expanding a section that was collapsed.
+    wasCollapsed && !isCollapsed)) {
+      this.sendImpressionStatsOrAddListener();
+    }
+  }
+
+  needsImpressionStats(cards) {
+    if (!this.impressionCardGuids || this.impressionCardGuids.length !== cards.length) {
+      return true;
+    }
+
+    for (let i = 0; i < cards.length; i++) {
+      if (cards[i].guid !== this.impressionCardGuids[i]) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  numberOfPlaceholders(items) {
+    if (items === 0) {
+      return CARDS_PER_ROW;
+    }
+    const remainder = items % CARDS_PER_ROW;
+    if (remainder === 0) {
+      return 0;
+    }
+    return CARDS_PER_ROW - remainder;
+  }
+
+  render() {
+    const {
+      id, eventSource, title, icon, rows,
+      infoOption, emptyState, dispatch, maxRows,
+      contextMenuOptions, initialized
+    } = this.props;
+    const maxCards = CARDS_PER_ROW * maxRows;
+
+    // Show topics only for top stories and if it's not initialized yet (so
+    // content doesn't shift when it is loaded) or has loaded with topics
+    const shouldShowTopics = id === "topstories" && (!this.props.topics || this.props.topics.length > 0);
+
+    const realRows = rows.slice(0, maxCards);
+    const placeholders = this.numberOfPlaceholders(realRows.length);
+
+    // The empty state should only be shown after we have initialized and there is no content.
+    // Otherwise, we should show placeholders.
+    const shouldShowEmptyState = initialized && !rows.length;
+
+    // <Section> <-- React component
+    // <section> <-- HTML5 element
+    return React.createElement(
+      CollapsibleSection,
+      { className: "section", icon: icon, title: getFormattedMessage(title), infoOption: infoOption, prefName: `section.${id}.collapsed`, Prefs: this.props.Prefs, dispatch: this.props.dispatch },
+      !shouldShowEmptyState && React.createElement(
+        "ul",
+        { className: "section-list", style: { padding: 0 } },
+        realRows.map((link, index) => link && React.createElement(Card, { key: index, index: index, dispatch: dispatch, link: link, contextMenuOptions: contextMenuOptions,
+          eventSource: eventSource, shouldSendImpressionStats: this.props.shouldSendImpressionStats })),
+        placeholders > 0 && [...new Array(placeholders)].map((_, i) => React.createElement(PlaceholderCard, { key: i }))
+      ),
+      shouldShowEmptyState && React.createElement(
+        "div",
+        { className: "section-empty-state" },
+        React.createElement(
+          "div",
+          { className: "empty-state" },
+          emptyState.icon && emptyState.icon.startsWith("moz-extension://") ? React.createElement("img", { className: "empty-state-icon icon", style: { "background-image": `url('${emptyState.icon}')` } }) : React.createElement("img", { className: `empty-state-icon icon icon-${emptyState.icon}` }),
+          React.createElement(
+            "p",
+            { className: "empty-state-message" },
+            getFormattedMessage(emptyState.message)
+          )
+        )
+      ),
+      shouldShowTopics && React.createElement(Topics, { topics: this.props.topics, read_more_endpoint: this.props.read_more_endpoint })
+    );
+  }
+}
+
+Section.defaultProps = {
+  document: global.document,
+  rows: [],
+  emptyState: {},
+  title: ""
+};
+
+const SectionIntl = injectIntl(Section);
+
+class Sections extends React.PureComponent {
+  render() {
+    const sections = this.props.Sections;
+    return React.createElement(
+      "div",
+      { className: "sections-list" },
+      sections.filter(section => section.enabled).map(section => React.createElement(SectionIntl, _extends({ key: section.id }, section, { Prefs: this.props.Prefs, dispatch: this.props.dispatch })))
+    );
+  }
+}
+
+module.exports = connect(state => ({ Sections: state.Sections, Prefs: state.Prefs }))(Sections);
+module.exports._unconnected = Sections;
+module.exports.SectionIntl = SectionIntl;
+module.exports._unconnectedSection = Section;
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __webpack_require__) {
+
 const React = __webpack_require__(1);
 const LinkMenu = __webpack_require__(9);
 const { FormattedMessage } = __webpack_require__(2);
-const cardContextTypes = __webpack_require__(21);
+const cardContextTypes = __webpack_require__(27);
 const { actionCreators: ac, actionTypes: at } = __webpack_require__(0);
 
 // 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
@@ -2487,17 +3068,17 @@ class Card extends React.PureComponent {
 Card.defaultProps = { link: {} };
 
 const PlaceholderCard = () => React.createElement(Card, { placeholder: true });
 
 module.exports = Card;
 module.exports.PlaceholderCard = PlaceholderCard;
 
 /***/ }),
-/* 21 */
+/* 27 */
 /***/ (function(module, exports) {
 
 module.exports = {
   history: {
     intlID: "type_label_visited",
     icon: "historyItem"
   },
   bookmark: {
@@ -2510,17 +3091,17 @@ module.exports = {
   },
   now: {
     intlID: "type_label_now",
     icon: "now"
   }
 };
 
 /***/ }),
-/* 22 */
+/* 28 */
 /***/ (function(module, exports, __webpack_require__) {
 
 const React = __webpack_require__(1);
 const { FormattedMessage } = __webpack_require__(2);
 
 class Topic extends React.PureComponent {
   render() {
     const { url, name } = this.props;
@@ -2561,469 +3142,17 @@ class Topics extends React.PureComponent
   }
 }
 
 module.exports = Topics;
 module.exports._unconnected = Topics;
 module.exports.Topic = Topic;
 
 /***/ }),
-/* 23 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-/* globals ContentSearchUIController */
-
-
-const React = __webpack_require__(1);
-const { connect } = __webpack_require__(3);
-const { FormattedMessage, injectIntl } = __webpack_require__(2);
-const { actionCreators: ac } = __webpack_require__(0);
-const { IS_NEWTAB } = __webpack_require__(24);
-
-class Search extends React.PureComponent {
-  constructor(props) {
-    super(props);
-    this.onClick = this.onClick.bind(this);
-    this.onInputMount = this.onInputMount.bind(this);
-  }
-
-  handleEvent(event) {
-    // Also track search events with our own telemetry
-    if (event.detail.type === "Search") {
-      this.props.dispatch(ac.UserEvent({ event: "SEARCH" }));
-    }
-  }
-  onClick(event) {
-    window.gContentSearchController.search(event);
-  }
-  componentWillUnmount() {
-    delete window.gContentSearchController;
-  }
-  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 = 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 = 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);
-
-      // Focus the search box if we are on about:home
-      if (!IS_NEWTAB) {
-        input.focus();
-      }
-    } else {
-      window.gContentSearchController = null;
-      removeEventListener("ContentSearchClient", this);
-    }
-  }
-
-  /*
-   * 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() {
-    return React.createElement(
-      "div",
-      { className: "search-wrapper" },
-      React.createElement(
-        "label",
-        { htmlFor: "newtab-search-text", className: "search-label" },
-        React.createElement(
-          "span",
-          { className: "sr-only" },
-          React.createElement(FormattedMessage, { id: "search_web_placeholder" })
-        )
-      ),
-      React.createElement("input", {
-        id: "newtab-search-text",
-        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.createElement(
-        "button",
-        {
-          id: "searchSubmit",
-          className: "search-button",
-          onClick: this.onClick,
-          title: this.props.intl.formatMessage({ id: "search_button" }) },
-        React.createElement(
-          "span",
-          { className: "sr-only" },
-          React.createElement(FormattedMessage, { id: "search_button" })
-        )
-      )
-    );
-  }
-}
-
-// initialized is passed to props so that Search will rerender when it receives strings
-module.exports = connect(state => ({ locale: state.App.locale }))(injectIntl(Search));
-module.exports._unconnected = Search;
-
-/***/ }),
-/* 24 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/* WEBPACK VAR INJECTION */(function(global) {module.exports = {
-  // constant to know if the page is about:newtab or about:home
-  IS_NEWTAB: global.document && global.document.documentURI === "about:newtab"
-};
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
-
-/***/ }),
-/* 25 */
-/***/ (function(module, exports, __webpack_require__) {
-
-const React = __webpack_require__(1);
-const { connect } = __webpack_require__(3);
-const { FormattedMessage } = __webpack_require__(2);
-const { actionTypes, actionCreators: ac } = __webpack_require__(0);
-
-/**
- * ConfirmDialog component.
- * One primary action button, one cancel button.
- *
- * Content displayed is controlled by `data` prop the component receives.
- * Example:
- * data: {
- *   // Any sort of data needed to be passed around by actions.
- *   payload: site.url,
- *   // Primary button SendToMain action.
- *   action: "DELETE_HISTORY_URL",
- *   // Primary button USerEvent action.
- *   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"
- * },
- */
-const ConfirmDialog = React.createClass({
-  displayName: "ConfirmDialog",
-
-  getDefaultProps() {
-    return {
-      visible: false,
-      data: {}
-    };
-  },
-
-  _handleCancelBtn() {
-    this.props.dispatch({ type: actionTypes.DIALOG_CANCEL });
-    this.props.dispatch(ac.UserEvent({ event: actionTypes.DIALOG_CANCEL }));
-  },
-
-  _handleConfirmBtn() {
-    this.props.data.onConfirm.forEach(this.props.dispatch);
-  },
-
-  _renderModalMessage() {
-    const message_body = this.props.data.body_string_id;
-
-    if (!message_body) {
-      return null;
-    }
-
-    return React.createElement(
-      "span",
-      null,
-      message_body.map(msg => React.createElement(
-        "p",
-        { key: msg },
-        React.createElement(FormattedMessage, { id: msg })
-      ))
-    );
-  },
-
-  render() {
-    if (!this.props.visible) {
-      return null;
-    }
-
-    return React.createElement(
-      "div",
-      { className: "confirmation-dialog" },
-      React.createElement("div", { className: "modal-overlay", onClick: this._handleCancelBtn }),
-      React.createElement(
-        "div",
-        { className: "modal" },
-        React.createElement(
-          "section",
-          { className: "modal-message" },
-          this._renderModalMessage()
-        ),
-        React.createElement(
-          "section",
-          { className: "actions" },
-          React.createElement(
-            "button",
-            { onClick: this._handleCancelBtn },
-            React.createElement(FormattedMessage, { id: "topsites_form_cancel_button" })
-          ),
-          React.createElement(
-            "button",
-            { className: "done", onClick: this._handleConfirmBtn },
-            React.createElement(FormattedMessage, { id: this.props.data.confirm_button_string_id })
-          )
-        )
-      )
-    );
-  }
-});
-
-module.exports = connect(state => state.Dialog)(ConfirmDialog);
-module.exports._unconnected = ConfirmDialog;
-module.exports.Dialog = ConfirmDialog;
-
-/***/ }),
-/* 26 */
-/***/ (function(module, exports, __webpack_require__) {
-
-const React = __webpack_require__(1);
-const { connect } = __webpack_require__(3);
-const { FormattedMessage } = __webpack_require__(2);
-const { actionTypes: at, actionCreators: ac } = __webpack_require__(0);
-
-/**
- * Manual migration component used to start the profile import wizard.
- * Message is presented temporarily and will go away if:
- * 1.  User clicks "No Thanks"
- * 2.  User completed the data import
- * 3.  After 3 active days
- * 4.  User clicks "Cancel" on the import wizard (currently not implemented).
- */
-class ManualMigration extends React.PureComponent {
-  constructor(props) {
-    super(props);
-    this.onLaunchTour = this.onLaunchTour.bind(this);
-    this.onCancelTour = this.onCancelTour.bind(this);
-  }
-  onLaunchTour() {
-    this.props.dispatch(ac.SendToMain({ type: at.MIGRATION_START }));
-    this.props.dispatch(ac.UserEvent({ event: at.MIGRATION_START }));
-  }
-
-  onCancelTour() {
-    this.props.dispatch(ac.SendToMain({ type: at.MIGRATION_CANCEL }));
-    this.props.dispatch(ac.UserEvent({ event: at.MIGRATION_CANCEL }));
-  }
-
-  render() {
-    return React.createElement(
-      "div",
-      { className: "manual-migration-container" },
-      React.createElement(
-        "p",
-        null,
-        React.createElement("span", { className: "icon icon-import" }),
-        React.createElement(FormattedMessage, { id: "manual_migration_explanation2" })
-      ),
-      React.createElement(
-        "div",
-        { className: "manual-migration-actions actions" },
-        React.createElement(
-          "button",
-          { className: "dismiss", onClick: this.onCancelTour },
-          React.createElement(FormattedMessage, { id: "manual_migration_cancel_button" })
-        ),
-        React.createElement(
-          "button",
-          { onClick: this.onLaunchTour },
-          React.createElement(FormattedMessage, { id: "manual_migration_import_button" })
-        )
-      )
-    );
-  }
-}
-
-module.exports = connect()(ManualMigration);
-module.exports._unconnected = ManualMigration;
-
-/***/ }),
-/* 27 */
-/***/ (function(module, exports, __webpack_require__) {
-
-const React = __webpack_require__(1);
-const { connect } = __webpack_require__(3);
-const { injectIntl, FormattedMessage } = __webpack_require__(2);
-const { actionCreators: ac, actionTypes: at } = __webpack_require__(0);
-const { TOP_SITES_DEFAULT_LENGTH, TOP_SITES_SHOWMORE_LENGTH } = __webpack_require__(6);
-
-const getFormattedMessage = message => typeof message === "string" ? React.createElement(
-  "span",
-  null,
-  message
-) : React.createElement(FormattedMessage, message);
-
-const PreferencesInput = props => React.createElement(
-  "section",
-  null,
-  React.createElement("input", { type: "checkbox", id: props.prefName, name: props.prefName, checked: props.value, disabled: props.disabled, onChange: props.onChange, className: props.className }),
-  React.createElement(
-    "label",
-    { htmlFor: props.prefName, className: props.labelClassName },
-    getFormattedMessage(props.titleString)
-  ),
-  props.descString && React.createElement(
-    "p",
-    { className: "prefs-input-description" },
-    getFormattedMessage(props.descString)
-  )
-);
-
-class PreferencesPane extends React.PureComponent {
-  constructor(props) {
-    super(props);
-    this.handleClickOutside = this.handleClickOutside.bind(this);
-    this.handlePrefChange = this.handlePrefChange.bind(this);
-    this.handleSectionChange = this.handleSectionChange.bind(this);
-    this.togglePane = this.togglePane.bind(this);
-    this.onWrapperMount = this.onWrapperMount.bind(this);
-  }
-  componentDidUpdate(prevProps, prevState) {
-    if (prevProps.PreferencesPane.visible !== this.props.PreferencesPane.visible) {
-      // While the sidebar is open, listen for all document clicks.
-      if (this.isSidebarOpen()) {
-        document.addEventListener("click", this.handleClickOutside);
-      } else {
-        document.removeEventListener("click", this.handleClickOutside);
-      }
-    }
-  }
-  isSidebarOpen() {
-    return this.props.PreferencesPane.visible;
-  }
-  handleClickOutside(event) {
-    // if we are showing the sidebar and there is a click outside, close it.
-    if (this.isSidebarOpen() && !this.wrapper.contains(event.target)) {
-      this.togglePane();
-    }
-  }
-  handlePrefChange(event) {
-    const target = event.target;
-    const { name, checked } = target;
-    let value = checked;
-    if (name === "topSitesCount") {
-      value = checked ? TOP_SITES_SHOWMORE_LENGTH : TOP_SITES_DEFAULT_LENGTH;
-    }
-    this.props.dispatch(ac.SetPref(name, value));
-  }
-  handleSectionChange(event) {
-    const target = event.target;
-    const id = target.name;
-    const type = target.checked ? at.SECTION_ENABLE : at.SECTION_DISABLE;
-    this.props.dispatch(ac.SendToMain({ type, data: id }));
-  }
-  togglePane() {
-    if (this.isSidebarOpen()) {
-      this.props.dispatch({ type: at.SETTINGS_CLOSE });
-      this.props.dispatch(ac.UserEvent({ event: "CLOSE_NEWTAB_PREFS" }));
-    } else {
-      this.props.dispatch({ type: at.SETTINGS_OPEN });
-      this.props.dispatch(ac.UserEvent({ event: "OPEN_NEWTAB_PREFS" }));
-    }
-  }
-  onWrapperMount(wrapper) {
-    this.wrapper = wrapper;
-  }
-  render() {
-    const props = this.props;
-    const prefs = props.Prefs.values;
-    const sections = props.Sections;
-    const isVisible = this.isSidebarOpen();
-    return React.createElement(
-      "div",
-      { className: "prefs-pane-wrapper", ref: this.onWrapperMount },
-      React.createElement(
-        "div",
-        { className: "prefs-pane-button" },
-        React.createElement("button", {
-          className: `prefs-button icon ${isVisible ? "icon-dismiss" : "icon-settings"}`,
-          title: props.intl.formatMessage({ id: isVisible ? "settings_pane_done_button" : "settings_pane_button_label" }),
-          onClick: this.togglePane })
-      ),
-      React.createElement(
-        "div",
-        { className: "prefs-pane" },
-        React.createElement(
-          "div",
-          { className: `sidebar ${isVisible ? "" : "hidden"}` },
-          React.createElement(
-            "div",
-            { className: "prefs-modal-inner-wrapper" },
-            React.createElement(
-              "h1",
-              null,
-              React.createElement(FormattedMessage, { id: "settings_pane_header" })
-            ),
-            React.createElement(
-              "p",
-              null,
-              React.createElement(FormattedMessage, { id: "settings_pane_body2" })
-            ),
-            React.createElement(PreferencesInput, { className: "showSearch", prefName: "showSearch", value: prefs.showSearch, onChange: this.handlePrefChange,
-              titleString: { id: "settings_pane_search_header" }, descString: { id: "settings_pane_search_body" } }),
-            React.createElement("hr", null),
-            React.createElement(PreferencesInput, { className: "showTopSites", prefName: "showTopSites", value: prefs.showTopSites, onChange: this.handlePrefChange,
-              titleString: { id: "settings_pane_topsites_header" }, descString: { id: "settings_pane_topsites_body" } }),
-            React.createElement(
-              "div",
-              { className: `options${prefs.showTopSites ? "" : " disabled"}` },
-              React.createElement(PreferencesInput, { className: "showMoreTopSites", prefName: "topSitesCount", disabled: !prefs.showTopSites,
-                value: prefs.topSitesCount !== TOP_SITES_DEFAULT_LENGTH, onChange: this.handlePrefChange,
-                titleString: { id: "settings_pane_topsites_options_showmore" }, labelClassName: "icon icon-topsites" })
-            ),
-            sections.filter(section => !section.shouldHidePref).map(({ id, title, enabled, pref }) => React.createElement(PreferencesInput, { key: id, className: "showSection", prefName: pref && pref.feed || id,
-              value: enabled, onChange: pref && pref.feed ? this.handlePrefChange : this.handleSectionChange,
-              titleString: pref && pref.titleString || title, descString: pref && pref.descString })),
-            React.createElement("hr", null),
-            React.createElement(PreferencesInput, { className: "showSnippets", prefName: "feeds.snippets",
-              value: prefs["feeds.snippets"], onChange: this.handlePrefChange,
-              titleString: { id: "settings_pane_snippets_header" },
-              descString: { id: "settings_pane_snippets_body" } })
-          ),
-          React.createElement(
-            "section",
-            { className: "actions" },
-            React.createElement(
-              "button",
-              { className: "done", onClick: this.togglePane },
-              React.createElement(FormattedMessage, { id: "settings_pane_done_button" })
-            )
-          )
-        )
-      )
-    );
-  }
-}
-
-module.exports = connect(state => ({ Prefs: state.Prefs, PreferencesPane: state.PreferencesPane, Sections: state.Sections }))(injectIntl(PreferencesPane));
-module.exports.PreferencesPane = PreferencesPane;
-module.exports.PreferencesInput = PreferencesInput;
-
-/***/ }),
-/* 28 */
+/* 29 */
 /***/ (function(module, exports) {
 
 class _PrerenderData {
   constructor(options) {
     this.initialPrefs = options.initialPrefs;
     this.initialSections = options.initialSections;
     this._setValidation(options.validation);
   }
@@ -3103,22 +3232,22 @@ var PrerenderData = new _PrerenderData({
   }]
 });
 module.exports = {
   PrerenderData,
   _PrerenderData
 };
 
 /***/ }),
-/* 29 */
+/* 30 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* WEBPACK VAR INJECTION */(function(global) {/* eslint-env mozilla/frame-script */
 
-const { createStore, combineReducers, applyMiddleware } = __webpack_require__(30);
+const { createStore, combineReducers, applyMiddleware } = __webpack_require__(31);
 const { actionTypes: at, actionCreators: ac, actionUtils: au } = __webpack_require__(0);
 
 const MERGE_STORE_ACTION = "NEW_TAB_INITIAL_STATE";
 const OUTGOING_MESSAGE_NAME = "ActivityStream:ContentToMain";
 const INCOMING_MESSAGE_NAME = "ActivityStream:MainToContent";
 
 /**
  * A higher-order function which returns a reducer that, on MERGE_STORE action,
@@ -3218,23 +3347,23 @@ module.exports = function initStore(redu
 
 module.exports.rehydrationMiddleware = rehydrationMiddleware;
 module.exports.MERGE_STORE_ACTION = MERGE_STORE_ACTION;
 module.exports.OUTGOING_MESSAGE_NAME = OUTGOING_MESSAGE_NAME;
 module.exports.INCOMING_MESSAGE_NAME = INCOMING_MESSAGE_NAME;
 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
 
 /***/ }),
-/* 30 */
+/* 31 */
 /***/ (function(module, exports) {
 
 module.exports = Redux;
 
 /***/ }),
-/* 31 */
+/* 32 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* WEBPACK VAR INJECTION */(function(global) {const { actionTypes: at } = __webpack_require__(0);
 const { perfService: perfSvc } = __webpack_require__(7);
 
 const VISIBLE = "visible";
 const VISIBILITY_CHANGE_EVENT = "visibilitychange";
 
@@ -3294,17 +3423,17 @@ module.exports = class DetectUserSession
       this._sendEvent();
       this.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
     }
   }
 };
 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
 
 /***/ }),
-/* 32 */
+/* 33 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* WEBPACK VAR INJECTION */(function(global) {const DATABASE_NAME = "snippets_db";
 const DATABASE_VERSION = 1;
 const SNIPPETS_OBJECTSTORE_NAME = "snippets";
 const SNIPPETS_UPDATE_INTERVAL_MS = 14400000; // 4 hours.
 
 const SNIPPETS_ENABLED_EVENT = "Snippets:Enabled";
--- a/browser/extensions/activity-stream/data/content/activity-stream.css
+++ b/browser/extensions/activity-stream/data/content/activity-stream.css
@@ -77,16 +77,29 @@ input {
     height: 12px;
     width: 12px; }
   .icon.icon-check {
     background-image: url("chrome://browser/skin/check.svg"); }
   .icon.icon-webextension {
     background-image: url("assets/glyph-webextension-16.svg"); }
   .icon.icon-highlights {
     background-image: url("assets/glyph-highlights-16.svg"); }
+  .icon.icon-arrowhead-down {
+    background-image: url("assets/glyph-arrowhead-down-12.svg");
+    background-size: 12px;
+    height: 12px;
+    width: 12px; }
+  .icon.icon-arrowhead-forward {
+    background-image: url("assets/glyph-arrowhead-down-12.svg");
+    background-size: 12px;
+    height: 12px;
+    transform: rotate(270deg);
+    width: 12px; }
+    .icon.icon-arrowhead-forward:dir(rtl) {
+      transform: rotate(90deg); }
 
 html,
 body,
 #root {
   height: 100%; }
 
 body {
   background: #F9F9FA;
@@ -192,30 +205,34 @@ main {
     main {
       width: 736px; } }
   main section {
     margin-bottom: 40px;
     position: relative; }
 
 .section-top-bar {
   height: 16px;
-  margin-bottom: 12px; }
+  margin-bottom: 16px; }
 
 .section-title {
   font-size: 13px;
   font-weight: bold;
   text-transform: uppercase; }
   .section-title span {
     color: #737373;
     fill: #737373;
     vertical-align: middle; }
 
 .body-wrapper {
   opacity: 0;
-  transition: opacity 75ms ease-in-out 125ms; }
+  transition: opacity 75ms ease-in-out; }
+
+@-moz-document url(about:newtab) {
+  .body-wrapper {
+    transition-delay: 125ms; } }
   .body-wrapper.on {
     opacity: 1; }
 
 .top-sites-list {
   list-style: none;
   margin: 0;
   margin-bottom: -18px;
   padding: 0;
@@ -412,21 +429,27 @@ main {
           border-right: 0; }
         .top-sites-list .top-site-outer .edit-menu button:first-child:dir(rtl) {
           border-right: 0; }
     .top-sites-list .top-site-outer:hover .edit-menu, .top-sites-list .top-site-outer:focus .edit-menu, .top-sites-list .top-site-outer.active .edit-menu {
       transform: scale(1);
       opacity: 1; }
 
 .edit-topsites-wrapper .edit-topsites-button {
+  border-right: 1px solid #D7D7DB;
+  line-height: 13px;
+  offset-inline-end: 24px;
+  opacity: 0;
+  padding: 0 10px;
   position: absolute;
-  offset-inline-end: 21px;
-  top: -2px;
-  opacity: 0;
+  top: 2px;
   transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); }
+  .edit-topsites-wrapper .edit-topsites-button:dir(rtl) {
+    border-left: 1px solid #D7D7DB;
+    border-right: 0; }
   .edit-topsites-wrapper .edit-topsites-button:focus, .edit-topsites-wrapper .edit-topsites-button:active {
     opacity: 1; }
   .edit-topsites-wrapper .edit-topsites-button button {
     background: none;
     border: 0;
     color: #737373;
     cursor: pointer;
     font-size: 12px;
@@ -519,103 +542,16 @@ section.top-sites:hover .edit-topsites-b
 @keyframes fade-up-tt {
   0% {
     opacity: 0;
     transform: translateY(15px); }
   100% {
     opacity: 1;
     transform: translateY(0); } }
 
-.section-top-bar {
-  position: relative; }
-  .section-top-bar .section-info-option {
-    offset-inline-end: 0;
-    position: absolute;
-    top: 0; }
-  .section-top-bar .info-option-icon {
-    background-image: url("assets/glyph-info-option-12.svg");
-    background-size: 12px 12px;
-    background-repeat: no-repeat;
-    background-position: center;
-    fill: rgba(12, 12, 13, 0.6);
-    -moz-context-properties: fill;
-    height: 16px;
-    width: 16px;
-    display: inline-block;
-    margin-bottom: -2px;
-    opacity: 0;
-    transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); }
-    .section-top-bar .info-option-icon:focus, .section-top-bar .info-option-icon:active {
-      opacity: 1; }
-  .section-top-bar .info-option-icon[aria-expanded="true"] {
-    fill: rgba(12, 12, 13, 0.8); }
-  .section-top-bar .section-info-option .info-option {
-    visibility: hidden;
-    opacity: 0;
-    transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); }
-    .section-top-bar .section-info-option .info-option::before {
-      content: "";
-      display: block;
-      height: 32px;
-      left: 50%;
-      position: absolute;
-      right: 0;
-      top: -32px; }
-  .section-top-bar .info-option-icon[aria-expanded="true"] + .info-option {
-    visibility: visible;
-    opacity: 1;
-    transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); }
-  .section-top-bar .info-option {
-    z-index: 9999;
-    position: absolute;
-    background: #FFF;
-    border: 1px solid #D7D7DB;
-    border-radius: 3px;
-    font-size: 13px;
-    line-height: 120%;
-    margin-inline-end: -9px;
-    offset-inline-end: 0;
-    top: 20px;
-    width: 320px;
-    padding: 24px;
-    box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1);
-    -moz-user-select: none; }
-  .section-top-bar .info-option-header {
-    font-size: 15px;
-    font-weight: 600; }
-  .section-top-bar .info-option-body {
-    margin: 0;
-    margin-top: 12px; }
-  .section-top-bar .info-option-link {
-    color: #0060DF;
-    margin-left: 7px; }
-  .section-top-bar .info-option-manage {
-    margin-top: 24px; }
-    .section-top-bar .info-option-manage button {
-      background: none;
-      border: none;
-      color: #0060DF;
-      cursor: pointer;
-      margin: 0;
-      padding: 0; }
-      .section-top-bar .info-option-manage button::after {
-        background-image: url("assets/topic-show-more-12.svg");
-        background-repeat: no-repeat;
-        content: '';
-        -moz-context-properties: fill;
-        display: inline-block;
-        fill: #0060DF;
-        height: 16px;
-        margin-inline-start: 5px;
-        margin-top: 1px;
-        vertical-align: middle;
-        width: 12px; }
-      .section-top-bar .info-option-manage button:dir(rtl)::after {
-        transform: scaleX(-1); }
-
 .sections-list .section-list {
   margin: 0;
   display: grid;
   grid-template-columns: repeat(auto-fit, 224px);
   grid-gap: 32px; }
   @media (max-width: 544px) {
     .sections-list .section-list .context-menu {
       margin-inline-start: auto;
@@ -657,19 +593,16 @@ section.top-sites:hover .edit-topsites-b
       display: block; }
     .sections-list .section-empty-state .empty-state .empty-state-message {
       margin-bottom: 0;
       font-size: 13px;
       font-weight: 300;
       color: #737373;
       text-align: center; }
 
-section.section:hover .info-option-icon {
-  opacity: 1; }
-
 .topic {
   font-size: 12px;
   color: #737373;
   margin-top: 12px;
   line-height: 1.6; }
   @media (min-width: 800px) {
     .topic {
       line-height: 16px; } }
@@ -749,17 +682,17 @@ section.section:hover .info-option-icon 
     background-size: 16px 16px;
     height: 100%;
     offset-inline-end: 0;
     position: absolute; }
     .search-wrapper .search-button:focus, .search-wrapper .search-button:hover {
       background-color: rgba(12, 12, 13, 0.1);
       cursor: pointer; }
     .search-wrapper .search-button:active {
-      background-color: rgba(12, 12, 13, 0.15); }
+      background-color: rgba(12, 12, 13, 0.2); }
     .search-wrapper .search-button:dir(rtl) {
       transform: scaleX(-1); }
   .search-wrapper .contentSearchSuggestionTable {
     border: 0;
     transform: translateY(2px); }
 
 .context-menu {
   display: block;
@@ -831,17 +764,17 @@ section.section:hover .info-option-icon 
     border: 0;
     border-bottom: 1px solid #D7D7DB;
     margin: 20px 0; }
   .prefs-pane .prefs-modal-inner-wrapper {
     padding-bottom: 100px; }
     .prefs-pane .prefs-modal-inner-wrapper section {
       margin: 20px 0; }
       .prefs-pane .prefs-modal-inner-wrapper section p {
-        margin: 5px 0 5px 30px; }
+        margin: 5px 0 20px 30px; }
       .prefs-pane .prefs-modal-inner-wrapper section label {
         display: inline-block;
         position: relative;
         width: 100%; }
         .prefs-pane .prefs-modal-inner-wrapper section label input {
           offset-inline-start: -30px;
           position: absolute;
           top: 0; }
@@ -1152,8 +1085,134 @@ section.section:hover .info-option-icon 
       display: flex;
       justify-content: space-between;
       padding: 0; } }
   .manual-migration-actions button {
     align-self: center;
     height: 26px;
     margin-inline-start: 20px;
     padding: 0 12px; }
+
+.collapsible-section .section-title .click-target {
+  cursor: pointer; }
+
+.collapsible-section .section-title .icon.icon-arrowhead-down {
+  margin: -3px 0 0 8px; }
+
+.collapsible-section .section-title .icon.icon-arrowhead-forward {
+  margin: -2px 0 0 8px; }
+
+.collapsible-section .section-top-bar {
+  position: relative; }
+  .collapsible-section .section-top-bar .section-info-option {
+    offset-inline-end: 0;
+    position: absolute;
+    top: 0; }
+  .collapsible-section .section-top-bar .info-option-icon {
+    background-image: url("assets/glyph-info-option-12.svg");
+    background-size: 12px 12px;
+    background-repeat: no-repeat;
+    background-position: center;
+    fill: rgba(12, 12, 13, 0.6);
+    -moz-context-properties: fill;
+    height: 16px;
+    width: 16px;
+    display: inline-block;
+    margin-bottom: -2px;
+    opacity: 0;
+    transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); }
+    .collapsible-section .section-top-bar .info-option-icon:focus, .collapsible-section .section-top-bar .info-option-icon:active {
+      opacity: 1; }
+  .collapsible-section .section-top-bar .info-option-icon[aria-expanded="true"] {
+    background-color: rgba(12, 12, 13, 0.1);
+    border-radius: 1px;
+    box-shadow: 0 0 0 5px rgba(12, 12, 13, 0.1);
+    fill: rgba(12, 12, 13, 0.8); }
+  .collapsible-section .section-top-bar .section-info-option .info-option {
+    visibility: hidden;
+    opacity: 0;
+    transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); }
+    .collapsible-section .section-top-bar .section-info-option .info-option::after, .collapsible-section .section-top-bar .section-info-option .info-option::before {
+      content: "";
+      offset-inline-end: 0;
+      position: absolute; }
+    .collapsible-section .section-top-bar .section-info-option .info-option::before {
+      background-image: url(chrome://global/skin/arrow/panelarrow-vertical-themed.svg), url(chrome://global/skin/arrow/panelarrow-vertical@2x.png);
+      background-position: calc(100% - 7px) bottom;
+      background-repeat: no-repeat;
+      background-size: 18px 10px;
+      height: 32px;
+      top: -32px;
+      width: 43px; }
+    .collapsible-section .section-top-bar .section-info-option .info-option:dir(rtl)::before {
+      background-position-x: 7px; }
+    .collapsible-section .section-top-bar .section-info-option .info-option::after {
+      height: 10px;
+      offset-inline-start: 0;
+      top: -10px; }
+  .collapsible-section .section-top-bar .info-option-icon[aria-expanded="true"] + .info-option {
+    visibility: visible;
+    opacity: 1;
+    transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); }
+  .collapsible-section .section-top-bar .info-option-icon:not([aria-expanded="true"]) + .info-option {
+    pointer-events: none; }
+  .collapsible-section .section-top-bar .info-option {
+    z-index: 9999;
+    position: absolute;
+    background: #FFF;
+    border: 1px solid #D7D7DB;
+    border-radius: 3px;
+    font-size: 13px;
+    line-height: 120%;
+    margin-inline-end: -9px;
+    offset-inline-end: 0;
+    top: 26px;
+    width: 320px;
+    padding: 24px;
+    box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1);
+    -moz-user-select: none; }
+  .collapsible-section .section-top-bar .info-option-header {
+    font-size: 15px;
+    font-weight: 600; }
+  .collapsible-section .section-top-bar .info-option-body {
+    margin: 0;
+    margin-top: 12px; }
+  .collapsible-section .section-top-bar .info-option-link {
+    color: #0060DF;
+    margin-left: 7px; }
+  .collapsible-section .section-top-bar .info-option-manage {
+    margin-top: 24px; }
+    .collapsible-section .section-top-bar .info-option-manage button {
+      background: none;
+      border: none;
+      color: #0060DF;
+      cursor: pointer;
+      margin: 0;
+      padding: 0; }
+      .collapsible-section .section-top-bar .info-option-manage button::after {
+        background-image: url("assets/topic-show-more-12.svg");
+        background-repeat: no-repeat;
+        content: '';
+        -moz-context-properties: fill;
+        display: inline-block;
+        fill: #0060DF;
+        height: 16px;
+        margin-inline-start: 5px;
+        margin-top: 1px;
+        vertical-align: middle;
+        width: 12px; }
+      .collapsible-section .section-top-bar .info-option-manage button:dir(rtl)::after {
+        transform: scaleX(-1); }
+
+.collapsible-section .section-body {
+  max-height: 900px;
+  margin-inline-end: -7px; }
+  .collapsible-section .section-body.animation-enabled {
+    transition: max-height 0.5s cubic-bezier(0.07, 0.95, 0, 1); }
+  .collapsible-section .section-body.animating {
+    overflow: hidden; }
+
+.collapsible-section.collapsed .section-body {
+  max-height: 0;
+  overflow: hidden; }
+
+.collapsible-section:hover .info-option-icon {
+  opacity: 1; }
new file mode 100644
--- /dev/null
+++ b/browser/extensions/activity-stream/data/content/assets/glyph-arrowhead-down-12.svg
@@ -0,0 +1,1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><path class="cls-1" d="M6 9a1 1 0 0 1-.707-.293l-3-3a1 1 0 0 1 1.414-1.414L6 6.586l2.293-2.293a1 1 0 0 1 1.414 1.414l-3 3A1 1 0 0 1 6 9z" fill="context-fill"/></svg>
\ No newline at end of file
--- a/browser/extensions/activity-stream/data/locales.json
+++ b/browser/extensions/activity-stream/data/locales.json
@@ -1,14 +1,15 @@
 {
   "ach": {
     "newtab_page_title": "Dirica matidi manyen",
     "default_label_loading": "Tye ka cano…",
     "header_top_sites": "Kakube maloyo",
     "header_stories": "Lok madito",
+    "header_highlights": "Wiye madito",
     "header_visit_again": "Lim doki",
     "header_bookmarks": "Alamabuk ma cok coki",
     "header_recommended_by": "Lami tam obedo {provider}",
     "header_bookmarks_placeholder": "Pud i pee ki alamabuk.",
     "header_stories_from": "ki bot",
     "type_label_visited": "Kilimo",
     "type_label_bookmarked": "Kiketo alamabuk",
     "type_label_synced": "Kiribo ki i nyonyo mukene",
@@ -30,34 +31,43 @@
     "confirm_history_delete_notice_p2": "Pe ki twero gonyo tic man.",
     "menu_action_save_to_pocket": "Gwoki i jaba",
     "search_for_something_with": "Yeny pi {search_term} ki:",
     "search_button": "Yeny",
     "search_header": "Yeny me {search_engine_name}",
     "search_web_placeholder": "Yeny kakube",
     "search_settings": "Lok ter me yeny",
     "section_info_option": "Ngec",
+    "section_info_send_feedback": "Cwal adwogi",
+    "section_info_privacy_notice": "Ngec me mung",
     "welcome_title": "Wajoli i dirica matidi manyen",
     "welcome_body": "Firefox bi tic ki kabedo man me nyuto alamabukke mamegi, coc akwana, vidio, ki potbukke ma ilimo cokcoki ma pi gi tego loyo, wek i dok ii gi ma yot.",
     "welcome_label": "Tye ka kube ki wiye madito mamegi",
     "time_label_less_than_minute": "<dakika1",
     "time_label_minute": "dakika{number}",
     "time_label_hour": "cawa{number}",
     "time_label_day": "nino{number}",
     "settings_pane_button_label": "Yub potbuk me dirica matidi mamegi manyen",
     "settings_pane_header": "Ter me dirica matidi manyen",
+    "settings_pane_body2": "Yer ngo ma i neno i potbuk man.",
     "settings_pane_search_header": "Yeny",
     "settings_pane_search_body": "Yeny Kakube ki i dirica ni matidi manyen.",
     "settings_pane_topsites_header": "Kakube ma gi loyo",
     "settings_pane_topsites_body": "Nong kakube ma ilimo loyo.",
     "settings_pane_topsites_options_showmore": "Nyut rek ariyo",
     "settings_pane_bookmarks_header": "Alamabuk ma cocoki",
     "settings_pane_bookmarks_body": "Alamabukke ni ma kicweyo manyen i kabedo acel macek.",
     "settings_pane_visit_again_header": "Lim Kidoco",
     "settings_pane_visit_again_body": "Firefox bi nyuti but gin mukato me yeny mamegi ma itwero mito me poo ikome onyo dok cen iyie.",
+    "settings_pane_highlights_header": "Wiye madito",
+    "settings_pane_highlights_body2": "Nong yoo ni cen i jami mamit ma ilimo gi cokcokki onyo iketo alamabuk.",
+    "settings_pane_highlights_options_bookmarks": "Alamabuk",
+    "settings_pane_highlights_options_visited": "Kakube ma kilimo",
+    "settings_pane_snippets_header": "Kwena macek",
+    "settings_pane_snippets_body": "Kwan ngec manyen macego dok mamit ki bot Mozilla ikom Firefox, kwo me intanet, ki meme mabino atata.",
     "settings_pane_done_button": "Otum",
     "edit_topsites_button_text": "Yubi",
     "edit_topsites_button_label": "Yub bute pi kakubi ni ma giloyo",
     "edit_topsites_showmore_button": "Nyut mukene",
     "edit_topsites_showless_button": "Nyut manok",
     "edit_topsites_done_button": "Otum",
     "edit_topsites_pin_button": "Mwon kakube man",
     "edit_topsites_unpin_button": "War kakube man",
@@ -70,18 +80,20 @@
     "topsites_form_url_placeholder": "Coo onyo mwon URL",
     "topsites_form_add_button": "Medi",
     "topsites_form_save_button": "Gwoki",
     "topsites_form_cancel_button": "Kwer",
     "topsites_form_url_validation": "URL ma tye atir mite",
     "pocket_read_more": "Lok macuk gi lamal:",
     "pocket_read_even_more": "Nen Lok mapol",
     "pocket_feedback_header": "Kakube maber loyo, dano makato milion 25 aye oyubo.",
+    "pocket_description": "Nong jami me rwom ma lamal ma itwero keng woko, ki kony ma aa ki bot Pocket, dong tye but Mozilla.",
     "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.",
+    "manual_migration_explanation2": "Tem Firefox ki alamabuk, gin mukato ki mung me donyo ki ii layeny mukene.",
     "manual_migration_cancel_button": "Pe Apwoyo",
     "manual_migration_import_button": "Kel kombedi"
   },
   "ar": {
     "newtab_page_title": "لسان جديد",
     "default_label_loading": "يُحمّل…",
     "header_top_sites": "المواقع الأكثر زيارة",
     "header_stories": "أهم الأخبار",
@@ -158,20 +170,64 @@
     "pocket_feedback_header": "أفضل ما في الوِب، انتقاها أكثر من ٢٥ مليون شخص.",
     "pocket_feedback_body": "يساعدك Pocket –عضو في أسرة موزيلا– على الوصول إلى محتوى عالِ الجودة ربما لم يُكن ليتاح لك بدونه.",
     "pocket_send_feedback": "أرسل انطباعك"
   },
   "ast": {
     "newtab_page_title": "Llingüeta nueva",
     "default_label_loading": "Cargando…",
     "header_top_sites": "Sitios destacaos",
+    "header_stories": "Histories destacaes",
+    "header_highlights": "Los destacaos",
+    "header_visit_again": "Visitar de nueves",
+    "header_bookmarks": "Marcadores recientes",
+    "header_bookmarks_placeholder": "Entá nun tienes dengún marcador.",
+    "header_stories_from": "de",
+    "type_label_visited": "Visitóse",
+    "type_label_bookmarked": "Amestóse a marcadores",
+    "type_label_synced": "Sincronizóse dende otru preséu",
+    "type_label_recommended": "Tendencia",
     "type_label_open": "Abrir",
     "type_label_topic": "Tema",
-    "welcome_title": "Bienllegáu/ada a la llingüeta nueva",
-    "welcome_body": "Firefox usará esti espaciu p'amosate los marcadores, artículos, vídeos y páxines más relevantes de los que visitares apocayá, asina pues volver a ello de mou cenciellu."
+    "type_label_now": "Agora",
+    "menu_action_bookmark": "Amestar a marcadores",
+    "menu_action_remove_bookmark": "Desaniciar marcador",
+    "menu_action_copy_address": "Copiar direición",
+    "menu_action_email_link": "Unviar enllaz per corréu…",
+    "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",
+    "search_for_something_with": "Guetar {search_term} con:",
+    "search_button": "Guetar",
+    "search_header": "Gueta en {search_engine_name}",
+    "search_web_placeholder": "Guetar na web",
+    "search_settings": "Camudar axustes de gueta",
+    "section_info_option": "Información",
+    "section_info_send_feedback": "Unviar comentarios",
+    "section_info_privacy_notice": "Nota de privacidá",
+    "welcome_title": "Afáyate na llingüeta nueva",
+    "welcome_body": "Firefox usará esti espaciu p'amosate los marcadores, artículos, vídeos y páxines más relevantes que visitares apocayá, asina pues volver a ellos de mou cenciellu.",
+    "time_label_less_than_minute": "<1m",
+    "time_label_minute": "{number}m",
+    "time_label_hour": "{number}h",
+    "time_label_day": "{number}d",
+    "settings_pane_done_button": "Fecho",
+    "edit_topsites_showmore_button": "Amosar más",
+    "edit_topsites_done_button": "Fecho",
+    "topsites_form_add_button": "Amestar",
+    "topsites_form_save_button": "Guardar",
+    "topsites_form_cancel_button": "Encaboxar",
+    "pocket_read_more": "Temes populares:",
+    "pocket_read_even_more": "Ver más histories"
   },
   "az": {
     "newtab_page_title": "Yeni Vərəq",
     "default_label_loading": "Yüklənir…",
     "header_top_sites": "Qabaqcıl Saytlar",
     "header_stories": "Qabaqcıl Hekayələr",
     "header_highlights": "Seçilmişlər",
     "header_visit_again": "Təkrar ziyarət et",
@@ -621,16 +677,109 @@
     "pocket_feedback_header": "Ar gwellañ eus ar web, dibabet gant ouzhpenn 25 milion a dud.",
     "pocket_description": "Dizoloit pennadoù eus an dibab ho pije gellout c'hwitout a-hent all warno, a-drugarez da bPocket, hag a zo bremañ ul lodenn deus Mozilla.",
     "highlights_empty_state": "Krogit da verdeiñ hag e tiskouezimp deoc’h pennadoù, videoioù ha pajennoù all gweladennet pe lakaet er sinedoù nevez ’zo.",
     "topstories_empty_state": "Aet oc'h betek penn. Distroit diwezhatoc'h evit muioc’h a istorioù digant {provider}. N’oc'h ket evit gortoz? Dibabit un danvez brudet evit klask muioc’h a bennadoù dedennus eus pep lec’h er web.",
     "manual_migration_explanation2": "Amprouit Firefox gant sinedoù, roll istor ha gerioù-tremen ur merdeer all.",
     "manual_migration_cancel_button": "N'am bo ket",
     "manual_migration_import_button": "Emporzhiañ bremañ"
   },
+  "bs": {
+    "newtab_page_title": "Novi tab",
+    "default_label_loading": "Učitavam…",
+    "header_top_sites": "Najbolje stranice",
+    "header_stories": "Najbolje priče",
+    "header_highlights": "Istaknuto",
+    "header_visit_again": "Posjeti ponovo",
+    "header_bookmarks": "Nedavne zabilješke",
+    "header_recommended_by": "Preporučeno od {provider}",
+    "header_bookmarks_placeholder": "Nemate nijednu zabilješku.",
+    "header_stories_from": "od",
+    "type_label_visited": "Posjećeno",
+    "type_label_bookmarked": "Zabilježeno",
+    "type_label_synced": "Sinhronizovano s drugog uređaja",
+    "type_label_recommended": "Popularno",
+    "type_label_open": "Otvoreno",
+    "type_label_topic": "Tema",
+    "type_label_now": "Sada",
+    "menu_action_bookmark": "Zabilježi",
+    "menu_action_remove_bookmark": "Ukloni zabilješku",
+    "menu_action_copy_address": "Kopiraj adresu",
+    "menu_action_email_link": "Pošalji vezu e-poštom…",
+    "menu_action_open_new_window": "Otvori u novom prozoru",
+    "menu_action_open_private_window": "Otvori u novom privatnom prozoru",
+    "menu_action_dismiss": "Odbaci",
+    "menu_action_delete": "Izbriši iz historije",
+    "menu_action_pin": "Zakači",
+    "menu_action_unpin": "Otkači",
+    "confirm_history_delete_p1": "Jeste li sigurni da želite izbrisati sve primjere ove stranice iz vaše historije?",
+    "confirm_history_delete_notice_p2": "Ova radnja se ne može opozvati.",
+    "menu_action_save_to_pocket": "Sačuvaj na Pocket",
+    "search_for_something_with": "Traži za {search_term} sa:",
+    "search_button": "Traži",
+    "search_header": "{search_engine_name} pretraga",
+    "search_web_placeholder": "Pretraži web",
+    "search_settings": "Promijeni postavke pretrage",
+    "section_info_option": "Informacije",
+    "section_info_send_feedback": "Pošaljite povratnu informaciju",
+    "section_info_privacy_notice": "Napomena o privatnosti",
+    "welcome_title": "Dobrodošli u novi tab",
+    "welcome_body": "Firefox će koristiti ovaj prostor da vam prikaže vaše najrelevantnije zabilješke, članke, video i stranice koje ste nedavno posjetili, da bi im mogli lahko ponovo pristupiti.",
+    "welcome_label": "Identificiram vaše istaknute stavke",
+    "time_label_less_than_minute": "<1m",
+    "time_label_minute": "{number}m",
+    "time_label_hour": "{number}h",
+    "time_label_day": "{number}d",
+    "settings_pane_button_label": "Prilagodite svoju početnu stranicu novog taba",
+    "settings_pane_header": "Postavke novog taba",
+    "settings_pane_body2": "Izaberite šta želite vidjeti na ovoj stranici.",
+    "settings_pane_search_header": "Traži",
+    "settings_pane_search_body": "Pretražite web iz novog taba.",
+    "settings_pane_topsites_header": "Najbolje stranice",
+    "settings_pane_topsites_body": "Pristupite stranicama koje najčešće posjećujete.",
+    "settings_pane_topsites_options_showmore": "Prikaži dva reda",
+    "settings_pane_bookmarks_header": "Nedavne zabilješke",
+    "settings_pane_bookmarks_body": "Vaše novo stvorene zabilješke na jednom praktičnom mjestu.",
+    "settings_pane_visit_again_header": "Posjetite ponovo",
+    "settings_pane_visit_again_body": "Firefox će vam prikazati dijelove vaše historije pretraživanja koje možda želite zapamtiti ili posjetiti ponovo.",
+    "settings_pane_highlights_header": "Istaknuto",
+    "settings_pane_highlights_body2": "Pronađite put natrag do zanimljivih stvari koje ste nedavno posjetili ili zabilježili.",
+    "settings_pane_highlights_options_bookmarks": "Zabilješke",
+    "settings_pane_highlights_options_visited": "Posjećene stranice",
+    "settings_pane_snippets_header": "Isječci",
+    "settings_pane_snippets_body": "Pročitajte kratke i slatke obavijesti od Mozille o Firefoxu, internet kulturi i povremenim nasumičnim temama.",
+    "settings_pane_done_button": "Gotovo",
+    "edit_topsites_button_text": "Uredi",
+    "edit_topsites_button_label": "Prilagodite odjel s najboljim stranicama",
+    "edit_topsites_showmore_button": "Prikaži više",
+    "edit_topsites_showless_button": "Prikaži manje",
+    "edit_topsites_done_button": "Gotovo",
+    "edit_topsites_pin_button": "Zakači ovu stranicu",
+    "edit_topsites_unpin_button": "Otkači ovu stranicu",
+    "edit_topsites_edit_button": "Uredi ovu stranicu",
+    "edit_topsites_dismiss_button": "Odbaci ovu stranicu",
+    "edit_topsites_add_button": "Dodaj",
+    "topsites_form_add_header": "Nova najbolja stranica",
+    "topsites_form_edit_header": "Uredi najbolju stranicu",
+    "topsites_form_title_placeholder": "Unesi naslov",
+    "topsites_form_url_placeholder": "Upišite ili zalijepite URL",
+    "topsites_form_add_button": "Dodaj",
+    "topsites_form_save_button": "Sačuvaj",
+    "topsites_form_cancel_button": "Otkaži",
+    "topsites_form_url_validation": "Potrebno je unijeti ispravan URL",
+    "pocket_read_more": "Popularne teme:",
+    "pocket_read_even_more": "Prikaži više priča",
+    "pocket_feedback_header": "Najbolje od interneta, birano od preko 25 miliona ljudi.",
+    "pocket_description": "Otkrijte visoko kvalitetan sadržaj koji ste možda propustili, uz pomoć Pocketa koji je sada dio Mozille.",
+    "highlights_empty_state": "Započnite pretraživati i pokazat ćemo vam neke od izvrsnih članaka, videa i drugih web stranica prema vašim nedavno posjećenim stranicama ili zabilješkama.",
+    "topstories_empty_state": "Provjerite kasnije za više najpopularnijih priča od {provider}. Ne možete čekati? Odaberite popularne teme kako biste pronašli više kvalitetnih priča s cijelog weba.",
+    "manual_migration_explanation2": "Probajte Firefox s zabilješkama, historijom i lozinkama iz drugog pretraživača.",
+    "manual_migration_cancel_button": "Ne, hvala",
+    "manual_migration_import_button": "Uvezi sada"
+  },
   "ca": {
     "newtab_page_title": "Pestanya nova",
     "default_label_loading": "S'està carregant…",
     "header_top_sites": "Llocs principals",
     "header_stories": "Articles populars",
     "header_highlights": "Destacats",
     "header_visit_again": "Torneu a visitar",
     "header_bookmarks": "Adreces d'interès recents",
@@ -994,17 +1143,17 @@
     "manual_migration_cancel_button": "Dim Diolch",
     "manual_migration_import_button": "Mewnforio Nawr"
   },
   "da": {
     "newtab_page_title": "Nyt faneblad",
     "default_label_loading": "Indlæser…",
     "header_top_sites": "Mest besøgte websider",
     "header_stories": "Tophistorier",
-    "header_highlights": "Højdepunkter",
+    "header_highlights": "Fremhævede",
     "header_visit_again": "Besøg igen",
     "header_bookmarks": "Seneste bogmærker",
     "header_recommended_by": "Anbefalet af {provider}",
     "header_bookmarks_placeholder": "Du har ingen bogmærker endnu.",
     "header_stories_from": "fra",
     "type_label_visited": "Besøgt",
     "type_label_bookmarked": "Bogmærket",
     "type_label_synced": "Synkroniseret fra en anden enhed",
@@ -1027,34 +1176,42 @@
     "menu_action_save_to_pocket": "Gem til Pocket",
     "search_for_something_with": "Søg efter {search_term} med:",
     "search_button": "Søg",
     "search_header": "{search_engine_name}-søgning",
     "search_web_placeholder": "Søg på internettet",
     "search_settings": "Skift søgeindstillinger",
     "section_info_option": "Info",
     "section_info_send_feedback": "Send feedback",
+    "section_info_privacy_notice": "Privatlivspolitik",
     "welcome_title": "Velkommen til nyt faneblad",
     "welcome_body": "Firefox vil bruge denne plads til at vise dine mest relevante bogmærker, artikler, videoer og sider, du har besøgt for nylig - så kan du nemmere finde dem.",
-    "welcome_label": "Finder dine højdepunkter",
+    "welcome_label": "Finder dine vigtigste sider",
     "time_label_less_than_minute": "<1 m.",
     "time_label_minute": "{number} m.",
     "time_label_hour": "{number} t.",
     "time_label_day": "{number} d.",
     "settings_pane_button_label": "Tilpas siden Nyt faneblad",
     "settings_pane_header": "Indstillinger for Nyt faneblad",
+    "settings_pane_body2": "Vælg, hvad du vil se på denne side.",
     "settings_pane_search_header": "Søgning",
     "settings_pane_search_body": "Søg på nettet fra Nyt faneblad.",
     "settings_pane_topsites_header": "Mest besøgte websider",
     "settings_pane_topsites_body": "Adgang til de websider, du besøger oftest.",
     "settings_pane_topsites_options_showmore": "Vis to rækker",
     "settings_pane_bookmarks_header": "Seneste bogmærker",
     "settings_pane_bookmarks_body": "Dine seneste bogmærker samlet ét sted.",
     "settings_pane_visit_again_header": "Besøg igen",
     "settings_pane_visit_again_body": "Firefox viser dig dele af din browserhistorik, som du måske vil huske på eller vende tilbage til.",
+    "settings_pane_highlights_header": "Fremhævede",
+    "settings_pane_highlights_body2": "Find tilbage til interessant indhold, du har besøgt eller gemt et bogmærke til for nylig.",
+    "settings_pane_highlights_options_bookmarks": "Bogmærker",
+    "settings_pane_highlights_options_visited": "Besøgte websider",
+    "settings_pane_snippets_header": "Notitser",
+    "settings_pane_snippets_body": "Læs korte opdateringer fra Mozilla om Firefox, internet-kultur og lidt underholdning fra tid til anden.",
     "settings_pane_done_button": "Færdig",
     "edit_topsites_button_text": "Rediger",
     "edit_topsites_button_label": "Tilpas afsnittet Mest besøgte websider",
     "edit_topsites_showmore_button": "Vis flere",
     "edit_topsites_showless_button": "Vis færre",
     "edit_topsites_done_button": "Færdig",
     "edit_topsites_pin_button": "Fastgør denne webside",
     "edit_topsites_unpin_button": "Frigør denne webside",
@@ -1067,17 +1224,20 @@
     "topsites_form_url_placeholder": "Indtast eller indsæt en URL",
     "topsites_form_add_button": "Tilføj",
     "topsites_form_save_button": "Gem",
     "topsites_form_cancel_button": "Annuller",
     "topsites_form_url_validation": "Gyldig URL påkrævet",
     "pocket_read_more": "Populære emner:",
     "pocket_read_even_more": "Se flere historier",
     "pocket_feedback_header": "Det bedste fra nettet, udvalgt af mere end 25 millioner mennesker.",
+    "pocket_description": "Opdag indhold af høj kvalitet, som du måske ellers ikke ville have opdaget. Indholdet kommer fra Pocket, der nu er en del af Mozilla.",
+    "highlights_empty_state": "Gå i gang med at browse, så vil vi vise dig nogle af de artikler, videoer og andre sider, du har besøgt eller gemt et bogmærke til for nylig.",
     "topstories_empty_state": "Der er ikke flere nye historier. Kom tilbage senere for at se flere tophistorier fra {provider}. Kan du ikke vente? Vælg et populært emne og find flere spændende historier fra hele verden.",
+    "manual_migration_explanation2": "Prøv Firefox med bogmærkerne, historikken og adgangskoderne fra en anden browser.",
     "manual_migration_cancel_button": "Nej tak",
     "manual_migration_import_button": "Importer nu"
   },
   "de": {
     "newtab_page_title": "Neuer Tab",
     "default_label_loading": "Wird geladen…",
     "header_top_sites": "Meistbesuchte Seiten",
     "header_stories": "Meistgelesene Meldungen",
@@ -2399,17 +2559,17 @@
     "welcome_body": "Firefox utilisera cet espace pour afficher des éléments pertinents, comme des marque-pages, des articles, des vidéos, et des pages que vous avez visitées, afin que vous les retrouviez facilement.",
     "welcome_label": "Identification des éléments-clés",
     "time_label_less_than_minute": "<1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} h",
     "time_label_day": "{number} j",
     "settings_pane_button_label": "Personnaliser la page Nouvel onglet",
     "settings_pane_header": "Préférences Nouvel onglet",
-    "settings_pane_body2": "Choisissez les éléments à afficher sur cette page.",
+    "settings_pane_body2": "Choisissez les éléments à afficher sur la page.",
     "settings_pane_search_header": "Recherche",
     "settings_pane_search_body": "Effectuez une recherche sur le Web depuis le nouvel onglet.",
     "settings_pane_topsites_header": "Sites les plus visités",
     "settings_pane_topsites_body": "Accédez aux sites que vous consultez le plus.",
     "settings_pane_topsites_options_showmore": "Afficher deux lignes",
     "settings_pane_bookmarks_header": "Marque-pages récents",
     "settings_pane_bookmarks_body": "Vos nouveaux marque-pages, facilement accessibles.",
     "settings_pane_visit_again_header": "Visiter à nouveau",
@@ -3280,29 +3440,29 @@
   },
   "ia": {
     "newtab_page_title": "Nove scheda",
     "default_label_loading": "Cargante…",
     "header_top_sites": "Sitos popular",
     "header_stories": "Historias popular",
     "header_highlights": "In evidentia",
     "header_visit_again": "Visita de novo",
-    "header_bookmarks": "Paginas marcate recentemente",
+    "header_bookmarks": "Marcapaginas recente",
     "header_recommended_by": "Recommendate per {provider}",
-    "header_bookmarks_placeholder": "Tu ha ancora nulle paginas marcate.",
+    "header_bookmarks_placeholder": "Tu ha ancora nulle marcapaginas.",
     "header_stories_from": "de",
     "type_label_visited": "Visitate",
-    "type_label_bookmarked": "Marcate",
+    "type_label_bookmarked": "Marcapaginas addite",
     "type_label_synced": "Synchronisate de altere apparato",
     "type_label_recommended": "Tendentias",
     "type_label_open": "Aperite",
     "type_label_topic": "Subjecto",
     "type_label_now": "Ora",
-    "menu_action_bookmark": "Marcar le pagina",
-    "menu_action_remove_bookmark": "Dismarcar le pagina",
+    "menu_action_bookmark": "Adder marcapaginas",
+    "menu_action_remove_bookmark": "Remover le marcapaginas",
     "menu_action_copy_address": "Copiar le adresse",
     "menu_action_email_link": "Inviar le ligamine per email…",
     "menu_action_open_new_window": "Aperir in un nove fenestra",
     "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",
@@ -3313,37 +3473,37 @@
     "search_button": "Cercar",
     "search_header": "Recerca {search_engine_name}",
     "search_web_placeholder": "Cercar in le Web",
     "search_settings": "Cambiar le parametros de recerca",
     "section_info_option": "Informationes",
     "section_info_send_feedback": "Inviar feedback",
     "section_info_privacy_notice": "Advertentia de privacitate",
     "welcome_title": "Benvenite al nove scheda",
-    "welcome_body": "Firefox usara iste spatio pro monstrar tu paginas marcate le plus relevante, articulos, videos e paginas que tu ha visitate recentemente, de sorta que tu pote revider los facilemente.",
+    "welcome_body": "Firefox usara iste spatio pro monstrar tu marcapaginas le plus relevante, articulos, videos e paginas que tu ha visitate recentemente, de sorta que tu pote revider los facilemente.",
     "welcome_label": "Identificante tu evidentias",
     "time_label_less_than_minute": "<1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} h",
     "time_label_day": "{number} d",
     "settings_pane_button_label": "Personalisar tu pagina de nove scheda",
     "settings_pane_header": "Preferentias de nove scheda",
     "settings_pane_body2": "Selige lo que tu vole vider in iste pagina.",
     "settings_pane_search_header": "Cercar",
     "settings_pane_search_body": "Cercar in le Web ab tu nove scheda.",
     "settings_pane_topsites_header": "Sitos popular",
     "settings_pane_topsites_body": "Acceder al sitos web que tu plus visita.",
     "settings_pane_topsites_options_showmore": "Monstrar duo lineas",
-    "settings_pane_bookmarks_header": "Paginas marcate recentemente",
-    "settings_pane_bookmarks_body": "Tu paginas marcate recentemente a un sol loco.",
+    "settings_pane_bookmarks_header": "Marcapaginas recente",
+    "settings_pane_bookmarks_body": "Tu marcapaginas le plus recente a un sol loco.",
     "settings_pane_visit_again_header": "Visitar de novo",
     "settings_pane_visit_again_body": "Firefox te monstrara partes de tu chronologia de navigation que tu pote voler rememorar o visitar novemente.",
     "settings_pane_highlights_header": "In evidentia",
-    "settings_pane_highlights_body2": "Retrova cosas interessante que tu ha recentemente visitate o marcate.",
-    "settings_pane_highlights_options_bookmarks": "Paginas marcate",
+    "settings_pane_highlights_body2": "Retrova cosas interessante que tu ha recentemente visitate o addite marcapaginas.",
+    "settings_pane_highlights_options_bookmarks": "Marcapaginas",
     "settings_pane_highlights_options_visited": "Sitos visitate",
     "settings_pane_snippets_header": "Breve novas",
     "settings_pane_snippets_body": "Lege breve e legier novas de Mozilla super Firefox, cultura internet e occasionalmente super alcun meme.",
     "settings_pane_done_button": "Facite",
     "edit_topsites_button_text": "Editar",
     "edit_topsites_button_label": "Personalisar tu section de sitos popular",
     "edit_topsites_showmore_button": "Monstrar plus",
     "edit_topsites_showless_button": "Monstrar minus",
@@ -3360,19 +3520,19 @@
     "topsites_form_add_button": "Adder",
     "topsites_form_save_button": "Salvar",
     "topsites_form_cancel_button": "Cancellar",
     "topsites_form_url_validation": "Il es necessari un URL valide",
     "pocket_read_more": "Subjectos popular:",
     "pocket_read_even_more": "Vider plus historias",
     "pocket_feedback_header": "Le melior del web, selectionate per 25 milliones de personas.",
     "pocket_description": "Discoperir contento de alte qualitate que tu poterea alteremente non cognoscer, con le adjuta de Pocket, ora parte de Mozilla.",
-    "highlights_empty_state": "Comencia navigar e nos te monstrara alcun del grande articulos, videos e altere paginas que tu ha recentemente visitate o marcate hic.",
+    "highlights_empty_state": "Comencia navigar e nos te monstrara alcun del grande articulos, videos e altere paginas que tu ha recentemente visitate o addite marcapaginas hic.",
     "topstories_empty_state": "Tu ja es in die con toto. Reveni plus tarde pro plus historias popular de {provider}. Non vole attender? Selectiona un subjecto popular pro trovar plus altere historias interessante del web.",
-    "manual_migration_explanation2": "Essaya Firefox con le paginas marcate, le chronologia e le contrasignos de altere navigator.",
+    "manual_migration_explanation2": "Essaya Firefox con le marcapaginas, le chronologia e le contrasignos de un altere navigator.",
     "manual_migration_cancel_button": "No, gratias",
     "manual_migration_import_button": "Importar ora"
   },
   "id": {
     "newtab_page_title": "Tab Baru",
     "default_label_loading": "Memuat…",
     "header_top_sites": "Situs Teratas",
     "header_stories": "Cerita Utama",
@@ -3650,17 +3810,17 @@
     "manual_migration_cancel_button": "今はしない",
     "manual_migration_import_button": "今すぐインポート"
   },
   "ka": {
     "newtab_page_title": "ახალი ჩანართი",
     "default_label_loading": "იტვირთება…",
     "header_top_sites": "რჩეული საიტები",
     "header_stories": "რჩეული სტატიები",
-    "header_highlights": "მნიშნველოვანი სიახლეები",
+    "header_highlights": "მნიშვნელოვანი საიტები",
     "header_visit_again": "ხელახლა ნახვა",
     "header_bookmarks": "ბოლოს ჩანიშნულები",
     "header_recommended_by": "რეკომენდებულია {provider}-ის მიერ",
     "header_bookmarks_placeholder": "სანიშნეები ჯერ არაა დამატებული.",
     "header_stories_from": "-იდან",
     "type_label_visited": "მონახულებული",
     "type_label_bookmarked": "ჩანიშნული",
     "type_label_synced": "სხვა მოწყობილობიდან დასინქრონებული",
@@ -3686,44 +3846,44 @@
     "search_header": "{search_engine_name} -ში ძიება",
     "search_web_placeholder": "ინტერნეტში ძიება",
     "search_settings": "ძიების პარამეტრების შეცვლა",
     "section_info_option": "ინფორმაცია",
     "section_info_send_feedback": "უკუკავშირი",
     "section_info_privacy_notice": "პირადი მონაცემების დაცვა",
     "welcome_title": "მოგესალმებით ახალ ჩანართზე",
     "welcome_body": "Firefox ამ სივრცეს გამოიყენებს თქვენთვის ყველაზე საჭირო სანიშნეების, სტატიების, ვიდეოებისა და ბოლოს მონახულებული გვერდებისთვის, რომ ადვილად შეძლოთ მათზე დაბრუნება.",
-    "welcome_label": "რჩეული ვებგვერდების დადგენა",
+    "welcome_label": "მნიშვნელოვანი საიტების დადგენა",
     "time_label_less_than_minute": "<1წთ",
     "time_label_minute": "{number}წთ",
     "time_label_hour": "{number}სთ",
     "time_label_day": "{number}დღე",
     "settings_pane_button_label": "მოირგეთ ახალი ჩანართის გვერდი",
     "settings_pane_header": "ახალი ჩანართის პარამეტრები",
     "settings_pane_body2": "მიუთითეთ, რისი ხილვა გსურთ ამ გვერდზე.",
     "settings_pane_search_header": "ძიება",
     "settings_pane_search_body": "ძიება ინტერნეტში ახალი ჩანართიდან.",
     "settings_pane_topsites_header": "რჩეული საიტები",
     "settings_pane_topsites_body": "წვდომა ხშირად მონახულებულ საიტებთან.",
     "settings_pane_topsites_options_showmore": "ორ რიგად ჩვენება",
     "settings_pane_bookmarks_header": "ბოლოს ჩანიშნულები",
     "settings_pane_bookmarks_body": "ახლად შექმნილი სანიშნეები, ერთი ხელის გაწვდენაზე.",
     "settings_pane_visit_again_header": "ხელახლა ნახვა",
     "settings_pane_visit_again_body": "Firefox გაჩვენებთ მონახულებული გვერდების ისტორიიდან იმას, რისი გახსენებაც ან რაზე დაბრუნებაც გენდომებათ.",
-    "settings_pane_highlights_header": "მნიშნველოვანი სიახლეები",
-    "settings_pane_highlights_body2": "მარტივად დაუბრუნდით ბოლოს მონახულებულ, ან ჩანიშნულ საიტებს.",
+    "settings_pane_highlights_header": "მნიშვნელოვანი საიტები",
+    "settings_pane_highlights_body2": "მარტივად დაუბრუნდით ბოლოს მონახულებულ, ან ჩანიშნულ გვერდებს.",
     "settings_pane_highlights_options_bookmarks": "სანიშნეები",
     "settings_pane_highlights_options_visited": "მონახულებული საიტები",
     "settings_pane_snippets_header": "ცნობები",
     "settings_pane_snippets_body": "გაეცანით მოკლე, საინტერესო სიახლეებს Mozilla-სგან, Firefox-ის, ინტერნეტ სამყაროს მიღწევებისა და სხვა დასამახსოვრებელი ფაქტების შესახებ.",
     "settings_pane_done_button": "მზადაა",
     "edit_topsites_button_text": "ჩასწორება",
     "edit_topsites_button_label": "მოირგეთ რჩეული საიტების განყოფილება",
-    "edit_topsites_showmore_button": "მეტის ჩვენება",
-    "edit_topsites_showless_button": "ნაკლების ჩვენება",
+    "edit_topsites_showmore_button": "მეტის გამოჩენა",
+    "edit_topsites_showless_button": "ნაკლების გამოჩენა",
     "edit_topsites_done_button": "მზადაა",
     "edit_topsites_pin_button": "საიტის მიმაგრება",
     "edit_topsites_unpin_button": "მიმაგრების მოხსნა",
     "edit_topsites_edit_button": "საიტის ჩასწორება",
     "edit_topsites_dismiss_button": "საიტის დამალვა",
     "edit_topsites_add_button": "დამატება",
     "topsites_form_add_header": "ახალი საიტი რჩეულებში",
     "topsites_form_edit_header": "რჩეული საიტების ჩასწორება",
@@ -4303,17 +4463,17 @@
     "time_label_minute": "{number} м",
     "time_label_hour": "{number} ч",
     "time_label_day": "{number} д",
     "settings_pane_button_label": "Прилагодете ја страницата на вашето Ново јазиче",
     "settings_pane_header": "Преференци за Ново јазиче",
     "settings_pane_body2": "Изберете што ќе гледате на оваа страница.",
     "settings_pane_search_header": "Пребарување",
     "settings_pane_search_body": "Пребарајте низ Интернет од вашето ново јазиче.",
-    "settings_pane_topsites_header": "Врвни мрежни места",
+    "settings_pane_topsites_header": "Популарни мрежни места",
     "settings_pane_topsites_body": "Пристапете до мрежните места што ги посетувате најмногу.",
     "settings_pane_topsites_options_showmore": "Прикажи два реда",
     "settings_pane_bookmarks_header": "Скорешни обележувачи",
     "settings_pane_bookmarks_body": "Вашите нови обележувачи во едно згодно место.",
     "settings_pane_visit_again_header": "Посети повторно",
     "settings_pane_visit_again_body": "Firefox ќе прикаже делови од вашата историја на прелистување кои можеби би сакале да ги запомните или пак да им се навратите.",
     "settings_pane_highlights_header": "Интереси",
     "settings_pane_highlights_body2": "Навратете се на интересни места што неодамна сте ги посетиле или обележале.",
@@ -4349,58 +4509,66 @@
     "manual_migration_explanation2": "Пробајте го Firefox со обележувачите, историјата и лозинките на друг прелистувач.",
     "manual_migration_cancel_button": "Не, благодарам",
     "manual_migration_import_button": "Увези сега"
   },
   "ml": {
     "newtab_page_title": "പുതിയ ടാബ്",
     "default_label_loading": "ലോഡ്ചെയ്യുന്നു…",
     "header_top_sites": "മികച്ച സൈറ്റുകൾ",
+    "header_stories": "മികച്ച ലേഖനങ്ങൾ",
     "header_highlights": "ഹൈലൈറ്റുകൾ",
-    "header_stories": "മികച്ച ലേഖനങ്ങൾ",
+    "header_visit_again": "വീണ്ടും സന്ദർശിക്കുക",
+    "header_bookmarks": "അടുത്തിടെയുള്ള ബുക്ക്മാർക്കുകൾ",
+    "header_bookmarks_placeholder": "നിങ്ങൾക്ക് ഇതുവരെ ബുക്ക്മാർക്കുകൾ ഇല്ല.",
     "header_stories_from": "എവിടെ നിന്നും",
     "type_label_visited": "സന്ദർശിച്ചത്‌",
     "type_label_bookmarked": "അടയാളപ്പെടുത്തിയത്",
     "type_label_synced": "മറ്റു ഉപകരണങ്ങളുമായി സാമ്യപ്പെടുക",
     "type_label_recommended": "ട്രെൻഡിംഗ്",
     "type_label_open": "തുറക്കുക",
     "type_label_topic": "വിഷയം",
+    "type_label_now": "ഇപ്പോൾ",
     "menu_action_bookmark": "അടയാളം",
     "menu_action_remove_bookmark": "അടയാളം മാറ്റുക",
     "menu_action_copy_address": "വിലാസം പകർത്തുക",
     "menu_action_email_link": "ഇമെയിൽ വിലാസം…",
     "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": "പോക്കറ്റിലേയ്ക്ക് സംരക്ഷിയ്ക്കുക",
     "search_for_something_with": "തിരയാൻ {search_term} : എന്നത് ഉപയോഗിയ്ക്കുക",
     "search_button": "തിരയുക",
     "search_header": "{search_engine_name} തിരയുക",
     "search_web_placeholder": "ഇൻറർനെറ്റിൽ തിരയുക",
     "search_settings": "തിരയാനുള്ള രീതികൾ മാറ്റുക",
+    "section_info_option": "വിവരം",
     "welcome_title": "പുതിയ ജാലകത്തിലേക്കു സ്വാഗതം",
     "welcome_body": "നിങ്ങളുടെ ഏറ്റവും ശ്രദ്ധേയമായ അടയാളങ്ങൾ, ലേഖനങ്ങൾ, വീഡിയോകൾ, കൂടാതെ നിങ്ങൾ സമീപകാലത്ത് സന്ദർശിച്ച താളുകൾ എന്നിവ കാണിക്കുന്നതിനായി ഫയർഫോക്സ് ഈ ഇടം ഉപയോഗിക്കും, അതിനാൽ നിങ്ങൾക്ക് എളുപ്പത്തിൽ അവയിലേക്ക് തിരിച്ചു പോകാം.",
     "welcome_label": "താങ്കളുടെ ഹൈലൈറ്റ്സ് തിരിച്ചറിയുന്നു",
     "time_label_less_than_minute": "<1 മിനിറ്റ്",
     "time_label_minute": "{number} മിനിറ്റ്",
     "time_label_hour": "{number} മിനിറ്റ്",
     "time_label_day": "{number} മിനിറ്റ്",
     "settings_pane_button_label": "നിങ്ങളുടെ പുതിയ ടാബ് താള് ഇഷ്ടാനുസൃതമാക്കുക",
     "settings_pane_header": "പുതിയ ടാബിന്റെ മുൻഗണനകൾ",
-    "settings_pane_body": "പുതിയ ടാബ് തുറക്കുമ്പോൾ എന്ത് കാണണമെന്ന് തീരുമാനിക്കുക.",
     "settings_pane_search_header": "തിരയുക",
     "settings_pane_search_body": "പുതിയ ടാബിൽ നിന്ന് ഇന്റർനെറ്റിൽ തിരയുക.",
     "settings_pane_topsites_header": "മുന്നേറിയ സൈറ്റുകൾ",
     "settings_pane_topsites_body": "നിങ്ങൾ കൂടുതൽ സന്ദർശിക്കുന്ന വെബ്‌സൈറ്റുകളിൽ പ്രവേശിക്കുക.",
     "settings_pane_topsites_options_showmore": "രണ്ടു വരികൾ കാണിയ്ക്കുക",
+    "settings_pane_bookmarks_header": "അടുത്തിടെയുള്ള ബുക്ക്മാർക്കുകൾ",
+    "settings_pane_bookmarks_body": "നിങ്ങളുടെ പുതിയതായി സൃഷ്ടിച്ച ബുക്ക്മാർക്കുകൾ ഒരു സ്ഥലത്ത്.",
+    "settings_pane_visit_again_header": "വീണ്ടും സന്ദർശിക്കുക",
     "settings_pane_highlights_header": "ഹൈലൈറ്റുകൾ",
-    "settings_pane_highlights_body": "നിങ്ങളുടെ സമീപകാല ബ്രൗസിംഗ് ചരിത്രവും പുതുതായി സൃഷ്ടിച്ച അടയാളങ്ങളും കാണുക.",
-    "settings_pane_pocketstories_header": "മികച്ച ലേഖനങ്ങൾ",
-    "settings_pane_pocketstories_body": "മോസില്ല‌ കുടുംബാംഗമായ പോക്കറ്റ്, വിട്ടുപോയേയ്ക്കാവുന്ന മികച്ച ലേഖനങ്ങൾ നിങ്ങളുടെ ശ്രദ്ധയിൽ എത്തിയ്ക്കുന്നു.",
     "settings_pane_done_button": "തീർന്നു",
     "edit_topsites_button_text": "തിരുത്തുക",
     "edit_topsites_button_label": "നിങ്ങളുടെ മുന്നേറിയ സൈറ്റുകളുടെ വിഭാഗം ഇഷ്ടാനുസൃതമാക്കുക",
     "edit_topsites_showmore_button": "കൂടുതൽ കാണിക്കുക",
     "edit_topsites_showless_button": "കുറച്ച് കാണിക്കുക",
     "edit_topsites_done_button": "തീർന്നു",
     "edit_topsites_pin_button": "ഈ സൈറ്റ് പിൻ ചെയ്യുക",
     "edit_topsites_unpin_button": "ഈ സൈറ്റ് അണ്‍പിന്‍ ചെയ്യുക",
@@ -4413,18 +4581,18 @@
     "topsites_form_url_placeholder": "വെബ്URLനൽകൂ",
     "topsites_form_add_button": "ചേർക്കൂ",
     "topsites_form_save_button": "സംരക്ഷിയ്ക്കൂ",
     "topsites_form_cancel_button": "ഒഴിവാക്കൂ",
     "topsites_form_url_validation": "പ്രവർത്തിയ്ക്കുന്ന URL ആവശ്യമാണ്",
     "pocket_read_more": "ജനപ്രിയ വിഷയങ്ങൾ:",
     "pocket_read_even_more": "കൂടുതൽ ലേഖനങ്ങൾ കാണുക",
     "pocket_feedback_header": "250 ലക്ഷം പേരാൽ തെരഞ്ഞെടുക്കപ്പെട്ട വെബിലെ ഏറ്റവും മികച്ചവയാണിവ.",
-    "pocket_feedback_body": "മോസില്ല‌ കുടുംബാംഗമായ പോക്കറ്റ്, വിട്ടുപോയേയ്ക്കാവുന്ന മികച്ച ലേഖനങ്ങൾ നിങ്ങളുടെ ശ്രദ്ധയിൽ എത്തിയ്ക്കുന്നു.",
-    "pocket_send_feedback": "പ്രതികരണം അയയ്ക്കുക"
+    "manual_migration_cancel_button": "വേണ്ട, നന്ദി",
+    "manual_migration_import_button": "ഇപ്പോൾ ഇറക്കുമതി ചെയ്യുക"
   },
   "mr": {
     "newtab_page_title": "नवीन टॅब",
     "default_label_loading": "दाखल करीत आहे…",
     "header_top_sites": "खास साईट्स",
     "header_highlights": "ठळक",
     "header_stories": "महत्वाच्या गोष्टी",
     "header_stories_from": "कडून",
@@ -4550,61 +4718,99 @@
     "manual_migration_explanation2": "Cuba Firefox dengan tandabuku, sejarah dan kata laluan yang disimpan dalam pelayar lain.",
     "manual_migration_cancel_button": "Tidak, Terima kasih",
     "manual_migration_import_button": "Import Sekarang"
   },
   "my": {
     "newtab_page_title": "တပ်ဗ်အသစ်ဖွင့်",
     "default_label_loading": "ရယူနေသှ်…",
     "header_top_sites": "အများဆုံးသုံးဆိုက်များ",
-    "header_highlights": "အသားပေးဖော်ပြချက်များ",
+    "header_stories": "အကြည့်အများဆုံးသတင်းများ",
+    "header_highlights": "ဦးစားပေးအကြောင်းအရာများ",
+    "header_visit_again": "ထပ်မံလည်ပတ်ရန်",
+    "header_bookmarks": "လတ်တလော စာမှတ်များ",
+    "header_recommended_by": "{provider} က အကြံပြုထားသည်",
+    "header_bookmarks_placeholder": "မည်သည့်စာမှတ်မျှ မရှိသေးပါ။",
+    "header_stories_from": "မှ",
     "type_label_visited": "သွားလည်ခဲ့သော",
     "type_label_bookmarked": "စာအမှတ်မှတ်ထားသော",
     "type_label_synced": "အခြားပစ္စည်းတစ်ခုမှရယူထားသှ်",
+    "type_label_recommended": "လူကြိုက်များနေသော",
     "type_label_open": "ဖွင့်ပါ",
     "type_label_topic": "အကြောင်းအရာ",
+    "type_label_now": "ယခု",
     "menu_action_bookmark": "စာအမှတ်",
     "menu_action_remove_bookmark": "စာအမှတ်အားဖယ်ပါ",
     "menu_action_copy_address": "လိပ်စာအားကူးယူပါ",
     "menu_action_email_link": "လင်ခ့်အားအီးမေလ်းဖြင့်ပို့ပါ…",
     "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 သို့ သိမ်းရန်",
     "search_for_something_with": "{search_term} အားရှာပါ -",
     "search_button": "ရှာ",
     "search_header": "{search_engine_name} ရှာဖွေမှု",
     "search_web_placeholder": "ဝတ်ဘ်ပေါ်တွင် ရှာဖွေခြင်း",
     "search_settings": "ရှာဖွေမှုအပြင်အဆင်အားပြောင်းလဲပါ",
+    "section_info_option": "အချက်အလက်",
+    "section_info_send_feedback": "အကြံပေးချက် ပေးပို့ရန်",
+    "section_info_privacy_notice": "ကိုယ်ရေးကာကွယ်မှု သတိပေးချက်",
     "welcome_title": "တပ်ဗ်အသစ်တစ်ခုမှကြိုဆိုပါတယ်",
     "welcome_body": "ယခုနေရာအား Firefox မှ အသင့်လျော်ဆုံး သင်သွားလည်ခဲ့ဖူးသော စာအမှတ်များ၊ ဆောင်းပါးများ၊ ရုပ်ရှင်များ နှင့် စာမျက်နှာများအား ပြသဖို့အသုံးပြုမည်ဖြစ်ပါတယ်။",
     "welcome_label": "သင့် အသားပေးဖော်ပြချက်များကိုသတိထားမည်",
     "time_label_less_than_minute": "<1မီတာ",
     "time_label_minute": "{number}မီတာ",
     "time_label_hour": "{number}အမြင့်",
     "time_label_day": "{number}နေ့",
     "settings_pane_button_label": "သင့်တပ်ဗ်အသစ်စာမျက်နှာအား ပြင်ဆင်မည်",
     "settings_pane_header": "စာတပ်ဗ်အသစ်အပြင်အဆင်များ",
-    "settings_pane_body": "သင် တပ်ဗ်အသစ်ဖွင့်လိုက်ပါကမြင်ရမည့်အရာများကိုရွေးချယ်ပါ",
+    "settings_pane_body2": "ယခုစာမျက်နှာတွင် ကြည့်လိုသည်များကို ရွေးပါ။",
     "settings_pane_search_header": "ရှာဖွေပါ",
     "settings_pane_search_body": "ဝက်ဘ်ပေါ်တွင် သင့်တပ်ဗ်အသစ်မှရှာဖွေပါ",
     "settings_pane_topsites_header": "ထိပ်တန်းဝတ်ဘ်ဆိုက်များ",
     "settings_pane_topsites_body": "သင်အများဆုံးသွားလည်သော ဝတ်ဘ်ဆိုက်များကို ရယူပါ",
     "settings_pane_topsites_options_showmore": "အတန်းနှစ်တန်းနှင့်ပြပါ",
-    "settings_pane_highlights_header": "အသားပေးဖော်ပြချက်များ",
-    "settings_pane_highlights_body": "သင်လတ်တလောသွားလည်ထားသော မှတ်တမ်းနှင့် အသစ်ဖန်တီးထားသော စာအမှတ်များအား ပြန်ကြည့်ပါ",
+    "settings_pane_bookmarks_header": "လတ်တလော စာမှတ်များ",
+    "settings_pane_bookmarks_body": "အသစ်မှတ်သားထားသော စာမှတ်များကို တစ်နေရာတည်းတွင် စုစည်းထားသည်။",
+    "settings_pane_visit_again_header": "ထပ်မံလည်ပတ်ရန်",
+    "settings_pane_visit_again_body": "မှတ်ထားလိုသော သို့မဟုတ် ပြန်ဖွင့်လိုသော လည်ပတ်မှတ်တမ်းထဲမှ တချို့ကို Firefox က ပြပါမည်။",
+    "settings_pane_highlights_header": "ဦးစားပေးအကြောင်းအရာများ",
+    "settings_pane_highlights_options_bookmarks": "စာမှတ်များ",
+    "settings_pane_highlights_options_visited": "လည်ပတ်ထားသော ဆိုက်များ",
+    "settings_pane_snippets_header": "မှတ်စုတိုများ",
+    "settings_pane_snippets_body": "Mozilla မှ Firefox အကြောင်း၊ အင်တာနက်ယဉ်ကျေးမှုနှင့် အခါအားလျော်စွာ ဖြစ်ပေါ်လာသော ကျပန်း meme စသည့် နောက်ဆုံးရသတင်းများကို ဖတ်ရှုပါ။",
     "settings_pane_done_button": "ပြီးပြီ",
     "edit_topsites_button_text": "ပြင်ဆင်မည်",
     "edit_topsites_button_label": "သင့်ထိပ်တန်းဆိုက် အမြင်အားပြင်ဆင်ပါ",
     "edit_topsites_showmore_button": "ထပ်ပြပါ",
     "edit_topsites_showless_button": "ချုံ့ပြရန်",
     "edit_topsites_done_button": "ပြီးပြီ",
     "edit_topsites_pin_button": "ဝတ်ဆိုဒ်အားpinလုပ်ထားမည်",
+    "edit_topsites_unpin_button": "ယခုဆိုက်ကို တွယ်ဖြုတ်ရန်",
     "edit_topsites_edit_button": "ဆိုက်အားပြင်မည်",
-    "edit_topsites_dismiss_button": "ဆိုက်အားဖျက်လိုက်မည်"
+    "edit_topsites_dismiss_button": "ဆိုက်အားဖျက်လိုက်မည်",
+    "edit_topsites_add_button": "ထည့်ရန်",
+    "topsites_form_add_header": "ထိပ်တန်းဆိုက် အသစ်",
+    "topsites_form_edit_header": "ထိပ်တန်းဆိုက်ကို တည်းဖြတ်ရန်",
+    "topsites_form_title_placeholder": "ခေါင်းစဉ် ရေးပါ",
+    "topsites_form_url_placeholder": "URL ကို ရိုက်ပါ သို့မဟုတ် ပွားထည့်ပါ",
+    "topsites_form_add_button": "ထည့်ရန်",
+    "topsites_form_save_button": "သိမ်းရန်",
+    "topsites_form_cancel_button": "မလုပ်တော့ပါ",
+    "topsites_form_url_validation": "URL အမှန် လိုအပ်သည်",
+    "pocket_read_more": "လူကြိုက်များခေါင်းစဉ်များ",
+    "pocket_read_even_more": "နောက်ထပ်သတင်းများ ကြည့်ရန်",
+    "manual_migration_explanation2": "အခြားဘရောင်ဇာမှ စာမှတ်များ၊ မှတ်တမ်းများ၊ စကားဝှက်များနှင့်အတူ Firefox တွင် စမ်းသုံးကြည့်ပါ။",
+    "manual_migration_cancel_button": "မလိုတော့ပါ၊ ကျေးဇူးတင်ပါသည်။",
+    "manual_migration_import_button": "ထည့်သွင်းရန်"
   },
   "nb-NO": {
     "newtab_page_title": "Ny fane",
     "default_label_loading": "Laster …",
     "header_top_sites": "Mest besøkte nettsider",
     "header_stories": "Hovedsakene",
     "header_highlights": "Høydepunkter",
     "header_visit_again": "Besøk igjen",
@@ -4737,16 +4943,17 @@
     "welcome_body": "Firefoxले यस ठाउँको प्रयोग तपाईंको सबैभन्दा सान्दर्भिक पुस्तकचिनो, लेखहरू, भिडियोहरू, र तपाईंले हालै भ्रमण गर्नु भएको पृष्ठहरूलाई राख्न प्रयोग गर्दछ, जसले गर्दा तपाइँ तिनीहरूलाई सजिलै भेटाउन सक्नुहुनेछ ।",
     "welcome_label": "तपाईँका विशेषताहरु पत्ता लगाउँदै",
     "time_label_less_than_minute": "< १ मिनेट",
     "time_label_minute": "{number} मिनेट",
     "time_label_hour": "{number} घण्टा",
     "time_label_day": "{number} दिन",
     "settings_pane_button_label": "तपाईंको नयाँ ट्याब पृष्ठ अनुकूलन गर्नुहोस्",
     "settings_pane_header": "नयाँ ट्याब प्राथमिकताहरू",
+    "settings_pane_body2": "तपाईँले यो पृष्ठमा के देख्नुभयो छनौट गर्नुहोस् ।",
     "settings_pane_search_header": "खोजी गर्नुहोस्",
     "settings_pane_search_body": "तपाईंको नयाँ ट्याबबाट वेबमा खोज्नुहोस् ।",
     "settings_pane_topsites_header": "शीर्ष साइटहरू",
     "settings_pane_topsites_body": "तपाईले धेरै भ्रमण गर्नुभएका वेबसाइटहरूमा पहुँच गर्नुहोस् ।",
     "settings_pane_topsites_options_showmore": "दुई पङ्क्तिहरू देखाउनुहोस्",
     "settings_pane_bookmarks_header": "भर्खरैका पुस्तकचिनोहरु",
     "settings_pane_bookmarks_body": "तपाईंको नयाँ सिर्जना गरिएको पुस्तकचिनोहरुहरू एउटा सजिलो स्थानमा ।",
     "settings_pane_visit_again_header": "फेरि भ्रमण गर्नुहोस्",
@@ -6215,20 +6422,23 @@
     "settings_pane_search_header": "ค้นหา",
     "settings_pane_search_body": "ค้นหาเว็บจากแท็บใหม่ของคุณ",
     "settings_pane_topsites_header": "ไซต์เด่น",
     "settings_pane_topsites_body": "เข้าถึงเว็บไซต์ที่คุณเยี่ยมชมมากที่สุด",
     "settings_pane_topsites_options_showmore": "แสดงสองแถว",
     "settings_pane_bookmarks_header": "ที่คั่นหน้าล่าสุด",
     "settings_pane_bookmarks_body": "ที่คั่นหน้าที่สร้างใหม่ของคุณในตำแหน่งที่ตั้งเดียวที่สะดวก",
     "settings_pane_visit_again_header": "เยี่ยมชมอีกครั้ง",
+    "settings_pane_visit_again_body": "Firefox จะแสดงประวัติการท่องเว็บที่คุณอาจต้องการให้จดจำหรือกลับไปเยี่ยมชมอีกครั้งที่นี่",
     "settings_pane_highlights_header": "รายการเด่น",
+    "settings_pane_highlights_body2": "ค้นหาทางของคุณกลับไปยังสิ่งที่น่าสนใจที่คุณได้เยี่ยมชมหรือเพิ่มที่คั่นหน้าไว้เมื่อเร็ว ๆ นี้",
     "settings_pane_highlights_options_bookmarks": "ที่คั่นหน้า",
     "settings_pane_highlights_options_visited": "ไซต์ที่เยี่ยมชมแล้ว",
     "settings_pane_snippets_header": "ส่วนย่อย",
+    "settings_pane_snippets_body": "อ่านบทความข่าวสารสั้น ๆ ที่น่าสนใจจาก Mozilla เกี่ยวกับ Firefox, วัฒนธรรมอินเทอร์เน็ต, และมีมแบบสุ่มในบางครั้ง",
     "settings_pane_done_button": "เสร็จสิ้น",
     "edit_topsites_button_text": "แก้ไข",
     "edit_topsites_button_label": "ปรับแต่งส่วนไซต์เด่นของคุณ",
     "edit_topsites_showmore_button": "แสดงเพิ่มเติม",
     "edit_topsites_showless_button": "แสดงน้อยลง",
     "edit_topsites_done_button": "เสร็จสิ้น",
     "edit_topsites_pin_button": "ปักหมุดไซต์นี้",
     "edit_topsites_unpin_button": "ถอนหมุดไซต์นี้",
@@ -6241,17 +6451,19 @@
     "topsites_form_url_placeholder": "พิมพ์หรือวาง URL",
     "topsites_form_add_button": "เพิ่ม",
     "topsites_form_save_button": "บันทึก",
     "topsites_form_cancel_button": "ยกเลิก",
     "topsites_form_url_validation": "ต้องการ URL ที่ถูกต้อง",
     "pocket_read_more": "หัวข้อยอดนิยม:",
     "pocket_read_even_more": "ดูเรื่องราวเพิ่มเติม",
     "pocket_feedback_header": "ที่สุดของเว็บ จัดรายการโดยผู้คนกว่า 25 ล้านคน",
-    "highlights_empty_state": "เริ่มการท่องเว็บและเราจะแสดงบทความ, วิดีโอ และหน้าอื่น ๆ บางส่วนที่ยอดเยี่ยมที่คุณได้เยี่ยมชมหรือเพิ่มที่คั่นหน้าไว้เมื่อเร็ว ๆ นี้ที่นี่",
+    "pocket_description": "ค้นพบเนื้อหาคุณภาพสูงที่คุณอาจจะพลาดไปด้วยความช่วยเหลือจาก Pocket ซึ่งขณะนี้เป็นส่วนหนึ่งของ Mozilla",
+    "highlights_empty_state": "เริ่มการท่องเว็บและเราจะแสดงบทความ, วิดีโอ และหน้าอื่น ๆ บางส่วนที่ยอดเยี่ยมที่คุณได้เยี่ยมชมหรือเพิ่มที่คั่นหน้าไว้ล่าสุดที่นี่",
+    "topstories_empty_state": "คุณได้อ่านเรื่องราวครบทั้งหมดแล้ว คุณสามารถกลับมาตรวจดูเรื่องราวเด่นจาก {provider} ได้ภายหลัง อดใจรอไม่ได้งั้นหรือ? เลือกหัวข้อยอดนิยมเพื่อค้นหาเรื่องราวที่ยอดเยี่ยมจากเว็บต่าง ๆ",
     "manual_migration_explanation2": "ลอง Firefox ด้วยที่คั่นหน้า, ประวัติ และรหัสผ่านจากเบราว์เซอร์อื่น",
     "manual_migration_cancel_button": "ไม่ ขอบคุณ",
     "manual_migration_import_button": "นำเข้าตอนนี้"
   },
   "tl": {
     "newtab_page_title": "Bagong Tab",
     "default_label_loading": "Pagkarga…",
     "header_top_sites": "Tuktok na mga Site",
--- a/browser/extensions/activity-stream/install.rdf.in
+++ b/browser/extensions/activity-stream/install.rdf.in
@@ -3,17 +3,17 @@
 #filter substitution
 
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
     <em:id>activity-stream@mozilla.org</em:id>
     <em:type>2</em:type>
     <em:bootstrap>true</em:bootstrap>
     <em:unpack>false</em:unpack>
-    <em:version>2017.09.29.0895-52552f5e</em:version>
+    <em:version>2017.10.06.1105-fbbf9d84</em:version>
     <em:name>Activity Stream</em:name>
     <em:description>A rich visual history feed and a reimagined home page make it easier than ever to find exactly what you're looking for in Firefox.</em:description>
     <em:multiprocessCompatible>true</em:multiprocessCompatible>
 
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>@MOZ_APP_VERSION@</em:minVersion>
--- a/browser/extensions/activity-stream/jar.mn
+++ b/browser/extensions/activity-stream/jar.mn
@@ -4,12 +4,16 @@
 
 [features/activity-stream@mozilla.org] chrome.jar:
 % resource activity-stream %content/ contentaccessible=yes
   content/lib/ (./lib/*)
   content/common/ (./common/*)
   content/vendor/Redux.jsm (./vendor/Redux.jsm)
   content/vendor/react.js (./vendor/react.js)
   content/vendor/react-dom.js (./vendor/react-dom.js)
+#ifndef RELEASE_OR_BETA
+  content/vendor/react-dev.js (./vendor/react-dev.js)
+  content/vendor/react-dom-dev.js (./vendor/react-dom-dev.js)
+#endif
   content/vendor/react-intl.js (./vendor/react-intl.js)
   content/vendor/redux.js (./vendor/redux.js)
   content/vendor/react-redux.js (./vendor/react-redux.js)
   content/data/ (./data/*)
--- a/browser/extensions/activity-stream/lib/ActivityStream.jsm
+++ b/browser/extensions/activity-stream/lib/ActivityStream.jsm
@@ -85,23 +85,27 @@ const PREFS_CONFIG = new Map([
     title: "Number of days to show the manual migration message",
     value: 4
   }],
   ["prerender", {
     title: "Use the prerendered version of activity-stream.html. This is set automatically by PrefsFeed.jsm.",
     value: true
   }],
   ["showSearch", {
-    title: "Show the Search bar on the New Tab page",
+    title: "Show the Search bar",
     value: true
   }],
   ["showTopSites", {
-    title: "Show the Top Sites section on the New Tab page",
+    title: "Show the Top Sites section",
     value: true
   }],
+  ["collapseTopSites", {
+    title: "Collapse the Top Sites section",
+    value: false
+  }],
   ["topSitesCount", {
     title: "Number of Top Sites to display",
     value: 6
   }],
   ["impressionStats.clicked", {
     title: "GUIDs of clicked Top stories items",
     value: "[]"
   }],
@@ -116,16 +120,24 @@ const PREFS_CONFIG = new Map([
   ["telemetry", {
     title: "Enable system error and usage data collection",
     value: true,
     value_local_dev: false
   }],
   ["telemetry.ping.endpoint", {
     title: "Telemetry server endpoint",
     value: "https://tiles.services.mozilla.com/v4/links/activity-stream"
+  }],
+  ["section.highlights.collapsed", {
+    title: "Collapse the Highlights section",
+    value: false
+  }],
+  ["section.topstories.collapsed", {
+    title: "Collapse the Top Stories section",
+    value: false
   }]
 ]);
 
 // Array of each feed's FEEDS_CONFIG factory and values to add to PREFS_CONFIG
 const FEEDS_DATA = [
   {
     name: "localization",
     factory: () => new LocalizationFeed(),
--- a/browser/extensions/activity-stream/lib/HighlightsFeed.jsm
+++ b/browser/extensions/activity-stream/lib/HighlightsFeed.jsm
@@ -28,25 +28,17 @@ const MANY_EXTRA_LENGTH = HIGHLIGHTS_MAX
 const SECTION_ID = "highlights";
 
 this.HighlightsFeed = class HighlightsFeed {
   constructor() {
     this.highlightsLastUpdated = 0;
     this.highlightsLength = 0;
     this.dedupe = new Dedupe(this._dedupeKey);
     this.linksCache = new LinksCache(NewTabUtils.activityStreamLinks,
-      "getHighlights", (oldLink, newLink) => {
-        // Migrate any pending images or images to the new link
-        for (const property of ["__fetchingScreenshot", "image"]) {
-          const oldValue = oldLink[property];
-          if (oldValue) {
-            newLink[property] = oldValue;
-          }
-        }
-      });
+      "getHighlights", ["image"]);
   }
 
   _dedupeKey(site) {
     return site && site.url;
   }
 
   init() {
     SectionsManager.onceInitialized(this.postInit.bind(this));
@@ -112,19 +104,18 @@ this.HighlightsFeed = class HighlightsFe
         hostname,
         type: page.bookmarkGuid ? "bookmark" : page.type
       });
 
       // Add the "bookmark" or not-skipped "history"
       highlights.push(page);
       hosts.add(hostname);
 
-      // Remove any internal properties
-      delete page.__fetchingScreenshot;
-      delete page.__updateCache;
+      // Remove internal properties that might be updated after dispatch
+      delete page.__sharedCache;
 
       // Skip the rest if we have enough items
       if (highlights.length === HIGHLIGHTS_MAX_LENGTH) {
         break;
       }
     }
 
     SectionsManager.updateSection(SECTION_ID, {rows: highlights}, broadcast);
@@ -134,17 +125,17 @@ this.HighlightsFeed = class HighlightsFe
 
   /**
    * Fetch an image for a given highlight and update the card with it. If no
    * image is available then fallback to fetching a screenshot.
    */
   async fetchImage(page) {
     // Request a screenshot if we don't already have one pending
     const {preview_image_url: imageUrl, url} = page;
-    Screenshots.maybeGetAndSetScreenshot(page, imageUrl || url, "image", image => {
+    Screenshots.maybeCacheScreenshot(page, imageUrl || url, "image", image => {
       SectionsManager.updateSectionCard(SECTION_ID, url, {image}, true);
     });
   }
 
   onAction(action) {
     switch (action.type) {
       case at.INIT:
         this.init();
--- a/browser/extensions/activity-stream/lib/LinksCache.jsm
+++ b/browser/extensions/activity-stream/lib/LinksCache.jsm
@@ -14,29 +14,31 @@ const EXPIRATION_TIME = 5 * 60 * 1000; /
  */
 this.LinksCache = class LinksCache {
 
   /**
    * Create a links cache for a given object property.
    *
    * @param {object} linkObject Object containing the link property
    * @param {string} linkProperty Name of property on object to access
-   * @param {function} migrator Optional callback receiving the old and new link
-   *                            to allow custom migrating data from old to new.
+   * @param {array} properties Optional properties list to migrate to new links.
    * @param {function} shouldRefresh Optional callback receiving the old and new
    *                                 options to refresh even when not expired.
    */
-  constructor(linkObject, linkProperty, migrator = () => {}, shouldRefresh = () => {}) {
+  constructor(linkObject, linkProperty, properties = [], shouldRefresh = () => {}) {
     this.clear();
+
     // Allow getting links from both methods and array properties
     this.linkGetter = options => {
       const ret = linkObject[linkProperty];
       return typeof ret === "function" ? ret.call(linkObject, options) : ret;
     };
-    this.migrator = migrator;
+
+    // Always migrate the shared cache data in addition to any custom properties
+    this.migrateProperties = ["__sharedCache", ...properties];
     this.shouldRefresh = shouldRefresh;
   }
 
   /**
    * Clear the cached data.
    */
   clear() {
     this.cache = Promise.resolve([]);
@@ -73,42 +75,43 @@ this.LinksCache = class LinksCache {
         // Allow fast lookup of old links by url that might need to migrate
         const toMigrate = new Map();
         for (const oldLink of await this.cache) {
           if (oldLink) {
             toMigrate.set(oldLink.url, oldLink);
           }
         }
 
-        // Make a shallow copy of each resulting link to allow direct edits
-        const copied = (await this.linkGetter(options)).map(link => link &&
-          Object.assign({}, link));
+        // Update the cache with migrated links without modifying source objects
+        resolve((await this.linkGetter(options)).map(link => {
+          // Keep original array hole positions
+          if (!link) {
+            return link;
+          }
 
-        // Migrate data to the new link if we have an old link
-        for (const newLink of copied) {
-          if (newLink) {
-            const oldLink = toMigrate.get(newLink.url);
-            if (oldLink) {
-              this.migrator(oldLink, newLink);
+          // Migrate data to the new link copy if we have an old link
+          const newLink = Object.assign({}, link);
+          const oldLink = toMigrate.get(newLink.url);
+          if (oldLink) {
+            for (const property of this.migrateProperties) {
+              const oldValue = oldLink[property];
+              if (oldValue) {
+                newLink[property] = oldValue;
+              }
             }
-
-            // Add a method that can be copied to cloned links that will update
-            // the original cached link's property with the current one
-            newLink.__updateCache = function(prop) {
-              const val = this[prop];
-              if (val === undefined) {
-                delete newLink[prop];
-              } else {
-                newLink[prop] = val;
+          } else {
+            // Share data among link copies and new links from future requests
+            newLink.__sharedCache = {
+              // Provide a helper to update the cached link
+              updateLink(property, value) {
+                newLink[property] = value;
               }
             };
           }
-        }
-
-        // Update cache with the copied links migrated
-        resolve(copied);
+          return newLink;
+        }));
       });
     }
 
-    // Return the promise of the links array
-    return this.cache;
+    // Provide a shallow copy of the cached link objects for callers to modify
+    return (await this.cache).map(link => link && Object.assign({}, link));
   }
 };
--- a/browser/extensions/activity-stream/lib/Screenshots.jsm
+++ b/browser/extensions/activity-stream/lib/Screenshots.jsm
@@ -60,41 +60,36 @@ this.Screenshots = {
     } catch (err) {
       Cu.reportError(`getScreenshot error: ${err}`);
     }
     return screenshot;
   },
 
   /**
    * Conditionally get a screenshot for a link if there's no existing pending
-   * screenshot. Updates the link object's desired property with the result.
+   * screenshot. Updates the cached link's desired property with the result.
    *
    * @param link {object} Link object to update
    * @param url {string} Url to get a screenshot of
    * @param property {string} Name of property on object to set
    @ @param onScreenshot {function} Callback for when the screenshot loads
    */
-  async maybeGetAndSetScreenshot(link, url, property, onScreenshot) {
-    // Make a link copy so we can stash internal properties to cache
-    const updateCache = link.__updateCache ? link.__updateCache.bind(link) :
-      () => {};
-
-    // Request a screenshot if we don't already have one pending
-    if (!link.__fetchingScreenshot) {
-      link.__fetchingScreenshot = this.getScreenshotForURL(url);
-      updateCache("__fetchingScreenshot");
-
-      // Trigger this callback only when first requesting
-      link.__fetchingScreenshot.then(onScreenshot).catch();
+  async maybeCacheScreenshot(link, url, property, onScreenshot) {
+    // Nothing to do if we already have a pending screenshot
+    const cache = link.__sharedCache;
+    if (cache.fetchingScreenshot) {
+      return;
     }
 
-    // Clean up now that we got the screenshot
-    const screenshot = await link.__fetchingScreenshot;
-    delete link.__fetchingScreenshot;
-    updateCache("__fetchingScreenshot");
+    // Save the promise to the cache so other links get it immediately
+    cache.fetchingScreenshot = this.getScreenshotForURL(url);
 
-    // Update the link so the screenshot is in the cache
+    // Clean up now that we got the screenshot
+    const screenshot = await cache.fetchingScreenshot;
+    delete cache.fetchingScreenshot;
+
+    // Update the cache for future links and call back for existing content
     if (screenshot) {
-      link[property] = screenshot;
-      updateCache(property);
+      cache.updateLink(property, screenshot);
+      onScreenshot(screenshot);
     }
   }
 };
--- a/browser/extensions/activity-stream/lib/SectionsManager.jsm
+++ b/browser/extensions/activity-stream/lib/SectionsManager.jsm
@@ -16,17 +16,17 @@ const {Dedupe} = Cu.import("resource://a
  */
 const BUILT_IN_SECTIONS = {
   "feeds.section.topstories": options => ({
     id: "topstories",
     pref: {
       titleString: {id: "header_recommended_by", values: {provider: options.provider_name}},
       descString: {id: options.provider_description || "pocket_feedback_body"}
     },
-    shouldHidePref:  options.hidden,
+    shouldHidePref: options.hidden,
     eventSource: "TOP_STORIES",
     icon: options.provider_icon,
     title: {id: "header_recommended_by", values: {provider: options.provider_name}},
     maxRows: 1,
     availableContextMenuOptions: ["CheckBookmark", "SaveToPocket", "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"],
     infoOption: {
       header: {id: options.provider_header || "pocket_feedback_header"},
       body: {id: options.provider_description || "pocket_feedback_body"},
--- a/browser/extensions/activity-stream/lib/TelemetryFeed.jsm
+++ b/browser/extensions/activity-stream/lib/TelemetryFeed.jsm
@@ -23,17 +23,19 @@ XPCOMUtils.defineLazyServiceGetter(this,
 
 const ACTIVITY_STREAM_ID = "activity-stream";
 const ACTIVITY_STREAM_ENDPOINT_PREF = "browser.newtabpage.activity-stream.telemetry.ping.endpoint";
 
 // This is a mapping table between the user preferences and its encoding code
 const USER_PREFS_ENCODING = {
   "showSearch": 1 << 0,
   "showTopSites": 1 << 1,
-  "feeds.section.topstories": 1 << 2
+  "feeds.section.topstories": 1 << 2,
+  "feeds.section.highlights": 1 << 3,
+  "feeds.snippets": 1 << 4
 };
 
 const IMPRESSION_STATS_RESET_TIME = 60 * 60 * 1000; // 60 minutes
 const PREF_IMPRESSION_STATS_CLICKED = "impressionStats.clicked";
 const PREF_IMPRESSION_STATS_BLOCKED = "impressionStats.blocked";
 const PREF_IMPRESSION_STATS_POCKETED = "impressionStats.pocketed";
 const TELEMETRY_PREF = "telemetry";
 
--- a/browser/extensions/activity-stream/lib/TopSitesFeed.jsm
+++ b/browser/extensions/activity-stream/lib/TopSitesFeed.jsm
@@ -28,21 +28,21 @@ const FRECENCY_THRESHOLD = 100 + 1; // 1
 const MIN_FAVICON_SIZE = 96;
 
 this.TopSitesFeed = class TopSitesFeed {
   constructor() {
     this.lastUpdated = 0;
     this._tippyTopProvider = new TippyTopProvider();
     this.dedupe = new Dedupe(this._dedupeKey);
     this.frecentCache = new LinksCache(NewTabUtils.activityStreamLinks,
-      "getTopSites", this.getLinkMigrator(), (oldOptions, newOptions) =>
+      "getTopSites", ["screenshot"], (oldOptions, newOptions) =>
         // Refresh if no old options or requesting more items
         !(oldOptions.numItems >= newOptions.numItems));
-    this.pinnedCache = new LinksCache(NewTabUtils.pinnedLinks,
-      "links", this.getLinkMigrator(["favicon", "faviconSize"]));
+    this.pinnedCache = new LinksCache(NewTabUtils.pinnedLinks, "links",
+      ["favicon", "faviconSize", "screenshot"]);
   }
   _dedupeKey(site) {
     return site && site.hostname;
   }
   refreshDefaults(sites) {
     // Clear out the array of any previous defaults
     DEFAULT_TOP_SITES.length = 0;
 
@@ -54,32 +54,16 @@ this.TopSitesFeed = class TopSitesFeed {
           url
         };
         site.hostname = shortURL(site);
         DEFAULT_TOP_SITES.push(site);
       }
     }
   }
 
-  /**
-   * Make a cached link data migrator by copying over screenshots and others.
-   *
-   * @param others {array} Optional extra properties to copy
-   */
-  getLinkMigrator(others = []) {
-    const properties = ["__fetchingScreenshot", "screenshot", ...others];
-    return (oldLink, newLink) => {
-      for (const property of properties) {
-        const oldValue = oldLink[property];
-        if (oldValue) {
-          newLink[property] = oldValue;
-        }
-      }
-    };
-  }
   async getLinksWithDefaults(action) {
     // Get at least SHOWMORE amount so toggling between 1 and 2 rows has sites
     const numItems = Math.max(this.store.getState().Prefs.values.topSitesCount,
       TOP_SITES_SHOWMORE_LENGTH);
     const frecent = (await this.frecentCache.request({
       numItems,
       topsiteFrecency: FRECENCY_THRESHOLD
     })).map(link => Object.assign({}, link, {hostname: shortURL(link)}));
@@ -102,18 +86,18 @@ this.TopSitesFeed = class TopSitesFeed {
         isDefault: !!notBlockedDefaultSites.find(finder)
       });
 
       // Add in favicons if we don't already have it
       if (!copy.favicon) {
         try {
           NewTabUtils.activityStreamProvider._faviconBytesToDataURI(await
             NewTabUtils.activityStreamProvider._addFavicons([copy]));
-          copy.__updateCache("favicon");
-          copy.__updateCache("faviconSize");
+          copy.__sharedCache.updateLink("favicon", copy.favicon);
+          copy.__sharedCache.updateLink("faviconSize", copy.faviconSize);
         } catch (e) {
           // Some issue with favicon, so just continue without one
         }
       }
 
       return copy;
     }));
 
@@ -129,19 +113,18 @@ this.TopSitesFeed = class TopSitesFeed {
     // Insert the original pinned sites into the deduped frecent and defaults
     const withPinned = insertPinned(checkedAdult, pinned).slice(0, numItems);
 
     // Now, get a tippy top icon, a rich icon, or screenshot for every item
     for (const link of withPinned) {
       if (link) {
         this._fetchIcon(link);
 
-        // Remove any internal properties
-        delete link.__fetchingScreenshot;
-        delete link.__updateCache;
+        // Remove internal properties that might be updated after dispatch
+        delete link.__sharedCache;
       }
     }
 
     return withPinned;
   }
 
   /**
    * Refresh the top sites data for content
@@ -171,22 +154,21 @@ this.TopSitesFeed = class TopSitesFeed {
    */
   async _fetchIcon(link) {
     // Check for tippy top icon or a rich icon.
     this._tippyTopProvider.processSite(link);
     if (!link.tippyTopIcon &&
         (!link.favicon || link.faviconSize < MIN_FAVICON_SIZE) &&
         !link.screenshot) {
       const {url} = link;
-      Screenshots.maybeGetAndSetScreenshot(link, url, "screenshot", screenshot => {
-        this.store.dispatch(ac.BroadcastToContent({
+      await Screenshots.maybeCacheScreenshot(link, url, "screenshot",
+        screenshot => this.store.dispatch(ac.BroadcastToContent({
           data: {screenshot, url},
           type: at.SCREENSHOT_UPDATED
-        }));
-      });
+        })));
     }
   }
 
   /**
    * Inform others that top sites data has been updated due to pinned changes.
    */
   _broadcastPinnedSitesUpdated() {
     // Pinned data changed, so make sure we get latest
@@ -259,21 +241,25 @@ this.TopSitesFeed = class TopSitesFeed {
           (Date.now() - this.lastUpdated >= UPDATE_TIME)
         ) {
           this.refresh(action.meta.fromTarget);
         }
         break;
       // All these actions mean we need new top sites
       case at.MIGRATION_COMPLETED:
       case at.PLACES_HISTORY_CLEARED:
-      case at.PLACES_LINK_BLOCKED:
       case at.PLACES_LINKS_DELETED:
         this.frecentCache.expire();
         this.refresh();
         break;
+      case at.PLACES_LINK_BLOCKED:
+        this.frecentCache.expire();
+        this.pinnedCache.expire();
+        this.refresh();
+        break;
       case at.PREF_CHANGED:
         if (action.data.name === DEFAULT_SITES_PREF) {
           this.refreshDefaults(action.data.value);
         }
         break;
       case at.PREFS_INITIAL_VALUES:
         this.refreshDefaults(action.data[DEFAULT_SITES_PREF]);
         break;
--- a/browser/extensions/activity-stream/test/unit/activity-stream-prerender.test.jsx
+++ b/browser/extensions/activity-stream/test/unit/activity-stream-prerender.test.jsx
@@ -55,16 +55,9 @@ describe("prerender", () => {
   });
   it("should set the locale to en-PRERENDER and have empty strings if no locale is passed in", () => {
     const {store} = prerender();
 
     const state = store.getState();
     assert.equal(state.App.locale, "en-PRERENDER");
     assert.equal(state.App.strings.newtab_page_title, " ");
   });
-  // # TODO: Remove when #3370 is resolved.
-  it("should render a real English string for search_web_placeholder", () => {
-    const {store} = prerender();
-
-    const state = store.getState();
-    assert.equal(state.App.strings.search_web_placeholder, "Search the Web");
-  });
 });
--- a/browser/extensions/activity-stream/test/unit/lib/HighlightsFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/HighlightsFeed.test.js
@@ -37,17 +37,17 @@ describe("Highlights Feed", () => {
       enableSection: sinon.spy(),
       disableSection: sinon.spy(),
       updateSection: sinon.spy(),
       updateSectionCard: sinon.spy(),
       sections: new Map([["highlights", {}]])
     };
     fakeScreenshot = {
       getScreenshotForURL: sandbox.spy(() => Promise.resolve(FAKE_IMAGE)),
-      maybeGetAndSetScreenshot: Screenshots.maybeGetAndSetScreenshot
+      maybeCacheScreenshot: Screenshots.maybeCacheScreenshot
     };
     filterAdultStub = sinon.stub().returns([]);
     shortURLStub = sinon.stub().callsFake(site => site.url.match(/\/([^/]+)/)[1]);
     globals.set("NewTabUtils", fakeNewTabUtils);
     ({HighlightsFeed, HIGHLIGHTS_UPDATE_TIME, SECTION_ID} = injector({
       "lib/FilterAdult.jsm": {filterAdult: filterAdultStub},
       "lib/ShortURL.jsm": {shortURL: shortURLStub},
       "lib/SectionsManager.jsm": {SectionsManager: sectionsManagerStub},
@@ -210,49 +210,53 @@ describe("Highlights Feed", () => {
 
       const internal = Object.keys(highlights[0]).filter(key => key.startsWith("__"));
       assert.equal(internal.join(""), "");
     });
   });
   describe("#fetchImage", () => {
     const FAKE_URL = "https://mozilla.org";
     const FAKE_IMAGE_URL = "https://mozilla.org/preview.jpg";
+    function fetchImage(page) {
+      return feed.fetchImage(Object.assign({__sharedCache: {updateLink() {}}},
+        page));
+    }
     it("should capture the image, if available", async () => {
-      await feed.fetchImage({
+      await fetchImage({
         preview_image_url: FAKE_IMAGE_URL,
         url: FAKE_URL
       });
 
       assert.calledOnce(fakeScreenshot.getScreenshotForURL);
       assert.calledWith(fakeScreenshot.getScreenshotForURL, FAKE_IMAGE_URL);
     });
     it("should fall back to capturing a screenshot", async () => {
-      await feed.fetchImage({url: FAKE_URL});
+      await fetchImage({url: FAKE_URL});
 
       assert.calledOnce(fakeScreenshot.getScreenshotForURL);
       assert.calledWith(fakeScreenshot.getScreenshotForURL, FAKE_URL);
     });
     it("should call SectionsManager.updateSectionCard with the right arguments", async () => {
-      await feed.fetchImage({
+      await fetchImage({
         preview_image_url: FAKE_IMAGE_URL,
         url: FAKE_URL
       });
 
       assert.calledOnce(sectionsManagerStub.updateSectionCard);
       assert.calledWith(sectionsManagerStub.updateSectionCard, "highlights", FAKE_URL, {image: FAKE_IMAGE}, true);
     });
-    it("should update the card with the image", async () => {
+    it("should not update the card with the image", async () => {
       const card = {
         preview_image_url: FAKE_IMAGE_URL,
         url: FAKE_URL
       };
 
       await feed.fetchImage(card);
 
-      assert.propertyVal(card, "image", FAKE_IMAGE);
+      assert.notProperty(card, "image");
     });
   });
   describe("#uninit", () => {
     it("should disable its section", () => {
       feed.onAction({type: at.UNINIT});
       assert.calledOnce(sectionsManagerStub.disableSection);
       assert.calledWith(sectionsManagerStub.disableSection, SECTION_ID);
     });
--- a/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js
@@ -1,14 +1,13 @@
 "use strict";
 const injector = require("inject!lib/TopSitesFeed.jsm");
 const {Screenshots} = require("lib/Screenshots.jsm");
 const {UPDATE_TIME} = require("lib/TopSitesFeed.jsm");
 const {FakePrefs, GlobalOverrider} = require("test/unit/utils");
-const action = {meta: {fromTarget: {}}};
 const {actionTypes: at} = require("common/Actions.jsm");
 const {insertPinned, TOP_SITES_SHOWMORE_LENGTH} = require("common/Reducers.jsm");
 
 const FAKE_FAVICON = "data987";
 const FAKE_FAVICON_SIZE = 128;
 const FAKE_FRECENCY = 200;
 const FAKE_LINKS = new Array(TOP_SITES_SHOWMORE_LENGTH).fill(null).map((v, i) => ({
   frecency: FAKE_FRECENCY,
@@ -56,17 +55,17 @@ describe("Top Sites Feed", () => {
         links: [],
         isPinned: () => false,
         pin: sandbox.spy(),
         unpin: sandbox.spy()
       }
     };
     fakeScreenshot = {
       getScreenshotForURL: sandbox.spy(() => Promise.resolve(FAKE_SCREENSHOT)),
-      maybeGetAndSetScreenshot: Screenshots.maybeGetAndSetScreenshot
+      maybeCacheScreenshot: Screenshots.maybeCacheScreenshot
     };
     filterAdultStub = sinon.stub().returns([]);
     shortURLStub = sinon.stub().callsFake(site => site.url);
     const fakeDedupe = function() {};
     globals.set("NewTabUtils", fakeNewTabUtils);
     FakePrefs.prototype.prefs["default.sites"] = "https://foo.com/";
     ({TopSitesFeed, DEFAULT_TOP_SITES} = injector({
       "lib/ActivityStreamPrefs.jsm": {Prefs: FakePrefs},
@@ -90,16 +89,20 @@ describe("Top Sites Feed", () => {
     links = FAKE_LINKS;
     clock = sinon.useFakeTimers();
   });
   afterEach(() => {
     globals.restore();
     clock.restore();
   });
 
+  function stubFaviconsToUseScreenshots() {
+    fakeNewTabUtils.activityStreamProvider._addFavicons = sandbox.stub();
+  }
+
   describe("#refreshDefaults", () => {
     it("should add defaults on PREFS_INITIAL_VALUES", () => {
       feed.onAction({type: at.PREFS_INITIAL_VALUES, data: {"default.sites": "https://foo.com"}});
 
       assert.isAbove(DEFAULT_TOP_SITES.length, 0);
     });
     it("should add defaults on PREF_CHANGED", () => {
       feed.onAction({type: at.PREF_CHANGED, data: {name: "default.sites", value: "https://foo.com"}});
@@ -131,17 +134,17 @@ describe("Top Sites Feed", () => {
   });
   describe("#getLinksWithDefaults", () => {
     beforeEach(() => {
       feed.refreshDefaults("https://foo.com");
     });
 
     describe("general", () => {
       beforeEach(() => {
-        sandbox.stub(fakeScreenshot, "maybeGetAndSetScreenshot");
+        sandbox.stub(fakeScreenshot, "maybeCacheScreenshot");
       });
       it("should get the links from NewTabUtils", async () => {
         const result = await feed.getLinksWithDefaults();
         const reference = links.map(site => Object.assign({}, site, {hostname: shortURLStub(site)}));
 
         assert.deepEqual(result, reference);
         assert.calledOnce(global.NewTabUtils.activityStreamLinks.getTopSites);
       });
@@ -209,17 +212,17 @@ describe("Top Sites Feed", () => {
         const reference = [...links, DEFAULT_TOP_SITES[0]].map(s => Object.assign({}, s, {hostname: shortURLStub(s)}));
 
         assert.lengthOf(result, TOP_SITES_SHOWMORE_LENGTH);
         assert.deepEqual(result, reference);
       });
       it("should not throw if NewTabUtils returns null", () => {
         links = null;
         assert.doesNotThrow(() => {
-          feed.getLinksWithDefaults(action);
+          feed.getLinksWithDefaults();
         });
       });
       it("should get more if the user has asked for more", async () => {
         feed.store.state.Prefs.values.topSitesCount = TOP_SITES_SHOWMORE_LENGTH + 1;
 
         const result = await feed.getLinksWithDefaults();
 
         assert.propertyVal(result, "length", feed.store.state.Prefs.values.topSitesCount);
@@ -236,18 +239,17 @@ describe("Top Sites Feed", () => {
         await feed.getLinksWithDefaults();
         feed.store.state.Prefs.values.topSitesCount *= 3;
 
         await feed.getLinksWithDefaults();
 
         assert.calledTwice(global.NewTabUtils.activityStreamLinks.getTopSites);
       });
       it("should migrate frecent screenshot data without getting screenshots again", async () => {
-        // Don't add favicons so we fall back to screenshots
-        fakeNewTabUtils.activityStreamProvider._addFavicons = sandbox.stub();
+        stubFaviconsToUseScreenshots();
         await feed.getLinksWithDefaults();
         const {callCount} = fakeScreenshot.getScreenshotForURL;
         feed.frecentCache.expire();
 
         const result = await feed.getLinksWithDefaults();
 
         assert.calledTwice(global.NewTabUtils.activityStreamLinks.getTopSites);
         assert.callCount(fakeScreenshot.getScreenshotForURL, callCount);
@@ -266,16 +268,46 @@ describe("Top Sites Feed", () => {
         assert.propertyVal(result[0], "faviconSize", FAKE_FAVICON_SIZE);
       });
       it("should not expose internal link properties", async() => {
         const result = await feed.getLinksWithDefaults();
 
         const internal = Object.keys(result[0]).filter(key => key.startsWith("__"));
         assert.equal(internal.join(""), "");
       });
+      describe("concurrency", () => {
+        let resolvers;
+        beforeEach(() => {
+          stubFaviconsToUseScreenshots();
+          resolvers = [];
+          fakeScreenshot.getScreenshotForURL = sandbox.spy(() => new Promise(
+            resolve => resolvers.push(resolve)));
+        });
+
+        const getTwice = () => Promise.all([feed.getLinksWithDefaults(), feed.getLinksWithDefaults()]);
+        const resolveAll = () => resolvers.forEach(resolve => resolve(FAKE_SCREENSHOT));
+
+        it("should call the backing data once", async () => {
+          await getTwice();
+
+          assert.calledOnce(global.NewTabUtils.activityStreamLinks.getTopSites);
+        });
+        it("should get screenshots once per link", async () => {
+          await getTwice();
+
+          assert.callCount(fakeScreenshot.getScreenshotForURL, FAKE_LINKS.length);
+        });
+        it("should dispatch once per link screenshot fetched", async () => {
+          await getTwice();
+
+          await resolveAll();
+
+          assert.callCount(feed.store.dispatch, FAKE_LINKS.length);
+        });
+      });
     });
     describe("deduping", () => {
       beforeEach(() => {
         ({TopSitesFeed, DEFAULT_TOP_SITES} = injector({
           "lib/ActivityStreamPrefs.jsm": {Prefs: FakePrefs},
           "common/Reducers.jsm": {insertPinned, TOP_SITES_SHOWMORE_LENGTH},
           "lib/Screenshots.jsm": {Screenshots: fakeScreenshot}
         }));
@@ -329,78 +361,94 @@ describe("Top Sites Feed", () => {
         fakeNewTabUtils.pinnedLinks.links = [null];
 
         await feed.getLinksWithDefaults();
       });
     });
     it("should call _fetchIcon for each link", async () => {
       sinon.spy(feed, "_fetchIcon");
 
-      const results = await feed.getLinksWithDefaults(action);
+      const results = await feed.getLinksWithDefaults();
 
       assert.callCount(feed._fetchIcon, results.length);
       results.forEach(link => {
         assert.calledWith(feed._fetchIcon, link);
       });
     });
   });
   describe("#refresh", () => {
     beforeEach(() => {
       sandbox.stub(feed, "_fetchIcon");
     });
     it("should initialise _tippyTopProvider if it's not already initialised", async () => {
       feed._tippyTopProvider.initialized = false;
-      await feed.refresh(action);
+      await feed.refresh();
       assert.ok(feed._tippyTopProvider.initialized);
     });
+    it("should broadcast with no target", async () => {
+      sinon.stub(feed, "getLinksWithDefaults").returns(Promise.resolve([]));
+
+      await feed.refresh();
+
+      assert.calledOnce(feed.store.dispatch);
+      assert.notProperty(feed.store.dispatch.firstCall.args[0].meta, "toTarget");
+    });
+    it("should respond to a specific target", async () => {
+      sinon.stub(feed, "getLinksWithDefaults").returns(Promise.resolve([]));
+
+      await feed.refresh({meta: {fromTarget: {}}});
+
+      assert.calledOnce(feed.store.dispatch);
+      assert.property(feed.store.dispatch.firstCall.args[0].meta, "toTarget");
+    });
     it("should dispatch an action with the links returned", async () => {
-      await feed.refresh(action);
+      await feed.refresh();
       const reference = links.map(site => Object.assign({}, site, {hostname: shortURLStub(site)}));
 
       assert.calledOnce(feed.store.dispatch);
       assert.propertyVal(feed.store.dispatch.firstCall.args[0], "type", at.TOP_SITES_UPDATED);
       assert.deepEqual(feed.store.dispatch.firstCall.args[0].data, reference);
     });
     it("should handle empty slots in the resulting top sites array", async () => {
       links = [FAKE_LINKS[0]];
       fakeNewTabUtils.pinnedLinks.links = [null, null, FAKE_LINKS[1], null, null, null, null, null, FAKE_LINKS[2]];
-      await feed.refresh(action);
+      await feed.refresh();
       assert.calledOnce(feed.store.dispatch);
     });
   });
   describe("#_fetchIcon", () => {
     it("should reuse screenshot on the link", () => {
       const link = {screenshot: "reuse.png"};
 
       feed._fetchIcon(link);
 
       assert.notCalled(fakeScreenshot.getScreenshotForURL);
       assert.propertyVal(link, "screenshot", "reuse.png");
     });
     it("should reuse existing fetching screenshot on the link", async () => {
-      const link = {__fetchingScreenshot: Promise.resolve("fetching.png")};
+      const link = {__sharedCache: {fetchingScreenshot: Promise.resolve("fetching.png")}};
 
       await feed._fetchIcon(link);
 
       assert.notCalled(fakeScreenshot.getScreenshotForURL);
-      assert.propertyVal(link, "screenshot", "fetching.png");
     });
     it("should get a screenshot if the link is missing it", () => {
-      feed._fetchIcon(FAKE_LINKS[0]);
+      feed._fetchIcon(Object.assign({__sharedCache: {}}, FAKE_LINKS[0]));
 
       assert.calledOnce(fakeScreenshot.getScreenshotForURL);
       assert.calledWith(fakeScreenshot.getScreenshotForURL, FAKE_LINKS[0].url);
     });
-    it("should update the link's cache if it can be updated", () => {
-      const link = {__updateCache: sandbox.stub()};
+    it("should update the link's cache with a screenshot", async () => {
+      const updateLink = sandbox.stub();
+      const link = {__sharedCache: {updateLink}};
 
-      feed._fetchIcon(link);
+      await feed._fetchIcon(link);
 
-      assert.calledOnce(link.__updateCache);
-      assert.calledWith(link.__updateCache, "__fetchingScreenshot");
+      assert.calledOnce(updateLink);
+      assert.calledWith(updateLink, "screenshot", FAKE_SCREENSHOT);
     });
     it("should skip getting a screenshot if there is a tippy top icon", () => {
       feed._tippyTopProvider.processSite = site => {
         site.tippyTopIcon = "icon.png";
         site.backgroundColor = "#fff";
         return site;
       };
       const link = {url: "example.com"};
@@ -574,9 +622,38 @@ describe("Top Sites Feed", () => {
     it("should NOT move a pinned site in specified slot to the next slot", () => {
       fakeNewTabUtils.pinnedLinks.links = [null, null, {url: "example.com"}];
       const site = {url: "foo.bar", label: "foo"};
       feed.pin({data: {index: 2, site}});
       assert.calledOnce(fakeNewTabUtils.pinnedLinks.pin);
       assert.calledWith(fakeNewTabUtils.pinnedLinks.pin, site, 2);
     });
   });
+  describe("integration", () => {
+    let resolvers = [];
+    beforeEach(() => {
+      feed.store.dispatch = sandbox.stub().callsFake(() => {
+        resolvers.shift()();
+      });
+      fakeScreenshot.getScreenshotForURL = sandbox.spy();
+    });
+
+    const forDispatch = action => new Promise(resolve => {
+      resolvers.push(resolve);
+      feed.onAction(action);
+    });
+
+    it("should add a pinned site and remove it", async () => {
+      const url = "pin.me";
+      fakeNewTabUtils.pinnedLinks.pin = sandbox.stub().callsFake(link => {
+        fakeNewTabUtils.pinnedLinks.links.push(link);
+      });
+
+      await forDispatch({type: at.TOP_SITES_ADD, data: {site: {url}}});
+      fakeNewTabUtils.pinnedLinks.links.pop();
+      await forDispatch({type: at.PLACES_LINK_BLOCKED});
+
+      assert.calledTwice(feed.store.dispatch);
+      assert.equal(feed.store.dispatch.firstCall.args[0].data[0].url, url);
+      assert.equal(feed.store.dispatch.secondCall.args[0].data[0].url, FAKE_LINKS[0].url);
+    });
+  });
 });
--- a/browser/extensions/followonsearch/bootstrap.js
+++ b/browser/extensions/followonsearch/bootstrap.js
@@ -1,12 +1,14 @@
 /* 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/. */
 
+/* global APP_SHUTDOWN:false */
+
 "use strict";
 
 const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Timer.jsm");
 
 // Preferences this add-on uses.
@@ -54,17 +56,21 @@ function handleSaveTelemetryMsg(message)
 
   if (!validSearchTypes.includes(info.type)) {
     throw new Error("Unexpected type!");
   }
 
   log(info);
 
   let histogram = Services.telemetry.getKeyedHistogramById("SEARCH_COUNTS");
-  histogram.add(`${info.sap}.${info.type}:unknown:${info.code}`);
+  let payload = `${info.sap}.${info.type}:unknown:${info.code}`;
+  if (info.extra) {
+    payload += `:${info.extra}`
+  }
+  histogram.add(payload);
 }
 
 /**
  * Activates recording of telemetry if it isn't already activated.
  */
 function activateTelemetry() {
   if (gTelemetryActivated) {
     return;
@@ -128,36 +134,27 @@ var cohortManager = {
 
 /**
  * Called when the add-on is installed.
  *
  * @param {Object} data Data about the add-on.
  * @param {Number} reason Indicates why the extension is being installed.
  */
 function install(data, reason) {
-  try {
-    gLoggingEnabled = Services.prefs.getBoolPref(PREF_LOGGING, false);
-  } catch (e) {
-    // Needed until Firefox 54
-  }
-
-  cohortManager.init();
-  if (cohortManager.enableForUser) {
-    activateTelemetry();
-  }
+  // Nothing specifically to do, startup will set everything up for us.
 }
 
 /**
  * Called when the add-on is uninstalled.
  *
  * @param {Object} data Data about the add-on.
  * @param {Number} reason Indicates why the extension is being uninstalled.
  */
 function uninstall(data, reason) {
-  deactivateTelemetry();
+  // Nothing specifically to do, shutdown does what we need.
 }
 
 /**
  * Called when the add-on starts up.
  *
  * @param {Object} data Data about the add-on.
  * @param {Number} reason Indicates why the extension is being started.
  */
@@ -182,10 +179,15 @@ function startup(data, reason) {
 
 /**
  * Called when the add-on shuts down.
  *
  * @param {Object} data Data about the add-on.
  * @param {Number} reason Indicates why the extension is being shut down.
  */
 function shutdown(data, reason) {
+  // If we're shutting down, skip the cleanup to save time.
+  if (reason === APP_SHUTDOWN) {
+    return;
+  }
+
   deactivateTelemetry();
 }
--- a/browser/extensions/followonsearch/content/followonsearch-fs.js
+++ b/browser/extensions/followonsearch/content/followonsearch-fs.js
@@ -8,33 +8,34 @@
 
 const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.importGlobalProperties(["URLSearchParams"]);
 
 const kExtensionID = "followonsearch@mozilla.com";
 const kSaveTelemetryMsg = `${kExtensionID}:save-telemetry`;
 const kShutdownMsg = `${kExtensionID}:shutdown`;
+const kLastSearchQueueDepth = 10;
 
 /**
  * A map of search domains with their expected codes.
  */
 let searchDomains = [{
   "domains": [ "search.yahoo.co.jp" ],
   "search": "p",
   "followOnSearch": "ai",
   "prefix": "fr",
   "codes": ["mozff"],
   "sap": "yahoo",
 }, {
   "domains": [ "www.bing.com" ],
   "search": "q",
   "prefix": "pc",
   "reportPrefix": "form",
-  "codes": ["MOZI"],
+  "codes": ["MOZI", "MOZD", "MZSL01", "MZSL02", "MZSL03", "MOZ2"],
   "sap": "bing",
 }, {
   // The Yahoo domains to watch for.
   "domains": [
     "search.yahoo.com", "ca.search.yahoo.com", "hk.search.yahoo.com",
     "tw.search.yahoo.com", "mozilla.search.yahoo.com", "us.search.yahoo.com"
   ],
   "search": "p",
@@ -134,70 +135,105 @@ function getSearchDomainCodes(host) {
  * Used for debugging to log messages.
  *
  * @param {String} message The message to log.
  */
 function log(message) {
   // console.log(message);
 }
 
-// Hack to handle the most common reload case.
-// If gLastSearch is the same as the current URL, ignore the search.
+// Hack to handle the most common reload/back/forward case.
+// If gLastSearchQueue includes the current URL, ignore the search.
 // This also prevents us from handling reloads with hashes twice
-let gLastSearch = null;
+let gLastSearchQueue = [];
+gLastSearchQueue.push = function(...args) {
+  if (this.length >= kLastSearchQueueDepth) {
+    this.shift();
+  }
+  return Array.prototype.push.apply(this, args);
+};
 
-// Keep track of the original window we were loaded in
-// so we don't handle requests for other windows.
-let gOriginalWindow = null;
+// Track if we are in the middle of a Google session
+// that started from Firefox
+let searchingGoogle = false;
 
 /**
  * Since most codes are in the URL, we can handle them via
  * a progress listener.
  */
 var webProgressListener = {
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]),
   onLocationChange(aWebProgress, aRequest, aLocation, aFlags)
   {
-    if (aWebProgress.DOMWindow && (aWebProgress.DOMWindow != gOriginalWindow)) {
+    if (aWebProgress.DOMWindow && (aWebProgress.DOMWindow != content)) {
       return;
     }
     try {
       if (!aWebProgress.isTopLevel ||
           // Not a URL
           (!aLocation.schemeIs("http") && !aLocation.schemeIs("https")) ||
           // Doesn't have a query string or a ref
-          (!aLocation.query && !aLocation.ref) ||
-          // Is the same as our last search (avoids reloads)
-          aLocation.spec == gLastSearch) {
+          (!aLocation.query && !aLocation.ref)) {
+        searchingGoogle = false;
+        return;
+      }
+      if (gLastSearchQueue.includes(aLocation.spec)) {
+        // If it's a recent search, just return. We
+        // don't reset searchingGoogle though because
+        // we might still be doing that.
         return;
       }
       let domainInfo = getSearchDomainCodes(aLocation.host);
       if (!domainInfo) {
+        searchingGoogle = false;
         return;
       }
 
       let queries = new URLSearchParams(aLocation.query);
       let code = queries.get(domainInfo.prefix);
+      // Special case Google so we can track searches
+      // without codes from the browser.
+      if (domainInfo.sap == "google") {
+        if (aLocation.filePath == "/search") {
+          gLastSearchQueue.push(aLocation.spec);
+          // Our engine currently sends oe and ie - no one else does
+          if (queries.get("oe") && queries.get("ie")) {
+            sendSaveTelemetryMsg(code ? code : "none", code ? domainInfo.sap : "google-nocodes", "sap");
+            searchingGoogle = true;
+          } else {
+            // The tbm value is the specific type of search (Books, Images, News, etc).
+            // These are referred to as vertical searches.
+            let tbm = queries.get("tbm");
+            if (searchingGoogle) {
+              sendSaveTelemetryMsg(code ? code : "none", code ? domainInfo.sap : "google-nocodes", "follow-on", tbm ? `vertical-${tbm}` : null);
+            } else if (code) {
+              // Trying to do the right thing for back button to existing entries
+              sendSaveTelemetryMsg(code, domainInfo.sap, "follow-on", tbm ? `vertical-${tbm}` : null);
+            }
+          }
+        }
+        // Special case all Google. Otherwise our code can
+        // show up in maps
+        return;
+      }
+      searchingGoogle = false;
       if (queries.get(domainInfo.search)) {
         if (domainInfo.codes.includes(code)) {
           if (domainInfo.reportPrefix &&
               queries.get(domainInfo.reportPrefix)) {
             code = queries.get(domainInfo.reportPrefix);
           }
-          if (domainInfo.sap == "google" && aLocation.ref) {
-            log(`${aLocation.host} search with code ${code} - Follow on`);
-            sendSaveTelemetryMsg(code, domainInfo.sap, "follow-on");
-          } else if (queries.get(domainInfo.followOnSearch)) {
+          if (queries.get(domainInfo.followOnSearch)) {
             log(`${aLocation.host} search with code ${code} - Follow on`);
             sendSaveTelemetryMsg(code, domainInfo.sap, "follow-on");
           } else {
             log(`${aLocation.host} search with code ${code} - First search via Firefox`);
             sendSaveTelemetryMsg(code, domainInfo.sap, "sap");
           }
-          gLastSearch = aLocation.spec;
+          gLastSearchQueue.push(aLocation.spec);
         }
       }
     } catch (e) {
       console.error(e);
     }
   },
 };
 
@@ -231,53 +267,53 @@ function onPageLoad(event) {
   if (win != win.top) {
     return;
   }
   var uri = doc.documentURIObject;
   if (!(uri instanceof Ci.nsIStandardURL) ||
       (!uri.schemeIs("http") && !uri.schemeIs("https")) ||
        uri.host != "www.bing.com" ||
       !doc.location.search ||
-      uri.spec == gLastSearch) {
+      gLastSearchQueue.includes(uri.spec)) {
     return;
   }
   var queries = new URLSearchParams(doc.location.search.toLowerCase());
   // For Bing, QBRE form code is used for all follow-on search
   if (queries.get("form") != "qbre") {
     return;
   }
   if (parseCookies(doc.cookie).SRCHS == "PC=MOZI") {
     log(`${uri.host} search with code MOZI - Follow on`);
     sendSaveTelemetryMsg("MOZI", "bing", "follow-on");
-    gLastSearch = uri.spec;
+    gLastSearchQueue.push(uri.spec);
   }
 }
 
 /**
  * Sends a message to the process that added this script to tell it to save
  * telemetry.
  *
  * @param {String} code The codes used for the search engine.
  * @param {String} sap The SAP code.
  * @param {String} type The type of search (sap/follow-on).
+ * @param {String} extra Any additional parameters (Optional)
  */
-function sendSaveTelemetryMsg(code, sap, type) {
+function sendSaveTelemetryMsg(code, sap, type, extra) {
   sendAsyncMessage(kSaveTelemetryMsg, {
     code,
     sap,
     type,
+    extra,
   });
 }
 
 addEventListener("DOMContentLoaded", onPageLoad, false);
 docShell.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebProgress)
         .addProgressListener(webProgressListener, Ci.nsIWebProgress.NOTIFY_LOCATION);
 
-gOriginalWindow = content;
-
 let gDisabled = false;
 
 addMessageListener(kShutdownMsg, () => {
   if (!gDisabled) {
     removeEventListener("DOMContentLoaded", onPageLoad, false);
     docShell.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebProgress)
             .removeProgressListener(webProgressListener);
     gDisabled = true;
--- a/browser/extensions/followonsearch/install.rdf
+++ b/browser/extensions/followonsearch/install.rdf
@@ -2,17 +2,17 @@
 <!-- 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/. -->
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
     <em:id>followonsearch@mozilla.com</em:id>
     <em:name>Follow-on Search Telemetry</em:name>
-    <em:version>0.9.3</em:version>
+    <em:version>0.9.5</em:version>
     <em:type>2</em:type>
     <em:bootstrap>true</em:bootstrap>
     <em:multiprocessCompatible>true</em:multiprocessCompatible>
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>52.0</em:minVersion>
         <em:maxVersion>59.*</em:maxVersion>
--- a/browser/extensions/formautofill/.eslintrc.js
+++ b/browser/extensions/formautofill/.eslintrc.js
@@ -77,34 +77,34 @@ module.exports = {
 
     // Disallow using the console API.
     "no-console": "error",
 
     // Disallow fallthrough of case statements, except if there is a comment.
     "no-fallthrough": "error",
 
     // Disallow use of multiline strings (use template strings instead).
-    "no-multi-str": "warn",
+    "no-multi-str": "error",
 
     // Disallow multiple empty lines.
-    "no-multiple-empty-lines": ["warn", {"max": 2}],
+    "no-multiple-empty-lines": ["error", {"max": 2}],
 
     // Disallow usage of __proto__ property.
     "no-proto": "error",
 
     // Disallow use of assignment in return statement. It is preferable for a
     // single line of code to have only one easily predictable effect.
     "no-return-assign": "error",
 
     // Disallow throwing literals (eg. throw "error" instead of
     // throw new Error("error")).
     "no-throw-literal": "error",
 
     // Disallow padding within blocks.
-    "padded-blocks": ["warn", "never"],
+    "padded-blocks": ["error", "never"],
 
     // Require use of the second argument for parseInt().
     "radix": "error",
 
     // Enforce spacing after semicolons.
     "semi-spacing": ["error", {"before": false, "after": true}],
 
     // Require "use strict" to be defined globally in the script.
--- a/browser/extensions/screenshots/bootstrap.js
+++ b/browser/extensions/screenshots/bootstrap.js
@@ -2,17 +2,16 @@
 // TODO: re-enable
 /* eslint-disable */
 const OLD_ADDON_PREF_NAME = "extensions.jid1-NeEaf3sAHdKHPA@jetpack.deviceIdInfo";
 const OLD_ADDON_ID = "jid1-NeEaf3sAHdKHPA@jetpack";
 const ADDON_ID = "screenshots@mozilla.org";
 const TELEMETRY_ENABLED_PREF = "datareporting.healthreport.uploadEnabled";
 const PREF_BRANCH = "extensions.screenshots.";
 const USER_DISABLE_PREF = "extensions.screenshots.disabled";
-const SYSTEM_DISABLE_PREF = "extensions.screenshots.system-disabled";
 
 const { interfaces: Ci, utils: Cu } = Components;
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "AddonManager",
                                   "resource://gre/modules/AddonManager.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
                                   "resource://gre/modules/AppConstants.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "Console",
@@ -40,17 +39,17 @@ const prefObserver = {
 
   unregister() {
     prefs.removeObserver(PREF_BRANCH, this, false); // eslint-disable-line mozilla/no-useless-parameters
   },
 
   observe(aSubject, aTopic, aData) {
     // aSubject is the nsIPrefBranch we're observing (after appropriate QI)
     // aData is the name of the pref that's been changed (relative to aSubject)
-    if (aData == USER_DISABLE_PREF || aData == SYSTEM_DISABLE_PREF) {
+    if (aData == USER_DISABLE_PREF) {
       // eslint-disable-next-line promise/catch-or-return
       appStartupPromise = appStartupPromise.then(handleStartup);
     }
   }
 };
 
 const appStartupObserver = {
   register() {
@@ -158,17 +157,17 @@ function install(data, reason) {} // esl
 
 function uninstall(data, reason) {} // eslint-disable-line no-unused-vars
 
 function getBoolPref(pref) {
   return prefs.getPrefType(pref) && prefs.getBoolPref(pref);
 }
 
 function shouldDisable() {
-  return getBoolPref(USER_DISABLE_PREF) || getBoolPref(SYSTEM_DISABLE_PREF);
+  return getBoolPref(USER_DISABLE_PREF);
 }
 
 function handleStartup() {
   const webExtension = LegacyExtensionsUtils.getEmbeddedExtensionFor({
     id: ADDON_ID,
     resourceURI: addonResourceURI
   });
 
--- a/browser/extensions/screenshots/test/browser/head.js
+++ b/browser/extensions/screenshots/test/browser/head.js
@@ -3,52 +3,52 @@
 // Currently Screenshots is disabled in tests.  We want these tests to work under
 // either case that Screenshots is disabled or enabled on startup of the browser,
 // and that at the end we're reset to the correct state.
 let enabledOnStartup = false;
 
 // ScreenshotsEnabled/Disabled promises return true if it was already
 // Enabled/Disabled, and false if it need to Enable/Disable.
 function promiseScreenshotsEnabled() {
-  if (!Services.prefs.getBoolPref("extensions.screenshots.system-disabled", false)) {
+  if (!Services.prefs.getBoolPref("extensions.screenshots.disabled", false)) {
     info("Screenshots was already enabled, assuming enabled by default for tests");
     enabledOnStartup = true;
     return Promise.resolve(true);
   }
   info("Screenshots is not enabled");
   return new Promise((resolve, reject) => {
     let interval = setInterval(() => {
       let action = PageActions.actionForID("screenshots");
       if (action) {
         info("screenshots page action created");
         clearInterval(interval);
         resolve(false);
       }
     }, 100);
     info("Set Screenshots disabled pref to false.");
-    Services.prefs.setBoolPref("extensions.screenshots.system-disabled", false);
+    Services.prefs.setBoolPref("extensions.screenshots.disabled", false);
   });
 }
 
 function promiseScreenshotsDisabled() {
-  if (Services.prefs.getBoolPref("extensions.screenshots.system-disabled", false)) {
+  if (Services.prefs.getBoolPref("extensions.screenshots.disabled", false)) {
     info("Screenshots already disabled");
     return Promise.resolve(true);
   }
   return new Promise((resolve, reject) => {
     let interval = setInterval(() => {
       let action = PageActions.actionForID("screenshots");
       if (!action) {
         info("screenshots page action removed");
         clearInterval(interval);
         resolve(false);
       }
     }, 100);
     info("Set Screenshots disabled pref to true.");
-    Services.prefs.setBoolPref("extensions.screenshots.system-disabled", true);
+    Services.prefs.setBoolPref("extensions.screenshots.disabled", true);
   });
 }
 
 function promiseScreenshotsReset() { // eslint-disable-line no-unused-vars
   if (enabledOnStartup) {
     info("Reset is enabling Screenshots addon");
     return promiseScreenshotsEnabled();
   }
--- a/browser/locales/en-US/chrome/browser/aboutSessionRestore.dtd
+++ b/browser/locales/en-US/chrome/browser/aboutSessionRestore.dtd
@@ -5,16 +5,19 @@
 <!ENTITY restorepage.tabtitle       "Restore Session">
 
 <!-- LOCALIZATION NOTE: The title is intended to be apologetic and disarming, expressing dismay
      and regret that we are unable to restore the session for the user -->
 <!ENTITY restorepage.errorTitle2    "Sorry. We’re having trouble getting your pages back.">
 <!ENTITY restorepage.problemDesc2   "We are having trouble restoring your last browsing session. Select Restore Session to try again.">
 <!ENTITY restorepage.tryThis2       "Still not able to restore your session? Sometimes a tab is causing the issue. View previous tabs, remove the checkmark from the tabs you don’t need to recover, and then restore.">
 
+<!ENTITY restorepage.hideTabs       "Hide Previous Tabs">
+<!ENTITY restorepage.showTabs       "View Previous Tabs">
+
 <!ENTITY restorepage.tryagainButton2 "Restore Session">
 <!ENTITY restorepage.restore.access2 "R">
 <!ENTITY restorepage.closeButton2    "Start New Session">
 <!ENTITY restorepage.close.access2   "N">
 
 <!ENTITY restorepage.restoreHeader  "Restore">
 <!ENTITY restorepage.listHeader     "Windows and Tabs">
 <!-- LOCALIZATION NOTE: &#37;S will be replaced with a number. -->
--- a/browser/modules/PingCentre.jsm
+++ b/browser/modules/PingCentre.jsm
@@ -13,17 +13,16 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   "resource://gre/modules/ClientID.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "TelemetryEnvironment",
   "resource://gre/modules/TelemetryEnvironment.jsm");
 
 const PREF_BRANCH = "browser.ping-centre.";
 
 const TELEMETRY_PREF = `${PREF_BRANCH}telemetry`;
 const LOGGING_PREF = `${PREF_BRANCH}log`;
-const STAGING_ENDPOINT_PREF = `${PREF_BRANCH}staging.endpoint`;
 const PRODUCTION_ENDPOINT_PREF = `${PREF_BRANCH}production.endpoint`;
 
 const FHR_UPLOAD_ENABLED_PREF = "datareporting.healthreport.uploadEnabled";
 
 /**
  * Observe various notifications and send them to a telemetry endpoint.
  *
  * @param {Object} options
@@ -67,20 +66,18 @@ class PingCentre {
     return this._enabled && this._fhrEnabled;
   }
 
   _setPingEndpoint(topic, overrideEndpointPref) {
     const overrideValue = overrideEndpointPref &&
       this._prefs.getStringPref(overrideEndpointPref);
     if (overrideValue) {
       this._pingEndpoint = overrideValue;
-    } else if (AppConstants.MOZ_UPDATE_CHANNEL === "release") {
+    } else {
       this._pingEndpoint = this._prefs.getStringPref(PRODUCTION_ENDPOINT_PREF);
-    } else {
-      this._pingEndpoint = this._prefs.getStringPref(STAGING_ENDPOINT_PREF);
     }
   }
 
   _onLoggingPrefChange(aSubject, aTopic, prefKey) {
     this.logging = this._prefs.getBoolPref(prefKey);
   }
 
   _onTelemetryPrefChange(aSubject, aTopic, prefKey) {
--- a/browser/modules/test/browser/browser.ini
+++ b/browser/modules/test/browser/browser.ini
@@ -32,17 +32,16 @@ skip-if = !e10s
 skip-if = os != "win"
 [browser_UnsubmittedCrashHandler.js]
 run-if = crashreporter
 [browser_urlBar_zoom.js]
 [browser_UsageTelemetry.js]
 [browser_UsageTelemetry_domains.js]
 [browser_UsageTelemetry_private_and_restore.js]
 [browser_UsageTelemetry_urlbar.js]
-skip-if = (os == 'linux' && bits == 32 && debug) # bug 1356758
 support-files =
   usageTelemetrySearchSuggestions.sjs
   usageTelemetrySearchSuggestions.xml
 [browser_UsageTelemetry_searchbar.js]
 support-files =
   usageTelemetrySearchSuggestions.sjs
   usageTelemetrySearchSuggestions.xml
 [browser_UsageTelemetry_content.js]
--- a/browser/modules/test/browser/browser_UsageTelemetry_urlbar.js
+++ b/browser/modules/test/browser/browser_UsageTelemetry_urlbar.js
@@ -26,17 +26,25 @@ function checkHistogramResults(resultInd
   }
 }
 
 let searchInAwesomebar = async function(inputText, win = window) {
   await new Promise(r => waitForFocus(r, win));
   // Write the search query in the urlbar.
   win.gURLBar.focus();
   win.gURLBar.value = inputText;
+
+  // This is not strictly necessary, but some things, like clearing oneoff
+  // buttons status, depend on actual input events that the user would normally
+  // generate.
+  let event = win.document.createEvent("Events");
+  event.initEvent("input", true, true);
+  win.gURLBar.dispatchEvent(event);
   win.gURLBar.controller.startSearch(inputText);
+
   // Wait for the popup to show.
   await BrowserTestUtils.waitForEvent(win.gURLBar.popup, "popupshown");
   // And then for the search to complete.
   await BrowserTestUtils.waitForCondition(() => win.gURLBar.controller.searchStatus >=
                                                 Ci.nsIAutoCompleteController.STATUS_COMPLETE_NO_MATCH);
 };
 
 /**
@@ -44,23 +52,26 @@ let searchInAwesomebar = async function(
  *
  * @param {String} entryName
  *        The name of the elemet to click on.
  */
 function clickURLBarSuggestion(entryName) {
   // The entry in the suggestion list should follow the format:
   // "<search term> <engine name> Search"
   const expectedSuggestionName = entryName + " " + SUGGESTION_ENGINE_NAME + " Search";
-  for (let child of gURLBar.popup.richlistbox.children) {
-    if (child.label === expectedSuggestionName) {
-      // This entry is the search suggestion we're looking for.
-      child.click();
-      return;
+  return BrowserTestUtils.waitForCondition(() => {
+    for (let child of gURLBar.popup.richlistbox.children) {
+      if (child.label === expectedSuggestionName) {
+        // This entry is the search suggestion we're looking for.
+        child.click();
+        return true;
+      }
     }
-  }
+    return false;
+  }, "Waiting for the expected suggestion to appear");
 }
 
 add_task(async function setup() {
   // Create a new search engine.
   Services.search.addEngineWithDetails("MozSearch", "", "mozalias", "", "GET",
                                        "http://example.com/?q={searchTerms}");
 
   // Make it the default search engine.
@@ -374,17 +385,17 @@ add_task(async function test_suggestion_
   Services.search.currentEngine = suggestionEngine;
 
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank");
 
   info("Type a query. Suggestions should be generated by the test engine.");
   let p = BrowserTestUtils.browserLoaded(tab.linkedBrowser);
   await searchInAwesomebar("query");
   info("Clicking the urlbar suggestion.");
-  clickURLBarSuggestion("queryfoo");
+  await clickURLBarSuggestion("queryfoo");
   await p;
 
   // Check if the scalars contain the expected values.
   const scalars = getParentProcessScalars(Ci.nsITelemetry.DATASET_RELEASE_CHANNEL_OPTIN, true, false);
   checkKeyedScalar(scalars, SCALAR_URLBAR, "search_suggestion", 1);
   Assert.equal(Object.keys(scalars[SCALAR_URLBAR]).length, 1,
                "This search must only increment one entry in the scalar.");
 
--- a/browser/themes/linux/preferences/in-content/preferences.css
+++ b/browser/themes/linux/preferences/in-content/preferences.css
@@ -10,17 +10,17 @@ window * {
   font-size: 1.11rem;
 }
 
 caption > label:not(.dialogTitle) {
   font-size: 1.27rem;
 }
 
 .tip-caption,
-.help-button {
+.help-label {
   font-size: 1rem;
 }
 
 .treecol-sortdirection {
   /* override the Linux only toolkit rule */
   -moz-appearance: none;
 }
 
--- a/browser/themes/linux/searchbar.css
+++ b/browser/themes/linux/searchbar.css
@@ -297,12 +297,12 @@ menuitem[cmd="cmd_clearhistory"][disable
 }
 
 .search-setting-button:hover,
 .search-setting-button[selected] {
   background-color: var(--arrowpanel-dimmed-further);
 }
 
 .search-setting-button-compact > .button-box > .button-icon {
-  list-style-image: url("chrome://browser/skin/gear.svg");
+  list-style-image: url("chrome://browser/skin/settings.svg");
   -moz-context-properties: fill;
   fill: currentColor;
 }
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -822,16 +822,20 @@ html|span.ac-emphasize-text-url {
 #tabbrowser-tabs {
   -moz-box-align: stretch;
 }
 
 /**
  * Tab Drag and Drop
  */
 
+.tab-drop-indicator-box {
+  -moz-box-align: center;
+}
+
 .tab-drop-indicator {
   list-style-image: url(chrome://browser/skin/tabbrowser/tabDragIndicator.png);
   margin-top: -2px;
   z-index: 3;
 }
 
 @media (min-resolution: 2dppx) {
   .tab-drop-indicator {
--- a/browser/themes/osx/preferences/in-content/preferences.css
+++ b/browser/themes/osx/preferences/in-content/preferences.css
@@ -10,17 +10,17 @@ window * {
   font-size: 1.36rem;
 }
 
 caption > label:not(.dialogTitle) {
   font-size: 1.55rem;
 }
 
 .tip-caption,
-.help-button {
+.help-label {
   font-size: 1.18rem;
 }
 
 .actionsMenu > .menulist-label-box > .menulist-icon {
   margin-top: 2px;
   margin-inline-start: 2px;
   margin-inline-end: 8px !important;
 }
--- a/browser/themes/osx/searchbar.css
+++ b/browser/themes/osx/searchbar.css
@@ -283,12 +283,12 @@
 }
 
 .search-setting-button:hover,
 .search-setting-button[selected] {
   background-color: var(--arrowpanel-dimmed-further);
 }
 
 .search-setting-button-compact > .button-box > .button-icon {
-  list-style-image: url("chrome://browser/skin/gear.svg");
+  list-style-image: url("chrome://browser/skin/settings.svg");
   -moz-context-properties: fill;
   fill: currentColor;
 }
index a373cae538b323666b9a0a363077c00f73c1a0f6..e53d6bcf0af6d843f5aeb9049d238319e9cc8f01
GIT binary patch
literal 416
zc$@*C0bl-!P)<h;3K|Lk000e1NJLTq000aC0012b1^@s6p8t*60004JNkl<ZILqyn
zJxjw-6o!Ko2UklsONZ{dIaut^a1ccb)wxg*6hVu05l08Xq7cx{SzSU0MF%ILLo{@V
zgI}RTV@Q)|%p>>KQets%?12{!?>W!SIr&nQpBT|~ecHC|9pCp)5jh?;r7seuX%?TX
z;HrA$JQu6Bi^%b)(bGM-Ua!v@kHPg)#rEdb+hMQp?#<vv)3ltt(wJpgwe3Uag@)C=
z_txFR$1NhqtJIv=C=TcaNOd}$v&Ajjr})<TybQxoL*#f1o9%!edI2U}*FBd2GfRM6
z0-onx(EANEo6Qq0OL1f0u{ar#%aIJjIF>-FTrRJ$*r26LrP8t-iAAPVRo!I-xjZ7r
zqZai{%B8tg$w)JWLSc>BB|wfxEz)@J155}g*AL){TB84HLuX@vY}~6MBNGE;lmRgW
zhQPl9e46MlK)TUrsPZR3jyDM4L&-;)7s?Co*BBKIX`!U>y72{(AoHSQW2sL70000<
KMNUMnLSTY+&%F--
index b51b873cbd928ba222d9244eaf5c06562d699427..4d17c445483c5be9f2cd4f0f3ddf415895a47041
GIT binary patch
literal 1183
zc$@*B1YrA#P)<h;3K|Lk000e1NJLTq000;O0024&1^@s6suP*T000DLNkl<ZSi{v=
z-%nF#7;a^Q_MFqx3N2V+PB9@%wk#$iS=J){1xwi2cCmY7mTZZMWXs%)sAb}yRCJ5C
zKp`5YW=_44Eb~W9FezRth21V$_+^WQ0+xJxpL5RFp0BpZap$IQ@+7C<`@YZf{XXZd
z!%^OxgepQ!AP`V|WU8vxdcEGAWL~tvXT&%i7R(^tEqOd1zsu*_t0>C5lH~ost*Rda
zct)Gc<$D`3h~2Ib0;<tVm)G0e+|trEHg>r;nM^*+WHNJ`o0~7lvgvgCAGF2e@m|Cr
z7CFe>N(7D?>RCXR<@bk%h9b+$%m1=h7-EKphkKBNTw~gtC3{W*^}*m<t&@|JH#k9Z
zk+G8x7;7J6Z0{u<hsN|a__!elx!@=@k}3=lz2M{<ImV9PW32I4#)7|;27KTC#aQ-5
zK?EGebXA#pzgwcl{Uf8JXF2&7H_8(i<MZG392hvjWh}fliYn}ceJw2qGb=0FpufLM
zi5IQm_+4FKWo2~{T>9?PM^S^Vc;(7?6amvD(MY}8b+Ld@oUz+~(}J$+z%$y+G02%V
z)?|GAY80H>g5$toPtVTIK7#YaeK9dS%2;~s<=ule_{_1$g@KDW-_s5wPACozZ8uH7
zttbh-EobnVW07lY-9_ST1-ApoAEz^y%V~R|iFQWAg#s`o<t(!y#v&I+Tsd%p+kq{G
zA8TuC>;G4v`BDi1K1FkLb4zfB<6_dSEv5)Qb8NdYMN3Od>HHM&MNTB9rs4dN4p;qP
z0pStGQY97{ZSa|6f4Han5{X1IzsP)>#$vH?IG--izP=zPhDP+>K3~^?=TH$ja*zuf
zh{b-(Z&QBIg2AT4sZ?qi0XY7FL2E#cHnLRec~jG#!{&qLH17UTB+_#gLF;tvJFipX
z`R(D;YkCe09K;niUln{5b&{eS`QzrzM_lAP>Q%#Fd1Cmw{w!Q}$OQ+u%$HsMy2edd
z>-Qg<n3$O2i-~!~J>x$w0&Pzg3X6W{&ctKnf}`AvM|<J8J)SnVqJGoeefrw`{QNUc
z;E##mhL}^QPG3h3a?8DNibX<{@O6Ftu6|Bb7Zbq^F^F|*^S(8?@Y1KD9*||vvAn>5
z2yPV9g;>j97uaTmgPf>#Km<3$7+cbs83N&L2!w4B*cla3c>=zE5w;6>`$gC<&?mxn
z0kuy=<q3Fx7EyTu$~h60Cm{EVs5}9wSA^{X?z18)Pr&t)h{_YF=@C(R0@Xbt>=%fL
zuwCHIhzR=y&WNyG;EgjPY!`5Li?BnWj=q>bdX)fTjDo|O8RczjHk;Kd<sf|vIl6W5
zk9w-DH}d7GRYM6%J$r}B+ZpX|gBhK;F{(f7<?7T7VtBb~)v6^)3Vzbr*|)m7`ckEg
zHuw-@luVXw2YN>3=f@o#9nnPMaT0$w0C+|ld`9ngI9}6G=`_f)`XyD5U%6%VD1c|Q
x!B<>OzSc<ar-n;W+TDus8GvW)kB)8h{6GJd_45u@!eamc002ovPDHLkV1kt-MVkNs
--- a/browser/themes/shared/aboutSessionRestore.css
+++ b/browser/themes/shared/aboutSessionRestore.css
@@ -1,16 +1,79 @@
 %if 0
 /* 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/. */
 %endif
 
+.description-wrapper {
+  background-image: url("chrome://browser/skin/illustrations/error-session-restore.svg");
+  background-repeat: no-repeat;
+  background-size: 38%;
+  padding-inline-start: 38%;
+  background-position: left center;
+  min-height: 300px;
+}
+
 .title {
-  background-image: url("chrome://browser/skin/session-restore.svg");
+  background-image: none;
+}
+
+body[dir="rtl"] .description-wrapper {
+  background-position: right center;
+}
+body[dir="rtl"] #tabsToggle:after {
+  background-position: left center;
+}
+
+#tabsToggle {
+  cursor: pointer;
+  color: #0a84ff;
+  -moz-context-properties: fill;
+  fill: currentColor;
+  border: none;
+  padding: 0;
+  margin: 0;
+  padding-inline-end: 45px;
+  font: inherit;
+  position: relative;
+}
+
+#tabsToggle:after {
+  content: "";
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  top: 0;
+  left: 0;
+  background-image: url("chrome://global/skin/icons/arrow-dropdown-16.svg");
+  background-repeat: no-repeat;
+  background-size: 20px;
+  background-position: right center;
+}
+
+#tabsToggle:not(.show-tabs):after {
+  transform: scaleY(-1);
+}
+
+#tabsToggle:hover {
+  background-color: transparent;
+}
+
+#tabsToggle.show-tabs > #hideTabs,
+#tabsToggle:not(.show-tabs) > #showTabs {
+  display: none;
+}
+
+.tree-container:not(.expanded) {
+  visibility: collapse;
+}
+
+.button-container {
+  text-align: end;
 }
 
 treechildren::-moz-tree-image(icon),
 treechildren::-moz-tree-image(noicon) {
   padding-right: 2px;
   margin: 0 2px;
   width: 16px;
   height: 16px;
--- a/browser/themes/shared/customizableui/panelUI.inc.css
+++ b/browser/themes/shared/customizableui/panelUI.inc.css
@@ -464,16 +464,33 @@ photonpanelmultiview .panel-subview-body
 .panelUI-grid .toolbarbutton-1,
 .panel-customization-placeholder-child {
   -moz-appearance: none;
   -moz-box-orient: vertical;
   width: calc(@menuPanelButtonWidth@);
   height: calc(51px + 2.2em);
 }
 
+.animate-out {
+  animation-name: widget-animate-out;
+  animation-fill-mode: forwards;
+  animation-duration: 500ms;
+}
+
+@keyframes widget-animate-out {
+  0% {
+    opacity: 1;
+    transform: scale(1);
+  }
+  100% {
+    opacity: 0 ;
+    transform: scale(.5);
+  }
+}
+
 toolbarpaletteitem[place=panel] > .toolbarbutton-1 {
   -moz-box-flex: 1;
 }
 
 /* Help SDK buttons fit in. */
 toolbarpaletteitem[place="palette"] > toolbarbutton[constrain-size="true"] > .toolbarbutton-icon,
 toolbarpaletteitem[place="palette"] > toolbarbutton[constrain-size="true"] > .toolbarbutton-badge-stack > .toolbarbutton-icon,
 toolbarpaletteitem[place="palette"] > toolbaritem[sdkstylewidget="true"] > .toolbarbutton-1 > .toolbarbutton-icon,
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/illustrations/error-session-restore.svg
@@ -0,0 +1,65 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="300" height="300" viewBox="0 0 300 300">
+  <defs>
+    <linearGradient id="a" x1="-300.021" y1="-272.736" x2="547.138" y2="574.423" gradientUnits="userSpaceOnUse">
+      <stop offset="0" stop-color="#ccfbff"/>
+      <stop offset="1" stop-color="#c9e4ff"/>
+    </linearGradient>
+    <linearGradient id="b" x1="-18.672" y1="23.78" x2="279.805" y2="322.256" gradientUnits="userSpaceOnUse">
+      <stop offset="0" stop-color="#00c8d7"/>
+      <stop offset="1" stop-color="#0a84ff"/>
+    </linearGradient>
+  </defs>
+  <ellipse cx="147.98" cy="227.18" rx="37.772" ry="5.739" fill="#eaeaee"/>
+  <path d="M166.909 241.114c-3.981-6.089-4.649-6.1-5.174-6.1-.694-.012-20.082-1.128-30.409-1.727l-5.48-2.529a1 1 0 0 0-.736-.04c-.521.174-8.625 2.562-11.7 3.468a1 1 0 0 0 .217 1.957l13.172.854-6.831 3.564a1 1 0 0 0 .458 1.887l45.649.217a1 1 0 0 0 .837-1.547z" fill="#eaeaee"/>
+  <path d="M147.941 251.71l-6.3-4.348a.934.934 0 0 0-.6-.176l-36.954 1.3a1 1 0 0 0-.649.27l-3.478 3.261a1 1 0 0 0 .684 1.729l46.736-.217a1 1 0 0 0 .563-1.823z" fill="#eaeaee"/>
+  <path d="M196.264 252.187l-11.3-9.13a1 1 0 0 0-.718-.218l-26.5 2.39-4.328.216a1 1 0 0 0-.648 1.715l8.7 8.479a1 1 0 0 0 .7.284h.059l33.476-1.957a1 1 0 0 0 .57-1.776z" fill="#eaeaee"/>
+  <path d="M223.976 231.634a1.006 1.006 0 0 0-.71-.319c-11.112-.254-28.009-.689-29.167-.85a1 1 0 0 0-.893 1.7l5 4.782a1 1 0 0 0 .691.277h.051c9.877-.507 24.978-1.217 26.009-1.114a1.108 1.108 0 0 0 1.258-.485c.354-.598.434-1.111-2.239-3.991z" fill="#eaeaee"/>
+  <path d="M157.336 56.28H133.1c-2.108-3.9-7.559-12.719-14.4-14.023-8.952-1.707-10.737 7.217-10.737 7.217s-5.949-15.469-21-13.419c-16.878 2.3-8.928 20.065-8.928 20.065H52.627l8.187.159h-8.191a1 1 0 0 0 0 2h104.713a1 1 0 0 0 0-2z" fill="#fff"/>
+  <path d="M255.293 70.249H241.6c-1.129-2.113-4.19-7.156-8.057-7.894-4.978-.949-5.971 4.013-5.971 4.013s-3.309-8.6-11.68-7.462c-9.386 1.278-4.965 11.158-4.965 11.158H196.8l9.462.184h-9.2a1 1 0 0 0 0 2h58.233a1 1 0 0 0 0-2z" fill="#fff"/>
+  <path d="M241.739 47.853l.045-.1c-.058.025-.063.06-.045.1z" fill="#fff"/>
+  <path d="M153.55 53.855h-3a.5.5 0 0 1 0-1h3a.5.5 0 0 1 0 1zm-11 0h-8.07a.5.5 0 0 1-.452-.285 38.288 38.288 0 0 0-1.976-3.334.5.5 0 0 1 .837-.549c.393.6 1.445 2.295 1.889 3.168h7.771a.5.5 0 0 1 0 1zm-66.488-.712h-3a.5.5 0 0 1 0-1h3a.5.5 0 0 1 0 1zm-11 0h-12a.5.5 0 0 1 0-1h12a.5.5 0 0 1 0 1zm12.838-1.49a.5.5 0 0 1-.473-.339c-.1-.29-.2-.616-.311-.972a.5.5 0 1 1 .958-.287c.1.344.2.656.3.937a.5.5 0 0 1-.312.635.515.515 0 0 1-.162.026zm30.5-5.153a.506.506 0 0 1-.468-.32 23.563 23.563 0 0 0-2.181-4.037.5.5 0 0 1 .834-.553 27.46 27.46 0 0 1 1.718 2.983 10.516 10.516 0 0 1 3.679-5.017.5.5 0 1 1 .571.82 10.183 10.183 0 0 0-3.663 5.724.5.5 0 0 1-.4.394.492.492 0 0 1-.09.006zm18.343-2.966a.5.5 0 0 1-.339-.133q-.361-.333-.734-.65a.5.5 0 1 1 .646-.762q.39.33.766.678a.5.5 0 0 1-.339.867zM76.821 41.81a.563.563 0 0 1-.09-.008.5.5 0 0 1-.4-.582c.792-4.351 3.544-7.229 8.181-8.555a.5.5 0 1 1 .275.961c-4.24 1.213-6.754 3.828-7.473 7.773a.5.5 0 0 1-.493.411zm45.892-1.221a.5.5 0 0 1-.236-.06 12.614 12.614 0 0 0-2.667-1.082.5.5 0 0 1 .262-.965 13.589 13.589 0 0 1 2.879 1.166.5.5 0 0 1-.237.94zm-22.76-4.664a.5.5 0 0 1-.28-.086q-.4-.271-.82-.525a.5.5 0 1 1 .517-.855q.444.267.865.553a.5.5 0 0 1-.281.914zm-4.47-2.2a.5.5 0 0 1-.154-.024 16.412 16.412 0 0 0-2.832-.647.5.5 0 0 1 .137-.99 17.452 17.452 0 0 1 3 .687.5.5 0 0 1-.154.976z" fill="#eaeaee"/>
+  <path d="M182.316 98.659a18.015 18.015 0 0 1-9.94-2.7 21.661 21.661 0 0 0-21.783 0 19.662 19.662 0 0 1-19.879 0 21.655 21.655 0 0 0-21.78 0 19.65 19.65 0 0 1-19.873 0 19.92 19.92 0 0 0-10.886-2.937 19.931 19.931 0 0 0-10.889 2.938 18.005 18.005 0 0 1-9.937 2.7 18 18 0 0 1-9.936-2.7 19.926 19.926 0 0 0-10.888-2.937 1 1 0 0 0 0 2 18 18 0 0 1 9.936 2.7 19.926 19.926 0 0 0 10.888 2.938 19.932 19.932 0 0 0 10.89-2.938 18 18 0 0 1 9.937-2.7 18 18 0 0 1 9.934 2.7 21.649 21.649 0 0 0 21.777 0 19.657 19.657 0 0 1 19.876 0 21.659 21.659 0 0 0 21.782 0 19.666 19.666 0 0 1 19.881 0 19.937 19.937 0 0 0 10.892 2.938 1 1 0 0 0 0-2zm66.143-10.24a.5.5 0 0 0-.7-.084 19.457 19.457 0 0 1-9.2 3.162 11.427 11.427 0 0 1-3.738-.029c2-.62 3.759-1.488 4.548-2.628.953-1.376.377-2.177.086-2.457-.88-.849-2.82-.664-4.236.4-1.065.8-2.892 2.666-2.477 4.2a29.546 29.546 0 0 1-4.815.685.5.5 0 0 0 .024 1h.025a30.5 30.5 0 0 0 5.355-.79c.88.715 2.643.915 5.337.616 6.261-.7 9.574-3.263 9.712-3.371a.5.5 0 0 0 .079-.704zm-12.646-.839a3.515 3.515 0 0 1 2.052-.735 1.318 1.318 0 0 1 .891.259c.31.3 0 .859-.215 1.168-.734 1.06-2.664 1.894-4.832 2.472-.233-.777.881-2.244 2.104-3.164zm-103.279 3.449a17.836 17.836 0 0 0 2.88 1.09.5.5 0 0 0 .27-.963 16.942 16.942 0 0 1-2.722-1.031.5.5 0 1 0-.428.9zm-18.885-2.8a.483.483 0 0 0 .168-.029 18.775 18.775 0 0 1 6.459-1 20.224 20.224 0 0 1 5.081.581.5.5 0 1 0 .249-.969 21.191 21.191 0 0 0-5.33-.612 19.728 19.728 0 0 0-6.795 1.062.5.5 0 0 0 .168.971zm35.6 2.948a.5.5 0 0 0 .208-.046c.81-.373 1.565-.782 2.3-1.178a18.324 18.324 0 0 1 8.719-2.718.5.5 0 0 0-.057-1 19.381 19.381 0 0 0-9.139 2.837c-.716.388-1.458.789-2.237 1.148a.5.5 0 0 0 .209.954zm18.929-3.052a19.413 19.413 0 0 1 2.681 1.165.5.5 0 0 0 .457-.891 20.737 20.737 0 0 0-2.815-1.222.5.5 0 0 0-.323.947zm-28.717 4.656c.328.02.666.034 1.017.043h.013a.5.5 0 0 0 .013-1 26.883 26.883 0 0 1-.981-.041.5.5 0 0 0-.061 1zm-34.925-.516a.516.516 0 0 0 .121-.015c.345-.086.674-.18.992-.28a.5.5 0 1 0-.3-.953q-.448.142-.932.263a.5.5 0 0 0 .12.985zm69.891-1.124c.3.141.619.276.944.4a.486.486 0 0 0 .184.035.5.5 0 0 0 .184-.965c-.308-.122-.6-.25-.893-.383a.5.5 0 0 0-.418.908zm31.973-4.795a24.722 24.722 0 0 0-2.812-.152h-.246a.5.5 0 0 0 .006 1h.239a23.378 23.378 0 0 1 2.7.146h.058a.5.5 0 0 0 .057-1zm4.957 1.286a18.905 18.905 0 0 0-.957-.373.5.5 0 1 0-.337.941c.313.112.614.231.906.354a.5.5 0 0 0 .388-.922zm13.064 4.2a20.357 20.357 0 0 1-4.951-.548.5.5 0 0 0-.241.971 21.357 21.357 0 0 0 5.192.577.5.5 0 1 0 0-1zM78.626 87.193A18.422 18.422 0 0 1 88.8 89.95l.942.506a.5.5 0 0 0 .468-.885l-.934-.5a19.489 19.489 0 0 0-10.649-2.878.5.5 0 0 0 0 1zm116.741.636c-.863.392-1.662.824-2.435 1.242a18.337 18.337 0 0 1-8.572 2.708.5.5 0 0 0 .031 1h.032a19.407 19.407 0 0 0 8.985-2.827c.758-.409 1.542-.833 2.373-1.211a.5.5 0 1 0-.413-.91zm-97.823 4.933c.6.044 1.243.066 1.905.066q.6 0 1.148-.022a.5.5 0 0 0 .479-.521.493.493 0 0 0-.52-.479 26.789 26.789 0 0 1-2.94-.042.493.493 0 0 0-.535.462.5.5 0 0 0 .463.536z" fill="#eaeaee"/>
+  <path d="M93.5 151.647a18.413 18.413 0 0 1 10.172 2.757c.313.17.627.34.945.507a.5.5 0 1 0 .465-.885c-.314-.165-.624-.333-.934-.5a19.486 19.486 0 0 0-10.648-2.879.5.5 0 0 0 0 1zm18.919 5.567c.518.038 1.067.056 1.631.062v-1a24.239 24.239 0 0 1-1.56-.06.5.5 0 0 0-.073 1zm84.386 7.1a17.993 17.993 0 0 1-9.934-2.7 24.348 24.348 0 0 0-4.74-2.115q-.039 1.039-.087 2.073a24.339 24.339 0 0 1 3.875 1.8 19.91 19.91 0 0 0 10.886 2.938 1 1 0 1 0 0-2zm-83.284 0a18 18 0 0 1-9.935-2.7 19.924 19.924 0 0 0-10.887-2.937 19.92 19.92 0 0 0-10.886 2.938 18 18 0 0 1-9.935 2.7 18 18 0 0 1-9.934-2.7 19.92 19.92 0 0 0-10.886-2.937 1 1 0 0 0 0 2 18 18 0 0 1 9.934 2.7 19.92 19.92 0 0 0 10.886 2.938 19.922 19.922 0 0 0 10.887-2.937 19.644 19.644 0 0 1 19.869 0 19.923 19.923 0 0 0 10.887 2.938c.222 0 .432-.006.645-.011q-.027-1-.047-2c-.202.002-.397.007-.603.007z" fill="#eaeaee"/>
+  <path d="M209.235 68.394h-12a.5.5 0 0 1 0-1h12a.5.5 0 0 1 0 1zm45.582-.184h-1.8a.5.5 0 0 1 0-1h1.8a.5.5 0 0 1 0 1zm-10.8 0h-1a.5.5 0 0 1 0-1h1a.5.5 0 0 1 0 1zm-3.491-2.881a.5.5 0 0 1-.39-.187 18.3 18.3 0 0 0-2-2.129.5.5 0 1 1 .668-.744 19.181 19.181 0 0 1 2.109 2.246.5.5 0 0 1-.389.813zm-12.517-.629a.5.5 0 0 1-.466-.32 13.846 13.846 0 0 0-3.855-5.164.5.5 0 1 1 .623-.781 14.475 14.475 0 0 1 3.623 4.438 5.416 5.416 0 0 1 3.107-3.029.5.5 0 0 1 .326.945 5 5 0 0 0-2.867 3.51.5.5 0 0 1-.447.4zm-17.64-2.036h-.051a.5.5 0 0 1-.447-.548 6.448 6.448 0 0 1 1.057-3.035.5.5 0 1 1 .824.566 5.457 5.457 0 0 0-.886 2.57.5.5 0 0 1-.497.444zm4.193-5.039a.5.5 0 0 1-.151-.977 10.123 10.123 0 0 1 1.018-.264.5.5 0 0 1 .2.98 8.89 8.89 0 0 0-.916.236.512.512 0 0 1-.151.022z" fill="#eaeaee"/>
+  <path d="M104.646 204.6H40.958a1 1 0 0 1 0-2h63.688a1 1 0 1 1 0 2z" fill="#eaeaee"/>
+  <path d="M209.627 204.6h-21.586a1 1 0 0 1 0-2h21.587a1 1 0 0 1 0 2z" fill="#eaeaee"/>
+  <path d="M264.9 204.6h-22.368a1 1 0 0 1 0-2H264.9a1 1 0 0 1 0 2z" fill="#eaeaee"/>
+  <path d="M212.21 123.577a.479.479 0 0 0 .167-.029 18.777 18.777 0 0 1 6.456-1 .5.5 0 0 0 0-1 19.725 19.725 0 0 0-6.791 1.06.5.5 0 0 0 .167.971zm-9.118 4.039a.516.516 0 0 0 .121-.015c.345-.086.674-.18.992-.28a.5.5 0 1 0-.3-.953q-.448.142-.932.263a.5.5 0 0 0 .12.985zm19.345-4.964h.025a30.515 30.515 0 0 0 5.356-.79c.881.714 2.644.916 5.336.616 6.261-.7 9.575-3.264 9.712-3.372a.5.5 0 0 0-.619-.785 19.464 19.464 0 0 1-9.2 3.163 11.451 11.451 0 0 1-3.737-.029c2-.621 3.758-1.488 4.548-2.629.952-1.375.377-2.176.086-2.457-.88-.846-2.82-.664-4.236.4-1.065.8-2.892 2.667-2.476 4.2a29.559 29.559 0 0 1-4.815.685.5.5 0 0 0 .024 1zm7.867-5.087a3.514 3.514 0 0 1 2.051-.735 1.319 1.319 0 0 1 .892.259c.31.3 0 .859-.214 1.168-.734 1.06-2.664 1.894-4.832 2.473-.234-.777.881-2.248 2.099-3.165zm-34.2 10.55c.6.044 1.242.066 1.9.066q.6 0 1.15-.022a.5.5 0 0 0 .479-.521.5.5 0 0 0-.52-.479 26.784 26.784 0 0 1-2.94-.042.494.494 0 0 0-.535.462.5.5 0 0 0 .468.536zm65.04.63a19.926 19.926 0 0 0-10.888 2.938 19.646 19.646 0 0 1-19.87 0 21.646 21.646 0 0 0-21.775 0 19.648 19.648 0 0 1-19.871 0 27.517 27.517 0 0 0-3.86-1.825 8.043 8.043 0 0 1-1.24 1.6l-.067.067a23.017 23.017 0 0 1 4.215 1.913 21.646 21.646 0 0 0 21.775 0 19.648 19.648 0 0 1 19.871 0 21.644 21.644 0 0 0 21.774 0 18 18 0 0 1 9.936-2.7 1 1 0 0 0 0-2zm-15.1 13.382q-.448.142-.932.263a.5.5 0 0 0 .12.985.516.516 0 0 0 .121-.015c.345-.086.674-.18.992-.28a.5.5 0 1 0-.3-.953zM187.36 125.3c.313.17.626.34.944.507a.5.5 0 0 0 .466-.885c-.313-.165-.624-.333-.936-.5a30.785 30.785 0 0 0-3.129-1.539 7.669 7.669 0 0 1 .688 1.4c.675.317 1.317.669 1.967 1.017zm53.9 17.615a26.531 26.531 0 0 1-2.94-.042.5.5 0 0 0-.073 1c.6.044 1.241.066 1.9.066q.6 0 1.152-.022a.5.5 0 0 0 .479-.521.517.517 0 0 0-.52-.477zm19.709-5.611a19.715 19.715 0 0 0-6.786 1.058.5.5 0 0 0 .167.971.479.479 0 0 0 .167-.029 18.767 18.767 0 0 1 6.451-1 .5.5 0 0 0 0-1zm-30.059 3.378c-.314-.165-.624-.333-.934-.5a19.5 19.5 0 0 0-10.648-2.877.5.5 0 0 0 0 1 18.429 18.429 0 0 1 10.172 2.756c.313.17.627.34.945.507a.5.5 0 1 0 .465-.885z" fill="#eaeaee"/>
+  <path d="M186.068 174.772c1.01-10.949 1.759-25.609.451-38.9l.514-.514c5.006-5.033 4.911-12.421-.216-17.577a12.97 12.97 0 0 0-17.732-.631l-4.1-1.107s.429-2.85-.321-3.725a2.606 2.606 0 0 0-1.935-.82s.81-4.055-1.065-5.555c-2.071-1.656-7.945 3-7.945 3-3.551 1.84-9.684 4.594-12.2 4.956-2.875.413-9.386 2.182-15.237 3.867l-.414-.417a12.97 12.97 0 0 0-18.4 0 13.094 13.094 0 0 0 0 18.425l1.835 1.845a281.627 281.627 0 0 0-.386 35.906 21.818 21.818 0 0 0-5.216 17.689c.914 6.436 4.8 9.96 8.711 12.237a45.905 45.905 0 0 0 2.483 7.891 48.514 48.514 0 0 0 1.584 5.944c2.971 8.511 6.707 12.826 11.1 12.826a6.214 6.214 0 0 0 3.926-1.4c1.7-1.391 2.456-3.106 2.576-9.037 4.45.407 9.479.63 14.506.63 3.466 0 7.989-.107 12.491-.521-.062 5.242.283 7.251 2.332 8.929a6.041 6.041 0 0 0 3.818 1.358c5.994 0 9.9-8.623 11.693-13.763a54.51 54.51 0 0 0 2.272-9.4 22.5 22.5 0 0 0 .282-1.662c5.6-3.181 9.206-8.133 10.03-13.929a18.73 18.73 0 0 0-5.437-16.545z" fill="#fff"/>
+  <path d="M180.923 176.649c1.356-13.432 2.047-29.548.435-42.9l2.282-2.282c3.039-3.056 2.813-7.153-.227-10.209a7.753 7.753 0 0 0-11.006 0l-1.5 1.506-10.849-2.927V116.9l-5.485.652 1.837-4.185s-9.323 4.837-13.862 5.489c-3.256.468-12.518 3.116-17.495 4.577l-2.6-2.612a7.753 7.753 0 0 0-11.006 0 7.856 7.856 0 0 0 0 11.067l3.588 3.608c-1 8.19-1.392 24.339-.5 39.878a16.356 16.356 0 0 0-5.384 14.9c.691 4.861 3.718 7.353 8.133 9.5a43.736 43.736 0 0 0 2.876 9.68 46.786 46.786 0 0 0 1.529 5.906c2.594 7.432 5.5 10.17 6.8 9.108.621-.509.764-5.158.623-10.882 10.036 1.55 27.191 1.879 37.611.037-.141 5.711-.339 10.337.281 10.845 1.3 1.062 4.686-2.654 7.28-10.086a49.724 49.724 0 0 0 2.075-8.686c.24-1.009.389-2.865.65-4.129 4.971-2.094 8.871-5.932 9.619-11.195 1.06-7.448-2.858-11.281-5.705-13.723z" fill="url(#a)"/>
+  <g fill="#f9f9fa">
+    <path d="M157.681 202.625c-7.81-1.785-7.984-6.013-7.316-8.5l-5.042-.149c.345 2.51-.575 6.011-7.5 7.594a37.408 37.408 0 0 1-10.215.863c9.456 9.453 32.143 9.571 41.307.752a33.732 33.732 0 0 1-11.234-.56z"/>
+    <path d="M174.91 164.318a9.715 9.715 0 0 0 2.452-3.815c.485-10.321.055-20.871-2.338-29.052-2.232-7.632-28.394-17.552-50.949-2.609-4.418 2.927-5.452 17.609-4.682 33.059a13.622 13.622 0 0 0 1.968 2.818c2.466 2.659.879 4.441-1.338 6.078a179.491 179.491 0 0 0 2.655 18.852 16.685 16.685 0 0 0 4.478 1.311l-.076-24.062 17.388.691 2.177-5.053h6.114l2.011 5.434 15.319.637-.706 23.843a20.118 20.118 0 0 0 4.39-1.865c.9-4.84 1.941-11.371 2.7-18.563-2.273-2.035-4.473-5.278-1.563-7.704z"/>
+  </g>
+  <g fill="url(#b)">
+    <path d="M128.086 142.316a1.412 1.412 0 0 0 1.411-1.41v-3.162a1.41 1.41 0 1 0-2.821 0v3.162a1.412 1.412 0 0 0 1.41 1.41z"/>
+    <path d="M163.123 142.316a1.412 1.412 0 0 0 1.411-1.41v-3.162a1.41 1.41 0 1 0-2.821 0v3.162a1.412 1.412 0 0 0 1.41 1.41z"/>
+    <path d="M167.475 144.641a1 1 0 0 0-1.383.28 3.677 3.677 0 0 1-5.937 0 1 1 0 0 0-1.675 1.093 5.674 5.674 0 0 0 9.287 0 1 1 0 0 0-.292-1.373z"/>
+    <path d="M132.434 144.633a1 1 0 0 0-1.383.295 3.758 3.758 0 0 1-2.965 1.5 3.709 3.709 0 0 1-2.968-1.506 1 1 0 0 0-1.675 1.093 5.674 5.674 0 0 0 9.287 0 1 1 0 0 0-.296-1.382z"/>
+    <path d="M156.383 149.1a3.079 3.079 0 0 1-2.589-.454 5.065 5.065 0 0 1-1.237-1.437 14.022 14.022 0 0 0 4.227-4.094 2.611 2.611 0 0 0 .316-2.192 1.475 1.475 0 0 0-1.215-.9c-2.294-.468-9.138 1.038-12.121 4.226a1.236 1.236 0 0 0-.175 1.476c.667 1.18 4.491 2.1 6.339 2.316a7.2 7.2 0 0 1-.174 1.908 4.738 4.738 0 0 1-3.063 3.2 1 1 0 0 0 .563 1.919 6.765 6.765 0 0 0 4.441-4.631 7.768 7.768 0 0 0 .161-.853 4.526 4.526 0 0 0 .864.75 5.069 5.069 0 0 0 4.408.626 1 1 0 0 0-.743-1.857z"/>
+    <path stroke="#59acff" stroke-linecap="round" stroke-linejoin="round" d="M116.035 173.443l-4.139 3.327"/>
+    <path d="M125.989 190.92h-.029c-4.94-.28-6.414-3.149-6.474-3.271a.5.5 0 0 1 .9-.445c.055.105 1.317 2.473 5.636 2.719a.5.5 0 0 1-.028 1z"/>
+    <path d="M169.551 192.631a4.541 4.541 0 0 1-.563-.035.5.5 0 1 1 .124-.992c3.16.386 6.822-3.654 6.858-3.7a.5.5 0 0 1 .746.666c-.154.178-3.658 4.061-7.165 4.061z"/>
+    <path d="M183.016 175.823c1.106-11.346 2.011-27.289.441-41.342l1.6-1.6c3.752-3.772 3.659-9.13-.223-13.034a9.753 9.753 0 0 0-13.842 0l-.68.683-8.249-2.225v-1.4a2 2 0 0 0-2.236-1.986l-2.011.239.431-.982a2 2 0 0 0-2.752-2.579c-2.511 1.3-9.781 4.79-13.226 5.284-3.123.449-11.319 2.756-16.631 4.3l-1.759-1.769a9.752 9.752 0 0 0-13.842 0 9.869 9.869 0 0 0 0 13.888l2.909 2.925c-.839 7.717-1.311 22.481-.456 38.32a18.247 18.247 0 0 0-5.315 16.012c.785 5.528 4.3 8.4 7.952 10.359a.973.973 0 0 0 .379.315l.044.018a44.416 44.416 0 0 0 2.707 8.865 47.481 47.481 0 0 0 1.548 5.908c1.391 3.985 4.288 10.669 8.067 10.669a2.948 2.948 0 0 0 1.888-.672c.741-.607 1.506-1.232 1.4-10.127a149.239 149.239 0 0 0 17.72.992 122.747 122.747 0 0 0 15.786-.912c-.187 7.245-.156 9.04 1.075 10.048a2.777 2.777 0 0 0 1.78.631c3.395 0 6.7-6 8.655-11.606a51.053 51.053 0 0 0 2.149-8.956c.138-.606.239-1.364.346-2.163.043-.324.087-.653.133-.968a21.447 21.447 0 0 0 2.278-1.27c.384-.2.763-.42 1.127-.66a.978.978 0 0 0 .307-.341 15.378 15.378 0 0 0 6.094-10.03 15.622 15.622 0 0 0-5.594-14.834zm3.615 14.554a13.725 13.725 0 0 1-6.578 9.6c-4.748 2.479-11.193 2.162-11.262 2.162a1 1 0 0 0-.111 2c.065 0 .426.022 1 .022a30.255 30.255 0 0 0 7.052-.837c-.121.893-.231 1.788-.373 2.385a49.721 49.721 0 0 1-2.075 8.686c-2.3 6.6-5.231 10.265-6.767 10.265a.788.788 0 0 1-.513-.178c-.588-.481-.44-4.669-.3-9.971a92.144 92.144 0 0 0 3.713-.719.5.5 0 1 0-.213-.977 95.1 95.1 0 0 1-10.957 1.71c-3.286.248-6.816.369-10.368.369-3.15 0-6.3-.1-9.3-.267a93.424 93.424 0 0 1-15-2.351.5.5 0 0 0-.265.965c.06.016 1.8.483 4.818 1.03.114 5.411-.04 9.722-.637 10.211a.956.956 0 0 1-.621.22c-1.47 0-3.942-2.918-6.179-9.328a46.793 46.793 0 0 1-1.529-5.906 37.051 37.051 0 0 1-2.391-7.444 43.727 43.727 0 0 0 9.71 1.22h.005a1 1 0 0 0 .005-2c-.065 0-6.126-.055-10.213-1.46-4.41-2.147-7.435-4.639-8.125-9.5a16.356 16.356 0 0 1 5.384-14.9c-.888-15.538-.5-31.687.5-39.878l-3.588-3.608a7.856 7.856 0 0 1 0-11.067 7.752 7.752 0 0 1 11.006 0l1.839 1.849c-6.694 2.774-7.5 6.758-7.537 6.949a.5.5 0 0 0 .983.183c.008-.043.855-3.866 7.552-6.438 5.027-1.473 14.049-4.046 17.255-4.507 4.54-.652 13.862-5.489 13.862-5.489l-1.837 4.185 5.485-.652v2.935l10.7 2.888c5.988 2.057 5.959 4.674 5.957 4.737a.5.5 0 0 0 .448.538h.05a.5.5 0 0 0 .5-.45c.014-.139.235-3.223-6.035-5.565l.726-.73a7.753 7.753 0 0 1 11.006 0c3.039 3.056 3.266 7.154.227 10.209l-2.282 2.282c1.562 12.943.959 28.472-.314 41.645l-3.794-3.566a.5.5 0 1 0-.685.729l4.357 4.1.01.009 1.883 1.77c.011.01.025.014.037.024a13.352 13.352 0 0 1 3.779 11.911z"/>
+    <path d="M168.257 240.857h-.01l-48.258-.979a.5.5 0 0 1-.263-.919l8.478-5.543a.449.449 0 0 1 .3-.08c28.881 1.809 32.47.4 32.853.169a.5.5 0 0 1 .729-.023L168.61 240a.5.5 0 0 1-.354.854z"/>
+    <path d="M147.391 237.905c-4.526 0-12.919-.456-20.082-3.389-9.543-3.907-13.037-8.2-13.719-9.141a.5.5 0 0 1 0-.9l12.716-6.2a.493.493 0 0 1 .449.006.5.5 0 0 1 .263.363c.011.068 1.141 6.818 5.027 9.79 5.259 4.022 11.862 1.9 11.929 1.88a.5.5 0 0 1 .511.121L151 236.96a.5.5 0 0 1-.315.853c-.038.002-1.285.092-3.294.092z"/>
+    <path d="M164.795 253.513c-2.23 0-3.545-.125-3.574-.127a.5.5 0 0 1-.373-.229l-8.561-13.457a.5.5 0 0 1 .4-.769c.109 0 11.008-.447 18.976-4.033 7.87-3.541 10.335-8.282 10.359-8.33a.5.5 0 0 1 .382-.271.5.5 0 0 1 .438.163l13.047 14.678a.5.5 0 0 1 .006.657 36.427 36.427 0 0 1-19.868 10.769 69.143 69.143 0 0 1-11.232.949z"/>
+    <path d="M148.408 251.333l-48.267-.189a.5.5 0 0 1-.343-.862l6.677-6.361a.5.5 0 0 1 .728.041c.378.239 3.928 1.74 32.847.626a.542.542 0 0 1 .3.088l8.341 5.746a.5.5 0 0 1-.284.912z"/>
+    <path d="M226.286 234.554h-.027c-.12-.006-12.14-.7-21.877-4.159-9.865-3.507-14.313-8.4-15.115-9.353a.5.5 0 0 1-.045-.909l9.663-5a.5.5 0 0 1 .635.151c.042.058 4.181 5.759 8.169 8.808 5.376 4.112 15.307 5.541 15.406 5.555a.505.505 0 0 1 .315.175l3.26 3.913a.5.5 0 0 1-.384.82z"/>
+    <path d="M209.79 213.262a.5.5 0 0 1-.408-.788l5.322-7.532a.5.5 0 0 1 .277-.194 24.254 24.254 0 0 0 10.284-6.463 23.325 23.325 0 0 0 4.677-8.068.5.5 0 0 1 .619-.339l13.582 3.951a.5.5 0 0 1 .148.89c-.513 1.044-3.23 5.865-11.973 11.332-9.476 5.926-22.353 7.2-22.482 7.21z"/>
+    <path d="M144.443 167.645l-.217 8.151 1.304-.543.87 1.087 1.087-.979.978 1.196.978-1.196 1.087 1.305.869-1.196.979 1.304.978-1.521 1.413.652v-7.934l-10.326-.326z"/>
+    <path d="M165.622 173.79l-2.857-2.5a.5.5 0 0 0-.65-.007l-2.643 2.214a.5.5 0 0 0 .239.876l1.283.214-.058 1.921a.5.5 0 0 0 .457.513l1.643.144h.043a.5.5 0 0 0 .5-.5v-1.832l1.762-.17a.5.5 0 0 0 .281-.874z"/>
+    <path d="M169.732 172.623a.524.524 0 0 0-.519.481l-.8 21.024-40.759-1.183-.159-15.1a.5.5 0 0 0-.5-.5h-.005a.5.5 0 0 0-.495.5l.164 15.582c0 .015.007.027.009.041a.5.5 0 0 0 .289.569l13.975 6.062a22.293 22.293 0 0 1-6.079 1.544.5.5 0 0 0 .05 1h.051c.194-.02 4.631-.49 7.136-2.035l2.022.877a.5.5 0 0 0 .7-.433l.35-6.6 6.365.185a14.875 14.875 0 0 1-2.8 4.539 24.216 24.216 0 0 1-10.479 6.371.5.5 0 0 0-.342.292l-3.56 8.508a.5.5 0 0 0 .461.693.492.492 0 0 0 .154-.024 64.014 64.014 0 0 0 17.133-9.089l1.849 4.061a.5.5 0 0 0 .374.286.46.46 0 0 0 .082.007.5.5 0 0 0 .364-.157l14.088-14.968s0-.012.009-.017h.044a.5.5 0 0 0 .5-.481l.815-21.52a.5.5 0 0 0-.487-.515z"/>
+    <path d="M170.579 168.566a.439.439 0 0 0-.054-.187.471.471 0 0 0-.049-.078.485.485 0 0 0-.074-.073c-.014-.012-.022-.028-.038-.038l-8.958-5.92a.5.5 0 0 0-.261-.083l-25.205-.746c-.011 0-.021.005-.032.006a.488.488 0 0 0-.115.021 17.081 17.081 0 0 0-.113.036l-8.846 4.957c-.01.006-.013.018-.022.024a.494.494 0 0 0-.189.208.5.5 0 0 0-.042.2l-.08 7.691a.5.5 0 0 0 .495.5H127a.5.5 0 0 0 .5-.5l.075-7.174 14.4.657H142a.5.5 0 0 0 .022-1l-13.17-.6 7.2-4.033 24.924.737 7.375 4.874-11.173-.325a.514.514 0 0 0-.515.485.5.5 0 0 0 .485.515l12.929.376h.015a.49.49 0 0 0 .214-.053.481.481 0 0 0 .05-.033.488.488 0 0 0 .124-.113c.008-.01.021-.015.029-.026s.008-.024.014-.035a.621.621 0 0 0 .06-.187c0-.013.008-.024.009-.038a.475.475 0 0 0-.013-.045z"/>
+    <path d="M169.876 169.851a.5.5 0 0 0-.5.5v.815a.5.5 0 1 0 1 0v-.815a.5.5 0 0 0-.5-.5z"/>
+  </g>
+  <g fill="#fff">
+    <path d="M161.635 234.443c-1.483.6-5.74.859-12.372.777l1.737 1.74a.5.5 0 0 1-.315.853c-.04 0-1.287.093-3.3.093-4.39 0-12.412-.436-19.426-3.137l-6.338 4.144 45.4.92z"/>
+    <path d="M114.627 225.078c1.019 1.253 4.62 5.057 13.061 8.513 8.37 3.426 18.489 3.393 21.81 3.279l-5.512-5.512c-1.421.4-7.462 1.769-12.552-2.125-3.5-2.678-4.888-7.92-5.281-9.77z"/>
+    <path d="M190.3 220.7c1.248 1.357 5.686 5.649 14.414 8.753 7.842 2.788 17.2 3.754 20.433 4.018l-2.385-2.862c-1.471-.224-10.457-1.726-15.683-5.722a49.522 49.522 0 0 1-8.117-8.669z"/>
+    <path d="M215.419 205.661l-4.57 6.469c3.292-.446 13.271-2.132 20.939-6.928 7.762-4.854 10.646-9.2 11.432-10.6l-12.474-3.629a24.19 24.19 0 0 1-4.746 7.985 24.936 24.936 0 0 1-10.581 6.703z"/>
+    <path d="M152.6 194.682a14.244 14.244 0 0 1-3.155 5.187 25.007 25.007 0 0 1-10.718 6.586L135.7 213.7c3.117-1.151 12.491-4.964 18.936-11.311a40.684 40.684 0 0 0 6.307-7.457z"/>
+    <path d="M101.386 250.148l45.406.178-6.872-4.733c-18.61.709-30.359.451-33.017-.7z"/>
+    <path d="M182.553 227.638c-.948 1.463-3.872 5.2-10.477 8.174a38.538 38.538 0 0 1-5.678 1.98L168.61 240a.5.5 0 0 1-.354.854h-.01l-14.223-.288 7.535 11.841a63.477 63.477 0 0 0 14.307-.831 35.459 35.459 0 0 0 18.979-10.112z"/>
+  </g>
+</svg>
deleted file mode 100644
--- a/browser/themes/shared/incontent-icons/session-restore.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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/. -->
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60">
-  <defs>
-    <linearGradient id="gradient" gradientUnits="userSpaceOnUse" x1="30" y1="10" x2="30" y2="50">
-      <stop offset="0" style="stop-color: #fedb00"/>
-      <stop offset="1" style="stop-color: #fcce00"/>
-    </linearGradient>
-  </defs>
-  <path fill="url(#gradient)" d="M49.316,42.867L33.829,12.7c-0.879-1.715-2.274-2.7-3.828-2.7c-1.554,0-2.949,0.985-3.829,2.702 L10.685,42.864c-0.869,1.69-0.913,3.482-0.121,4.909C11.35,49.187,12.817,50,14.591,50h30.82c1.772,0,3.24-0.81,4.023-2.224 C50.227,46.349,50.185,44.56,49.316,42.867z M32.176,22.304l-0.48,14.304h-3.424L27.76,22.304H32.176z M30,44.896 c-1.44,0-2.592-1.184-2.592-2.592c0-1.44,1.152-2.592,2.592-2.592c1.472,0,2.592,1.152,2.592,2.592 C32.592,43.712,31.472,44.896,30,44.896z"/>
-</svg>
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..531bdc9ccd41e167760479b1de6e7aeab74535bb
GIT binary patch
literal 108154
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