merge mozilla-central to mozilla-inbound. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Wed, 13 Sep 2017 13:35:21 +0200
changeset 430169 1171dced91e1926277712a89b95b85c2844e5a1e
parent 430168 39ac5504b7780d02ec1853e54407e30a1c53ff01 (current diff)
parent 430026 1888ec2f277f6bb26271b8808e08914a21db9efe (diff)
child 430170 8244494f59064da8f52196a9d0781d4796ee7e1f
push id7761
push userjlund@mozilla.com
push dateFri, 15 Sep 2017 00:19:52 +0000
treeherdermozilla-beta@c38455951db4 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone57.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
merge mozilla-central to mozilla-inbound. r=merge a=merge
browser/extensions/activity-stream/data/content/tippytop/images/amazon-ca@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/amazon-com@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/amazon-de@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/amazon-fr@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/amazon-uk@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/avito@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/ebay-de@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/leboncoin@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/ok@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/wikipedia-com@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/wykop@2x.png
gfx/layers/wr/StackingContextHelper.cpp
mobile/android/app/src/main/res/drawable-hdpi-v11/ic_menu_bookmark_add.png
mobile/android/app/src/main/res/drawable-hdpi-v11/star_blue.png
mobile/android/app/src/main/res/drawable-xhdpi-v11/ic_menu_bookmark_add.png
mobile/android/app/src/main/res/drawable-xhdpi-v11/star_blue.png
mobile/android/app/src/photon/res/drawable-hdpi/alert_camera.png
mobile/android/app/src/photon/res/drawable-hdpi/alert_download.png
mobile/android/app/src/photon/res/drawable-hdpi/alert_guest.png
mobile/android/app/src/photon/res/drawable-hdpi/alert_mic.png
mobile/android/app/src/photon/res/drawable-hdpi/ic_status_logo.png
mobile/android/app/src/photon/res/drawable-large-mdpi-v11/ic_menu_back.png
mobile/android/app/src/photon/res/drawable-large-mdpi-v11/ic_menu_bookmark_add.png
mobile/android/app/src/photon/res/drawable-large-mdpi-v11/ic_menu_forward.png
mobile/android/app/src/photon/res/drawable-large-mdpi-v11/ic_menu_reload.png
mobile/android/app/src/photon/res/drawable-large-mdpi-v11/ic_menu_stop.png
mobile/android/app/src/photon/res/drawable-large-mdpi-v11/star_blue.png
mobile/android/app/src/photon/res/drawable-large-mdpi-v11/toolbar_favicon_default.png
mobile/android/app/src/photon/res/drawable-ldrtl-mdpi/arrow.png
mobile/android/app/src/photon/res/drawable-ldrtl-mdpi/home_group_collapsed.png
mobile/android/app/src/photon/res/drawable-ldrtl-mdpi/ic_menu_back.png
mobile/android/app/src/photon/res/drawable-ldrtl-mdpi/ic_menu_forward.png
mobile/android/app/src/photon/res/drawable-ldrtl-mdpi/menu_item_more.png
mobile/android/app/src/photon/res/drawable-ldrtl-mdpi/tabs_panel_nav_back.png
mobile/android/app/src/photon/res/drawable-xhdpi/alert_camera.png
mobile/android/app/src/photon/res/drawable-xhdpi/alert_download.png
mobile/android/app/src/photon/res/drawable-xhdpi/alert_guest.png
mobile/android/app/src/photon/res/drawable-xhdpi/alert_mic.png
mobile/android/app/src/photon/res/drawable-xhdpi/ic_status_logo.png
mobile/android/app/src/photon/res/drawable-xxhdpi/alert_camera.png
mobile/android/app/src/photon/res/drawable-xxhdpi/alert_download.png
mobile/android/app/src/photon/res/drawable-xxhdpi/alert_guest.png
mobile/android/app/src/photon/res/drawable-xxhdpi/alert_mic.png
mobile/android/app/src/photon/res/drawable-xxhdpi/ic_status_logo.png
mobile/android/app/src/photon/res/drawable-xxxhdpi/alert_camera.png
mobile/android/app/src/photon/res/drawable-xxxhdpi/alert_download.png
mobile/android/app/src/photon/res/drawable-xxxhdpi/alert_guest.png
mobile/android/app/src/photon/res/drawable-xxxhdpi/alert_mic.png
mobile/android/app/src/photon/res/drawable-xxxhdpi/ic_status_logo.png
modules/libpref/init/all.js
--- a/.clang-format
+++ b/.clang-format
@@ -30,8 +30,18 @@ SortIncludes: false
 
 # All of the following items are default
 # in the Mozila coding style from clang format 4.0
 AlwaysBreakAfterReturnType: TopLevel
 BinPackArguments: false
 BinPackParameters: false
 SpaceAfterTemplateKeyword: false
 ReflowComments: false
+
+
+BreakBeforeBraces: Custom
+BraceWrapping:
+  AfterEnum: true
+  AfterStruct: true
+  AfterFunction: true
+  AfterClass: true
+  SplitEmptyFunction: true
+
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -363,16 +363,20 @@ pref("browser.download.manager.resumeOnW
 
 // This allows disabling the animated notifications shown by
 // the Downloads Indicator when a download starts or completes.
 pref("browser.download.animateNotifications", true);
 
 // This records whether or not the panel has been shown at least once.
 pref("browser.download.panel.shown", false);
 
+// This controls whether the button is automatically shown/hidden depending
+// on whether there are downloads to show.
+pref("browser.download.autohideButton", true);
+
 #ifndef XP_MACOSX
 pref("browser.helperApps.deleteTempFileOnExit", true);
 #endif
 
 // search engines URL
 pref("browser.search.searchEnginesURL",      "https://addons.mozilla.org/%LOCALE%/firefox/search-engines/");
 
 // pointer to the default engine name
@@ -1261,16 +1265,17 @@ pref("browser.newtabpage.rows", 3);
 // number of columns of newtab grid
 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", false);
 
 // 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
 // (this pref has no effect if more than 6 hours have passed since the last crash)
@@ -1711,16 +1716,17 @@ pref("urlclassifier.downloadAllowTable",
 pref("urlclassifier.downloadBlockTable", "goog-badbinurl-proto");
 
 pref("browser.suppress_first_window_animation", true);
 
 // Preferences for Photon onboarding system extension
 pref("browser.onboarding.enabled", true);
 // Mark this as an upgraded profile so we don't offer the initial new user onboarding tour.
 pref("browser.onboarding.tourset-version", 2);
+pref("browser.onboarding.state", "default");
 // On the Activity-Stream page, the snippet's position overlaps with our notification.
 // So use `browser.onboarding.notification.finished` to let the AS page know
 // if our notification is finished and safe to show their snippet.
 pref("browser.onboarding.notification.finished", false);
 pref("browser.onboarding.notification.mute-duration-on-first-session-ms", 300000); // 5 mins
 pref("browser.onboarding.notification.max-life-time-per-tour-ms", 432000000); // 5 days
 pref("browser.onboarding.notification.max-life-time-all-tours-ms", 1209600000); // 14 days
 pref("browser.onboarding.notification.max-prompt-count-per-tour", 8);
--- a/browser/base/content/browser-customization.js
+++ b/browser/base/content/browser-customization.js
@@ -34,17 +34,16 @@ var CustomizationHandler = {
       childNode.setAttribute("disabled", true);
 
     let cmd = document.getElementById("cmd_CustomizeToolbars");
     cmd.setAttribute("disabled", "true");
 
     UpdateUrlbarSearchSplitterState();
 
     PlacesToolbarHelper.customizeStart();
-    DownloadsButton.customizeStart();
   },
 
   _customizationEnding(aDetails) {
     // Update global UI elements that may have been added or removed
     if (aDetails.changed) {
       gURLBar = document.getElementById("urlbar");
 
       gHomeButton.updateTooltip();
@@ -58,17 +57,16 @@ var CustomizationHandler = {
       if (!window.__lookupGetter__("PopupNotifications")) {
         PopupNotifications.iconBox =
           document.getElementById("notification-popup-box");
       }
 
     }
 
     PlacesToolbarHelper.customizeDone();
-    DownloadsButton.customizeDone();
 
     UpdateUrlbarSearchSplitterState();
 
     // Update the urlbar
     URLBarSetURI();
     XULBrowserWindow.asyncUpdateUI();
 
     // Re-enable parts of the UI we disabled during the dialog
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -90,16 +90,21 @@ panel[hidden] panelview {
   transition: transform var(--panelui-subview-transition-duration);
 }
 
 panelview:not([mainview]):not([current]) {
   transition: visibility 0s linear var(--panelui-subview-transition-duration);
   visibility: collapse;
 }
 
+photonpanelmultiview panelview:not([current]) {
+  transition: none;
+  visibility: collapse;
+}
+
 panelview[mainview] > .panel-header,
 panelview:not([title]) > .panel-header {
   display: none;
 }
 
 tabbrowser {
   -moz-binding: url("chrome://browser/content/tabbrowser.xml#tabbrowser");
 }
@@ -513,20 +518,19 @@ toolbar:not(#TabsToolbar) > #personal-bo
 
 /* Hide menu elements intended for keyboard access support */
 #main-menubar[openedwithkey=false] .show-only-for-keyboard {
   display: none;
 }
 
 /* ::::: location bar & search bar ::::: */
 
-#urlbar-container {
-  min-width: 50ch;
-}
-
+/* url bar min-width is defined further down, together with the maximum size
+ * of the identity icon block, for different window sizes.
+ */
 #search-container {
   min-width: 25ch;
 }
 
 #urlbar,
 .searchbar-textbox {
   /* Setting a width and min-width to let the location & search bars maintain
      a constant width in case they haven't be resized manually. (bug 965772) */
@@ -696,51 +700,79 @@ html|input.urlbar-input[textoverflow]:no
   -moz-user-focus: normal;
 }
 
 #urlbar[pageproxystate="invalid"] > #identity-box {
   pointer-events: none;
   -moz-user-focus: ignore;
 }
 
+
+/* We leave 49ch plus whatever space the download button will need when it
+ * appears. Normally this should be 16px for the icon, plus 2 * 2px padding
+ * plus the toolbarbutton-inner-padding. We're adding 4px to ensure things
+ * like rounding on hidpi don't accidentally result in the button going
+ * into overflow.
+ */
+#urlbar-container {
+  min-width: calc(49ch + 24px + 2 * var(--toolbarbutton-inner-padding));
+}
+
+#nav-bar[downloadsbuttonshown] #urlbar-container {
+  min-width: 49ch;
+}
+
 #identity-icon-labels {
-  max-width: 18em;
+  max-width: 17em;
 }
 @media (max-width: 700px) {
   #urlbar-container {
-    min-width: 45ch;
+    min-width: calc(44ch + 24px + 2 * var(--toolbarbutton-inner-padding));
   }
+  #nav-bar[downloadsbuttonshown] #urlbar-container {
+    min-width: 44ch;
+  }
+
   #identity-icon-labels {
-    max-width: 70px;
+    max-width: 60px;
   }
 }
 @media (max-width: 600px) {
   #urlbar-container {
-    min-width: 40ch;
-  }
-  #identity-icon-labels {
-    max-width: 60px;
+    min-width: calc(39ch + 24px + 2 * var(--toolbarbutton-inner-padding));
   }
-}
-@media (max-width: 500px) {
-  #urlbar-container {
-    min-width: 35ch;
+  #nav-bar[downloadsbuttonshown] #urlbar-container {
+    min-width: 39ch;
   }
   #identity-icon-labels {
     max-width: 50px;
   }
 }
-@media (max-width: 400px) {
+@media (max-width: 500px) {
   #urlbar-container {
-    min-width: 28ch;
+    min-width: calc(34ch + 24px + 2 * var(--toolbarbutton-inner-padding));
+  }
+  #nav-bar[downloadsbuttonshown] #urlbar-container {
+    min-width: 34ch;
   }
   #identity-icon-labels {
     max-width: 40px;
   }
 }
+@media (max-width: 400px) {
+  #urlbar-container {
+    min-width: calc(27ch + 24px + 2 * var(--toolbarbutton-inner-padding));
+  }
+  #nav-bar[downloadsbuttonshown] #urlbar-container {
+    min-width: 27ch;
+  }
+  #identity-icon-labels {
+    max-width: 30px;
+  }
+}
 
 #identity-icon-country-label {
   direction: ltr;
 }
 
 #identity-box.verifiedIdentity > #identity-icon-labels > #identity-icon-label {
   margin-inline-end: 0.25em !important;
 }
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -1316,16 +1316,20 @@ var gBrowserInit = {
     }
 
     // hook up UI through progress listener
     gBrowser.addProgressListener(window.XULBrowserWindow);
     gBrowser.addTabsProgressListener(window.TabsProgressListener);
 
     SidebarUI.init();
 
+    // We do this in onload because we want to ensure the button's state
+    // doesn't flicker as the window is being shown.
+    DownloadsButton.init();
+
     // Certain kinds of automigration rely on this notification to complete
     // their tasks BEFORE the browser window is shown. SessionStore uses it to
     // restore tabs into windows AFTER important parts like gMultiProcessBrowser
     // have been initialized.
     Services.obs.notifyObservers(window, "browser-window-before-show");
 
     gUIDensity.init();
 
@@ -1842,16 +1846,18 @@ var gBrowserInit = {
     CompactTheme.uninit();
 
     TrackingProtection.uninit();
 
     CaptivePortalWatcher.uninit();
 
     SidebarUI.uninit();
 
+    DownloadsButton.uninit();
+
     // Now either cancel delayedStartup, or clean up the services initialized from
     // it.
     if (this._boundDelayedStartup) {
       this._cancelDelayedStartup();
     } else {
       if (Win7Features)
         Win7Features.onCloseWindow();
 
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -934,17 +934,19 @@
                        class="toolbarbutton-1 chromeclass-toolbar-additional badged-button"
                        key="key_openDownloads"
                        onmousedown="DownloadsIndicatorView.onCommand(event);"
                        ondrop="DownloadsIndicatorView.onDrop(event);"
                        ondragover="DownloadsIndicatorView.onDragOver(event);"
                        ondragenter="DownloadsIndicatorView.onDragOver(event);"
                        label="&downloads.label;"
                        removable="true"
+                       overflows="false"
                        cui-areatype="toolbar"
+                       hidden="true"
                        tooltip="dynamic-shortcut-tooltip"/>
 
         <toolbarbutton id="library-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
                        removable="true"
                        onmousedown="PanelUI.showSubView('appMenu-libraryView', this, null, event);"
                        closemenu="none"
                        cui-areatype="toolbar"
                        tooltiptext="&libraryButton.tooltip;"
--- a/browser/base/content/test/general/browser_documentnavigation.js
+++ b/browser/base/content/test/general/browser_documentnavigation.js
@@ -69,17 +69,17 @@ async function expectFocusOnF6(backward,
   }
 
   if (gMultiProcessBrowser && onContent) {
     expectedDocument = "main-window";
     expectedElement = gBrowser.selectedBrowser;
   }
 
   is(fm.focusedWindow.document.documentElement.id, expectedDocument, desc + " document matches");
-  is(fm.focusedElement, expectedElement, desc + " element matches");
+  is(fm.focusedElement, expectedElement, desc + " element matches (wanted: " + expectedElement.id + " got: " + fm.focusedElement.id + ")");
 
   if (onContent) {
     window.messageManager.removeMessageListener("BrowserTest:FocusChanged", focusChangedListener);
   }
 }
 
 // Load a page and navigate between it and the chrome window.
 add_task(async function() {
@@ -166,18 +166,19 @@ add_task(async function() {
                                false, "back focus with sidebar open sidebar");
   await expectFocusOnF6(true, "main-window", gURLBar.inputField,
                                false, "back focus with sidebar urlbar");
 
   SidebarUI.toggle("viewBookmarksSidebar");
 });
 
 // Navigate when the downloads panel is open
-add_task(async function() {
-  await pushPrefs(["accessibility.tabfocus", 7]);
+add_task(async function test_download_focus() {
+  await pushPrefs(["accessibility.tabfocus", 7], ["browser.download.autohideButton", false]);
+  await promiseButtonShown("downloads-button");
 
   let popupShownPromise = BrowserTestUtils.waitForEvent(document, "popupshown", true);
   EventUtils.synthesizeMouseAtCenter(document.getElementById("downloads-button"), { });
   await popupShownPromise;
 
   gURLBar.focus();
   await expectFocusOnF6(false, "main-window", document.getElementById("downloadsHistory"),
                                 false, "focus with downloads panel open panel");
@@ -248,8 +249,17 @@ add_task(async function() {
                                true, "back focus on frameset frame 0");
   await expectFocusOnF6(true, "main-window", gURLBar.inputField,
                                false, "back focus on frameset frame urlbar");
 
   await BrowserTestUtils.removeTab(gBrowser.selectedTab);
 });
 
 // XXXndeakin add tests for browsers inside of panels
+
+function promiseButtonShown(id) {
+  let dwu = window.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
+  return BrowserTestUtils.waitForCondition(() => {
+    let target = document.getElementById(id);
+    let bounds = dwu.getBoundsWithoutFlushing(target);
+    return bounds.width > 0 && bounds.height > 0;
+  }, `Waiting for button ${id} to have non-0 size`);
+}
--- a/browser/base/content/test/performance/browser_appmenu_reflows.js
+++ b/browser/base/content/test/performance/browser_appmenu_reflows.js
@@ -63,17 +63,17 @@ const EXPECTED_APPMENU_SUBVIEW_REFLOWS =
    * correct. Unfortunately this requires 2 sync reflows.
    *
    * If we add more views where this is necessary, we may need to duplicate
    * these expected reflows further.
    */
   {
     stack: [
       "descriptionHeightWorkaround@resource:///modules/PanelMultiView.jsm",
-      "onTransitionEnd@resource:///modules/PanelMultiView.jsm",
+      "_cleanupTransitionPhase@resource:///modules/PanelMultiView.jsm",
     ],
 
     times: 2, // This number should only ever go down - never up.
   },
 
   /**
    * Please don't add anything new!
    */
--- a/browser/base/content/test/static/browser_all_files_referenced.js
+++ b/browser/base/content/test/static/browser_all_files_referenced.js
@@ -82,20 +82,16 @@ var whitelist = [
 
   // Add-on API introduced in bug 1118285
   {file: "resource://app/modules/NewTabURL.jsm"},
 
   // browser/components/newtab bug 1355166
   {file: "resource://app/modules/NewTabSearchProvider.jsm"},
   {file: "resource://app/modules/NewTabWebChannel.jsm"},
 
-  // browser/extensions/activity-stream/data/content/activity-stream-prerendered.html
-  // This will used when Bug 1397875 lands
-  {file: "resource://activity-stream/data/content/activity-stream-prerendered.html"},
-
   // layout/mathml/nsMathMLChar.cpp
   {file: "resource://gre/res/fonts/mathfontSTIXGeneral.properties"},
   {file: "resource://gre/res/fonts/mathfontUnicode.properties"},
 
   // toolkit/components/places/ColorAnalyzer_worker.js
   {file: "resource://gre/modules/ClusterLib.js"},
   {file: "resource://gre/modules/ColorConversion.js"},
 
--- a/browser/base/content/test/urlbar/browser_dragdropURL.js
+++ b/browser/base/content/test/urlbar/browser_dragdropURL.js
@@ -4,35 +4,35 @@ const TEST_URL = "data:text/html,a test 
 const DRAG_URL = "http://www.example.com/";
 const DRAG_FORBIDDEN_URL = "chrome://browser/content/aboutDialog.xul";
 const DRAG_TEXT = "Firefox is awesome";
 const DRAG_WORD = "Firefox";
 
 add_task(async function checkDragURL() {
   await BrowserTestUtils.withNewTab(TEST_URL, function(browser) {
     // Have to use something other than the URL bar as a source, so picking the
-    // downloads button somewhat arbitrarily:
-    EventUtils.synthesizeDrop(document.getElementById("downloads-button"), gURLBar,
+    // home button somewhat arbitrarily:
+    EventUtils.synthesizeDrop(document.getElementById("home-button"), gURLBar,
                               [[{type: "text/plain", data: DRAG_URL}]], "copy", window);
     is(gURLBar.value, TEST_URL, "URL bar value should not have changed");
     is(gBrowser.selectedBrowser.userTypedValue, null, "Stored URL bar value should not have changed");
   });
 });
 
 add_task(async function checkDragForbiddenURL() {
   await BrowserTestUtils.withNewTab(TEST_URL, function(browser) {
-    EventUtils.synthesizeDrop(document.getElementById("downloads-button"), gURLBar,
+    EventUtils.synthesizeDrop(document.getElementById("home-button"), gURLBar,
                               [[{type: "text/plain", data: DRAG_FORBIDDEN_URL}]], "copy", window);
     isnot(gURLBar.value, DRAG_FORBIDDEN_URL, "Shouldn't be allowed to drop forbidden URL on URL bar");
   });
 });
 
 add_task(async function checkDragText() {
   await BrowserTestUtils.withNewTab(TEST_URL, function(browser) {
-    EventUtils.synthesizeDrop(document.getElementById("downloads-button"), gURLBar,
+    EventUtils.synthesizeDrop(document.getElementById("home-button"), gURLBar,
                               [[{type: "text/plain", data: DRAG_TEXT}]], "copy", window);
     is(gURLBar.value, DRAG_TEXT, "Dragging normal text should replace the URL bar value");
 
-    EventUtils.synthesizeDrop(document.getElementById("downloads-button"), gURLBar,
+    EventUtils.synthesizeDrop(document.getElementById("home-button"), gURLBar,
                               [[{type: "text/plain", data: DRAG_WORD}]], "copy", window);
     is(gURLBar.value, DRAG_WORD, "Dragging a single word should replace the URL bar value");
   });
 });
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -36,22 +36,22 @@ file, You can obtain one at http://mozil
                   class="textbox-input-box urlbar-input-box"
                   flex="1" xbl:inherits="tooltiptext=inputtooltiptext">
           <children/>
           <html:input anonid="input"
                       class="autocomplete-textbox urlbar-input textbox-input uri-element-right-align"
                       allowevents="true"
                       inputmode="url"
                       xbl:inherits="tooltiptext=inputtooltiptext,value,maxlength,disabled,size,readonly,placeholder,tabindex,accesskey,focused,textoverflow"/>
-          <xul:image anonid="urlbar-go-button"
-                     class="urlbar-go-button urlbar-icon"
-                     onclick="gURLBar.handleCommand(event);"
-                     tooltiptext="&goEndCap.tooltip;"
-                     xbl:inherits="pageproxystate,parentfocused=focused,usertyping"/>
         </xul:hbox>
+        <xul:image anonid="urlbar-go-button"
+                   class="urlbar-go-button urlbar-icon"
+                   onclick="gURLBar.handleCommand(event);"
+                   tooltiptext="&goEndCap.tooltip;"
+                   xbl:inherits="pageproxystate,parentfocused=focused,usertyping"/>
         <xul:dropmarker anonid="historydropmarker"
                         class="autocomplete-history-dropmarker urlbar-history-dropmarker urlbar-icon"
                         tooltiptext="&urlbar.openHistoryPopup.tooltip;"
                         allowevents="true"
                         xbl:inherits="open,enablehistory,parentfocused=focused,usertyping"/>
         <children includes="hbox"/>
       </xul:hbox>
       <xul:popupset anonid="popupset"
@@ -1938,19 +1938,20 @@ file, You can obtain one at http://mozil
           } catch (ex) {
             // Not critical for the urlbar functionality, just report the error.
             Components.utils.reportError(ex);
           }
 
           // Position the popup below the navbar.  To get the y-coordinate,
           // which is an offset from the bottom of the input, subtract the
           // bottom of the navbar from the buttom of the input.
-          let yOffset =
+          let yOffset = Math.round(
             this.DOMWindowUtils.getBoundsWithoutFlushing(document.getElementById("nav-bar")).bottom -
-            this.DOMWindowUtils.getBoundsWithoutFlushing(aInput).bottom;
+            this.DOMWindowUtils.getBoundsWithoutFlushing(aInput).bottom);
+
           this.openPopup(aElement, "after_start", 0, yOffset, false, false);
         ]]></body>
       </method>
 
       <method name="_showSearchSuggestionsNotification">
         <parameter name="whichNotification"/>
         <parameter name="popupDirection"/>
         <body>
--- a/browser/components/customizableui/CustomizableUI.jsm
+++ b/browser/components/customizableui/CustomizableUI.jsm
@@ -35,16 +35,17 @@ const kNSXUL = "http://www.mozilla.org/k
 const kSpecialWidgetPfx = "customizableui-special-";
 
 const kPrefCustomizationState        = "browser.uiCustomization.state";
 const kPrefCustomizationAutoAdd      = "browser.uiCustomization.autoAdd";
 const kPrefCustomizationDebug        = "browser.uiCustomization.debug";
 const kPrefDrawInTitlebar            = "browser.tabs.drawInTitlebar";
 const kPrefUIDensity                 = "browser.uidensity";
 const kPrefAutoTouchMode             = "browser.touchmode.auto";
+const kPrefAutoHideDownloadsButton   = "browser.download.autohideButton";
 
 const kExpectedWindowURL = "chrome://browser/content/browser.xul";
 
 /**
  * The keys are the handlers that are fired when the event type (the value)
  * is fired on the subview. A widget that provides a subview has the option
  * of providing onViewShowing and onViewHiding event handlers.
  */
@@ -52,17 +53,17 @@ const kSubviewEvents = [
   "ViewShowing",
   "ViewHiding"
 ];
 
 /**
  * The current version. We can use this to auto-add new default widgets as necessary.
  * (would be const but isn't because of testing purposes)
  */
-var kVersion = 10;
+var kVersion = 11;
 
 /**
  * Buttons removed from built-ins by version they were removed. kVersion must be
  * bumped any time a new id is added to this. Use the button id as key, and
  * version the button is removed in as the value.  e.g. "pocket-button": 5
  */
 var ObsoleteBuiltinButtons = {
 };
@@ -172,17 +173,17 @@ XPCOMUtils.defineLazyGetter(this, "log",
 
 var CustomizableUIInternal = {
   initialize() {
     log.debug("Initializing");
 
     this.addListener(this);
     this._defineBuiltInWidgets();
     this.loadSavedState();
-    this._introduceNewBuiltinWidgets();
+    this._updateForNewVersion();
     this._markObsoleteBuiltinButtonsSeen();
 
     this.registerArea(CustomizableUI.AREA_FIXED_OVERFLOW_PANEL, {
       type: CustomizableUI.TYPE_MENU_PANEL,
       defaultPlacements: [],
       anchor: "nav-bar-overflow-button",
     }, true);
 
@@ -257,17 +258,17 @@ var CustomizableUIInternal = {
   },
 
   _defineBuiltInWidgets() {
     for (let widgetDefinition of CustomizableWidgets) {
       this.createBuiltinWidget(widgetDefinition);
     }
   },
 
-  _introduceNewBuiltinWidgets() {
+  _updateForNewVersion() {
     // We should still enter even if gSavedState.currentVersion >= kVersion
     // because the per-widget pref facility is independent of versioning.
     if (!gSavedState) {
       // Flip all the prefs so we don't try to re-introduce later:
       for (let [, widget] of gPalette) {
         if (widget.defaultArea && widget._introducedInVersion === "pref") {
           let prefId = "browser.toolbarbuttons.introduced." + widget.id;
           Services.prefs.setBoolPref(prefId, true);
@@ -312,17 +313,17 @@ var CustomizableUIInternal = {
       // Nuke the old 'loop-call-button' out of orbit.
       CustomizableUI.removeWidgetFromArea("loop-call-button");
     }
 
     if (currentVersion < 4) {
       CustomizableUI.removeWidgetFromArea("loop-button-throttled");
     }
 
-    if (currentVersion < 7 && gSavedState && gSavedState.placements &&
+    if (currentVersion < 7 && gSavedState.placements &&
         gSavedState.placements[CustomizableUI.AREA_NAVBAR]) {
       let placements = gSavedState.placements[CustomizableUI.AREA_NAVBAR];
       let newPlacements = ["back-button", "forward-button", "stop-reload-button", "home-button"];
       for (let button of placements) {
         if (!newPlacements.includes(button)) {
           newPlacements.push(button);
         }
       }
@@ -402,24 +403,55 @@ var CustomizableUIInternal = {
         let bmbIndex = placements.indexOf("bookmarks-menu-button");
         placements.splice(bmbIndex, 1);
         let downloadButtonIndex = placements.indexOf("downloads-button");
         let libraryIndex = downloadButtonIndex == -1 ? bmbIndex : (downloadButtonIndex + 1);
         placements.splice(libraryIndex, 0, "library-button");
       }
     }
 
-    if (currentVersion < 10 && gSavedState && gSavedState.placements) {
+    if (currentVersion < 10 && gSavedState.placements) {
       for (let placements of Object.values(gSavedState.placements)) {
         if (placements.includes("webcompat-reporter-button")) {
           placements.splice(placements.indexOf("webcompat-reporter-button"), 1);
           break;
         }
       }
     }
+
+    // Move the downloads button to the default position in the navbar if it's
+    // not there already.
+    if (currentVersion < 11 && gSavedState.placements) {
+      let navbarPlacements = gSavedState.placements[CustomizableUI.AREA_NAVBAR];
+      // First remove from wherever it currently lives, if anywhere:
+      for (let placements of Object.values(gSavedState.placements)) {
+        let existingIndex = placements.indexOf("downloads-button");
+        if (existingIndex != -1) {
+          placements.splice(existingIndex, 1);
+          break; // It can only be in 1 place, so no point looking elsewhere.
+        }
+      }
+
+      // Now put the button in the navbar in the correct spot:
+      if (navbarPlacements) {
+        let insertionPoint = navbarPlacements.indexOf("urlbar-container");
+        // Deliberately iterate to 1 past the end of the array to insert at the
+        // end if need be.
+        while (++insertionPoint < navbarPlacements.length) {
+          let widget = navbarPlacements[insertionPoint];
+          // If we find a non-searchbar, non-spacer node, break out of the loop:
+          if (widget != "search-container" && !this.matchingSpecials(widget, "spring")) {
+            break;
+          }
+        }
+        // We either found the right spot, or reached the end of the
+        // placements, so insert here:
+        navbarPlacements.splice(insertionPoint, 0, "downloads-button");
+      }
+    }
   },
 
   /**
    * _markObsoleteBuiltinButtonsSeen
    * when upgrading, ensure obsoleted buttons are in seen state.
    */
   _markObsoleteBuiltinButtonsSeen() {
     if (!gSavedState)
@@ -2592,25 +2624,27 @@ var CustomizableUIInternal = {
 
   _resetUIState() {
     try {
       gUIStateBeforeReset.drawInTitlebar = Services.prefs.getBoolPref(kPrefDrawInTitlebar);
       gUIStateBeforeReset.uiCustomizationState = Services.prefs.getCharPref(kPrefCustomizationState);
       gUIStateBeforeReset.uiDensity = Services.prefs.getIntPref(kPrefUIDensity);
       gUIStateBeforeReset.autoTouchMode = Services.prefs.getBoolPref(kPrefAutoTouchMode);
       gUIStateBeforeReset.currentTheme = LightweightThemeManager.currentTheme;
+      gUIStateBeforeReset.autoHideDownloadsButton = Services.prefs.getBoolPref(kPrefAutoHideDownloadsButton);
       gUIStateBeforeReset.newElementCount = gNewElementCount;
     } catch (e) { }
 
     this._resetExtraToolbars();
 
     Services.prefs.clearUserPref(kPrefCustomizationState);
     Services.prefs.clearUserPref(kPrefDrawInTitlebar);
     Services.prefs.clearUserPref(kPrefUIDensity);
     Services.prefs.clearUserPref(kPrefAutoTouchMode);
+    Services.prefs.clearUserPref(kPrefAutoHideDownloadsButton);
     LightweightThemeManager.currentTheme = null;
     gNewElementCount = 0;
     log.debug("State reset");
 
     // Reset placements to make restoring default placements possible.
     gPlacements = new Map();
     gDirtyAreaCache = new Set();
     gSeenWidgets = new Set();
@@ -2669,31 +2703,31 @@ var CustomizableUIInternal = {
    */
   undoReset() {
     if (gUIStateBeforeReset.uiCustomizationState == null ||
         gUIStateBeforeReset.drawInTitlebar == null) {
       return;
     }
     gUndoResetting = true;
 
-    let uiCustomizationState = gUIStateBeforeReset.uiCustomizationState;
-    let drawInTitlebar = gUIStateBeforeReset.drawInTitlebar;
-    let currentTheme = gUIStateBeforeReset.currentTheme;
-    let uiDensity = gUIStateBeforeReset.uiDensity;
-    let autoTouchMode = gUIStateBeforeReset.autoTouchMode;
+    const {
+      uiCustomizationState, drawInTitlebar, currentTheme, uiDensity,
+      autoTouchMode, autoHideDownloadsButton,
+    } = gUIStateBeforeReset;
     gNewElementCount = gUIStateBeforeReset.newElementCount;
 
     // Need to clear the previous state before setting the prefs
     // because pref observers may check if there is a previous UI state.
     this._clearPreviousUIState();
 
     Services.prefs.setCharPref(kPrefCustomizationState, uiCustomizationState);
     Services.prefs.setBoolPref(kPrefDrawInTitlebar, drawInTitlebar);
     Services.prefs.setIntPref(kPrefUIDensity, uiDensity);
     Services.prefs.setBoolPref(kPrefAutoTouchMode, autoTouchMode);
+    Services.prefs.setBoolPref(kPrefAutoHideDownloadsButton, autoHideDownloadsButton);
     LightweightThemeManager.currentTheme = currentTheme;
     this.loadSavedState();
     // If the user just customizes toolbar/titlebar visibility, gSavedState will be null
     // and we don't need to do anything else here:
     if (gSavedState) {
       for (let areaId of Object.keys(gSavedState.placements)) {
         let placements = gSavedState.placements[areaId];
         gPlacements.set(areaId, placements);
--- a/browser/components/customizableui/CustomizeMode.jsm
+++ b/browser/components/customizableui/CustomizeMode.jsm
@@ -16,16 +16,20 @@ const kSkipSourceNodePref = "browser.uiC
 const kToolbarVisibilityBtn = "customization-toolbar-visibility-button";
 const kDrawInTitlebarPref = "browser.tabs.drawInTitlebar";
 const kMaxTransitionDurationMs = 2000;
 const kKeepBroadcastAttributes = "keepbroadcastattributeswhencustomizing";
 
 const kPanelItemContextMenu = "customizationPanelItemContextMenu";
 const kPaletteItemContextMenu = "customizationPaletteItemContextMenu";
 
+const kDownloadAutohideCheckboxId = "downloads-button-autohide-checkbox";
+const kDownloadAutohidePanelId = "downloads-button-autohide-panel";
+const kDownloadAutoHidePref = "browser.download.autohideButton";
+
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource:///modules/CustomizableUI.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/AddonManager.jsm");
 Cu.import("resource://gre/modules/AppConstants.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "DragPositionManager",
                                   "resource:///modules/DragPositionManager.jsm");
@@ -349,16 +353,18 @@ CustomizeMode.prototype = {
         // and make it async so it doesn't affect the timing.
         this.visiblePalette.clientTop;
         this.visiblePalette.setAttribute("showing", "true");
       }, 0);
       this._updateEmptyPaletteNotice();
 
       this._updateLWThemeButtonIcon();
 
+      this._setupDownloadAutoHideToggle();
+
       this._handler.isEnteringCustomizeMode = false;
 
       CustomizableUI.dispatchToolboxEvent("customizationready", {}, window);
 
       if (!this._wantToBeInCustomizeMode) {
         this.exit();
       }
     })().catch(e => {
@@ -390,16 +396,18 @@ CustomizeMode.prototype = {
     }
 
     this.hideTip();
 
     this._handler.isExitingCustomizeMode = true;
 
     this._removeExtraToolbarsIfEmpty();
 
+    this._teardownDownloadAutoHideToggle();
+
     CustomizableUI.removeListener(this);
 
     this.document.removeEventListener("keypress", this);
 
     let window = this.window;
     let document = this.document;
 
     // Hide the palette before starting the transition for increased perf.
@@ -467,16 +475,18 @@ CustomizeMode.prototype = {
       // or the TabSelect event handler will think that we are exiting
       // customization mode for a second time.
       this._customizing = false;
 
       let customizableToolbars = document.querySelectorAll("toolbar[customizable=true]:not([autohide=true])");
       for (let toolbar of customizableToolbars)
         toolbar.removeAttribute("customizing");
 
+      this._maybeMoveDownloadsButtonToNavBar();
+
       delete this._lastLightweightTheme;
       this._changed = false;
       this._transitioning = false;
       this._handler.isExitingCustomizeMode = false;
       CustomizableUI.dispatchToolboxEvent("aftercustomization", {}, window);
       CustomizableUI.notifyEndCustomizing(window);
 
       if (this._wantToBeInCustomizeMode) {
@@ -611,27 +621,39 @@ CustomizeMode.prototype = {
     return null;
   },
 
   addToToolbar(aNode) {
     aNode = this._getCustomizableChildForNode(aNode);
     if (aNode.localName == "toolbarpaletteitem" && aNode.firstChild) {
       aNode = aNode.firstChild;
     }
+
+    // If the user explicitly moves this item, turn off autohide.
+    if (aNode.id == "downloads-button") {
+      Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
+    }
+
     CustomizableUI.addWidgetToArea(aNode.id, CustomizableUI.AREA_NAVBAR);
     if (!this._customizing) {
       CustomizableUI.dispatchToolboxEvent("customizationchange");
     }
   },
 
   addToPanel(aNode) {
     aNode = this._getCustomizableChildForNode(aNode);
     if (aNode.localName == "toolbarpaletteitem" && aNode.firstChild) {
       aNode = aNode.firstChild;
     }
+
+    // If the user explicitly moves this item, turn off autohide.
+    if (aNode.id == "downloads-button") {
+      Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
+    }
+
     let panel = CustomizableUI.AREA_FIXED_OVERFLOW_PANEL;
     CustomizableUI.addWidgetToArea(aNode.id, panel);
     if (!this._customizing) {
       CustomizableUI.dispatchToolboxEvent("customizationchange");
     }
 
     if (Services.prefs.getBoolPref("toolkit.cosmeticAnimations.enabled")) {
       let overflowButton = this.document.getElementById("nav-bar-overflow-button");
@@ -650,16 +672,20 @@ CustomizeMode.prototype = {
     }
   },
 
   removeFromArea(aNode) {
     aNode = this._getCustomizableChildForNode(aNode);
     if (aNode.localName == "toolbarpaletteitem" && aNode.firstChild) {
       aNode = aNode.firstChild;
     }
+    // If the user explicitly removes this item, turn off autohide.
+    if (aNode.id == "downloads-button") {
+      Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
+    }
     CustomizableUI.removeWidgetFromArea(aNode.id);
     if (!this._customizing) {
       CustomizableUI.dispatchToolboxEvent("customizationchange");
     }
   },
 
   populatePalette() {
     let fragment = this.document.createDocumentFragment();
@@ -1076,16 +1102,17 @@ CustomizeMode.prototype = {
       await this._wrapToolbarItems();
       this.populatePalette();
 
       this.persistCurrentSets(true);
 
       this._updateResetButton();
       this._updateUndoResetButton();
       this._updateEmptyPaletteNotice();
+      this._moveDownloadsButtonToNavBar = false;
       this.resetting = false;
       if (!this._wantToBeInCustomizeMode) {
         this.exit();
       }
     })().catch(log.error);
   },
 
   undoReset() {
@@ -1102,16 +1129,17 @@ CustomizeMode.prototype = {
       await this._wrapToolbarItems();
       this.populatePalette();
 
       this.persistCurrentSets(true);
 
       this._updateResetButton();
       this._updateUndoResetButton();
       this._updateEmptyPaletteNotice();
+      this._moveDownloadsButtonToNavBar = false;
       this.resetting = false;
     })().catch(log.error);
   },
 
   _onToolbarVisibilityChange(aEvent) {
     let toolbar = aEvent.target;
     if (aEvent.detail.visible && toolbar.getAttribute("customizable") == "true") {
       toolbar.setAttribute("customizing", "true");
@@ -1168,16 +1196,19 @@ CustomizeMode.prototype = {
       // API also does the right thing (and adds it to the palette)
       let widgetId = aNodeToChange.id;
       let widget = CustomizableUI.getWidget(widgetId);
       if (widget.provider == CustomizableUI.PROVIDER_API) {
         let paletteItem = this.makePaletteItem(widget, "palette");
         this.visiblePalette.appendChild(paletteItem);
       }
     }
+    if (aNodeToChange.id == "downloads-button") {
+      this._showDownloadsAutoHidePanel();
+    }
   },
 
   onWidgetDestroyed(aWidgetId) {
     let wrapper = this.document.getElementById("wrapper-" + aWidgetId);
     if (wrapper) {
       wrapper.remove();
     }
   },
@@ -1752,16 +1783,21 @@ CustomizeMode.prototype = {
 
     this._cancelDragActive(this._dragOverItem, null, true);
 
     try {
       this._applyDrop(aEvent, targetArea, originArea, draggedItemId, targetNode);
     } catch (ex) {
       log.error(ex, ex.stack);
     }
+
+    // If the user explicitly moves this item, turn off autohide.
+    if (draggedItemId == "downloads-button") {
+      Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
+    }
   },
 
   _applyDrop(aEvent, aTargetArea, aOriginArea, aDraggedItemId, aTargetNode) {
     let document = aEvent.target.ownerDocument;
     let draggedItem = document.getElementById(aDraggedItemId);
     draggedItem.hidden = false;
     draggedItem.removeAttribute("mousedown");
 
@@ -2241,16 +2277,104 @@ CustomizeMode.prototype = {
   },
 
   onPanelContextMenuShowing(event) {
     let inPermanentArea = !!event.target.triggerNode.closest("#widget-overflow-fixed-list");
     let doc = event.target.ownerDocument;
     doc.getElementById("customizationPanelItemContextMenuUnpin").hidden = !inPermanentArea;
     doc.getElementById("customizationPanelItemContextMenuPin").hidden = inPermanentArea;
   },
+
+  _checkForDownloadsClick(event) {
+    if (event.target.closest("#wrapper-downloads-button") && event.button == 0) {
+      event.view.gCustomizeMode._showDownloadsAutoHidePanel();
+    }
+  },
+
+  _setupDownloadAutoHideToggle() {
+    this.document.getElementById(kDownloadAutohidePanelId).removeAttribute("hidden");
+    this.window.addEventListener("click", this._checkForDownloadsClick, true);
+  },
+
+  _teardownDownloadAutoHideToggle() {
+    this.window.removeEventListener("click", this._checkForDownloadsClick, true);
+    this.document.getElementById(kDownloadAutohidePanelId).hidePopup();
+  },
+
+  _maybeMoveDownloadsButtonToNavBar() {
+    // If the user toggled the autohide checkbox while the item was in the
+    // palette, and hasn't moved it since, move the item to the default
+    // location in the navbar for them.
+    if (!CustomizableUI.getPlacementOfWidget("downloads-button") &&
+        this._moveDownloadsButtonToNavBar &&
+        this.window.DownloadsButton.autoHideDownloadsButton) {
+      let navbarPlacements = CustomizableUI.getWidgetIdsInArea("nav-bar");
+      let insertionPoint = navbarPlacements.indexOf("urlbar-container");
+      while (++insertionPoint < navbarPlacements.length) {
+        let widget = navbarPlacements[insertionPoint];
+        // If we find a non-searchbar, non-spacer node, break out of the loop:
+        if (widget != "search-container" &&
+             !(CustomizableUI.isSpecialWidget(widget) && widget.includes("spring"))) {
+          break;
+        }
+      }
+      CustomizableUI.addWidgetToArea("downloads-button", "nav-bar", insertionPoint);
+    }
+  },
+
+  _showDownloadsAutoHidePanel() {
+    let doc = this.document;
+    let panel = doc.getElementById(kDownloadAutohidePanelId);
+    panel.hidePopup();
+    let button = doc.getElementById("downloads-button");
+    // We don't show the tooltip if the button is in the panel.
+    if (button.closest("#widget-overflow-fixed-list")) {
+      return;
+    }
+
+    let checkbox = doc.getElementById(kDownloadAutohideCheckboxId);
+    if (this.window.DownloadsButton.autoHideDownloadsButton) {
+      checkbox.setAttribute("checked", "true");
+    } else {
+      checkbox.removeAttribute("checked");
+    }
+
+    let offsetX = 0, offsetY = 0;
+    let position;
+    if (button.closest("#nav-bar")) {
+      let navbarWidgets = CustomizableUI.getWidgetIdsInArea("nav-bar");
+      if (navbarWidgets.indexOf("urlbar-container") > navbarWidgets.indexOf("downloads-button")) {
+        // Tested in RTL, these get inverted automatically, so this does the
+        // right thing without taking RTL into account explicitly.
+        position = "rightcenter topleft";
+        offsetX = -8;
+      } else {
+        position = "leftcenter topright";
+        offsetX = 8;
+      }
+    } else if (button.closest("#customization-palette")) {
+      position = "topcenter bottomleft";
+      offsetY = 10;
+    } else {
+      // For non-navbar toolbars, this works better than guessing whether
+      // left or right is a better place to position:
+      position = "bottomcenter topleft";
+      offsetY = -5;
+    }
+    // We don't use the icon to anchor because it might be resizing because of
+    // the animations for drag/drop. Hence the use of offsets.
+    panel.openPopup(button, position, offsetX, offsetY);
+  },
+
+  onDownloadsAutoHideChange(event) {
+    let checkbox = event.target.ownerDocument.getElementById(kDownloadAutohideCheckboxId);
+    Services.prefs.setBoolPref(kDownloadAutoHidePref, checkbox.checked);
+    // Ensure we move the button (back) after the user leaves customize mode.
+    event.view.gCustomizeMode._moveDownloadsButtonToNavBar = checkbox.checked;
+  },
 };
 
 function __dumpDragData(aEvent, caller) {
   if (!gDebug) {
     return;
   }
   let str = "Dumping drag data (" + (caller ? caller + " in " : "") + "CustomizeMode.jsm) {\n";
   str += "  type: " + aEvent.type + "\n";
--- a/browser/components/customizableui/PanelMultiView.jsm
+++ b/browser/components/customizableui/PanelMultiView.jsm
@@ -11,16 +11,23 @@ const {classes: Cc, interfaces: Ci, util
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
   "resource://gre/modules/AppConstants.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "BrowserUtils",
   "resource://gre/modules/BrowserUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
   "resource:///modules/CustomizableUI.jsm");
 
+const TRANSITION_PHASES = Object.freeze({
+  START: 1,
+  PREPARE: 2,
+  TRANSITION: 3,
+  END: 4
+});
+
 /**
  * Simple implementation of the sliding window pattern; panels are added to a
  * linked list, in-order, and the currently shown panel is remembered using a
  * marker. The marker shifts as navigation between panels is continued, where
  * the panel at index 0 is always the starting point:
  *           ┌────┬────┬────┬────┐
  *           │▓▓▓▓│    │    │    │ Start
  *           └────┴────┴────┴────┘
@@ -336,17 +343,18 @@ this.PanelMultiView = class {
       this._clickCapturer.removeEventListener("click", this);
     }
     this._panel.removeEventListener("mousemove", this);
     this._panel.removeEventListener("popupshowing", this);
     this._panel.removeEventListener("popupshown", this);
     this._panel.removeEventListener("popuphidden", this);
     this.window.removeEventListener("keydown", this);
     this.node = this._clickCapturer = this._viewContainer = this._mainViewContainer =
-      this._subViews = this._viewStack = this.__dwu = this._panelViewCache = null;
+      this._subViews = this._viewStack = this.__dwu = this._panelViewCache =
+        this._transitionDetails = null;
   }
 
   /**
    * Remove any child subviews into the panelViewCache, to ensure
    * they remain usable even if this panelmultiview instance is removed
    * from the DOM.
    * @param viewNodeContainer the container from which to remove subviews
    */
@@ -418,42 +426,44 @@ this.PanelMultiView = class {
         this.showSubView(this._mainViewId);
       } else {
         this._transitionHeight(() => {
           viewNode.removeAttribute("current");
           this._currentSubView = null;
           this.node.setAttribute("viewtype", "main");
         });
       }
+    } else if (this.panelViews) {
+      this._mainView.setAttribute("current", "true");
     }
 
     if (!this.panelViews) {
       this._shiftMainView();
     }
   }
 
   showSubView(aViewId, aAnchor, aPreviousView) {
-    const {document, window} = this;
     return (async () => {
       // Support passing in the node directly.
       let viewNode = typeof aViewId == "string" ? this.node.querySelector("#" + aViewId) : aViewId;
       if (!viewNode) {
-        viewNode = document.getElementById(aViewId);
+        viewNode = this.document.getElementById(aViewId);
         if (viewNode) {
           this._placeSubView(viewNode);
         } else {
           throw new Error(`Subview ${aViewId} doesn't exist!`);
         }
       } else if (viewNode.parentNode == this._panelViewCache) {
         this._placeSubView(viewNode);
       }
 
       let reverse = !!aPreviousView;
       let previousViewNode = aPreviousView || this._currentSubView;
-      let playTransition = (!!previousViewNode && previousViewNode != viewNode);
+      let playTransition = (!!previousViewNode && previousViewNode != viewNode &&
+        this._panel.state == "open");
 
       let dwu, previousRect;
       if (playTransition || this.panelViews) {
         dwu = this._dwu;
         previousRect = previousViewNode.__lastKnownBoundingRect =
           dwu.getBoundsWithoutFlushing(previousViewNode);
         if (this.panelViews) {
           // Here go the measures that have the same caching lifetime as the width
@@ -480,17 +490,18 @@ this.PanelMultiView = class {
         if (!viewNode.hasAttribute("title"))
           viewNode.setAttribute("title", aAnchor.getAttribute("label"));
         viewNode.classList.add("PanelUI-subView");
       }
       if (this.panelViews && this._mainViewWidth)
         viewNode.style.maxWidth = viewNode.style.minWidth = this._mainViewWidth + "px";
 
       // Emit the ViewShowing event so that the widget definition has a chance
-      // to lazily populate the subview with things.
+      // to lazily populate the subview with things or perhaps even cancel this
+      // whole operation.
       let detail = {
         blockers: new Set(),
         addBlocker(promise) {
           this.blockers.add(promise);
         }
       };
       let cancel = this._dispatchViewEvent(viewNode, "ViewShowing", aAnchor, detail);
       if (detail.blockers.size) {
@@ -504,163 +515,40 @@ this.PanelMultiView = class {
       }
 
       this._viewShowing = null;
       if (cancel) {
         return;
       }
 
       this._currentSubView = viewNode;
-      viewNode.setAttribute("current", true);
       if (this.panelViews) {
         if (viewNode.id == this._mainViewId) {
           this.node.setAttribute("viewtype", "main");
         } else {
           this.node.setAttribute("viewtype", "subview");
         }
-        if (!playTransition)
+        if (!playTransition) {
+          viewNode.setAttribute("current", true);
           this.descriptionHeightWorkaround(viewNode);
+        }
       }
 
-      // Now we have to transition the panel. There are a few parts to this:
-      //
-      // 1) The main view content gets shifted so that the center of the anchor
-      //    node is at the left-most edge of the panel.
-      // 2) The subview deck slides in so that it takes up almost all of the
-      //    panel.
-      // 3) If the subview is taller then the main panel contents, then the panel
-      //    must grow to meet that new height. Otherwise, it must shrink.
-      //
-      // All three of these actions make use of CSS transformations, so they
-      // should all occur simultaneously.
+      // Now we have to transition the panel.
       if (this.panelViews && playTransition) {
-        // Sliding the next subview in means that the previous panelview stays
-        // where it is and the active panelview slides in from the left in LTR
-        // mode, right in RTL mode.
-        let onTransitionEnd = () => {
-          this._dispatchViewEvent(previousViewNode, "ViewHiding");
-          previousViewNode.removeAttribute("current");
-          this.descriptionHeightWorkaround(viewNode);
-        };
-
-        // There's absolutely no need to show off our epic animation skillz when
-        // the panel's not even open.
-        if (this._panel.state != "open") {
-          onTransitionEnd();
-          return;
-        }
-
         if (aAnchor)
           aAnchor.setAttribute("open", true);
 
-        // Set the viewContainer dimensions to make sure only the current view
-        // is visible.
-        this._viewContainer.style.height = Math.max(previousRect.height, this._mainViewHeight) + "px";
-        this._viewContainer.style.width = previousRect.width + "px";
-        // Lock the dimensions of the window that hosts the popup panel.
-        let rect = this._panel.popupBoxObject.getOuterScreenRect();
-        this._panel.setAttribute("width", rect.width);
-        this._panel.setAttribute("height", rect.height);
-
-        this._viewBoundsOffscreen(viewNode, previousRect, viewRect => {
-          this._transitioning = true;
-          if (this._autoResizeWorkaroundTimer)
-            window.clearTimeout(this._autoResizeWorkaroundTimer);
-          this._viewContainer.setAttribute("transition-reverse", reverse);
-          let nodeToAnimate = reverse ? previousViewNode : viewNode;
-
-          if (!reverse) {
-            // We set the margin here to make sure the view is positioned next
-            // to the view that is currently visible. The animation is taken
-            // care of by transitioning the `transform: translateX()` property
-            // instead.
-            // Once the transition finished, we clean both properties up.
-            nodeToAnimate.style.marginInlineStart = previousRect.width + "px";
-          }
-
-          // Set the transition style and listen for its end to clean up and
-          // make sure the box sizing becomes dynamic again.
-          // Somehow, putting these properties in PanelUI.css doesn't work for
-          // newly shown nodes in a XUL parent node.
-          nodeToAnimate.style.transition = "transform ease-" + (reverse ? "in" : "out") +
-            " var(--panelui-subview-transition-duration)";
-          nodeToAnimate.style.willChange = "transform";
-          nodeToAnimate.style.borderInlineStart = "1px solid var(--panel-separator-color)";
-
-          // Wait until after the first paint to ensure setting 'current=true'
-          // has taken full effect; once both views are visible, we want to
-          // correctly measure rects using `dwu.getBoundsWithoutFlushing`.
-          window.addEventListener("MozAfterPaint", () => {
-            if (this._panel.state != "open") {
-              onTransitionEnd();
-              return;
-            }
-            // Now set the viewContainer dimensions to that of the new view, which
-            // kicks of the height animation.
-            this._viewContainer.style.height = Math.max(viewRect.height, this._mainViewHeight) + "px";
-            this._viewContainer.style.width = viewRect.width + "px";
-            this._panel.removeAttribute("width");
-            this._panel.removeAttribute("height");
+        await this._transitionViews(previousViewNode, viewNode, reverse, previousRect);
 
-            // The 'magic' part: build up the amount of pixels to move right or left.
-            let moveToLeft = (this._dir == "rtl" && !reverse) || (this._dir == "ltr" && reverse);
-            let movementX = reverse ? viewRect.width : previousRect.width;
-            let moveX = (moveToLeft ? "" : "-") + movementX;
-            nodeToAnimate.style.transform = "translateX(" + moveX + "px)";
-            // We're setting the width property to prevent flickering during the
-            // sliding animation with smaller views.
-            nodeToAnimate.style.width = viewRect.width + "px";
-
-            this._viewContainer.addEventListener("transitionend", this._transitionEndListener = ev => {
-              // It's quite common that `height` on the view container doesn't need
-              // to transition, so we make sure to do all the work on the transform
-              // transition-end, because that is guaranteed to happen.
-              if (ev.target != nodeToAnimate || ev.propertyName != "transform")
-                return;
-
-              this._viewContainer.removeEventListener("transitionend", this._transitionEndListener);
-              this._transitionEndListener = null;
-              onTransitionEnd();
-              this._transitioning = false;
-              if (reverse) {
-                this._resetKeyNavigation(previousViewNode);
-              }
+        if (aAnchor)
+          aAnchor.removeAttribute("open");
 
-              // Myeah, panel layout auto-resizing is a funky thing. We'll wait
-              // another few milliseconds to remove the width and height 'fixtures',
-              // to be sure we don't flicker annoyingly.
-              // NB: HACK! Bug 1363756 is there to fix this.
-              this._autoResizeWorkaroundTimer = window.setTimeout(() => {
-                this._viewContainer.style.removeProperty("height");
-                this._viewContainer.style.removeProperty("width");
-              }, 500);
-
-              // Take another breather, just like before, to wait for the 'current'
-              // attribute removal to take effect. This prevents a flicker.
-              // The cleanup we do doesn't affect the display anymore, so we're not
-              // too fussed about the timing here.
-              window.addEventListener("MozAfterPaint", () => {
-                nodeToAnimate.style.removeProperty("border-inline-start");
-                nodeToAnimate.style.removeProperty("transition");
-                nodeToAnimate.style.removeProperty("transform");
-                nodeToAnimate.style.removeProperty("width");
-
-                if (!reverse)
-                  viewNode.style.removeProperty("margin-inline-start");
-                if (aAnchor)
-                  aAnchor.removeAttribute("open");
-
-                this._viewContainer.removeAttribute("transition-reverse");
-
-                this._dispatchViewEvent(viewNode, "ViewShown");
-                this._updateKeyboardFocus(viewNode);
-              }, { once: true });
-            });
-          }, { once: true });
-        });
+        this._dispatchViewEvent(viewNode, "ViewShown");
+        this._updateKeyboardFocus(viewNode);
       } else if (!this.panelViews) {
         this._transitionHeight(() => {
           viewNode.setAttribute("current", true);
           if (viewNode.id == this._mainViewId) {
             this.node.setAttribute("viewtype", "main");
           } else {
             this.node.setAttribute("viewtype", "subview");
           }
@@ -670,16 +558,208 @@ this.PanelMultiView = class {
           this._dispatchViewEvent(viewNode, "ViewShown");
         });
         this._shiftMainView(aAnchor);
       }
     })().catch(e => Cu.reportError(e));
   }
 
   /**
+   * Apply a transition to 'slide' from the currently active view to the next
+   * one.
+   * Sliding the next subview in means that the previous panelview stays where it
+   * is and the active panelview slides in from the left in LTR mode, right in
+   * RTL mode.
+   *
+   * @param {panelview} previousViewNode Node that is currently shown as active,
+   *                                     but is about to be transitioned away.
+   * @param {panelview} viewNode         Node that will becode the active view,
+   *                                     after the transition has finished.
+   * @param {Boolean}   reverse          Whether we're navigation back to a
+   *                                     previous view or forward to a next view.
+   * @param {Object}    previousRect     Rect object, with the same structure as
+   *                                     a DOMRect, of the `previousViewNode`.
+   * @param {Function}  callback         Function that will be invoked when the
+   *                                     transition is finished or when the
+   *                                     operation was canceled (early return).
+   */
+  async _transitionViews(previousViewNode, viewNode, reverse, previousRect) {
+    // There's absolutely no need to show off our epic animation skillz when
+    // the panel's not even open.
+    if (this._panel.state != "open") {
+      return;
+    }
+
+    const {window, document} = this;
+
+    if (this._autoResizeWorkaroundTimer)
+      window.clearTimeout(this._autoResizeWorkaroundTimer);
+
+    this._transitionDetails = {
+      phase: TRANSITION_PHASES.START,
+      previousViewNode, viewNode, reverse
+    };
+
+    // Set the viewContainer dimensions to make sure only the current view is
+    // visible.
+    this._viewContainer.style.height = Math.max(previousRect.height, this._mainViewHeight) + "px";
+    this._viewContainer.style.width = previousRect.width + "px";
+    // Lock the dimensions of the window that hosts the popup panel.
+    let rect = this._panel.popupBoxObject.getOuterScreenRect();
+    this._panel.setAttribute("width", rect.width);
+    this._panel.setAttribute("height", rect.height);
+
+    let viewRect;
+    if (viewNode.__lastKnownBoundingRect) {
+      viewRect = viewNode.__lastKnownBoundingRect;
+      viewNode.setAttribute("current", true);
+    } else if (viewNode.customRectGetter) {
+      // Can't use Object.assign directly with a DOM Rect object because its properties
+      // aren't enumerable.
+      let {height, width} = previousRect;
+      viewRect = Object.assign({height, width}, viewNode.customRectGetter());
+      let {header} = viewNode;
+      if (header) {
+        viewRect.height += this._dwu.getBoundsWithoutFlushing(header).height;
+      }
+      viewNode.setAttribute("current", true);
+    } else {
+      let oldSibling = viewNode.nextSibling || null;
+      this._offscreenViewStack.appendChild(viewNode);
+      viewNode.setAttribute("current", true);
+
+      viewRect = await BrowserUtils.promiseLayoutFlushed(this.document, "layout", () => {
+        return this._dwu.getBoundsWithoutFlushing(viewNode);
+      });
+
+      try {
+        this._viewStack.insertBefore(viewNode, oldSibling);
+      } catch (ex) {
+        this._viewStack.appendChild(viewNode);
+      }
+    }
+
+    this._transitioning = true;
+    this._transitionDetails.phase = TRANSITION_PHASES.PREPARE;
+
+    // The 'magic' part: build up the amount of pixels to move right or left.
+    let moveToLeft = (this._dir == "rtl" && !reverse) || (this._dir == "ltr" && reverse);
+    let deltaX = previousRect.width;
+    let deepestNode = reverse ? previousViewNode : viewNode;
+
+    // With a transition when navigating backwards - user hits the 'back'
+    // button - we need to make sure that the views are positioned in a way
+    // that a translateX() unveils the previous view from the right direction.
+    if (reverse)
+      this._viewStack.style.marginInlineStart = "-" + deltaX + "px";
+
+    // Set the transition style and listen for its end to clean up and make sure
+    // the box sizing becomes dynamic again.
+    // Somehow, putting these properties in PanelUI.css doesn't work for newly
+    // shown nodes in a XUL parent node.
+    this._viewStack.style.transition = "transform var(--animation-easing-function)" +
+      " var(--panelui-subview-transition-duration)";
+    this._viewStack.style.willChange = "transform";
+    deepestNode.style.borderInlineStart = "1px solid var(--panel-separator-color)";
+
+    // Now set the viewContainer dimensions to that of the new view, which
+    // kicks of the height animation.
+    this._viewContainer.style.height = Math.max(viewRect.height, this._mainViewHeight) + "px";
+    this._viewContainer.style.width = viewRect.width + "px";
+    this._panel.removeAttribute("width");
+    this._panel.removeAttribute("height");
+    // We're setting the width property to prevent flickering during the
+    // sliding animation with smaller views.
+    viewNode.style.width = viewRect.width + "px";
+
+    await BrowserUtils.promiseLayoutFlushed(document, "layout", () => {});
+
+    // Kick off the transition!
+    this._transitionDetails.phase = TRANSITION_PHASES.TRANSITION;
+    this._viewStack.style.transform = "translateX(" + (moveToLeft ? "" : "-") + deltaX + "px)";
+
+    await new Promise(resolve => {
+      this._transitionDetails.resolve = resolve;
+      this._viewContainer.addEventListener("transitionend", this._transitionDetails.listener = ev => {
+        // It's quite common that `height` on the view container doesn't need
+        // to transition, so we make sure to do all the work on the transform
+        // transition-end, because that is guaranteed to happen.
+        if (ev.target != this._viewStack || ev.propertyName != "transform")
+          return;
+        this._viewContainer.removeEventListener("transitionend", this._transitionDetails.listener);
+        delete this._transitionDetails.listener;
+        resolve();
+      });
+    });
+
+    this._transitionDetails.phase = TRANSITION_PHASES.END;
+
+    await this._cleanupTransitionPhase();
+  }
+
+  /**
+   * Attempt to clean up the attributes and properties set by `_transitionViews`
+   * above. Which attributes and properties depends on the phase the transition
+   * was left from - normally that'd be `TRANSITION_PHASES.END`.
+   */
+  async _cleanupTransitionPhase() {
+    if (!this._transitionDetails)
+      return;
+
+    let {phase, previousViewNode, viewNode, reverse, resolve, listener} = this._transitionDetails;
+    this._transitionDetails = null;
+
+    // Do the things we _always_ need to do whenever the transition ends or is
+    // interrupted.
+    this._dispatchViewEvent(previousViewNode, "ViewHiding");
+    previousViewNode.removeAttribute("current");
+    if (reverse)
+      this._resetKeyNavigation(previousViewNode);
+    this.descriptionHeightWorkaround(viewNode);
+
+    if (phase >= TRANSITION_PHASES.START) {
+      this._panel.removeAttribute("width");
+      this._panel.removeAttribute("height");
+      // Myeah, panel layout auto-resizing is a funky thing. We'll wait
+      // another few milliseconds to remove the width and height 'fixtures',
+      // to be sure we don't flicker annoyingly.
+      // NB: HACK! Bug 1363756 is there to fix this.
+      this._autoResizeWorkaroundTimer = this.window.setTimeout(() => {
+        if (!this._viewContainer)
+          return;
+        this._viewContainer.style.removeProperty("height");
+        this._viewContainer.style.removeProperty("width");
+      }, 500);
+    }
+    if (phase >= TRANSITION_PHASES.PREPARE) {
+      this._transitioning = false;
+      if (reverse)
+        this._viewStack.style.removeProperty("margin-inline-start");
+      let deepestNode = reverse ? previousViewNode : viewNode;
+      deepestNode.style.removeProperty("border-inline-start");
+      this._viewStack.style.removeProperty("transition");
+    }
+    if (phase >= TRANSITION_PHASES.TRANSITION) {
+      this._viewStack.style.removeProperty("transform");
+      viewNode.style.removeProperty("width");
+      if (listener)
+        this._viewContainer.removeEventListener("transitionend", listener);
+      if (resolve)
+        resolve();
+    }
+    if (phase >= TRANSITION_PHASES.END) {
+      // We force 'display: none' on the previous view node to make sure that it
+      // doesn't cause an annoying flicker whilst resetting the styles above.
+      previousViewNode.style.display = "none";
+      await BrowserUtils.promiseLayoutFlushed(this.document, "layout", () => {});
+      previousViewNode.style.removeProperty("display");
+    }
+  }
+
+  /**
    * Helper method to emit an event on a panelview, whilst also making sure that
    * the correct method is called on CustomizableWidget instances.
    *
    * @param  {panelview} viewNode  Target of the event to dispatch.
    * @param  {String}    eventName Name of the event to dispatch.
    * @param  {DOMNode}   [anchor]  Node where the panel is anchored to. Optional.
    * @param  {Object}    [detail]  Event detail object. Optional.
    * @return {Boolean} `true` if the event was canceled by an event handler, `false`
@@ -699,61 +779,16 @@ this.PanelMultiView = class {
     });
     viewNode.dispatchEvent(evt);
     if (!cancel)
       cancel = evt.defaultPrevented;
     return cancel;
   }
 
   /**
-   * Calculate the correct bounds of a panelview node offscreen to minimize the
-   * amount of paint flashing and keep the stack vs panel layouts from interfering.
-   *
-   * @param {panelview} viewNode Node to measure the bounds of.
-   * @param {Rect}      previousRect Rect representing the previous view
-   *                                 (used to fill in any blanks).
-   * @param {Function}  callback Called when we got the measurements in and pass
-   *                             them on as its first argument.
-   */
-  _viewBoundsOffscreen(viewNode, previousRect, callback) {
-    if (viewNode.__lastKnownBoundingRect) {
-      callback(viewNode.__lastKnownBoundingRect);
-      return;
-    }
-
-    if (viewNode.customRectGetter) {
-      // Can't use Object.assign directly with a DOM Rect object because its properties
-      // aren't enumerable.
-      let {height, width} = previousRect;
-      let rect = Object.assign({height, width}, viewNode.customRectGetter());
-      let {header} = viewNode;
-      if (header) {
-        rect.height += this._dwu.getBoundsWithoutFlushing(header).height;
-      }
-      callback(rect);
-      return;
-    }
-
-    let oldSibling = viewNode.nextSibling || null;
-    this._offscreenViewStack.appendChild(viewNode);
-
-    BrowserUtils.promiseLayoutFlushed(this.document, "layout", () => {
-      return this._dwu.getBoundsWithoutFlushing(viewNode);
-    }).then(viewRect => {
-      try {
-        this._viewStack.insertBefore(viewNode, oldSibling);
-      } catch (ex) {
-        this._viewStack.appendChild(viewNode);
-      }
-
-      callback(viewRect);
-    });
-  }
-
-  /**
    * Applies the height transition for which <panelmultiview> is designed.
    *
    * The height transition involves two elements, the viewContainer and its only
    * immediate child the viewStack. In order for this to work correctly, the
    * viewContainer must have "overflow: hidden;" and the two elements must have
    * no margins or padding. This means that the height of the viewStack is never
    * limited by the viewContainer, but when the height of the container is not
    * constrained it matches the height of the viewStack.
@@ -957,20 +992,17 @@ this.PanelMultiView = class {
       case "popuphidden":
         // WebExtensions consumers can hide the popup from viewshowing, or
         // mid-transition, which disrupts our state:
         this._viewShowing = null;
         this._transitioning = false;
         this.node.removeAttribute("panelopen");
         this.showMainView();
         if (this.panelViews) {
-          if (this._transitionEndListener) {
-            this._viewContainer.removeEventListener("transitionend", this._transitionEndListener);
-            this._transitionEndListener = null;
-          }
+          this._cleanupTransitionPhase();
           for (let panelView of this._viewStack.children) {
             if (panelView.nodeName != "children") {
               panelView.__lastKnownBoundingRect = null;
               panelView.style.removeProperty("min-width");
               panelView.style.removeProperty("max-width");
             }
           }
           this.window.removeEventListener("keydown", this);
--- a/browser/components/customizableui/content/panelUI.css
+++ b/browser/components/customizableui/content/panelUI.css
@@ -24,25 +24,21 @@
 }
 
 .panel-subviews[panelopen] {
   transition: transform var(--panelui-subview-transition-duration);
 }
 
 .panel-viewcontainer[panelopen]:-moz-any(:not([viewtype="main"]),[transitioning]) {
   transition-property: height;
-  transition-timing-function: ease-in;
+  transition-timing-function: var(--animation-easing-function);
   transition-duration: var(--panelui-subview-transition-duration);
   will-change: height;
 }
 
-.panel-viewcontainer[panelopen]:-moz-any(:not([viewtype="main"]),[transitioning])[transition-reverse] {
-  transition-timing-function: ease-out;
-}
-
 /* START photon adjustments */
 
 photonpanelmultiview > .panel-viewcontainer > .panel-viewstack {
   overflow: visible;
 }
 
 photonpanelmultiview[transitioning] {
   pointer-events: none;
--- a/browser/components/customizableui/content/panelUI.inc.xul
+++ b/browser/components/customizableui/content/panelUI.inc.xul
@@ -748,8 +748,22 @@
                        type="checkbox"
                        oncommand="onViewToolbarCommand(event)"
                        label="&viewBookmarksToolbar.label;"
                        label-checked="&hideBookmarksToolbar.label;"/>
       </vbox>
     </panelview>
   </photonpanelmultiview>
 </panel>
+
+<panel id="downloads-button-autohide-panel"
+       role="group"
+       type="arrow"
+       hidden="true"
+       onpopupshown="gCustomizeMode._downloadPanelAutoHideTimeout = setTimeout(() => event.target.hidePopup(), 4000);"
+       onmouseover="clearTimeout(gCustomizeMode._downloadPanelAutoHideTimeout);"
+       onmouseout="gCustomizeMode._downloadPanelAutoHideTimeout = setTimeout(() => event.target.hidePopup(), 2000);"
+       onpopuphidden="clearTimeout(gCustomizeMode._downloadPanelAutoHideTimeout);"
+       >
+  <checkbox id="downloads-button-autohide-checkbox"
+            label="&customizeMode.autoHideDownloadsButton.label;" checked="true"
+            oncommand="gCustomizeMode.onDownloadsAutoHideChange(event)"/>
+</panel>
--- a/browser/components/customizableui/content/panelUI.xml
+++ b/browser/components/customizableui/content/panelUI.xml
@@ -49,19 +49,19 @@
         this.instance.destructor();
       ]]></destructor>
     </implementation>
   </binding>
 
   <binding id="photonpanelmultiview" extends="chrome://browser/content/customizableui/panelUI.xml#panelmultiview">
     <content>
       <xul:box anonid="viewContainer" class="panel-viewcontainer" xbl:inherits="panelopen,transitioning">
-        <xul:stack anonid="viewStack" xbl:inherits="transitioning" class="panel-viewstack">
+        <xul:box anonid="viewStack" xbl:inherits="transitioning" class="panel-viewstack">
           <children includes="panelview"/>
-        </xul:stack>
+        </xul:box>
       </xul:box>
       <xul:box class="panel-viewcontainer offscreen">
         <xul:box anonid="offscreenViewStack" class="panel-viewstack"/>
       </xul:box>
     </content>
   </binding>
 
   <binding id="panelview">
--- a/browser/components/customizableui/test/browser_1042100_default_placements_update.js
+++ b/browser/components/customizableui/test/browser_1042100_default_placements_update.js
@@ -14,17 +14,17 @@ function test() {
 
   let oldState = CustomizableUIBSPass.gSavedState;
   registerCleanupFunction(() => CustomizableUIBSPass.gSavedState = oldState );
 
   is(CustomizableUIBSPass.gFuturePlacements.size, 0,
      "All future placements should be dealt with by now.");
 
   let {CustomizableUIInternal, gFuturePlacements, gPalette} = CustomizableUIBSPass;
-  CustomizableUIInternal._introduceNewBuiltinWidgets();
+  CustomizableUIInternal._updateForNewVersion();
   is(gFuturePlacements.size, 0,
      "No change to future placements initially.");
 
   let currentVersion = CustomizableUIBSPass.kVersion;
 
 
   // Add our widget to the defaults:
   let testWidgetNew = {
@@ -62,17 +62,17 @@ function test() {
   CustomizableUIBSPass.kVersion++;
 
   let hadSavedState = !!CustomizableUIBSPass.gSavedState
   if (!hadSavedState) {
     CustomizableUIBSPass.gSavedState = {currentVersion: CustomizableUIBSPass.kVersion - 1};
   }
 
   // Then call the re-init routine so we re-add the builtin widgets
-  CustomizableUIInternal._introduceNewBuiltinWidgets();
+  CustomizableUIInternal._updateForNewVersion();
   is(gFuturePlacements.size, 1,
      "Should have 1 more future placement");
   let haveNavbarPlacements = gFuturePlacements.has(CustomizableUI.AREA_NAVBAR);
   ok(haveNavbarPlacements, "Should have placements for nav-bar");
   if (haveNavbarPlacements) {
     let placements = [...gFuturePlacements.get(CustomizableUI.AREA_NAVBAR)];
 
     // Ignore widgets that are placed using the pref facility and not the
@@ -91,40 +91,90 @@ function test() {
       }
       placements.splice(i, 1);
     }
 
     is(placements.length, 1, "Should have 1 newly placed widget in nav-bar");
     is(placements[0], testWidgetNew.id, "Should have our test widget to be placed in nav-bar");
   }
 
+  // Reset kVersion
+  CustomizableUIBSPass.kVersion--;
+
   // Now test that the builtin photon migrations work:
-  CustomizableUIBSPass.kVersion--;
 
   CustomizableUIBSPass.gSavedState = {
     currentVersion: 6,
     placements: {
       "nav-bar": ["urlbar-container", "bookmarks-menu-button"],
       "PanelUI-contents": ["panic-button", "edit-controls"],
     },
   };
-  CustomizableUIInternal._introduceNewBuiltinWidgets();
+  CustomizableUIInternal._updateForNewVersion();
   let navbarPlacements = CustomizableUIBSPass.gSavedState.placements["nav-bar"];
   let springs = navbarPlacements.filter(id => id.includes("spring"));
   is(springs.length, 2, "Should have 2 toolbarsprings in placements now");
   navbarPlacements = navbarPlacements.filter(id => !id.includes("spring"));
   is(navbarPlacements[0], "back-button", "Back button is in the right place.");
   is(navbarPlacements[1], "forward-button", "Fwd button is in the right place.");
   is(navbarPlacements[2], "stop-reload-button", "Stop/reload button is in the right place.");
   is(navbarPlacements[3], "home-button", "Home button is in the right place.");
   is(navbarPlacements[4], "urlbar-container", "URL bar is in the right place.");
-  is(navbarPlacements[5], "library-button", "Library button is in the right place.");
-  is(navbarPlacements[6], "sidebar-button", "Sidebar button is in the right place.");
-  is(navbarPlacements.length, 7, "Should have 7 items");
+  is(navbarPlacements[5], "downloads-button", "Downloads button is in the right place.");
+  is(navbarPlacements[6], "library-button", "Library button is in the right place.");
+  is(navbarPlacements[7], "sidebar-button", "Sidebar button is in the right place.");
+  is(navbarPlacements.length, 8, "Should have 8 items");
 
   let overflowPlacements = CustomizableUIBSPass.gSavedState.placements["widget-overflow-fixed-list"];
   Assert.deepEqual(overflowPlacements, ["panic-button"]);
 
+  // Finally test that the downloads migration works:
+  let oldNavbarPlacements = [
+    "urlbar-container", "customizableui-special-spring3", "search-container",
+  ];
+  CustomizableUIBSPass.gSavedState = {
+    currentVersion: 10,
+    placements: {
+      "nav-bar": Array.from(oldNavbarPlacements),
+      "widget-overflow-fixed-list": ["downloads-button"],
+    },
+  };
+  CustomizableUIInternal._updateForNewVersion();
+  navbarPlacements = CustomizableUIBSPass.gSavedState.placements["nav-bar"];
+  Assert.deepEqual(navbarPlacements, oldNavbarPlacements.concat(["downloads-button"]),
+                   "Downloads button inserted in navbar");
+  Assert.deepEqual(CustomizableUIBSPass.gSavedState.placements["widget-overflow-fixed-list"], [],
+                   "Overflow panel is empty");
+
+  CustomizableUIBSPass.gSavedState = {
+    currentVersion: 10,
+    placements: {
+      "nav-bar": ["downloads-button"].concat(oldNavbarPlacements),
+    },
+  };
+  CustomizableUIInternal._updateForNewVersion();
+  navbarPlacements = CustomizableUIBSPass.gSavedState.placements["nav-bar"];
+  Assert.deepEqual(navbarPlacements, oldNavbarPlacements.concat(["downloads-button"]),
+                   "Downloads button reinserted in navbar");
+
+  oldNavbarPlacements = [
+    "urlbar-container", "customizableui-special-spring3", "search-container", "other-widget",
+  ];
+  CustomizableUIBSPass.gSavedState = {
+    currentVersion: 10,
+    placements: {
+      "nav-bar": Array.from(oldNavbarPlacements),
+    },
+  };
+  CustomizableUIInternal._updateForNewVersion();
+  navbarPlacements = CustomizableUIBSPass.gSavedState.placements["nav-bar"];
+  let expectedNavbarPlacements = [
+    "urlbar-container", "customizableui-special-spring3", "search-container",
+    "downloads-button", "other-widget",
+  ];
+  Assert.deepEqual(navbarPlacements, expectedNavbarPlacements,
+                   "Downloads button inserted in navbar before other widgets");
+
   gFuturePlacements.delete(CustomizableUI.AREA_NAVBAR);
   gPalette.delete(testWidgetNew.id);
   gPalette.delete(testWidgetOld.id);
 }
 
--- a/browser/components/customizableui/test/browser_1161838_inserted_new_default_buttons.js
+++ b/browser/components/customizableui/test/browser_1161838_inserted_new_default_buttons.js
@@ -12,17 +12,17 @@ function test() {
      "All future placements should be dealt with by now.");
 
   let {CustomizableUIInternal, gFuturePlacements, gPalette} = CustomizableUIBSPass;
 
   // Force us to have a saved state:
   CustomizableUIInternal.saveState();
   CustomizableUIInternal.loadSavedState();
 
-  CustomizableUIInternal._introduceNewBuiltinWidgets();
+  CustomizableUIInternal._updateForNewVersion();
   is(gFuturePlacements.size, 0,
      "No change to future placements initially.");
 
   // Add our widget to the defaults:
   let testWidgetNew = {
     id: "test-messing-with-default-placements-new-pref",
     label: "Test messing with default placements - pref-based",
     defaultArea: CustomizableUI.AREA_NAVBAR,
@@ -39,17 +39,17 @@ function test() {
 
   // Now adjust default placements for area:
   let navbarArea = CustomizableUIBSPass.gAreas.get(CustomizableUI.AREA_NAVBAR);
   let navbarPlacements = navbarArea.get("defaultPlacements");
   navbarPlacements.splice(navbarPlacements.indexOf("bookmarks-menu-button") + 1, 0, testWidgetNew.id);
 
   let savedPlacements = CustomizableUIBSPass.gSavedState.placements[CustomizableUI.AREA_NAVBAR];
   // Then call the re-init routine so we re-add the builtin widgets
-  CustomizableUIInternal._introduceNewBuiltinWidgets();
+  CustomizableUIInternal._updateForNewVersion();
   is(gFuturePlacements.size, 1,
      "Should have 1 more future placement");
   let futureNavbarPlacements = gFuturePlacements.get(CustomizableUI.AREA_NAVBAR);
   ok(futureNavbarPlacements, "Should have placements for nav-bar");
   if (futureNavbarPlacements) {
     ok(futureNavbarPlacements.has(testWidgetNew.id), "widget should be in future placements");
   }
   CustomizableUIInternal._placeNewDefaultWidgetsInArea(CustomizableUI.AREA_NAVBAR);
--- a/browser/components/customizableui/test/browser_918049_skipintoolbarset_dnd.js
+++ b/browser/components/customizableui/test/browser_918049_skipintoolbarset_dnd.js
@@ -11,27 +11,27 @@ var skippedItem;
 add_task(async function() {
   navbar = document.getElementById("nav-bar");
   skippedItem = document.createElement("toolbarbutton");
   skippedItem.id = "test-skipintoolbarset-item";
   skippedItem.setAttribute("label", "Test");
   skippedItem.setAttribute("skipintoolbarset", "true");
   skippedItem.setAttribute("removable", "true");
   navbar.customizationTarget.appendChild(skippedItem);
-  let downloadsButton = document.getElementById("downloads-button");
+  let libraryButton = document.getElementById("library-button");
   await startCustomizing();
   ok(CustomizableUI.inDefaultState, "Should still be in default state");
-  simulateItemDrag(skippedItem, downloadsButton);
+  simulateItemDrag(skippedItem, libraryButton);
   ok(CustomizableUI.inDefaultState, "Should still be in default state");
   let skippedItemWrapper = skippedItem.parentNode;
   is(skippedItemWrapper.nextSibling && skippedItemWrapper.nextSibling.id,
-     downloadsButton.parentNode.id, "Should be next to downloads button");
-  simulateItemDrag(downloadsButton, skippedItem);
-  let downloadWrapper = downloadsButton.parentNode;
-  is(downloadWrapper.nextSibling && downloadWrapper.nextSibling.id,
+     libraryButton.parentNode.id, "Should be next to library button");
+  simulateItemDrag(libraryButton, skippedItem);
+  let libraryWrapper = libraryButton.parentNode;
+  is(libraryWrapper.nextSibling && libraryWrapper.nextSibling.id,
      skippedItem.parentNode.id, "Should be next to skipintoolbarset item");
   ok(CustomizableUI.inDefaultState, "Should still be in default state");
 });
 
 add_task(async function asyncCleanup() {
   await endCustomizing();
   skippedItem.remove();
   await resetCustomization();
--- a/browser/components/customizableui/test/browser_923857_customize_mode_event_wrapping_during_reset.js
+++ b/browser/components/customizableui/test/browser_923857_customize_mode_event_wrapping_during_reset.js
@@ -3,21 +3,21 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 // Customize mode reset button should revert correctly
 add_task(async function() {
   await startCustomizing();
   let devButton = document.getElementById("developer-button");
-  let downloadsButton = document.getElementById("downloads-button");
+  let libraryButton = document.getElementById("library-button");
   let homeButton = document.getElementById("home-button");
   let palette = document.getElementById("customization-palette");
-  ok(devButton && downloadsButton && homeButton && palette, "Stuff should exist");
-  simulateItemDrag(devButton, downloadsButton);
+  ok(devButton && libraryButton && homeButton && palette, "Stuff should exist");
+  simulateItemDrag(devButton, libraryButton);
   simulateItemDrag(homeButton, palette);
   await gCustomizeMode.reset();
   ok(CustomizableUI.inDefaultState, "Should be back in default state");
   await endCustomizing();
 });
 
 add_task(async function asyncCleanup() {
   await resetCustomization();
--- a/browser/components/customizableui/test/browser_927717_customize_drag_empty_toolbar.js
+++ b/browser/components/customizableui/test/browser_927717_customize_drag_empty_toolbar.js
@@ -5,21 +5,21 @@
 "use strict";
 
 const kTestToolbarId = "test-empty-drag";
 
 // Attempting to drag an item to an empty container should work.
 add_task(async function() {
   await createToolbarWithPlacements(kTestToolbarId, []);
   await startCustomizing();
-  let downloadButton = document.getElementById("downloads-button");
+  let libraryButton = document.getElementById("library-button");
   let customToolbar = document.getElementById(kTestToolbarId);
-  simulateItemDrag(downloadButton, customToolbar);
-  assertAreaPlacements(kTestToolbarId, ["downloads-button"]);
-  ok(downloadButton.parentNode && downloadButton.parentNode.parentNode == customToolbar,
+  simulateItemDrag(libraryButton, customToolbar);
+  assertAreaPlacements(kTestToolbarId, ["library-button"]);
+  ok(libraryButton.parentNode && libraryButton.parentNode.parentNode == customToolbar,
      "Button should really be in toolbar");
   await endCustomizing();
   removeCustomToolbars();
 });
 
 add_task(async function asyncCleanup() {
   await endCustomizing();
   await resetCustomization();
--- a/browser/components/customizableui/test/browser_968565_insert_before_hidden_items.js
+++ b/browser/components/customizableui/test/browser_968565_insert_before_hidden_items.js
@@ -39,18 +39,18 @@ add_task(async function() {
 
   // Make sure we have some hidden items at the end of the nav-bar.
   navbar.insertItem(hidden1.id);
   navbar.insertItem(hidden2.id);
 
   // Drag an item and drop it onto the nav-bar customization target, but
   // not over a particular item.
   await startCustomizing();
-  let downloadsButton = document.getElementById("downloads-button");
-  simulateItemDrag(downloadsButton, navbar.customizationTarget);
+  let homeButton = document.getElementById("home-button");
+  simulateItemDrag(homeButton, navbar.customizationTarget);
 
   await endCustomizing();
 
-  is(downloadsButton.previousSibling.id, lastVisible.id,
+  is(homeButton.previousSibling.id, lastVisible.id,
      "The downloads button should be placed after the last visible item.");
 
   await resetCustomization();
 });
--- a/browser/components/customizableui/test/browser_overflow_use_subviews.js
+++ b/browser/components/customizableui/test/browser_overflow_use_subviews.js
@@ -1,19 +1,21 @@
 "use strict";
 
 const kOverflowPanel = document.getElementById("widget-overflow");
 
 var gOriginalWidth;
-registerCleanupFunction(async function() {
+async function stopOverflowing() {
   kOverflowPanel.removeAttribute("animate");
   window.resizeTo(gOriginalWidth, window.outerHeight);
   await waitForCondition(() => !document.getElementById("nav-bar").hasAttribute("overflowing"));
   CustomizableUI.reset();
-});
+}
+
+registerCleanupFunction(stopOverflowing);
 
 /**
  * This checks that subview-compatible items show up as subviews rather than
  * re-anchored panels. If we ever remove the developer widget, please
  * replace this test with another subview - don't remove it.
  */
 add_task(async function check_developer_subview_in_overflow() {
   kOverflowPanel.setAttribute("animate", "false");
@@ -37,33 +39,35 @@ add_task(async function check_developer_
   let subviewShownPromise = subviewShown(developerView);
   button.click();
   await subviewShownPromise;
   let hasSubviews = !!kOverflowPanel.querySelector("photonpanelmultiview,panelmultiview");
   let expectedPanel = hasSubviews ? kOverflowPanel : document.getElementById("customizationui-widget-panel");
   is(developerView.closest("panel"), expectedPanel, "Should be inside the panel");
   expectedPanel.hidePopup();
   await Promise.resolve(); // wait for popup to hide fully.
+  await stopOverflowing();
 });
 
 /**
  * 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 navbar = document.getElementById(CustomizableUI.AREA_NAVBAR);
-  ok(navbar.hasAttribute("overflowing"), "Should still be overflowing");
+  let button = document.getElementById("downloads-button");
+  gCustomizeMode.addToPanel(button);
+  await waitForOverflowButtonShown();
+
   let chevron = document.getElementById("nav-bar-overflow-button");
   let shownPanelPromise = promisePanelElementShown(window, kOverflowPanel);
   chevron.click();
   await shownPanelPromise;
 
-  let button = document.getElementById("downloads-button");
   button.click();
   await waitForCondition(() => {
     let panel = document.getElementById("downloadsPanel");
     return panel && panel.state != "closed";
   });
   let downloadsPanel = document.getElementById("downloadsPanel");
   isnot(downloadsPanel.state, "closed", "Should be attempting to show the downloads panel.");
   downloadsPanel.hidePopup();
--- a/browser/components/downloads/content/downloads.js
+++ b/browser/components/downloads/content/downloads.js
@@ -218,16 +218,19 @@ var DownloadsPanel = {
     DownloadsCommon.log("Opening the downloads panel.");
 
     if (this.isPanelShowing) {
       DownloadsCommon.log("Panel is already showing - focusing instead.");
       this._focusPanel();
       return;
     }
 
+    // As a belt-and-suspenders check, ensure the button is not hidden.
+    DownloadsButton.unhide();
+
     this.initialize(() => {
       // Delay displaying the panel because this function will sometimes be
       // called while another window is closing (like the window for selecting
       // whether to save or open the file), and that would cause the panel to
       // close immediately.
       setTimeout(() => this._openPopupIfDataReady(), 0);
     });
 
--- a/browser/components/downloads/content/indicator.js
+++ b/browser/components/downloads/content/indicator.js
@@ -50,99 +50,57 @@ const DownloadsButton = {
    * Returns a reference to the downloads button position placeholder, or null
    * if not available because it has been removed from the toolbars.
    */
   get _placeholder() {
     return document.getElementById("downloads-button");
   },
 
   /**
+   * Indicates whether toolbar customization is in progress.
+   */
+  _customizing: false,
+
+  /**
    * This function is called asynchronously just after window initialization.
    *
    * NOTE: This function should limit the input/output it performs to improve
    *       startup time.
    */
   initializeIndicator() {
     DownloadsIndicatorView.ensureInitialized();
   },
 
   /**
-   * Indicates whether toolbar customization is in progress.
-   */
-  _customizing: false,
-
-  /**
-   * This function is called when toolbar customization starts.
-   *
-   * During customization, we never show the actual download progress indication
-   * or the event notifications, but we show a neutral placeholder.  The neutral
-   * placeholder is an ordinary button defined in the browser window that can be
-   * moved freely between the toolbars and the customization palette.
-   */
-  customizeStart() {
-    // Prevent the indicator from being displayed as a temporary anchor
-    // during customization, even if requested using the getAnchor method.
-    this._customizing = true;
-    this._anchorRequested = false;
-  },
-
-  /**
-   * This function is called when toolbar customization ends.
-   */
-  customizeDone() {
-    this._customizing = false;
-    DownloadsIndicatorView.afterCustomize();
-  },
-
-  /**
    * Determines the position where the indicator should appear, and moves its
    * associated element to the new position.
    *
    * @return Anchor element, or null if the indicator is not visible.
    */
   _getAnchorInternal() {
     let indicator = DownloadsIndicatorView.indicator;
     if (!indicator) {
       // Exit now if the indicator overlay isn't loaded yet, or if the button
       // is not in the document.
       return null;
     }
 
     indicator.open = this._anchorRequested;
 
-    let widget = CustomizableUI.getWidget("downloads-button")
-                               .forWindow(window);
+    let widget = CustomizableUI.getWidget("downloads-button");
      // Determine if the indicator is located on an invisible toolbar.
-     if (!isElementVisible(indicator.parentNode) && !widget.overflowed) {
+     if (!isElementVisible(indicator.parentNode) &&
+         widget.areaType == CustomizableUI.TYPE_TOOLBAR) {
        return null;
      }
 
     return DownloadsIndicatorView.indicatorAnchor;
   },
 
   /**
-   * Checks whether the indicator is, or will soon be visible in the browser
-   * window.
-   *
-   * @param aCallback
-   *        Called once the indicator overlay has loaded. Gets a boolean
-   *        argument representing the indicator visibility.
-   */
-  checkIsVisible(aCallback) {
-    DownloadsOverlayLoader.ensureOverlayLoaded(this.kIndicatorOverlay, () => {
-      if (!this._placeholder) {
-        aCallback(false);
-      } else {
-        let element = DownloadsIndicatorView.indicator || this._placeholder;
-        aCallback(isElementVisible(element.parentNode));
-      }
-    });
-  },
-
-  /**
    * Indicates whether we should try and show the indicator temporarily as an
    * anchor for the panel, even if the indicator would be hidden by default.
    */
   _anchorRequested: false,
 
   /**
    * Ensures that there is an anchor available for the panel.
    *
@@ -167,16 +125,101 @@ const DownloadsButton = {
   /**
    * Allows the temporary anchor to be hidden.
    */
   releaseAnchor() {
     this._anchorRequested = false;
     this._getAnchorInternal();
   },
 
+  unhide() {
+    let button = this._placeholder;
+    if (button && button.hasAttribute("hidden")) {
+      button.removeAttribute("hidden");
+      if (this._navBar.contains(button)) {
+        this._navBar.setAttribute("downloadsbuttonshown", "true");
+      }
+    }
+  },
+
+  hide() {
+    let button = this._placeholder;
+    if (this.autoHideDownloadsButton && button && button.closest("toolbar")) {
+      DownloadsPanel.hidePanel();
+      button.setAttribute("hidden", "true");
+      this._navBar.removeAttribute("downloadsbuttonshown");
+    }
+  },
+
+  startAutoHide() {
+    if (DownloadsIndicatorView.hasDownloads) {
+      this.unhide();
+    } else {
+      this.hide();
+    }
+  },
+
+  checkForAutoHide() {
+    let button = this._placeholder;
+    if (!this._customizing && this.autoHideDownloadsButton &&
+        button && button.closest("toolbar")) {
+      this.startAutoHide();
+    } else {
+      this.unhide();
+    }
+  },
+
+  // Callback from CustomizableUI when nodes get moved around.
+  // We use this to track whether our node has moved somewhere
+  // where we should (not) autohide it.
+  onWidgetAfterDOMChange(node) {
+    if (node == this._placeholder) {
+      this.checkForAutoHide();
+    }
+  },
+
+  /**
+   * This function is called when toolbar customization starts.
+   *
+   * During customization, we never show the actual download progress indication
+   * or the event notifications, but we show a neutral placeholder.  The neutral
+   * placeholder is an ordinary button defined in the browser window that can be
+   * moved freely between the toolbars and the customization palette.
+   */
+  onCustomizeStart(win) {
+    if (win == window) {
+      // Prevent the indicator from being displayed as a temporary anchor
+      // during customization, even if requested using the getAnchor method.
+      this._customizing = true;
+      this._anchorRequested = false;
+      this.unhide();
+    }
+  },
+
+  onCustomizeEnd(win) {
+    if (win == window) {
+      this._customizing = false;
+      this.checkForAutoHide();
+      DownloadsIndicatorView.afterCustomize();
+    }
+  },
+
+  init() {
+    XPCOMUtils.defineLazyPreferenceGetter(
+      this, "autoHideDownloadsButton", "browser.download.autohideButton",
+      true, this.checkForAutoHide.bind(this));
+
+    CustomizableUI.addListener(this);
+    this.checkForAutoHide();
+  },
+
+  uninit() {
+    CustomizableUI.removeListener(this);
+  },
+
   get _tabsToolbar() {
     delete this._tabsToolbar;
     return this._tabsToolbar = document.getElementById("TabsToolbar");
   },
 
   get _navBar() {
     delete this._navBar;
     return this._navBar = document.getElementById("nav-bar");
@@ -337,17 +380,17 @@ const DownloadsIndicatorView = {
     // No need to show visual notification if the panel is visible.
     if (DownloadsPanel.isPanelShowing) {
       return;
     }
 
     let anchor = DownloadsButton._placeholder;
     let widgetGroup = CustomizableUI.getWidget("downloads-button");
     let widget = widgetGroup.forWindow(window);
-    if (widget.overflowed || widgetGroup.areaType == CustomizableUI.TYPE_MENU_PANEL) {
+    if (widgetGroup.areaType == CustomizableUI.TYPE_MENU_PANEL) {
       if (anchor && this._isAncestorPanelOpen(anchor)) {
         // If the containing panel is open, don't do anything, because the
         // notification would appear under the open panel. See
         // https://bugzilla.mozilla.org/show_bug.cgi?id=984023
         return;
       }
 
       // Otherwise, try to use the anchor of the panel:
@@ -418,18 +461,22 @@ const DownloadsIndicatorView = {
    * Indicates whether the indicator should be shown because there are some
    * downloads to be displayed.
    */
   set hasDownloads(aValue) {
     if (this._hasDownloads != aValue || (!this._operational && aValue)) {
       this._hasDownloads = aValue;
 
       // If there is at least one download, ensure that the view elements are
+      // operational
       if (aValue) {
+        DownloadsButton.unhide();
         this._ensureOperational();
+      } else {
+        DownloadsButton.checkForAutoHide();
       }
     }
     return aValue;
   },
   get hasDownloads() {
     return this._hasDownloads;
   },
   _hasDownloads: false,
@@ -503,24 +550,17 @@ const DownloadsIndicatorView = {
     DownloadsIndicatorView.ensureTerminated();
   },
 
   onCommand(aEvent) {
     if (aEvent.type == "mousedown" && aEvent.button != 0) {
       return;
     }
 
-    // If the downloads button is in the menu panel, open the Library
-    let widgetGroup = CustomizableUI.getWidget("downloads-button");
-    if (widgetGroup.areaType == CustomizableUI.TYPE_MENU_PANEL) {
-      DownloadsPanel.showDownloadsHistory();
-    } else {
-      DownloadsPanel.showPanel();
-    }
-
+    DownloadsPanel.showPanel();
     aEvent.stopPropagation();
   },
 
   onDragOver(aEvent) {
     browserDragAndDrop.dragOver(aEvent);
   },
 
   onDrop(aEvent) {
@@ -562,20 +602,19 @@ const DownloadsIndicatorView = {
     if (!indicator || indicator.getAttribute("indicator") != "true") {
       return null;
     }
 
     return this._indicator = indicator;
   },
 
   get indicatorAnchor() {
-    let widget = CustomizableUI.getWidget("downloads-button")
-                               .forWindow(window);
-    if (widget.overflowed) {
-      return widget.anchor;
+    let widgetGroup = CustomizableUI.getWidget("downloads-button");
+    if (widgetGroup.areaType == CustomizableUI.TYPE_MENU_PANEL) {
+      return widgetGroup.forWindow(window).anchor;
     }
     return document.getElementById("downloads-indicator-anchor");
   },
 
   get _progressIcon() {
     return this.__progressIcon ||
       (this.__progressIcon = document.getElementById("downloads-indicator-progress-inner"));
   },
--- a/browser/components/downloads/test/browser/browser.ini
+++ b/browser/components/downloads/test/browser/browser.ini
@@ -8,8 +8,9 @@ skip-if = os == "linux" # Bug 949434
 skip-if = os == "linux" # Bug 952422
 [browser_confirm_unblock_download.js]
 [browser_iframe_gone_mid_download.js]
 [browser_indicatorDrop.js]
 [browser_libraryDrop.js]
 [browser_downloads_panel_block.js]
 skip-if = true # Bug 1352792
 [browser_downloads_panel_height.js]
+[browser_downloads_autohide.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/downloads/test/browser/browser_downloads_autohide.js
@@ -0,0 +1,271 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const kDownloadAutoHidePref = "browser.download.autohideButton";
+
+registerCleanupFunction(async function() {
+  Services.prefs.clearUserPref(kDownloadAutoHidePref);
+  if (document.documentElement.hasAttribute("customizing")) {
+    await gCustomizeMode.reset();
+    await promiseCustomizeEnd();
+  } else {
+    CustomizableUI.reset();
+  }
+});
+
+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);
+  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);
+  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);
+  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"),
+     "Button should be hidden again in the toolbar");
+  gCustomizeMode.removeFromArea(downloadsButton);
+  Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
+  // Can't use gCustomizeMode.addToToolbar here because it doesn't work for
+  // palette items if the window isn't in customize mode:
+  CustomizableUI.addWidgetToArea(downloadsButton.id, CustomizableUI.AREA_NAVBAR);
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should be unhidden again in the toolbar " +
+     "even if the pref was flipped while the button was in the palette");
+  Services.prefs.setBoolPref(kDownloadAutoHidePref, true);
+});
+
+add_task(async function checkStateInCustomizeMode() {
+  ok(Services.prefs.getBoolPref("browser.download.autohideButton"),
+     "Should be autohiding the button");
+  let downloadsButton = document.getElementById("downloads-button");
+  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);
+  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 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 " +
+     "customize mode because we moved it.");
+  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.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.");
+  await gCustomizeMode.reset();
+  await promiseCustomizeEnd();
+});
+
+add_task(async function checkStateInCustomizeModeMultipleWindows() {
+  ok(Services.prefs.getBoolPref("browser.download.autohideButton"),
+     "Should be autohiding the button");
+  let downloadsButton = document.getElementById("downloads-button");
+  await promiseCustomizeStart();
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should be shown in customize mode.");
+  let otherWin = await BrowserTestUtils.openNewBrowserWindow();
+  let otherDownloadsButton = otherWin.document.getElementById("downloads-button");
+  ok(otherDownloadsButton.hasAttribute("hidden"),
+     "Button should be hidden in the other window.");
+
+  // Use CUI directly instead of the customize mode APIs,
+  // to avoid tripping the "automatically turn off autohide" code.
+  CustomizableUI.addWidgetToArea("downloads-button",
+                                 CustomizableUI.AREA_FIXED_OVERFLOW_PANEL);
+  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.");
+
+  CustomizableUI.addWidgetToArea("downloads-button", CustomizableUI.AREA_NAVBAR);
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should still be shown in customize mode.");
+  ok(otherDownloadsButton.hasAttribute("hidden"),
+     "Button should be hidden again in the other window.");
+
+  Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should be shown in customize mode");
+  ok(!otherDownloadsButton.hasAttribute("hidden"),
+     "Button should be shown in the other window with the pref flipped");
+
+  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);
+  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");
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should still be shown in customize mode.");
+  // Don't need to assert in the other window - button is gone there.
+
+  await gCustomizeMode.reset();
+  ok(Services.prefs.getBoolPref(kDownloadAutoHidePref),
+     "Autohide pref reset by reset()");
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should still be shown in customize mode.");
+  ok(otherDownloadsButton.hasAttribute("hidden"),
+     "Button should be hidden in the other window.");
+  ok(otherDownloadsButton.closest("#nav-bar"),
+     "Button should be back in the nav bar in the other window.");
+
+  await promiseCustomizeEnd();
+  ok(downloadsButton.hasAttribute("hidden"),
+     "Button should be hidden again outside of customize mode");
+  await BrowserTestUtils.closeWindow(otherWin);
+});
+
+add_task(async function checkStateForDownloads() {
+  ok(Services.prefs.getBoolPref("browser.download.autohideButton"),
+     "Should be autohiding the button");
+  let downloadsButton = document.getElementById("downloads-button");
+  ok(downloadsButton.hasAttribute("hidden"),
+     "Button should be hidden when there are no downloads.");
+
+  await task_addDownloads([
+    { state: DownloadsCommon.DOWNLOAD_DOWNLOADING },
+  ]);
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should be unhidden when there are downloads.");
+  let publicList = await Downloads.getList(Downloads.PUBLIC);
+  let downloads = await publicList.getAll();
+  for (let download of downloads) {
+    publicList.remove(download);
+  }
+  ok(downloadsButton.hasAttribute("hidden"),
+     "Button should be hidden when the download is removed");
+  await task_addDownloads([
+    { state: DownloadsCommon.DOWNLOAD_DOWNLOADING },
+  ]);
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should be unhidden when there are downloads.");
+
+  Services.prefs.setBoolPref(kDownloadAutoHidePref, false);
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should still be unhidden.");
+
+  downloads = await publicList.getAll();
+  for (let download of downloads) {
+    publicList.remove(download);
+  }
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should still be unhidden because the pref was flipped.");
+  Services.prefs.setBoolPref(kDownloadAutoHidePref, true);
+  ok(downloadsButton.hasAttribute("hidden"),
+     "Button should be hidden now that the pref flipped back " +
+     "because there were already no downloads.");
+
+  gCustomizeMode.addToPanel(downloadsButton);
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should not be hidden in the panel.");
+
+  await task_addDownloads([
+    { state: DownloadsCommon.DOWNLOAD_DOWNLOADING },
+  ]);
+
+  downloads = await publicList.getAll();
+  for (let download of downloads) {
+    publicList.remove(download);
+  }
+
+  ok(!downloadsButton.hasAttribute("hidden"),
+     "Button should still not be hidden in the panel " +
+     "when downloads count reaches 0 after being non-0.");
+});
+
+function promiseCustomizeStart(aWindow = window) {
+  return new Promise(resolve => {
+    aWindow.gNavToolbox.addEventListener("customizationready", resolve,
+                                         {once: true});
+    aWindow.gCustomizeMode.enter();
+  });
+}
+
+function promiseCustomizeEnd(aWindow = window) {
+  return new Promise(resolve => {
+    aWindow.gNavToolbox.addEventListener("aftercustomization", resolve,
+                                         {once: true});
+    aWindow.gCustomizeMode.exit();
+  });
+}
+
--- a/browser/components/downloads/test/browser/browser_downloads_panel_height.js
+++ b/browser/components/downloads/test/browser/browser_downloads_panel_height.js
@@ -4,16 +4,18 @@
 "use strict";
 
 /**
  * This test exists because we use a <panelmultiview> element and it handles
  * some of the height changes for us. We need to verify that the height is
  * updated correctly if downloads are removed while the panel is hidden.
  */
 add_task(async function test_height_reduced_after_removal() {
+  await SpecialPowers.pushPrefEnv({set: [["browser.download.autohideButton", false]]});
+  await promiseButtonShown("downloads-button");
   await task_addDownloads([
     { state: DownloadsCommon.DOWNLOAD_FINISHED },
   ]);
 
   await task_openPanel();
   let panel = document.getElementById("downloadsPanel");
   let heightBeforeRemoval = panel.getBoundingClientRect().height;
 
--- a/browser/components/downloads/test/browser/browser_first_download_panel.js
+++ b/browser/components/downloads/test/browser/browser_first_download_panel.js
@@ -5,16 +5,18 @@
 /* eslint-disable mozilla/no-arbitrary-setTimeout */
 
 /**
  * Make sure the downloads panel only opens automatically on the first
  * download it notices. All subsequent downloads, even across sessions, should
  * not open the panel automatically.
  */
 add_task(async function test_first_download_panel() {
+  await SpecialPowers.pushPrefEnv({set: [["browser.download.autohideButton", false]]});
+  await promiseButtonShown("downloads-button");
   // Clear the download panel has shown preference first as this test is used to
   // verify this preference's behaviour.
   let oldPrefValue = Services.prefs.getBoolPref("browser.download.panel.shown");
   Services.prefs.setBoolPref("browser.download.panel.shown", false);
 
   registerCleanupFunction(async function() {
     // Clean up when the test finishes.
     await task_resetState();
@@ -27,16 +29,17 @@ add_task(async function test_first_downl
 
   // Ensure that state is reset in case previous tests didn't finish.
   await task_resetState();
 
   // With this set to false, we should automatically open the panel the first
   // time a download is started.
   DownloadsCommon.getData(window).panelHasShownBefore = false;
 
+  info("waiting for panel open");
   let promise = promisePanelOpened();
   DownloadsCommon.getData(window)._notifyDownloadEvent("start");
   await promise;
 
   // If we got here, that means the panel opened.
   DownloadsPanel.hidePanel();
 
   ok(DownloadsCommon.getData(window).panelHasShownBefore,
--- a/browser/components/downloads/test/browser/browser_indicatorDrop.js
+++ b/browser/components/downloads/test/browser/browser_indicatorDrop.js
@@ -7,18 +7,20 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   "resource://testing-common/httpd.js");
 
 registerCleanupFunction(async function() {
   await task_resetState();
   await PlacesUtils.history.clear();
 });
 
 add_task(async function test_indicatorDrop() {
+  await SpecialPowers.pushPrefEnv({set: [["browser.download.autohideButton", false]]});
   let downloadButton = document.getElementById("downloads-button");
   ok(downloadButton, "download button present");
+  await promiseButtonShown(downloadButton.id);
 
   let scriptLoader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
       getService(Ci.mozIJSSubScriptLoader);
   let EventUtils = {};
   scriptLoader.loadSubScript("chrome://mochikit/content/tests/SimpleTest/EventUtils.js", EventUtils);
 
   async function task_drop(urls) {
     let dragData = [[{type: "text/plain", data: urls.join("\n")}]];
--- a/browser/components/downloads/test/browser/browser_overflow_anchor.js
+++ b/browser/components/downloads/test/browser/browser_overflow_anchor.js
@@ -10,106 +10,43 @@ registerCleanupFunction(async function()
 });
 
 /**
  * Make sure the downloads button and indicator overflows into the nav-bar
  * chevron properly, and then when those buttons are clicked in the overflow
  * panel that the downloads panel anchors to the chevron.
  */
 add_task(async function test_overflow_anchor() {
+  await SpecialPowers.pushPrefEnv({set: [["browser.download.autohideButton", false]]});
   // Ensure that state is reset in case previous tests didn't finish.
   await task_resetState();
 
-  // Record the original width of the window so we can put it back when
-  // this test finishes.
-  let oldWidth = window.outerWidth;
-
   // 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");
 
-  // Hack - we lock the size of the default flex-y items in the nav-bar, namely,
-  // the URL input. That way we can resize the window without worrying about it
-  // flexing.
-  const kFlexyItems = ["urlbar-container"];
-  registerCleanupFunction(() => unlockWidth(kFlexyItems));
-  lockWidth(kFlexyItems);
-
-  window.resizeTo(kForceOverflowWidthPx, window.outerHeight);
-  await waitForOverflowed(button, true);
+  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");
   is(panel.anchorNode, chevron, "Panel should be anchored to the chevron.");
 
   DownloadsPanel.hidePanel();
 
-  // Unlock the widths on the flex-y items.
-  unlockWidth(kFlexyItems);
-
-  // Put the window back to its original dimensions.
-  window.resizeTo(oldWidth, window.outerHeight);
-
-  // The downloads button should eventually be un-overflowed.
-  await waitForOverflowed(button, false);
+  gCustomizeMode.addToToolbar(button.node);
 
   // Now try opening the panel again.
   promise = promisePanelOpened();
   EventUtils.sendMouseEvent({ type: "mousedown", button: 0 }, button.node);
   await promise;
 
   is(panel.anchorNode.id, "downloads-indicator-anchor");
 
   DownloadsPanel.hidePanel();
 });
 
-/**
- * For some node IDs, finds the nodes and sets their min-width's to their
- * current width, preventing them from flex-shrinking.
- *
- * @param aItemIDs an array of item IDs to set min-width on.
- */
-function lockWidth(aItemIDs) {
-  for (let itemID of aItemIDs) {
-    let item = document.getElementById(itemID);
-    let curWidth = item.getBoundingClientRect().width + "px";
-    item.style.minWidth = curWidth;
-  }
-}
-
-/**
- * Clears the min-width's set on a set of IDs by lockWidth.
- *
- * @param aItemIDs an array of ItemIDs to remove min-width on.
- */
-function unlockWidth(aItemIDs) {
-  for (let itemID of aItemIDs) {
-    let item = document.getElementById(itemID);
-    item.style.minWidth = "";
-  }
-}
-
-/**
- * Waits for a node to enter or exit the overflowed state.
- *
- * @param aItem the node to wait for.
- * @param aIsOverflowed if we're waiting for the item to be overflowed.
- */
-function waitForOverflowed(aItem, aIsOverflowed) {
-  if (aItem.overflowed == aIsOverflowed) {
-    return Promise.resolve();
-  }
-
-  return new Promise(resolve => {
-    let observer = new MutationObserver(function(aMutations) {
-      if (aItem.overflowed == aIsOverflowed) {
-        observer.disconnect();
-        resolve();
-      }
-    });
-    observer.observe(aItem.node, {attributes: true});
-  });
-}
--- a/browser/components/downloads/test/browser/head.js
+++ b/browser/components/downloads/test/browser/head.js
@@ -193,8 +193,20 @@ function promiseAlertDialogOpen(buttonAc
             doc.getButton(buttonAction).click();
             resolve();
           }
         }, {once: true});
       }
     });
   });
 }
+
+/**
+ * Waits for a given button to become visible.
+ */
+function promiseButtonShown(id) {
+  let dwu = window.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
+  return BrowserTestUtils.waitForCondition(() => {
+    let target = document.getElementById(id);
+    let bounds = dwu.getBoundsWithoutFlushing(target);
+    return bounds.width > 0 && bounds.height > 0;
+  }, `Waiting for button ${id} to have non-0 size`);
+}
--- a/browser/components/extensions/test/browser/browser-common.ini
+++ b/browser/components/extensions/test/browser/browser-common.ini
@@ -40,16 +40,17 @@ skip-if = os == 'linux'
 [browser_ext_browserAction_disabled.js]
 [browser_ext_browserAction_pageAction_icon.js]
 [browser_ext_browserAction_pageAction_icon_permissions.js]
 [browser_ext_browserAction_popup.js]
 skip-if = debug && (os == 'linux' && bits == 32) # Bug 1313372
 [browser_ext_browserAction_popup_preload.js]
 skip-if = (os == 'win' && !debug) # bug 1352668
 [browser_ext_browserAction_popup_resize.js]
+skip-if = os == 'mac' # Bug 1374749 will re-enable this test again.
 [browser_ext_browserAction_simple.js]
 [browser_ext_browserAction_telemetry.js]
 [browser_ext_browserAction_theme_icons.js]
 [browser_ext_browsingData_formData.js]
 [browser_ext_browsingData_history.js]
 [browser_ext_browsingData_localStorage.js]
 [browser_ext_browsingData_pluginData.js]
 [browser_ext_browsingData_serviceWorkers.js]
--- a/browser/components/migration/FirefoxProfileMigrator.js
+++ b/browser/components/migration/FirefoxProfileMigrator.js
@@ -121,23 +121,31 @@ FirefoxProfileMigrator.prototype._getRes
         for (let file of files) {
           file.copyTo(currentProfileDir, "");
         }
         aCallback(true);
       }
     };
   };
 
+  function savePrefs() {
+    // If we've used the pref service to write prefs for the new profile, it's too
+    // early in startup for the service to have a profile directory, so we have to
+    // manually tell it where to save the prefs file.
+    let newPrefsFile = currentProfileDir.clone();
+    newPrefsFile.append("prefs.js");
+    Services.prefs.savePrefFile(newPrefsFile);
+  }
+
   let types = MigrationUtils.resourceTypes;
   let places = getFileResource(types.HISTORY, ["places.sqlite", "places.sqlite-wal"]);
   let favicons = getFileResource(types.HISTORY, ["favicons.sqlite", "favicons.sqlite-wal"]);
   let cookies = getFileResource(types.COOKIES, ["cookies.sqlite", "cookies.sqlite-wal"]);
   let passwords = getFileResource(types.PASSWORDS,
-    ["signons.sqlite", "logins.json", "key3.db", "key4.db",
-     "signedInUser.json"]);
+    ["signons.sqlite", "logins.json", "key3.db", "key4.db"]);
   let formData = getFileResource(types.FORMDATA, [
     "formhistory.sqlite",
     "autofill-profiles.json",
   ]);
   let bookmarksBackups = getFileResource(types.OTHERDATA,
     [PlacesBackups.profileRelativeFolderPath]);
   let dictionary = getFileResource(types.OTHERDATA, ["persdict.dat"]);
 
@@ -163,30 +171,57 @@ FirefoxProfileMigrator.prototype._getRes
             let buildID = Services.appinfo.platformBuildID;
             let mstone = Services.appinfo.platformVersion;
             // Force the browser to one-off resume the session that we give it:
             Services.prefs.setBoolPref("browser.sessionstore.resume_session_once", true);
             // Reset the homepage_override prefs so that the browser doesn't override our
             // session with the "what's new" page:
             Services.prefs.setCharPref("browser.startup.homepage_override.mstone", mstone);
             Services.prefs.setCharPref("browser.startup.homepage_override.buildID", buildID);
-            // It's too early in startup for the pref service to have a profile directory,
-            // so we have to manually tell it where to save the prefs file.
-            let newPrefsFile = currentProfileDir.clone();
-            newPrefsFile.append("prefs.js");
-            Services.prefs.savePrefFile(newPrefsFile);
+            savePrefs();
             aCallback(true);
           }, function() {
             aCallback(false);
           });
         }
       };
     }
   }
 
+  // Sync/FxA related data
+  let sync = {
+    name: "sync", // name is used only by tests.
+    type: types.OTHERDATA,
+    migrate: async aCallback => {
+        // Try and parse a signedInUser.json file from the source directory and
+        // if we can, copy it to the new profile and set sync's username pref
+        // (which acts as a de-facto flag to indicate if sync is configured)
+      try {
+        let oldPath = OS.Path.join(sourceProfileDir.path, "signedInUser.json");
+        let exists = await OS.File.exists(oldPath);
+        if (exists) {
+          let raw = await OS.File.read(oldPath, {encoding: "utf-8"});
+          let data = JSON.parse(raw);
+          if (data && data.accountData && data.accountData.email) {
+            let username = data.accountData.email;
+            // Write it to prefs.js and flush the file.
+            Services.prefs.setStringPref("services.sync.username", username);
+            savePrefs();
+            // and copy the file itself.
+            await OS.File.copy(oldPath, OS.Path.join(currentProfileDir.path, "signedInUser.json"));
+          }
+        }
+      } catch (ex) {
+        aCallback(false);
+        return;
+      }
+      aCallback(true);
+    }
+  };
+
   // Telemetry related migrations.
   let times = {
     name: "times", // name is used only by tests.
     type: types.OTHERDATA,
     migrate: aCallback => {
       let file = this._getFileObject(sourceProfileDir, "times.json");
       if (file) {
         file.copyTo(currentProfileDir, "");
@@ -247,17 +282,17 @@ FirefoxProfileMigrator.prototype._getRes
         }
       }
 
       aCallback(true);
     }
   };
 
   return [places, cookies, passwords, formData, dictionary, bookmarksBackups,
-          session, times, telemetry, favicons].filter(r => r);
+          session, sync, times, telemetry, favicons].filter(r => r);
 };
 
 Object.defineProperty(FirefoxProfileMigrator.prototype, "startupOnlyMigrator", {
   get: () => true
 });
 
 
 FirefoxProfileMigrator.prototype.classDescription = "Firefox Profile Migrator";
--- a/browser/components/migration/tests/marionette/test_refresh_firefox.py
+++ b/browser/components/migration/tests/marionette/test_refresh_firefox.py
@@ -166,32 +166,44 @@ class TestFirefoxRefresh(MarionetteTestC
           let allTabs = Array.from(gBrowser.tabs);
           for (let tab of allTabs) {
             if (!expectedTabs.has(tab)) {
               gBrowser.removeTab(tab);
             }
           }
         """, script_args=(self._expectedURLs,))
 
+    def createSync(self):
+        # This script will write an entry to the login manager and create
+        # a signedInUser.json in the profile dir.
+        self.runAsyncCode("""
+          Cu.import("resource://gre/modules/FxAccountsStorage.jsm");
+          let storage = new FxAccountsStorageManager();
+          let data = {email: "test@test.com", uid: "uid", keyFetchToken: "top-secret"};
+          storage.initialize(data);
+          storage.finalize().then(marionetteScriptFinished);
+        """);
+
     def checkPassword(self):
         loginInfo = self.marionette.execute_script("""
           let ary = Services.logins.findLogins({},
             "test.marionette.mozilla.com",
             "http://test.marionette.mozilla.com/some/form/",
             null, {});
           return ary.length ? ary : {username: "null", password: "null"};
         """)
         self.assertEqual(len(loginInfo), 1)
         self.assertEqual(loginInfo[0]['username'], self._username)
         self.assertEqual(loginInfo[0]['password'], self._password)
 
         loginCount = self.marionette.execute_script("""
           return Services.logins.getAllLogins().length;
         """)
-        self.assertEqual(loginCount, 1, "No other logins are present")
+        # Note that we expect 2 logins - one from us, one from sync.
+        self.assertEqual(loginCount, 2, "No other logins are present")
 
     def checkBookmark(self):
         titleInBookmarks = self.marionette.execute_script("""
           let url = arguments[0];
           let bookmarkIds = PlacesUtils.bookmarks.getBookmarkIdsForURI(makeURI(url), {}, {});
           return bookmarkIds.length == 1 ? PlacesUtils.bookmarks.getItemTitle(bookmarkIds[0]) : "";
         """, script_args=(self._bookmarkURL,))
         self.assertEqual(titleInBookmarks, self._bookmarkText)
@@ -331,34 +343,64 @@ class TestFirefoxRefresh(MarionetteTestC
               }, { once: true });
             }
           };
 
           mm.loadFrameScript("data:application/javascript,(" + fs.toString() + ")()", true);
         """)
         self.assertSequenceEqual(tabURIs, self._expectedURLs)
 
+    def checkSync(self, hasMigrated):
+        result = self.runAsyncCode("""
+          Cu.import("resource://gre/modules/FxAccountsStorage.jsm");
+          let prefs = new global.Preferences("services.sync.");
+          let storage = new FxAccountsStorageManager();
+          let result = {};
+          storage.initialize();
+          storage.getAccountData().then(data => {
+            result.accountData = data;
+            return storage.finalize();
+          }).then(() => {
+            result.prefUsername = prefs.get("username");
+            marionetteScriptFinished(result);
+          }).catch(err => {
+            marionetteScriptFinished(err.toString());
+          });
+        """);
+        if type(result) != dict:
+            self.fail(result)
+            return
+        self.assertEqual(result["accountData"]["email"], "test@test.com");
+        self.assertEqual(result["accountData"]["uid"], "uid");
+        self.assertEqual(result["accountData"]["keyFetchToken"], "top-secret");
+        if hasMigrated:
+          # This test doesn't actually configure sync itself, so the username
+          # pref only exists after migration.
+          self.assertEqual(result["prefUsername"], "test@test.com");
+
     def checkProfile(self, hasMigrated=False):
         self.checkPassword()
         self.checkBookmark()
         self.checkHistory()
         self.checkFormHistory()
         self.checkFormAutofill()
         self.checkCookie()
+        self.checkSync(hasMigrated);
         if hasMigrated:
             self.checkSession()
 
     def createProfileData(self):
         self.savePassword()
         self.createBookmark()
         self.createHistory()
         self.createFormHistory()
         self.createFormAutofill()
         self.createCookie()
         self.createSession()
+        self.createSync()
 
     def setUpScriptData(self):
         self.marionette.set_context(self.marionette.CONTEXT_CHROME)
         self.runCode("""
           window.global = {};
           global.LoginInfo = Components.Constructor("@mozilla.org/login-manager/loginInfo;1", "nsILoginInfo", "init");
           global.profSvc = Cc["@mozilla.org/toolkit/profile-service;1"].getService(Ci.nsIToolkitProfileService);
           global.Preferences = Cu.import("resource://gre/modules/Preferences.jsm", {}).Preferences;
--- a/browser/components/newtab/aboutNewTabService.js
+++ b/browser/components/newtab/aboutNewTabService.js
@@ -12,26 +12,30 @@ Cu.import("resource://gre/modules/XPCOMU
 Cu.import("resource://gre/modules/Services.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";
+
 const ABOUT_URL = "about:newtab";
 
 const IS_MAIN_PROCESS = Services.appinfo.processType === Services.appinfo.PROCESS_TYPE_DEFAULT;
 
 // 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";
 
 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);
   this.toggleActivityStream();
   if (IS_MAIN_PROCESS) {
     AboutNewTab.init();
   }
 }
 
 /*
  * A service that allows for the overriding, at runtime, of the newtab page's url.
@@ -66,37 +70,44 @@ function AboutNewTabService() {
  * Loading a chrome resource, or an about: URL in the redirector with either the
  * 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: true,
   _overridden: false,
 
   classID: Components.ID("{dfcd2adc-7867-4d3a-ba70-17501f208142}"),
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsIAboutNewTabService,
     Ci.nsIObserver
   ]),
   _xpcom_categories: [{
     service: true
   }],
 
   observe(subject, topic, data) {
     switch (topic) {
       case "nsPref:changed":
-        if (this.toggleActivityStream()) {
+        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);
         }
         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);
         if (IS_MAIN_PROCESS) {
           AboutNewTab.uninit();
         }
         break;
     }
   },
 
   /**
@@ -134,17 +145,17 @@ AboutNewTabService.prototype = {
    *
    * 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.activityStreamURL;
+      return this.activityStreamPrerender ? this.activityStreamPrerenderURL : this.activityStreamURL;
     }
     return LOCAL_NEWTAB_URL;
   },
 
   get newTabURL() {
     return this._newTabURL;
   },
 
@@ -167,20 +178,28 @@ AboutNewTabService.prototype = {
   get overridden() {
     return this._overridden;
   },
 
   get activityStreamEnabled() {
     return this._activityStreamEnabled;
   },
 
+  get activityStreamPrerender() {
+    return this._activityStreamPrerender;
+  },
+
   get activityStreamURL() {
     return ACTIVITY_STREAM_URL;
   },
 
+  get activityStreamPrerenderURL() {
+    return ACTIVITY_STREAM_PRERENDER_URL;
+  },
+
   resetNewTabURL() {
     this._overridden = false;
     this._newTabURL = ABOUT_URL;
     this.toggleActivityStream(undefined, true);
     Services.obs.notifyObservers(null, "newtab-url-changed", this._newTabURL);
   }
 };
 
--- a/browser/components/newtab/nsIAboutNewTabService.idl
+++ b/browser/components/newtab/nsIAboutNewTabService.idl
@@ -30,18 +30,28 @@ interface nsIAboutNewTabService : nsISup
 
   /**
    * Returns true if the default resource is activity stream and isn't
    * overridden
    */
   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
    */
   readonly attribute ACString activityStreamURL;
 
   /**
+   * Returns the prerendered activity stream resource URL for the newtab page
+   */
+  readonly attribute ACString activityStreamPrerenderURL;
+
+  /**
    * 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
@@ -3,38 +3,41 @@
  */
 
 "use strict";
 
 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 DEFAULT_HREF = aboutNewTabService.activityStreamURL;
+const ACTIVITY_STREAM_PRERENDER_URL = aboutNewTabService.activityStreamPrerenderURL;
+
 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";
 
 function cleanup() {
-  Services.prefs.setBoolPref("browser.newtabpage.activity-stream.enabled", false);
+  Services.prefs.clearUserPref(ACTIVITY_STREAM_PREF);
+  Services.prefs.clearUserPref(ACTIVITY_STREAM_PRERENDER_PREF);
   aboutNewTabService.resetNewTabURL();
 }
 
 do_register_cleanup(cleanup);
 
 /**
  * Test the overriding of the default URL
  */
 add_task(async function test_override_activity_stream_disabled() {
   let notificationPromise;
-  Services.prefs.setBoolPref("browser.newtabpage.activity-stream.enabled", false);
+  Services.prefs.setBoolPref(ACTIVITY_STREAM_PREF, false);
 
   // tests default is the local newtab resource
   Assert.equal(aboutNewTabService.defaultURL, DEFAULT_CHROME_URL,
                `Default newtab URL should be ${DEFAULT_CHROME_URL}`);
 
   // override with some remote URL
   let url = "http://example.com/";
   notificationPromise = nextChangeNotificationPromise(url);
@@ -57,65 +60,81 @@ add_task(async function test_override_ac
   await notificationPromise;
   Assert.ok(aboutNewTabService.overridden, "Newtab URL should be overridden");
   Assert.equal(aboutNewTabService.newTabURL, DOWNLOADS_URL, "Newtab URL should be the custom URL");
 
   cleanup();
 });
 
 add_task(async function test_override_activity_stream_enabled() {
-  let notificationPromise;
-  // change newtab page to activity stream
-  notificationPromise = nextChangeNotificationPromise("about:newtab");
-  Services.prefs.setBoolPref("browser.newtabpage.activity-stream.enabled", true);
-  await notificationPromise;
-  let activityStreamURL = aboutNewTabService.activityStreamURL;
-  Assert.equal(aboutNewTabService.defaultURL, activityStreamURL, "Newtab URL should be the default activity stream URL");
+  let notificationPromise = await setupASPrerendered();
+
+  Assert.equal(aboutNewTabService.defaultURL, ACTIVITY_STREAM_PRERENDER_URL, "Newtab URL should be the default activity stream prerendered URL");
   Assert.ok(!aboutNewTabService.overridden, "Newtab URL should not be overridden");
   Assert.ok(aboutNewTabService.activityStreamEnabled, "Activity Stream should be enabled");
+  Assert.ok(aboutNewTabService.activityStreamPrerender, "Activity Stream should be prerendered");
 
   // change to local newtab page while activity stream is enabled
   notificationPromise = nextChangeNotificationPromise(DEFAULT_CHROME_URL);
   aboutNewTabService.newTabURL = DEFAULT_CHROME_URL;
   await notificationPromise;
   Assert.equal(aboutNewTabService.newTabURL, DEFAULT_CHROME_URL,
                "Newtab URL set to chrome url");
   Assert.equal(aboutNewTabService.defaultURL, DEFAULT_CHROME_URL,
                "Newtab URL defaultURL set to the default chrome URL");
   Assert.ok(aboutNewTabService.overridden, "Newtab URL should be overridden");
   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");
+
+  // 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 notificationPromise;
+
+  Assert.equal(aboutNewTabService.defaultURL, aboutNewTabService.activityStreamURL,
+               "Newtab defaultURL set to un-prerendered AS url after the pref has been changed");
+
+  cleanup();
+});
+
 /**
  * Tests reponse to updates to prefs
  */
 add_task(async function test_updates() {
   /*
    * Simulates a "cold-boot" situation, with some pref already set before testing a series
    * of changes.
    */
-  Preferences.set("browser.newtabpage.activity-stream.enabled", true);
+  await setupASPrerendered();
+
   aboutNewTabService.resetNewTabURL(); // need to set manually because pref notifs are off
   let notificationPromise;
 
   // test update fires on override and reset
   let testURL = "https://example.com/";
   notificationPromise = nextChangeNotificationPromise(
     testURL, "a notification occurs on override");
   aboutNewTabService.newTabURL = testURL;
   await notificationPromise;
 
   // from overridden to default
   notificationPromise = nextChangeNotificationPromise(
     "about:newtab", "a notification occurs on reset");
   aboutNewTabService.resetNewTabURL();
   Assert.ok(aboutNewTabService.activityStreamEnabled, "Activity Stream should be enabled");
-  Assert.equal(aboutNewTabService.defaultURL, DEFAULT_HREF, "Default URL should be the activity stream page");
+  Assert.equal(aboutNewTabService.defaultURL, ACTIVITY_STREAM_PRERENDER_URL, "Default URL should be the activity stream page");
   await notificationPromise;
 
   // reset twice, only one notification for default URL
   notificationPromise = nextChangeNotificationPromise(
     "about:newtab", "reset occurs");
   aboutNewTabService.resetNewTabURL();
   await notificationPromise;
 
@@ -126,8 +145,22 @@ function nextChangeNotificationPromise(a
   return new Promise(resolve => {
     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 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
+  notificationPromise = nextChangeNotificationPromise("about:newtab");
+  Services.prefs.setBoolPref(ACTIVITY_STREAM_PREF, true);
+  Services.prefs.setBoolPref(ACTIVITY_STREAM_PRERENDER_PREF, true);
+  return notificationPromise;
+}
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -1682,17 +1682,17 @@ BrowserGlue.prototype = {
         return;
       this._openPreferences("sync", { origin: "doorhanger" });
     }
     this.AlertsService.showAlertNotification(null, title, body, true, null, clickCallback);
   },
 
   // eslint-disable-next-line complexity
   _migrateUI: function BG__migrateUI() {
-    const UI_VERSION = 53;
+    const UI_VERSION = 54;
     const BROWSER_DOCURL = "chrome://browser/content/browser.xul";
 
     let currentUIVersion;
     if (Services.prefs.prefHasUserValue("browser.migration.version")) {
       currentUIVersion = Services.prefs.getIntPref("browser.migration.version");
     } else {
       // This is a new profile, nothing to migrate.
       Services.prefs.setIntPref("browser.migration.version", UI_VERSION);
@@ -2073,16 +2073,25 @@ BrowserGlue.prototype = {
         let malwareList = Services.prefs.getCharPref(MALWARE_PREF);
         if (malwareList.indexOf("goog-malware-shavar") != -1) {
           malwareList.replace("goog-malware-shavar", "goog-malware-proto");
           Services.prefs.setCharPref(MALWARE_PREF, malwareList);
         }
       }
     }
 
+    if (currentUIVersion < 54) {
+      // Migrate browser.onboarding.hidden to browser.onboarding.state.
+      if (Services.prefs.prefHasUserValue("browser.onboarding.hidden")) {
+        let state = Services.prefs.getBoolPref("browser.onboarding.hidden") ? "watermark" : "default";
+        Services.prefs.setStringPref("browser.onboarding.state", state);
+        Services.prefs.clearUserPref("browser.onboarding.hidden");
+      }
+    }
+
     // Update the migration version.
     Services.prefs.setIntPref("browser.migration.version", UI_VERSION);
   },
 
   _checkForDefaultBrowser() {
     // Perform default browser checking.
     if (!ShellService) {
       return;
--- a/browser/components/preferences/in-content/findInPage.js
+++ b/browser/components/preferences/in-content/findInPage.js
@@ -34,32 +34,30 @@ var gSearchResultsPane = {
 
   handleEvent(event) {
     // Ensure categories are initialized if idle callback didn't run sooo enough.
     this.initializeCategories();
     this.searchFunction(event);
   },
 
   /**
-   * Check that the passed string matches the filter arguments.
+   * Check that the text content contains the query string.
    *
-   * @param String str
-   *    to search for filter words in.
-   * @param String filter
-   *    is a string containing all of the words to filter on.
+   * @param String content
+   *    the text content to be searched
+   * @param String query
+   *    the query string
    * @returns boolean
-   *    true when match in string else false
+   *    true when the text content contains the query string else false
    */
-  stringMatchesFilters(str, filter) {
-    if (!filter || !str) {
+  queryMatchesContent(content, query) {
+    if (!content || !query) {
       return false;
     }
-    let searchStr = str.toLowerCase();
-    let filterStrings = filter.toLowerCase().split(/\s+/);
-    return !filterStrings.some(f => searchStr.indexOf(f) == -1);
+    return content.toLowerCase().includes(query.toLowerCase());
   },
 
   categoriesInitialized: false,
 
   /**
    * Will attempt to initialize all uninitialized categories
    */
   initializeCategories() {
@@ -345,17 +343,16 @@ var gSearchResultsPane = {
    */
   searchWithinNode(nodeObject, searchPhrase) {
     let matchesFound = false;
     if (nodeObject.childElementCount == 0 ||
         nodeObject.tagName == "label" ||
         nodeObject.tagName == "description" ||
         nodeObject.tagName == "menulist") {
       let simpleTextNodes = this.textNodeDescendants(nodeObject);
-
       for (let node of simpleTextNodes) {
         let result = this.highlightMatches([node], [node.length], node.textContent.toLowerCase(), searchPhrase);
         matchesFound = matchesFound || result;
       }
 
       // Collecting data from boxObject / label / description
       let nodeSizes = [];
       let allNodeText = "";
@@ -371,25 +368,25 @@ var gSearchResultsPane = {
         allNodeText += node.textContent;
         nodeSizes.push(runningSize);
       }
 
       // Access key are presented
       let complexTextNodesResult = this.highlightMatches(accessKeyTextNodes, nodeSizes, allNodeText.toLowerCase(), searchPhrase);
 
       // Searching some elements, such as xul:button, have a 'label' attribute that contains the user-visible text.
-      let labelResult = this.stringMatchesFilters(nodeObject.getAttribute("label"), searchPhrase);
+      let labelResult = this.queryMatchesContent(nodeObject.getAttribute("label"), searchPhrase);
 
       // Searching some elements, such as xul:label, store their user-visible text in a "value" attribute.
       // Value will be skipped for menuitem since value in menuitem could represent index number to distinct each item.
       let valueResult = nodeObject.tagName !== "menuitem" ?
-       this.stringMatchesFilters(nodeObject.getAttribute("value"), searchPhrase) : false;
+        this.queryMatchesContent(nodeObject.getAttribute("value"), searchPhrase) : false;
 
       // Searching some elements, such as xul:button, buttons to open subdialogs.
-      let keywordsResult = this.stringMatchesFilters(nodeObject.getAttribute("searchkeywords"), searchPhrase);
+      let keywordsResult = this.queryMatchesContent(nodeObject.getAttribute("searchkeywords"), searchPhrase);
 
       // Creating tooltips for buttons
       if (keywordsResult && (nodeObject.tagName === "button" || nodeObject.tagName == "menulist")) {
         this.listSearchTooltips.add(nodeObject);
       }
 
       if (keywordsResult && nodeObject.tagName === "menuitem") {
         nodeObject.setAttribute("indicator", "true");
--- a/browser/components/preferences/in-content/main.xul
+++ b/browser/components/preferences/in-content/main.xul
@@ -576,16 +576,17 @@
                                 &overrideDefaultPageColors.always.label;
                                 &overrideDefaultPageColors.auto.label;
                                 &overrideDefaultPageColors.never.label;
                                 &color;
                                 &textColor2.label;
                                 &backgroundColor2.label;
                                 &useSystemColors.label;
                                 &underlineLinks.label;
+                                &links;
                                 &linkColor2.label;
                                 &visitedLinkColor2.label;"/>
       </hbox>
     </hbox>
   </vbox>
 </groupbox>
 
 <!-- Languages -->
--- a/browser/components/preferences/in-content/preferences.js
+++ b/browser/components/preferences/in-content/preferences.js
@@ -151,16 +151,17 @@ function gotoPref(aCategory) {
   // Subcategories allow for selecting smaller sections of the preferences
   // until proper search support is enabled (bug 1353954).
   let subcategory = breakIndex != -1 && category.substring(breakIndex + 1);
   if (subcategory) {
     category = category.substring(0, breakIndex);
   }
   category = friendlyPrefCategoryNameToInternalName(category);
   if (category != "paneSearchResults") {
+    gSearchResultsPane.query = null;
     gSearchResultsPane.searchInput.value = "";
     gSearchResultsPane.getFindSelection(window).removeAllRanges();
     gSearchResultsPane.removeAllSearchTooltips();
     gSearchResultsPane.removeAllSearchMenuitemIndicators();
   } else if (!gSearchResultsPane.searchInput.value) {
     // Something tried to send us to the search results pane without
     // a query string. Default to the General pane instead.
     category = kDefaultCategoryInternalName;
--- a/browser/components/preferences/in-content/privacy.js
+++ b/browser/components/preferences/in-content/privacy.js
@@ -254,17 +254,17 @@ var gPrivacyPane = {
     setEventListener("submitHealthReportBox", "command",
       gPrivacyPane.updateSubmitHealthReport);
     this._initA11yState();
     let bundlePrefs = document.getElementById("bundlePreferences");
     let signonBundle = document.getElementById("signonBundle");
     let pkiBundle = document.getElementById("pkiBundle");
     appendSearchKeywords("passwordExceptions", [
       bundlePrefs.getString("savedLoginsExceptions_title"),
-      bundlePrefs.getString("savedLoginsExceptions_desc2"),
+      bundlePrefs.getString("savedLoginsExceptions_desc3"),
     ]);
     appendSearchKeywords("showPasswords", [
       signonBundle.getString("loginsDescriptionAll2"),
     ]);
     appendSearchKeywords("cookieExceptions", [
       bundlePrefs.getString("cookiepermissionstext"),
     ]);
     appendSearchKeywords("showCookiesButton", [
@@ -954,17 +954,17 @@ var gPrivacyPane = {
     var params = {
       blockVisible: true,
       sessionVisible: false,
       allowVisible: false,
       hideStatusColumn: true,
       prefilledHost: "",
       permissionType: "login-saving",
       windowTitle: bundlePrefs.getString("savedLoginsExceptions_title"),
-      introText: bundlePrefs.getString("savedLoginsExceptions_desc2")
+      introText: bundlePrefs.getString("savedLoginsExceptions_desc3")
     };
 
     gSubDialog.open("chrome://browser/content/preferences/permissions.xul",
       null, params);
   },
 
   /**
    * Initializes master password UI: the "use master password" checkbox, selects
--- a/browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_4.js
+++ b/browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_4.js
@@ -16,11 +16,11 @@ add_task(async function() {
   await BrowserTestUtils.removeTab(gBrowser.selectedTab);
 });
 
 /**
  * Test for searching for the "Location Permissions" subdialog.
  */
 add_task(async function() {
   await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
-  await evaluateSearchResults("set location permissions", "permissionsGroup");
+  await evaluateSearchResults("location permissions", "permissionsGroup");
   await BrowserTestUtils.removeTab(gBrowser.selectedTab);
 });
--- a/browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_8.js
+++ b/browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_8.js
@@ -9,29 +9,29 @@ add_task(async function() {
   await SpecialPowers.pushPrefEnv({"set": [["browser.preferences.search", true]]});
 });
 
 /**
  * Test for searching for the "Camera Permissions" subdialog.
  */
 add_task(async function() {
   await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
-  await evaluateSearchResults("set camera permissions", "permissionsGroup");
+  await evaluateSearchResults("camera permissions", "permissionsGroup");
   await BrowserTestUtils.removeTab(gBrowser.selectedTab);
 });
 
 /**
  * Test for searching for the "Microphone Permissions" subdialog.
  */
 add_task(async function() {
   await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
-  await evaluateSearchResults("set microphone permissions", "permissionsGroup");
+  await evaluateSearchResults("microphone permissions", "permissionsGroup");
   await BrowserTestUtils.removeTab(gBrowser.selectedTab);
 });
 
 /**
  * Test for searching for the "Notification Permissions" subdialog.
  */
 add_task(async function() {
   await openPreferencesViaOpenPreferencesAPI("paneGeneral", {leaveOpen: true});
-  await evaluateSearchResults("set notifications permissions", "permissionsGroup");
+  await evaluateSearchResults("notification permissions", "permissionsGroup");
   await BrowserTestUtils.removeTab(gBrowser.selectedTab);
 });
--- a/browser/extensions/activity-stream/common/Actions.jsm
+++ b/browser/extensions/activity-stream/common/Actions.jsm
@@ -34,16 +34,17 @@ for (const type of [
   "INIT",
   "LOCALE_UPDATED",
   "MIGRATION_CANCEL",
   "MIGRATION_COMPLETED",
   "MIGRATION_START",
   "NEW_TAB_INIT",
   "NEW_TAB_INITIAL_STATE",
   "NEW_TAB_LOAD",
+  "NEW_TAB_REHYDRATED",
   "NEW_TAB_STATE_REQUEST",
   "NEW_TAB_UNLOAD",
   "OPEN_LINK",
   "OPEN_NEW_WINDOW",
   "OPEN_PRIVATE_WINDOW",
   "PINNED_SITES_UPDATED",
   "PLACES_BOOKMARK_ADDED",
   "PLACES_BOOKMARK_CHANGED",
@@ -56,16 +57,17 @@ for (const type of [
   "SAVE_SESSION_PERF_DATA",
   "SAVE_TO_POCKET",
   "SCREENSHOT_UPDATED",
   "SECTION_DEREGISTER",
   "SECTION_DISABLE",
   "SECTION_ENABLE",
   "SECTION_REGISTER",
   "SECTION_UPDATE",
+  "SECTION_UPDATE_CARD",
   "SET_PREF",
   "SHOW_FIREFOX_ACCOUNTS",
   "SNIPPETS_DATA",
   "SNIPPETS_RESET",
   "SYSTEM_TICK",
   "TELEMETRY_IMPRESSION_STATS",
   "TELEMETRY_PERFORMANCE_EVENT",
   "TELEMETRY_UNDESIRED_EVENT",
--- a/browser/extensions/activity-stream/common/PerfService.jsm
+++ b/browser/extensions/activity-stream/common/PerfService.jsm
@@ -1,13 +1,15 @@
 /* globals Services */
 "use strict";
 
 /* istanbul ignore if */
-if (typeof Components !== "undefined" && Components.utils) {
+// Note: normally we would just feature detect Components.utils here, but
+// unfortunately that throws an ugly warning in content if we do.
+if (typeof Window === "undefined" && typeof Components !== "undefined" && Components.utils) {
   Components.utils.import("resource://gre/modules/Services.jsm");
 }
 
 let usablePerfObj;
 
 /* istanbul ignore if */
 /* istanbul ignore else */
 if (typeof Services !== "undefined") {
--- a/browser/extensions/activity-stream/common/PrerenderData.jsm
+++ b/browser/extensions/activity-stream/common/PrerenderData.jsm
@@ -1,42 +1,91 @@
-const prefConfig = {
-  // Prefs listed with "invalidates: true" will prevent the prerendered version
+class _PrerenderData {
+  constructor(options) {
+    this.initialPrefs = options.initialPrefs;
+    this.initialSections = options.initialSections;
+    this._setValidation(options.validation);
+  }
+
+  get validation() {
+    return this._validation;
+  }
+
+  set validation(value) {
+    this._setValidation(value);
+  }
+
+  get invalidatingPrefs() {
+    return this._invalidatingPrefs;
+  }
+
+    // This is needed so we can use it in the constructor
+  _setValidation(value = []) {
+    this._validation = value;
+    this._invalidatingPrefs = value.reduce((result, next) => {
+      if (typeof next === "string") {
+        result.push(next);
+        return result;
+      } else if (next && next.oneOf) {
+        return result.concat(next.oneOf);
+      }
+      throw new Error("Your validation configuration is not properly configured");
+    }, []);
+  }
+
+  arePrefsValid(getPref) {
+    for (const prefs of this.validation) {
+      // {oneOf: ["foo", "bar"]}
+      if (prefs && prefs.oneOf && !prefs.oneOf.some(name => getPref(name) === this.initialPrefs[name])) {
+        return false;
+
+      // "foo"
+      } else if (getPref(prefs) !== this.initialPrefs[prefs]) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+
+this.PrerenderData = new _PrerenderData({
+  initialPrefs: {
+    "migrationExpired": true,
+    "showTopSites": true,
+    "showSearch": true,
+    "topSitesCount": 6,
+    "feeds.section.topstories": true,
+    "feeds.section.highlights": true
+  },
+  // Prefs listed as invalidating will prevent the prerendered version
   // of AS from being used if their value is something other than what is listed
   // here. This is required because some preferences cause the page layout to be
   // too different for the prerendered version to be used. Unfortunately, this
   // will result in users who have modified some of their preferences not being
   // able to get the benefits of prerendering.
-  "migrationExpired": {value: true},
-  "showTopSites": {
-    value: true,
-    invalidates: true
-  },
-  "showSearch": {
-    value: true,
-    invalidates: true
-  },
-  "topSitesCount": {value: 6},
-  "feeds.section.topstories": {
-    value: true,
-    invalidates: true
-  }
-};
-
-this.PrerenderData = {
-  invalidatingPrefs: Object.keys(prefConfig).filter(key => prefConfig[key].invalidates),
-  initialPrefs: Object.keys(prefConfig).reduce((obj, key) => {
-    obj[key] = prefConfig[key].value;
-    return obj;
-  }, {}), // This creates an object of the form {prefName: value}
+  validation: [
+    "showTopSites",
+    "showSearch",
+    // This means if either of these are set to their default values,
+    // prerendering can be used.
+    {oneOf: ["feeds.section.topstories", "feeds.section.highlights"]}
+  ],
   initialSections: [
     {
       enabled: true,
       icon: "pocket",
       id: "topstories",
       order: 1,
       title: {id: "header_recommended_by", values: {provider: "Pocket"}},
       topics: [{}]
+    },
+    {
+      enabled: true,
+      id: "highlights",
+      icon: "highlights",
+      order: 2,
+      title: {id: "header_highlights"}
     }
   ]
-};
+});
 
-this.EXPORTED_SYMBOLS = ["PrerenderData"];
+this._PrerenderData = _PrerenderData;
+this.EXPORTED_SYMBOLS = ["PrerenderData", "_PrerenderData"];
--- a/browser/extensions/activity-stream/common/Reducers.jsm
+++ b/browser/extensions/activity-stream/common/Reducers.jsm
@@ -228,16 +228,29 @@ function Sections(prevState = INITIAL_ST
         if (section && section.id === action.data.id) {
           // If the action is updating rows, we should consider initialized to be true.
           // This can be overridden if initialized is defined in the action.data
           const initialized = action.data.rows ? {initialized: true} : {};
           return Object.assign({}, section, initialized, action.data);
         }
         return section;
       });
+    case at.SECTION_UPDATE_CARD:
+      return prevState.map(section => {
+        if (section && section.id === action.data.id && section.rows) {
+          const newRows = section.rows.map(card => {
+            if (card.url === action.data.url) {
+              return Object.assign({}, card, action.data.options);
+            }
+            return card;
+          });
+          return Object.assign({}, section, {rows: newRows});
+        }
+        return section;
+      });
     case at.PLACES_BOOKMARK_ADDED:
       if (!action.data) {
         return prevState;
       }
       return prevState.map(section => Object.assign({}, section, {
         rows: section.rows.map(item => {
           // find the item within the rows that is attempted to be bookmarked
           if (item.url === action.data.url) {
--- a/browser/extensions/activity-stream/data/content/activity-stream-initial-state.js
+++ b/browser/extensions/activity-stream/data/content/activity-stream-initial-state.js
@@ -108,17 +108,18 @@
   },
   "Prefs": {
     "initialized": true,
     "values": {
       "migrationExpired": true,
       "showTopSites": true,
       "showSearch": true,
       "topSitesCount": 6,
-      "feeds.section.topstories": true
+      "feeds.section.topstories": true,
+      "feeds.section.highlights": true
     }
   },
   "Dialog": {
     "visible": false,
     "data": {}
   },
   "Sections": [
     {
@@ -132,11 +133,22 @@
       "order": 1,
       "enabled": true,
       "icon": "pocket",
       "id": "topstories",
       "topics": [
         {}
       ],
       "initialized": false
+    },
+    {
+      "title": {
+        "id": "header_highlights"
+      },
+      "rows": [],
+      "order": 2,
+      "enabled": true,
+      "id": "highlights",
+      "icon": "highlights",
+      "initialized": false
     }
   ]
 };
--- 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" data-reactroot="" data-reactid="1" data-react-checksum="57168132"><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><section class="top-sites" data-reactid="11"><h3 class="section-title" data-reactid="12"><span class="icon icon-small-spacer icon-topsites" data-reactid="13"></span><span data-reactid="14"> </span></h3><ul class="top-sites-list" data-reactid="15"><li class="top-site-outer placeholder" data-reactid="16"><a data-reactid="17"><div class="tile" aria-hidden="true" data-reactid="18"><span class="letter-fallback" data-reactid="19"></span><div class="screenshot" style="background-image:none;" data-reactid="20"></div></div><div class="title " data-reactid="21"><span dir="auto" data-reactid="22"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="23"><a data-reactid="24"><div class="tile" aria-hidden="true" data-reactid="25"><span class="letter-fallback" data-reactid="26"></span><div class="screenshot" style="background-image:none;" data-reactid="27"></div></div><div class="title " data-reactid="28"><span dir="auto" data-reactid="29"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="30"><a data-reactid="31"><div class="tile" aria-hidden="true" data-reactid="32"><span class="letter-fallback" data-reactid="33"></span><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><span class="letter-fallback" data-reactid="40"></span><div class="screenshot" style="background-image:none;" data-reactid="41"></div></div><div class="title " data-reactid="42"><span dir="auto" data-reactid="43"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="44"><a data-reactid="45"><div class="tile" aria-hidden="true" data-reactid="46"><span class="letter-fallback" data-reactid="47"></span><div class="screenshot" style="background-image:none;" data-reactid="48"></div></div><div class="title " data-reactid="49"><span dir="auto" data-reactid="50"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="51"><a data-reactid="52"><div class="tile" aria-hidden="true" data-reactid="53"><span class="letter-fallback" data-reactid="54"></span><div class="screenshot" style="background-image:none;" data-reactid="55"></div></div><div class="title " data-reactid="56"><span dir="auto" data-reactid="57"></span></div></a></li></ul></section><div class="sections-list" data-reactid="58"><section data-reactid="59"><div class="section-top-bar" data-reactid="60"><h3 class="section-title" data-reactid="61"><span class="icon icon-small-spacer icon-pocket" data-reactid="62"></span><span data-reactid="63"> </span></h3></div><ul class="section-list" style="padding:0;" data-reactid="64"><li class="card-outer placeholder" data-reactid="65"><a data-reactid="66"><div class="card" data-reactid="67"><div class="card-details no-image" data-reactid="68"><div class="card-text no-image no-host-name no-context" data-reactid="69"><h4 class="card-title" dir="auto" data-reactid="70"></h4><p class="card-description" dir="auto" data-reactid="71"></p></div></div></div></a></li><li class="card-outer placeholder" data-reactid="72"><a data-reactid="73"><div class="card" data-reactid="74"><div class="card-details no-image" data-reactid="75"><div class="card-text no-image no-host-name no-context" data-reactid="76"><h4 class="card-title" dir="auto" data-reactid="77"></h4><p class="card-description" dir="auto" data-reactid="78"></p></div></div></div></a></li><li class="card-outer placeholder" data-reactid="79"><a data-reactid="80"><div class="card" data-reactid="81"><div class="card-details no-image" data-reactid="82"><div class="card-text no-image no-host-name no-context" data-reactid="83"><h4 class="card-title" dir="auto" data-reactid="84"></h4><p class="card-description" dir="auto" data-reactid="85"></p></div></div></div></a></li></ul><div class="topic" data-reactid="86"><span data-reactid="87"><span data-reactid="88"> </span></span><ul data-reactid="89"><li data-reactid="90"><a class="topic-link" data-reactid="91"></a></li></ul></div></section></div><!-- react-empty: 92 --></main></div></div>
+    <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="2126594602"><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><section class="top-sites" data-reactid="11"><h3 class="section-title" data-reactid="12"><span class="icon icon-small-spacer icon-topsites" data-reactid="13"></span><span data-reactid="14"> </span></h3><ul class="top-sites-list" data-reactid="15"><li class="top-site-outer placeholder" data-reactid="16"><a data-reactid="17"><div class="tile" aria-hidden="true" data-reactid="18"><span class="letter-fallback" data-reactid="19"></span><div class="screenshot" style="background-image:none;" data-reactid="20"></div></div><div class="title " data-reactid="21"><span dir="auto" data-reactid="22"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="23"><a data-reactid="24"><div class="tile" aria-hidden="true" data-reactid="25"><span class="letter-fallback" data-reactid="26"></span><div class="screenshot" style="background-image:none;" data-reactid="27"></div></div><div class="title " data-reactid="28"><span dir="auto" data-reactid="29"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="30"><a data-reactid="31"><div class="tile" aria-hidden="true" data-reactid="32"><span class="letter-fallback" data-reactid="33"></span><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><span class="letter-fallback" data-reactid="40"></span><div class="screenshot" style="background-image:none;" data-reactid="41"></div></div><div class="title " data-reactid="42"><span dir="auto" data-reactid="43"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="44"><a data-reactid="45"><div class="tile" aria-hidden="true" data-reactid="46"><span class="letter-fallback" data-reactid="47"></span><div class="screenshot" style="background-image:none;" data-reactid="48"></div></div><div class="title " data-reactid="49"><span dir="auto" data-reactid="50"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="51"><a data-reactid="52"><div class="tile" aria-hidden="true" data-reactid="53"><span class="letter-fallback" data-reactid="54"></span><div class="screenshot" style="background-image:none;" data-reactid="55"></div></div><div class="title " data-reactid="56"><span dir="auto" data-reactid="57"></span></div></a></li></ul></section><div class="sections-list" data-reactid="58"><section data-reactid="59"><div class="section-top-bar" data-reactid="60"><h3 class="section-title" data-reactid="61"><span class="icon icon-small-spacer icon-pocket" data-reactid="62"></span><span data-reactid="63"> </span></h3></div><ul class="section-list" style="padding:0;" data-reactid="64"><li class="card-outer placeholder" data-reactid="65"><a data-reactid="66"><div class="card" data-reactid="67"><div class="card-details no-image" data-reactid="68"><div class="card-text no-image no-host-name no-context" data-reactid="69"><h4 class="card-title" dir="auto" data-reactid="70"></h4><p class="card-description" dir="auto" data-reactid="71"></p></div></div></div></a></li><li class="card-outer placeholder" data-reactid="72"><a data-reactid="73"><div class="card" data-reactid="74"><div class="card-details no-image" data-reactid="75"><div class="card-text no-image no-host-name no-context" data-reactid="76"><h4 class="card-title" dir="auto" data-reactid="77"></h4><p class="card-description" dir="auto" data-reactid="78"></p></div></div></div></a></li><li class="card-outer placeholder" data-reactid="79"><a data-reactid="80"><div class="card" data-reactid="81"><div class="card-details no-image" data-reactid="82"><div class="card-text no-image no-host-name no-context" data-reactid="83"><h4 class="card-title" dir="auto" data-reactid="84"></h4><p class="card-description" dir="auto" data-reactid="85"></p></div></div></div></a></li></ul><div class="topic" data-reactid="86"><span data-reactid="87"><span data-reactid="88"> </span></span><ul data-reactid="89"><li data-reactid="90"><a class="topic-link" data-reactid="91"></a></li></ul></div></section><section data-reactid="92"><div class="section-top-bar" data-reactid="93"><h3 class="section-title" data-reactid="94"><span class="icon icon-small-spacer icon-highlights" data-reactid="95"></span><span data-reactid="96"> </span></h3></div><ul class="section-list" style="padding:0;" data-reactid="97"><li class="card-outer placeholder" data-reactid="98"><a data-reactid="99"><div class="card" data-reactid="100"><div class="card-details no-image" data-reactid="101"><div class="card-text no-image no-host-name no-context" data-reactid="102"><h4 class="card-title" dir="auto" data-reactid="103"></h4><p class="card-description" dir="auto" data-reactid="104"></p></div></div></div></a></li><li class="card-outer placeholder" data-reactid="105"><a data-reactid="106"><div class="card" data-reactid="107"><div class="card-details no-image" data-reactid="108"><div class="card-text no-image no-host-name no-context" data-reactid="109"><h4 class="card-title" dir="auto" data-reactid="110"></h4><p class="card-description" dir="auto" data-reactid="111"></p></div></div></div></a></li><li class="card-outer placeholder" data-reactid="112"><a data-reactid="113"><div class="card" data-reactid="114"><div class="card-details no-image" data-reactid="115"><div class="card-text no-image no-host-name no-context" data-reactid="116"><h4 class="card-title" dir="auto" data-reactid="117"></h4><p class="card-description" dir="auto" data-reactid="118"></p></div></div></div></a></li></ul></section></div><!-- react-empty: 119 --></main></div></div>
     <div id="snippets-container">
       <div id="snippets"></div>
     </div>
 <script src="resource://activity-stream/data/content/activity-stream-initial-state.js"></script>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
     <script src="resource://activity-stream/vendor/react.js"></script>
     <script src="resource://activity-stream/vendor/react-dom.js"></script>
     <script src="resource://activity-stream/vendor/react-intl.js"></script>
--- a/browser/extensions/activity-stream/data/content/activity-stream.bundle.js
+++ b/browser/extensions/activity-stream/data/content/activity-stream.bundle.js
@@ -89,17 +89,17 @@ const globalImportContext = typeof Windo
 
 
 // Create an object that avoids accidental differing key/value pairs:
 // {
 //   INIT: "INIT",
 //   UNINIT: "UNINIT"
 // }
 const actionTypes = {};
-for (const type of ["BLOCK_URL", "BOOKMARK_URL", "DELETE_BOOKMARK_BY_ID", "DELETE_HISTORY_URL", "DELETE_HISTORY_URL_CONFIRM", "DIALOG_CANCEL", "DIALOG_OPEN", "INIT", "LOCALE_UPDATED", "MIGRATION_CANCEL", "MIGRATION_COMPLETED", "MIGRATION_START", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "PINNED_SITES_UPDATED", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_CHANGED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINK_BLOCKED", "PLACES_LINK_DELETED", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_REGISTER", "SECTION_UPDATE", "SET_PREF", "SHOW_FIREFOX_ACCOUNTS", "SNIPPETS_DATA", "SNIPPETS_RESET", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_ADD", "TOP_SITES_PIN", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "UNINIT"]) {
+for (const type of ["BLOCK_URL", "BOOKMARK_URL", "DELETE_BOOKMARK_BY_ID", "DELETE_HISTORY_URL", "DELETE_HISTORY_URL_CONFIRM", "DIALOG_CANCEL", "DIALOG_OPEN", "INIT", "LOCALE_UPDATED", "MIGRATION_CANCEL", "MIGRATION_COMPLETED", "MIGRATION_START", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "PINNED_SITES_UPDATED", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_CHANGED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINK_BLOCKED", "PLACES_LINK_DELETED", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SET_PREF", "SHOW_FIREFOX_ACCOUNTS", "SNIPPETS_DATA", "SNIPPETS_RESET", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_ADD", "TOP_SITES_PIN", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "UNINIT"]) {
   actionTypes[type] = type;
 }
 
 // Helper function for creating routed actions between content and main
 // Not intended to be used by consumers
 function _RouteMessage(action, options) {
   const meta = action.meta ? Object.assign({}, action.meta) : {};
   if (!options || !options.from || !options.to) {
@@ -578,16 +578,29 @@ function Sections(prevState = INITIAL_ST
         if (section && section.id === action.data.id) {
           // If the action is updating rows, we should consider initialized to be true.
           // This can be overridden if initialized is defined in the action.data
           const initialized = action.data.rows ? { initialized: true } : {};
           return Object.assign({}, section, initialized, action.data);
         }
         return section;
       });
+    case at.SECTION_UPDATE_CARD:
+      return prevState.map(section => {
+        if (section && section.id === action.data.id && section.rows) {
+          const newRows = section.rows.map(card => {
+            if (card.url === action.data.url) {
+              return Object.assign({}, card, action.data.options);
+            }
+            return card;
+          });
+          return Object.assign({}, section, { rows: newRows });
+        }
+        return section;
+      });
     case at.PLACES_BOOKMARK_ADDED:
       if (!action.data) {
         return prevState;
       }
       return prevState.map(section => Object.assign({}, section, {
         rows: section.rows.map(item => {
           // find the item within the rows that is attempted to be bookmarked
           if (item.url === action.data.url) {
@@ -652,18 +665,20 @@ module.exports = {
 /* 7 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 /* globals Services */
 
 
 /* istanbul ignore if */
-
-if (typeof Components !== "undefined" && Components.utils) {
+// Note: normally we would just feature detect Components.utils here, but
+// unfortunately that throws an ugly warning in content if we do.
+
+if (typeof Window === "undefined" && typeof Components !== "undefined" && Components.utils) {
   Components.utils.import("resource://gre/modules/Services.jsm");
 }
 
 let usablePerfObj;
 
 /* istanbul ignore if */
 /* istanbul ignore else */
 if (typeof Services !== "undefined") {
@@ -1041,20 +1056,20 @@ module.exports._unconnected = LinkMenu;
 /***/ }),
 /* 10 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* WEBPACK VAR INJECTION */(function(global) {const React = __webpack_require__(1);
 const ReactDOM = __webpack_require__(11);
 const Base = __webpack_require__(12);
 const { Provider } = __webpack_require__(3);
-const initStore = __webpack_require__(28);
+const initStore = __webpack_require__(29);
 const { reducers } = __webpack_require__(6);
-const DetectUserSessionStart = __webpack_require__(30);
-const { addSnippetsSubscriber } = __webpack_require__(31);
+const DetectUserSessionStart = __webpack_require__(31);
+const { addSnippetsSubscriber } = __webpack_require__(32);
 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,
@@ -1087,89 +1102,112 @@ const { connect } = __webpack_require__(
 const { addLocaleData, IntlProvider } = __webpack_require__(2);
 const TopSites = __webpack_require__(13);
 const Search = __webpack_require__(19);
 const ConfirmDialog = __webpack_require__(21);
 const ManualMigration = __webpack_require__(22);
 const PreferencesPane = __webpack_require__(23);
 const Sections = __webpack_require__(24);
 const { actionTypes: at, actionCreators: ac } = __webpack_require__(0);
+const { PrerenderData } = __webpack_require__(28);
 
 // 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;
 }
 
 class Base extends React.Component {
+  componentWillMount() {
+    this.sendNewTabRehydrated(this.props.App);
+  }
+
   componentDidMount() {
     // Request state AFTER the first render to ensure we don't cause the
     // prerendered DOM to be unmounted. Otherwise, NEW_TAB_STATE_REQUEST is
     // dispatched right after the store is ready.
     if (this.props.isPrerendered) {
       this.props.dispatch(ac.SendToMain({ type: at.NEW_TAB_STATE_REQUEST }));
     }
 
     // Also wait for the preloaded page to show, so the tab's title and favicon updates
     addEventListener("visibilitychange", () => {
       this.updateTitle(this.props.App);
       document.getElementById("favicon").href += "#";
     }, { once: true });
   }
+
   componentWillUpdate({ App }) {
+    this.sendNewTabRehydrated(App);
+
     // Early loads might not have locale yet, so wait until we do
     if (App.locale && App.locale !== this.props.App.locale) {
       addLocaleDataForReactIntl(App);
       this.updateTitle(App);
     }
   }
 
   updateTitle({ strings }) {
     if (strings) {
       document.title = strings.newtab_page_title;
     }
   }
 
+  // The NEW_TAB_REHYDRATED event is used to inform feeds that their
+  // data has been consumed e.g. for counting the number of tabs that
+  // have rendered that data.
+  sendNewTabRehydrated(App) {
+    if (App && App.initialized && !this.renderNotified) {
+      this.props.dispatch(ac.SendToMain({ type: at.NEW_TAB_REHYDRATED, data: {} }));
+      this.renderNotified = true;
+    }
+  }
+
   render() {
     const props = this.props;
     const { locale, strings, initialized } = props.App;
     const prefs = props.Prefs.values;
 
+    const shouldBeFixedToTop = PrerenderData.arePrefsValid(name => prefs[name]);
+
+    const outerClassName = `outer-wrapper${shouldBeFixedToTop ? " fixed-to-top" : ""}`;
+
     if (!props.isPrerendered && !initialized) {
       return null;
     }
 
     // Note: the key on IntlProvider must be static in order to not blow away
     // all elements on a locale change (such as after preloading).
     // See https://github.com/yahoo/react-intl/issues/695 for more info.
     return React.createElement(
       IntlProvider,
       { key: "STATIC", locale: locale, messages: strings },
       React.createElement(
         "div",
-        { className: "outer-wrapper" },
+        { className: outerClassName },
         React.createElement(
           "main",
           null,
           prefs.showSearch && React.createElement(Search, null),
           !prefs.migrationExpired && React.createElement(ManualMigration, null),
           prefs.showTopSites && React.createElement(TopSites, null),
           React.createElement(Sections, null),
           React.createElement(ConfirmDialog, null)
         ),
         initialized && React.createElement(PreferencesPane, null)
       )
     );
   }
 }
 
 module.exports = connect(state => ({ App: state.App, Prefs: state.Prefs }))(Base);
+module.exports._unconnected = Base;
 
 /***/ }),
 /* 13 */
 /***/ (function(module, exports, __webpack_require__) {
 
 const React = __webpack_require__(1);
 const { connect } = __webpack_require__(3);
 const { FormattedMessage } = __webpack_require__(2);
@@ -2637,38 +2675,44 @@ class Card extends React.Component {
     this.setState({ showContextMenu });
   }
   render() {
     const { index, link, dispatch, contextMenuOptions, eventSource } = this.props;
     const { props } = this;
     const isContextMenuOpen = this.state.showContextMenu && this.state.activeCard === index;
     // Display "now" as "trending" until we have new strings #3402
     const { icon, intlID } = cardContextTypes[link.type === "now" ? "trending" : link.type] || {};
+    const hasImage = link.image || link.hasImage;
+    const imageStyle = { backgroundImage: link.image ? `url(${link.image})` : "none" };
 
     return React.createElement(
       "li",
       { className: `card-outer${isContextMenuOpen ? " active" : ""}${props.placeholder ? " placeholder" : ""}` },
       React.createElement(
         "a",
         { href: link.url, onClick: !props.placeholder && this.onLinkClick },
         React.createElement(
           "div",
           { className: "card" },
-          link.image && React.createElement("div", { className: "card-preview-image", style: { backgroundImage: `url(${link.image})` } }),
+          hasImage && React.createElement(
+            "div",
+            { className: "card-preview-image-outer" },
+            React.createElement("div", { className: `card-preview-image${link.image ? " loaded" : ""}`, style: imageStyle })
+          ),
           React.createElement(
             "div",
-            { className: `card-details${link.image ? "" : " no-image"}` },
+            { className: `card-details${hasImage ? "" : " no-image"}` },
             link.hostname && React.createElement(
               "div",
               { className: "card-host-name" },
               link.hostname
             ),
             React.createElement(
               "div",
-              { className: `card-text${link.image ? "" : " no-image"}${link.hostname ? "" : " no-host-name"}${icon ? "" : " no-context"}` },
+              { className: `card-text${hasImage ? "" : " no-image"}${link.hostname ? "" : " no-host-name"}${icon ? "" : " no-context"}` },
               React.createElement(
                 "h4",
                 { className: "card-title", dir: "auto" },
                 link.title
               ),
               React.createElement(
                 "p",
                 { className: "card-description", dir: "auto" },
@@ -2787,21 +2831,112 @@ class Topics extends React.Component {
 }
 
 module.exports = Topics;
 module.exports._unconnected = Topics;
 module.exports.Topic = Topic;
 
 /***/ }),
 /* 28 */
+/***/ (function(module, exports) {
+
+class _PrerenderData {
+  constructor(options) {
+    this.initialPrefs = options.initialPrefs;
+    this.initialSections = options.initialSections;
+    this._setValidation(options.validation);
+  }
+
+  get validation() {
+    return this._validation;
+  }
+
+  set validation(value) {
+    this._setValidation(value);
+  }
+
+  get invalidatingPrefs() {
+    return this._invalidatingPrefs;
+  }
+
+  // This is needed so we can use it in the constructor
+  _setValidation(value = []) {
+    this._validation = value;
+    this._invalidatingPrefs = value.reduce((result, next) => {
+      if (typeof next === "string") {
+        result.push(next);
+        return result;
+      } else if (next && next.oneOf) {
+        return result.concat(next.oneOf);
+      }
+      throw new Error("Your validation configuration is not properly configured");
+    }, []);
+  }
+
+  arePrefsValid(getPref) {
+    for (const prefs of this.validation) {
+      // {oneOf: ["foo", "bar"]}
+      if (prefs && prefs.oneOf && !prefs.oneOf.some(name => getPref(name) === this.initialPrefs[name])) {
+        return false;
+
+        // "foo"
+      } else if (getPref(prefs) !== this.initialPrefs[prefs]) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+
+var PrerenderData = new _PrerenderData({
+  initialPrefs: {
+    "migrationExpired": true,
+    "showTopSites": true,
+    "showSearch": true,
+    "topSitesCount": 6,
+    "feeds.section.topstories": true,
+    "feeds.section.highlights": true
+  },
+  // Prefs listed as invalidating will prevent the prerendered version
+  // of AS from being used if their value is something other than what is listed
+  // here. This is required because some preferences cause the page layout to be
+  // too different for the prerendered version to be used. Unfortunately, this
+  // will result in users who have modified some of their preferences not being
+  // able to get the benefits of prerendering.
+  validation: ["showTopSites", "showSearch",
+  // This means if either of these are set to their default values,
+  // prerendering can be used.
+  { oneOf: ["feeds.section.topstories", "feeds.section.highlights"] }],
+  initialSections: [{
+    enabled: true,
+    icon: "pocket",
+    id: "topstories",
+    order: 1,
+    title: { id: "header_recommended_by", values: { provider: "Pocket" } },
+    topics: [{}]
+  }, {
+    enabled: true,
+    id: "highlights",
+    icon: "highlights",
+    order: 2,
+    title: { id: "header_highlights" }
+  }]
+});
+module.exports = {
+  PrerenderData,
+  _PrerenderData
+};
+
+/***/ }),
+/* 29 */
 /***/ (function(module, exports, __webpack_require__) {
 
 /* WEBPACK VAR INJECTION */(function(global) {/* eslint-env mozilla/frame-script */
 
-const { createStore, combineReducers, applyMiddleware } = __webpack_require__(29);
+const { createStore, combineReducers, applyMiddleware } = __webpack_require__(30);
 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,
@@ -2901,23 +3036,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)))
 
 /***/ }),
-/* 29 */
+/* 30 */
 /***/ (function(module, exports) {
 
 module.exports = Redux;
 
 /***/ }),
-/* 30 */
+/* 31 */
 /***/ (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";
 
@@ -2977,17 +3112,17 @@ module.exports = class DetectUserSession
       this._sendEvent();
       this.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
     }
   }
 };
 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
 
 /***/ }),
-/* 31 */
+/* 32 */
 /***/ (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
@@ -163,19 +163,21 @@ a {
     .actions button.done {
       background: #0060DF;
       border: solid 1px #0060DF;
       color: #FFF;
       margin-inline-start: auto; }
 
 .outer-wrapper {
   display: flex;
-  flex-grow: 1;
   padding: 40px 32px 32px;
-  height: 100%; }
+  height: 100%;
+  flex-grow: 1; }
+  .outer-wrapper.fixed-to-top {
+    height: auto; }
 
 main {
   margin: auto;
   width: 224px;
   padding-bottom: 120px; }
   @media (min-width: 416px) {
     main {
       width: 352px; } }
@@ -971,24 +973,40 @@ main {
     outline: none;
     box-shadow: 0 0 0 5px #D7D7DB;
     transition: box-shadow 150ms; }
     .card-outer:hover .context-menu-button, .card-outer:focus .context-menu-button, .card-outer.active .context-menu-button {
       transform: scale(1);
       opacity: 1; }
     .card-outer:hover .card-title, .card-outer:focus .card-title, .card-outer.active .card-title {
       color: #0060DF; }
-  .card-outer .card-preview-image {
+  .card-outer .card-preview-image-outer {
     position: relative;
-    background-size: cover;
-    background-position: center;
-    background-repeat: no-repeat;
+    background: linear-gradient(135deg, #B1B1B3, #D7D7DB);
     height: 122px;
-    border-bottom: 1px solid #D7D7DB;
-    border-radius: 3px 3px 0 0; }
+    border-radius: 3px 3px 0 0;
+    overflow: hidden; }
+    .card-outer .card-preview-image-outer:dir(rtl) {
+      background: linear-gradient(225deg, #B1B1B3, #D7D7DB); }
+    .card-outer .card-preview-image-outer::after {
+      border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+      bottom: 0;
+      content: " ";
+      position: absolute;
+      width: 100%; }
+    .card-outer .card-preview-image-outer .card-preview-image {
+      width: 100%;
+      height: 100%;
+      background-size: cover;
+      background-position: center;
+      background-repeat: no-repeat;
+      transition: opacity 1s;
+      opacity: 0; }
+      .card-outer .card-preview-image-outer .card-preview-image.loaded {
+        opacity: 1; }
   .card-outer .card-details {
     padding: 15px 16px 12px; }
     .card-outer .card-details.no-image {
       padding-top: 16px; }
   .card-outer .card-text {
     overflow: hidden;
     max-height: 78px; }
     .card-outer .card-text.no-image {
index 744891445942522aa2ac221136abacb6e5199b23..1fb0ba27f676d7abc1f5e7d7a8f11e98aff243ab
GIT binary patch
literal 17496
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
index 9924775d1bf875ec2aa7ae1df51f5b029c7038b2..0ec469f1ddc7e8ebb670601443692fb9e55763c0
GIT binary patch
literal 7080
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
deleted file mode 100644
index 1e4e4b0f721baedf73b6919bd399adb47f55f334..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 6e3ffe0c98c922a66eb8c72ee87c184f71fcf290..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 7175f15b48081522ad4e6aa3520f928c1e09f1ca..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index f5106214bc4ad7adc08bc73b3ecccf570604fc7d..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 3de6f74b1dc57e1ed9f6d34bd4a125424840cd62..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..37a420fee5f79f0231728834b8ca2919f70e0ca1
GIT binary patch
literal 9149
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
Si2UWP8yQJONSU}n(0>6A0FmAR
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..01cf3adbabef324269177a3bb5c477a5fec20b8f
GIT binary patch
literal 5264
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
deleted file mode 100644
index ca2a315bb2ea201c9dc9e79cf59e61a267b1de54..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
index aadaa33b0b4118c2fa40b78590009a82ab3506ea..9bb717bd75bda57685efdbf3c552bbfb8f9007b2
GIT binary patch
literal 25974
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
YfA3*>Groj3UjP6A07*qoM6N<$g50<tX8-^I
deleted file mode 100644
index 91a98b04044b8accdebeabde6ec8d38980f26391..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
index 8d6b4c9dc3aa381a44f7f201aa4fd044a8c244c1..2a15cb5bd9f8f2d3f288e0ae912b337a9baa8147
GIT binary patch
literal 10274
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
OQ&D&eu9o`{`o93-=Y<Ra
index 469bbb741581af14a314f9748513539567aa10eb..fe75632885b3f862575972c40465735a1cf19bb5
GIT binary patch
literal 15265
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2b98265f0b0145ae555380fa10dec335d33cfaee
GIT binary patch
literal 12066
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
WTB~cW{`6mIyPA>~v{u0?^8W#<>onH@
deleted file mode 100644
index f1fff1432c8fbf7480c02eae2900ce1809f7ae7c..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f830e8b99b29b48cf9be6bf763e6da475e9b77cd
GIT binary patch
literal 6166
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
TOg)C5e9kwxXrx=J?GW`pRbEF4
deleted file mode 100644
index 28eaf79df8b8730e60829906fa2670ac21a495dc..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
index d9bf8792c0365418db96b5f3e313528727f62d47..355682f01a8c749088f3d50aa50afea7bd48e330
GIT binary patch
literal 9100
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
index 528309bfe3b155cc1a40fa96e884392be933151c..2282e247fa8ccb5afa0ce3f2e14ddf0f73f608a2
GIT binary patch
literal 7481
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
TwA-0~C!QKAI?5G_R+0Y$OtLzj
index 7792839db19fb0a8942e6c9281a0c28e89ca8be1..636e3804aa04b3f4b6f7b5cec8fefcdeffd1f9c4
GIT binary patch
literal 4349
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
AwEzGB
index 6122c71bd23ba737a50b68ff147ab79e37ae525c..a0b3d8b63e3e4e8c14af5a7c397d466dbc5b8187
GIT binary patch
literal 15519
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
deleted file mode 100644
index 576f0a7b27c8af9cec248a3e27c74d7801da28f2..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..85a75f87963c400b5848e202bed39640a2ca4c3f
GIT binary patch
literal 26900
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4599db81a29bea401af1f64b59fd3563789255d1
GIT binary patch
literal 7297
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
Md8VO=d1@Z~KTwVC@c;k-
deleted file mode 100644
index 9fc35f390562ce10d9b2bf42672f17692bf5beb0..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
index 3c26bfd19e982bc0c1664d053b27153194e00176..6388300c21d95aa26825ea4674a4f814a0f8c8ed
GIT binary patch
literal 4211
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
U7J*Z?KKLszH?cOZI7z(rFFdVeG5`Po
--- a/browser/extensions/activity-stream/data/content/tippytop/top_sites.json
+++ b/browser/extensions/activity-stream/data/content/tippytop/top_sites.json
@@ -6,73 +6,48 @@
   },
   {
     "title": "allegro",
     "url": "https://www.allegro.pl/",
     "image_url": "allegro-pl@2x.png"
   },
   {
     "title": "amazon",
-    "url": "https://www.amazon.ca/",
-    "image_url": "amazon-ca@2x.png"
-  },
-  {
-    "title": "amazon",
-    "url": "https://www.amazon.co.uk/",
-    "image_url": "amazon-uk@2x.png"
-  },
-  {
-    "title": "amazon",
-    "url": "https://www.amazon.com/",
-    "image_url": "amazon-com@2x.png"
-  },
-  {
-    "title": "amazon",
-    "url": "https://www.amazon.de/",
-    "image_url": "amazon-de@2x.png"
-  },
-  {
-    "title": "amazon",
-    "url": "https://www.amazon.fr/",
-    "image_url": "amazon-fr@2x.png"
+    "urls": ["https://www.amazon.ca/", "https://www.amazon.co.uk/", "https://www.amazon.com/", "https://www.amazon.de/", "https://www.amazon.fr/"],
+    "image_url": "amazon@2x.png"
   },
   {
     "title": "avito",
     "url": "https://www.avito.ru/",
-    "image_url": "avito@2x.png"
+    "image_url": "avito-ru@2x.png"
   },
   {
     "title": "bbc",
     "url": "https://www.bbc.co.uk/",
     "image_url": "bbc-uk@2x.png"
   },
   {
     "title": "ebay",
-    "urls": ["https://www.ebay.com", "https://www.ebay.co.uk/"],
+    "urls": ["https://www.ebay.com", "https://www.ebay.co.uk/", "https://ebay.de"],
     "image_url": "ebay@2x.png"
   },
   {
-    "title": "ebay",
-    "url": "https://ebay.de",
-    "image_url": "ebay-de@2x.png"
-  },
-  {
     "title": "facebook",
     "url": "https://www.facebook.com/",
     "image_url": "facebook-com@2x.png"
   },
   {
     "title": "leboncoin",
     "url": "http://www.leboncoin.fr/",
-    "image_url": "leboncoin@2x.png"
+    "image_url": "leboncoin-fr@2x.png"
   },
   {
     "title": "ok",
     "url": "https://www.ok.ru/",
-    "image_url": "ok@2x.png"
+    "image_url": "ok-ru@2x.png"
   },
   {
     "title": "olx",
     "url": "https://www.olx.pl/",
     "image_url": "olx-pl@2x.png"
   },
   {
     "title": "reddit",
@@ -87,21 +62,21 @@
   {
     "title": "vk",
     "url": "https://vk.com/",
     "image_url": "vk-com@2x.png"
   },
   {
     "title": "wikipedia",
     "url": "https://www.wikipedia.org/",
-    "image_url": "wikipedia-com@2x.png"
+    "image_url": "wikipedia-org@2x.png"
   },
   {
     "title": "wykop",
     "url": "https://www.wykop.pl/",
-    "image_url": "wykop@2x.png"
+    "image_url": "wykop-pl@2x.png"
   },
   {
     "title": "youtube",
     "url": "https://www.youtube.com/",
     "image_url": "youtube-com@2x.png"
   }
 ]
--- a/browser/extensions/activity-stream/data/locales.json
+++ b/browser/extensions/activity-stream/data/locales.json
@@ -5992,18 +5992,18 @@
     "header_top_sites": "En Sık Kullanılan Siteler",
     "header_stories": "İlginç Yazılar",
     "header_highlights": "Öne Çıkanlar",
     "header_visit_again": "Yeniden Ziyaret Edin",
     "header_bookmarks": "Son Yer imleri",
     "header_recommended_by": "{provider} öneriyor",
     "header_bookmarks_placeholder": "Henüz hiç yer iminiz yok.",
     "header_stories_from": "kaynak:",
-    "type_label_visited": "Ziyaret edildi",
-    "type_label_bookmarked": "Yer imlerine eklendi",
+    "type_label_visited": "Ziyaret etmiştiniz",
+    "type_label_bookmarked": "Yer imlerinizde",
     "type_label_synced": "Başka bir cihazdan eşitlendi",
     "type_label_recommended": "Popüler",
     "type_label_open": "Açık",
     "type_label_topic": "Konu",
     "type_label_now": "Şimdi",
     "menu_action_bookmark": "Yer imlerine ekle",
     "menu_action_remove_bookmark": "Yer imini sil",
     "menu_action_copy_address": "Adresi kopyala",
@@ -6070,17 +6070,17 @@
     "topsites_form_cancel_button": "İptal",
     "topsites_form_url_validation": "Geçerli bir adres gerekli",
     "pocket_read_more": "Popüler konular:",
     "pocket_read_even_more": "Daha fazla yazı göster",
     "pocket_feedback_header": "25 milyon kişinin katkılarıyla, web’in en iyileri.",
     "pocket_description": "Mozilla ailesinin yeni üyesi Pocket’ın yardımıyla, gözünüzden kaçabilecek kaliteli içerikleri keşfedin.",
     "highlights_empty_state": "Gezinmeye başlayın. Son zamanlarda baktığınız veya yer imlerinize eklediğiniz bazı güzel makaleleri, videoları ve diğer sayfaları burada göstereceğiz.",
     "topstories_empty_state": "Hepsini bitirdiniz. Yeni {provider} haberleri için daha fazla yine gelin. Beklemek istemiyor musunuz? İlginç yazılara ulaşmak için popüler konulardan birini seçebilirsiniz.",
-    "manual_migration_explanation2": "Öteki tarayıcılarınızdaki yer işaretlerinizi, geçmişinizi ve parolalarınızı Firefox’a taşıyabilirsiniz.",
+    "manual_migration_explanation2": "Öteki tarayıcılarınızdaki yer imlerinizi, geçmişinizi ve parolalarınızı Firefox’a aktarabilirsiniz.",
     "manual_migration_cancel_button": "Gerek yok",
     "manual_migration_import_button": "Olur, aktaralım"
   },
   "uk": {
     "newtab_page_title": "Нова вкладка",
     "default_label_loading": "Завантаження…",
     "header_top_sites": "Популярні сайти",
     "header_stories": "Головні новини",
--- 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.11.1306-373d9fc</em:version>
+    <em:version>2017.09.12.1376-781e5de5</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/lib/ActivityStreamMessageChannel.jsm
+++ b/browser/extensions/activity-stream/lib/ActivityStreamMessageChannel.jsm
@@ -55,26 +55,30 @@ this.ActivityStreamMessageChannel = clas
    * middleware - Redux middleware that looks for SendToContent and BroadcastToContent type
    *              actions, and sends them out.
    *
    * @param  {object} store A redux store
    * @return {function} Redux middleware
    */
   middleware(store) {
     return next => action => {
-      if (!this.channel) {
+      const skipMain = action.meta && action.meta.skipMain;
+      if (!this.channel && !skipMain) {
         next(action);
         return;
       }
       if (au.isSendToContent(action)) {
         this.send(action);
       } else if (au.isBroadcastToContent(action)) {
         this.broadcast(action);
       }
-      next(action);
+
+      if (!skipMain) {
+        next(action);
+      }
     };
   }
 
   /**
    * onActionFromContent - Handler for actions from a content processes
    *
    * @param  {object} action  A Redux action
    * @param  {string} targetId The portID of the port that sent the message
@@ -131,20 +135,20 @@ this.ActivityStreamMessageChannel = clas
     const channel = this.pageURL === ABOUT_NEW_TAB_URL && AboutNewTab.override(true);
     this.channel = channel || new RemotePages([ABOUT_HOME_URL, ABOUT_NEW_TAB_URL]);
     this.channel.addMessageListener("RemotePage:Init", this.onNewTabInit);
     this.channel.addMessageListener("RemotePage:Load", this.onNewTabLoad);
     this.channel.addMessageListener("RemotePage:Unload", this.onNewTabUnload);
     this.channel.addMessageListener(this.incomingMessageName, this.onMessage);
 
     // Some pages might have already loaded, so we won't get the usual message
-    for (const {loaded, portID} of this.channel.messagePorts) {
-      const simulatedMsg = {target: {portID}};
+    for (const target of this.channel.messagePorts) {
+      const simulatedMsg = {target};
       this.onNewTabInit(simulatedMsg);
-      if (loaded) {
+      if (target.loaded) {
         this.onNewTabLoad(simulatedMsg);
       }
     }
   }
 
   /**
    * destroyChannel - Destroys the RemotePages channel
    */
@@ -163,17 +167,20 @@ this.ActivityStreamMessageChannel = clas
 
 /**
  * onNewTabInit - Handler for special RemotePage:Init message fired
  * by RemotePages
  *
  * @param  {obj} msg The messsage from a page that was just initialized
  */
   onNewTabInit(msg) {
-    this.onActionFromContent({type: at.NEW_TAB_INIT}, msg.target.portID);
+    this.onActionFromContent({
+      type: at.NEW_TAB_INIT,
+      data: {url: msg.target.url}
+    }, msg.target.portID);
   }
 
   /**
    * onNewTabLoad - Handler for special RemotePage:Load message fired by RemotePages
    *
    * @param  {obj} msg The messsage from a page that was just loaded
    */
   onNewTabLoad(msg) {
--- a/browser/extensions/activity-stream/lib/HighlightsFeed.jsm
+++ b/browser/extensions/activity-stream/lib/HighlightsFeed.jsm
@@ -10,27 +10,30 @@ const {actionTypes: at} = Cu.import("res
 
 const {shortURL} = Cu.import("resource://activity-stream/lib/ShortURL.jsm", {});
 const {SectionsManager} = Cu.import("resource://activity-stream/lib/SectionsManager.jsm", {});
 const {TOP_SITES_SHOWMORE_LENGTH} = Cu.import("resource://activity-stream/common/Reducers.jsm", {});
 const {Dedupe} = Cu.import("resource://activity-stream/common/Dedupe.jsm", {});
 
 XPCOMUtils.defineLazyModuleGetter(this, "NewTabUtils",
   "resource://gre/modules/NewTabUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "Screenshots",
+  "resource://activity-stream/lib/Screenshots.jsm");
 
 const HIGHLIGHTS_MAX_LENGTH = 9;
 const HIGHLIGHTS_UPDATE_TIME = 15 * 60 * 1000; // 15 minutes
 const MANY_EXTRA_LENGTH = HIGHLIGHTS_MAX_LENGTH * 5 + TOP_SITES_SHOWMORE_LENGTH;
 const SECTION_ID = "highlights";
 
 this.HighlightsFeed = class HighlightsFeed {
   constructor() {
     this.highlightsLastUpdated = 0;
     this.highlights = [];
     this.dedupe = new Dedupe(this._dedupeKey);
+    this.imageCache = new Map();
   }
 
   _dedupeKey(site) {
     return site && site.url;
   }
 
   init() {
     SectionsManager.onceInitialized(this.postInit.bind(this));
@@ -57,35 +60,58 @@ this.HighlightsFeed = class HighlightsFe
     const hosts = new Set();
     for (const page of deduped) {
       const hostname = shortURL(page);
       // Skip this history page if we already something from the same host
       if (page.type === "history" && hosts.has(hostname)) {
         continue;
       }
 
+      // If we already have the image for the card in the cache, use that
+      // immediately. Then asynchronously fetch the image (refreshes the cache).
+      const image = this.imageCache.get(page.url);
+      this.fetchImage(page.url, page.preview_image_url);
+
       // We want the page, so update various fields for UI
       Object.assign(page, {
+        image,
+        hasImage: true, // We always have an image - fall back to a screenshot
         hostname,
-        image: page.preview_image_url,
         type: page.bookmarkGuid ? "bookmark" : page.type
       });
 
       // Add the "bookmark" or not-skipped "history"
       this.highlights.push(page);
       hosts.add(hostname);
 
       // Skip the rest if we have enough items
       if (this.highlights.length === HIGHLIGHTS_MAX_LENGTH) {
         break;
       }
     }
 
     SectionsManager.updateSection(SECTION_ID, {rows: this.highlights}, this.highlightsLastUpdated === 0 || broadcast);
     this.highlightsLastUpdated = Date.now();
+    // Clearing the image cache here is okay. The asynchronous fetchImage calls
+    // get scheduled after the body of fetchHighlights has been executed, so they
+    // then fill up the cache again for the next fetchHighlights call.
+    this.imageCache.clear();
+  }
+
+  /**
+   * Fetch an image for a given highlight, store it in the image cache, and
+   * update the card with the new image. If the highlight has a preview image
+   * then use that, else fall back to a screenshot of the page.
+   */
+  async fetchImage(url, imageUrl) {
+    const image = await Screenshots.getScreenshotForURL(imageUrl || url);
+    if (image) {
+      this.imageCache.set(url, image);
+    }
+    SectionsManager.updateSectionCard(SECTION_ID, url, {image}, true);
   }
 
   onAction(action) {
     switch (action.type) {
       case at.INIT:
         this.init();
         break;
       case at.NEW_TAB_LOAD:
--- a/browser/extensions/activity-stream/lib/PrefsFeed.jsm
+++ b/browser/extensions/activity-stream/lib/PrefsFeed.jsm
@@ -12,37 +12,31 @@ const {PrerenderData} = Cu.import("resou
 this.PrefsFeed = class PrefsFeed {
   constructor(prefMap) {
     this._prefMap = prefMap;
     this._prefs = new Prefs();
   }
 
   // If the any prefs are set to something other than what the prerendered version
   // of AS expects, we can't use it.
-  _setPrerenderPref() {
-    for (const prefName of PrerenderData.invalidatingPrefs) {
-      if (this._prefs.get(prefName) !== PrerenderData.initialPrefs[prefName]) {
-        this._prefs.set("prerender", false);
-        return;
-      }
-    }
-    this._prefs.set("prerender", true);
+  _setPrerenderPref(name) {
+    this._prefs.set("prerender", PrerenderData.arePrefsValid(pref => this._prefs.get(pref)));
   }
 
   _checkPrerender(name) {
     if (PrerenderData.invalidatingPrefs.includes(name)) {
       this._setPrerenderPref();
     }
   }
 
   onPrefChanged(name, value) {
     if (this._prefMap.has(name)) {
       this.store.dispatch(ac.BroadcastToContent({type: at.PREF_CHANGED, data: {name, value}}));
     }
-    this._checkPrerender(name, value);
+    this._checkPrerender(name);
   }
 
   init() {
     this._prefs.observeBranch(this);
 
     // Get the initial value of each activity stream pref
     const values = {};
     for (const name of this._prefMap.keys()) {
--- a/browser/extensions/activity-stream/lib/Screenshots.jsm
+++ b/browser/extensions/activity-stream/lib/Screenshots.jsm
@@ -14,16 +14,18 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   "resource://gre/modules/PageThumbs.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
     "resource://gre/modules/FileUtils.jsm");
 XPCOMUtils.defineLazyServiceGetter(this, "MIMEService",
   "@mozilla.org/mime;1", "nsIMIMEService");
 XPCOMUtils.defineLazyModuleGetter(this, "OS",
   "resource://gre/modules/osfile.jsm");
 
+const GREY_10 = "#F9F9FA";
+
 this.Screenshots = {
   /**
    * Convert bytes to a string using extremely fast String.fromCharCode without
    * exceeding the max number of arguments that can be provided to a function.
    */
   _bytesToString(bytes) {
     // NB: This comes from js/src/vm/ArgumentsObject.h ARGS_LENGTH_MAX
     const ARGS_LENGTH_MAX = 500 * 1000;
@@ -36,17 +38,17 @@ this.Screenshots = {
       str += String.fromCharCode.apply(null, bytes.slice(start, i));
     }
     return str;
   },
 
   async getScreenshotForURL(url) {
     let screenshot = null;
     try {
-      await BackgroundPageThumbs.captureIfMissing(url);
+      await BackgroundPageThumbs.captureIfMissing(url, {backgroundColor: GREY_10});
       const imgPath = PageThumbs.getThumbnailPath(url);
 
       // OS.File object used to easily read off-thread
       const file = await OS.File.open(imgPath, {read: true, existing: true});
 
       // nsIFile object needed for MIMEService
       const nsFile = FileUtils.File(imgPath);
 
--- a/browser/extensions/activity-stream/lib/SectionsManager.jsm
+++ b/browser/extensions/activity-stream/lib/SectionsManager.jsm
@@ -134,16 +134,36 @@ const SectionsManager = {
    * @param options section options
    */
   updateSectionContextMenuOptions(options) {
     if (options.availableContextMenuOptions) {
       options.contextMenuOptions = options.availableContextMenuOptions.filter(
         o => !this.CONTEXT_MENU_PREFS[o] || Services.prefs.getBoolPref(this.CONTEXT_MENU_PREFS[o]));
     }
   },
+
+  /**
+   * Update a specific section card by its url. This allows an action to be
+   * broadcast to all existing pages to update a specific card without having to
+   * also force-update the rest of the section's cards and state on those pages.
+   *
+   * @param id              The id of the section with the card to be updated
+   * @param url             The url of the card to update
+   * @param options         The options to update for the card
+   * @param shouldBroadcast Whether or not to broadcast the update
+   */
+  updateSectionCard(id, url, options, shouldBroadcast) {
+    if (this.sections.has(id)) {
+      const card = this.sections.get(id).rows.find(elem => elem.url === url);
+      if (card) {
+        Object.assign(card, options);
+      }
+      this.emit(this.UPDATE_SECTION_CARD, id, url, options, shouldBroadcast);
+    }
+  },
   onceInitialized(callback) {
     if (this.initialized) {
       callback();
     } else {
       this.once(this.INIT, callback);
     }
   },
   uninit() {
@@ -155,47 +175,51 @@ const SectionsManager = {
 
 for (const action of [
   "ACTION_DISPATCHED",
   "ADD_SECTION",
   "REMOVE_SECTION",
   "ENABLE_SECTION",
   "DISABLE_SECTION",
   "UPDATE_SECTION",
+  "UPDATE_SECTION_CARD",
   "INIT",
   "UNINIT"
 ]) {
   SectionsManager[action] = action;
 }
 
 EventEmitter.decorate(SectionsManager);
 
 class SectionsFeed {
   constructor() {
     this.init = this.init.bind(this);
     this.onAddSection = this.onAddSection.bind(this);
     this.onRemoveSection = this.onRemoveSection.bind(this);
     this.onUpdateSection = this.onUpdateSection.bind(this);
+    this.onUpdateSectionCard = this.onUpdateSectionCard.bind(this);
   }
 
   init() {
     SectionsManager.on(SectionsManager.ADD_SECTION, this.onAddSection);
     SectionsManager.on(SectionsManager.REMOVE_SECTION, this.onRemoveSection);
     SectionsManager.on(SectionsManager.UPDATE_SECTION, this.onUpdateSection);
+    SectionsManager.on(SectionsManager.UPDATE_SECTION_CARD, this.onUpdateSectionCard);
     // Catch any sections that have already been added
     SectionsManager.sections.forEach((section, id) =>
       this.onAddSection(SectionsManager.ADD_SECTION, id, section));
   }
 
   uninit() {
     SectionsManager.uninit();
     SectionsManager.emit(SectionsManager.UNINIT);
     SectionsManager.off(SectionsManager.ADD_SECTION, this.onAddSection);
     SectionsManager.off(SectionsManager.REMOVE_SECTION, this.onRemoveSection);
     SectionsManager.off(SectionsManager.UPDATE_SECTION, this.onUpdateSection);
+    SectionsManager.off(SectionsManager.UPDATE_SECTION_CARD, this.onUpdateSectionCard);
   }
 
   onAddSection(event, id, options) {
     if (options) {
       this.store.dispatch(ac.BroadcastToContent({type: at.SECTION_REGISTER, data: Object.assign({id}, options)}));
     }
   }
 
@@ -205,16 +229,23 @@ class SectionsFeed {
 
   onUpdateSection(event, id, options, shouldBroadcast = false) {
     if (options) {
       const action = {type: at.SECTION_UPDATE, data: Object.assign(options, {id})};
       this.store.dispatch(shouldBroadcast ? ac.BroadcastToContent(action) : action);
     }
   }
 
+  onUpdateSectionCard(event, id, url, options, shouldBroadcast = false) {
+    if (options) {
+      const action = {type: at.SECTION_UPDATE_CARD, data: {id, url, options}};
+      this.store.dispatch(shouldBroadcast ? ac.BroadcastToContent(action) : action);
+    }
+  }
+
   onAction(action) {
     switch (action.type) {
       case at.INIT:
         SectionsManager.onceInitialized(this.init);
         break;
       // Wait for pref values, as some sections have options stored in prefs
       case at.PREFS_INITIAL_VALUES:
         SectionsManager.init(action.data);
--- a/browser/extensions/activity-stream/lib/TelemetryFeed.jsm
+++ b/browser/extensions/activity-stream/lib/TelemetryFeed.jsm
@@ -184,27 +184,31 @@ this.TelemetryFeed = class TelemetryFeed
     }
     return prefs;
   }
 
   /**
    * addSession - Start tracking a new session
    *
    * @param  {string} id the portID of the open session
-   *
+   * @param  {string} the URL being loaded for this session (optional)
    * @return {obj}    Session object
    */
-  addSession(id) {
+  addSession(id, url) {
     const session = {
       session_id: String(gUUIDGenerator.generateUUID()),
-      page: "about:newtab", // TODO: Handle about:home here
+      // "unknown" will be overwritten when appropriate
+      page: url ? url : "unknown",
       // "unexpected" will be overwritten when appropriate
       perf: {load_trigger_type: "unexpected"}
     };
 
+    if (url) {
+      session.page = url;
+    }
     this.sessions.set(id, session);
     return session;
   }
 
   /**
    * endSession - Stop tracking a session
    *
    * @param  {string} portID the portID of the session that just closed
@@ -237,20 +241,21 @@ this.TelemetryFeed = class TelemetryFeed
       addon_version: appInfo.version,
       locale: appInfo.locale,
       user_prefs: this.userPreferences
     };
 
     // If the ping is part of a user session, add session-related info
     if (portID) {
       const session = this.sessions.get(portID) || this.addSession(portID);
-      Object.assign(ping, {
-        session_id: session.session_id,
-        page: session.page
-      });
+      Object.assign(ping, {session_id: session.session_id});
+
+      if (session.page) {
+        Object.assign(ping, {page: session.page});
+      }
     }
     return ping;
   }
 
   /**
    * createImpressionStats - Create a ping for an impression stats
    *
    * @param  {ob} action The object with data to be included in the ping.
@@ -350,17 +355,17 @@ this.TelemetryFeed = class TelemetryFeed
   }
 
   onAction(action) {
     switch (action.type) {
       case at.INIT:
         this.init();
         break;
       case at.NEW_TAB_INIT:
-        this.addSession(au.getPortIdOfSender(action));
+        this.addSession(au.getPortIdOfSender(action), action.data.url);
         break;
       case at.NEW_TAB_UNLOAD:
         this.endSession(au.getPortIdOfSender(action));
         break;
       case at.SAVE_SESSION_PERF_DATA:
         this.saveSessionPerfData(au.getPortIdOfSender(action), action.data);
         break;
       case at.SYSTEM_TICK:
--- a/browser/extensions/activity-stream/lib/TopSitesFeed.jsm
+++ b/browser/extensions/activity-stream/lib/TopSitesFeed.jsm
@@ -52,17 +52,17 @@ this.TopSitesFeed = class TopSitesFeed {
     let screenshot = await Screenshots.getScreenshotForURL(url);
     const action = {type: at.SCREENSHOT_UPDATED, data: {url, screenshot}};
     this.store.dispatch(ac.BroadcastToContent(action));
   }
   async getLinksWithDefaults(action) {
     let frecent = await NewTabUtils.activityStreamLinks.getTopSites();
     const notBlockedDefaultSites = DEFAULT_TOP_SITES.filter(site => !NewTabUtils.blockedLinks.isBlocked({url: site.url}));
     const defaultUrls = notBlockedDefaultSites.map(site => site.url);
-    let pinned = NewTabUtils.pinnedLinks.links;
+    let pinned = this._getPinnedWithData(frecent);
     pinned = pinned.map(site => site && Object.assign({}, site, {
       isDefault: defaultUrls.indexOf(site.url) !== -1,
       hostname: shortURL(site)
     }));
 
     if (!frecent) {
       frecent = [];
     } else {
@@ -117,24 +117,28 @@ this.TopSitesFeed = class TopSitesFeed {
       // Send an update to content so the preloaded tab can get the updated content
       this.store.dispatch(ac.SendToContent(newAction, target));
     } else {
       // Broadcast an update to all open content pages
       this.store.dispatch(ac.BroadcastToContent(newAction));
     }
     this.lastUpdated = Date.now();
   }
-  _getPinnedWithData() {
-    // Augment the pinned links with any other extra data we have for them already in the store
-    const links = this.store.getState().TopSites.rows;
+  _getPinnedWithData(links) {
+    // Augment the pinned links with any other extra data we have for them already in the store.
+    // Alternatively you can pass in some links that you know have data you want the pinned links
+    // to also have. This is useful for start up to make sure pinned links have favicons
+    // (See github ticket #3428 fore more details)
+    let originalLinks = links ? links : this.store.getState().TopSites.rows;
     const pinned = NewTabUtils.pinnedLinks.links;
     return pinned.map(pinnedLink => {
       if (pinnedLink) {
         const hostname = shortURL(pinnedLink);
-        return Object.assign(links.find(link => link && link.url === pinnedLink.url) || {hostname}, pinnedLink);
+        const originalLink = originalLinks.find(link => link && link.url === pinnedLink.url);
+        return Object.assign(pinnedLink, originalLink || {hostname});
       }
       return pinnedLink;
     });
   }
   _broadcastPinnedSitesUpdated() {
     this.store.dispatch(ac.BroadcastToContent({
       type: at.PINNED_SITES_UPDATED,
       data: this._getPinnedWithData()
--- a/browser/extensions/activity-stream/test/schemas/pings.js
+++ b/browser/extensions/activity-stream/test/schemas/pings.js
@@ -2,17 +2,17 @@ const Joi = require("joi-browser");
 const {MAIN_MESSAGE_TYPE, CONTENT_MESSAGE_TYPE} = require("common/Actions.jsm");
 
 const baseKeys = {
   // client_id will be set by PingCentre if it doesn't exist.
   client_id: Joi.string().optional(),
   addon_version: Joi.string().required(),
   locale: Joi.string().required(),
   session_id: Joi.string(),
-  page: Joi.valid(["about:home", "about:newtab"]),
+  page: Joi.valid(["about:home", "about:newtab", "unknown"]),
   user_prefs: Joi.number().integer().required()
 };
 
 const BasePing = Joi.object().keys(baseKeys).options({allowUnknown: true});
 
 const UserEventPing = Joi.object().keys(Object.assign({}, baseKeys, {
   session_id: baseKeys.session_id.required(),
   page: baseKeys.page.required(),
new file mode 100644
--- /dev/null
+++ b/browser/extensions/activity-stream/test/unit/common/PrerenderData.test.js
@@ -0,0 +1,98 @@
+const {PrerenderData, _PrerenderData} = require("common/PrerenderData.jsm");
+
+describe("_PrerenderData", () => {
+  describe("properties", () => {
+    it("should set .initialPrefs", () => {
+      const initialPrefs = {foo: true};
+      const instance = new _PrerenderData({initialPrefs});
+
+      assert.equal(instance.initialPrefs, initialPrefs);
+    });
+    it("should set .initialSections", () => {
+      const initialSections = [{id: "foo"}];
+      const instance = new _PrerenderData({initialSections});
+
+      assert.equal(instance.initialSections, initialSections);
+    });
+    it("should set .validation and .invalidatingPrefs in the constructor", () => {
+      const validation = ["foo", "bar", {oneOf: ["baz", "qux"]}];
+      const instance = new _PrerenderData({validation});
+
+      assert.equal(instance.validation, validation);
+      assert.deepEqual(instance.invalidatingPrefs, ["foo", "bar", "baz", "qux"]);
+    });
+    it("should also set .invalidatingPrefs when .validation is set", () => {
+      const validation = ["foo", "bar", {oneOf: ["baz", "qux"]}];
+      const instance = new _PrerenderData({validation});
+
+      const newValidation = ["foo", {oneOf: ["blah", "gloo"]}];
+      instance.validation = newValidation;
+      assert.equal(instance.validation, newValidation);
+      assert.deepEqual(instance.invalidatingPrefs, ["foo", "blah", "gloo"]);
+    });
+    it("should throw if an invalid validation config is set", () => {
+      // {stuff: []} is not a valid configuration type
+      assert.throws(() => new _PrerenderData({validation: ["foo", {stuff: ["bar"]}]}));
+    });
+  });
+  describe("#arePrefsValid", () => {
+    let FAKE_PREFS;
+    const getPrefs = pref => FAKE_PREFS[pref];
+    beforeEach(() => {
+      FAKE_PREFS = {};
+    });
+    it("should return true if all prefs match", () => {
+      FAKE_PREFS = {foo: true, bar: false};
+      const instance = new _PrerenderData({
+        initialPrefs: FAKE_PREFS,
+        validation: ["foo", "bar"]
+      });
+      assert.isTrue(instance.arePrefsValid(getPrefs));
+    });
+    it("should return true if all *invalidating* prefs match", () => {
+      FAKE_PREFS = {foo: true, bar: false};
+      const instance = new _PrerenderData({
+        initialPrefs: {foo: true, bar: true},
+        validation: ["foo"]
+      });
+
+      assert.isTrue(instance.arePrefsValid(getPrefs));
+    });
+    it("should return true if one each oneOf group matches", () => {
+      FAKE_PREFS = {foo: false, floo: true, bar: false, blar: true};
+      const instance = new _PrerenderData({
+        initialPrefs: {foo: true, floo: true, bar: true, blar: true},
+        validation: [{oneOf: ["foo", "floo"]}, {oneOf: ["bar", "blar"]}]
+      });
+
+      assert.isTrue(instance.arePrefsValid(getPrefs));
+    });
+    it("should return false if an invalidating pref is mismatched", () => {
+      FAKE_PREFS = {foo: true, bar: false};
+      const instance = new _PrerenderData({
+        initialPrefs: {foo: true, bar: true},
+        validation: ["foo", "bar"]
+      });
+
+      assert.isFalse(instance.arePrefsValid(getPrefs));
+    });
+    it("should return false if none of the oneOf group matches", () => {
+      FAKE_PREFS = {foo: true, bar: false, baz: false};
+      const instance = new _PrerenderData({
+        initialPrefs: {foo: true, bar: true, baz: true},
+        validation: ["foo", {oneOf: ["bar", "baz"]}]
+      });
+
+      assert.isFalse(instance.arePrefsValid(getPrefs));
+    });
+  });
+});
+
+// This is the instance used by Activity Stream
+describe("PrerenderData", () => {
+  it("should set initial values for all invalidating prefs", () => {
+    PrerenderData.invalidatingPrefs.forEach(pref => {
+      assert.property(PrerenderData.initialPrefs, pref);
+    });
+  });
+});
--- a/browser/extensions/activity-stream/test/unit/common/Reducers.test.js
+++ b/browser/extensions/activity-stream/test/unit/common/Reducers.test.js
@@ -323,16 +323,40 @@ describe("Reducers", () => {
     });
     it("should set initialized to true on SECTION_UPDATE if rows is defined on action.data", () => {
       const data = {rows: [], id: "foo_bar_2"};
       const action = {type: at.SECTION_UPDATE, data};
       const newState = Sections(oldState, action);
       const updatedSection = newState.find(section => section.id === "foo_bar_2");
       assert.propertyVal(updatedSection, "initialized", true);
     });
+    it("should have no effect on SECTION_UPDATE_CARD if the id or url doesn't exist", () => {
+      const noIdAction = {type: at.SECTION_UPDATE_CARD, data: {id: "non-existent", url: "www.foo.bar", options: {title: "New title"}}};
+      const noIdState = Sections(oldState, noIdAction);
+      const noUrlAction = {type: at.SECTION_UPDATE_CARD, data: {id: "foo_bar_2", url: "www.non-existent.url", options: {title: "New title"}}};
+      const noUrlState = Sections(oldState, noUrlAction);
+      assert.deepEqual(noIdState, oldState);
+      assert.deepEqual(noUrlState, oldState);
+    });
+    it("should update the card with the correct data on SECTION_UPDATE_CARD", () => {
+      const action = {type: at.SECTION_UPDATE_CARD, data: {id: "foo_bar_2", url: "www.other.url", options: {title: "Fake new title"}}};
+      const newState = Sections(oldState, action);
+      const updatedSection = newState.find(section => section.id === "foo_bar_2");
+      const updatedCard = updatedSection.rows.find(card => card.url === "www.other.url");
+      assert.propertyVal(updatedCard, "title", "Fake new title");
+    });
+    it("should only update the cards belonging to the right section on SECTION_UPDATE_CARD", () => {
+      const action = {type: at.SECTION_UPDATE_CARD, data: {id: "foo_bar_2", url: "www.other.url", options: {title: "Fake new title"}}};
+      const newState = Sections(oldState, action);
+      newState.forEach((section, i) => {
+        if (section.id !== "foo_bar_2") {
+          assert.deepEqual(section, oldState[i]);
+        }
+      });
+    });
     it("should allow action.data to set .initialized", () => {
       const data = {rows: [], initialized: false, id: "foo_bar_2"};
       const action = {type: at.SECTION_UPDATE, data};
       const newState = Sections(oldState, action);
       const updatedSection = newState.find(section => section.id === "foo_bar_2");
       assert.propertyVal(updatedSection, "initialized", false);
     });
     it("should remove blocked and deleted urls from all rows in all sections", () => {
--- a/browser/extensions/activity-stream/test/unit/lib/ActivityStreamMessageChannel.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/ActivityStreamMessageChannel.test.js
@@ -77,23 +77,32 @@ describe("ActivityStreamMessageChannel",
       });
       it("should not override AboutNewTab if the pageURL is not about:newtab", () => {
         mm = new ActivityStreamMessageChannel({pageURL: "foo.html"});
         mm.createChannel();
         assert.notCalled(global.AboutNewTab.override);
       });
       it("should simluate init for existing ports", () => {
         sinon.stub(mm, "onActionFromContent");
-        RPmessagePorts.push({loaded: false, portID: "inited"});
-        RPmessagePorts.push({loaded: true, portID: "loaded"});
+
+        RPmessagePorts.push({
+          url: "about:monkeys",
+          loaded: false,
+          portID: "inited"
+        });
+        RPmessagePorts.push({
+          url: "about:sheep",
+          loaded: true,
+          portID: "loaded"
+        });
 
         mm.createChannel();
 
-        assert.calledWith(mm.onActionFromContent.firstCall, {type: at.NEW_TAB_INIT}, "inited");
-        assert.calledWith(mm.onActionFromContent.secondCall, {type: at.NEW_TAB_INIT}, "loaded");
+        assert.calledWith(mm.onActionFromContent.firstCall, {type: at.NEW_TAB_INIT, data: {url: "about:monkeys"}}, "inited");
+        assert.calledWith(mm.onActionFromContent.secondCall, {type: at.NEW_TAB_INIT, data: {url: "about:sheep"}}, "loaded");
       });
       it("should simluate load for loaded ports", () => {
         sinon.stub(mm, "onActionFromContent");
         RPmessagePorts.push({loaded: true, portID: "foo"});
 
         mm.createChannel();
 
         assert.calledWith(mm.onActionFromContent, {type: at.NEW_TAB_LOAD}, "foo");
@@ -141,20 +150,25 @@ describe("ActivityStreamMessageChannel",
         const t = {portID: "foo"};
         mm.createChannel();
         mm.channel.messagePorts.push(t);
         assert.equal(mm.getTargetById("bar"), null);
       });
     });
     describe("#onNewTabInit", () => {
       it("should dispatch a NEW_TAB_INIT action", () => {
-        const t = {portID: "foo"};
+        const t = {portID: "foo", url: "about:monkeys"};
         sinon.stub(mm, "onActionFromContent");
+
         mm.onNewTabInit({target: t});
-        assert.calledWith(mm.onActionFromContent, {type: at.NEW_TAB_INIT}, "foo");
+
+        assert.calledWith(mm.onActionFromContent, {
+          type: at.NEW_TAB_INIT,
+          data: {url: "about:monkeys"}
+        }, "foo");
       });
     });
     describe("#onNewTabLoad", () => {
       it("should dispatch a NEW_TAB_LOAD action", () => {
         const t = {portID: "foo"};
         sinon.stub(mm, "onActionFromContent");
         mm.onNewTabLoad({target: t});
         assert.calledWith(mm.onActionFromContent, {type: at.NEW_TAB_LOAD}, "foo");
@@ -240,16 +254,27 @@ describe("ActivityStreamMessageChannel",
       let store;
       beforeEach(() => {
         store = createStore(addNumberReducer, applyMiddleware(mm.middleware));
       });
       it("should just call next if no channel is found", () => {
         store.dispatch({type: "ADD", data: 10});
         assert.equal(store.getState(), 10);
       });
+      it("should not call next if skipMain is true", () => {
+        store.dispatch({type: "ADD", data: 10, meta: {skipMain: true}});
+        assert.equal(store.getState(), 0);
+
+        sinon.stub(mm, "send");
+        const action = ac.SendToContent({type: "ADD", data: 10, meta: {skipMain: true}}, "foo");
+        mm.createChannel();
+        store.dispatch(action);
+        assert.calledWith(mm.send, action);
+        assert.equal(store.getState(), 0);
+      });
       it("should call .send if the action is SendToContent", () => {
         sinon.stub(mm, "send");
         const action = ac.SendToContent({type: "FOO"}, "foo");
 
         mm.createChannel();
         store.dispatch(action);
 
         assert.calledWith(mm.send, action);
--- a/browser/extensions/activity-stream/test/unit/lib/HighlightsFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/HighlightsFeed.test.js
@@ -1,45 +1,50 @@
 "use strict";
 const injector = require("inject!lib/HighlightsFeed.jsm");
 const {GlobalOverrider} = require("test/unit/utils");
 const {actionTypes: at} = require("common/Actions.jsm");
 const {Dedupe} = require("common/Dedupe.jsm");
 
 const FAKE_LINKS = new Array(9).fill(null).map((v, i) => ({url: `http://www.site${i}.com`}));
+const FAKE_IMAGE = "data123";
 
-describe("Top Sites Feed", () => {
+describe("Highlights Feed", () => {
   let HighlightsFeed;
   let HIGHLIGHTS_UPDATE_TIME;
   let SECTION_ID;
   let feed;
   let globals;
   let sandbox;
   let links;
   let clock;
+  let fakeScreenshot;
   let fakeNewTabUtils;
   let sectionsManagerStub;
   let shortURLStub;
 
   beforeEach(() => {
     globals = new GlobalOverrider();
     sandbox = globals.sandbox;
     fakeNewTabUtils = {activityStreamLinks: {getHighlights: sandbox.spy(() => Promise.resolve(links))}};
     sectionsManagerStub = {
       onceInitialized: sinon.stub().callsFake(callback => callback()),
       enableSection: sinon.spy(),
       disableSection: sinon.spy(),
       updateSection: sinon.spy(),
+      updateSectionCard: sinon.spy(),
       sections: new Map([["highlights", {}]])
     };
+    fakeScreenshot = {getScreenshotForURL: sandbox.spy(() => Promise.resolve(FAKE_IMAGE))};
     shortURLStub = sinon.stub().callsFake(site => site.url.match(/\/([^/]+)/)[1]);
     globals.set("NewTabUtils", fakeNewTabUtils);
     ({HighlightsFeed, HIGHLIGHTS_UPDATE_TIME, SECTION_ID} = injector({
       "lib/ShortURL.jsm": {shortURL: shortURLStub},
       "lib/SectionsManager.jsm": {SectionsManager: sectionsManagerStub},
+      "lib/Screenshots.jsm": {Screenshots: fakeScreenshot},
       "common/Dedupe.jsm": {Dedupe}
     }));
     feed = new HighlightsFeed();
     feed.store = {dispatch: sinon.spy(), getState() { return {TopSites: {rows: Array(12).fill(null).map((v, i) => ({url: `http://www.topsite${i}.com`}))}}; }};
     links = FAKE_LINKS;
     clock = sinon.useFakeTimers();
   });
   afterEach(() => {
@@ -64,21 +69,34 @@ describe("Top Sites Feed", () => {
       feed.fetchHighlights = sinon.spy();
 
       feed.onAction({type: at.INIT});
 
       assert.notCalled(feed.fetchHighlights);
     });
   });
   describe("#fetchHighlights", () => {
-    it("should add hostname and image to each link", async () => {
-      links = [{url: "https://mozilla.org", preview_image_url: "https://mozilla.org/preview.jog"}];
+    it("should add hostname and hasImage to each link", async () => {
+      links = [{url: "https://mozilla.org"}];
       await feed.fetchHighlights();
       assert.equal(feed.highlights[0].hostname, "mozilla.org");
-      assert.equal(feed.highlights[0].image, links[0].preview_image_url);
+      assert.equal(feed.highlights[0].hasImage, true);
+    });
+    it("should add the image from the imageCache if it exists to the link", async () => {
+      links = [{url: "https://mozilla.org", preview_image_url: "https://mozilla.org/preview.jog"}];
+      feed.imageCache = new Map([["https://mozilla.org", FAKE_IMAGE]]);
+      await feed.fetchHighlights();
+      assert.equal(feed.highlights[0].image, FAKE_IMAGE);
+    });
+    it("should call fetchImage with the correct arguments for each link", async () => {
+      links = [{url: "https://mozilla.org", preview_image_url: "https://mozilla.org/preview.jog"}];
+      sinon.spy(feed, "fetchImage");
+      await feed.fetchHighlights();
+      assert.calledOnce(feed.fetchImage);
+      assert.calledWith(feed.fetchImage, links[0].url, links[0].preview_image_url);
     });
     it("should not include any links already in Top Sites", async () => {
       links = [
         {url: "https://mozilla.org"},
         {url: "http://www.topsite0.com"},
         {url: "http://www.topsite1.com"},
         {url: "http://www.topsite2.com"}
       ];
@@ -110,16 +128,48 @@ describe("Top Sites Feed", () => {
       assert.deepEqual(feed.highlights[0], links[0]);
       assert.deepEqual(feed.highlights[1], links[2]);
     });
     it("should set type to bookmark if there is a bookmarkGuid", async () => {
       links = [{url: "https://mozilla.org", type: "history", bookmarkGuid: "1234567890"}];
       await feed.fetchHighlights();
       assert.equal(feed.highlights[0].type, "bookmark");
     });
+    it("should clear the imageCache at the end", async () => {
+      links = [{url: "https://mozilla.org", preview_image_url: "https://mozilla.org/preview.jpg"}];
+      feed.imageCache = new Map([["https://mozilla.org", FAKE_IMAGE]]);
+      // Stops fetchImage adding to the cache
+      feed.fetchImage = () => {};
+      await feed.fetchHighlights();
+      assert.equal(feed.imageCache.size, 0);
+    });
+  });
+  describe("#fetchImage", () => {
+    const FAKE_URL = "https://mozilla.org";
+    const FAKE_IMAGE_URL = "https://mozilla.org/preview.jpg";
+    it("should capture the image, if available", async () => {
+      await feed.fetchImage(FAKE_URL, FAKE_IMAGE_URL);
+      assert.calledOnce(fakeScreenshot.getScreenshotForURL);
+      assert.calledWith(fakeScreenshot.getScreenshotForURL, FAKE_IMAGE_URL);
+    });
+    it("should fall back to capturing a screenshot", async () => {
+      await feed.fetchImage(FAKE_URL, undefined);
+      assert.calledOnce(fakeScreenshot.getScreenshotForURL);
+      assert.calledWith(fakeScreenshot.getScreenshotForURL, FAKE_URL);
+    });
+    it("should store the image in the imageCache", async () => {
+      feed.imageCache.clear();
+      await feed.fetchImage(FAKE_URL, FAKE_IMAGE_URL);
+      assert.equal(feed.imageCache.get(FAKE_URL), FAKE_IMAGE);
+    });
+    it("should call SectionsManager.updateSectionCard with the right arguments", async () => {
+      await feed.fetchImage(FAKE_URL, FAKE_IMAGE_URL);
+      assert.calledOnce(sectionsManagerStub.updateSectionCard);
+      assert.calledWith(sectionsManagerStub.updateSectionCard, "highlights", FAKE_URL, {image: FAKE_IMAGE}, true);
+    });
   });
   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/PrefsFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/PrefsFeed.test.js
@@ -52,35 +52,35 @@ describe("PrefsFeed", () => {
     });
     it("should set prerender pref to true if prefs match initial values", () => {
       Object.keys(initialPrefs).forEach(name => FAKE_PREFS.set(name, initialPrefs[name]));
       feed.onAction({type: at.INIT});
       assert.calledWith(feed._prefs.set, PRERENDER_PREF_NAME, true);
     });
     it("should set prerender pref to false if a pref does not match its initial value", () => {
       Object.keys(initialPrefs).forEach(name => FAKE_PREFS.set(name, initialPrefs[name]));
-      FAKE_PREFS.set("feeds.section.topstories", false);
+      FAKE_PREFS.set("showSearch", false);
       feed.onAction({type: at.INIT});
       assert.calledWith(feed._prefs.set, PRERENDER_PREF_NAME, false);
     });
   });
   describe("onPrefChanged prerendering", () => {
     it("should not change the prerender pref if the pref is not included in invalidatingPrefs", () => {
       feed.onPrefChanged("foo123", true);
       assert.notCalled(feed._prefs.set);
     });
     it("should set the prerender pref to false if a pref in invalidatingPrefs is changed from its original value", () => {
       Object.keys(initialPrefs).forEach(name => FAKE_PREFS.set(name, initialPrefs[name]));
 
-      feed._prefs.set("feeds.section.topstories", false);
-      feed.onPrefChanged("feeds.section.topstories", false);
+      feed._prefs.set("showSearch", false);
+      feed.onPrefChanged("showSearch", false);
       assert.calledWith(feed._prefs.set, PRERENDER_PREF_NAME, false);
     });
     it("should set the prerender pref back to true if the invalidatingPrefs are changed back to their original values", () => {
       Object.keys(initialPrefs).forEach(name => FAKE_PREFS.set(name, initialPrefs[name]));
-      FAKE_PREFS.set("feeds.section.topstories", false);
+      FAKE_PREFS.set("showSearch", false);
 
-      feed._prefs.set("feeds.section.topstories", true);
-      feed.onPrefChanged("feeds.section.topstories", true);
+      feed._prefs.set("showSearch", true);
+      feed.onPrefChanged("showSearch", true);
       assert.calledWith(feed._prefs.set, PRERENDER_PREF_NAME, true);
     });
   });
 });
--- a/browser/extensions/activity-stream/test/unit/lib/SectionsManager.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/SectionsManager.test.js
@@ -1,16 +1,18 @@
 "use strict";
 const {SectionsFeed, SectionsManager} = require("lib/SectionsManager.jsm");
 const {EventEmitter, GlobalOverrider} = require("test/unit/utils");
 const {MAIN_MESSAGE_TYPE, CONTENT_MESSAGE_TYPE} = require("common/Actions.jsm");
 
 const FAKE_ID = "FAKE_ID";
 const FAKE_OPTIONS = {icon: "FAKE_ICON", title: "FAKE_TITLE"};
-const FAKE_ROWS = [{url: "1"}, {url: "2"}, {"url": "3"}];
+const FAKE_ROWS = [{url: "1.example.com"}, {url: "2.example.com"}, {"url": "3.example.com"}];
+const FAKE_URL = "2.example.com";
+const FAKE_CARD_OPTIONS = {title: "Some fake title"};
 
 describe("SectionsManager", () => {
   let globals;
   let fakeServices;
 
   beforeEach(() => {
     globals = new GlobalOverrider();
     fakeServices = {prefs: {getBoolPref: sinon.spy(), addObserver: sinon.spy(), removeObserver: sinon.spy()}};
@@ -178,16 +180,34 @@ describe("SectionsManager", () => {
       SectionsManager.initialized = false;
       sinon.spy(SectionsManager, "once");
       const callback = () => {};
       SectionsManager.onceInitialized(callback);
       assert.calledOnce(SectionsManager.once);
       assert.calledWith(SectionsManager.once, SectionsManager.INIT, callback);
     });
   });
+  describe("#updateSectionCard", () => {
+    it("should emit an UPDATE_SECTION_CARD event with correct arguments", () => {
+      SectionsManager.addSection(FAKE_ID, Object.assign({}, FAKE_OPTIONS, {rows: FAKE_ROWS}));
+      const spy = sinon.spy();
+      SectionsManager.on(SectionsManager.UPDATE_SECTION_CARD, spy);
+      SectionsManager.updateSectionCard(FAKE_ID, FAKE_URL, FAKE_CARD_OPTIONS, true);
+      assert.calledOnce(spy);
+      assert.calledWith(spy, SectionsManager.UPDATE_SECTION_CARD, FAKE_ID,
+        FAKE_URL, FAKE_CARD_OPTIONS, true);
+    });
+    it("should do nothing if the section doesn't exist", () => {
+      SectionsManager.removeSection(FAKE_ID);
+      const spy = sinon.spy();
+      SectionsManager.on(SectionsManager.UPDATE_SECTION_CARD, spy);
+      SectionsManager.updateSectionCard(FAKE_ID, FAKE_URL, FAKE_CARD_OPTIONS, true);
+      assert.notCalled(spy);
+    });
+  });
 });
 
 describe("SectionsFeed", () => {
   let feed;
 
   beforeEach(() => {
     SectionsManager.sections.clear();
     SectionsManager.initialized = false;
@@ -199,21 +219,22 @@ describe("SectionsFeed", () => {
   });
   describe("#init", () => {
     it("should create a SectionsFeed", () => {
       assert.instanceOf(feed, SectionsFeed);
     });
     it("should bind appropriate listeners", () => {
       sinon.spy(SectionsManager, "on");
       feed.init();
-      assert.calledThrice(SectionsManager.on);
+      assert.callCount(SectionsManager.on, 4);
       for (const [event, listener] of [
         [SectionsManager.ADD_SECTION, feed.onAddSection],
         [SectionsManager.REMOVE_SECTION, feed.onRemoveSection],
-        [SectionsManager.UPDATE_SECTION, feed.onUpdateSection]
+        [SectionsManager.UPDATE_SECTION, feed.onUpdateSection],
+        [SectionsManager.UPDATE_SECTION_CARD, feed.onUpdateSectionCard]
       ]) {
         assert.calledWith(SectionsManager.on, event, listener);
       }
     });
     it("should call onAddSection for any already added sections in SectionsManager", () => {
       SectionsManager.init();
       assert.ok(SectionsManager.sections.has("topstories"));
       assert.ok(SectionsManager.sections.has("highlights"));
@@ -226,21 +247,22 @@ describe("SectionsFeed", () => {
       assert.calledWith(feed.onAddSection, SectionsManager.ADD_SECTION, "highlights", highlights);
     });
   });
   describe("#uninit", () => {
     it("should unbind all listeners", () => {
       sinon.spy(SectionsManager, "off");
       feed.init();
       feed.uninit();
-      assert.calledThrice(SectionsManager.off);
+      assert.callCount(SectionsManager.off, 4);
       for (const [event, listener] of [
         [SectionsManager.ADD_SECTION, feed.onAddSection],
         [SectionsManager.REMOVE_SECTION, feed.onRemoveSection],
-        [SectionsManager.UPDATE_SECTION, feed.onUpdateSection]
+        [SectionsManager.UPDATE_SECTION, feed.onUpdateSection],
+        [SectionsManager.UPDATE_SECTION_CARD, feed.onUpdateSectionCard]
       ]) {
         assert.calledWith(SectionsManager.off, event, listener);
       }
     });
     it("should emit an UNINIT event and set SectionsManager.initialized to false", () => {
       const spy = sinon.spy();
       SectionsManager.on(SectionsManager.UNINIT, spy);
       feed.init();
@@ -266,17 +288,17 @@ describe("SectionsFeed", () => {
       assert.equal(action.type, "SECTION_DEREGISTER");
       assert.deepEqual(action.data, FAKE_ID);
       // Should be broadcast
       assert.equal(action.meta.from, MAIN_MESSAGE_TYPE);
       assert.equal(action.meta.to, CONTENT_MESSAGE_TYPE);
     });
   });
   describe("#onUpdateSection", () => {
-    it("should do nothing if no rows are provided", () => {
+    it("should do nothing if no options are provided", () => {
       feed.onUpdateSection(null, FAKE_ID, null);
       assert.notCalled(feed.store.dispatch);
     });
     it("should dispatch a SECTION_UPDATE action with the correct data", () => {
       feed.onUpdateSection(null, FAKE_ID, {rows: FAKE_ROWS});
       const action = feed.store.dispatch.firstCall.args[0];
       assert.equal(action.type, "SECTION_UPDATE");
       assert.deepEqual(action.data, {id: FAKE_ID, rows: FAKE_ROWS});
@@ -286,16 +308,37 @@ describe("SectionsFeed", () => {
     it("should broadcast the action only if shouldBroadcast is true", () => {
       feed.onUpdateSection(null, FAKE_ID, {rows: FAKE_ROWS}, true);
       const action = feed.store.dispatch.firstCall.args[0];
       // Should be broadcast
       assert.equal(action.meta.from, MAIN_MESSAGE_TYPE);
       assert.equal(action.meta.to, CONTENT_MESSAGE_TYPE);
     });
   });
+  describe("#onUpdateSectionCard", () => {
+    it("should do nothing if no options are provided", () => {
+      feed.onUpdateSectionCard(null, FAKE_ID, FAKE_URL, null);
+      assert.notCalled(feed.store.dispatch);
+    });
+    it("should dispatch a SECTION_UPDATE_CARD action with the correct data", () => {
+      feed.onUpdateSectionCard(null, FAKE_ID, FAKE_URL, FAKE_CARD_OPTIONS);
+      const action = feed.store.dispatch.firstCall.args[0];
+      assert.equal(action.type, "SECTION_UPDATE_CARD");
+      assert.deepEqual(action.data, {id: FAKE_ID, url: FAKE_URL, options: FAKE_CARD_OPTIONS});
+      // Should be not broadcast by default, so meta should not exist
+      assert.notOk(action.meta);
+    });
+    it("should broadcast the action only if shouldBroadcast is true", () => {
+      feed.onUpdateSectionCard(null, FAKE_ID, FAKE_URL, FAKE_CARD_OPTIONS, true);
+      const action = feed.store.dispatch.firstCall.args[0];
+      // Should be broadcast
+      assert.equal(action.meta.from, MAIN_MESSAGE_TYPE);
+      assert.equal(action.meta.to, CONTENT_MESSAGE_TYPE);
+    });
+  });
   describe("#onAction", () => {
     it("should bind this.init to SectionsManager.INIT on INIT", () => {
       sinon.spy(SectionsManager, "once");
       feed.onAction({type: "INIT"});
       assert.calledOnce(SectionsManager.once);
       assert.calledWith(SectionsManager.once, SectionsManager.INIT, feed.init);
     });
     it("should call SectionsManager.init on action PREFS_INITIAL_VALUES", () => {
--- a/browser/extensions/activity-stream/test/unit/lib/TelemetryFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/TelemetryFeed.test.js
@@ -94,20 +94,25 @@ describe("TelemetryFeed", () => {
     it("should set the session_id", () => {
       sandbox.spy(global.gUUIDGenerator, "generateUUID");
 
       const session = instance.addSession("foo");
 
       assert.calledOnce(global.gUUIDGenerator.generateUUID);
       assert.equal(session.session_id, global.gUUIDGenerator.generateUUID.firstCall.returnValue);
     });
-    it("should set the page", () => {
+    it("should set the page if a url parameter is given", () => {
+      const session = instance.addSession("foo", "about:monkeys");
+
+      assert.propertyVal(session, "page", "about:monkeys");
+    });
+    it("should set the page prop to 'unknown' if no URL parameter given", () => {
       const session = instance.addSession("foo");
 
-      assert.equal(session.page, "about:newtab"); // This is hardcoded for now.
+      assert.propertyVal(session, "page", "unknown");
     });
     it("should set the perf type when lacking timestamp", () => {
       const session = instance.addSession("foo");
 
       assert.propertyVal(session.perf, "load_trigger_type", "unexpected");
     });
   });
   describe("#browserOpenNewtabStart", () => {
@@ -173,36 +178,37 @@ describe("TelemetryFeed", () => {
       }
       instance.init();
     });
     describe("#createPing", () => {
       it("should create a valid base ping without a session if no portID is supplied", async () => {
         const ping = await instance.createPing();
         assert.validate(ping, BasePing);
         assert.notProperty(ping, "session_id");
+        assert.notProperty(ping, "page");
       });
       it("should create a valid base ping with session info if a portID is supplied", async () => {
         // Add a session
         const portID = "foo";
-        instance.addSession(portID);
+        instance.addSession(portID, "about:home");
         const sessionID = instance.sessions.get(portID).session_id;
 
         // Create a ping referencing the session
         const ping = await instance.createPing(portID);
         assert.validate(ping, BasePing);
 
         // Make sure we added the right session-related stuff to the ping
         assert.propertyVal(ping, "session_id", sessionID);
-        assert.propertyVal(ping, "page", "about:newtab");
+        assert.propertyVal(ping, "page", "about:home");
       });
       it("should create an unexpected base ping if no session yet portID is supplied", async () => {
         const ping = await instance.createPing("foo");
 
         assert.validate(ping, BasePing);
-        assert.propertyVal(ping, "page", "about:newtab");
+        assert.propertyVal(ping, "page", "unknown");
         assert.propertyVal(instance.sessions.get("foo").perf, "load_trigger_type", "unexpected");
       });
       it("should create a base ping with user_prefs", async () => {
         const ping = await instance.createPing("foo");
         assert.validate(ping, BasePing);
         assert.propertyVal(ping, "user_prefs", expectedUserPrefs);
       });
     });
@@ -485,21 +491,21 @@ describe("TelemetryFeed", () => {
       assert.calledOnce(stub);
     });
     it("should call .addSession() on a NEW_TAB_INIT action", () => {
       const stub = sandbox.stub(instance, "addSession");
       sandbox.stub(instance, "setLoadTriggerInfo");
 
       instance.onAction(ac.SendToMain({
         type: at.NEW_TAB_INIT,
-        data: {}
+        data: {url: "about:monkeys"}
       }, "port123"));
 
       assert.calledOnce(stub);
-      assert.calledWith(stub, "port123");
+      assert.calledWith(stub, "port123", "about:monkeys");
     });
     it("should call .endSession() on a NEW_TAB_UNLOAD action", () => {
       const stub = sandbox.stub(instance, "endSession");
       instance.onAction(ac.SendToMain({type: at.NEW_TAB_UNLOAD}, "port123"));
       assert.calledWith(stub, "port123");
     });
     it("should call .saveSessionPerfData on SAVE_SESSION_PERF_DATA", () => {
       const stub = sandbox.stub(instance, "saveSessionPerfData");
--- a/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js
@@ -380,16 +380,27 @@ describe("Top Sites Feed", () => {
       };
       feed.onAction(pinAction);
       assert.calledOnce(feed.store.dispatch);
       assert.calledWith(feed.store.dispatch, ac.BroadcastToContent({
         type: at.PINNED_SITES_UPDATED,
         data: [Object.assign({}, site1, {hostname: "foo.com"})]
       }));
     });
+    it("should compare against links if available, instead of getting from store", () => {
+      const frecentSite = {url: "foo.com", faviconSize: 32, favicon: "favicon.png"};
+      const pinnedSite1 = {url: "bar.com"};
+      const pinnedSite2 = {url: "foo.com"};
+      fakeNewTabUtils.pinnedLinks.links = [pinnedSite1, pinnedSite2];
+      feed.store = {getState() { return {TopSites: {rows: sinon.spy()}}; }};
+      let result = feed._getPinnedWithData([frecentSite]);
+      assert.deepEqual(result[0], pinnedSite1);
+      assert.deepEqual(result[1], Object.assign({}, frecentSite, pinnedSite2));
+      assert.notCalled(feed.store.getState().TopSites.rows);
+    });
     it("should call unpin with correct parameters on TOP_SITES_UNPIN", () => {
       fakeNewTabUtils.pinnedLinks.links = [null, null, {url: "foo.com"}, null, null, null, null, null, FAKE_LINKS[0]];
       const unpinAction = {
         type: at.TOP_SITES_UNPIN,
         data: {site: {url: "foo.com"}}
       };
       feed.onAction(unpinAction);
       assert.calledOnce(fakeNewTabUtils.pinnedLinks.unpin);
--- a/browser/extensions/formautofill/FormAutofillPreferences.jsm
+++ b/browser/extensions/formautofill/FormAutofillPreferences.jsm
@@ -58,57 +58,76 @@ FormAutofillPreferences.prototype = {
   /**
    * Create Form Autofill preference group
    *
    * @param  {XULDocument} document
    */
   createPreferenceGroup(document) {
     let formAutofillGroup = document.createElementNS(XUL_NS, "vbox");
     let addressAutofill = document.createElementNS(XUL_NS, "hbox");
+    let addressAutofillCheckboxGroup = document.createElementNS(XUL_NS, "description");
     let addressAutofillCheckbox = document.createElementNS(XUL_NS, "checkbox");
+    let addressAutofillLearnMore = document.createElementNS(XUL_NS, "label");
     let savedAddressesBtn = document.createElementNS(XUL_NS, "button");
     let creditCardAutofill = document.createElementNS(XUL_NS, "hbox");
+    let creditCardAutofillCheckboxGroup = document.createElementNS(XUL_NS, "description");
     let creditCardAutofillCheckbox = document.createElementNS(XUL_NS, "checkbox");
+    let creditCardAutofillLearnMore = document.createElementNS(XUL_NS, "label");
     let savedCreditCardsBtn = document.createElementNS(XUL_NS, "button");
 
     savedAddressesBtn.className = "accessory-button";
     savedCreditCardsBtn.className = "accessory-button";
+    addressAutofillLearnMore.className = "learnMore text-link";
+    creditCardAutofillLearnMore.className = "learnMore text-link";
 
     this.refs = {
       formAutofillGroup,
       addressAutofillCheckbox,
       savedAddressesBtn,
       creditCardAutofillCheckbox,
       savedCreditCardsBtn,
     };
 
     formAutofillGroup.id = "formAutofillGroup";
     addressAutofill.id = "addressAutofill";
+    addressAutofillLearnMore.id = "addressAutofillLearnMore";
+    creditCardAutofill.id = "creditCardAutofill";
+    creditCardAutofillLearnMore.id = "creditCardAutofillLearnMore";
+
+    addressAutofillLearnMore.setAttribute("value", this.bundle.GetStringFromName("learnMore"));
     addressAutofillCheckbox.setAttribute("label", this.bundle.GetStringFromName("enableAddressAutofill"));
     savedAddressesBtn.setAttribute("label", this.bundle.GetStringFromName("savedAddresses"));
-    creditCardAutofill.id = "creditCardAutofill";
+    creditCardAutofillLearnMore.setAttribute("value", this.bundle.GetStringFromName("learnMore"));
     creditCardAutofillCheckbox.setAttribute("label", this.bundle.GetStringFromName("enableCreditCardAutofill"));
     savedCreditCardsBtn.setAttribute("label", this.bundle.GetStringFromName("savedCreditCards"));
 
+    let learnMoreURL = Services.urlFormatter.formatURLPref("app.support.baseURL") + "autofill-card-address";
+    addressAutofillLearnMore.setAttribute("href", learnMoreURL);
+    creditCardAutofillLearnMore.setAttribute("href", learnMoreURL);
+
     // Manually set the checked state
     if (FormAutofillUtils.isAutofillAddressesEnabled) {
       addressAutofillCheckbox.setAttribute("checked", true);
     }
     if (FormAutofillUtils.isAutofillCreditCardsEnabled) {
       creditCardAutofillCheckbox.setAttribute("checked", true);
     }
 
-    addressAutofillCheckbox.flex = 1;
-    creditCardAutofillCheckbox.flex = 1;
+    addressAutofillCheckboxGroup.flex = 1;
+    creditCardAutofillCheckboxGroup.flex = 1;
 
     formAutofillGroup.appendChild(addressAutofill);
-    addressAutofill.appendChild(addressAutofillCheckbox);
+    addressAutofill.appendChild(addressAutofillCheckboxGroup);
+    addressAutofillCheckboxGroup.appendChild(addressAutofillCheckbox);
+    addressAutofillCheckboxGroup.appendChild(addressAutofillLearnMore);
     addressAutofill.appendChild(savedAddressesBtn);
     formAutofillGroup.appendChild(creditCardAutofill);
-    creditCardAutofill.appendChild(creditCardAutofillCheckbox);
+    creditCardAutofill.appendChild(creditCardAutofillCheckboxGroup);
+    creditCardAutofillCheckboxGroup.appendChild(creditCardAutofillCheckbox);
+    creditCardAutofillCheckboxGroup.appendChild(creditCardAutofillLearnMore);
     creditCardAutofill.appendChild(savedCreditCardsBtn);
   },
 
   /**
    * Handle events
    *
    * @param  {DOMEvent} event
    */
--- a/browser/extensions/formautofill/content/manageDialog.css
+++ b/browser/extensions/formautofill/content/manageDialog.css
@@ -41,18 +41,18 @@ option:nth-child(even) {
   border-top: none;
   border-radius: 0 0 2px 2px;
 }
 
 #addresses > option,
 #credit-cards > option {
   display: flex;
   align-items: center;
-  height: 1.3em;
-  padding-inline-start: 0.7em;
+  height: 1.6em;
+  padding-inline-start: 0.6em;
 }
 
 #controls-container {
   flex: 0 1 100%;
   justify-content: end;
   font-size: 0.9em;
   margin-top: 1em;
 }
--- a/browser/extensions/formautofill/locales/en-US/formautofill.properties
+++ b/browser/extensions/formautofill/locales/en-US/formautofill.properties
@@ -1,14 +1,15 @@
 # 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/.
 
 preferenceGroupTitle = Form Autofill
 enableAddressAutofill = Autofill addresses
+learnMore = Learn more
 savedAddresses = Saved Addresses…
 enableCreditCardAutofill = Autofill credit cards
 savedCreditCards = Saved Credit Cards…
 saveAddressesMessage = Firefox now saves addresses so you can fill out forms faster.
 autofillOptionsLink = Form Autofill Options
 autofillSecurityOptionsLink = Form Autofill & Security Options
 changeAutofillOptions = Change Form Autofill Options
 autofillOptionsLinkOSX = Form Autofill Preferences
--- a/browser/extensions/formautofill/skin/shared/editAddress.css
+++ b/browser/extensions/formautofill/skin/shared/editAddress.css
@@ -13,16 +13,17 @@ select {
   margin: 0;
 }
 
 #given-name-container,
 #additional-name-container,
 #address-level1-container,
 #postal-code-container,
 #country-container,
+#country-warning-message,
 #family-name-container,
 #organization-container,
 #address-level2-container,
 #tel-container {
   flex: 0 1 50%;
 }
 
 #family-name-container,
@@ -38,15 +39,15 @@ select {
 }
 
 #street-address,
 #email {
   flex: 1 0 auto;
 }
 
 #country-warning-message {
+  box-sizing: border-box;
   font-size: 1rem;
-  flex: 1 0 auto;
   align-items: center;
   text-align: start;
   color: #737373;
   padding-inline-start: 1em;
 }
--- a/browser/extensions/formautofill/test/browser/browser_privacyPreferences.js
+++ b/browser/extensions/formautofill/test/browser/browser_privacyPreferences.js
@@ -3,16 +3,18 @@
 const PAGE_PREFS = "about:preferences";
 const PAGE_PRIVACY = PAGE_PREFS + "#privacy";
 const SELECTORS = {
   group: "#passwordsGroup",
   addressAutofillCheckbox: "#addressAutofill checkbox",
   creditCardAutofillCheckbox: "#creditCardAutofill checkbox",
   savedAddressesBtn: "#addressAutofill button",
   savedCreditCardsBtn: "#creditCardAutofill button",
+  addressAutofillLearnMore: "#addressAutofillLearnMore",
+  creditCardAutofillLearnMore: "#creditCardAutofillLearnMore",
 };
 
 // Visibility of form autofill group should be hidden when opening
 // preferences page.
 add_task(async function test_aboutPreferences() {
   let finalPrefPaneLoaded = TestUtils.topicObserved("sync-pane-loaded", () => true);
   await BrowserTestUtils.withNewTab({gBrowser, url: PAGE_PREFS}, async function(browser) {
     await finalPrefPaneLoaded;
@@ -31,16 +33,20 @@ add_task(async function test_aboutPrefer
     await finalPrefPaneLoaded;
     await ContentTask.spawn(browser, SELECTORS, (selectors) => {
       is(content.document.querySelector(selectors.group).hidden, false,
         "Form Autofill group should be visible");
       is(content.document.querySelector(selectors.addressAutofillCheckbox).checked, true,
         "Autofill addresses checkbox should be checked");
       is(content.document.querySelector(selectors.creditCardAutofillCheckbox).checked, true,
         "Autofill credit cards checkbox should be checked");
+      ok(content.document.querySelector(selectors.addressAutofillLearnMore).href.includes("autofill-card-address"),
+        "Autofill addresses learn more link should contain autofill-card-address");
+      ok(content.document.querySelector(selectors.creditCardAutofillLearnMore).href.includes("autofill-card-address"),
+        "Autofill credit cards learn more link should contain autofill-card-address");
     });
   });
 });
 
 add_task(async function test_openManageAutofillDialogs() {
   let finalPrefPaneLoaded = TestUtils.topicObserved("sync-pane-loaded", () => true);
   await BrowserTestUtils.withNewTab({gBrowser, url: PAGE_PRIVACY}, async function(browser) {
     await finalPrefPaneLoaded;
--- a/browser/extensions/formautofill/test/unit/test_masterPassword.js
+++ b/browser/extensions/formautofill/test/unit/test_masterPassword.js
@@ -33,17 +33,17 @@ let gMockPrompter = {
   // where in the context of the arrow function, |this != gMockPrompter| due to
   // how objects get wrapped when going across xpcom boundaries.
   promptPassword(dialogTitle, text, password, checkMsg, checkValue) {
     this.numPrompts++;
     if (this.numPrompts > 1) { // don't keep retrying a bad password
       return false;
     }
     equal(text,
-          "Please enter the master password for the Software Security Device.",
+          "Please enter your master password.",
           "password prompt text should be as expected");
     equal(checkMsg, null, "checkMsg should be null");
     ok(this.passwordToTry, "passwordToTry should be non-null");
     password.value = this.passwordToTry;
     return true;
   },
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIPrompt]),
--- a/browser/extensions/onboarding/OnboardingTourType.jsm
+++ b/browser/extensions/onboarding/OnboardingTourType.jsm
@@ -32,12 +32,13 @@ var OnboardingTourType = {
     } else if (Services.prefs.getIntPref(PREF_SEEN_TOURSET_VERSION) < TOURSET_VERSION) {
       // show the update user tour when tour set version is larger than the seen tourset version
       Services.prefs.setStringPref(PREF_TOUR_TYPE, "update");
       // Reset all the notification-related prefs because tours update.
       Services.prefs.setBoolPref("browser.onboarding.notification.finished", false);
       Services.prefs.clearUserPref("browser.onboarding.notification.prompt-count");
       Services.prefs.clearUserPref("browser.onboarding.notification.last-time-of-changing-tour-sec");
       Services.prefs.clearUserPref("browser.onboarding.notification.tour-ids-queue");
+      Services.prefs.clearUserPref("browser.onboarding.state");
     }
     Services.prefs.setIntPref(PREF_SEEN_TOURSET_VERSION, TOURSET_VERSION);
   },
 };
--- a/browser/extensions/onboarding/README.md
+++ b/browser/extensions/onboarding/README.md
@@ -47,8 +47,16 @@ Edit `browser/app/profile/firefox.js` an
 
 The tourset version is used to track the last major tourset change version. The `tourset-version` pref store the major tourset version (ex: `1`) but not the current browser version. When browser update to the next version (ex: 58, 59) the tourset pref is still `1` if we didn't do any major tourset update.
 
 Once the tour set version is updated (ex: `2`), onboarding overlay should show the update tour to the updated user (ex: update from v56 -> v57), even when user has watched the previous tours or preferred to hide the previous tours.
 
 Edit `browser/app/profile/firefox.js` and set `browser.onboarding.tourset-version` as `[tourset version]` (in integer format).
 
 For example, if we update the tourset in v60 and decide to show all update users the tour, we set `browser.onboarding.tourset-version`  as `3`.
+
+## Icon states
+
+Onboarding module has two states for its overlay icon: `default` and `watermark`.
+By default, it shows `default` state.
+When either tours or notifications are all completed, the icon changes to the `watermark` state.
+The icon state is stored in `browser.onboarding.state`.
+When `tourset-version` is updated, or when we detect the `tour-type` is changed to `update`, icon state will be changed back to the `default` state.
--- a/browser/extensions/onboarding/bootstrap.js
+++ b/browser/extensions/onboarding/bootstrap.js
@@ -15,16 +15,17 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   "resource://gre/modules/FxAccounts.jsm");
 
 const {PREF_STRING, PREF_BOOL, PREF_INT} = Ci.nsIPrefBranch;
 
 const BROWSER_READY_NOTIFICATION = "browser-delayed-startup-finished";
 const BROWSER_SESSION_STORE_NOTIFICATION = "sessionstore-windows-restored";
 const PREF_WHITELIST = [
   ["browser.onboarding.enabled", PREF_BOOL],
+  ["browser.onboarding.state", PREF_STRING],
   ["browser.onboarding.notification.finished", PREF_BOOL],
   ["browser.onboarding.notification.prompt-count", PREF_INT],
   ["browser.onboarding.notification.last-time-of-changing-tour-sec", PREF_INT],
   ["browser.onboarding.notification.tour-ids-queue", PREF_STRING],
 ];
 
 [
   "onboarding-tour-addons",
@@ -42,17 +43,17 @@ let waitingForBrowserReady = true;
 
 /**
  * Set pref. Why no `getPrefs` function is due to the priviledge level.
  * We cannot set prefs inside a framescript but can read.
  * For simplicity and effeciency, we still read prefs inside the framescript.
  *
  * @param {Array} prefs the array of prefs to set.
  *   The array element carrys info to set pref, should contain
- *   - {String} name the pref name
+ *   - {String} name the pref name, such as `browser.onboarding.state`
  *   - {*} value the value to set
  **/
 function setPrefs(prefs) {
   prefs.forEach(pref => {
     let prefObj = PREF_WHITELIST.find(([name, ]) => name == pref.name);
     if (!prefObj) {
       return;
     }
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b8c0ffe162691995065ba0ab13189e33138dc7ec
GIT binary patch
literal 2118
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
--- a/browser/extensions/onboarding/content/onboarding-tour-agent.js
+++ b/browser/extensions/onboarding/content/onboarding-tour-agent.js
@@ -52,21 +52,16 @@ let onClick = evt => {
       Mozilla.UITour.showMenu("urlbar");
       break;
     case "onboarding-tour-sync-button":
       let emailInput = document.getElementById("onboarding-tour-sync-email-input");
       if (emailInput.checkValidity()) {
         Mozilla.UITour.showFirefoxAccounts(null, emailInput.value);
       }
       break;
-    case "onboarding-overlay":
-    case "onboarding-overlay-close-btn":
-      // Dismiss any highlights if a user tries to close the dialog.
-      Mozilla.UITour.hideHighlight();
-      break;
   }
   let classList = evt.target.classList;
   // On keyboard navigation the target would be .onboarding-tour-item.
   // On mouse clicking the target would be .onboarding-tour-item-container.
   if (classList.contains("onboarding-tour-item") || classList.contains("onboarding-tour-item-container")) {
     Mozilla.UITour.hideHighlight(); // Clean up UITour if a user tries to change to other tours.
   }
 };
@@ -78,12 +73,18 @@ overlay.addEventListener("keypress", e =
   let classList = target.classList;
   if ((key == " " || key == "Enter") &&
       // On keyboard navigation the target would be .onboarding-tour-item.
       // On mouse clicking the target would be .onboarding-tour-item-container.
       (classList.contains("onboarding-tour-item") || classList.contains("onboarding-tour-item-container"))) {
     Mozilla.UITour.hideHighlight(); // Clean up UITour if a user tries to change to other tours.
   }
 });
+let overlayObserver = new MutationObserver(mutations => {
+  if (!overlay.classList.contains("onboarding-opened")) {
+    Mozilla.UITour.hideHighlight(); // Clean up UITour if a user tries to close the dialog.
+  }
+});
+overlayObserver.observe(overlay, { attributes: true });
 document.getElementById("onboarding-overlay-button").addEventListener("Agent:Destroy", () => Mozilla.UITour.hideHighlight());
 document.addEventListener("Agent:CanSetDefaultBrowserInBackground", onCanSetDefaultBrowserInBackground);
 
 })();
--- a/browser/extensions/onboarding/content/onboarding.css
+++ b/browser/extensions/onboarding/content/onboarding.css
@@ -40,17 +40,17 @@
 /* Keyboard focus styling */
 #onboarding-overlay-button:-moz-focusring {
   outline: solid 2px rgba(0, 0, 0, 0.1);
   -moz-outline-radius: 5px;
   outline-offset: 5px;
   transition: outline-offset 150ms;
 }
 
-#onboarding-overlay-button-icon {
+#onboarding-overlay-button > img {
   width: 32px;
   vertical-align: top;
 }
 
 #onboarding-overlay-button::after {
   content: " ";
   border-radius: 50%;
   margin-top: -1px;
@@ -89,16 +89,26 @@
   margin-top: -10px;
   box-shadow: -2px 0 5px 0 rgba(74, 74, 79, 0.25);
 }
 
 #onboarding-overlay-button:dir(rtl)::after {
   box-shadow: 2px 0 5px 0 rgba(74, 74, 79, 0.25);
 }
 
+#onboarding-overlay-button-watermark-icon,
+#onboarding-overlay-button.onboarding-watermark:not(:hover)::after,
+#onboarding-overlay-button.onboarding-watermark:not(:hover) > #onboarding-overlay-button-icon {
+  display: none;
+}
+
+#onboarding-overlay-button.onboarding-watermark:not(:hover) > #onboarding-overlay-button-watermark-icon {
+  display: block;
+}
+
 #onboarding-overlay-dialog,
 .onboarding-hidden,
 #onboarding-tour-sync-page[data-login-state=logged-in] .show-on-logged-out,
 #onboarding-tour-sync-page[data-login-state=logged-out] .show-on-logged-in {
   display: none;
 }
 
 .onboarding-close-btn {
@@ -112,16 +122,17 @@
   background: none;
   padding: 0;
  }
 
 .onboarding-close-btn::before {
   content: url("chrome://global/skin/icons/close.svg");
   -moz-context-properties: fill, fill-opacity;
   fill-opacity: 0;
+  fill: currentColor;
 }
 
 .onboarding-close-btn:-moz-any(:hover, :active, :focus, :-moz-focusring)::before {
   fill-opacity: 0.1;
 }
 
 #onboarding-overlay.onboarding-opened > #onboarding-overlay-dialog {
   width: 960px;
--- a/browser/extensions/onboarding/content/onboarding.js
+++ b/browser/extensions/onboarding/content/onboarding.js
@@ -18,16 +18,18 @@ const UITOUR_JS_URI = "resource://onboar
 const TOUR_AGENT_JS_URI = "resource://onboarding/onboarding-tour-agent.js";
 const BRAND_SHORT_NAME = Services.strings
                      .createBundle("chrome://branding/locale/brand.properties")
                      .GetStringFromName("brandShortName");
 const PROMPT_COUNT_PREF = "browser.onboarding.notification.prompt-count";
 const ONBOARDING_DIALOG_ID = "onboarding-overlay-dialog";
 const ONBOARDING_MIN_WIDTH_PX = 960;
 const SPEECH_BUBBLE_MIN_WIDTH_PX = 1130;
+const ICON_STATE_WATERMARK = "watermark";
+const ICON_STATE_DEFAULT = "default";
 
 /**
  * Add any number of tours, key is the tourId, value should follow the format below
  * "tourId": { // The short tour id which could be saved in pref
  *   // The unique tour id
  *   id: "onboarding-tour-addons",
  *   // The string id of tour name which would be displayed on the navigation bar
  *   tourNameId: "onboarding.tour-addon",
@@ -414,16 +416,18 @@ class Onboarding {
     this._overlay = this._renderOverlay();
     this._overlay.addEventListener("click", this);
     this._overlay.addEventListener("keypress", this);
     body.appendChild(this._overlay);
 
     this._loadJS(TOUR_AGENT_JS_URI);
 
     this._initPrefObserver();
+    this._onIconStateChange(Services.prefs.getStringPref("browser.onboarding.state", ICON_STATE_DEFAULT));
+
     // Doing tour notification takes some effort. Let's do it on idle.
     this._window.requestIdleCallback(() => this._initNotification());
   }
 
   _getTourIDList() {
     let tours = Services.prefs.getStringPref(`browser.onboarding.${this._tourType}tour`, "");
     return tours.split(",").filter(tourId => tourId !== "").map(tourId => tourId.trim());
   }
@@ -447,27 +451,41 @@ class Onboarding {
   }
 
   _initPrefObserver() {
     if (this._prefsObserved) {
       return;
     }
 
     this._prefsObserved = new Map();
+    this._prefsObserved.set("browser.onboarding.state", () => {
+      this._onIconStateChange(Services.prefs.getStringPref("browser.onboarding.state", ICON_STATE_DEFAULT));
+    });
     this._tours.forEach(tour => {
       let tourId = tour.id;
       this._prefsObserved.set(`browser.onboarding.tour.${tourId}.completed`, () => {
         this.markTourCompletionState(tourId);
+        this._checkWatermarkByTours();
       });
     });
     for (let [name, callback] of this._prefsObserved) {
       Services.prefs.addObserver(name, callback);
     }
   }
 
+  _checkWatermarkByTours() {
+    let tourDone = this._tours.every(tour => this.isTourCompleted(tour.id));
+    if (tourDone) {
+      sendMessageToChrome("set-prefs", [{
+        name: "browser.onboarding.state",
+        value: ICON_STATE_WATERMARK
+      }]);
+    }
+  }
+
   _clearPrefObserver() {
     if (this._prefsObserved) {
       for (let [name, callback] of this._prefsObserved) {
         Services.prefs.removeObserver(name, callback);
       }
       this._prefsObserved = null;
     }
   }
@@ -650,16 +668,28 @@ class Onboarding {
     this._overlay.remove();
     if (this._notificationBar) {
       this._notificationBar.remove();
     }
     this._tourItems = this._tourPages =
     this._overlayIcon = this._overlay = this._notificationBar = null;
   }
 
+  _onIconStateChange(state) {
+    switch (state) {
+      case ICON_STATE_DEFAULT:
+        this._overlayIcon.classList.remove("onboarding-watermark");
+        break;
+      case ICON_STATE_WATERMARK:
+        this._overlayIcon.classList.add("onboarding-watermark");
+        break;
+    }
+    return true;
+  }
+
   showOverlay() {
     if (this._tourItems.length == 0) {
       // Lazy loading until first toggle.
       this._loadTours(this._tours);
     }
 
     this.hideNotification();
     this.toggleModal(this._overlay.classList.toggle("onboarding-opened"));
@@ -918,16 +948,20 @@ class Onboarding {
       sendMessageToChrome("set-prefs", [
         {
           name: "browser.onboarding.notification.finished",
           value: true
         },
         {
           name: "browser.onboarding.notification.tour-ids-queue",
           value: ""
+        },
+        {
+          name: "browser.onboarding.state",
+          value: ICON_STATE_WATERMARK
         }
       ]);
       return;
     }
     let targetTourId = queue[0];
     let targetTour = this._tours.find(tour => tour.id == targetTourId);
 
     // Show the target tour notification
@@ -1001,16 +1035,20 @@ class Onboarding {
   }
 
   skipTour() {
     this.setToursCompleted(this._tours.map(tour => tour.id));
     sendMessageToChrome("set-prefs", [
       {
         name: "browser.onboarding.notification.finished",
         value: true
+      },
+      {
+        name: "browser.onboarding.state",
+        value: ICON_STATE_WATERMARK
       }
     ]);
   }
 
   _renderOverlay() {
     let div = this._window.document.createElement("div");
     div.id = "onboarding-overlay";
     // We use `innerHTML` for more friendly reading.
@@ -1045,21 +1083,26 @@ class Onboarding {
     let button = this._window.document.createElement("button");
     let tooltipStringId = this._tourType === "new" ?
       "onboarding.overlay-icon-tooltip2" : "onboarding.overlay-icon-tooltip-updated2";
     let tooltip = this._bundle.formatStringFromName(tooltipStringId, [BRAND_SHORT_NAME], 1);
     button.setAttribute("aria-label", tooltip);
     button.id = "onboarding-overlay-button";
     button.setAttribute("aria-haspopup", true);
     button.setAttribute("aria-controls", `${ONBOARDING_DIALOG_ID}`);
-    let img = this._window.document.createElement("img");
-    img.id = "onboarding-overlay-button-icon";
-    img.setAttribute("role", "presentation");
-    img.src = "chrome://branding/content/icon64.png";
-    button.appendChild(img);
+    let defaultImg = this._window.document.createElement("img");
+    defaultImg.id = "onboarding-overlay-button-icon";
+    defaultImg.setAttribute("role", "presentation");
+    defaultImg.src = "chrome://branding/content/icon64.png";
+    button.appendChild(defaultImg);
+    let watermarkImg = this._window.document.createElement("img");
+    watermarkImg.id = "onboarding-overlay-button-watermark-icon";
+    watermarkImg.setAttribute("role", "presentation");
+    watermarkImg.src = "resource://onboarding/img/watermark64.png";
+    button.appendChild(watermarkImg);
     return button;
   }
 
   _loadTours(tours) {
     let itemsFrag = this._window.document.createDocumentFragment();
     let pagesFrag = this._window.document.createDocumentFragment();
     for (let tour of tours) {
       // Create tour navigation items dynamically
--- a/browser/extensions/onboarding/test/browser/browser_onboarding_notification.js
+++ b/browser/extensions/onboarding/test/browser/browser_onboarding_notification.js
@@ -8,24 +8,28 @@ requestLongerTimeout(3);
 add_task(async function test_show_tour_notifications_in_order() {
   resetOnboardingDefaultState();
   Preferences.set("browser.onboarding.notification.max-prompt-count-per-tour", 1);
   skipMuteNotificationOnFirstSession();
 
   let tourIds = TOUR_IDs;
   let tab = null;
   let targetTourId = null;
-  let expectedPrefUpdate = null;
+  let expectedPrefUpdates = null;
   await loopTourNotificationQueueOnceInOrder();
   await loopTourNotificationQueueOnceInOrder();
 
-  expectedPrefUpdate = promisePrefUpdated("browser.onboarding.notification.finished", true);
+  expectedPrefUpdates = Promise.all([
+    promisePrefUpdated("browser.onboarding.notification.finished", true),
+    promisePrefUpdated("browser.onboarding.state", ICON_STATE_WATERMARK)
+  ]);
   await reloadTab(tab);
   await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
-  await expectedPrefUpdate;
+  await expectedPrefUpdates;
+  await assertWatermarkIconDisplayed(tab.linkedBrowser);
   let tourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
   ok(!tourId, "Should not prompt each tour for more than 2 chances.");
   await BrowserTestUtils.removeTab(tab);
 
   async function loopTourNotificationQueueOnceInOrder() {
     for (let i = 0; i < tourIds.length; ++i) {
       if (tab) {
         await reloadTab(tab);
--- a/browser/extensions/onboarding/test/browser/browser_onboarding_notification_4.js
+++ b/browser/extensions/onboarding/test/browser/browser_onboarding_notification_4.js
@@ -9,20 +9,25 @@ add_task(async function test_remove_all_
   resetOnboardingDefaultState();
   skipMuteNotificationOnFirstSession();
 
   let tourIds = TOUR_IDs;
   let tab = null;
   let targetTourId = null;
   await closeTourNotificationsOneByOne();
 
-  let expectedPrefUpdate = promisePrefUpdated("browser.onboarding.notification.finished", true);
+  let expectedPrefUpdates = [
+    promisePrefUpdated("browser.onboarding.notification.finished", true),
+    promisePrefUpdated("browser.onboarding.state", ICON_STATE_WATERMARK)
+  ];
   await reloadTab(tab);
   await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
-  await expectedPrefUpdate;
+  await Promise.all(expectedPrefUpdates);
+  await assertWatermarkIconDisplayed(tab.linkedBrowser);
+
   let tourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
   ok(!tourId, "Should not prompt tour notifications any more after closing all notifcations.");
   await BrowserTestUtils.removeTab(tab);
 
   async function closeTourNotificationsOneByOne() {
     for (let i = 0; i < tourIds.length; ++i) {
       if (tab) {
         await reloadTab(tab);
@@ -43,20 +48,25 @@ add_task(async function test_remove_all_
   resetOnboardingDefaultState();
   skipMuteNotificationOnFirstSession();
 
   let tourIds = TOUR_IDs;
   let tab = null;
   let targetTourId = null;
   await clickTourNotificationActionButtonsOneByOne();
 
-  let expectedPrefUpdate = promisePrefUpdated("browser.onboarding.notification.finished", true);
+  let expectedPrefUpdates = [
+    promisePrefUpdated("browser.onboarding.notification.finished", true),
+    promisePrefUpdated("browser.onboarding.state", ICON_STATE_WATERMARK)
+  ];
   await reloadTab(tab);
   await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
-  await expectedPrefUpdate;
+  await Promise.all(expectedPrefUpdates);
+  await assertWatermarkIconDisplayed(tab.linkedBrowser);
+
   let tourId = await getCurrentNotificationTargetTourId(tab.linkedBrowser);
   ok(!tourId, "Should not prompt tour notifcations any more after taking actions on all notifcations.");
   await BrowserTestUtils.removeTab(tab);
 
   async function clickTourNotificationActionButtonsOneByOne() {
     for (let i = 0; i < tourIds.length; ++i) {
       if (tab) {
         await reloadTab(tab);
--- a/browser/extensions/onboarding/test/browser/browser_onboarding_notification_5.js
+++ b/browser/extensions/onboarding/test/browser/browser_onboarding_notification_5.js
@@ -8,14 +8,18 @@ add_task(async function test_finish_tour
   skipMuteNotificationOnFirstSession();
 
   let tab = await openTab(ABOUT_NEWTAB_URL);
   await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
   await promiseTourNotificationOpened(tab.linkedBrowser);
 
   let totalMaxTime = Preferences.get("browser.onboarding.notification.max-life-time-all-tours-ms");
   Preferences.set("browser.onboarding.notification.last-time-of-changing-tour-sec", Math.floor((Date.now() - totalMaxTime) / 1000));
-  let expectedPrefUpdate = promisePrefUpdated("browser.onboarding.notification.finished", true);
+  let expectedPrefUpdates = Promise.all([
+    promisePrefUpdated("browser.onboarding.notification.finished", true),
+    promisePrefUpdated("browser.onboarding.state", ICON_STATE_WATERMARK)
+  ]);
   await reloadTab(tab);
   await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
-  await expectedPrefUpdate;
+  await expectedPrefUpdates;
+  await assertWatermarkIconDisplayed(tab.linkedBrowser);
   await BrowserTestUtils.removeTab(tab);
 });
--- a/browser/extensions/onboarding/test/browser/browser_onboarding_skip_tour.js
+++ b/browser/extensions/onboarding/test/browser/browser_onboarding_skip_tour.js
@@ -3,24 +3,26 @@
 
  "use strict";
 
 add_task(async function test_skip_onboarding_tours() {
   resetOnboardingDefaultState();
 
   let tourIds = TOUR_IDs;
   let expectedPrefUpdates = [
-    promisePrefUpdated("browser.onboarding.notification.finished", true)
+    promisePrefUpdated("browser.onboarding.notification.finished", true),
+    promisePrefUpdated("browser.onboarding.state", ICON_STATE_WATERMARK)
   ];
   tourIds.forEach((id, idx) => expectedPrefUpdates.push(promisePrefUpdated(`browser.onboarding.tour.${id}.completed`, true)));
 
   let tab = await openTab(ABOUT_NEWTAB_URL);
   await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
   await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
   await promiseOnboardingOverlayOpened(tab.linkedBrowser);
 
   let overlayClosedPromise = promiseOnboardingOverlayClosed(tab.linkedBrowser);
   await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-skip-tour-button", {}, tab.linkedBrowser);
   await overlayClosedPromise;
   await Promise.all(expectedPrefUpdates);
+  await assertWatermarkIconDisplayed(tab.linkedBrowser);
 
   await BrowserTestUtils.removeTab(tab);
 });
--- a/browser/extensions/onboarding/test/browser/browser_onboarding_tours.js
+++ b/browser/extensions/onboarding/test/browser/browser_onboarding_tours.js
@@ -83,8 +83,33 @@ add_task(async function test_click_actio
     let tab = tabs[i];
     await assertOverlaySemantics(tab.linkedBrowser);
     for (let id of tourIds) {
       await assertTourCompleted(id, id == completedTourId, tab.linkedBrowser);
     }
     await BrowserTestUtils.removeTab(tab);
   }
 });
+
+add_task(async function test_set_watermark_after_all_tour_completed() {
+  resetOnboardingDefaultState();
+
+  await SpecialPowers.pushPrefEnv({set: [
+    ["browser.onboarding.tour-type", "new"]
+  ]});
+
+  let tabs = [];
+  for (let url of URLs) {
+    let tab = await openTab(url);
+    await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
+    await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
+    await promiseOnboardingOverlayOpened(tab.linkedBrowser);
+    tabs.push(tab);
+  }
+  let expectedPrefUpdate = promisePrefUpdated("browser.onboarding.state", ICON_STATE_WATERMARK);
+  TOUR_IDs.forEach(id => Preferences.set(`browser.onboarding.tour.${id}.completed`, true));
+  await expectedPrefUpdate;
+
+  for (let tab of tabs) {
+    await assertWatermarkIconDisplayed(tab.linkedBrowser);
+    await BrowserTestUtils.removeTab(tab);
+  }
+});
--- a/browser/extensions/onboarding/test/browser/browser_onboarding_uitour.js
+++ b/browser/extensions/onboarding/test/browser/browser_onboarding_uitour.js
@@ -13,22 +13,74 @@ function promisePopupChange(popup, expec
 }
 
 async function promiseOpenOnboardingOverlay(tab) {
   await promiseOnboardingOverlayLoaded(tab.linkedBrowser);
   await BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-button", {}, tab.linkedBrowser);
   return promiseOnboardingOverlayOpened(tab.linkedBrowser);
 }
 
-async function triggerCustomizeUITourHighlight(tab) {
+async function triggerUITourHighlight(tourName, tab) {
   await promiseOpenOnboardingOverlay(tab);
-  BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-tour-customize", {}, tab.linkedBrowser);
-  BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-tour-customize-button", {}, tab.linkedBrowser);
+  BrowserTestUtils.synthesizeMouseAtCenter(`#onboarding-tour-${tourName}`, {}, tab.linkedBrowser);
+  BrowserTestUtils.synthesizeMouseAtCenter(`#onboarding-tour-${tourName}-button`, {}, tab.linkedBrowser);
 }
 
+add_task(async function test_clean_up_uitour_after_closing_overlay() {
+  resetOnboardingDefaultState();
+  await SpecialPowers.pushPrefEnv({set: [
+    ["browser.onboarding.newtour", "library"],
+  ]});
+
+  // Trigger UITour showHighlight
+  let highlight = document.getElementById("UITourHighlightContainer");
+  let highlightOpenPromise = promisePopupChange(highlight, "open");
+  let tab = await openTab(ABOUT_NEWTAB_URL);
+  await triggerUITourHighlight("library", tab);
+  await highlightOpenPromise;
+  is(highlight.state, "open", "Should show UITour highlight");
+  is(highlight.getAttribute("targetName"), "library", "UITour should highlight library");
+
+  // Close the overlay by clicking the overlay
+  let highlightClosePromise = promisePopupChange(highlight, "closed");
+  BrowserTestUtils.synthesizeMouseAtPoint(2, 2, {}, tab.linkedBrowser);
+  await promiseOnboardingOverlayClosed(tab.linkedBrowser);
+  await highlightClosePromise;
+  is(highlight.state, "closed", "Should close UITour highlight after closing the overlay by clicking the overlay");
+
+  // Trigger UITour showHighlight
+  highlightOpenPromise = promisePopupChange(highlight, "open");
+  await triggerUITourHighlight("library", tab);
+  await highlightOpenPromise;
+  is(highlight.state, "open", "Should show UITour highlight");
+  is(highlight.getAttribute("targetName"), "library", "UITour should highlight library");
+
+  // Close the overlay by clicking the overlay close button
+  highlightClosePromise = promisePopupChange(highlight, "closed");
+  BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-overlay-close-btn", {}, tab.linkedBrowser);
+  await promiseOnboardingOverlayClosed(tab.linkedBrowser);
+  await highlightClosePromise;
+  is(highlight.state, "closed", "Should close UITour highlight after closing the overlay by clicking the overlay close button");
+
+  // Trigger UITour showHighlight again
+  highlightOpenPromise = promisePopupChange(highlight, "open");
+  await triggerUITourHighlight("library", tab);
+  await highlightOpenPromise;
+  is(highlight.state, "open", "Should show UITour highlight");
+  is(highlight.getAttribute("targetName"), "library", "UITour should highlight library");
+
+  // Close the overlay by clicking the skip-tour button
+  highlightClosePromise = promisePopupChange(highlight, "closed");
+  BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-skip-tour-btn", {}, tab.linkedBrowser);
+  await promiseOnboardingOverlayClosed(tab.linkedBrowser);
+  await highlightClosePromise;
+  is(highlight.state, "closed", "Should close UITour highlight after closing the overlay by clicking the skip-tour button");
+  await BrowserTestUtils.removeTab(tab);
+});
+
 add_task(async function test_clean_up_uitour_after_navigating_to_other_tour_by_keyboard() {
   resetOnboardingDefaultState();
   await SpecialPowers.pushPrefEnv({set: [
     ["browser.onboarding.newtour", "singlesearch,customize"],
   ]});
 
   let tab = await openTab(ABOUT_NEWTAB_URL);
   await promiseOpenOnboardingOverlay(tab);
@@ -62,17 +114,17 @@ add_task(async function test_clean_up_ui
   await SpecialPowers.pushPrefEnv({set: [
     ["browser.onboarding.newtour", "singlesearch,customize"],
   ]});
 
   // Navigate to the Customize tour to trigger UITour showHighlight
   let highlight = document.getElementById("UITourHighlightContainer");
   let highlightOpenPromise = promisePopupChange(highlight, "open");
   let tab = await openTab(ABOUT_NEWTAB_URL);
-  await triggerCustomizeUITourHighlight(tab);
+  await triggerUITourHighlight("customize", tab);
   await highlightOpenPromise;
   is(highlight.state, "open", "Should show UITour highlight");
   is(highlight.getAttribute("targetName"), "customize", "UITour should highlight customize");
 
   // Navigate to the Single-Search tour
   let highlightClosePromise = promisePopupChange(highlight, "closed");
   BrowserTestUtils.synthesizeMouseAtCenter("#onboarding-tour-singlesearch", {}, tab.linkedBrowser);
   await highlightClosePromise;
@@ -85,17 +137,17 @@ add_task(async function test_clean_up_ui
   await SpecialPowers.pushPrefEnv({set: [
     ["browser.onboarding.newtour", "singlesearch,customize"],
   ]});
 
   // Trigger UITour showHighlight
   let highlight = document.getElementById("UITourHighlightContainer");
   let highlightOpenPromise = promisePopupChange(highlight, "open");
   let tab = await openTab(ABOUT_NEWTAB_URL);
-  await triggerCustomizeUITourHighlight(tab);
+  await triggerUITourHighlight("customize", tab);
   await highlightOpenPromise;
   is(highlight.state, "open", "Should show UITour highlight");
   is(highlight.getAttribute("targetName"), "customize", "UITour should highlight customize");
 
   // Load another page to unload the current page
   let highlightClosePromise = promisePopupChange(highlight, "closed");
   await BrowserTestUtils.loadURI(tab.linkedBrowser, "http://example.com");
   await highlightClosePromise;
@@ -108,17 +160,17 @@ add_task(async function test_clean_up_ui
   await SpecialPowers.pushPrefEnv({set: [
     ["browser.onboarding.newtour", "singlesearch,customize"],
   ]});
 
   // Trigger UITour showHighlight
   let highlight = document.getElementById("UITourHighlightContainer");
   let highlightOpenPromise = promisePopupChange(highlight, "open");
   let tab = await openTab(ABOUT_NEWTAB_URL);
-  await triggerCustomizeUITourHighlight(tab);
+  await triggerUITourHighlight("customize", tab);
   await highlightOpenPromise;
   is(highlight.state, "open", "Should show UITour highlight");
   is(highlight.getAttribute("targetName"), "customize", "UITour should highlight customize");
 
   // Resize window to destroy the onboarding tour
   const originalWidth = window.innerWidth;
   let highlightClosePromise = promisePopupChange(highlight, "closed");
   window.innerWidth = 300;
--- a/browser/extensions/onboarding/test/browser/head.js
+++ b/browser/extensions/onboarding/test/browser/head.js
@@ -17,23 +17,26 @@ const TOUR_IDs = [
 const UPDATE_TOUR_IDs = [
   "onboarding-tour-performance",
   "onboarding-tour-library",
   "onboarding-tour-screenshots",
   "onboarding-tour-singlesearch",
   "onboarding-tour-customize",
   "onboarding-tour-sync",
 ];
+const ICON_STATE_WATERMARK = "watermark";
+const ICON_STATE_DEFAULT = "default";
 
 registerCleanupFunction(resetOnboardingDefaultState);
 
 function resetOnboardingDefaultState() {
   // All the prefs should be reset to the default states
   // and no need to revert back so we don't use `SpecialPowers.pushPrefEnv` here.
   Preferences.set("browser.onboarding.enabled", true);
+  Preferences.set("browser.onboarding.state", ICON_STATE_DEFAULT);
   Preferences.set("browser.onboarding.notification.finished", false);
   Preferences.set("browser.onboarding.notification.mute-duration-on-first-session-ms", 300000);
   Preferences.set("browser.onboarding.notification.max-life-time-per-tour-ms", 432000000);
   Preferences.set("browser.onboarding.notification.max-life-time-all-tours-ms", 1209600000);
   Preferences.set("browser.onboarding.notification.max-prompt-count-per-tour", 8);
   Preferences.reset("browser.onboarding.notification.last-time-of-changing-tour-sec");
   Preferences.reset("browser.onboarding.notification.prompt-count");
   Preferences.reset("browser.onboarding.notification.tour-ids-queue");
@@ -84,17 +87,17 @@ function promiseOnboardingOverlayLoaded(
   return ContentTask.spawn(browser, {}, isLoaded);
 }
 
 function promiseOnboardingOverlayOpened(browser) {
   return BrowserTestUtils.waitForCondition(() =>
     ContentTask.spawn(browser, {}, () =>
       content.document.querySelector("#onboarding-overlay").classList.contains(
         "onboarding-opened")),
-    "Should close onboarding overlay",
+    "Should open onboarding overlay",
     100,
     30
   );
 }