Bug 1395642 - Add placeholders, finalized 57 strings and bug fixes to Activity Stream. r?dmose draft
authorEd Lee <edilee@mozilla.com>
Fri, 01 Sep 2017 14:52:57 -0700
changeset 657814 35b67692cac41ffb225e05cdd85302d8ce0ae8f6
parent 657648 d1292636950a4ac1bb818cf05b113e3fcd6babe1
child 729525 694ef730fa96b9cd38d5eefddeaaf0a0b7c09efd
push id77627
push userbmo:edilee@mozilla.com
push dateSat, 02 Sep 2017 00:05:15 +0000
reviewersdmose
bugs1395642
milestone57.0a1
Bug 1395642 - Add placeholders, finalized 57 strings and bug fixes to Activity Stream. r?dmose MozReview-Commit-ID: 8x6ez3edtoQ
browser/extensions/activity-stream/common/Actions.jsm
browser/extensions/activity-stream/common/Dedupe.jsm
browser/extensions/activity-stream/common/Reducers.jsm
browser/extensions/activity-stream/data/content/activity-stream.bundle.js
browser/extensions/activity-stream/data/content/activity-stream.css
browser/extensions/activity-stream/data/locales.json
browser/extensions/activity-stream/install.rdf.in
browser/extensions/activity-stream/lib/ActivityStream.jsm
browser/extensions/activity-stream/lib/ManualMigration.jsm
browser/extensions/activity-stream/lib/PlacesFeed.jsm
browser/extensions/activity-stream/lib/SectionsManager.jsm
browser/extensions/activity-stream/lib/ShortURL.jsm
browser/extensions/activity-stream/lib/SnippetsFeed.jsm
browser/extensions/activity-stream/lib/Store.jsm
browser/extensions/activity-stream/lib/TelemetryFeed.jsm
browser/extensions/activity-stream/lib/TopSitesFeed.jsm
browser/extensions/activity-stream/lib/TopStoriesFeed.jsm
browser/extensions/activity-stream/test/unit/common/Dedupe.test.js
browser/extensions/activity-stream/test/unit/common/Reducers.test.js
browser/extensions/activity-stream/test/unit/lib/ActivityStream.test.js
browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js
browser/extensions/activity-stream/test/unit/lib/SectionsManager.test.js
browser/extensions/activity-stream/test/unit/lib/ShortUrl.test.js
browser/extensions/activity-stream/test/unit/lib/SnippetsFeed.test.js
browser/extensions/activity-stream/test/unit/lib/Store.test.js
browser/extensions/activity-stream/test/unit/lib/TelemetryFeed.test.js
browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js
browser/extensions/activity-stream/test/unit/lib/TopStoriesFeed.test.js
browser/extensions/activity-stream/test/unit/unit-entry.js
browser/modules/PingCentre.jsm
--- a/browser/extensions/activity-stream/common/Actions.jsm
+++ b/browser/extensions/activity-stream/common/Actions.jsm
@@ -26,20 +26,20 @@ 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",
-  "FEED_INIT",
   "INIT",
   "LOCALE_UPDATED",
   "MIGRATION_CANCEL",
+  "MIGRATION_COMPLETED",
   "MIGRATION_START",
   "NEW_TAB_INIT",
   "NEW_TAB_INITIAL_STATE",
   "NEW_TAB_LOAD",
   "NEW_TAB_UNLOAD",
   "OPEN_LINK",
   "OPEN_NEW_WINDOW",
   "OPEN_PRIVATE_WINDOW",
--- a/browser/extensions/activity-stream/common/Dedupe.jsm
+++ b/browser/extensions/activity-stream/common/Dedupe.jsm
@@ -8,23 +8,22 @@ this.Dedupe = class Dedupe {
     return item;
   }
 
   defaultCompare() {
     return false;
   }
 
   /**
-   * Dedupe an array containing groups of elements.
-   * Duplicate removal favors earlier groups.
+   * Dedupe any number of grouped elements favoring those from earlier groups.
    *
    * @param {Array} groups Contains an arbitrary number of arrays of elements.
-   * @returns {Array}
+   * @returns {Array} A matching array of each provided group deduped.
    */
-  group(groups) {
+  group(...groups) {
     const globalKeys = new Set();
     const result = [];
     for (const values of groups) {
       const valueMap = new Map();
       for (const value of values) {
         const key = this.createKey(value);
         if (!globalKeys.has(key) && (!valueMap.has(key) || this.compare(valueMap.get(key), value))) {
           valueMap.set(key, value);
--- a/browser/extensions/activity-stream/common/Reducers.jsm
+++ b/browser/extensions/activity-stream/common/Reducers.jsm
@@ -194,34 +194,37 @@ function Sections(prevState = INITIAL_ST
         return section;
       });
 
       // Invariant: Sections array sorted in increasing order of property `order`.
       // If section doesn't exist in prevState, create a new section object. If
       // the section has an order, insert it at the correct place in the array.
       // Otherwise, prepend it and set the order to be minimal.
       if (!hasMatch) {
-        const initialized = action.data.rows && action.data.rows.length > 0;
+        const initialized = !!(action.data.rows && action.data.rows.length > 0);
         let order;
         let index;
         if (prevState.length > 0) {
           order = action.data.order || prevState[0].order - 1;
           index = newState.findIndex(section => section.order >= order);
         } else {
           order = action.data.order || 1;
           index = 0;
         }
-        const section = Object.assign({title: "", initialized, rows: [], order, enabled: false}, action.data);
+        const section = Object.assign({title: "", rows: [], order, enabled: false}, action.data, {initialized});
         newState.splice(index, 0, section);
       }
       return newState;
     case at.SECTION_UPDATE:
       return prevState.map(section => {
         if (section && section.id === action.data.id) {
-          return Object.assign({}, section, action.data);
+          // 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.PLACES_BOOKMARK_ADDED:
       if (!action.data) {
         return prevState;
       }
       return prevState.map(section => Object.assign({}, section, {
--- a/browser/extensions/activity-stream/data/content/activity-stream.bundle.js
+++ b/browser/extensions/activity-stream/data/content/activity-stream.bundle.js
@@ -95,17 +95,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", "FEED_INIT", "INIT", "LOCALE_UPDATED", "MIGRATION_CANCEL", "MIGRATION_START", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "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_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"]) {
   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) {
@@ -549,34 +549,37 @@ function Sections() {
         return section;
       });
 
       // Invariant: Sections array sorted in increasing order of property `order`.
       // If section doesn't exist in prevState, create a new section object. If
       // the section has an order, insert it at the correct place in the array.
       // Otherwise, prepend it and set the order to be minimal.
       if (!hasMatch) {
-        const initialized = action.data.rows && action.data.rows.length > 0;
+        const initialized = !!(action.data.rows && action.data.rows.length > 0);
         let order;
         let index;
         if (prevState.length > 0) {
           order = action.data.order || prevState[0].order - 1;
           index = newState.findIndex(section => section.order >= order);
         } else {
           order = action.data.order || 1;
           index = 0;
         }
-        const section = Object.assign({ title: "", initialized, rows: [], order, enabled: false }, action.data);
+        const section = Object.assign({ title: "", rows: [], order, enabled: false }, action.data, { initialized });
         newState.splice(index, 0, section);
       }
       return newState;
     case at.SECTION_UPDATE:
       return prevState.map(section => {
         if (section && section.id === action.data.id) {
-          return Object.assign({}, section, action.data);
+          // 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.PLACES_BOOKMARK_ADDED:
       if (!action.data) {
         return prevState;
       }
       return prevState.map(section => Object.assign({}, section, {
@@ -766,32 +769,87 @@ module.exports = {
 
 /***/ }),
 /* 7 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
 const React = __webpack_require__(0);
 
 var _require = __webpack_require__(1);
 
 const ac = _require.actionCreators,
       at = _require.actionTypes;
 
 
 const LinkMenu = __webpack_require__(8);
 
 var _require2 = __webpack_require__(4);
 
 const TOP_SITES_SOURCE = _require2.TOP_SITES_SOURCE,
       TOP_SITES_CONTEXT_MENU_OPTIONS = _require2.TOP_SITES_CONTEXT_MENU_OPTIONS;
 
 
+const TopSiteLink = props => {
+  const link = props.link;
+
+  const topSiteOuterClassName = `top-site-outer${props.className ? ` ${props.className}` : ""}`;
+  const tippyTopIcon = link.tippyTopIcon;
+
+  let imageClassName;
+  let imageStyle;
+  if (tippyTopIcon) {
+    imageClassName = "tippy-top-icon";
+    imageStyle = {
+      backgroundColor: link.backgroundColor,
+      backgroundImage: `url(${tippyTopIcon})`
+    };
+  } else {
+    imageClassName = `screenshot${link.screenshot ? " active" : ""}`;
+    imageStyle = { backgroundImage: link.screenshot ? `url(${link.screenshot})` : "none" };
+  }
+  return React.createElement(
+    "li",
+    { className: topSiteOuterClassName, key: link.guid || link.url },
+    React.createElement(
+      "a",
+      { href: link.url, onClick: props.onClick },
+      React.createElement(
+        "div",
+        { className: "tile", "aria-hidden": true },
+        React.createElement(
+          "span",
+          { className: "letter-fallback" },
+          props.title[0]
+        ),
+        React.createElement("div", { className: imageClassName, style: imageStyle })
+      ),
+      React.createElement(
+        "div",
+        { className: `title ${link.isPinned ? "pinned" : ""}` },
+        link.isPinned && React.createElement("div", { className: "icon icon-pin-small" }),
+        React.createElement(
+          "span",
+          { dir: "auto" },
+          props.title
+        )
+      )
+    ),
+    props.children
+  );
+};
+TopSiteLink.defaultProps = {
+  title: "",
+  link: {}
+};
+
 class TopSite extends React.Component {
   constructor(props) {
     super(props);
     this.state = { showContextMenu: false, activeTile: null };
     this.onLinkClick = this.onLinkClick.bind(this);
     this.onMenuButtonClick = this.onMenuButtonClick.bind(this);
     this.onMenuUpdate = this.onMenuUpdate.bind(this);
     this.onDismissButtonClick = this.onDismissButtonClick.bind(this);
@@ -859,88 +917,46 @@ class TopSite extends React.Component {
       }));
       this.userEvent("PIN");
     }
   }
   onEditButtonClick() {
     this.props.onEdit(this.props.index);
   }
   render() {
-    var _props2 = this.props;
-    const link = _props2.link,
-          index = _props2.index,
-          dispatch = _props2.dispatch,
-          editMode = _props2.editMode;
-
-    const isContextMenuOpen = this.state.showContextMenu && this.state.activeTile === index;
+    const props = this.props;
+    const link = props.link;
+
+    const isContextMenuOpen = this.state.showContextMenu && this.state.activeTile === props.index;
     const title = link.label || link.hostname;
-    const topSiteOuterClassName = `top-site-outer${isContextMenuOpen ? " active" : ""}`;
-    const tippyTopIcon = link.tippyTopIcon;
-
-    let imageClassName;
-    let imageStyle;
-    if (tippyTopIcon) {
-      imageClassName = "tippy-top-icon";
-      imageStyle = {
-        backgroundColor: link.backgroundColor,
-        backgroundImage: `url(${tippyTopIcon})`
-      };
-    } else {
-      imageClassName = `screenshot${link.screenshot ? " active" : ""}`;
-      imageStyle = { backgroundImage: link.screenshot ? `url(${link.screenshot})` : "none" };
-    }
     return React.createElement(
-      "li",
-      { className: topSiteOuterClassName, key: link.guid || link.url },
-      React.createElement(
-        "a",
-        { href: link.url, onClick: this.onLinkClick },
-        React.createElement(
-          "div",
-          { className: "tile", "aria-hidden": true },
-          React.createElement(
-            "span",
-            { className: "letter-fallback" },
-            title[0]
-          ),
-          React.createElement("div", { className: imageClassName, style: imageStyle })
-        ),
-        React.createElement(
-          "div",
-          { className: `title ${link.isPinned ? "pinned" : ""}` },
-          link.isPinned && React.createElement("div", { className: "icon icon-pin-small" }),
-          React.createElement(
-            "span",
-            { dir: "auto" },
-            title
-          )
-        )
-      ),
-      !editMode && React.createElement(
+      TopSiteLink,
+      _extends({}, props, { onClick: this.onLinkClick, className: isContextMenuOpen ? "active" : "", title: title }),
+      !props.editMode && React.createElement(
         "div",
         null,
         React.createElement(
           "button",
           { className: "context-menu-button icon", onClick: this.onMenuButtonClick },
           React.createElement(
             "span",
             { className: "sr-only" },
             `Open context menu for ${title}`
           )
         ),
         React.createElement(LinkMenu, {
-          dispatch: dispatch,
-          index: index,
+          dispatch: props.dispatch,
+          index: props.index,
           onUpdate: this.onMenuUpdate,
           options: TOP_SITES_CONTEXT_MENU_OPTIONS,
           site: link,
           source: TOP_SITES_SOURCE,
           visible: isContextMenuOpen })
       ),
-      editMode && React.createElement(
+      props.editMode && React.createElement(
         "div",
         { className: "edit-menu" },
         React.createElement("button", {
           className: `icon icon-${link.isPinned ? "unpin" : "pin"}`,
           title: this.props.intl.formatMessage({ id: `edit_topsites_${link.isPinned ? "unpin" : "pin"}_button` }),
           onClick: this.onPinButtonClick }),
         React.createElement("button", {
           className: "icon icon-edit",
@@ -949,23 +965,27 @@ class TopSite extends React.Component {
         React.createElement("button", {
           className: "icon icon-dismiss",
           title: this.props.intl.formatMessage({ id: "edit_topsites_dismiss_button" }),
           onClick: this.onDismissButtonClick })
       )
     );
   }
 }
-
 TopSite.defaultProps = {
   editMode: false,
+  link: {},
   onEdit() {}
 };
 
-module.exports = TopSite;
+const TopSitePlaceholder = () => React.createElement(TopSiteLink, { className: "placeholder" });
+
+module.exports.TopSite = TopSite;
+module.exports.TopSiteLink = TopSiteLink;
+module.exports.TopSitePlaceholder = TopSitePlaceholder;
 
 /***/ }),
 /* 8 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
@@ -1076,25 +1096,25 @@ module.exports = g;
 const React = __webpack_require__(0);
 const ReactDOM = __webpack_require__(11);
 const Base = __webpack_require__(12);
 
 var _require = __webpack_require__(3);
 
 const Provider = _require.Provider;
 
-const initStore = __webpack_require__(27);
+const initStore = __webpack_require__(28);
 
 var _require2 = __webpack_require__(5);
 
 const reducers = _require2.reducers;
 
-const DetectUserSessionStart = __webpack_require__(29);
-
-var _require3 = __webpack_require__(30);
+const DetectUserSessionStart = __webpack_require__(30);
+
+var _require3 = __webpack_require__(31);
 
 const addSnippetsSubscriber = _require3.addSnippetsSubscriber;
 
 
 new DetectUserSessionStart().sendEventOrAddListener();
 
 const store = initStore(reducers);
 
@@ -1127,20 +1147,20 @@ const connect = _require.connect;
 
 var _require2 = __webpack_require__(2);
 
 const addLocaleData = _require2.addLocaleData,
       IntlProvider = _require2.IntlProvider;
 
 const TopSites = __webpack_require__(13);
 const Search = __webpack_require__(19);
-const ConfirmDialog = __webpack_require__(20);
-const ManualMigration = __webpack_require__(21);
-const PreferencesPane = __webpack_require__(22);
-const Sections = __webpack_require__(23);
+const ConfirmDialog = __webpack_require__(21);
+const ManualMigration = __webpack_require__(22);
+const PreferencesPane = __webpack_require__(23);
+const Sections = __webpack_require__(24);
 
 // Locales that should be displayed RTL
 const RTL_LIST = ["ar", "he", "fa", "ur"];
 
 // 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(_ref) {
@@ -1227,43 +1247,53 @@ const connect = _require.connect;
 
 var _require2 = __webpack_require__(2);
 
 const FormattedMessage = _require2.FormattedMessage;
 
 
 const TopSitesPerfTimer = __webpack_require__(14);
 const TopSitesEdit = __webpack_require__(15);
-const TopSite = __webpack_require__(7);
-
-const TopSites = props => React.createElement(
-  TopSitesPerfTimer,
-  null,
-  React.createElement(
-    "section",
-    { className: "top-sites" },
+
+var _require3 = __webpack_require__(7);
+
+const TopSite = _require3.TopSite,
+      TopSitePlaceholder = _require3.TopSitePlaceholder;
+
+
+const TopSites = props => {
+  const realTopSites = props.TopSites.rows.slice(0, props.TopSitesCount);
+  const placeholderCount = props.TopSitesCount - realTopSites.length;
+  return React.createElement(
+    TopSitesPerfTimer,
+    null,
     React.createElement(
-      "h3",
-      { className: "section-title" },
-      React.createElement("span", { className: `icon icon-small-spacer icon-topsites` }),
-      React.createElement(FormattedMessage, { id: "header_top_sites" })
-    ),
-    React.createElement(
-      "ul",
-      { className: "top-sites-list" },
-      props.TopSites.rows.slice(0, props.TopSitesCount).map((link, index) => link && React.createElement(TopSite, {
-        key: link.guid || link.url,
-        dispatch: props.dispatch,
-        link: link,
-        index: index,
-        intl: props.intl }))
-    ),
-    React.createElement(TopSitesEdit, props)
-  )
-);
+      "section",
+      { className: "top-sites" },
+      React.createElement(
+        "h3",
+        { className: "section-title" },
+        React.createElement("span", { className: `icon icon-small-spacer icon-topsites` }),
+        React.createElement(FormattedMessage, { id: "header_top_sites" })
+      ),
+      React.createElement(
+        "ul",
+        { className: "top-sites-list" },
+        realTopSites.map((link, index) => link && React.createElement(TopSite, {
+          key: link.guid || link.url,
+          dispatch: props.dispatch,
+          link: link,
+          index: index,
+          intl: props.intl })),
+        placeholderCount > 0 && [...Array(placeholderCount)].map((_, i) => React.createElement(TopSitePlaceholder, { key: i }))
+      ),
+      realTopSites.length > 0 && React.createElement(TopSitesEdit, props)
+    )
+  );
+};
 
 module.exports = connect(state => ({ TopSites: state.TopSites, TopSitesCount: state.Prefs.values.topSitesCount }))(TopSites);
 module.exports._unconnected = TopSites;
 
 /***/ }),
 /* 14 */
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -1412,26 +1442,30 @@ const FormattedMessage = _require.Format
 
 var _require2 = __webpack_require__(1);
 
 const ac = _require2.actionCreators,
       at = _require2.actionTypes;
 
 
 const TopSiteForm = __webpack_require__(16);
-const TopSite = __webpack_require__(7);
-
-var _require3 = __webpack_require__(5);
-
-const TOP_SITES_DEFAULT_LENGTH = _require3.TOP_SITES_DEFAULT_LENGTH,
-      TOP_SITES_SHOWMORE_LENGTH = _require3.TOP_SITES_SHOWMORE_LENGTH;
-
-var _require4 = __webpack_require__(4);
-
-const TOP_SITES_SOURCE = _require4.TOP_SITES_SOURCE;
+
+var _require3 = __webpack_require__(7);
+
+const TopSite = _require3.TopSite,
+      TopSitePlaceholder = _require3.TopSitePlaceholder;
+
+var _require4 = __webpack_require__(5);
+
+const TOP_SITES_DEFAULT_LENGTH = _require4.TOP_SITES_DEFAULT_LENGTH,
+      TOP_SITES_SHOWMORE_LENGTH = _require4.TOP_SITES_SHOWMORE_LENGTH;
+
+var _require5 = __webpack_require__(4);
+
+const TOP_SITES_SOURCE = _require5.TOP_SITES_SOURCE;
 
 
 class TopSitesEdit extends React.Component {
   constructor(props) {
     super(props);
     this.state = {
       showEditModal: false,
       showAddForm: false,
@@ -1484,16 +1518,18 @@ class TopSitesEdit extends React.Compone
   onEdit(index) {
     this.setState({ showEditForm: true, editIndex: index });
     this.props.dispatch(ac.UserEvent({
       source: TOP_SITES_SOURCE,
       event: "TOP_SITES_EDIT_FORM_OPEN"
     }));
   }
   render() {
+    const realTopSites = this.props.TopSites.rows.slice(0, this.props.TopSitesCount);
+    const placeholderCount = this.props.TopSitesCount - realTopSites.length;
     return React.createElement(
       "div",
       { className: "edit-topsites-wrapper" },
       React.createElement(
         "div",
         { className: "edit-topsites-button" },
         React.createElement(
           "button",
@@ -1518,24 +1554,25 @@ class TopSitesEdit extends React.Compone
               "h3",
               { className: "section-title" },
               React.createElement("span", { className: `icon icon-small-spacer icon-topsites` }),
               React.createElement(FormattedMessage, { id: "header_top_sites" })
             ),
             React.createElement(
               "ul",
               { className: "top-sites-list" },
-              this.props.TopSites.rows.slice(0, this.props.TopSitesCount).map((link, index) => link && React.createElement(TopSite, {
+              realTopSites.map((link, index) => link && React.createElement(TopSite, {
                 key: link.guid || link.url,
                 dispatch: this.props.dispatch,
                 link: link,
                 index: index,
                 intl: this.props.intl,
                 onEdit: this.onEdit,
-                editMode: true }))
+                editMode: true })),
+              placeholderCount > 0 && [...Array(placeholderCount)].map((_, i) => React.createElement(TopSitePlaceholder, { key: i }))
             )
           ),
           React.createElement(
             "section",
             { className: "actions" },
             React.createElement(
               "button",
               { className: "add", onClick: this.onAddButtonClick },
@@ -2015,44 +2052,63 @@ var _require2 = __webpack_require__(2);
 
 const FormattedMessage = _require2.FormattedMessage,
       injectIntl = _require2.injectIntl;
 
 var _require3 = __webpack_require__(1);
 
 const ac = _require3.actionCreators;
 
+var _require4 = __webpack_require__(20);
+
+const IS_NEWTAB = _require4.IS_NEWTAB;
+
 
 class Search extends React.Component {
   constructor(props) {
     super(props);
     this.onClick = this.onClick.bind(this);
     this.onInputMount = this.onInputMount.bind(this);
   }
 
   handleEvent(event) {
     // Also track search events with our own telemetry
     if (event.detail.type === "Search") {
       this.props.dispatch(ac.UserEvent({ event: "SEARCH" }));
     }
   }
   onClick(event) {
-    this.controller.search(event);
+    window.gContentSearchController.search(event);
+  }
+  componentWillUnmount() {
+    delete window.gContentSearchController;
   }
   onInputMount(input) {
     if (input) {
-      // The first "newtab" parameter here is called the "healthReportKey" and needs
-      // to be "newtab" so that BrowserUsageTelemetry.jsm knows to handle events with
-      // this name, and can add the appropriate telemetry probes for search. Without the
-      // correct name, certain tests like browser_UsageTelemetry_content.js will fail (See
-      // github ticket #2348 for more details)
-      this.controller = new ContentSearchUIController(input, input.parentNode, "newtab", "newtab");
+      // The "healthReportKey" and needs to be "newtab" or "abouthome" so that
+      // BrowserUsageTelemetry.jsm knows to handle events with this name, and
+      // can add the appropriate telemetry probes for search. Without the correct
+      // name, certain tests like browser_UsageTelemetry_content.js will fail
+      // (See github ticket #2348 for more details)
+      const healthReportKey = IS_NEWTAB ? "newtab" : "abouthome";
+
+      // The "searchSource" needs to be "newtab" or "homepage" and is sent with
+      // the search data and acts as context for the search request (See
+      // nsISearchEngine.getSubmission). It is necessary so that search engine
+      // plugins can correctly atribute referrals. (See github ticket #3321 for
+      // more details)
+      const searchSource = IS_NEWTAB ? "newtab" : "homepage";
+
+      // gContentSearchController needs to exist as a global so that tests for
+      // the existing about:home can find it; and so it allows these tests to pass.
+      // In the future, when activity stream is default about:home, this can be renamed
+      window.gContentSearchController = new ContentSearchUIController(input, input.parentNode, healthReportKey, searchSource);
       addEventListener("ContentSearchClient", this);
     } else {
-      this.controller = null;
+      window.gContentSearchController = null;
       removeEventListener("ContentSearchClient", this);
     }
   }
 
   /*
    * Do not change the ID on the input field, as legacy newtab code
    * specifically looks for the id 'newtab-search-text' on input fields
    * in order to execute searches in various tests
@@ -2075,16 +2131,17 @@ class Search extends React.Component {
         maxLength: "256",
         placeholder: this.props.intl.formatMessage({ id: "search_web_placeholder" }),
         ref: this.onInputMount,
         title: this.props.intl.formatMessage({ id: "search_web_placeholder" }),
         type: "search" }),
       React.createElement(
         "button",
         {
+          id: "searchSubmit",
           className: "search-button",
           onClick: this.onClick,
           title: this.props.intl.formatMessage({ id: "search_button" }) },
         React.createElement(
           "span",
           { className: "sr-only" },
           React.createElement(FormattedMessage, { id: "search_button" })
         )
@@ -2098,16 +2155,28 @@ module.exports._unconnected = Search;
 
 /***/ }),
 /* 20 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
+module.exports = {
+  // constant to know if the page is about:newtab or about:home
+  IS_NEWTAB: document.documentURI === "about:newtab"
+};
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
 const React = __webpack_require__(0);
 
 var _require = __webpack_require__(3);
 
 const connect = _require.connect;
 
 var _require2 = __webpack_require__(2);
 
@@ -2211,17 +2280,17 @@ const ConfirmDialog = React.createClass(
   }
 });
 
 module.exports = connect(state => state.Dialog)(ConfirmDialog);
 module.exports._unconnected = ConfirmDialog;
 module.exports.Dialog = ConfirmDialog;
 
 /***/ }),
-/* 21 */
+/* 22 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 const React = __webpack_require__(0);
 
 var _require = __webpack_require__(3);
@@ -2265,17 +2334,17 @@ class ManualMigration extends React.Comp
   render() {
     return React.createElement(
       "div",
       { className: "manual-migration-container" },
       React.createElement(
         "p",
         null,
         React.createElement("span", { className: "icon icon-import" }),
-        React.createElement(FormattedMessage, { id: "manual_migration_explanation" })
+        React.createElement(FormattedMessage, { id: "manual_migration_explanation2" })
       ),
       React.createElement(
         "div",
         { className: "manual-migration-actions actions" },
         React.createElement(
           "button",
           { className: "dismiss", onClick: this.onCancelTour },
           React.createElement(FormattedMessage, { id: "manual_migration_cancel_button" })
@@ -2289,17 +2358,17 @@ class ManualMigration extends React.Comp
     );
   }
 }
 
 module.exports = connect()(ManualMigration);
 module.exports._unconnected = ManualMigration;
 
 /***/ }),
-/* 22 */
+/* 23 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 const React = __webpack_require__(0);
 
 var _require = __webpack_require__(3);
@@ -2419,20 +2488,21 @@ class PreferencesPane extends React.Comp
             React.createElement(
               "h1",
               null,
               React.createElement(FormattedMessage, { id: "settings_pane_header" })
             ),
             React.createElement(
               "p",
               null,
-              React.createElement(FormattedMessage, { id: "settings_pane_body" })
+              React.createElement(FormattedMessage, { id: "settings_pane_body2" })
             ),
             React.createElement(PreferencesInput, { className: "showSearch", prefName: "showSearch", value: prefs.showSearch, onChange: this.handlePrefChange,
               titleString: { id: "settings_pane_search_header" }, descString: { id: "settings_pane_search_body" } }),
+            React.createElement("hr", null),
             React.createElement(PreferencesInput, { className: "showTopSites", prefName: "showTopSites", value: prefs.showTopSites, onChange: this.handlePrefChange,
               titleString: { id: "settings_pane_topsites_header" }, descString: { id: "settings_pane_topsites_body" } }),
             React.createElement(
               "div",
               { className: "options" },
               React.createElement(PreferencesInput, { className: "showMoreTopSites", prefName: "topSitesCount", value: prefs.topSitesCount !== TOP_SITES_DEFAULT_LENGTH, onChange: this.handlePrefChange,
                 titleString: { id: "settings_pane_topsites_options_showmore" }, labelClassName: "icon icon-topsites" })
             ),
@@ -2461,17 +2531,17 @@ class PreferencesPane extends React.Comp
   }
 }
 
 module.exports = connect(state => ({ Prefs: state.Prefs, Sections: state.Sections }))(injectIntl(PreferencesPane));
 module.exports.PreferencesPane = PreferencesPane;
 module.exports.PreferencesInput = PreferencesInput;
 
 /***/ }),
-/* 23 */
+/* 24 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 /* WEBPACK VAR INJECTION */(function(global) {
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
 const React = __webpack_require__(0);
@@ -2480,26 +2550,29 @@ var _require = __webpack_require__(3);
 
 const connect = _require.connect;
 
 var _require2 = __webpack_require__(2);
 
 const injectIntl = _require2.injectIntl,
       FormattedMessage = _require2.FormattedMessage;
 
-const Card = __webpack_require__(24);
-const Topics = __webpack_require__(26);
+const Card = __webpack_require__(25);
+const PlaceholderCard = Card.PlaceholderCard;
+
+const Topics = __webpack_require__(27);
 
 var _require3 = __webpack_require__(1);
 
 const ac = _require3.actionCreators;
 
 
 const VISIBLE = "visible";
 const VISIBILITY_CHANGE_EVENT = "visibilitychange";
+const CARDS_PER_ROW = 3;
 
 class Section extends React.Component {
   constructor(props) {
     super(props);
     this.onInfoEnter = this.onInfoEnter.bind(this);
     this.onInfoLeave = this.onInfoLeave.bind(this);
     this.state = { infoActive: false };
   }
@@ -2589,44 +2662,62 @@ class Section extends React.Component {
     // Don't send impression stats for the empty state
     props.rows.length &&
     // We only want to send impression stats if the content of the cards has changed
     props.rows !== prevProps.rows) {
       this.sendImpressionStatsOrAddListener();
     }
   }
 
+  numberOfPlaceholders(items) {
+    if (items === 0) {
+      return CARDS_PER_ROW;
+    }
+    const remainder = items % CARDS_PER_ROW;
+    if (remainder === 0) {
+      return 0;
+    }
+    return CARDS_PER_ROW - remainder;
+  }
+
   render() {
     var _props = this.props;
     const id = _props.id,
           eventSource = _props.eventSource,
           title = _props.title,
           icon = _props.icon,
           rows = _props.rows,
           infoOption = _props.infoOption,
           emptyState = _props.emptyState,
           dispatch = _props.dispatch,
           maxRows = _props.maxRows,
           contextMenuOptions = _props.contextMenuOptions,
-          intl = _props.intl;
-
-    const maxCards = 3 * maxRows;
-    const initialized = rows && rows.length > 0;
+          intl = _props.intl,
+          initialized = _props.initialized;
+
+    const maxCards = CARDS_PER_ROW * maxRows;
     const shouldShowTopics = id === "topstories" && this.props.topics && this.props.topics.length > 0 && this.props.read_more_endpoint;
 
     const infoOptionIconA11yAttrs = {
       "aria-haspopup": "true",
       "aria-controls": "info-option",
       "aria-expanded": this.state.infoActive ? "true" : "false",
       "role": "note",
       "tabIndex": 0
     };
 
     const sectionInfoTitle = intl.formatMessage({ id: "section_info_option" });
 
+    const realRows = rows.slice(0, maxCards);
+    const placeholders = this.numberOfPlaceholders(realRows.length);
+
+    // The empty state should only be shown after we have initialized and there is no content.
+    // Otherwise, we should show placeholders.
+    const shouldShowEmptyState = initialized && !rows.length;
+
     // <Section> <-- React component
     // <section> <-- HTML5 element
     return React.createElement(
       "section",
       null,
       React.createElement(
         "div",
         { className: "section-top-bar" },
@@ -2661,22 +2752,23 @@ class Section extends React.Component {
             infoOption.link && React.createElement(
               "a",
               { href: infoOption.link.href, target: "_blank", rel: "noopener noreferrer", className: "info-option-link" },
               this.getFormattedMessage(infoOption.link.title || infoOption.link)
             )
           )
         )
       ),
-      React.createElement(
+      !shouldShowEmptyState && React.createElement(
         "ul",
         { className: "section-list", style: { padding: 0 } },
-        rows.slice(0, maxCards).map((link, index) => link && React.createElement(Card, { index: index, dispatch: dispatch, link: link, contextMenuOptions: contextMenuOptions, eventSource: eventSource }))
+        realRows.map((link, index) => link && React.createElement(Card, { key: index, index: index, dispatch: dispatch, link: link, contextMenuOptions: contextMenuOptions, eventSource: eventSource })),
+        placeholders > 0 && [...new Array(placeholders)].map((_, i) => React.createElement(PlaceholderCard, { key: i }))
       ),
-      !initialized && React.createElement(
+      shouldShowEmptyState && React.createElement(
         "div",
         { className: "section-empty-state" },
         React.createElement(
           "div",
           { className: "empty-state" },
           emptyState.icon && emptyState.icon.startsWith("moz-extension://") ? React.createElement("img", { className: "empty-state-icon icon", style: { "background-image": `url('${emptyState.icon}')` } }) : React.createElement("img", { className: `empty-state-icon icon icon-${emptyState.icon}` }),
           React.createElement(
             "p",
@@ -2685,17 +2777,22 @@ class Section extends React.Component {
           )
         )
       ),
       shouldShowTopics && React.createElement(Topics, { topics: this.props.topics, read_more_endpoint: this.props.read_more_endpoint })
     );
   }
 }
 
-Section.defaultProps = { document: global.document };
+Section.defaultProps = {
+  document: global.document,
+  rows: [],
+  emptyState: {},
+  title: ""
+};
 
 const SectionIntl = injectIntl(Section);
 
 class Sections extends React.Component {
   render() {
     const sections = this.props.Sections;
     return React.createElement(
       "div",
@@ -2707,30 +2804,30 @@ class Sections extends React.Component {
 
 module.exports = connect(state => ({ Sections: state.Sections }))(Sections);
 module.exports._unconnected = Sections;
 module.exports.SectionIntl = SectionIntl;
 module.exports._unconnectedSection = Section;
 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(9)))
 
 /***/ }),
-/* 24 */
+/* 25 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 const React = __webpack_require__(0);
 const LinkMenu = __webpack_require__(8);
 
 var _require = __webpack_require__(2);
 
 const FormattedMessage = _require.FormattedMessage;
 
-const cardContextTypes = __webpack_require__(25);
+const cardContextTypes = __webpack_require__(26);
 
 var _require2 = __webpack_require__(1);
 
 const ac = _require2.actionCreators,
       at = _require2.actionTypes;
 
 /**
  * Card component.
@@ -2786,31 +2883,32 @@ class Card extends React.Component {
   }
   render() {
     var _props = this.props;
     const index = _props.index,
           link = _props.link,
           dispatch = _props.dispatch,
           contextMenuOptions = _props.contextMenuOptions,
           eventSource = _props.eventSource;
+    const props = this.props;
 
     const isContextMenuOpen = this.state.showContextMenu && this.state.activeCard === index;
 
     var _ref = link.type ? cardContextTypes[link.type] : {};
 
     const icon = _ref.icon,
           intlID = _ref.intlID;
 
 
     return React.createElement(
       "li",
-      { className: `card-outer${isContextMenuOpen ? " active" : ""}` },
+      { className: `card-outer${isContextMenuOpen ? " active" : ""}${props.placeholder ? " placeholder" : ""}` },
       React.createElement(
         "a",
-        { href: link.url, onClick: this.onLinkClick },
+        { 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})` } }),
           React.createElement(
             "div",
             { className: `card-details${link.image ? "" : " no-image"}` },
             link.hostname && React.createElement(
@@ -2840,41 +2938,46 @@ class Card extends React.Component {
                 "div",
                 { className: "card-context-label" },
                 React.createElement(FormattedMessage, { id: intlID, defaultMessage: "Visited" })
               )
             )
           )
         )
       ),
-      React.createElement(
+      !props.placeholder && React.createElement(
         "button",
         { className: "context-menu-button icon",
           onClick: this.onMenuButtonClick },
         React.createElement(
           "span",
           { className: "sr-only" },
           `Open context menu for ${link.title}`
         )
       ),
-      React.createElement(LinkMenu, {
+      !props.placeholder && React.createElement(LinkMenu, {
         dispatch: dispatch,
         index: index,
         source: eventSource,
         onUpdate: this.onMenuUpdate,
         options: link.contextMenuOptions || contextMenuOptions,
         site: link,
         visible: isContextMenuOpen })
     );
   }
 }
+Card.defaultProps = { link: {} };
+
+const PlaceholderCard = () => React.createElement(Card, { placeholder: true });
+
 module.exports = Card;
+module.exports.PlaceholderCard = PlaceholderCard;
 
 /***/ }),
-/* 25 */
+/* 26 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 module.exports = {
   history: {
     intlID: "type_label_visited",
@@ -2890,17 +2993,17 @@ module.exports = {
   },
   now: {
     intlID: "type_label_now",
     icon: "now"
   }
 };
 
 /***/ }),
-/* 26 */
+/* 27 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 const React = __webpack_require__(0);
 
 var _require = __webpack_require__(2);
@@ -2954,25 +3057,25 @@ class Topics extends React.Component {
   }
 }
 
 module.exports = Topics;
 module.exports._unconnected = Topics;
 module.exports.Topic = Topic;
 
 /***/ }),
-/* 27 */
+/* 28 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* eslint-env mozilla/frame-script */
 
-var _require = __webpack_require__(28);
+var _require = __webpack_require__(29);
 
 const createStore = _require.createStore,
       combineReducers = _require.combineReducers,
       applyMiddleware = _require.applyMiddleware;
 
 var _require2 = __webpack_require__(1);
 
 const au = _require2.actionUtils;
@@ -3039,23 +3142,23 @@ module.exports = function initStore(redu
   return store;
 };
 
 module.exports.MERGE_STORE_ACTION = MERGE_STORE_ACTION;
 module.exports.OUTGOING_MESSAGE_NAME = OUTGOING_MESSAGE_NAME;
 module.exports.INCOMING_MESSAGE_NAME = INCOMING_MESSAGE_NAME;
 
 /***/ }),
-/* 28 */
+/* 29 */
 /***/ (function(module, exports) {
 
 module.exports = Redux;
 
 /***/ }),
-/* 29 */
+/* 30 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 var _require = __webpack_require__(1);
 
 const at = _require.actionTypes;
@@ -3125,17 +3228,17 @@ module.exports = class DetectUserSession
     if (this.document.visibilityState === VISIBLE) {
       this._sendEvent();
       this.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
     }
   }
 };
 
 /***/ }),
-/* 30 */
+/* 31 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 /* WEBPACK VAR INJECTION */(function(global) {
 
 const DATABASE_NAME = "snippets_db";
 const DATABASE_VERSION = 1;
 const SNIPPETS_OBJECTSTORE_NAME = "snippets";
--- a/browser/extensions/activity-stream/data/content/activity-stream.css
+++ b/browser/extensions/activity-stream/data/content/activity-stream.css
@@ -139,17 +139,17 @@ a {
   display: flex;
   flex-direction: row;
   margin: 0;
   padding: 15px 25px;
   justify-content: flex-start; }
   .actions button {
     background: #F9F9FA;
     border: 1px solid #B1B1B3;
-    border-radius: 5px;
+    border-radius: 4px;
     color: inherit;
     cursor: pointer;
     padding: 10px 30px;
     white-space: nowrap; }
     .actions button:hover:not(.dismiss) {
       box-shadow: 0 0 0 5px #D7D7DB;
       transition: box-shadow 150ms; }
     .actions button.dismiss {
@@ -291,16 +291,20 @@ main {
       box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 1px 4px 0 rgba(12, 12, 13, 0.1);
       color: #737373;
       font-weight: 200;
       font-size: 32px;
       text-transform: uppercase;
       display: flex;
       align-items: center;
       justify-content: center; }
+    .top-sites-list .top-site-outer.placeholder .tile {
+      box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); }
+    .top-sites-list .top-site-outer.placeholder .screenshot {
+      display: none; }
     .top-sites-list .top-site-outer .screenshot {
       position: absolute;
       top: 0;
       left: 0;
       height: 100%;
       width: 100%;
       background-color: #FFF;
       border-radius: 6px;
@@ -319,27 +323,28 @@ main {
       width: 100%;
       border-radius: 6px;
       box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
       background-position: center center;
       background-size: 96px;
       background-repeat: no-repeat; }
     .top-sites-list .top-site-outer .title {
       font: message-box;
-      height: 20px;
+      height: 30px;
       line-height: 30px;
       text-align: center;
       width: 96px;
       position: relative; }
       .top-sites-list .top-site-outer .title .icon {
         fill: #D7D7DB;
         offset-inline-start: 0;
         position: absolute;
         top: 10px; }
       .top-sites-list .top-site-outer .title span {
+        height: 30px;
         display: block;
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap; }
       .top-sites-list .top-site-outer .title.pinned span {
         padding: 0 13px; }
     .top-sites-list .top-site-outer .edit-menu {
       background: #FFF;
@@ -719,79 +724,96 @@ main {
           background: #0060DF;
           color: #FFF; }
           .context-menu > ul > li > a:hover a, .context-menu > ul > li > a:focus a {
             color: #0C0C0D; }
           .context-menu > ul > li > a:hover:hover, .context-menu > ul > li > a:hover:focus, .context-menu > ul > li > a:focus:hover, .context-menu > ul > li > a:focus:focus {
             color: #FFF; }
 
 .prefs-pane {
-  font-size: 13px; }
+  color: #4A4A4F;
+  font-size: 15px;
+  line-height: 21px; }
   .prefs-pane .sidebar {
     background: #FFF;
     border-left: 1px solid #D7D7DB;
     box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1);
-    min-height: 100%;
+    height: 100%;
     offset-inline-end: 0;
+    overflow-y: auto;
     padding: 40px;
     position: fixed;
     top: 0;
     transition: 0.1s cubic-bezier(0, 0, 0, 1);
     transition-property: transform;
     width: 400px;
     z-index: 12000; }
     .prefs-pane .sidebar.hidden {
       transform: translateX(100%); }
       .prefs-pane .sidebar.hidden:dir(rtl) {
         transform: translateX(-100%); }
     .prefs-pane .sidebar h1 {
-      border-bottom: 1px solid #D7D7DB;
       font-size: 24px;
       margin: 0;
-      padding: 20px 0; }
-  .prefs-pane .prefs-modal-inner-wrapper section {
-    margin: 20px 0; }
-    .prefs-pane .prefs-modal-inner-wrapper section p {
-      margin: 5px 0 5px 30px; }
-    .prefs-pane .prefs-modal-inner-wrapper section label {
-      display: inline-block;
-      position: relative;
-      width: 100%; }
-      .prefs-pane .prefs-modal-inner-wrapper section label input {
-        offset-inline-start: -30px;
-        position: absolute;
-        top: 0; }
-    .prefs-pane .prefs-modal-inner-wrapper section > label {
-      font-size: 16px;
-      font-weight: bold; }
-  .prefs-pane .prefs-modal-inner-wrapper .options {
-    background: #F9F9FA;
-    border: 1px solid #D7D7DB;
-    border-radius: 3px;
-    margin: 15px 0;
-    margin-inline-start: 30px;
-    padding: 10px; }
-    .prefs-pane .prefs-modal-inner-wrapper .options label {
-      background-position: 35px center;
-      background-repeat: no-repeat;
-      display: inline-block;
-      font-size: 13px;
-      font-weight: normal;
-      height: 21px;
-      line-height: 21px;
-      width: 100%; }
-      .prefs-pane .prefs-modal-inner-wrapper .options label:dir(rtl) {
-        background-position: 217px center; }
-    .prefs-pane .prefs-modal-inner-wrapper .options [type='checkbox']:not(:checked) + label,
-    .prefs-pane .prefs-modal-inner-wrapper .options [type='checkbox']:checked + label {
-      padding-inline-start: 63px; }
-    .prefs-pane .prefs-modal-inner-wrapper .options section {
-      margin: 0; }
+      padding-top: 20px; }
+  .prefs-pane hr {
+    border: 0;
+    border-bottom: 1px solid #D7D7DB;
+    margin: 28px 0; }
+  .prefs-pane .prefs-modal-inner-wrapper {
+    padding-bottom: 100px; }
+    .prefs-pane .prefs-modal-inner-wrapper section {
+      margin: 20px 0; }
+      .prefs-pane .prefs-modal-inner-wrapper section p {
+        margin: 5px 0 5px 30px; }
+      .prefs-pane .prefs-modal-inner-wrapper section label {
+        display: inline-block;
+        position: relative;
+        width: 100%; }
+        .prefs-pane .prefs-modal-inner-wrapper section label input {
+          offset-inline-start: -30px;
+          position: absolute;
+          top: 0; }
+      .prefs-pane .prefs-modal-inner-wrapper section > label {
+        font-size: 17px;
+        font-weight: bold;
+        line-height: 19px; }
+    .prefs-pane .prefs-modal-inner-wrapper .options {
+      background: #F9F9FA;
+      border: 1px solid #D7D7DB;
+      border-radius: 2px;
+      margin: -10px 0 20px;
+      margin-inline-start: 30px;
+      padding: 10px; }
+      .prefs-pane .prefs-modal-inner-wrapper .options label {
+        background-position-x: 35px;
+        background-position-y: 2.5px;
+        background-repeat: no-repeat;
+        display: inline-block;
+        font-size: 13px;
+        font-weight: normal;
+        height: auto;
+        line-height: 21px;
+        width: 100%; }
+        .prefs-pane .prefs-modal-inner-wrapper .options label:dir(rtl) {
+          background-position-x: 217px; }
+      .prefs-pane .prefs-modal-inner-wrapper .options [type='checkbox']:not(:checked) + label,
+      .prefs-pane .prefs-modal-inner-wrapper .options [type='checkbox']:checked + label {
+        padding-inline-start: 63px; }
+      .prefs-pane .prefs-modal-inner-wrapper .options section {
+        margin: 0; }
   .prefs-pane .actions {
-    padding: 15px 0; }
+    background-color: #F9F9FA;
+    bottom: 0;
+    offset-inline-end: -1px;
+    padding: 20px;
+    position: fixed;
+    width: 400px; }
+    .prefs-pane .actions button {
+      margin-inline-end: 20px; }
   .prefs-pane [type='checkbox']:not(:checked),
   .prefs-pane [type='checkbox']:checked {
     offset-inline-start: -9999px;
     position: absolute; }
   .prefs-pane [type='checkbox']:not(:checked) + label,
   .prefs-pane [type='checkbox']:checked + label {
     cursor: pointer;
     padding: 0 30px;
@@ -909,16 +931,20 @@ main {
     transform: scale(0.25);
     opacity: 0;
     transition-property: transform, opacity;
     transition-duration: 200ms;
     z-index: 399; }
     .card-outer .context-menu-button:focus, .card-outer .context-menu-button:active {
       transform: scale(1);
       opacity: 1; }
+  .card-outer.placeholder {
+    background: transparent; }
+    .card-outer.placeholder .card {
+      box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); }
   .card-outer .card {
     height: 100%;
     border-radius: 3px;
     box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); }
   .card-outer > a {
     display: block;
     color: inherit;
     height: 100%;
--- a/browser/extensions/activity-stream/data/locales.json
+++ b/browser/extensions/activity-stream/data/locales.json
@@ -80,18 +80,16 @@
     "pocket_feedback_header": "Kakube maber loyo, dano makato milion 25 aye oyubo.",
     "pocket_feedback_body": "Pocket, but jo me Mozilla, bi konyi me kube i jami mabeco loyo ma twero bedo ni pe i nongo.",
     "pocket_send_feedback": "Cwal adwogi",
     "topstories_empty_state": "Ityeko weng. Rot doki lacen pi lok madito mapol ki bot {provider}. Pe itwero kuro? Yer lok macuke lamal me nongo lok mabeco mapol ki i but kakube.",
     "manual_migration_explanation": "Tem Firefox ki kakube ki alamabuk ni ma imaro loyo ki i layeny mukene.",
     "manual_migration_cancel_button": "Pe Apwoyo",
     "manual_migration_import_button": "Kel kombedi"
   },
-  "af": {},
-  "an": {},
   "ar": {
     "newtab_page_title": "لسان جديد",
     "default_label_loading": "يُحمّل…",
     "header_top_sites": "المواقع الأكثر زيارة",
     "header_stories": "أهم الأخبار",
     "header_visit_again": "زرها مجددا",
     "header_bookmarks": "أحدث العلامات",
     "header_bookmarks_placeholder": "لا علامات لديك بعد.",
@@ -161,31 +159,31 @@
     "topsites_form_cancel_button": "ألغِ",
     "topsites_form_url_validation": "مطلوب مسار صالح",
     "pocket_read_more": "المواضيع الشائعة:",
     "pocket_read_even_more": "اعرض المزيد من الأخبار",
     "pocket_feedback_header": "أفضل ما في الوِب، انتقاها أكثر من ٢٥ مليون شخص.",
     "pocket_feedback_body": "يساعدك Pocket –عضو في أسرة موزيلا– على الوصول إلى محتوى عالِ الجودة ربما لم يُكن ليتاح لك بدونه.",
     "pocket_send_feedback": "أرسل انطباعك"
   },
-  "as": {},
   "ast": {
     "newtab_page_title": "Llingüeta nueva",
     "default_label_loading": "Cargando…",
     "header_top_sites": "Sitios destacaos",
     "type_label_open": "Abrir",
     "type_label_topic": "Tema",
     "welcome_title": "Bienllegáu/ada a la llingüeta nueva",
     "welcome_body": "Firefox usará esti espaciu p'amosate los marcadores, artículos, vídeos y páxines más relevantes de los que visitares apocayá, asina pues volver a ello de mou cenciellu."
   },
   "az": {
     "newtab_page_title": "Yeni Vərəq",
     "default_label_loading": "Yüklənir…",
     "header_top_sites": "Qabaqcıl Saytlar",
     "header_stories": "Qabaqcıl Hekayələr",
+    "header_highlights": "Seçilmişlər",
     "header_visit_again": "Təkrar ziyarət et",
     "header_bookmarks": "Son Əlfəcinlər",
     "header_recommended_by": "{provider} məsləhət görür",
     "header_bookmarks_placeholder": "Hələlik heç əlfəcininiz yoxdur.",
     "header_stories_from": "qaynaq:",
     "type_label_visited": "Ziyarət edilib",
     "type_label_bookmarked": "Əlfəcinlənib",
     "type_label_synced": "Digər cihazdan sync edilib",
@@ -207,37 +205,41 @@
     "confirm_history_delete_notice_p2": "Bu əməliyyat geri alına bilməz.",
     "menu_action_save_to_pocket": "Pocket-ə Saxla",
     "search_for_something_with": "{search_term} üçün bununla axtar:",
     "search_button": "Axtar",
     "search_header": "{search_engine_name} Axtarış",
     "search_web_placeholder": "İnternetdə Axtar",
     "search_settings": "Axtarış Tənzimləmələrini Dəyiş",
     "section_info_option": "Məlumat",
+    "section_info_send_feedback": "Əks-əlaqə göndər",
+    "section_info_privacy_notice": "Məxfilik Bildirişi",
     "welcome_title": "Yeni vərəqə xoş gəldiniz",
     "welcome_body": "Firefox bu səhifədə ən uyğun əlfəcin, məqalə, video və son ziyarət etdiyiniz səhifələri göstərərək onları rahat tapmağınıza kömək edəcək.",
     "welcome_label": "Seçilmişləriniz təyin edilir",
     "time_label_less_than_minute": "<1d",
     "time_label_minute": "{number}d",
     "time_label_hour": "{number}s",
     "time_label_day": "{number}g",
     "settings_pane_button_label": "Yeni Vərəq səhifənizi özəlləşdirin",
     "settings_pane_header": "Yeni Vərəq Nizamlamaları",
-    "settings_pane_body": "Yeni vərəq açdığınızda nə görəcəyinizi seçin.",
+    "settings_pane_body2": "Bu səhifədə nə görəcəyinizi seçin.",
     "settings_pane_search_header": "Axtar",
     "settings_pane_search_body": "Yeni vərəqinizdən Web-də axtarış edin.",
     "settings_pane_topsites_header": "Qabaqcıl Saytlar",
     "settings_pane_topsites_body": "Ən çox ziyarət etdiyiniz saytları görün.",
     "settings_pane_topsites_options_showmore": "İki sətir göstər",
     "settings_pane_bookmarks_header": "Son Əlfəcinlər",
     "settings_pane_bookmarks_body": "Yeni yaradılan əlfəcinlər tək bir əlverişli yerdə.",
     "settings_pane_visit_again_header": "Təkrar ziyarət et",
     "settings_pane_visit_again_body": "Firefox tarixçənizdən yadda saxlamaq və ya geri qayıtmaq istəyə biləcəyiniz hissələri göstərəcək.",
-    "settings_pane_pocketstories_header": "Qabaqcıl Hekayələr",
-    "settings_pane_pocketstories_body": "Pocket, Mozilla ailəsinin üzvü, yüksək keyfiyyətli məzmunları kəşf etməyinizə kömək edəcək.",
+    "settings_pane_highlights_header": "Seçilmişlər",
+    "settings_pane_highlights_options_bookmarks": "Əlfəcinlər",
+    "settings_pane_highlights_options_visited": "Baxılmış Saytlar",
+    "settings_pane_snippets_header": "Hissələr",
     "settings_pane_done_button": "Oldu",
     "edit_topsites_button_text": "Redaktə et",
     "edit_topsites_button_label": "Qabaqcıl Saytlar bölümünüzü fərdiləşdirin",
     "edit_topsites_showmore_button": "Daha çox göstər",
     "edit_topsites_showless_button": "Daha az göstər",
     "edit_topsites_done_button": "Oldu",
     "edit_topsites_pin_button": "Bu saytı sabitlə",
     "edit_topsites_unpin_button": "Bu saytı çıxart",
@@ -250,20 +252,18 @@
     "topsites_form_url_placeholder": "Ünvanı yazın və ya yapışdırın",
     "topsites_form_add_button": "Əlavə et",
     "topsites_form_save_button": "Saxla",
     "topsites_form_cancel_button": "Ləğv et",
     "topsites_form_url_validation": "Doğru ünvan tələb olunur",
     "pocket_read_more": "Məşhur Mövzular:",
     "pocket_read_even_more": "Daha çox hekayə gör",
     "pocket_feedback_header": "25 milyon nəfərin dəstəyi ilə internetin ən yaxşıları.",
-    "pocket_feedback_body": "Pocket, Mozilla ailəsinin üzvü, yüksək keyfiyyətli məzmunları kəşf etməyinizə kömək edəcək.",
-    "pocket_send_feedback": "Əks-əlaqə göndər",
     "topstories_empty_state": "Hamısını oxudunuz. Yeni {provider} məqalələri üçün daha sonra təkrar yoxlayın. Gözləyə bilmirsiz? Məşhur mövzu seçərək internetdən daha çox gözəl məqalələr tapın.",
-    "manual_migration_explanation": "Firefox səyyahını digər səyyahınızdan olan sevimli sayt və əlfəcinlərinizlə yoxlayın.",
+    "manual_migration_explanation2": "Firefox səyyahını digər səyyahlardan olan əlfəcin, tarixçə və parollar ilə yoxlayın.",
     "manual_migration_cancel_button": "Xeyr, Təşəkkürlər",
     "manual_migration_import_button": "İndi idxal et"
   },
   "be": {
     "newtab_page_title": "Новая картка",
     "default_label_loading": "Загрузка…",
     "header_top_sites": "Папулярныя сайты",
     "header_stories": "Галоўныя навіны",
@@ -348,16 +348,17 @@
     "manual_migration_cancel_button": "Не, дзякуй",
     "manual_migration_import_button": "Імпартаваць зараз"
   },
   "bg": {
     "newtab_page_title": "Нов раздел",
     "default_label_loading": "Зареждане…",
     "header_top_sites": "Най-посещавани",
     "header_stories": "Популярни",
+    "header_highlights": "Акценти",
     "header_visit_again": "Посещаване",
     "header_bookmarks": "Последни отметки",
     "header_recommended_by": "Препоръчано от {provider}",
     "header_bookmarks_placeholder": "Все още нямате отметки.",
     "header_stories_from": "от",
     "type_label_visited": "Посетена",
     "type_label_bookmarked": "Отметната",
     "type_label_synced": "Синхронизирана от друго устройство",
@@ -379,37 +380,40 @@
     "confirm_history_delete_notice_p2": "Действието е необратимо.",
     "menu_action_save_to_pocket": "Запазване в Pocket",
     "search_for_something_with": "Търсене на {search_term} с:",
     "search_button": "Търсене",
     "search_header": "Търсене с {search_engine_name}",
     "search_web_placeholder": "Търсене в интернет",
     "search_settings": "Настройки на търсене",
     "section_info_option": "Информация",
+    "section_info_send_feedback": "Обратна връзка",
+    "section_info_privacy_notice": "Политика на поверителност",
     "welcome_title": "Добре дошли в нов раздел",
     "welcome_body": "Firefox ще използва това място, за да ви покаже най-подходящите отметки, статии, видео и страници, които сте посетили наскоро, така че да се върнете към тях лесно.",
     "welcome_label": "Търсене на акценти",
     "time_label_less_than_minute": "<1м",
     "time_label_minute": "{number} м",
     "time_label_hour": "{number} ч",
     "time_label_day": "{number} д",
     "settings_pane_button_label": "Настройки на новия раздел",
     "settings_pane_header": "Настройки на нов раздел",
-    "settings_pane_body": "Изберете какво да виждате при отваряне на нов раздел.",
     "settings_pane_search_header": "Търсене",
     "settings_pane_search_body": "Търсете в мрежата от нов раздел.",
     "settings_pane_topsites_header": "Най-посещавани",
     "settings_pane_topsites_body": "Достъп до сайтовете, които посещавате най-често.",
     "settings_pane_topsites_options_showmore": "Показване на два реда",
     "settings_pane_bookmarks_header": "Последни отметки",
     "settings_pane_bookmarks_body": "Всички нови отметки на едно място.",
     "settings_pane_visit_again_header": "Посещаване",
     "settings_pane_visit_again_body": "Firefox ще ви показва части от вашата история на разглеждане, към която бихте желали да се върнете или запомните.",
-    "settings_pane_pocketstories_header": "Популярни",
-    "settings_pane_pocketstories_body": "Pocket, част от семейството на Mozilla, ще ви помогне да намерите висококачествено съдържанието, което може да не сте открили до сега.",
+    "settings_pane_highlights_header": "Акценти",
+    "settings_pane_highlights_options_bookmarks": "Отметки",
+    "settings_pane_highlights_options_visited": "Посетени страници",
+    "settings_pane_snippets_header": "Изрезки",
     "settings_pane_done_button": "Готово",
     "edit_topsites_button_text": "Редактиране",
     "edit_topsites_button_label": "Настройки на най-посещаваните",
     "edit_topsites_showmore_button": "Повече",
     "edit_topsites_showless_button": "По-малко",
     "edit_topsites_done_button": "Готово",
     "edit_topsites_pin_button": "Закачане",
     "edit_topsites_unpin_button": "Премахване от закачените",
@@ -422,20 +426,17 @@
     "topsites_form_url_placeholder": "Адрес",
     "topsites_form_add_button": "Добавяне",
     "topsites_form_save_button": "Запазване",
     "topsites_form_cancel_button": "Отказ",
     "topsites_form_url_validation": "Необходим е валиден URL",
     "pocket_read_more": "Популярни теми:",
     "pocket_read_even_more": "Повече статии",
     "pocket_feedback_header": "Най-доброто от интернет, подбрано от над 25 милиона души.",
-    "pocket_feedback_body": "Pocket, част от семейството на Mozilla, ще ви помогне да намерите висококачествено съдържанието, което може да не сте открили до сега.",
-    "pocket_send_feedback": "Обратна връзка",
     "topstories_empty_state": "Разгледахте всичко. Проверете по-късно за повече истории от {provider}. Нямате търпение? Изберете популярна тема, за да откриете повече истории из цялата Мрежа.",
-    "manual_migration_explanation": "Изпробвайте Firefox със своите любими сайтове и отметки от друг четец.",
     "manual_migration_cancel_button": "Не, благодаря",
     "manual_migration_import_button": "Внасяне"
   },
   "bn-BD": {
     "newtab_page_title": "নতুন ট্যাব",
     "default_label_loading": "লোড হচ্ছে…",
     "header_top_sites": "শীর্ঘ সাইট",
     "header_stories": "শীর্ষ গল্প",
@@ -515,19 +516,16 @@
     "pocket_feedback_header": "ওয়েব জগতের সেরা, যা ২.৫ লক্ষ মানুষ রক্ষণাবেক্ষণ করে।",
     "pocket_feedback_body": "Pocket, হচ্ছে Mozilla পরিবারের একটি অংশ, যা আপনাকে ভালো-মানের কন্টেন্টের সাথে যুক্ত করবে যা আপনি অন্য কোথাও পাবেন না।",
     "pocket_send_feedback": "প্রতিক্রিয়া জানান",
     "topstories_empty_state": "কিছু একটা ঠিক নেই। {provider} এর শীর্ষ গল্পগুলো পেতে কিছুক্ষণ পর আবার দেখুন। অপেক্ষা করতে চান না? বিশ্বের সেরা গল্পগুলো পেতে কোন জনপ্রিয় বিষয় নির্বাচন করুন।",
     "manual_migration_explanation": "অন্য ব্রাউজার থেকে আপনার পছন্দের সাইট এবং বুকমার্কগুলো নিয়ে Firefox ব্যবহার করুন।",
     "manual_migration_cancel_button": "প্রয়োজন নেই",
     "manual_migration_import_button": "এখনই ইম্পোর্ট করুন"
   },
-  "bn-IN": {},
-  "br": {},
-  "bs": {},
   "ca": {
     "newtab_page_title": "Pestanya nova",
     "default_label_loading": "S'està carregant…",
     "header_top_sites": "Llocs principals",
     "header_stories": "Articles populars",
     "header_visit_again": "Torneu a visitar",
     "header_bookmarks": "Adreces d'interès recents",
     "header_recommended_by": "Recomanat per {provider}",
@@ -609,16 +607,17 @@
     "manual_migration_cancel_button": "No, gràcies",
     "manual_migration_import_button": "Importa-ho ara"
   },
   "cak": {
     "newtab_page_title": "K'ak'a' ruwi'",
     "default_label_loading": "Tajin nusamajij…",
     "header_top_sites": "Utziläj taq Ruxaq K'amaya'l",
     "header_stories": "Utziläj taq B'anob'äl",
+    "header_highlights": "Taq k'ewachinïk",
     "header_visit_again": "Titz'et chik",
     "header_bookmarks": "K'ak'a' taq Yaketal",
     "header_recommended_by": "Chilab'en ruma {provider}",
     "header_bookmarks_placeholder": "K'a majani k'o jujun taq ayaketal.",
     "header_stories_from": "richin",
     "type_label_visited": "Tz'eton",
     "type_label_bookmarked": "Yakon retal",
     "type_label_synced": "Ximon rik'in jun chik okisaxel",
@@ -640,37 +639,43 @@
     "confirm_history_delete_notice_p2": "Man yatikïr ta najäl re b'anïk re'.",
     "menu_action_save_to_pocket": "Tiyak pa Pocket",
     "search_for_something_with": "Tikanoj {search_term} rik'in:",
     "search_button": "Tikanöx",
     "search_header": "{search_engine_name} Tikanöx",
     "search_web_placeholder": "Tikanöx pa Ajk'amaya'l",
     "search_settings": "Tijal Runuk'ulem Kanoxïk",
     "section_info_option": "Rutzijol",
+    "section_info_send_feedback": "Ketaq taq Tzijol",
+    "section_info_privacy_notice": "Rutzijol Ichinanem",
     "welcome_title": "Ütz apetik pa ri k'ak'a' ruwi'",
     "welcome_body": "Firefox xtrokisaj re k'ojlib'äl re' richin xtuk'üt ri taq ruwi', rutzijol, tzuwäch chuqa' taq ruxaq yalan kejqalem ri k'a ja' xe'atz'ët, richin chanin yatikïr yatok jun mul chik.",
     "welcome_label": "Tiya' ketal ri Nïm taq K'ojlib'äl",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}m",
     "time_label_day": "{ajilab'äl}m",
     "settings_pane_button_label": "Tawichinaj ri ruxaq richin K'ak'a' Ruwi'",
     "settings_pane_header": "K'ak'a' Ruwi' Taq Ajowab'äl",
-    "settings_pane_body": "Tacha' ri natz'ët toq najäq jun k'ak'a' ruwi'.",
+    "settings_pane_body2": "Tacha' ri natzu' pa re ruxaq re'.",
     "settings_pane_search_header": "Tikanöx",
     "settings_pane_search_body": "Tikanoj ri k'ak'a' taq ruwi' pa ri K'amaya'l.",
     "settings_pane_topsites_header": "Utziläj taq ruxaq K'amaya'l",
     "settings_pane_topsites_body": "Katok pa ri taq ajk'amaya'l yalan ye'atz'ët.",
     "settings_pane_topsites_options_showmore": "Kek'ut pe ka'i' cholaj",
     "settings_pane_bookmarks_header": "K'ak'a' taq Yaketal",
     "settings_pane_bookmarks_body": "Ri taq awajowab'äl k'a ri xenuk' pa jun utziläj k'ojlib'äl.",
     "settings_pane_visit_again_header": "Tab'etz'eta' chik",
     "settings_pane_visit_again_body": "Firefox  xtuk'ut pe jalajoj taq rub'eyal ri b'anob'äl richin rukusaxik ri k'amaya'l rik'in jub'a' nawajo' nanataj chuqa' yatikir natzu' chik.",
-    "settings_pane_pocketstories_header": "Utziläj taq B'anob'äl",
-    "settings_pane_pocketstories_body": "Pocket, jun peraj chi re ri Mozilla ach'alalri'ïl , xkaruto' richin yatok chupam utziläj taq na'oj ri man awilon ta ke taq ri'.",
+    "settings_pane_highlights_header": "Taq k'ewachinïk",
+    "settings_pane_highlights_body2": "Ke'awila' chik ri jeb'ël taq wachinäq e'atz'eton chuqa' aya'on ketal.",
+    "settings_pane_highlights_options_bookmarks": "Taq yaketal",
+    "settings_pane_highlights_options_visited": "Ruxaq k'amaya'l etz'eton",
+    "settings_pane_snippets_header": "Taq pir",
+    "settings_pane_snippets_body": "Ke'asik'ij koköj taq rutzijol Mozilla chi rij Firefox, rub'anob'al k'amaya'l, chuqa' jantäq q'olonel wachib'äl.",
     "settings_pane_done_button": "Xk'is",
     "edit_topsites_button_text": "Tinuk'",
     "edit_topsites_button_label": "Tab'ana' runuk'ulem ri kitanaj Nimaläj taq Ruxaq K'amaya'l",
     "edit_topsites_showmore_button": "Kek'ut pe ch'aqa' chik",
     "edit_topsites_showless_button": "Tik'ut Jub'a'",
     "edit_topsites_done_button": "Xb'an",
     "edit_topsites_pin_button": "Tixim re k'amaya'l re'",
     "edit_topsites_unpin_button": "Tosq'opïx re ruxaq k'amaya'l re'",
@@ -683,20 +688,20 @@
     "topsites_form_url_placeholder": "Tatz'ib'aj o tatz'ajb'a' jun URL",
     "topsites_form_add_button": "Titz'aqatisäx",
     "topsites_form_save_button": "Tiyak",
     "topsites_form_cancel_button": "Tiq'at",
     "topsites_form_url_validation": "Ütz URL k'atzinel",
     "pocket_read_more": "Nima'q taq Na'oj:",
     "pocket_read_even_more": "Ketz'et ch'aqa' chik taq B'anob'äl",
     "pocket_feedback_header": "Ri rutzil k'amaya'l, aq'oman kuma 25 t'ijt'äq chi winäq.",
-    "pocket_feedback_body": "Pocket, jun peraj chi re ri Mozilla ach'alalri'ïl , xkaruto' richin yatok chupam utziläj taq na'oj ri man awilon ta ke taq ri'.",
-    "pocket_send_feedback": "Ketaq taq Tzijol",
+    "pocket_description": "Ke'awila' utziläj taq rupam pa Pocket, wakami ruch'akulan ri' rik'in Mozilla, ri rik'in jub'a' xtasäch rutz'etik.",
+    "highlights_empty_state": "Katok pa k'amaya'l richin niqak'üt chawäch jeb'ël taq cholna'oj, taq silowachib'äl, chuqa' ch'aqa' chik taq ruxaq k'a b'a' ke'atz'ët o aya'on kan ketal wawe'.",
     "topstories_empty_state": "Xaq'i'. Katzolin chik pe richin ye'ak'ül ri utziläj taq rub'anob'al {provider}. ¿La man noyob'en ta? Tacha' jun ütz na'oj richin nawïl ch'aqa' chik taq b'anob'äl e k'o chi rij ri ajk'amaya'l.",
-    "manual_migration_explanation": "Tatojtob'ej Firefox kik'in ri ruxaq ak'amaya'l chuqa' ayaketal pa jun chik okik'amaya'l.",
+    "manual_migration_explanation2": "Tatojtob'ej Firefox kik'in ri taq ruyaketal, runatab'äl chuqa' taq ewan rutzij jun chik okik'amaya'l.",
     "manual_migration_cancel_button": "Mani matyox",
     "manual_migration_import_button": "Tijik' pe"
   },
   "cs": {
     "newtab_page_title": "Nový panel",
     "default_label_loading": "Načítání…",
     "header_top_sites": "Top stránky",
     "header_stories": "Nejlepší příběhy",
@@ -953,16 +958,17 @@
     "manual_migration_cancel_button": "Nej tak",
     "manual_migration_import_button": "Importer nu"
   },
   "de": {
     "newtab_page_title": "Neuer Tab",
     "default_label_loading": "Wird geladen…",
     "header_top_sites": "Meistbesuchte Seiten",
     "header_stories": "Meistgelesene Meldungen",
+    "header_highlights": "Wichtigste Seiten",
     "header_visit_again": "Erneut besuchen",
     "header_bookmarks": "Neue Lesezeichen",
     "header_recommended_by": "Empfohlen von {provider}",
     "header_bookmarks_placeholder": "Sie haben noch keine Lesezeichen.",
     "header_stories_from": "von",
     "type_label_visited": "Besucht",
     "type_label_bookmarked": "Lesezeichen",
     "type_label_synced": "Von anderem Gerät synchronisiert",
@@ -984,37 +990,43 @@
     "confirm_history_delete_notice_p2": "Diese Aktion kann nicht rückgängig gemacht werden.",
     "menu_action_save_to_pocket": "Bei Pocket speichern",
     "search_for_something_with": "Nach {search_term} suchen mit:",
     "search_button": "Suchen",
     "search_header": "{search_engine_name}-Suche",
     "search_web_placeholder": "Das Web durchsuchen",
     "search_settings": "Sucheinstellungen ändern",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Feedback senden",
+    "section_info_privacy_notice": "Datenschutzhinweis",
     "welcome_title": "Willkommen im neuen Tab",
     "welcome_body": "Firefox nutzt diesen Bereich, um Ihnen Ihre wichtigsten Lesezeichen, Artikel, Videos und kürzlich besuchten Seiten anzuzeigen, damit Sie diese einfach wiederfinden.",
     "welcome_label": "Auswahl Ihrer wichtigsten Seiten",
     "time_label_less_than_minute": "< 1 min",
     "time_label_minute": "{number} m",
     "time_label_hour": "{number} h",
     "time_label_day": "{number} t",
     "settings_pane_button_label": "Neuer-Tab-Seite anpassen",
     "settings_pane_header": "Einstellungen zum neuen Tab",
-    "settings_pane_body": "Entscheiden Sie, was in einem neuen Tab angezeigt wird.",
+    "settings_pane_body2": "Wählen Sie aus, was auf dieser Seite angezeigt wird.",
     "settings_pane_search_header": "Suche",
     "settings_pane_search_body": "Suchen Sie aus einem neuen Tab im Internet.",
     "settings_pane_topsites_header": "Meistbesuchte Seiten",
     "settings_pane_topsites_body": "Schneller Zugriff auf Ihre meistbesuchten Websites.",
     "settings_pane_topsites_options_showmore": "Zwei Reihen anzeigen",
     "settings_pane_bookmarks_header": "Neue Lesezeichen",
     "settings_pane_bookmarks_body": "Ihre neu erstellten Lesezeichen praktisch an einem Ort.",
     "settings_pane_visit_again_header": "Erneut besuchen",
     "settings_pane_visit_again_body": "Firefox zeigt Ihnen Teile Ihrer Surf-Chronik, die Sie sich vielleicht merken oder erneut besuchen möchten.",
-    "settings_pane_pocketstories_header": "Meistgelesene Meldungen",
-    "settings_pane_pocketstories_body": "Pocket, ein Teil der Mozilla-Familie, hilft Ihnen beim Finden von qualitativ hochwertigen Inhalten, die Sie ansonsten vielleicht nicht gefunden hätten.",
+    "settings_pane_highlights_header": "Wichtigste Seiten",
+    "settings_pane_highlights_body2": "Finden Sie schnell wieder auf die wichtigen Seiten zurück, die Sie kürzlich besucht oder als Lesezeichen gespeichert haben.",
+    "settings_pane_highlights_options_bookmarks": "Lesezeichen",
+    "settings_pane_highlights_options_visited": "Besuchte Websites",
+    "settings_pane_snippets_header": "Kurzinformationen",
+    "settings_pane_snippets_body": "Lesen Sie kurze Neuigkeiten von Mozilla über Firefox, die Internetkultur und ab und an mal ein Meme.",
     "settings_pane_done_button": "Fertig",
     "edit_topsites_button_text": "Bearbeiten",
     "edit_topsites_button_label": "Anpassen der meistbesuchten Seiten",
     "edit_topsites_showmore_button": "Mehr anzeigen",
     "edit_topsites_showless_button": "Weniger anzeigen",
     "edit_topsites_done_button": "Fertig",
     "edit_topsites_pin_button": "Website immer in aktueller Position anzeigen",
     "edit_topsites_unpin_button": "Diese Website lösen",
@@ -1027,20 +1039,20 @@
     "topsites_form_url_placeholder": "Eine URL eingeben oder einfügen",
     "topsites_form_add_button": "Hinzufügen",
     "topsites_form_save_button": "Speichern",
     "topsites_form_cancel_button": "Abbrechen",
     "topsites_form_url_validation": "Gültige URL erforderlich",
     "pocket_read_more": "Beliebte Themen:",
     "pocket_read_even_more": "Weitere Nachrichten ansehen",
     "pocket_feedback_header": "Das Beste aus dem Web, zusammengetragen von 25 Millionen Menschen.",
-    "pocket_feedback_body": "Pocket, ein Teil der Mozilla-Familie, hilft Ihnen beim Finden von qualitativ hochwertigen Inhalten, die Sie ansonsten vielleicht nicht gefunden hätten.",
-    "pocket_send_feedback": "Feedback senden",
+    "pocket_description": "Entdecken Sie qualitativ hochwertige Inhalte mithilfe von Pocket (jetzt Teil von von Mozilla), die Sie ansonsten verpassen würden.",
+    "highlights_empty_state": "Surfen Sie los und wir zeigen Ihnen hier tolle Artikel, Videos und andere Seiten, die Sie kürzlich besucht oder als Lesezeichen gespeichert haben.",
     "topstories_empty_state": "Jetzt kennen Sie die Neuigkeiten. Schauen Sie später wieder vorbei, um neue Informationen von {provider} zu erhalten. Können sie nicht warten? Wählen Sie ein beliebtes Thema und lesen Sie weitere interessante Geschichten aus dem Internet.",
-    "manual_migration_explanation": "Nutzen Sie Firefox mit Ihren Lieblings-Websites und Lesezeichen aus einem anderen Browser.",
+    "manual_migration_explanation2": "Probieren Sie Firefox aus und importieren Sie die Lesezeichen, Chronik und Passwörter eines anderen Browsers.",
     "manual_migration_cancel_button": "Nein, danke",
     "manual_migration_import_button": "Jetzt importieren"
   },
   "dsb": {
     "newtab_page_title": "Nowy rejtark",
     "default_label_loading": "Zacytujo se…",
     "header_top_sites": "Nejcesćej woglědane sedła",
     "header_stories": "Nejcesćej pśecytane powěźenki",
@@ -1290,16 +1302,17 @@
     "pocket_feedback_body": "Pocket, a part of the Mozilla family, will help connect you to high-quality content that you may not have found otherwise.",
     "pocket_send_feedback": "Send Feedback"
   },
   "en-US": {
     "newtab_page_title": "New Tab",
     "default_label_loading": "Loading…",
     "header_top_sites": "Top Sites",
     "header_stories": "Top Stories",
+    "header_highlights": "Highlights",
     "header_visit_again": "Visit Again",
     "header_bookmarks": "Recent Bookmarks",
     "header_recommended_by": "Recommended by {provider}",
     "header_bookmarks_placeholder": "You don’t have any bookmarks yet.",
     "header_stories_from": "from",
     "type_label_visited": "Visited",
     "type_label_bookmarked": "Bookmarked",
     "type_label_synced": "Synced from another device",
@@ -1321,37 +1334,43 @@
     "confirm_history_delete_notice_p2": "This action cannot be undone.",
     "menu_action_save_to_pocket": "Save to Pocket",
     "search_for_something_with": "Search for {search_term} with:",
     "search_button": "Search",
     "search_header": "{search_engine_name} Search",
     "search_web_placeholder": "Search the Web",
     "search_settings": "Change Search Settings",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Send Feedback",
+    "section_info_privacy_notice": "Privacy Notice",
     "welcome_title": "Welcome to new tab",
     "welcome_body": "Firefox will use this space to show your most relevant bookmarks, articles, videos, and pages you’ve recently visited, so you can get back to them easily.",
     "welcome_label": "Identifying your Highlights",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}d",
     "settings_pane_button_label": "Customize your New Tab page",
     "settings_pane_header": "New Tab Preferences",
-    "settings_pane_body": "Choose what you see when you open a new tab.",
+    "settings_pane_body2": "Choose what you see on this page.",
     "settings_pane_search_header": "Search",
     "settings_pane_search_body": "Search the Web from your new tab.",
     "settings_pane_topsites_header": "Top Sites",
     "settings_pane_topsites_body": "Access the websites you visit most.",
     "settings_pane_topsites_options_showmore": "Show two rows",
     "settings_pane_bookmarks_header": "Recent Bookmarks",
     "settings_pane_bookmarks_body": "Your newly created bookmarks in one handy location.",
     "settings_pane_visit_again_header": "Visit Again",
     "settings_pane_visit_again_body": "Firefox will show you parts of your browsing history that you might want to remember or get back to.",
-    "settings_pane_pocketstories_header": "Top Stories",
-    "settings_pane_pocketstories_body": "Pocket, a part of the Mozilla family, will help connect you to high-quality content that you may not have found otherwise.",
+    "settings_pane_highlights_header": "Highlights",
+    "settings_pane_highlights_body2": "Find your way back to interesting things you’ve recently visited or bookmarked.",
+    "settings_pane_highlights_options_bookmarks": "Bookmarks",
+    "settings_pane_highlights_options_visited": "Visited Sites",
+    "settings_pane_snippets_header": "Snippets",
+    "settings_pane_snippets_body": "Read short and sweet updates from Mozilla about Firefox, internet culture, and the occasional random meme.",
     "settings_pane_done_button": "Done",
     "edit_topsites_button_text": "Edit",
     "edit_topsites_button_label": "Customize your Top Sites section",
     "edit_topsites_showmore_button": "Show More",
     "edit_topsites_showless_button": "Show Fewer",
     "edit_topsites_done_button": "Done",
     "edit_topsites_pin_button": "Pin this site",
     "edit_topsites_unpin_button": "Unpin this site",
@@ -1364,24 +1383,23 @@
     "topsites_form_url_placeholder": "Type or paste a URL",
     "topsites_form_add_button": "Add",
     "topsites_form_save_button": "Save",
     "topsites_form_cancel_button": "Cancel",
     "topsites_form_url_validation": "Valid URL required",
     "pocket_read_more": "Popular Topics:",
     "pocket_read_even_more": "View More Stories",
     "pocket_feedback_header": "The best of the web, curated by over 25 million people.",
-    "pocket_feedback_body": "Pocket, a part of the Mozilla family, will help connect you to high-quality content that you may not have found otherwise.",
-    "pocket_send_feedback": "Send Feedback",
+    "pocket_description": "Discover high-quality content you might otherwise miss, with help from Pocket, now part of Mozilla.",
+    "highlights_empty_state": "Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.",
     "topstories_empty_state": "You’ve caught up. Check back later for more top stories from {provider}. Can’t wait? Select a popular topic to find more great stories from around the web.",
-    "manual_migration_explanation": "Try Firefox with your favorite sites and bookmarks from another browser.",
+    "manual_migration_explanation2": "Try Firefox with the bookmarks, history and passwords from another browser.",
     "manual_migration_cancel_button": "No Thanks",
     "manual_migration_import_button": "Import Now"
   },
-  "en-ZA": {},
   "eo": {
     "newtab_page_title": "Nova langeto",
     "default_label_loading": "Ŝargado…",
     "header_top_sites": "Plej vizititaj",
     "header_stories": "Ĉefaj artikoloj",
     "header_visit_again": "Viziti denove",
     "header_bookmarks": "Ĵusaj legosignoj",
     "header_recommended_by": "Rekomendita de {provider}",
@@ -1549,16 +1567,17 @@
     "manual_migration_cancel_button": "No gracias",
     "manual_migration_import_button": "Importar ahora"
   },
   "es-CL": {
     "newtab_page_title": "Nueva pestaña",
     "default_label_loading": "Cargando…",
     "header_top_sites": "Sitios frecuentes",
     "header_stories": "Historias populares",
+    "header_highlights": "Destacados",
     "header_visit_again": "Volver a visitar",
     "header_bookmarks": "Marcadores recientes",
     "header_recommended_by": "Recomendado por {provider}",
     "header_bookmarks_placeholder": "Todavía no tienes marcadores.",
     "header_stories_from": "de",
     "type_label_visited": "Visitado",
     "type_label_bookmarked": "Marcado",
     "type_label_synced": "Sacado de otro dispositivo",
@@ -1580,37 +1599,43 @@
     "confirm_history_delete_notice_p2": "Esta acción no puede ser deshecha.",
     "menu_action_save_to_pocket": "Guardar en Pocket",
     "search_for_something_with": "Buscar {search_term} con:",
     "search_button": "Buscar",
     "search_header": "Búsqueda de {search_engine_name}",
     "search_web_placeholder": "Buscar en la Web",
     "search_settings": "Cambiar ajustes de búsqueda",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Enviar comentario",
+    "section_info_privacy_notice": "Aviso de privacidad",
     "welcome_title": "Bienvenido a la nueva pestaña",
     "welcome_body": "Firefox usará este espacio para mostrarte los marcadores, artículos, videos y páginas visitadas recientemente más relevantes, para que puedas regresar a ellos de una.",
     "welcome_label": "Identificando tus destacados",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}d",
     "settings_pane_button_label": "Personaliza tu página de Nueva pestaña",
     "settings_pane_header": "Preferencias de Nueva pestaña",
-    "settings_pane_body": "Elige que ver cuando abras una nueva pestaña.",
+    "settings_pane_body2": "Elige qué es lo que ves en esta página.",
     "settings_pane_search_header": "Buscar",
     "settings_pane_search_body": "Busca en la Web desde tu nueva pestaña.",
     "settings_pane_topsites_header": "Sitios frecuentes",
     "settings_pane_topsites_body": "Accede a los sitios que más visitas.",
     "settings_pane_topsites_options_showmore": "Mostrar dos filas",
     "settings_pane_bookmarks_header": "Marcadores recientes",
     "settings_pane_bookmarks_body": "Tus marcadores recién creados en un lugar accesible.",
     "settings_pane_visit_again_header": "Volver a visitar",
     "settings_pane_visit_again_body": "Firefox te mostrará partes de tu historial de navegación que podrías querer recordar o volver a visitar.",
-    "settings_pane_pocketstories_header": "Historias populares",
-    "settings_pane_pocketstories_body": "Pocket, una parte de la familia de Mozilla, te ayudará a conectarte con contenido de alta calidad que de otra forma no hubieras encontrado.",
+    "settings_pane_highlights_header": "Destacados",
+    "settings_pane_highlights_body2": "Encuentra tu camino de regreso a las cosas interesantes que ya has visitado o marcado.",
+    "settings_pane_highlights_options_bookmarks": "Marcadores",
+    "settings_pane_highlights_options_visited": "Sitios visitados",
+    "settings_pane_snippets_header": "Fragmentos",
+    "settings_pane_snippets_body": "Lee breves y dulces actualizaciones de Mozilla sobre Firefox, la cultura de internet y un meme aleatorio ocasional.",
     "settings_pane_done_button": "Hecho",
     "edit_topsites_button_text": "Editar",
     "edit_topsites_button_label": "Personaliza tu sección de sitios frecuentes",
     "edit_topsites_showmore_button": "Mostrar más",
     "edit_topsites_showless_button": "Mostrar menos",
     "edit_topsites_done_button": "Hecho",
     "edit_topsites_pin_button": "Fijar este sitio",
     "edit_topsites_unpin_button": "Soltar este sitio",
@@ -1623,20 +1648,20 @@
     "topsites_form_url_placeholder": "Escribe o pega una URL",
     "topsites_form_add_button": "Añadir",
     "topsites_form_save_button": "Guardar",
     "topsites_form_cancel_button": "Cancelar",
     "topsites_form_url_validation": "URL válida requerida",
     "pocket_read_more": "Temas populares:",
     "pocket_read_even_more": "Ver más historias",
     "pocket_feedback_header": "Lo mejor de la web, revisado por más de 25 millones de personas.",
-    "pocket_feedback_body": "Pocket, una parte de la familia de Mozilla, te ayudará a conectarte con contenido de alta calidad que de otra forma no hubieras encontrado.",
-    "pocket_send_feedback": "Enviar comentario",
+    "pocket_description": "Descubre contenido de alta calidad que de otra forma te perderías, con la ayuda de Pocket, ahora parte de Mozilla.",
+    "highlights_empty_state": "Empieza a navegar, y nosotros te mostraremos aquí algunos de los mejores artículos, videos y otras páginas que hayas visitado recientemente o marcado.",
     "topstories_empty_state": "Te has puesto al día. Revisa más tarde para ver más historias de {provider}. ¿No puedes esperar? Selecciona un tema popular para encontrar más historias de todo el mundo.",
-    "manual_migration_explanation": "Prueba Firefox con tus sitios favoritos y marcadores de otro navegador.",
+    "manual_migration_explanation2": "Prueba Firefox con los marcadores, historial y contraseñas de otro navegador.",
     "manual_migration_cancel_button": "No, gracias",
     "manual_migration_import_button": "Importar ahora"
   },
   "es-ES": {
     "newtab_page_title": "Nueva pestaña",
     "default_label_loading": "Cargando…",
     "header_top_sites": "Sitios favoritos",
     "header_stories": "Historias populares",
@@ -1806,58 +1831,76 @@
     "manual_migration_explanation": "Prueba Firefox con tus sitios favoritos y marcadores desde otro navegador.",
     "manual_migration_cancel_button": "No, gracias",
     "manual_migration_import_button": "Importar ahora"
   },
   "et": {
     "newtab_page_title": "Uus kaart",
     "default_label_loading": "Laadimine…",
     "header_top_sites": "Top saidid",
+    "header_stories": "Top lood",
     "header_highlights": "Esiletõstetud",
-    "header_stories": "Top lood",
+    "header_visit_again": "Külasta jälle",
+    "header_bookmarks": "Hiljutised järjehoidjad",
+    "header_recommended_by": "{provider} soovitab",
+    "header_bookmarks_placeholder": "Sul pole veel järjehoidjaid.",
     "header_stories_from": "allikast",
     "type_label_visited": "Külastatud",
     "type_label_bookmarked": "Järjehoidjatest",
     "type_label_synced": "Sünkroniseeritud teisest seadmest",
     "type_label_recommended": "Menukad",
     "type_label_open": "Avatud",
     "type_label_topic": "Teema",
+    "type_label_now": "Praegu",
     "menu_action_bookmark": "Lisa järjehoidjatesse",
     "menu_action_remove_bookmark": "Eemalda järjehoidja",
     "menu_action_copy_address": "Kopeeri aadress",
     "menu_action_email_link": "Saada link e-postiga…",
     "menu_action_open_new_window": "Ava uues aknas",
     "menu_action_open_private_window": "Ava uues privaatses aknas",
     "menu_action_dismiss": "Peida",
     "menu_action_delete": "Kustuta ajaloost",
+    "menu_action_pin": "Kinnita",
+    "menu_action_unpin": "Eemalda kohakinnitus",
+    "confirm_history_delete_p1": "Kas oled kindel, et soovid ajaloost kõik selle lehe kohta käivad kirjed kustutada?",
+    "confirm_history_delete_notice_p2": "Seda tegevust pole võimalik tagasi võtta.",
     "menu_action_save_to_pocket": "Salvesta Pocketisse",
     "search_for_something_with": "Otsi fraasi {search_term}, kasutades otsingumootorit:",
     "search_button": "Otsi",
     "search_header": "{search_engine_name}",
     "search_web_placeholder": "Otsi veebist",
     "search_settings": "Muuda otsingu sätteid",
+    "section_info_option": "Teave",
+    "section_info_send_feedback": "Saada tagasisidet",
+    "section_info_privacy_notice": "Privaatsusreeglid",
     "welcome_title": "Tere tulemast uuele kaardile",
     "welcome_body": "Firefox kasutab seda lehte, et kuvada sulle kõige olulisemaid järjehoidjaid, artikleid, videoid ja lehti, mida oled hiljuti külastanud, nii et pääseksid kergelt nende juurde tagasi.",
     "welcome_label": "Esiletõstetava sisu tuvastamine",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}t",
     "time_label_day": "{number}p",
     "settings_pane_button_label": "Kohanda uue kaardi lehte",
     "settings_pane_header": "Uue kaardi sätted",
-    "settings_pane_body": "Vali asjad, mida soovid uue kaardi avamisel näha.",
-    "settings_pane_search_header": "Otsi",
+    "settings_pane_body2": "Vali asjad, mida soovid sellel lehel näha.",
+    "settings_pane_search_header": "Otsing",
     "settings_pane_search_body": "Veebis otsimine uuel kaardil.",
     "settings_pane_topsites_header": "Top saidid",
     "settings_pane_topsites_body": "Ligipääs enim külastatud veebilehtedele.",
     "settings_pane_topsites_options_showmore": "Kuvatakse kahel real",
+    "settings_pane_bookmarks_header": "Hiljutised järjehoidjad",
+    "settings_pane_bookmarks_body": "Sinu värskelt lisatud järjehoidjad ühes kohas koos.",
+    "settings_pane_visit_again_header": "Külasta jälle",
+    "settings_pane_visit_again_body": "Firefox kuvab sulle noppeid sinu lehitsemise ajaloost, mida võid soovida meeles pidada või uuesti külastada.",
     "settings_pane_highlights_header": "Esiletõstetud",
-    "settings_pane_highlights_body": "Tagasivaade hiljutisele lehitsemisajaloole ning lisatud järjehoidjatele.",
-    "settings_pane_pocketstories_header": "Top lood",
-    "settings_pane_pocketstories_body": "Pocket, osana Mozilla perekonnast, aitab sul leida kvaliteetset sisu, mida sa muidu poleks ehk leidnud.",
+    "settings_pane_highlights_body2": "Leia tee tagasi asjade juurde, mida hiljuti külastasid või järjehoidjatesse lisasid.",
+    "settings_pane_highlights_options_bookmarks": "Järjehoidjad",
+    "settings_pane_highlights_options_visited": "Külastatud saidid",
+    "settings_pane_snippets_header": "Infokillud",
+    "settings_pane_snippets_body": "Loe lühikesi ja mõnusaid infokilde Mozillalt Firefoxi, interneti kultuuri ja vahel ka juhuslike netimeemide kohta.",
     "settings_pane_done_button": "Valmis",
     "edit_topsites_button_text": "Muuda",
     "edit_topsites_button_label": "Kohanda top saitide osa",
     "edit_topsites_showmore_button": "Kuva rohkem",
     "edit_topsites_showless_button": "Näita vähem",
     "edit_topsites_done_button": "Valmis",
     "edit_topsites_pin_button": "Kinnita see sait",
     "edit_topsites_unpin_button": "Eemalda see sait",
@@ -1870,24 +1913,29 @@
     "topsites_form_url_placeholder": "Sisesta või aseta URL",
     "topsites_form_add_button": "Lisa",
     "topsites_form_save_button": "Salvesta",
     "topsites_form_cancel_button": "Tühista",
     "topsites_form_url_validation": "URL peab olema korrektne",
     "pocket_read_more": "Populaarsed teemad:",
     "pocket_read_even_more": "Rohkem lugusid",
     "pocket_feedback_header": "Parim osa veebist, mille on kokku pannud rohkem kui 25 miljonit inimest.",
-    "pocket_feedback_body": "Pocket, osana Mozilla perekonnast, aitab sul leida kvaliteetset sisu, mida sa muidu poleks ehk leidnud.",
-    "pocket_send_feedback": "Saada tagasisidet"
+    "pocket_description": "Avasta Pocketi (nüüd osa Mozillast) abiga kõrgkvaliteetset sisu, mis muidu võib märkamata jääda.",
+    "highlights_empty_state": "Alusta veebilehitsemist ja me näitame siin häid artikleid, videoid ja muid lehti, mida hiljuti külastasid või järjehoidjatesse lisasid.",
+    "topstories_empty_state": "Vaata hiljem uuesti, et näha parimaid postitusi teenusepakkujalt {provider}. Ei suuda oodata? Vali populaarne teema, et leida veel suurepärast sisu internetist.",
+    "manual_migration_explanation2": "Proovi Firefoxi teisest brauserist pärinevate järjehoidjate, ajaloo ja paroolidega.",
+    "manual_migration_cancel_button": "Ei soovi",
+    "manual_migration_import_button": "Impordi kohe"
   },
   "eu": {
     "newtab_page_title": "Fitxa berria",
     "default_label_loading": "Kargatzen…",
     "header_top_sites": "Gune erabilienak",
     "header_stories": "Istorio ezagunenak",
+    "header_highlights": "Nabarmendutakoak",
     "header_visit_again": "Bisitatu berriro",
     "header_bookmarks": "Azken laster-markak",
     "header_recommended_by": "{provider} hornitzaileak gomendatuta",
     "header_bookmarks_placeholder": "Ez daukazu laster-markarik oraindik.",
     "header_stories_from": "hornitzailea:",
     "type_label_visited": "Bisitatuta",
     "type_label_bookmarked": "Laster-marka eginda",
     "type_label_synced": "Beste gailu batetik sinkronizatuta",
@@ -1909,37 +1957,40 @@
     "confirm_history_delete_notice_p2": "Ekintza hau ezin da desegin.",
     "menu_action_save_to_pocket": "Gorde Pocket-en",
     "search_for_something_with": "Bilatu {search_term} honekin:",
     "search_button": "Bilatu",
     "search_header": "{search_engine_name} bilaketa",
     "search_web_placeholder": "Bilatu webean",
     "search_settings": "Aldatu bilaketa-ezarpenak",
     "section_info_option": "Informazioa",
+    "section_info_send_feedback": "Bidali iritzia",
+    "section_info_privacy_notice": "Pribatutasun-oharra",
     "welcome_title": "Ongi etorri fitxa berrira",
     "welcome_body": "Zuretzat esanguratsuenak diren laster-markak, artikuluak, bideoak eta bisitatutako azken orriak erakusteko erabiliko du eremu hau Firefoxek, hauetara itzultzea erraza izan dadin.",
     "welcome_label": "Zure nabarmendutakoak identifikatzea",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}d",
     "settings_pane_button_label": "Pertsonalizatu fitxa berriaren orria",
     "settings_pane_header": "Fitxa berriaren hobespenak",
-    "settings_pane_body": "Aukeratu fitxa berria irekitzean ikusten duzuna.",
-    "settings_pane_search_header": "Bilatu",
+    "settings_pane_body2": "Aukeratu orri honetan ikusiko duzuna.",
+    "settings_pane_search_header": "Bilaketa",
     "settings_pane_search_body": "Bilatu webean zure fitxa berritik.",
     "settings_pane_topsites_header": "Gune erabilienak",
     "settings_pane_topsites_body": "Sartu gehien bisitatzen dituzun webguneetara.",
     "settings_pane_topsites_options_showmore": "Erakutsi bi errenkada",
     "settings_pane_bookmarks_header": "Azken laster-markak",
     "settings_pane_bookmarks_body": "Sortutako azken laster-markak toki bakarrean esku-eskura.",
     "settings_pane_visit_again_header": "Bisitatu berriro",
     "settings_pane_visit_again_body": "Gogoratu edo itzuli nahiko duzun historiaren zatia erakutsiko dizu Firefoxek.",
-    "settings_pane_pocketstories_header": "Istorio ezagunenak",
-    "settings_pane_pocketstories_body": "Pocket-ek, Mozilla familiakideak, bestela aurkituko ez zenukeen kalitate handiko edukiarekin konektatzen lagunduko dizu.",
+    "settings_pane_highlights_header": "Nabarmendutakoak",
+    "settings_pane_highlights_options_bookmarks": "Laster-markak",
+    "settings_pane_highlights_options_visited": "Bisitatutako guneak",
     "settings_pane_done_button": "Eginda",
     "edit_topsites_button_text": "Editatu",
     "edit_topsites_button_label": "Pertsonalizatu gune erabilienen atala",
     "edit_topsites_showmore_button": "Erakutsi gehiago",
     "edit_topsites_showless_button": "Erakutsi gutxiago",
     "edit_topsites_done_button": "Eginda",
     "edit_topsites_pin_button": "Ainguratu gune hau",
     "edit_topsites_unpin_button": "Desainguratu gune hau",
@@ -1952,20 +2003,17 @@
     "topsites_form_url_placeholder": "Idatzi edo itsatsi URLa",
     "topsites_form_add_button": "Gehitu",
     "topsites_form_save_button": "Gorde",
     "topsites_form_cancel_button": "Utzi",
     "topsites_form_url_validation": "Baliozko URLa behar da",
     "pocket_read_more": "Gai ezagunak:",
     "pocket_read_even_more": "Ikusi istorio gehiago",
     "pocket_feedback_header": "Webeko onena, 25 milioi pertsona baino gehiagok bilduta.",
-    "pocket_feedback_body": "Bestela aurkituko ez zenukeen kalitate handiko edukiarekin konektatzen lagunduko dizu Mozilla familiakide den Pocket-ek.",
-    "pocket_send_feedback": "Bidali iritzia",
     "topstories_empty_state": "Egunean zaude jada. Etorri berriro geroago {provider} hornitzailearen istorio ezagun gehiagorako. Ezin duzu itxaron? Hautatu gai ezagun bat webeko istorio gehiago aurkitzeko.",
-    "manual_migration_explanation": "Probatu Firefox beste nabigatzaile batetik ekarritako zure laster-marka eta gogoko webguneekin.",
     "manual_migration_cancel_button": "Ez, eskerrik asko",
     "manual_migration_import_button": "Inportatu orain"
   },
   "fa": {
     "newtab_page_title": "زبانه جدید",
     "default_label_loading": "در حال بارگیری…",
     "header_top_sites": "سایت‌های برتر",
     "header_stories": "برترین داستان‌ها",
@@ -2045,17 +2093,16 @@
     "pocket_feedback_header": "بهترین‌های وب، گزینش شده توسط بیش از ۲۵ میلیون نفر.",
     "pocket_feedback_body": "Pocket، بخشی از خانواده موزیلا، کمک خواهد کرد تا به محتوایی با کیفیت بالا مرتبط شوید که در غیر این صورت ممکن بود پیدا نکنید.",
     "pocket_send_feedback": "ارسال بازخورد",
     "topstories_empty_state": "فعلا تموم شد. بعدا دوباره سر بزن تا مطالب جدید از {provider} ببینی. نمی‌تونی صبر کنی؟ یک موضوع محبوب رو انتخاب کن تا مطالب جالب مرتبط از سراسر دنیا رو پیدا کنی.",
     "manual_migration_explanation": "فایرفاکس را با سایت‌های مورد علاقه و نشانک‌های خود در سایر مرورگرها امتحان کنید.",
     "manual_migration_cancel_button": "نه ممنون",
     "manual_migration_import_button": "هم‌اکنون وارد شوند"
   },
-  "ff": {},
   "fi": {
     "newtab_page_title": "Uusi välilehti",
     "default_label_loading": "Ladataan…",
     "header_top_sites": "Ykkössivustot",
     "header_stories": "Ykkösjutut",
     "header_visit_again": "Käy toistekin",
     "header_bookmarks": "Uusimmat kirjanmerkit",
     "header_recommended_by": "Suositukset lähteestä {provider}",
@@ -2137,16 +2184,17 @@
     "manual_migration_cancel_button": "Ei kiitos",
     "manual_migration_import_button": "Tuo nyt"
   },
   "fr": {
     "newtab_page_title": "Nouvel onglet",
     "default_label_loading": "Chargement…",
     "header_top_sites": "Sites les plus visités",
     "header_stories": "Articles populaires",
+    "header_highlights": "Éléments-clés",
     "header_visit_again": "Visiter à nouveau",
     "header_bookmarks": "Marque-pages récents",
     "header_recommended_by": "Recommandations par {provider}",
     "header_bookmarks_placeholder": "Vous ne possédez aucun marque-page pour l’instant.",
     "header_stories_from": "par",
     "type_label_visited": "Visité",
     "type_label_bookmarked": "Ajouté aux marque-pages",
     "type_label_synced": "Synchronisé depuis un autre appareil",
@@ -2168,37 +2216,40 @@
     "confirm_history_delete_notice_p2": "Cette action est irréversible.",
     "menu_action_save_to_pocket": "Enregistrer dans Pocket",
     "search_for_something_with": "Rechercher {search_term} avec :",
     "search_button": "Rechercher",
     "search_header": "Recherche {search_engine_name}",
     "search_web_placeholder": "Rechercher sur le Web",
     "search_settings": "Paramètres de recherche",
     "section_info_option": "Informations",
+    "section_info_send_feedback": "Donner mon avis",
+    "section_info_privacy_notice": "Politique de confidentialité",
     "welcome_title": "Bienvenue sur la page Nouvel onglet",
     "welcome_body": "Firefox utilisera cet espace pour afficher des éléments pertinents, comme des marque-pages, des articles, des vidéos, et des pages que vous avez visitées, afin que vous les retrouviez facilement.",
     "welcome_label": "Identification des éléments-clés",
     "time_label_less_than_minute": "<1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} h",
     "time_label_day": "{number} j",
     "settings_pane_button_label": "Personnaliser la page Nouvel onglet",
     "settings_pane_header": "Préférences Nouvel onglet",
-    "settings_pane_body": "Choisissez ce qui s’affiche à l’ouverture d’un nouvel onglet.",
+    "settings_pane_body2": "Sélectionnez les éléments à afficher sur cette page.",
     "settings_pane_search_header": "Recherche",
     "settings_pane_search_body": "Effectuez une recherche sur le Web depuis le nouvel onglet.",
     "settings_pane_topsites_header": "Sites les plus visités",
     "settings_pane_topsites_body": "Accédez aux sites que vous consultez le plus.",
     "settings_pane_topsites_options_showmore": "Afficher deux lignes",
     "settings_pane_bookmarks_header": "Marque-pages récents",
     "settings_pane_bookmarks_body": "Vos nouveaux marque-pages, facilement accessibles.",
     "settings_pane_visit_again_header": "Visiter à nouveau",
     "settings_pane_visit_again_body": "Firefox affichera des extraits de votre historique de navigation dont vous pourriez vouloir vous souvenir ou que vous pourriez vouloir revisiter.",
-    "settings_pane_pocketstories_header": "Articles populaires",
-    "settings_pane_pocketstories_body": "Pocket, un membre de la famille Mozilla, vous aide à découvrir du contenu de grande qualité que vous auriez pu manquer dans le cas contraire.",
+    "settings_pane_highlights_header": "Éléments-clés",
+    "settings_pane_highlights_options_bookmarks": "Marque-pages",
+    "settings_pane_highlights_options_visited": "Sites visités",
     "settings_pane_done_button": "Terminé",
     "edit_topsites_button_text": "Modifier",
     "edit_topsites_button_label": "Personnaliser la section Sites les plus visités",
     "edit_topsites_showmore_button": "Afficher plus",
     "edit_topsites_showless_button": "Afficher moins",
     "edit_topsites_done_button": "Terminé",
     "edit_topsites_pin_button": "Épingler ce site",
     "edit_topsites_unpin_button": "Relâcher ce site",
@@ -2211,20 +2262,18 @@
     "topsites_form_url_placeholder": "Saisir ou coller une adresse web",
     "topsites_form_add_button": "Ajouter",
     "topsites_form_save_button": "Enregistrer",
     "topsites_form_cancel_button": "Annuler",
     "topsites_form_url_validation": "Adresse web valide requise",
     "pocket_read_more": "Sujets populaires :",
     "pocket_read_even_more": "Afficher plus d’articles",
     "pocket_feedback_header": "Le meilleur du Web, sélectionné par plus de 25 millions de personnes.",
-    "pocket_feedback_body": "Pocket, un membre de la famille Mozilla, vous aide à découvrir du contenu de grande qualité que vous auriez pu manquer dans le cas contraire.",
-    "pocket_send_feedback": "Donner mon avis",
     "topstories_empty_state": "Il n’y en a pas d’autres. Revenez plus tard pour plus d’articles de {provider}. Vous ne voulez pas attendre ? Choisissez un sujet parmi les plus populaires pour découvrir d’autres articles intéressants sur le Web.",
-    "manual_migration_explanation": "Essayez Firefox avec vos sites et marque-pages préférés, importés depuis un autre navigateur.",
+    "manual_migration_explanation2": "Essayez Firefox en important les marque-pages, l’historique et les mots de passe depuis un autre navigateur.",
     "manual_migration_cancel_button": "Non merci",
     "manual_migration_import_button": "Importer"
   },
   "fy-NL": {
     "newtab_page_title": "Nij ljepblêd",
     "default_label_loading": "Lade…",
     "header_top_sites": "Topwebsites",
     "header_stories": "Topferhalen",
@@ -2469,17 +2518,16 @@
     "pocket_feedback_header": "Brod an eadar-lìn, air a dheasachadh le barrachd air 25 millean duine.",
     "pocket_feedback_body": "Pocket, ball de theaghlach Mozilla, a cheanglas tu ri susbaint fhìor-mhath nach biodh tu air fhaicinn air dòigh eile.",
     "pocket_send_feedback": "Dè do bheachd air?",
     "topstories_empty_state": "Sin na naidheachdan uile o {provider} an-dràsta ach bidh barrachd ann a dh’aithghearr. No thoir sùil air cuspair air a bheil fèill mhòr is leugh na tha a’ dol mun cuairt air an lìon an-dràsta.",
     "manual_migration_explanation": "Feuch Firefox leis na làraichean is comharran-lìn as fhearr leat o bhrabhsair eile.",
     "manual_migration_cancel_button": "Chan eil, tapadh leibh",
     "manual_migration_import_button": "Ion-phortaich an-dràsta"
   },
-  "gl": {},
   "gn": {},
   "gu-IN": {
     "newtab_page_title": "નવું ટૅબ",
     "default_label_loading": "લોડ કરી રહ્યું છે...",
     "header_top_sites": "ટોપ સાઇટ્સ",
     "header_highlights": "હાઇલાઇટ્સ",
     "type_label_visited": "જોવામા આવેલ:",
     "type_label_bookmarked": "બુકમાર્ક્સ",
@@ -2730,16 +2778,17 @@
     "manual_migration_cancel_button": "Ne hvala",
     "manual_migration_import_button": "Uvezi sada"
   },
   "hsb": {
     "newtab_page_title": "Nowy rajtark",
     "default_label_loading": "Začituje so…",
     "header_top_sites": "Najhusćišo wopytane sydła",
     "header_stories": "Najhusćišo přečitane zdźělenki",
+    "header_highlights": "Wjerški",
     "header_visit_again": "Hišće raz wopytać",
     "header_bookmarks": "Najnowše zapołožki",
     "header_recommended_by": "Wot {provider} doporučeny",
     "header_bookmarks_placeholder": "Hišće zapołožki nimaće.",
     "header_stories_from": "wot",
     "type_label_visited": "Wopytany",
     "type_label_bookmarked": "Jako zapołožka składowany",
     "type_label_synced": "Z druheho grata synchronizowany",
@@ -2761,37 +2810,43 @@
     "confirm_history_delete_notice_p2": "Tuta akcija njeda so cofnyć.",
     "menu_action_save_to_pocket": "Pola Pocket składować",
     "search_for_something_with": "Za {search_term} pytać z:",
     "search_button": "Pytać",
     "search_header": "Z {search_engine_name} pytać",
     "search_web_placeholder": "Web přepytać",
     "search_settings": "Pytanske nastajenja změnić",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Komentar pósłać",
+    "section_info_privacy_notice": "Zdźělenka priwatnosće",
     "welcome_title": "Witajće k nowemu rajtarkej",
     "welcome_body": "Firefox budźe tutón rum wužiwać, zo by waše najwažniše zapołožki, nastawki, wideja a runje wopytane strony pokazał, zo byšće móhł so lochko k nim wróćić.",
     "welcome_label": "Wuběranje wašich najwažnišich stronow",
     "time_label_less_than_minute": "< 1 min",
     "time_label_minute": "{number} m",
     "time_label_hour": "{number} h",
     "time_label_day": "",
     "settings_pane_button_label": "Stronu wašeho noweho rajtarka přiměrić",
     "settings_pane_header": "Nastajenja noweho rajtarka",
-    "settings_pane_body": "Wubjerće, štož chceće widźeć, hdyž nowy rajtark wočinjeće.",
+    "settings_pane_body2": "Wubjerće, štož so na tutej stronje pokazuje.",
     "settings_pane_search_header": "Pytać",
     "settings_pane_search_body": "Přepytajće web ze swojeho noweho rajtarka.",
     "settings_pane_topsites_header": "Najhusćišo wopytane sydła",
     "settings_pane_topsites_body": "Wočińće websydła, kotrež sće najhusćišo wopytał.",
     "settings_pane_topsites_options_showmore": "Dwaj rjadaj pokazać",
     "settings_pane_bookmarks_header": "Najnowše zapołožki",
     "settings_pane_bookmarks_body": "Waše nowo załožene zapołožki hnydom k ruce.",
     "settings_pane_visit_again_header": "Hišće raz wopytać",
     "settings_pane_visit_again_body": "Firefox wam dźěle wašeje přehladowanskeje historije pokazać, kotrež chceće sej snano spomjatkować abo na kotrež chceće wróćo přińć.",
-    "settings_pane_pocketstories_header": "Najhusćišo přečitane zdźělenki",
-    "settings_pane_pocketstories_body": "Pocket, dźěl swójby Mozilla, budźe pomhać, was z wobsahom wysokeje kwality zwjazować, kotryž njebyšće snano hewak namakał.",
+    "settings_pane_highlights_header": "Wjerški",
+    "settings_pane_highlights_body2": "Namakajće swój puć wróćo k zajimawym stronam, kotrež sće njedawno wopytał abo jako zapołožki składował.",
+    "settings_pane_highlights_options_bookmarks": "Zapołožki",
+    "settings_pane_highlights_options_visited": "Wopytane sydła",
+    "settings_pane_snippets_header": "Šlipki",
+    "settings_pane_snippets_body": "Čitajće krótke aktualizacije wot Mozilla wo Firefox, internetnej kulturje a hdys a hdys meme.",
     "settings_pane_done_button": "Hotowo",
     "edit_topsites_button_text": "Wobdźěłać",
     "edit_topsites_button_label": "Přiměrće wotrězk swojich najhusćišo wopytanych sydłow",
     "edit_topsites_showmore_button": "Wjace pokazać",
     "edit_topsites_showless_button": "Mjenje pokazać",
     "edit_topsites_done_button": "Hotowo",
     "edit_topsites_pin_button": "Tute sydło připjeć",
     "edit_topsites_unpin_button": "Tute sydło wotpinyć",
@@ -2804,20 +2859,20 @@
     "topsites_form_url_placeholder": "URL zapodać abo zasadźić",
     "topsites_form_add_button": "Přidać",
     "topsites_form_save_button": "Składować",
     "topsites_form_cancel_button": "Přetorhnyć",
     "topsites_form_url_validation": "Płaćiwy URL trěbny",
     "pocket_read_more": "Woblubowane temy:",
     "pocket_read_even_more": "Dalše zdźělenki sej wobhladać",
     "pocket_feedback_header": "Najlěpše z weba, zhromadźene wot wjace hač 25 milionow ludźi.",
-    "pocket_feedback_body": "Pocket, dźěl swójby Mozilla, budźe pomhać, was z wobsahom wysokeje kwality zwjazować, kotryž njebyšće snano hewak namakał.",
-    "pocket_send_feedback": "Komentar pósłać",
+    "pocket_description": "Wotkryjće wobsah wysokeje kwality, kotryž byšće hewak parował, z pomocu Pocket, kotryž je nětko dźěl Mozilla.",
+    "highlights_empty_state": "Započńće přehladować, a pokazamy někotre wulkotne nastawki, wideja a druhe strony, kotrež sće njedawno wopytał abo tu jako zapołožki składował.",
     "topstories_empty_state": "To je nachwilu wšitko. Wróćće so pozdźišo dalšich wulkotnych stawiznow dla wot {provider}. Njemóžeće čakać? Wubjerće woblubowanu temu, zo byšće dalše wulkotne stawizny z weba namakał.",
-    "manual_migration_explanation": "Wupruwujće Firefox ze swojimi najlubšimi websydłami a zapołožkami z druheho wobhladowaka.",
+    "manual_migration_explanation2": "Wupruwujće Firefox ze zapołožkami, historiju a hesłami z druheho wobhladowaka.",
     "manual_migration_cancel_button": "Ně, dźakuju so",
     "manual_migration_import_button": "Nětko importować"
   },
   "hu": {
     "newtab_page_title": "Új lap",
     "default_label_loading": "Betöltés…",
     "header_top_sites": "Népszerű oldalak",
     "header_stories": "Népszerű történetek",
@@ -3013,22 +3068,22 @@
     "pocket_feedback_header": "Yang terbaik dari Web, dikurasi lebih dari 25 juta orang.",
     "pocket_feedback_body": "Pocket, bagian dari keluarga Mozilla, akan membantu hubungkan Anda dengan konten berkualitas tinggi yang tak dapat Anda temukan di tempat lain.",
     "pocket_send_feedback": "Kirim Umpanbalik",
     "topstories_empty_state": "Maaf Anda tercegat. Periksa lagi nanti untuk lebih banyak cerita terbaik dari {provider}. Tidak mau menunggu? Pilih topik populer untuk menemukan lebih banyak cerita hebat dari seluruh web.",
     "manual_migration_explanation": "Cobalah Firefox dengan situs dan markah kesukaan Anda dari peramban yang lain.",
     "manual_migration_cancel_button": "Tidak, Terima kasih",
     "manual_migration_import_button": "Impor Sekarang"
   },
-  "is": {},
   "it": {
     "newtab_page_title": "Nuova scheda",
     "default_label_loading": "Caricamento…",
     "header_top_sites": "Siti principali",
     "header_stories": "Storie principali",
+    "header_highlights": "In evidenza",
     "header_visit_again": "Visita di nuovo",
     "header_bookmarks": "Segnalibri recenti",
     "header_recommended_by": "Consigliato da {provider}",
     "header_bookmarks_placeholder": "Non è ancora disponibile alcun segnalibro.",
     "header_stories_from": "da",
     "type_label_visited": "Visitato",
     "type_label_bookmarked": "Nei segnalibri",
     "type_label_synced": "Sincronizzato da un altro dispositivo",
@@ -3050,37 +3105,43 @@
     "confirm_history_delete_notice_p2": "Questa operazione non può essere annullata.",
     "menu_action_save_to_pocket": "Salva in Pocket",
     "search_for_something_with": "Cerca {search_term} con:",
     "search_button": "Cerca",
     "search_header": "Ricerca {search_engine_name}",
     "search_web_placeholder": "Cerca sul Web",
     "search_settings": "Cambia impostazioni di ricerca",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Invia feedback",
+    "section_info_privacy_notice": "Informativa sulla privacy",
     "welcome_title": "Benvenuto nella nuova scheda",
     "welcome_body": "Firefox utilizzerà questo spazio per visualizzare gli elementi più significativi, come segnalibri, articoli, video e pagine visitate di recente, in modo che siano sempre facili da raggiungere.",
     "welcome_label": "Identificazione elementi in evidenza…",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}g",
     "settings_pane_button_label": "Personalizza la pagina Nuova scheda",
     "settings_pane_header": "Preferenze Nuova scheda",
-    "settings_pane_body": "Scegli quali elementi visualizzare all’apertura di una nuova scheda.",
+    "settings_pane_body2": "Scegli quali elementi visualizzare in questa pagina.",
     "settings_pane_search_header": "Ricerca",
     "settings_pane_search_body": "Avvia ricerche in una nuova scheda.",
     "settings_pane_topsites_header": "Siti principali",
     "settings_pane_topsites_body": "Accedi ai siti che visiti più spesso.",
     "settings_pane_topsites_options_showmore": "Visualizza due righe",
     "settings_pane_bookmarks_header": "Segnalibri recenti",
     "settings_pane_bookmarks_body": "Tutti i segnalibri appena creati, facilmente accessibili.",
     "settings_pane_visit_again_header": "Visita di nuovo",
     "settings_pane_visit_again_body": "Firefox mostrerà alcuni elementi, estratti dalla cronologia di navigazione, che potresti voler visitare di nuovo.",
-    "settings_pane_pocketstories_header": "Storie principali",
-    "settings_pane_pocketstories_body": "Grazie a Pocket, un componente della famiglia Mozilla, puoi raggiungere contenuti di alta qualità che altrimenti potrebbero sfuggirti.",
+    "settings_pane_highlights_header": "In evidenza",
+    "settings_pane_highlights_body2": "Ritrova pagine interessanti che avevi visitato o aggiunto ai segnalibri.",
+    "settings_pane_highlights_options_bookmarks": "Segnalibri",
+    "settings_pane_highlights_options_visited": "Siti visitati",
+    "settings_pane_snippets_header": "Snippet",
+    "settings_pane_snippets_body": "Brevi notizie direttamente da Mozilla a proposito di Firefox, Internet, senza dimenticare qualche meme di tanto in tanto.",
     "settings_pane_done_button": "Fatto",
     "edit_topsites_button_text": "Modifica",
     "edit_topsites_button_label": "Personalizza la sezione Siti principali",
     "edit_topsites_showmore_button": "Visualizza altri",
     "edit_topsites_showless_button": "Nascondi altri",
     "edit_topsites_done_button": "Fatto",
     "edit_topsites_pin_button": "Aggiungi sito alla bacheca",
     "edit_topsites_unpin_button": "Rimuovi sito dalla bacheca",
@@ -3093,28 +3154,29 @@
     "topsites_form_url_placeholder": "Digitare o incollare un URL",
     "topsites_form_add_button": "Aggiungi",
     "topsites_form_save_button": "Salva",
     "topsites_form_cancel_button": "Annulla",
     "topsites_form_url_validation": "È necessario fornire un URL valido",
     "pocket_read_more": "Argomenti popolari:",
     "pocket_read_even_more": "Visualizza altre storie",
     "pocket_feedback_header": "Il meglio del web, selezionato da 25 milioni di persone.",
-    "pocket_feedback_body": "Grazie a Pocket, un componente della famiglia Mozilla, puoi raggiungere contenuti di alta qualità che altrimenti potrebbero sfuggirti.",
-    "pocket_send_feedback": "Invia feedback",
+    "pocket_description": "Grazie a Pocket, un componente della famiglia Mozilla, scopri contenuti di alta qualità che altrimenti potrebbero sfuggirti.",
+    "highlights_empty_state": "Inizia a navigare e, in questa sezione, verranno visualizzati articoli, video e altre pagine visitate di recente o aggiunte ai segnalibri.",
     "topstories_empty_state": "Non c'è altro. Controlla più tardi per altre storie da {provider}. Non vuoi aspettare? Seleziona un argomento tra quelli più popolari per scoprire altre notizie interessanti dal Web.",
-    "manual_migration_explanation": "Prova Firefox con i siti preferiti e i segnalibri importati da un altro browser.",
+    "manual_migration_explanation2": "Prova Firefox con i segnalibri, la cronologia e le password di un altro browser.",
     "manual_migration_cancel_button": "No grazie",
     "manual_migration_import_button": "Importa adesso"
   },
   "ja": {
     "newtab_page_title": "新しいタブ",
     "default_label_loading": "読み込み中...",
     "header_top_sites": "トップサイト",
     "header_stories": "トップ記事",
+    "header_highlights": "ハイライト",
     "header_visit_again": "再度訪れる",
     "header_bookmarks": "最近のブックマーク",
     "header_recommended_by": "{provider} のおすすめ",
     "header_bookmarks_placeholder": "まだブックマークがありません。",
     "header_stories_from": "配信元",
     "type_label_visited": "訪問済み",
     "type_label_bookmarked": "ブックマーク済み",
     "type_label_synced": "他の端末から同期",
@@ -3136,37 +3198,43 @@
     "confirm_history_delete_notice_p2": "この操作は取り消せません。",
     "menu_action_save_to_pocket": "Pocket へ保存",
     "search_for_something_with": "{search_term} を検索:",
     "search_button": "検索",
     "search_header": "{search_engine_name} 検索",
     "search_web_placeholder": "ウェブを検索",
     "search_settings": "検索設定を変更",
     "section_info_option": "情報",
+    "section_info_send_feedback": "フィードバックを送る",
+    "section_info_privacy_notice": "プライバシー通知",
     "welcome_title": "新しいタブへようこそ",
     "welcome_body": "Firefox はこのスペースを使って、関連性の高いブックマーク、記事、動画、最近訪れたページを表示し、それらのコンテンツへ簡単に戻れるようにします。",
     "welcome_label": "あなたのハイライトを確認しています",
     "time_label_less_than_minute": "1 分以内",
     "time_label_minute": "{number} 分",
     "time_label_hour": "{number} 時間",
     "time_label_day": "{number} 日",
     "settings_pane_button_label": "新しいタブページをカスタマイズ",
     "settings_pane_header": "新しいタブの設定",
-    "settings_pane_body": "新しいタブを開いたときに表示する内容を選択します。",
+    "settings_pane_body2": "このページに表示する内容を選択してください。",
     "settings_pane_search_header": "検索",
     "settings_pane_search_body": "新しいタブからウェブを検索します。",
     "settings_pane_topsites_header": "トップサイト",
     "settings_pane_topsites_body": "よく訪れるサイトへアクセス。",
     "settings_pane_topsites_options_showmore": "2 行で表示",
     "settings_pane_bookmarks_header": "最近のブックマーク",
     "settings_pane_bookmarks_body": "新たに作成されたブックマークをひとつの場所にまとめて使いやすく。",
     "settings_pane_visit_again_header": "再度訪れる",
     "settings_pane_visit_again_body": "Firefox は、ブラウジング履歴の中から、あなたが覚えておきたい、あるいは後で戻りたいと思われるページの一覧を表示します。",
-    "settings_pane_pocketstories_header": "トップ記事",
-    "settings_pane_pocketstories_body": "Mozilla ファミリーの一員となった Pocket は、他では見つからなかったかもしれない高品質なコンテンツとあなたを結び付ける手助けをします。",
+    "settings_pane_highlights_header": "ハイライト",
+    "settings_pane_highlights_body2": "最近訪れたりブックマークしたりした興味のあるページへ戻る方法を見つけましょう。",
+    "settings_pane_highlights_options_bookmarks": "ブックマーク",
+    "settings_pane_highlights_options_visited": "訪れたサイト",
+    "settings_pane_snippets_header": "スニペット",
+    "settings_pane_snippets_body": "Firefox、インターネット文化、時々無作為にお届けする小ネタなど、簡潔で役立つ Mozilla からの最新情報を読んでください。",
     "settings_pane_done_button": "完了",
     "edit_topsites_button_text": "編集",
     "edit_topsites_button_label": "トップサイトの項目をカスタマイズ",
     "edit_topsites_showmore_button": "もっと見る",
     "edit_topsites_showless_button": "折りたたむ",
     "edit_topsites_done_button": "完了",
     "edit_topsites_pin_button": "このサイトをピン留め",
     "edit_topsites_unpin_button": "このサイトのピン留めを外す",
@@ -3179,28 +3247,29 @@
     "topsites_form_url_placeholder": "URL を入力するか貼り付け",
     "topsites_form_add_button": "追加",
     "topsites_form_save_button": "保存",
     "topsites_form_cancel_button": "キャンセル",
     "topsites_form_url_validation": "正しい URL を入力してください",
     "pocket_read_more": "人気のトピック:",
     "pocket_read_even_more": "他の記事を見る",
     "pocket_feedback_header": "2,500 万人以上の人々によって収集されている、ウェブ上で最も優れたコンテンツ。",
-    "pocket_feedback_body": "Mozilla ファミリーの一員となった Pocket は、他では見つからなかったかもしれない高品質なコンテンツとあなたを結び付ける手助けをします。",
-    "pocket_send_feedback": "フィードバックを送る",
+    "pocket_description": "Mozilla の一員となった Pocket の力を借りて、見逃してしまうかもしれない質の高い情報を見つけましょう。",
+    "highlights_empty_state": "ブラウジング中にあなたが最近訪れたりブックマークしたりした、優れた記事、動画、その他ページの一部をここに表示します。",
     "topstories_empty_state": "すべて既読です。また後で戻って {provider} からのおすすめ記事をチェックしてください。もし待ちきれないなら、人気のトピックを選択すれば、他にもウェブ上の優れた記事を見つけられます。",
-    "manual_migration_explanation": "他のブラウザーから Firefox へあなたのお気に入りのサイトやブックマークを取り込んでみましょう。",
+    "manual_migration_explanation2": "他のブラウザーからブックマークや履歴、パスワードを取り込んで Firefox を使ってみましょう。",
     "manual_migration_cancel_button": "今はしない",
     "manual_migration_import_button": "今すぐインポート"
   },
   "ka": {
     "newtab_page_title": "ახალი ჩანართი",
     "default_label_loading": "იტვირთება…",
     "header_top_sites": "რჩეული საიტები",
     "header_stories": "რჩეული სტატიები",
+    "header_highlights": "მნიშნველოვანი სიახლეები",
     "header_visit_again": "ხელახლა ნახვა",
     "header_bookmarks": "ბოლოს ჩანიშნულები",
     "header_recommended_by": "რეკომენდებულია {provider}-ის მიერ",
     "header_bookmarks_placeholder": "სანიშნეები ჯერ არაა დამატებული.",
     "header_stories_from": "-იდან",
     "type_label_visited": "მონახულებული",
     "type_label_bookmarked": "ჩანიშნული",
     "type_label_synced": "სხვა მოწყობილობიდან დასინქრონებული",
@@ -3222,37 +3291,43 @@
     "confirm_history_delete_notice_p2": "ეს ქმედება შეუქცევადია.",
     "menu_action_save_to_pocket": "Pocket-ში შენახვა",
     "search_for_something_with": "{search_term} -ის ძიება:",
     "search_button": "ძიება",
     "search_header": "{search_engine_name} -ში ძიება",
     "search_web_placeholder": "ინტერნეტში ძიება",
     "search_settings": "ძიების პარამეტრების შეცვლა",
     "section_info_option": "ინფორმაცია",
+    "section_info_send_feedback": "უკუკავშირი",
+    "section_info_privacy_notice": "პირადი მონაცემების დაცვა",
     "welcome_title": "მოგესალმებით ახალ ჩანართზე",
     "welcome_body": "Firefox ამ სივრცეს გამოიყენებს თქვენთვის ყველაზე საჭირო სანიშნეების, სტატიების, ვიდეოებისა და ბოლოს მონახულებული გვერდებისთვის, რომ ადვილად შეძლოთ მათზე დაბრუნება.",
     "welcome_label": "რჩეული ვებგვერდების დადგენა",
     "time_label_less_than_minute": "<1წთ",
     "time_label_minute": "{number}წთ",
     "time_label_hour": "{number}სთ",
     "time_label_day": "{number}დღე",
     "settings_pane_button_label": "მოირგეთ ახალი ჩანართის გვერდი",
     "settings_pane_header": "ახალი ჩანართის პარამეტრები",
-    "settings_pane_body": "აირჩიეთ რისი ხილვა გსურთ ახალი ჩანართის გახსნისას.",
+    "settings_pane_body2": "მიუთითეთ, რისი ხილვა გსურთ ამ გვერდზე.",
     "settings_pane_search_header": "ძიება",
     "settings_pane_search_body": "ძიება ინტერნეტში ახალი ჩანართიდან.",
     "settings_pane_topsites_header": "რჩეული საიტები",
     "settings_pane_topsites_body": "წვდომა ხშირად მონახულებულ საიტებთან.",
     "settings_pane_topsites_options_showmore": "ორ რიგად ჩვენება",
     "settings_pane_bookmarks_header": "ბოლოს ჩანიშნულები",
     "settings_pane_bookmarks_body": "ახლად შექმნილი სანიშნეები, ერთი ხელის გაწვდენაზე.",
     "settings_pane_visit_again_header": "ხელახლა ნახვა",
     "settings_pane_visit_again_body": "Firefox გაჩვენებთ მონახულებული გვერდების ისტორიიდან იმას, რისი გახსენებაც ან რაზე დაბრუნებაც გენდომებათ.",
-    "settings_pane_pocketstories_header": "მთავარი სიახლეები",
-    "settings_pane_pocketstories_body": "Pocket არის Mozilla-ს ოჯახის ნაწილი, რომელიც დაგეხმარებათ ისეთი მაღალი ხარისხის კონტენტის მოძიებაში, რომელიც სხვა გზებით, შეიძლება ვერ მოგენახათ.",
+    "settings_pane_highlights_header": "მნიშნველოვანი სიახლეები",
+    "settings_pane_highlights_body2": "მარტივად დაუბრუნდით ბოლოს მონახულებულ, ან ჩანიშნულ საიტებს.",
+    "settings_pane_highlights_options_bookmarks": "სანიშნეები",
+    "settings_pane_highlights_options_visited": "მონახულებული საიტები",
+    "settings_pane_snippets_header": "ცნობები",
+    "settings_pane_snippets_body": "გაეცანით მოკლე, საინტერესო სიახლეებს Mozilla-სგან, Firefox-ის, ინტერნეტ სამყაროს მიღწევებისა და სხვა დასამახსოვრებელი ფაქტების შესახებ.",
     "settings_pane_done_button": "მზადაა",
     "edit_topsites_button_text": "ჩასწორება",
     "edit_topsites_button_label": "მოირგეთ რჩეული საიტების განყოფილება",
     "edit_topsites_showmore_button": "მეტის ჩვენება",
     "edit_topsites_showless_button": "ნაკლების ჩვენება",
     "edit_topsites_done_button": "მზადაა",
     "edit_topsites_pin_button": "საიტის მიმაგრება",
     "edit_topsites_unpin_button": "მიმაგრების მოხსნა",
@@ -3265,20 +3340,20 @@
     "topsites_form_url_placeholder": "აკრიფეთ ან ჩასვით URL",
     "topsites_form_add_button": "დამატება",
     "topsites_form_save_button": "შენახვა",
     "topsites_form_cancel_button": "გაუქმება",
     "topsites_form_url_validation": "საჭიროა მართებული URL",
     "pocket_read_more": "პოპულარული თემები:",
     "pocket_read_even_more": "მეტი სიახლის ნახვა",
     "pocket_feedback_header": "საუკეთესოები ინტერნეტიდან, 25 მილიონზე მეტი ადამიანის მიერ არჩეული.",
-    "pocket_feedback_body": "Pocket არის Mozilla-ს ოჯახის ნაწილი, რომელიც დაგეხმარებათ ისეთი მაღალი ხარისხის კონტენტის მოძიებაში, რომელიც სხვა გზებით, შეიძლება ვერ მოგენახათ.",
-    "pocket_send_feedback": "უკუკავშირი",
+    "pocket_description": "გაეცანით ინტერნეტში არსებულ მაღალი ხარისხის მასალას Pocket-ის საშუალებით, რომელიც ახლა უკვე Mozilla-ს ნაწილს წარმოადგენს.",
+    "highlights_empty_state": "დაიწყეთ გვერდების დათვალიერება და აქ გამოჩნდება თქვენი რჩეული სტატიები, ვიდეოები და ბოლოს მონახულებული, ან ჩანიშნული საიტები.",
     "topstories_empty_state": "უკვე ყველაფერი წაკითხული გაქვთ. {provider}-იდან ახალი რჩეული სტატიების მისაღებად, მოგვიანებით შემოიარეთ. თუ ვერ ითმენთ, აირჩიეთ რომელიმე მოთხოვნადი თემა, ახალი საინტერესო სტატიების მოსაძიებლად.",
-    "manual_migration_explanation": "სცადეთ Firefox, გადმოიტანეთ თქვენი რჩეული საიტები და სანიშნეები სხვა ბრაუზერიდან.",
+    "manual_migration_explanation2": "გადმოიტანეთ სხვა ბრაუზერებიდან თქვენი სანიშნეები, ისტორია და პაროლები Firefox-ში.",
     "manual_migration_cancel_button": "არა, გმადლობთ",
     "manual_migration_import_button": "ახლავე გადმოტანა"
   },
   "kab": {
     "newtab_page_title": "Iccer amaynut",
     "default_label_loading": "Asali…",
     "header_top_sites": "Ismal ifazen",
     "header_stories": "Tiqsiɣin ifazen",
@@ -3474,17 +3549,16 @@
     "welcome_title": "ស្វាគមន៍​មក​កាន់​ផ្ទាំង​ថ្មី",
     "welcome_body": "Firefox នឹង​ប្រើប្រាស់​កន្លែង​ទំនេរ​នេះ ដើម្បី​បង្ហាញ​ចំណាំ អត្ថបទ វីដេអូ និង​ទំព័រ​ដែល​ទាក់ទង​អ្នក​បំផុត ដែល​អ្នក​បាន​ចូល​មើល​ថ្មីៗ​នេះ ដូច្នេះ​អ្នក​អាច​ត្រឡប់​ទៅ​​កាន់​​វា​​វិញ​បាន​យ៉ាងងាយស្រួល។",
     "welcome_label": "កំពុង​បញ្ជាក់​ការ​រំលេច​របស់​អ្នក",
     "time_label_less_than_minute": "<1 នាទី",
     "time_label_minute": "{number} នាទី",
     "time_label_hour": "{number} ម៉ោង",
     "time_label_day": "{number} ថ្ងៃ"
   },
-  "kn": {},
   "ko": {
     "newtab_page_title": "새 탭",
     "default_label_loading": "읽는 중…",
     "header_top_sites": "상위 사이트",
     "header_highlights": "하이라이트",
     "header_stories": "상위 이야기",
     "header_stories_from": "출처",
     "type_label_visited": "방문한 사이트",
@@ -3546,17 +3620,16 @@
     "topsites_form_cancel_button": "취소",
     "topsites_form_url_validation": "유효한 URL이 필요합니다",
     "pocket_read_more": "인기 주제:",
     "pocket_read_even_more": "더 많은 이야기 보기",
     "pocket_feedback_header": "2천 5백만 명에 의해 추천되는 최고의 웹입니다.",
     "pocket_feedback_body": "Mozilla 가족의 일원인 Pocket으로 다른 곳에서는 찾아보기 힘든 고 품질의 콘텐츠를 연결할 수 있습니다.",
     "pocket_send_feedback": "의견 보내기"
   },
-  "ku": {},
   "lij": {
     "newtab_page_title": "Neuvo Feuggio",
     "default_label_loading": "Carego…",
     "header_top_sites": "I megio sciti",
     "header_highlights": "In evidensa",
     "type_label_visited": "Vixitou",
     "type_label_bookmarked": "Azonto a-i segnalibbri",
     "type_label_synced": "Scincronizou da 'n atro dispoxitivo",
@@ -3733,21 +3806,19 @@
     "pocket_feedback_header": "Geriausi dalykai internete, kuruojami daugiau nei 25 milijonų žmonių.",
     "pocket_feedback_body": "„Pocket“, „Mozillos“ šeimos dalis, padės jums atrasti kokybišką turinį, kurio kitaip gal nebūtumėte radę.",
     "pocket_send_feedback": "Siųsti atsiliepimą",
     "topstories_empty_state": "Viską perskaitėte. Užsukite vėliau, norėdami rasti daugiau gerų straipsnių iš „{provider}“. Nekantraujate? Pasirinkite populiarią temą, norėdami rasti daugiau puikių straipsnių saityne.",
     "manual_migration_explanation": "Išbandykite „Firefox“ su mėgstamiausiomis svetainėmis bei adresyno įrašais iš kitos naršyklės.",
     "manual_migration_cancel_button": "Ačiū, ne",
     "manual_migration_import_button": "Importuoti dabar"
   },
-  "ltg": {},
   "lv": {
     "newtab_page_title": "Jauna cilne"
   },
-  "mai": {},
   "mk": {
     "newtab_page_title": "Ново јазиче",
     "default_label_loading": "Се вчитува…",
     "header_top_sites": "Врвни мрежни места",
     "header_stories": "Врвни написи",
     "header_visit_again": "Посети повторно",
     "header_bookmarks": "Скорешни обележувачи",
     "header_recommended_by": "Препорачано од {provider}",
@@ -3895,17 +3966,16 @@
     "topsites_form_cancel_button": "ഒഴിവാക്കൂ",
     "topsites_form_url_validation": "പ്രവർത്തിയ്ക്കുന്ന URL ആവശ്യമാണ്",
     "pocket_read_more": "ജനപ്രിയ വിഷയങ്ങൾ:",
     "pocket_read_even_more": "കൂടുതൽ ലേഖനങ്ങൾ കാണുക",
     "pocket_feedback_header": "250 ലക്ഷം പേരാൽ തെരഞ്ഞെടുക്കപ്പെട്ട വെബിലെ ഏറ്റവും മികച്ചവയാണിവ.",
     "pocket_feedback_body": "മോസില്ല‌ കുടുംബാംഗമായ പോക്കറ്റ്, വിട്ടുപോയേയ്ക്കാവുന്ന മികച്ച ലേഖനങ്ങൾ നിങ്ങളുടെ ശ്രദ്ധയിൽ എത്തിയ്ക്കുന്നു.",
     "pocket_send_feedback": "പ്രതികരണം അയയ്ക്കുക"
   },
-  "mn": {},
   "mr": {
     "newtab_page_title": "नवीन टॅब",
     "default_label_loading": "दाखल करीत आहे…",
     "header_top_sites": "खास साईट्स",
     "header_highlights": "ठळक",
     "header_stories": "महत्वाच्या गोष्टी",
     "header_stories_from": "कडून",
     "type_label_visited": "भेट दिलेले",
@@ -4397,17 +4467,16 @@
     "pocket_feedback_header": "Det beste av nettet, sett saman av over 25 millioner menneske.",
     "pocket_feedback_body": "Pocket, ein del av Mozilla-familien, vil hjelpe deg med å finne innhald av høg kvalitet, som du kanskje ikkje ville ha funne elles.",
     "pocket_send_feedback": "Send tilbakemelding",
     "topstories_empty_state": "Det finst ikkje fleire. Kom tilbake seinare for fleire topphistoriar frå {provider}. Kan du ikkje vente? Vel eit populært emne for å finne fleire gode artiklar frå heile nettet.",
     "manual_migration_explanation": "Prøv Firefox med favorittnettstadane dine og bokmerke frå ein annan nettlesar.",
     "manual_migration_cancel_button": "Nei takk",
     "manual_migration_import_button": "Importer no"
   },
-  "or": {},
   "pa-IN": {
     "newtab_page_title": "ਨਵੀਂ ਟੈਬ",
     "default_label_loading": "…ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ",
     "header_top_sites": "ਸਿਖਰਲੀਆਂ ਸਾਈਟਾਂ",
     "header_highlights": "ਹਾਈਲਾਈਟ",
     "type_label_visited": "ਖੋਲ੍ਹੀਆਂ",
     "type_label_bookmarked": "ਬੁੱਕਮਾਰਕ ਕੀਤੀਆਂ",
     "type_label_synced": "ਹੋਰ ਡਿਵਾਈਸ ਤੋਂ ਸਿੰਕ ਕੀਤੀਆਂ",
@@ -4453,16 +4522,17 @@
     "edit_topsites_edit_button": "ਇਹ ਸਾਈਟ ਨੂੰ ਸੋਧੋ",
     "edit_topsites_dismiss_button": "ਇਸ ਸਾਈਟ ਰੱਦ ਕਰੋ"
   },
   "pl": {
     "newtab_page_title": "Nowa karta",
     "default_label_loading": "Wczytywanie…",
     "header_top_sites": "Popularne",
     "header_stories": "Popularne artykuły",
+    "header_highlights": "Wyróżnione",
     "header_visit_again": "Odwiedź ponownie",
     "header_bookmarks": "Najnowsze zakładki",
     "header_recommended_by": "Poleca: {provider}",
     "header_bookmarks_placeholder": "Nie ma jeszcze żadnych zakładek.",
     "header_stories_from": "od:",
     "type_label_visited": "Odwiedzone",
     "type_label_bookmarked": "Zakładka",
     "type_label_synced": "Z innego urządzenia",
@@ -4484,37 +4554,43 @@
     "confirm_history_delete_notice_p2": "Nie można tego cofnąć.",
     "menu_action_save_to_pocket": "Zapisz w Pocket",
     "search_for_something_with": "Szukaj „{search_term}” w:",
     "search_button": "Szukaj",
     "search_header": "Wyszukiwanie w {search_engine_name}",
     "search_web_placeholder": "Szukaj",
     "search_settings": "Zmień ustawienia wyszukiwania",
     "section_info_option": "Informacja",
+    "section_info_send_feedback": "Wyślij opinię",
+    "section_info_privacy_notice": "Prywatność",
     "welcome_title": "Witamy w nowej karcie",
     "welcome_body": "W tym miejscu Firefox będzie wyświetlał najciekawsze zakładki, artykuły, filmy i niedawno odwiedzone strony, aby można było do nich łatwo wrócić.",
     "welcome_label": "Wykrywanie ulubionych treści użytkownika",
     "time_label_less_than_minute": "<1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} godz.",
     "time_label_day": "{number} d.",
     "settings_pane_button_label": "Dostosuj stronę nowej karty",
     "settings_pane_header": "Preferencje nowej karty",
-    "settings_pane_body": "Wybierz, co widać po otwarciu nowej karty.",
+    "settings_pane_body2": "Wybierz, co wyświetlać na tej stronie.",
     "settings_pane_search_header": "Wyszukiwanie",
     "settings_pane_search_body": "Szukaj w Internecie na nowej karcie.",
     "settings_pane_topsites_header": "Popularne",
     "settings_pane_topsites_body": "Otwieraj najczęściej odwiedzane strony.",
     "settings_pane_topsites_options_showmore": "Dwa rzędy",
     "settings_pane_bookmarks_header": "Najnowsze zakładki",
     "settings_pane_bookmarks_body": "Nowo utworzone zakładki w jednym miejscu.",
     "settings_pane_visit_again_header": "Odwiedź ponownie",
     "settings_pane_visit_again_body": "Firefox pokaże strony z historii, do których warto wrócić.",
-    "settings_pane_pocketstories_header": "Popularne artykuły",
-    "settings_pane_pocketstories_body": "Pocket, będący częścią Mozilli, pomoże w szukaniu artykułów wysokiej jakości, aby nic Cię nie ominęło.",
+    "settings_pane_highlights_header": "Wyróżnione",
+    "settings_pane_highlights_body2": "Umożliwia szybki powrót do niedawno odwiedzonych stron lub dodanych zakładek.",
+    "settings_pane_highlights_options_bookmarks": "Zakładki",
+    "settings_pane_highlights_options_visited": "Odwiedzone",
+    "settings_pane_snippets_header": "Notki",
+    "settings_pane_snippets_body": "Krótkie informacje od Mozilli o Firefoksie i kulturze internetowej, a od czasu do czasu także jakiś żart.",
     "settings_pane_done_button": "Gotowe",
     "edit_topsites_button_text": "Edytuj",
     "edit_topsites_button_label": "Dostosuj często odwiedzane strony",
     "edit_topsites_showmore_button": "Więcej",
     "edit_topsites_showless_button": "Mniej",
     "edit_topsites_done_button": "Gotowe",
     "edit_topsites_pin_button": "Przypnij tę stronę",
     "edit_topsites_unpin_button": "Odepnij tę stronę",
@@ -4527,28 +4603,29 @@
     "topsites_form_url_placeholder": "Wpisz lub wklej adres",
     "topsites_form_add_button": "Dodaj",
     "topsites_form_save_button": "Zapisz",
     "topsites_form_cancel_button": "Anuluj",
     "topsites_form_url_validation": "Wymagany jest prawidłowy adres",
     "pocket_read_more": "Popularne tematy:",
     "pocket_read_even_more": "Więcej artykułów",
     "pocket_feedback_header": "Najlepsze, co oferuje Internet, wybrane przez ponad 25 milionów osób.",
-    "pocket_feedback_body": "Pocket, będący częścią Mozilli, pomoże w szukaniu artykułów wysokiej jakości, aby nic Cię nie ominęło.",
-    "pocket_send_feedback": "Wyślij opinię",
+    "pocket_description": "Umożliwia odkrywanie wysokiej jakości treści dzięki serwisowi Pocket, będącego teraz częścią Mozilli.",
+    "highlights_empty_state": "Zacznij przeglądać Internet, a pojawią się tutaj niedawno odwiedzone lub dodane zakładki do artykułów, filmów i innych stron.",
     "topstories_empty_state": "To na razie wszystko. {provider} później będzie mieć więcej popularnych artykułów. Nie możesz się doczekać? Wybierz popularny temat, aby znaleźć więcej artykułów z całego Internetu.",
-    "manual_migration_explanation": "Wypróbuj Firefoksa ze swoimi ulubionymi stronami i zakładkami z innej przeglądarki.",
+    "manual_migration_explanation2": "Używaj Firefoksa z zakładkami, historią i hasłami z innej przeglądarki.",
     "manual_migration_cancel_button": "Nie, dziękuję",
     "manual_migration_import_button": "Importuj teraz"
   },
   "pt-BR": {
     "newtab_page_title": "Nova aba",
     "default_label_loading": "Carregando…",
     "header_top_sites": "Sites preferidos",
     "header_stories": "Histórias populares",
+    "header_highlights": "Destaques",
     "header_visit_again": "Visitar novamente",
     "header_bookmarks": "Favoritos recentes",
     "header_recommended_by": "Recomendado por {provider}",
     "header_bookmarks_placeholder": "Você ainda não tem nenhum favorito.",
     "header_stories_from": "de",
     "type_label_visited": "Visitado",
     "type_label_bookmarked": "Adicionado aos favoritos",
     "type_label_synced": "Sincronizado a partir de outro dispositivo",
@@ -4570,37 +4647,43 @@
     "confirm_history_delete_notice_p2": "Essa ação não pode ser desfeita.",
     "menu_action_save_to_pocket": "Salvar no Pocket",
     "search_for_something_with": "Pesquisar por {search_term} com:",
     "search_button": "Pesquisar",
     "search_header": "Pesquisa {search_engine_name}",
     "search_web_placeholder": "Pesquisar na Web",
     "search_settings": "Alterar configurações de pesquisa",
     "section_info_option": "Info",
+    "section_info_send_feedback": "Enviar opinião",
+    "section_info_privacy_notice": "Política de Privacidade",
     "welcome_title": "Bem-vindo a nova aba",
     "welcome_body": "O Firefox usará este espaço para mostrar seus favoritos, artigos, vídeos e páginas mais relevantes visitados recentemente, assim você pode voltar mais facilmente.",
     "welcome_label": "Identificando seus destaques",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}d",
     "settings_pane_button_label": "Personalizar sua página de nova aba",
     "settings_pane_header": "Preferências de novas abas",
-    "settings_pane_body": "Escolha o que ver quando abrir uma nova aba.",
+    "settings_pane_body2": "Escolha o que verá nessa página.",
     "settings_pane_search_header": "Pesquisar",
     "settings_pane_search_body": "Pesquise na Web a partir da sua nova aba.",
     "settings_pane_topsites_header": "Sites preferidos",
     "settings_pane_topsites_body": "Acesse os sites que você mais visita.",
     "settings_pane_topsites_options_showmore": "Mostrar duas linhas",
     "settings_pane_bookmarks_header": "Favoritos recentes",
     "settings_pane_bookmarks_body": "Seus favoritos recém criados em uma posição acessível.",
     "settings_pane_visit_again_header": "Visite novamente",
     "settings_pane_visit_again_body": "Firefox irá exibir a você partes do seu histórico de navegação que você pode querer relembrar ou acessar novamente.",
-    "settings_pane_pocketstories_header": "Histórias populares",
-    "settings_pane_pocketstories_body": "O Pocket, parte da família Mozilla, ajudará a conectá-lo a conteúdo de alta qualidade que talvez você não encontre de outra forma.",
+    "settings_pane_highlights_header": "Destaques",
+    "settings_pane_highlights_body2": "Encontre o caminho de volta para as coisas interessantes que você favoritou ou viu recentemente.",
+    "settings_pane_highlights_options_bookmarks": "Favoritos",
+    "settings_pane_highlights_options_visited": "Sites visitados",
+    "settings_pane_snippets_header": "Snippets",
+    "settings_pane_snippets_body": "Saiba das notícias e novidades da Mozilla sobre o Firefox, Internet e às vezes alguns memes.",
     "settings_pane_done_button": "Concluído",
     "edit_topsites_button_text": "Editar",
     "edit_topsites_button_label": "Personalizar a sua seção de sites preferidos",
     "edit_topsites_showmore_button": "Mostrar mais",
     "edit_topsites_showless_button": "Mostrar menos",
     "edit_topsites_done_button": "Concluído",
     "edit_topsites_pin_button": "Fixar este site",
     "edit_topsites_unpin_button": "Desafixar este site",
@@ -4613,28 +4696,29 @@
     "topsites_form_url_placeholder": "Digite ou cole um URL",
     "topsites_form_add_button": "Adicionar",
     "topsites_form_save_button": "Salvar",
     "topsites_form_cancel_button": "Cancelar",
     "topsites_form_url_validation": "É necessário uma URL válida",
     "pocket_read_more": "Tópicos populares:",
     "pocket_read_even_more": "Ver mais histórias",
     "pocket_feedback_header": "O melhor da web, com curadoria de mais de 25 milhões de pessoas.",
-    "pocket_feedback_body": "O Pocket, parte da família Mozilla, ajudará a conectá-lo a conteúdo de alta qualidade que talvez você não encontre de outra forma.",
-    "pocket_send_feedback": "Enviar feedback",
+    "pocket_description": "Descubra conteúdo de alta qualidade que você poderia ter perdido, com a ajuda do Pocket, agora parte da Mozilla.",
+    "highlights_empty_state": "Comece a navegar e nós mostraremos aqui alguns ótimos artigos, vídeos e outras páginas que você favoritou ou visitou recentemente.",
     "topstories_empty_state": "Você já viu tudo. Volte mais tarde para mais histórias do {provider}. Não consegue esperar? Escolha um assunto popular para encontrar mais grandes histórias através da web.",
-    "manual_migration_explanation": "Use o Firefox com seus sites favoritos de outro navegador.",
+    "manual_migration_explanation2": "Experimente o Firefox com os favoritos, histórico e senhas salvas em outros navegador.",
     "manual_migration_cancel_button": "Não, obrigado",
     "manual_migration_import_button": "Importar agora"
   },
   "pt-PT": {
     "newtab_page_title": "Novo separador",
     "default_label_loading": "A carregar…",
     "header_top_sites": "Sites mais visitados",
     "header_stories": "Histórias principais",
+    "header_highlights": "Destaques",
     "header_visit_again": "Visitar novamente",
     "header_bookmarks": "Marcadores recentes",
     "header_recommended_by": "Recomendado por {provider}",
     "header_bookmarks_placeholder": "Ainda não tem quaisquer marcadores.",
     "header_stories_from": "de",
     "type_label_visited": "Visitados",
     "type_label_bookmarked": "Guardados nos marcadores",
     "type_label_synced": "Sincronizado a partir de outro dispositivo",
@@ -4656,37 +4740,43 @@
     "confirm_history_delete_notice_p2": "Esta ação não pode ser desfeita.",
     "menu_action_save_to_pocket": "Guardar no Pocket",
     "search_for_something_with": "Pesquisar por {search_term} com:",
     "search_button": "Pesquisar",
     "search_header": "Pesquisa {search_engine_name}",
     "search_web_placeholder": "Pesquisar na Web",
     "search_settings": "Alterar definições de pesquisa",
     "section_info_option": "Informação",
+    "section_info_send_feedback": "Enviar feedback",
+    "section_info_privacy_notice": "Aviso de privacidade",
     "welcome_title": "Bem-vindo ao novo separador",
     "welcome_body": "O Firefox irá utilizar este espaço para lhe mostrar os seus marcadores, artigos, vídeos, e páginas mais relevantes que visitou recentemente, para que possa regressar a estes mais facilmente.",
     "welcome_label": "A identificar os seus destaques",
     "time_label_less_than_minute": "<1m",
     "time_label_minute": "{number}m",
     "time_label_hour": "{number}h",
     "time_label_day": "{number}d",
     "settings_pane_button_label": "Personalizar a sua página de novo separador",
     "settings_pane_header": "Preferências de novo separador",
-    "settings_pane_body": "Escolha o que vê quando abre um novo separador.",
+    "settings_pane_body2": "Escolha o que vê nesta página.",
     "settings_pane_search_header": "Pesquisa",
     "settings_pane_search_body": "Pesquise na Web a partir do seu novo separador.",
     "settings_pane_topsites_header": "Sites mais visitados",
     "settings_pane_topsites_body": "Aceda aos websites que mais visita.",
     "settings_pane_topsites_options_showmore": "Mostrar duas linhas",
     "settings_pane_bookmarks_header": "Marcadores recentes",
     "settings_pane_bookmarks_body": "Os seus marcadores recém-criados num único local acessível.",
     "settings_pane_visit_again_header": "Visitar novamente",
     "settings_pane_visit_again_body": "O Firefox irá mostrar-lhe partes do seu histórico de navegação que pode querer relembrar ou voltar a aceder.",
-    "settings_pane_pocketstories_header": "Histórias principais",
-    "settings_pane_pocketstories_body": "O Pocket, parte da família Mozilla, irá ajudar a ligar-se a conteúdo de alta qualidade que você poderia não ter encontrado de outra forma.",
+    "settings_pane_highlights_header": "Destaques",
+    "settings_pane_highlights_body2": "Encontre o seu caminho de volta a coisas interessantes que visitou recentemente ou adicionou aos marcadores.",
+    "settings_pane_highlights_options_bookmarks": "Marcadores",
+    "settings_pane_highlights_options_visited": "Sites visitados",
+    "settings_pane_snippets_header": "Excertos",
+    "settings_pane_snippets_body": "Leia atualizações curtas da Mozilla acerca do Firefox, cultura da internet, e o ocasional meme aleatório.",
     "settings_pane_done_button": "Feito",
     "edit_topsites_button_text": "Editar",
     "edit_topsites_button_label": "Personalizar a sua secção de sites mais visitados",
     "edit_topsites_showmore_button": "Mostrar mais",
     "edit_topsites_showless_button": "Mostrar menos",
     "edit_topsites_done_button": "Feito",
     "edit_topsites_pin_button": "Afixar este site",
     "edit_topsites_unpin_button": "Desafixar este site",
@@ -4699,20 +4789,20 @@
     "topsites_form_url_placeholder": "Digite ou cole um URL",
     "topsites_form_add_button": "Adicionar",
     "topsites_form_save_button": "Guardar",
     "topsites_form_cancel_button": "Cancelar",
     "topsites_form_url_validation": "URL válido requerido",
     "pocket_read_more": "Tópicos populares:",
     "pocket_read_even_more": "Ver mais histórias",
     "pocket_feedback_header": "O melhor da web, com curadoria de mais de 25 milhões de pessoas.",
-    "pocket_feedback_body": "O Pocket, parte da família Mozilla, irá ajudar a ligar-se a conteúdo de alta qualidade que você poderia não ter encontrado de outra forma.",
-    "pocket_send_feedback": "Enviar feedback",
+    "pocket_description": "Descubra conteúdo de alta qualidade que podia de outra maneira perder, com a ajuda do Pocket, agora parte da Mozilla.",
+    "highlights_empty_state": "Comece a navegar, e iremos mostrar-lhe alguns dos ótimos artigos, vídeos, e outras páginas que visitou recentemente ou adicionou aos marcadores aqui.",
     "topstories_empty_state": "Já apanhou tudo. Verifique mais tarde para mais histórias principais de {provider}. Não pode esperar? Selecione um tópico popular para encontrar mais boas histórias de toda a web.",
-    "manual_migration_explanation": "Experimente o Firefox com os seus sites favoritos e marcadores de outro navegador.",
+    "manual_migration_explanation2": "Experimente o Firefox com marcadores, histórico e palavras-passe de outro navegador.",
     "manual_migration_cancel_button": "Não obrigado",
     "manual_migration_import_button": "Importar agora"
   },
   "rm": {
     "newtab_page_title": "Nov tab",
     "default_label_loading": "Chargiar…",
     "header_top_sites": "Paginas preferidas",
     "header_stories": "Artitgels populars",
@@ -4943,22 +5033,22 @@
     "pocket_feedback_header": "Лучшее из Интернета, отобранное более чем 25 миллионами людей.",
     "pocket_feedback_body": "Pocket, часть семьи Mozilla, поможет подключить вас к высококачественному контенту, который вы можете иначе и не найти.",
     "pocket_send_feedback": "Отправить отзыв",
     "topstories_empty_state": "Вы всё прочитали. Зайдите попозже, чтобы увидеть больше лучших статей от {provider}. Не можете ждать? Выберите популярную тему, чтобы найти больше интересных статей со всего Интернета.",
     "manual_migration_explanation": "Попробуйте Firefox со своими любимыми сайтами и закладками из другого браузера.",
     "manual_migration_cancel_button": "Нет, спасибо",
     "manual_migration_import_button": "Импортировать сейчас"
   },
-  "si": {},
   "sk": {
     "newtab_page_title": "Nová karta",
     "default_label_loading": "Načítava sa…",
     "header_top_sites": "Top stránky",
     "header_stories": "Top príbehy",
+    "header_highlights": "Vybrané stránky",
     "header_visit_again": "Navštívte znova",
     "header_bookmarks": "Nedávno pridané záložky",
     "header_recommended_by": "Odporúča {provider}",
     "header_bookmarks_placeholder": "Zatiaľ nemáte žiadne záložky.",
     "header_stories_from": "zo služby",
     "type_label_visited": "Navštívené",
     "type_label_bookmarked": "V záložkách",
     "type_label_synced": "Synchronizované z ďalšieho zariadenia",
@@ -4980,37 +5070,43 @@
     "confirm_history_delete_notice_p2": "Túto akciu nie je možné vrátiť späť.",
     "menu_action_save_to_pocket": "Uložiť do služby Pocket",
     "search_for_something_with": "Hľadať {search_term} pomocou:",
     "search_button": "Hľadať",
     "search_header": "Vyhľadávanie pomocou {search_engine_name}",
     "search_web_placeholder": "Vyhľadávanie na webe",
     "search_settings": "Zmeniť nastavenia vyhľadávania",
     "section_info_option": "Informácie",
+    "section_info_send_feedback": "Odoslať spätnú väzbu",
+    "section_info_privacy_notice": "Zásady ochrany súkromia",
     "welcome_title": "Vitajte na stránke novej karty",
     "welcome_body": "Firefox bude na tomto mieste zobrazovať často zobrazované záložky, články, videá a stránky, ktoré ste nedávno navštívili. Váš prístup k nim je tak omnoho ľahší.",
     "welcome_label": "Identifikácia vybraných stránok",
     "time_label_less_than_minute": "< 1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} hod",
     "time_label_day": "{number} d",
     "settings_pane_button_label": "Prispôsobte si svoju stránku Nová karta",
     "settings_pane_header": "Nastavenia Novej karty",
-    "settings_pane_body": "Vyberte si, čo chcete vidieť keď otvoríte novú kartu.",
+    "settings_pane_body2": "Vyberte si, čo chcete na tejto stránke vidieť.",
     "settings_pane_search_header": "Vyhľadávanie",
     "settings_pane_search_body": "Vyhľadávanie zo stránky novej karty.",
     "settings_pane_topsites_header": "Top stránky",
     "settings_pane_topsites_body": "Prístup k webovým stránkam, ktoré navštevujete najčastejšie.",
     "settings_pane_topsites_options_showmore": "Zobraziť dva riadky",
     "settings_pane_bookmarks_header": "Nedávno pridané záložky",
     "settings_pane_bookmarks_body": "Vaše nedávno pridané záložky na jednom mieste.",
     "settings_pane_visit_again_header": "Navštívte znova",
     "settings_pane_visit_again_body": "Firefox vám ukáže niektoré časti vašej histórie prehliadania, ktoré by ste si mohli chcieť pripomenúť alebo sa k nim vrátiť.",
-    "settings_pane_pocketstories_header": "Top príbehy",
-    "settings_pane_pocketstories_body": "Pocket, súčasť Mozilla rodiny, vám pomôže nájsť vysokokvalitný obsah, ktorý by ste inde zrejme nenašli.",
+    "settings_pane_highlights_header": "Vybrané stránky",
+    "settings_pane_highlights_body2": "Pozrite sa na zaujímavé stránky, ktoré ste nedávno navštívili alebo pridali do záložiek.",
+    "settings_pane_highlights_options_bookmarks": "Záložky",
+    "settings_pane_highlights_options_visited": "Navštívené stránky",
+    "settings_pane_snippets_header": "Snippety",
+    "settings_pane_snippets_body": "Prečítajte si krátke správy od Mozilly o Firefoxe či internetovej kultúre. Občas uvidíte aj náhodné meme.",
     "settings_pane_done_button": "Hotovo",
     "edit_topsites_button_text": "Upraviť",
     "edit_topsites_button_label": "Upravte sekciu Top stránky",
     "edit_topsites_showmore_button": "Zobraziť viac",
     "edit_topsites_showless_button": "Zobraziť menej",
     "edit_topsites_done_button": "Hotovo",
     "edit_topsites_pin_button": "Pripnúť túto stránku",
     "edit_topsites_unpin_button": "Zrušiť pripnutie tejto stránky",
@@ -5023,28 +5119,29 @@
     "topsites_form_url_placeholder": "Zadajte alebo prilepte URL",
     "topsites_form_add_button": "Pridať",
     "topsites_form_save_button": "Uložiť",
     "topsites_form_cancel_button": "Zrušiť",
     "topsites_form_url_validation": "Vyžaduje sa platná URL",
     "pocket_read_more": "Populárne témy:",
     "pocket_read_even_more": "Zobraziť ďalšie príbehy",
     "pocket_feedback_header": "To najlepšie z webu - podľa názoru 25 miliónov ľudí.",
-    "pocket_feedback_body": "Pocket, súčasť Mozilla rodiny, vám pomôže nájsť vysokokvalitný obsah, ktorý by ste inde zrejme nenašli.",
-    "pocket_send_feedback": "Odoslať spätnú väzbu",
+    "pocket_description": "Objavte vysokokvalitný obsah, ktorý by ste inak prepásli. Pomôže vám s tým Pocket, súčasť Mozilly.",
+    "highlights_empty_state": "Začnite s prehliadaním a my vám na tomto mieste ukážeme skvelé články, videá a ostatné stránky, ktoré ste nedávno navštívili alebo pridali medzi záložky.",
     "topstories_empty_state": "Už ste prečítali všetko. Ďalšie príbehy zo služby {provider} tu nájdete opäť neskôr. Nemôžete sa dočkať? Vyberte si populárnu tému a pozrite sa na ďalšie skvelé príbehy z celého webu.",
-    "manual_migration_explanation": "Vyskúšajte Firefox so svojimi obľúbenými stránkami a záložkami z iného prehliadača.",
+    "manual_migration_explanation2": "Vyskúšajte Firefox so záložkami, históriou prehliadania a heslami s iných prehliadačov.",
     "manual_migration_cancel_button": "Nie, ďakujem",
     "manual_migration_import_button": "Importovať teraz"
   },
   "sl": {
     "newtab_page_title": "Nov zavihek",
     "default_label_loading": "Nalaganje …",
     "header_top_sites": "Glavne strani",
     "header_stories": "Glavne vesti",
+    "header_highlights": "Poudarki",
     "header_visit_again": "Obiščite znova",
     "header_bookmarks": "Nedavni zaznamki",
     "header_recommended_by": "Priporoča {provider}",
     "header_bookmarks_placeholder": "Nimate še nobenih zaznamkov.",
     "header_stories_from": "od",
     "type_label_visited": "Obiskano",
     "type_label_bookmarked": "Med zaznamki",
     "type_label_synced": "Sinhronizirano z druge naprave",
@@ -5066,37 +5163,39 @@
     "confirm_history_delete_notice_p2": "Tega dejanja ni mogoče razveljaviti.",
     "menu_action_save_to_pocket": "Shrani v Pocket",
     "search_for_something_with": "Išči \"{search_term}\" z iskalnikom:",
     "search_button": "Iskanje",
     "search_header": "Iskanje {search_engine_name}",
     "search_web_placeholder": "Iskanje po spletu",
     "search_settings": "Spremeni nastavitve iskanja",
     "section_info_option": "Informacije",
+    "section_info_send_feedback": "Pošlji povratne informacije",
+    "section_info_privacy_notice": "Obvestilo o zasebnosti",
     "welcome_title": "Dobrodošli v novem zavihku",
     "welcome_body": "Na tem prostoru bo Firefox prikazoval najustreznejše zaznamke, članke, videoposnetke in nedavno obiskane strani, tako da jih lahko pozneje znova hitro najdete.",
     "welcome_label": "Zbiranje poudarkov",
     "time_label_less_than_minute": "<1 min",
     "time_label_minute": "{number} min",
     "time_label_hour": "{number} ur",
     "time_label_day": "{number} dni",
     "settings_pane_button_label": "Prilagodite stran novega zavihka",
     "settings_pane_header": "Nastavitve novega zavihka",
-    "settings_pane_body": "Izberite, kaj naj se prikaže, ko odprete nov zavihek.",
     "settings_pane_search_header": "Iskanje",
     "settings_pane_search_body": "Iščite po spletu z novega zavihka.",
     "settings_pane_topsites_header": "Glavne strani",
     "settings_pane_topsites_body": "Priročen dostop do najbolj obiskanih strani.",
     "settings_pane_topsites_options_showmore": "Prikaži dve vrsti",
     "settings_pane_bookmarks_header": "Nedavni zaznamki",
     "settings_pane_bookmarks_body": "Vaši novo ustvarjeni zaznamki na enem mestu.",
     "settings_pane_visit_again_header": "Obiščite znova",
     "settings_pane_visit_again_body": "Firefox vam bo prikazoval dele zgodovine brskanja, ki bi se jih morda želeli spomniti ali se nanje vrniti.",
-    "settings_pane_pocketstories_header": "Glavne vesti",
-    "settings_pane_pocketstories_body": "Pocket, del Mozilline družine, vam bo pomagal pridobiti visokokakovostne vsebine, ki jih sicer ne bi našli.",
+    "settings_pane_highlights_header": "Poudarki",
+    "settings_pane_highlights_options_bookmarks": "Zaznamki",
+    "settings_pane_highlights_options_visited": "Obiskane strani",
     "settings_pane_done_button": "Končano",
     "edit_topsites_button_text": "Uredi",
     "edit_topsites_button_label": "Prilagodite odsek Glavne strani",
     "edit_topsites_showmore_button": "Prikaži več",
     "edit_topsites_showless_button": "Prikaži manj",
     "edit_topsites_done_button": "Končano",
     "edit_topsites_pin_button": "Pripni to stran",
     "edit_topsites_unpin_button": "Odpni to stran",
@@ -5109,24 +5208,20 @@
     "topsites_form_url_placeholder": "Vnesite ali prilepite URL",
     "topsites_form_add_button": "Dodaj",
     "topsites_form_save_button": "Shrani",
     "topsites_form_cancel_button": "Prekliči",
     "topsites_form_url_validation": "Vnesite veljaven URL",
     "pocket_read_more": "Priljubljene teme:",
     "pocket_read_even_more": "Prikaži več vesti",
     "pocket_feedback_header": "Najboljše s spleta, kar je izbralo več kot 25 milijonov ljudi.",
-    "pocket_feedback_body": "Pocket, del Mozilline družine, vam bo pomagal pridobiti visokokakovostne vsebine, ki jih sicer ne bi našli.",
-    "pocket_send_feedback": "Pošlji povratne informacije",
     "topstories_empty_state": "Zdaj ste seznanjeni z novicami. Vrnite se pozneje in si oglejte nove prispevke iz {provider}. Komaj čakate? Izberite priljubljeno temo in odkrijte več velikih zgodb na spletu.",
-    "manual_migration_explanation": "Preskusite Firefox s svojimi priljubljenimi stranmi in zaznamki iz drugih brskalnikov.",
     "manual_migration_cancel_button": "Ne, hvala",
     "manual_migration_import_button": "Uvozi zdaj"
   },
-  "son": {},
   "sq": {
     "newtab_page_title": "Skedë e Re",
     "default_label_loading": "Po ngarkohet…",
     "header_top_sites": "Sajte Kryesues",
     "header_highlights": "Highlights",
     "type_label_visited": "Të vizituara",
     "type_label_bookmarked": "Të faqeruajtura",
     "type_label_synced": "Njëkohësuar prej pajisjeje tjetër",
@@ -5423,17 +5518,16 @@
     "pocket_read_more": "பிரபலமான தலைப்புகள்:",
     "pocket_read_even_more": "இன்னும் கதைகளைப் பார்க்கவும்",
     "pocket_feedback_header": "இணையத்தின் சிறந்த செயலி, 250 இலட்ச மக்களால் தேர்ந்தெடுக்கப்பட்டது.",
     "pocket_feedback_body": "Pocket, ஒரு மொசில்லா குடும்ப உறுப்பினராக, உயர்தர உள்ளடக்கங்களுடன் இணைய உதவுகிறது, இது இல்லையேல் அது சாத்தியமாகது.",
     "pocket_send_feedback": "கருத்துகளைத் தெறிவிக்கவும்",
     "manual_migration_cancel_button": "பரவாயில்லை",
     "manual_migration_import_button": "இப்போது இறக்கு"
   },
-  "ta-LK": {},
   "te": {
     "newtab_page_title": "కొత్త ట్యాబు",
     "default_label_loading": "వస్తోంది…",
     "header_top_sites": "మేటి సైట్లు",
     "header_stories": "ముఖ్య కథనాలు",
     "header_visit_again": "మళ్లీ సందర్శించండి",
     "header_bookmarks": "ఇటీవలి ఇష్టాంశములు",
     "header_recommended_by": "{provider}చే సిఫార్సు చేయబడినది",
@@ -5962,23 +6056,22 @@
     "edit_topsites_add_button": "Thêm",
     "topsites_form_add_button": "Thêm",
     "topsites_form_save_button": "Lưu lại",
     "topsites_form_cancel_button": "Hủy bỏ",
     "pocket_read_more": "Các chủ đề phổ biến:",
     "pocket_send_feedback": "Gửi phản hồi",
     "manual_migration_cancel_button": "Không, cảm ơn"
   },
-  "wo": {},
-  "xh": {},
   "zh-CN": {
     "newtab_page_title": "新标签页",
     "default_label_loading": "正在载入…",
     "header_top_sites": "常用网站",
     "header_stories": "热门文章",
+    "header_highlights": "集锦",
     "header_visit_again": "再次造访",
     "header_bookmarks": "最近的书签",
     "header_recommended_by": "{provider} 推荐",
     "header_bookmarks_placeholder": "您还没有最近的书签。",
     "header_stories_from": "出自",
     "type_label_visited": "曾经访问",
     "type_label_bookmarked": "已加书签",
     "type_label_synced": "从其他设备同步而来",
@@ -6000,37 +6093,43 @@
     "confirm_history_delete_notice_p2": "此操作不能撤销。",
     "menu_action_save_to_pocket": "保存到 Pocket",
     "search_for_something_with": "搜索 {search_term},使用:",
     "search_button": "搜索",
     "search_header": "{search_engine_name} 搜索",
     "search_web_placeholder": "在网络上搜索",
     "search_settings": "更改搜索设置",
     "section_info_option": "信息",
+    "section_info_send_feedback": "提交反馈",
+    "section_info_privacy_notice": "隐私声明",
     "welcome_title": "欢迎使用新标签页",
     "welcome_body": "Firefox 会在这里显示对您最有用的书签、文章、视频和访问过的页面,便于您回到这些网站。",
     "welcome_label": "正在为您准备集锦",
     "time_label_less_than_minute": "1 分钟内",
     "time_label_minute": "{number} 分钟前",
     "time_label_hour": "{number} 小时前",
     "time_label_day": "{number} 天前",
     "settings_pane_button_label": "定制您的新标签页",
     "settings_pane_header": "新标签页选项",
-    "settings_pane_body": "选择打开新标签页时想看到什么。",
+    "settings_pane_body2": "选择您在此页面上看到什么。",
     "settings_pane_search_header": "搜索",
     "settings_pane_search_body": "从您的新标签页搜索网络。",
     "settings_pane_topsites_header": "常用网站",
     "settings_pane_topsites_body": "访问您经常造访的网站。",
     "settings_pane_topsites_options_showmore": "双行显示",
     "settings_pane_bookmarks_header": "最近的书签",
     "settings_pane_bookmarks_body": "您最近创建的书签将在此显示。",
     "settings_pane_visit_again_header": "再次造访",
     "settings_pane_visit_again_body": "Firefox 在此显示您可能想记住或将再次访问的浏览记录。",
-    "settings_pane_pocketstories_header": "热门报道",
-    "settings_pane_pocketstories_body": "Pocket 是 Mozilla 家族的一员,可以将您未发现的高品质内容带到眼前。",
+    "settings_pane_highlights_header": "集锦",
+    "settings_pane_highlights_body2": "根据您最近访问的页面和添加的书签推荐您感兴趣的东西。",
+    "settings_pane_highlights_options_bookmarks": "书签",
+    "settings_pane_highlights_options_visited": "访问过的网站",
+    "settings_pane_snippets_header": "板报",
+    "settings_pane_snippets_body": "阅读和了解 Mozilla 就 Firefox、互联网文化等提供的一些简短而有趣的更新。",
     "settings_pane_done_button": "完成",
     "edit_topsites_button_text": "编辑",
     "edit_topsites_button_label": "定制您的“常用网站”区域",
     "edit_topsites_showmore_button": "显示更多",
     "edit_topsites_showless_button": "显示更少",
     "edit_topsites_done_button": "完成",
     "edit_topsites_pin_button": "固定此网站",
     "edit_topsites_unpin_button": "取消固定此网站",
@@ -6043,20 +6142,20 @@
     "topsites_form_url_placeholder": "输入或粘贴一个网址",
     "topsites_form_add_button": "添加",
     "topsites_form_save_button": "保存",
     "topsites_form_cancel_button": "取消",
     "topsites_form_url_validation": "需要有效的网址",
     "pocket_read_more": "热门主题:",
     "pocket_read_even_more": "查看更多文章",
     "pocket_feedback_header": "由超过 2500 万人挑选出来的网上精华内容。",
-    "pocket_feedback_body": "Pocket 是 Mozilla 家族的一员,可以将您未发现的高品质内容带到眼前。",
-    "pocket_send_feedback": "发送反馈",
+    "pocket_description": "借助 Pocket(目前所属 Mozilla)发现有趣的高品质内容。",
+    "highlights_empty_state": "开始浏览吧,之后我们会根据您最近的访问记录推荐一些精美文章、视频或其他页面,或者您添加的书签。",
     "topstories_empty_state": "所有文章都读完啦!晚点再来,{provider} 将推荐更多热门文章。等不及了?选择一个热门话题,找到更多网上的好文章。",
-    "manual_migration_explanation": "将您在其他浏览器中常用的网站和书签导入 Firefox,体验别具一格的浏览器。",
+    "manual_migration_explanation2": "携其他浏览器中保存的书签、历史记录和密码来尝试 Firefox。",
     "manual_migration_cancel_button": "不用了",
     "manual_migration_import_button": "立即导入"
   },
   "zh-TW": {
     "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.08.31.0006-a243a9c3</em:version>
+    <em:version>2017.09.01.1439-222d033f</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/ActivityStream.jsm
+++ b/browser/extensions/activity-stream/lib/ActivityStream.jsm
@@ -47,23 +47,24 @@ const PREFS_CONFIG = new Map([
   ["feeds.section.topstories.options", {
     title: "Configuration options for top stories feed",
     // This is a dynamic pref as it depends on the feed being shown or not
     getValue: args => JSON.stringify({
       api_key_pref: "extensions.pocket.oAuthConsumerKey",
       // Use the opposite value as what default value the feed would have used
       hidden: !PREFS_CONFIG.get("feeds.section.topstories").getValue(args),
       learn_more_endpoint: "https://getpocket.cdn.mozilla.net/firefox_learnmore?src=ff_newtab",
-      provider_description: "pocket_feedback_body",
+      provider_header: "pocket_feedback_header",
+      provider_description: "pocket_description",
       provider_icon: "pocket",
       provider_name: "Pocket",
       read_more_endpoint: "https://getpocket.cdn.mozilla.net/explore/trending?src=ff_new_tab",
       stories_endpoint: `https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?version=2&consumer_key=$apiKey&locale_lang=${args.locale}`,
       stories_referrer: "https://getpocket.com/recommendations",
-      survey_link: "https://www.surveymonkey.com/r/newtabffx",
+      info_link: "https://www.mozilla.org/privacy/firefox/#pocketstories",
       topics_endpoint: `https://getpocket.cdn.mozilla.net/v3/firefox/trending-topics?version=2&consumer_key=$apiKey&locale_lang=${args.locale}`,
       personalized: false
     })
   }],
   ["migrationExpired", {
     title: "Boolean flag that decides whether to show the migration message or not.",
     value: false
   }],
@@ -212,32 +213,29 @@ this.ActivityStream = class ActivityStre
     this.feeds = FEEDS_CONFIG;
     this._defaultPrefs = new DefaultPrefs(PREFS_CONFIG);
   }
   init() {
     this._updateDynamicPrefs();
     this._defaultPrefs.init();
 
     // Hook up the store and let all feeds and pages initialize
-    this.store.init(this.feeds);
-    this.store.dispatch(ac.BroadcastToContent({
+    this.store.init(this.feeds, ac.BroadcastToContent({
       type: at.INIT,
       data: {version: this.options.version}
-    }));
+    }), {type: at.UNINIT});
 
     this.initialized = true;
   }
   uninit() {
     if (this.geo === "") {
       Services.prefs.removeObserver(GEO_PREF, this);
     }
 
-    this.store.dispatch({type: at.UNINIT});
     this.store.uninit();
-
     this.initialized = false;
   }
   uninstall(reason) {
     if (reason === REASON_ADDON_UNINSTALL) {
       // This resets all prefs in the config to their default values,
       // so we DON'T want to do this on an upgrade/downgrade, only on a
       // real uninstall
       this._defaultPrefs.reset();
--- a/browser/extensions/activity-stream/lib/ManualMigration.jsm
+++ b/browser/extensions/activity-stream/lib/ManualMigration.jsm
@@ -71,16 +71,17 @@ this.ManualMigration = class ManualMigra
     this.store.dispatch(ac.SetPref("migrationExpired", true));
   }
 
   /**
    * Event listener for migration wizard completion event.
    */
   observe() {
     this.expireMigration();
+    this.store.dispatch({type: at.MIGRATION_COMPLETED});
   }
 
   onAction(action) {
     switch (action.type) {
       case at.PREFS_INITIAL_VALUES:
         this.expireIfNecessary(action.data.migrationExpired);
         break;
       case at.MIGRATION_START:
--- a/browser/extensions/activity-stream/lib/PlacesFeed.jsm
+++ b/browser/extensions/activity-stream/lib/PlacesFeed.jsm
@@ -50,16 +50,26 @@ class HistoryObserver extends Observer {
   }
 
   /**
    * onClearHistory - Called when the user clears their entire history.
    */
   onClearHistory() {
     this.dispatch({type: at.PLACES_HISTORY_CLEARED});
   }
+
+  // Empty functions to make xpconnect happy
+  onBeginUpdateBatch() {}
+  onEndUpdateBatch() {}
+  onVisit() {}
+  onTitleChanged() {}
+  onFrecencyChanged() {}
+  onManyFrecenciesChanged() {}
+  onPageChanged() {}
+  onDeleteVisits() {}
 }
 
 /**
  * BookmarksObserver - observes events from PlacesUtils.bookmarks
  */
 class BookmarksObserver extends Observer {
   constructor(dispatch) {
     super(dispatch, Ci.nsINavBookmarkObserver);
@@ -122,32 +132,49 @@ class BookmarksObserver extends Observer
    * @param  {any} value
    * @param  {int} lastModified
    * @param  {int} type         Indicates if the bookmark is an actual bookmark,
    *                             a folder, or a separator.
    * @param  {int} parent
    * @param  {str} guid         The unique id of the bookmark
    */
   async onItemChanged(...args) {
+
+    /*
+    // Disabled due to performance cost, see Issue 3203 /
+    // https://bugzilla.mozilla.org/show_bug.cgi?id=1392267.
+    //
+    // If this is used, please consider avoiding the call to
+    // NewTabUtils.activityStreamProvider.getBookmark which performs an additional
+    // fetch to the database.
+    // If you need more fields, please talk to the places team.
+
     const property = args[1];
     const type = args[5];
     const guid = args[7];
 
     // Only process this event if it is a TYPE_BOOKMARK, and uri or title was the property changed.
     if (type !== PlacesUtils.bookmarks.TYPE_BOOKMARK || !["uri", "title"].includes(property)) {
       return;
     }
     try {
       // bookmark: {bookmarkGuid, bookmarkTitle, lastModified, url}
       const bookmark = await NewTabUtils.activityStreamProvider.getBookmark(guid);
       this.dispatch({type: at.PLACES_BOOKMARK_CHANGED, data: bookmark});
     } catch (e) {
       Cu.reportError(e);
     }
+    */
   }
+
+  // Empty functions to make xpconnect happy
+  onBeginUpdateBatch() {}
+  onEndUpdateBatch() {}
+  onItemVisited() {}
+  onItemMoved() {}
 }
 
 class PlacesFeed {
   constructor() {
     this.historyObserver = new HistoryObserver(action => this.store.dispatch(ac.BroadcastToContent(action)));
     this.bookmarksObserver = new BookmarksObserver(action => this.store.dispatch(ac.BroadcastToContent(action)));
   }
 
--- a/browser/extensions/activity-stream/lib/SectionsManager.jsm
+++ b/browser/extensions/activity-stream/lib/SectionsManager.jsm
@@ -13,28 +13,28 @@ Cu.import("resource://gre/modules/EventE
  * Built in sections may depend on options stored as serialised JSON in the pref
  * `${feed_pref_name}.options`.
  */
 const BUILT_IN_SECTIONS = {
   "feeds.section.topstories": options => ({
     id: "topstories",
     pref: {
       titleString: {id: "header_recommended_by", values: {provider: options.provider_name}},
-      descString: {id: options.provider_description}
+      descString: {id: options.provider_description || "pocket_feedback_body"}
     },
     shouldHidePref:  options.hidden,
     eventSource: "TOP_STORIES",
     icon: options.provider_icon,
     title: {id: "header_recommended_by", values: {provider: options.provider_name}},
     maxRows: 1,
     availableContextMenuOptions: ["CheckBookmark", "SaveToPocket", "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"],
     infoOption: {
-      header: {id: "pocket_feedback_header"},
-      body: {id: options.provider_description},
-      link: {href: options.survey_link, id: "pocket_send_feedback"}
+      header: {id: options.provider_header || "pocket_feedback_header"},
+      body: {id: options.provider_description || "pocket_feedback_body"},
+      link: {href: options.info_link, id: "section_info_privacy_notice"}
     },
     emptyState: {
       message: {id: "topstories_empty_state", values: {provider: options.provider_name}},
       icon: "check"
     }
   })
 };
 
@@ -87,17 +87,17 @@ const SectionsManager = {
     this.emit(this.REMOVE_SECTION, id);
     this.sections.delete(id);
   },
   enableSection(id) {
     this.updateSection(id, {enabled: true}, true);
     this.emit(this.ENABLE_SECTION, id);
   },
   disableSection(id) {
-    this.updateSection(id, {enabled: false, rows: []}, true);
+    this.updateSection(id, {enabled: false, rows: [], initialized: false}, true);
     this.emit(this.DISABLE_SECTION, id);
   },
   updateSections() {
     this.sections.forEach((section, id) => this.updateSection(id, section, true));
   },
   updateSection(id, options, shouldBroadcast) {
     this.updateSectionContextMenuOptions(options);
 
@@ -206,16 +206,19 @@ class SectionsFeed {
         }
         break;
       case at.SECTION_DISABLE:
         SectionsManager.disableSection(action.data);
         break;
       case at.SECTION_ENABLE:
         SectionsManager.enableSection(action.data);
         break;
+      case at.UNINIT:
+        this.uninit();
+        break;
     }
     if (SectionsManager.ACTIONS_TO_PROXY.includes(action.type) && SectionsManager.sections.size > 0) {
       SectionsManager.emit(SectionsManager.ACTION_DISPATCHED, action.type, action.data);
     }
   }
 }
 
 this.SectionsFeed = SectionsFeed;
--- a/browser/extensions/activity-stream/lib/ShortURL.jsm
+++ b/browser/extensions/activity-stream/lib/ShortURL.jsm
@@ -32,36 +32,31 @@ function getETLD(url) {
     return "";
   }
 }
 
 this.getETLD = getETLD;
 
   /**
  * shortURL - Creates a short version of a link's url, used for display purposes
- *            e.g. {url: http://www.foosite.com, eTLD: "com"}  =>  "foosite"
+ *            e.g. {url: http://www.foosite.com}  =>  "foosite"
  *
  * @param  {obj} link A link object
  *         {str} link.url (required)- The url of the link
- *         {str} link.eTLD (required) - The tld of the link
- *               e.g. for https://foo.org, the tld would be "org"
- *               Note that this property is added in various queries for ActivityStream
- *               via Services.eTLD.getPublicSuffix
- *         {str} link.hostname (optional) - The hostname of the url
- *               e.g. for http://www.hello.com/foo/bar, the hostname would be "www.hello.com"
  *         {str} link.title (optional) - The title of the link
  * @return {str}   A short url
  */
 this.shortURL = function shortURL(link) {
-  if (!link.url && !link.hostname) {
+  if (!link.url) {
     return "";
   }
-  const eTLD = link.eTLD || getETLD(link.url);
-  const hostname = (link.hostname || new URL(link.url).hostname).replace(/^www\./i, "");
 
   // Remove the eTLD (e.g., com, net) and the preceding period from the hostname
-  const eTLDLength = (eTLD || "").length;
-  const eTLDExtra = eTLDLength > 0 ? -(eTLDLength + 1) : Infinity;
-  // If URL and hostname are not present fallback to page title.
-  return handleIDNHost(hostname.slice(0, eTLDExtra).toLowerCase() || hostname) || link.title || link.url;
+  const eTLD = getETLD(link.url);
+  const eTLDExtra = eTLD.length > 0 ? -(eTLD.length + 1) : Infinity;
+
+  // Clean up the url and fallback to page title or url if necessary
+  const hostname = (new URL(link.url).hostname).replace(/^www\./i, "");
+  return handleIDNHost(hostname.slice(0, eTLDExtra).toLowerCase()) ||
+    link.title || link.url;
 };
 
 this.EXPORTED_SYMBOLS = ["shortURL", "getETLD"];
--- a/browser/extensions/activity-stream/lib/SnippetsFeed.jsm
+++ b/browser/extensions/activity-stream/lib/SnippetsFeed.jsm
@@ -129,18 +129,18 @@ this.SnippetsFeed = class SnippetsFeed {
     browser.loadURI("about:accounts?action=signup&entrypoint=snippets");
   }
 
   onAction(action) {
     switch (action.type) {
       case at.INIT:
         this.init();
         break;
-      case at.FEED_INIT:
-        if (action.data === "feeds.snippets") { this.init(); }
+      case at.UNINIT:
+        this.uninit();
         break;
       case at.SHOW_FIREFOX_ACCOUNTS:
         this.showFirefoxAccounts(action._target.browser);
         break;
     }
   }
 };
 
--- a/browser/extensions/activity-stream/lib/Store.jsm
+++ b/browser/extensions/activity-stream/lib/Store.jsm
@@ -4,17 +4,16 @@
 "use strict";
 
 const {utils: Cu} = Components;
 
 const {ActivityStreamMessageChannel} = Cu.import("resource://activity-stream/lib/ActivityStreamMessageChannel.jsm", {});
 const {Prefs} = Cu.import("resource://activity-stream/lib/ActivityStreamPrefs.jsm", {});
 const {reducers} = Cu.import("resource://activity-stream/common/Reducers.jsm", {});
 const {redux} = Cu.import("resource://activity-stream/vendor/Redux.jsm", {});
-const {actionTypes: at} = Cu.import("resource://activity-stream/common/Actions.jsm", {});
 
 /**
  * Store - This has a similar structure to a redux store, but includes some extra
  *         functionality to allow for routing of actions between the Main processes
  *         and child processes via a ActivityStreamMessageChannel.
  *         It also accepts an array of "Feeds" on inititalization, which
  *         can listen for any action that is dispatched through the store.
  */
@@ -56,81 +55,98 @@ this.Store = class Store {
     };
   }
 
   /**
    * initFeed - Initializes a feed by calling its constructor function
    *
    * @param  {string} feedName The name of a feed, as defined in the object
    *                           passed to Store.init
+   * @param {Action} initAction An optional action to initialize the feed
    */
-  initFeed(feedName) {
+  initFeed(feedName, initAction) {
     const feed = this._feedFactories.get(feedName)();
     feed.store = this;
     this.feeds.set(feedName, feed);
+    if (initAction && feed.onAction) {
+      feed.onAction(initAction);
+    }
   }
 
   /**
    * uninitFeed - Removes a feed and calls its uninit function if defined
    *
    * @param  {string} feedName The name of a feed, as defined in the object
    *                           passed to Store.init
+   * @param {Action} uninitAction An optional action to uninitialize the feed
    */
-  uninitFeed(feedName) {
+  uninitFeed(feedName, uninitAction) {
     const feed = this.feeds.get(feedName);
     if (!feed) {
       return;
     }
-    if (feed.uninit) {
-      feed.uninit();
+    if (uninitAction && feed.onAction) {
+      feed.onAction(uninitAction);
     }
     this.feeds.delete(feedName);
   }
 
   /**
    * onPrefChanged - Listener for handling feed changes.
    */
   onPrefChanged(name, value) {
     if (this._feedFactories.has(name)) {
       if (value) {
-        this.initFeed(name);
-        this.dispatch({type: at.FEED_INIT, data: name});
+        this.initFeed(name, this._initAction);
       } else {
-        this.uninitFeed(name);
+        this.uninitFeed(name, this._uninitAction);
       }
     }
   }
 
   /**
    * init - Initializes the ActivityStreamMessageChannel channel, and adds feeds.
    *
    * @param  {Map} feedFactories A Map of feeds with the name of the pref for
    *                                the feed as the key and a function that
    *                                constructs an instance of the feed.
+   * @param {Action} initAction An optional action that will be dispatched
+   *                            to feeds when they're created.
+   * @param {Action} uninitAction An optional action for when feeds uninit.
    */
-  init(feedFactories) {
+  init(feedFactories, initAction, uninitAction) {
     this._feedFactories = feedFactories;
+    this._initAction = initAction;
+    this._uninitAction = uninitAction;
+
     for (const pref of feedFactories.keys()) {
       if (this._prefs.get(pref)) {
         this.initFeed(pref);
       }
     }
 
     this._prefs.observeBranch(this);
     this._messageChannel.createChannel();
+
+    // Dispatch an initial action after all enabled feeds are ready
+    if (initAction) {
+      this.dispatch(initAction);
+    }
   }
 
   /**
    * uninit -  Uninitalizes each feed, clears them, and destroys the message
    *           manager channel.
    *
    * @return {type}  description
    */
   uninit() {
+    if (this._uninitAction) {
+      this.dispatch(this._uninitAction);
+    }
     this._prefs.ignoreBranch(this);
-    this.feeds.forEach(feed => this.uninitFeed(feed));
     this.feeds.clear();
     this._feedFactories = null;
     this._messageChannel.destroyChannel();
   }
 };
 
 this.EXPORTED_SYMBOLS = ["Store"];
--- a/browser/extensions/activity-stream/lib/TelemetryFeed.jsm
+++ b/browser/extensions/activity-stream/lib/TelemetryFeed.jsm
@@ -373,16 +373,19 @@ this.TelemetryFeed = class TelemetryFeed
         this.sendEvent(this.createUndesiredEvent(action));
         break;
       case at.TELEMETRY_USER_EVENT:
         this.sendEvent(this.createUserEvent(action));
         break;
       case at.TELEMETRY_PERFORMANCE_EVENT:
         this.sendEvent(this.createPerformanceEvent(action));
         break;
+      case at.UNINIT:
+        this.uninit();
+        break;
     }
   }
 
   /**
    * Take all enumerable members of the data object and merge them into
    * the session.perf object for the given port, so that it is sent to the
    * server when the session ends.  All members of the data object should
    * be valid values of the perf object, as defined in pings.js and the
--- a/browser/extensions/activity-stream/lib/TopSitesFeed.jsm
+++ b/browser/extensions/activity-stream/lib/TopSitesFeed.jsm
@@ -33,20 +33,22 @@ this.TopSitesFeed = class TopSitesFeed {
   }
   refreshDefaults(sites) {
     // Clear out the array of any previous defaults
     DEFAULT_TOP_SITES.length = 0;
 
     // Add default sites if any based on the pref
     if (sites) {
       for (const url of sites.split(",")) {
-        DEFAULT_TOP_SITES.push({
+        const site = {
           isDefault: true,
           url
-        });
+        };
+        site.hostname = shortURL(site);
+        DEFAULT_TOP_SITES.push(site);
       }
     }
   }
   async getScreenshot(url) {
     let screenshot = await Screenshots.getScreenshotForURL(url);
     const action = {type: at.SCREENSHOT_UPDATED, data: {url, screenshot}};
     this.store.dispatch(ac.BroadcastToContent(action));
   }
@@ -60,28 +62,26 @@ this.TopSitesFeed = class TopSitesFeed {
       hostname: shortURL(site)
     }));
 
     if (!frecent) {
       frecent = [];
     } else {
       // Get the best history links that pass the frecency threshold
       frecent = frecent.filter(link => link && link.type !== "affiliate" &&
-        link.frecency > FRECENCY_THRESHOLD);
+        link.frecency > FRECENCY_THRESHOLD).map(site => {
+          site.hostname = shortURL(site);
+          return site;
+        });
     }
 
-    // Group together websites that require deduping.
-    let topsitesGroup = [];
-    for (const group of [pinned, frecent, notBlockedDefaultSites]) {
-      topsitesGroup.push(group.filter(site => site).map(site => Object.assign({}, site, {hostname: shortURL(site)})));
-    }
-
-    const dedupedGroups = this.dedupe.group(topsitesGroup);
-    // Insert original pinned websites in the result of the dedupe operation.
-    pinned = insertPinned([...dedupedGroups[1], ...dedupedGroups[2]], pinned);
+    // Remove any duplicates from frecent and default sites then insert the
+    // original pinned sites into the deduped frecent ([1]) and defaults ([2])
+    const deduped = this.dedupe.group(pinned, frecent, notBlockedDefaultSites);
+    pinned = insertPinned([...deduped[1], ...deduped[2]], pinned);
 
     return pinned.slice(0, TOP_SITES_SHOWMORE_LENGTH);
   }
   async refresh(target = null) {
     const links = await this.getLinksWithDefaults();
 
     // First, cache existing screenshots in case we need to reuse them
     const currentScreenshots = {};
@@ -172,17 +172,19 @@ this.TopSitesFeed = class TopSitesFeed {
         if (
           // When a new tab is opened, if the last time we refreshed the data
           // is greater than 15 minutes, refresh the data.
           (Date.now() - this.lastUpdated >= UPDATE_TIME)
         ) {
           this.refresh(action.meta.fromTarget);
         }
         break;
-      case at.PLACES_HISTORY_CLEARED: // All these actions mean we need new top sites
+      // All these actions mean we need new top sites
+      case at.MIGRATION_COMPLETED:
+      case at.PLACES_HISTORY_CLEARED:
       case at.PLACES_LINK_DELETED:
       case at.PLACES_LINK_BLOCKED:
         this.refresh();
         break;
       case at.PREF_CHANGED:
         if (action.data.name === DEFAULT_SITES_PREF) {
           this.refreshDefaults(action.data.value);
         }
--- a/browser/extensions/activity-stream/lib/TopStoriesFeed.jsm
+++ b/browser/extensions/activity-stream/lib/TopStoriesFeed.jsm
@@ -17,17 +17,16 @@ const {SectionsManager} = Cu.import("res
 
 const {UserDomainAffinityProvider} = Cu.import("resource://activity-stream/lib/UserDomainAffinityProvider.jsm", {});
 
 const STORIES_UPDATE_TIME = 30 * 60 * 1000; // 30 minutes
 const TOPICS_UPDATE_TIME = 3 * 60 * 60 * 1000; // 3 hours
 const DOMAIN_AFFINITY_UPDATE_TIME = 24 * 60 * 60 * 1000; // 24 hours
 const STORIES_NOW_THRESHOLD = 24 * 60 * 60 * 1000; // 24 hours
 const SECTION_ID = "topstories";
-const FEED_PREF = "feeds.section.topstories";
 
 this.TopStoriesFeed = class TopStoriesFeed {
 
   init() {
     this.storiesLastUpdated = 0;
     this.topicsLastUpdated = 0;
     this.affinityLastUpdated = 0;
 
@@ -53,70 +52,69 @@ this.TopStoriesFeed = class TopStoriesFe
     }
   }
 
   uninit() {
     SectionsManager.disableSection(SECTION_ID);
   }
 
   async fetchStories() {
-    if (this.stories_endpoint) {
-      const stories = await fetch(this.stories_endpoint)
-        .then(response => {
-          if (response.ok) {
-            return response.text();
-          }
-          throw new Error(`Stories endpoint returned unexpected status: ${response.status}`);
-        })
-        .then(body => {
-          const response = JSON.parse(body);
-          this.updateDomainAffinities(response.settings);
+    if (!this.stories_endpoint) {
+      return;
+    }
+    try {
+      const response = await fetch(this.stories_endpoint);
+
+      if (!response.ok) {
+        throw new Error(`Stories endpoint returned unexpected status: ${response.status}`);
+      }
+
+      const body = await response.json();
+      this.updateDomainAffinities(body.settings);
 
-          const items = response.recommendations
-            .filter(s => !NewTabUtils.blockedLinks.isBlocked({"url": s.url}))
-            .map(s => ({
-              "guid": s.id,
-              "hostname": shortURL(Object.assign({}, s, {url: s.url})),
-              "type": (Date.now() - (s.published_timestamp * 1000)) <= STORIES_NOW_THRESHOLD ? "now" : "trending",
-              "title": s.title,
-              "description": s.excerpt,
-              "image": this._normalizeUrl(s.image_src),
-              "referrer": this.stories_referrer,
-              "url": s.url,
-              "score": this.personalized ? this.affinityProvider.calculateItemRelevanceScore(s) : 1
-            }))
-            .sort(this.personalized ? this.compareScore : (a, b) => 0);
+      const recommendations = body.recommendations
+        .filter(s => !NewTabUtils.blockedLinks.isBlocked({"url": s.url}))
+        .map(s => ({
+          "guid": s.id,
+          "hostname": shortURL(Object.assign({}, s, {url: s.url})),
+          "type": (Date.now() - (s.published_timestamp * 1000)) <= STORIES_NOW_THRESHOLD ? "now" : "trending",
+          "title": s.title,
+          "description": s.excerpt,
+          "image": this._normalizeUrl(s.image_src),
+          "referrer": this.stories_referrer,
+          "url": s.url,
+          "score": this.personalized ? this.affinityProvider.calculateItemRelevanceScore(s) : 1
+        }))
+        .sort(this.personalized ? this.compareScore : (a, b) => 0);
 
-          return this.rotate(items);
-        })
-        .catch(error => Cu.reportError(`Failed to fetch content: ${error.message}`));
+      const rows = this.rotate(recommendations);
 
-      if (stories) {
-        this.dispatchUpdateEvent(this.storiesLastUpdated, {rows: stories});
-        this.storiesLastUpdated = Date.now();
-      }
+      this.dispatchUpdateEvent(this.storiesLastUpdated, {rows});
+      this.storiesLastUpdated = Date.now();
+    } catch (error) {
+      Cu.reportError(`Failed to fetch content: ${error.message}`);
     }
   }
 
   async fetchTopics() {
-    if (this.topics_endpoint) {
-      const topics = await fetch(this.topics_endpoint)
-        .then(response => {
-          if (response.ok) {
-            return response.text();
-          }
-          throw new Error(`Topics endpoint returned unexpected status: ${response.status}`);
-        })
-        .then(body => JSON.parse(body).topics)
-        .catch(error => Cu.reportError(`Failed to fetch topics: ${error.message}`));
-
+    if (!this.topics_endpoint) {
+      return;
+    }
+    try {
+      const response = await fetch(this.topics_endpoint);
+      if (!response.ok) {
+        throw new Error(`Topics endpoint returned unexpected status: ${response.status}`);
+      }
+      const {topics} = await response.json();
       if (topics) {
         this.dispatchUpdateEvent(this.topicsLastUpdated, {topics, read_more_endpoint: this.read_more_endpoint});
         this.topicsLastUpdated = Date.now();
       }
+    } catch (error) {
+      Cu.reportError(`Failed to fetch topics: ${error.message}`);
     }
   }
 
   dispatchUpdateEvent(lastUpdated, data) {
     SectionsManager.updateSection(SECTION_ID, data, lastUpdated === 0);
   }
 
   compareScore(a, b) {
@@ -193,22 +191,16 @@ this.TopStoriesFeed = class TopStoriesFe
         }
         if (Date.now() - this.topicsLastUpdated >= TOPICS_UPDATE_TIME) {
           this.fetchTopics();
         }
         break;
       case at.UNINIT:
         this.uninit();
         break;
-      case at.FEED_INIT:
-        if (action.data === FEED_PREF) {
-          this.init();
-        }
-        break;
     }
   }
 };
 
 this.STORIES_UPDATE_TIME = STORIES_UPDATE_TIME;
 this.TOPICS_UPDATE_TIME = TOPICS_UPDATE_TIME;
 this.SECTION_ID = SECTION_ID;
-this.FEED_PREF = FEED_PREF;
-this.EXPORTED_SYMBOLS = ["TopStoriesFeed", "STORIES_UPDATE_TIME", "TOPICS_UPDATE_TIME", "DOMAIN_AFFINITY_UPDATE_TIME", "SECTION_ID", "FEED_PREF"];
+this.EXPORTED_SYMBOLS = ["TopStoriesFeed", "STORIES_UPDATE_TIME", "TOPICS_UPDATE_TIME", "DOMAIN_AFFINITY_UPDATE_TIME", "SECTION_ID"];
--- a/browser/extensions/activity-stream/test/unit/common/Dedupe.test.js
+++ b/browser/extensions/activity-stream/test/unit/common/Dedupe.test.js
@@ -4,39 +4,39 @@ describe("Dedupe", () => {
   let instance;
   beforeEach(() => {
     instance = new Dedupe();
   });
   describe("group", () => {
     it("should remove duplicates inside the groups", () => {
       const beforeItems = [[1, 1, 1], [2, 2, 2], [3, 3, 3]];
       const afterItems = [[1], [2], [3]];
-      assert.deepEqual(instance.group(beforeItems), afterItems);
+      assert.deepEqual(instance.group(...beforeItems), afterItems);
     });
     it("should remove duplicates between groups, favouring earlier groups", () => {
       const beforeItems = [[1, 2, 3], [2, 3, 4], [3, 4, 5]];
       const afterItems = [[1, 2, 3], [4], [5]];
-      assert.deepEqual(instance.group(beforeItems), afterItems);
+      assert.deepEqual(instance.group(...beforeItems), afterItems);
     });
     it("should remove duplicates from groups of objects", () => {
       instance = new Dedupe(item => item.id);
       const beforeItems = [[{id: 1}, {id: 1}, {id: 2}], [{id: 1}, {id: 3}, {id: 2}], [{id: 1}, {id: 2}, {id: 5}]];
       const afterItems = [[{id: 1}, {id: 2}], [{id: 3}], [{id: 5}]];
-      assert.deepEqual(instance.group(beforeItems), afterItems);
+      assert.deepEqual(instance.group(...beforeItems), afterItems);
     });
     it("should take a custom comparison function", () => {
       function compare(previous, current) {
         return current.amount > previous.amount;
       }
       instance = new Dedupe(item => item.id, compare);
       const beforeItems = [
         [{id: 1, amount: 50}, {id: 1, amount: 100}],
         [{id: 1, amount: 200}, {id: 2, amount: 0}, {id: 2, amount: 100}]
       ];
       const afterItems = [
         [{id: 1, amount: 100}],
         [{id: 2, amount: 100}]
       ];
 
-      assert.deepEqual(instance.group(beforeItems), afterItems);
+      assert.deepEqual(instance.group(...beforeItems), afterItems);
     });
   });
 });
--- a/browser/extensions/activity-stream/test/unit/common/Reducers.test.js
+++ b/browser/extensions/activity-stream/test/unit/common/Reducers.test.js
@@ -263,28 +263,56 @@ describe("Reducers", () => {
     it("should update a section on SECTION_REGISTER if it already exists", () => {
       const NEW_TITLE = "New Title";
       const action = {type: at.SECTION_REGISTER, data: {id: "foo_bar_2", title: NEW_TITLE}};
       const newState = Sections(oldState, action);
       assert.lengthOf(newState, 5);
       const updatedSection = newState.find(section => section.id === "foo_bar_2");
       assert.ok(updatedSection && updatedSection.title === NEW_TITLE);
     });
+    it("should set initialized to false on SECTION_REGISTER if there are no rows", () => {
+      const NEW_TITLE = "New Title";
+      const action = {type: at.SECTION_REGISTER, data: {id: "bloop", title: NEW_TITLE}};
+      const newState = Sections(oldState, action);
+      const updatedSection = newState.find(section => section.id === "bloop");
+      assert.propertyVal(updatedSection, "initialized", false);
+    });
+    it("should set initialized to true on SECTION_REGISTER if there are rows", () => {
+      const NEW_TITLE = "New Title";
+      const action = {type: at.SECTION_REGISTER, data: {id: "bloop", title: NEW_TITLE, rows: [{}, {}]}};
+      const newState = Sections(oldState, action);
+      const updatedSection = newState.find(section => section.id === "bloop");
+      assert.propertyVal(updatedSection, "initialized", true);
+    });
     it("should have no effect on SECTION_UPDATE if the id doesn't exist", () => {
       const action = {type: at.SECTION_UPDATE, data: {id: "fake_id", data: "fake_data"}};
       const newState = Sections(oldState, action);
       assert.deepEqual(oldState, newState);
     });
     it("should update the section with the correct data on SECTION_UPDATE", () => {
       const FAKE_DATA = {rows: ["some", "fake", "data"], foo: "bar"};
       const action = {type: at.SECTION_UPDATE, data: Object.assign(FAKE_DATA, {id: "foo_bar_2"})};
       const newState = Sections(oldState, action);
       const updatedSection = newState.find(section => section.id === "foo_bar_2");
       assert.include(updatedSection, FAKE_DATA);
     });
+    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 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", () => {
       const blockAction = {type: at.PLACES_LINK_BLOCKED, data: {url: "www.foo.bar"}};
       const deleteAction = {type: at.PLACES_LINK_DELETED, data: {url: "www.foo.bar"}};
       const newBlockState = Sections(oldState, blockAction);
       const newDeleteState = Sections(oldState, deleteAction);
       newBlockState.concat(newDeleteState).forEach(section => {
         assert.deepEqual(section.rows, [{url: "www.other.url"}]);
       });
--- a/browser/extensions/activity-stream/test/unit/lib/ActivityStream.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/ActivityStream.test.js
@@ -48,36 +48,38 @@ describe("ActivityStream", () => {
       assert.calledOnce(as._defaultPrefs.init);
     });
     it("should set .initialized to true", () => {
       assert.isTrue(as.initialized, ".initialized");
     });
     it("should call .store.init", () => {
       assert.calledOnce(as.store.init);
     });
-    it("should emit an INIT event with the right version", () => {
+    it("should pass to Store an INIT event with the right version", () => {
       as = new ActivityStream({version: "1.2.3"});
       sandbox.stub(as.store, "init");
-      sandbox.stub(as.store, "dispatch");
       sandbox.stub(as._defaultPrefs, "init");
 
       as.init();
 
-      assert.calledOnce(as.store.dispatch);
-      const action = as.store.dispatch.firstCall.args[0];
+      const action = as.store.init.firstCall.args[1];
       assert.propertyVal(action.data, "version", "1.2.3");
     });
-    it("should emit an INIT event to content", () => {
-      sandbox.stub(as.store, "dispatch");
-
+    it("should pass to Store an INIT event for content", () => {
       as.init();
 
-      const action = as.store.dispatch.firstCall.args[0];
+      const action = as.store.init.firstCall.args[1];
       assert.equal(action.meta.to, CONTENT_MESSAGE_TYPE);
     });
+    it("should pass to Store an UNINIT event", () => {
+      as.init();
+
+      const action = as.store.init.firstCall.args[2];
+      assert.equal(action.type, "UNINIT");
+    });
   });
   describe("#uninit", () => {
     beforeEach(() => {
       as.init();
       as.uninit();
     });
     it("should set .initialized to false", () => {
       assert.isFalse(as.initialized, ".initialized");
--- a/browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js
@@ -179,16 +179,28 @@ describe("PlacesFeed", () => {
       });
     });
     describe("#onClearHistory", () => {
       it("should dispatch a PLACES_HISTORY_CLEARED action", () => {
         observer.onClearHistory();
         assert.calledWith(dispatch, {type: at.PLACES_HISTORY_CLEARED});
       });
     });
+    describe("Other empty methods (to keep code coverage happy)", () => {
+      it("should have a various empty functions for xpconnect happiness", () => {
+        observer.onBeginUpdateBatch();
+        observer.onEndUpdateBatch();
+        observer.onVisit();
+        observer.onTitleChanged();
+        observer.onFrecencyChanged();
+        observer.onManyFrecenciesChanged();
+        observer.onPageChanged();
+        observer.onDeleteVisits();
+      });
+    });
   });
 
   describe("BookmarksObserver", () => {
     let dispatch;
     let observer;
     beforeEach(() => {
       dispatch = sandbox.spy();
       observer = new BookmarksObserver(dispatch);
@@ -236,36 +248,48 @@ describe("PlacesFeed", () => {
         assert.calledWith(dispatch, {type: at.PLACES_BOOKMARK_REMOVED, data: {bookmarkGuid: "123foo", url: "foo.com"}});
       });
     });
     describe("#onItemChanged", () => {
       beforeEach(() => {
         sandbox.stub(global.NewTabUtils.activityStreamProvider, "getBookmark")
           .withArgs(FAKE_BOOKMARK.guid).returns(Promise.resolve(FAKE_BOOKMARK));
       });
-      it("should dispatch a PLACES_BOOKMARK_CHANGED action with the bookmark data", async () => {
+      it("has an empty function to keep xpconnect happy", async () => {
+        await observer.onItemChanged();
+      });
+      // Disabled in Issue 3203, see observer.onItemChanged for more information.
+      it.skip("should dispatch a PLACES_BOOKMARK_CHANGED action with the bookmark data", async () => {
         const args = [null, "title", null, null, null, TYPE_BOOKMARK, null, FAKE_BOOKMARK.guid];
         await observer.onItemChanged(...args);
 
         assert.calledWith(dispatch, {type: at.PLACES_BOOKMARK_CHANGED, data: FAKE_BOOKMARK});
       });
-      it("should catch errors gracefully", async () => {
+      it.skip("should catch errors gracefully", async () => {
         const e = new Error("test error");
         global.NewTabUtils.activityStreamProvider.getBookmark.restore();
         sandbox.stub(global.NewTabUtils.activityStreamProvider, "getBookmark")
           .returns(Promise.reject(e));
 
         const args = [null, "title", null, null, null, TYPE_BOOKMARK, null, FAKE_BOOKMARK.guid];
         await observer.onItemChanged(...args);
 
         assert.calledWith(global.Components.utils.reportError, e);
       });
-      it("should ignore events that are not of TYPE_BOOKMARK", async () => {
+      it.skip("should ignore events that are not of TYPE_BOOKMARK", async () => {
         await observer.onItemChanged(null, "title", null, null, null, "nottypebookmark");
         assert.notCalled(dispatch);
       });
-      it("should ignore events that are not changes to uri/title", async () => {
+      it.skip("should ignore events that are not changes to uri/title", async () => {
         await observer.onItemChanged(null, "tags", null, null, null, TYPE_BOOKMARK);
         assert.notCalled(dispatch);
       });
     });
+    describe("Other empty methods (to keep code coverage happy)", () => {
+      it("should have a various empty functions for xpconnect happiness", () => {
+        observer.onBeginUpdateBatch();
+        observer.onEndUpdateBatch();
+        observer.onItemVisited();
+        observer.onItemMoved();
+      });
+    });
   });
 });
--- a/browser/extensions/activity-stream/test/unit/lib/SectionsManager.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/SectionsManager.test.js
@@ -104,22 +104,22 @@ describe("SectionsManager", () => {
       const spy = sinon.spy();
       SectionsManager.on(SectionsManager.ENABLE_SECTION, spy);
       SectionsManager.enableSection(FAKE_ID);
       assert.calledOnce(spy);
       assert.calledWith(spy, SectionsManager.ENABLE_SECTION, FAKE_ID);
     });
   });
   describe("#disableSection", () => {
-    it("should call updateSection with {enabled: false, rows: []}", () => {
+    it("should call updateSection with {enabled: false, rows: [], initialized: false}", () => {
       sinon.spy(SectionsManager, "updateSection");
       SectionsManager.addSection(FAKE_ID, FAKE_OPTIONS);
       SectionsManager.disableSection(FAKE_ID);
       assert.calledOnce(SectionsManager.updateSection);
-      assert.calledWith(SectionsManager.updateSection, FAKE_ID, {enabled: false, rows: []}, true);
+      assert.calledWith(SectionsManager.updateSection, FAKE_ID, {enabled: false, rows: [], initialized: false}, true);
       SectionsManager.updateSection.restore();
     });
     it("should emit a DISABLE_SECTION event", () => {
       const spy = sinon.spy();
       SectionsManager.on(SectionsManager.DISABLE_SECTION, spy);
       SectionsManager.disableSection(FAKE_ID);
       assert.calledOnce(spy);
       assert.calledWith(spy, SectionsManager.DISABLE_SECTION, FAKE_ID);
@@ -315,16 +315,23 @@ describe("SectionsFeed", () => {
     });
     it("should call SectionsManager.enableSection on SECTION_ENABLE", () => {
       sinon.spy(SectionsManager, "enableSection");
       feed.onAction({type: "SECTION_ENABLE", data: 1234});
       assert.calledOnce(SectionsManager.enableSection);
       assert.calledWith(SectionsManager.enableSection, 1234);
       SectionsManager.enableSection.restore();
     });
+    it("should call the feed's uninit on UNINIT", () => {
+      sinon.stub(feed, "uninit");
+
+      feed.onAction({type: "UNINIT"});
+
+      assert.calledOnce(feed.uninit);
+    });
     it("should emit a ACTION_DISPATCHED event and forward any action in ACTIONS_TO_PROXY if there are any sections", () => {
       const spy = sinon.spy();
       const allowedActions = SectionsManager.ACTIONS_TO_PROXY;
       const disallowedActions = ["PREF_CHANGED", "OPEN_PRIVATE_WINDOW"];
       feed.init();
       SectionsManager.on(SectionsManager.ACTION_DISPATCHED, spy);
       // Make sure we start with no sections - no event should be emitted
       SectionsManager.sections.clear();
--- a/browser/extensions/activity-stream/test/unit/lib/ShortUrl.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/ShortUrl.test.js
@@ -4,87 +4,80 @@ const {GlobalOverrider} = require("test/
 describe("shortURL", () => {
   let globals;
   let IDNStub;
   let getPublicSuffixStub;
   let newURIStub;
 
   beforeEach(() => {
     IDNStub = sinon.stub().callsFake(id => id);
-    getPublicSuffixStub = sinon.stub();
+    getPublicSuffixStub = sinon.stub().returns("com");
     newURIStub = sinon.stub().callsFake(id => id);
 
     globals = new GlobalOverrider();
     globals.set("IDNService", {convertToDisplayIDN: IDNStub});
     globals.set("Services", {
       eTLD: {getPublicSuffix: getPublicSuffixStub},
       io: {newURI: newURIStub}
     });
   });
 
   afterEach(() => {
     globals.restore();
   });
 
-  it("should return a blank string if url and hostname is falsey", () => {
+  it("should return a blank string if url is falsey", () => {
+    assert.equal(shortURL({url: false}), "");
     assert.equal(shortURL({url: ""}), "");
-    assert.equal(shortURL({hostname: null}), "");
+    assert.equal(shortURL({}), "");
   });
 
-  it("should remove the eTLD, if provided", () => {
-    assert.equal(shortURL({hostname: "com.blah.com", eTLD: "com"}), "com.blah");
+  it("should remove the eTLD", () => {
+    assert.equal(shortURL({url: "http://com.blah.com"}), "com.blah");
   });
 
   it("should call convertToDisplayIDN when calling shortURL", () => {
-    const hostname = shortURL({hostname: "com.blah.com", eTLD: "com"});
+    const hostname = shortURL({url: "http://com.blah.com"});
 
     assert.calledOnce(IDNStub);
     assert.calledWithExactly(IDNStub, hostname, {});
   });
 
-  it("should use the hostname, if provided", () => {
-    assert.equal(shortURL({hostname: "foo.com", url: "http://bar.com", eTLD: "com"}), "foo");
-  });
-
-  it("should call getPublicSuffix if no eTLD provided", () => {
+  it("should call getPublicSuffix", () => {
     shortURL({url: "http://bar.com"});
 
     assert.calledWithExactly(newURIStub, "http://bar.com");
     assert.calledOnce(newURIStub);
     assert.calledOnce(getPublicSuffixStub);
   });
 
-  it("should not call getPublicSuffix when eTLD provided", () => {
-    shortURL({hostname: "com.blah.com", eTLD: "com"});
-
-    assert.equal(getPublicSuffixStub.callCount, 0);
-  });
-
-  it("should get the hostname from .url if necessary", () => {
-    assert.equal(shortURL({url: "http://bar.com", eTLD: "com"}), "bar");
+  it("should get the hostname from .url", () => {
+    assert.equal(shortURL({url: "http://bar.com"}), "bar");
   });
 
   it("should not strip out www if not first subdomain", () => {
-    assert.equal(shortURL({hostname: "foo.www.com", eTLD: "com"}), "foo.www");
+    assert.equal(shortURL({url: "http://foo.www.com"}), "foo.www");
   });
 
   it("should convert to lowercase", () => {
-    assert.equal(shortURL({url: "HTTP://FOO.COM", eTLD: "com"}), "foo");
+    assert.equal(shortURL({url: "HTTP://FOO.COM"}), "foo");
   });
 
   it("should return hostname for localhost", () => {
-    assert.equal(shortURL({url: "http://localhost:8000/", eTLD: "localhost"}), "localhost");
+    getPublicSuffixStub.throws("insufficient domain levels");
+
+    assert.equal(shortURL({url: "http://localhost:8000/"}), "localhost");
   });
 
   it("should fallback to link title if it exists", () => {
     const link = {
       url: "file:///Users/voprea/Work/activity-stream/logs/coverage/system-addon/report-html/index.html",
       title: "Code coverage report"
     };
 
     assert.equal(shortURL(link), link.title);
   });
 
-  it("should return the url if no hostname or title is provided", () => {
+  it("should return the url if no title is provided", () => {
     const url = "file://foo/bar.txt";
-    assert.equal(shortURL({url, eTLD: "foo"}), url);
+    assert.equal(shortURL({url}), url);
   });
 });
--- a/browser/extensions/activity-stream/test/unit/lib/SnippetsFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/SnippetsFeed.test.js
@@ -57,32 +57,31 @@ describe("SnippetsFeed", () => {
     assert.propertyVal(action.data, "profileResetWeeksAgo", 1);
     assert.propertyVal(action.data, "telemetryEnabled", true);
     assert.propertyVal(action.data, "onboardingFinished", false);
     assert.propertyVal(action.data, "fxaccount", true);
     assert.property(action.data, "selectedSearchEngine");
     assert.deepEqual(action.data.selectedSearchEngine, searchData);
     assert.propertyVal(action.data, "defaultBrowser", true);
   });
-  it("should call .init on an INIT aciton", () => {
+  it("should call .init on an INIT action", () => {
     const feed = new SnippetsFeed();
     sandbox.stub(feed, "init");
     feed.store = {dispatch: sandbox.stub()};
 
     feed.onAction({type: at.INIT});
     assert.calledOnce(feed.init);
   });
-  it("should call .init when a FEED_INIT happens for feeds.snippets", () => {
+  it("should call .uninit on an UNINIT action", () => {
     const feed = new SnippetsFeed();
-    sandbox.stub(feed, "init");
+    sandbox.stub(feed, "uninit");
     feed.store = {dispatch: sandbox.stub()};
 
-    feed.onAction({type: at.FEED_INIT, data: "feeds.snippets"});
-
-    assert.calledOnce(feed.init);
+    feed.onAction({type: at.UNINIT});
+    assert.calledOnce(feed.uninit);
   });
   it("should dispatch a SNIPPETS_RESET on uninit", () => {
     const feed = new SnippetsFeed();
     feed.store = {dispatch: sandbox.stub()};
 
     feed.uninit();
 
     assert.calledWith(feed.store.dispatch, {type: at.SNIPPETS_RESET});
--- a/browser/extensions/activity-stream/test/unit/lib/Store.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/Store.test.js
@@ -45,42 +45,58 @@ describe("Store", () => {
       class Foo {}
       store._prefs.set("foo", true);
       store.init(new Map([["foo", () => new Foo()]]));
       store.initFeed("foo");
 
       assert.isTrue(store.feeds.has("foo"), "foo is set");
       assert.instanceOf(store.feeds.get("foo"), Foo);
     });
+    it("should call the feed's onAction with uninit action if it exists", () => {
+      let feed;
+      function createFeed() {
+        feed = {onAction: sinon.spy()};
+        return feed;
+      }
+      const action = {type: "FOO"};
+      store._feedFactories = new Map([["foo", createFeed]]);
+
+      store.initFeed("foo", action);
+
+      assert.calledOnce(feed.onAction);
+      assert.calledWith(feed.onAction, action);
+    });
     it("should add a .store property to the feed", () => {
       class Foo {}
       store._feedFactories = new Map([["foo", () => new Foo()]]);
       store.initFeed("foo");
 
       assert.propertyVal(store.feeds.get("foo"), "store", store);
     });
   });
   describe("#uninitFeed", () => {
     it("should not throw if no feed with that name exists", () => {
       assert.doesNotThrow(() => {
         store.uninitFeed("bar");
       });
     });
-    it("should call the feed's uninit function if it is defined", () => {
+    it("should call the feed's onAction with uninit action if it exists", () => {
       let feed;
       function createFeed() {
-        feed = {uninit: sinon.spy()};
+        feed = {onAction: sinon.spy()};
         return feed;
       }
+      const action = {type: "BAR"};
       store._feedFactories = new Map([["foo", createFeed]]);
-
       store.initFeed("foo");
-      store.uninitFeed("foo");
+
+      store.uninitFeed("foo", action);
 
-      assert.calledOnce(feed.uninit);
+      assert.calledOnce(feed.onAction);
+      assert.calledWith(feed.onAction, action);
     });
     it("should remove the feed from .feeds", () => {
       class Foo {}
       store._feedFactories = new Map([["foo", () => new Foo()]]);
 
       store.initFeed("foo");
       store.uninitFeed("foo");
 
@@ -133,18 +149,37 @@ describe("Store", () => {
       store.init(new Map());
       assert.calledOnce(store._prefs.observeBranch);
       assert.calledWith(store._prefs.observeBranch, store);
     });
     it("should initialize the ActivityStreamMessageChannel channel", () => {
       store.init(new Map());
       assert.calledOnce(store._messageChannel.createChannel);
     });
+    it("should emit an initial event if provided", () => {
+      sinon.stub(store, "dispatch");
+      const action = {type: "FOO"};
+
+      store.init(new Map(), action);
+
+      assert.calledOnce(store.dispatch);
+      assert.calledWith(store.dispatch, action);
+    });
   });
   describe("#uninit", () => {
+    it("should emit an uninit event if provided on init", () => {
+      sinon.stub(store, "dispatch");
+      const action = {type: "BAR"};
+      store.init(new Map(), null, action);
+
+      store.uninit();
+
+      assert.calledOnce(store.dispatch);
+      assert.calledWith(store.dispatch, action);
+    });
     it("should clear .feeds and ._feedFactories", () => {
       store._prefs.set("a", true);
       store.init(new Map([
         ["a", () => ({})],
         ["b", () => ({})],
         ["c", () => ({})]
       ]));
 
--- a/browser/extensions/activity-stream/test/unit/lib/TelemetryFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/TelemetryFeed.test.js
@@ -474,16 +474,21 @@ describe("TelemetryFeed", () => {
       FakePrefs.prototype.prefs[PREF_IMPRESSION_STATS_BLOCKED] = "[]";
       FakePrefs.prototype.prefs[PREF_IMPRESSION_STATS_POCKETED] = "[]";
     });
     it("should call .init() on an INIT action", () => {
       const stub = sandbox.stub(instance, "init");
       instance.onAction({type: at.INIT});
       assert.calledOnce(stub);
     });
+    it("should call .uninit() on an UNINIT action", () => {
+      const stub = sandbox.stub(instance, "uninit");
+      instance.onAction({type: at.UNINIT});
+      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: {}
       }, "port123"));
--- a/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/TopSitesFeed.test.js
@@ -57,17 +57,17 @@ describe("Top Sites Feed", () => {
       "common/Dedupe.jsm": {Dedupe: fakeDedupe},
       "common/Reducers.jsm": {insertPinned, TOP_SITES_SHOWMORE_LENGTH},
       "lib/Screenshots.jsm": {Screenshots: fakeScreenshot},
       "lib/TippyTopProvider.jsm": {TippyTopProvider: FakeTippyTopProvider},
       "lib/ShortURL.jsm": {shortURL: shortURLStub}
     }));
     feed = new TopSitesFeed();
     feed.store = {dispatch: sinon.spy(), getState() { return {TopSites: {rows: Array(12).fill("site")}}; }};
-    feed.dedupe.group = sites => sites;
+    feed.dedupe.group = (...sites) => sites;
     links = FAKE_LINKS;
     clock = sinon.useFakeTimers();
   });
   afterEach(() => {
     globals.restore();
     clock.restore();
   });
 
@@ -82,16 +82,22 @@ describe("Top Sites Feed", () => {
 
       assert.isAbove(DEFAULT_TOP_SITES.length, 0);
     });
     it("should have default sites with .isDefault = true", () => {
       feed.refreshDefaults("https://foo.com");
 
       DEFAULT_TOP_SITES.forEach(link => assert.propertyVal(link, "isDefault", true));
     });
+    it("should have default sites with appropriate hostname", () => {
+      feed.refreshDefaults("https://foo.com");
+
+      DEFAULT_TOP_SITES.forEach(link => assert.propertyVal(link, "hostname",
+        shortURLStub(link)));
+    });
     it("should add no defaults on empty pref", () => {
       feed.refreshDefaults("");
 
       assert.equal(DEFAULT_TOP_SITES.length, 0);
     });
     it("should clear defaults", () => {
       feed.refreshDefaults("https://foo.com");
       feed.refreshDefaults("");
@@ -138,17 +144,17 @@ describe("Top Sites Feed", () => {
       const result = await feed.getLinksWithDefaults();
 
       // what we should be left with is just the top site we added, and not the default site we blocked
       assert.lengthOf(result, 1);
       assert.deepEqual(result[0], topsite);
       assert.notInclude(result, blockedDefaultSite);
     });
     it("should call dedupe on the links", async () => {
-      const stub = sinon.stub(feed.dedupe, "group").callsFake(id => id);
+      const stub = sinon.stub(feed.dedupe, "group").callsFake((...id) => id);
 
       await feed.getLinksWithDefaults();
 
       assert.calledOnce(stub);
     });
     it("should dedupe the links by hostname", async () => {
       const site = {url: "foo", hostname: "bar"};
       const result = feed._dedupeKey(site);
@@ -182,46 +188,51 @@ describe("Top Sites Feed", () => {
     });
     describe("deduping", () => {
       beforeEach(() => {
         ({TopSitesFeed, DEFAULT_TOP_SITES} = injector({
           "lib/ActivityStreamPrefs.jsm": {Prefs: FakePrefs},
           "common/Reducers.jsm": {insertPinned, TOP_SITES_SHOWMORE_LENGTH},
           "lib/Screenshots.jsm": {Screenshots: fakeScreenshot}
         }));
+        sandbox.stub(global.Services.eTLD, "getPublicSuffix").returns("com");
         feed = new TopSitesFeed();
       });
       it("should not dedupe pinned sites", async () => {
         fakeNewTabUtils.pinnedLinks.links = [
           {url: "https://developer.mozilla.org/en-US/docs/Web"},
           {url: "https://developer.mozilla.org/en-US/docs/Learn"}
         ];
 
         const sites = await feed.getLinksWithDefaults();
 
         assert.lengthOf(sites, TOP_SITES_SHOWMORE_LENGTH);
         assert.equal(sites[0].url, fakeNewTabUtils.pinnedLinks.links[0].url);
         assert.equal(sites[1].url, fakeNewTabUtils.pinnedLinks.links[1].url);
         assert.equal(sites[0].hostname, sites[1].hostname);
       });
-      it("should not dedupe pinned sites", async () => {
+      it("should prefer pinned sites over links", async () => {
         fakeNewTabUtils.pinnedLinks.links = [
           {url: "https://developer.mozilla.org/en-US/docs/Web"},
           {url: "https://developer.mozilla.org/en-US/docs/Learn"}
         ];
         // These will be the frecent results.
         links = [
-          {url: "https://developer.mozilla.org/en-US/docs/Web"},
-          {url: "https://developer.mozilla.org/en-US/docs/Learn"}
+          {frecency: FAKE_FRECENCY, url: "https://developer.mozilla.org/"},
+          {frecency: FAKE_FRECENCY, url: "https://www.mozilla.org/"}
         ];
 
         const sites = await feed.getLinksWithDefaults();
 
-        // Frecent results are removed and only pinned are kept.
-        assert.lengthOf(sites, 2);
+        // Expecting 3 links where there's 2 pinned and 1 www.mozilla.org, so
+        // the frecent with matching hostname as pinned is removed.
+        assert.lengthOf(sites, 3);
+        assert.equal(sites[0].url, fakeNewTabUtils.pinnedLinks.links[0].url);
+        assert.equal(sites[1].url, fakeNewTabUtils.pinnedLinks.links[1].url);
+        assert.equal(sites[2].url, links[1].url);
       });
       it("should return sites that have a title", async () => {
         // Simulate a pinned link with no title.
         fakeNewTabUtils.pinnedLinks.links = [{url: "https://github.com/mozilla/activity-stream"}];
 
         const sites = await feed.getLinksWithDefaults();
 
         for (const site of sites) {
@@ -375,16 +386,22 @@ describe("Top Sites Feed", () => {
       assert.calledOnce(feed.store.dispatch);
       assert.propertyVal(feed.store.dispatch.firstCall.args[0], "type", at.TOP_SITES_UPDATED);
     });
     it("should call refresh on INIT action", async () => {
       sinon.stub(feed, "refresh");
       await feed.onAction({type: at.INIT});
       assert.calledOnce(feed.refresh);
     });
+    it("should call refresh without a target on MIGRATION_COMPLETED action", async () => {
+      sinon.stub(feed, "refresh");
+      await feed.onAction({type: at.MIGRATION_COMPLETED});
+      assert.calledOnce(feed.refresh);
+      assert.equal(feed.refresh.firstCall.args[0], null);
+    });
     it("should call refresh without a target on PLACES_LINK_BLOCKED action", async () => {
       sinon.stub(feed, "refresh");
       await feed.onAction({type: at.PLACES_LINK_BLOCKED});
       assert.calledOnce(feed.refresh);
       assert.equal(feed.refresh.firstCall.args[0], null);
     });
     it("should call refresh without a target on PLACES_LINK_DELETED action", async () => {
       sinon.stub(feed, "refresh");
--- a/browser/extensions/activity-stream/test/unit/lib/TopStoriesFeed.test.js
+++ b/browser/extensions/activity-stream/test/unit/lib/TopStoriesFeed.test.js
@@ -5,17 +5,16 @@ const {actionTypes: at} = require("commo
 const {GlobalOverrider} = require("test/unit/utils");
 
 describe("Top Stories Feed", () => {
   let TopStoriesFeed;
   let STORIES_UPDATE_TIME;
   let TOPICS_UPDATE_TIME;
   let DOMAIN_AFFINITY_UPDATE_TIME;
   let SECTION_ID;
-  let FEED_PREF;
   let instance;
   let clock;
   let globals;
   let sectionsManagerStub;
   let shortURLStub;
 
   const FAKE_OPTIONS = {
     "stories_endpoint": "https://somedomain.org/stories?key=$apiKey",
@@ -40,17 +39,17 @@ describe("Top Stories Feed", () => {
       onceInitialized: sinon.stub().callsFake(callback => callback()),
       enableSection: sinon.spy(),
       disableSection: sinon.spy(),
       updateSection: sinon.spy(),
       sections: new Map([["topstories", {options: FAKE_OPTIONS}]])
     };
 
     class FakeUserDomainAffinityProvider {}
-    ({TopStoriesFeed, STORIES_UPDATE_TIME, TOPICS_UPDATE_TIME, DOMAIN_AFFINITY_UPDATE_TIME, SECTION_ID, FEED_PREF} = injector({
+    ({TopStoriesFeed, STORIES_UPDATE_TIME, TOPICS_UPDATE_TIME, DOMAIN_AFFINITY_UPDATE_TIME, SECTION_ID} = injector({
       "lib/ActivityStreamPrefs.jsm": {Prefs: FakePrefs},
       "lib/ShortURL.jsm": {shortURL: shortURLStub},
       "lib/UserDomainAffinityProvider.jsm": {UserDomainAffinityProvider: FakeUserDomainAffinityProvider},
       "lib/SectionsManager.jsm": {SectionsManager: sectionsManagerStub}
     }));
 
     instance = new TopStoriesFeed();
     instance.store = {getState() { return {}; }, dispatch: sinon.spy()};
@@ -116,57 +115,55 @@ describe("Top Stories Feed", () => {
           "stories_endpoint": "https://somedomain.org/stories?key=$apiKey",
           "topics_endpoint": "https://somedomain.org/topics?key=$apiKey"
         }
       });
       instance.init();
 
       assert.called(Components.utils.reportError);
     });
-    it("should initialize on FEED_INIT", () => {
-      instance.init = sinon.spy();
-      instance.onAction({type: at.FEED_INIT, data: FEED_PREF});
-      assert.calledOnce(instance.init);
-    });
   });
   describe("#uninit", () => {
     it("should disable its section", () => {
       instance.onAction({type: at.UNINIT});
       assert.calledOnce(sectionsManagerStub.disableSection);
       assert.calledWith(sectionsManagerStub.disableSection, SECTION_ID);
     });
   });
   describe("#fetch", () => {
     it("should fetch stories and send event", async () => {
       let fetchStub = globals.sandbox.stub();
       globals.set("fetch", fetchStub);
       globals.set("NewTabUtils", {blockedLinks: {isBlocked: globals.sandbox.spy()}});
 
-      const response = `{"recommendations": [{"id" : "1",
-        "title": "title",
-        "excerpt": "description",
-        "image_src": "image-url",
-        "url": "rec-url",
-        "published_timestamp" : "123"
-      }]}`;
+      const response = {
+        "recommendations": [{
+          "id": "1",
+          "title": "title",
+          "excerpt": "description",
+          "image_src": "image-url",
+          "url": "rec-url",
+          "published_timestamp": "123"
+        }]
+      };
       const stories = [{
         "guid": "1",
         "type": "now",
         "title": "title",
         "description": "description",
         "image": "image-url",
         "referrer": "referrer",
         "url": "rec-url",
         "hostname": "rec-url",
         "score": 1
       }];
 
       instance.stories_endpoint = "stories-endpoint";
       instance.stories_referrer = "referrer";
-      fetchStub.resolves({ok: true, status: 200, text: () => response});
+      fetchStub.resolves({ok: true, status: 200, json: () => Promise.resolve(response)});
       await instance.fetchStories();
 
       assert.calledOnce(fetchStub);
       assert.calledOnce(shortURLStub);
       assert.calledWithExactly(fetchStub, instance.stories_endpoint);
       assert.calledOnce(sectionsManagerStub.updateSection);
       assert.calledWith(sectionsManagerStub.updateSection, SECTION_ID, {rows: stories});
     });
@@ -188,63 +185,63 @@ describe("Top Stories Feed", () => {
       assert.notCalled(sectionsManagerStub.updateSection);
       assert.called(Components.utils.reportError);
     });
     it("should exclude blocked (dismissed) URLs", async () => {
       let fetchStub = globals.sandbox.stub();
       globals.set("fetch", fetchStub);
       globals.set("NewTabUtils", {blockedLinks: {isBlocked: site => site.url === "blocked"}});
 
-      const response = `{"recommendations": [{"url" : "blocked"}, {"url" : "not_blocked"}]}`;
+      const response = {"recommendations": [{"url": "blocked"}, {"url": "not_blocked"}]};
       instance.stories_endpoint = "stories-endpoint";
-      fetchStub.resolves({ok: true, status: 200, text: () => response});
+      fetchStub.resolves({ok: true, status: 200, json: () => Promise.resolve(response)});
       await instance.fetchStories();
 
       assert.calledOnce(sectionsManagerStub.updateSection);
       assert.equal(sectionsManagerStub.updateSection.firstCall.args[1].rows.length, 1);
       assert.equal(sectionsManagerStub.updateSection.firstCall.args[1].rows[0].url, "not_blocked");
     });
     it("should mark stories as new", async () => {
       let fetchStub = globals.sandbox.stub();
       globals.set("fetch", fetchStub);
       globals.set("NewTabUtils", {blockedLinks: {isBlocked: globals.sandbox.spy()}});
       clock.restore();
-      const response = JSON.stringify({
+      const response = {
         "recommendations": [
           {"published_timestamp": Date.now() / 1000},
           {"published_timestamp": "0"},
           {"published_timestamp": (Date.now() - 2 * 24 * 60 * 60 * 1000) / 1000}
         ]
-      });
+      };
 
       instance.stories_endpoint = "stories-endpoint";
-      fetchStub.resolves({ok: true, status: 200, text: () => response});
+      fetchStub.resolves({ok: true, status: 200, json: () => Promise.resolve(response)});
 
       await instance.fetchStories();
       assert.calledOnce(sectionsManagerStub.updateSection);
       assert.equal(sectionsManagerStub.updateSection.firstCall.args[1].rows.length, 3);
       assert.equal(sectionsManagerStub.updateSection.firstCall.args[1].rows[0].type, "now");
       assert.equal(sectionsManagerStub.updateSection.firstCall.args[1].rows[1].type, "trending");
       assert.equal(sectionsManagerStub.updateSection.firstCall.args[1].rows[2].type, "trending");
     });
     it("should fetch topics and send event", async () => {
       let fetchStub = globals.sandbox.stub();
       globals.set("fetch", fetchStub);
 
-      const response = `{"topics": [{"name" : "topic1", "url" : "url-topic1"}, {"name" : "topic2", "url" : "url-topic2"}]}`;
+      const response = {"topics": [{"name": "topic1", "url": "url-topic1"}, {"name": "topic2", "url": "url-topic2"}]};
       const topics = [{
         "name": "topic1",
         "url": "url-topic1"
       }, {
         "name": "topic2",
         "url": "url-topic2"
       }];
 
       instance.topics_endpoint = "topics-endpoint";
-      fetchStub.resolves({ok: true, status: 200, text: () => response});
+      fetchStub.resolves({ok: true, status: 200, json: () => Promise.resolve(response)});
       await instance.fetchTopics();
 
       assert.calledOnce(fetchStub);
       assert.calledWithExactly(fetchStub, instance.topics_endpoint);
       assert.calledOnce(sectionsManagerStub.updateSection);
       assert.calledWithMatch(sectionsManagerStub.updateSection, SECTION_ID, {topics});
     });
     it("should report error for unexpected topics response", async () => {
@@ -257,56 +254,56 @@ describe("Top Stories Feed", () => {
       await instance.fetchTopics();
 
       assert.calledOnce(fetchStub);
       assert.calledWithExactly(fetchStub, instance.topics_endpoint);
       assert.notCalled(instance.store.dispatch);
       assert.called(Components.utils.reportError);
     });
     it("should initialize user domain affinity provider if personalization is preffed on", async () => {
-      const response = `{
+      const response = {
         "recommendations":  [{
-          "id" : "1",
+          "id": "1",
           "title": "title",
           "excerpt": "description",
           "image_src": "image-url",
           "url": "rec-url",
-          "published_timestamp" : "123"}
-        ],
+          "published_timestamp": "123"
+        }],
         "settings": {"timeSegments": {}, "domainAffinityParameterSets": {}}
-      }`;
+      };
 
       instance.affinityProvider = undefined;
 
       instance.stories_endpoint = "stories-endpoint";
       let fetchStub = globals.sandbox.stub();
       globals.set("fetch", fetchStub);
-      fetchStub.resolves({ok: true, status: 200, text: () => response});
+      fetchStub.resolves({ok: true, status: 200, json: () => Promise.resolve(response)});
 
       await instance.fetchStories();
       assert.isUndefined(instance.affinityProvider);
 
       instance.personalized = true;
       await instance.fetchStories();
       assert.isDefined(instance.affinityProvider);
     });
     it("should sort stories if personalization is preffed on", async () => {
-      const response = `{
-        "recommendations":  [{"id" : "1"}, {"id" : "2"}],
+      const response = {
+        "recommendations":  [{"id": "1"}, {"id": "2"}],
         "settings": {"timeSegments": {}, "domainAffinityParameterSets": {}}
-      }`;
+      };
 
       instance.personalized = true;
       instance.compareScore = sinon.spy();
       instance.stories_endpoint = "stories-endpoint";
 
       let fetchStub = globals.sandbox.stub();
       globals.set("fetch", fetchStub);
       globals.set("NewTabUtils", {blockedLinks: {isBlocked: globals.sandbox.spy()}});
-      fetchStub.resolves({ok: true, status: 200, text: () => response});
+      fetchStub.resolves({ok: true, status: 200, json: () => Promise.resolve(response)});
 
       await instance.fetchStories();
       assert.calledOnce(instance.compareScore);
     });
     it("should not sort stories if personalization is preffed off", async () => {
       const response = `{
         "recommendations":  [{"id" : "1"}, {"id" : "2"}],
         "settings": {"timeSegments": {}, "domainAffinityParameterSets": {}}
@@ -314,17 +311,17 @@ describe("Top Stories Feed", () => {
 
       instance.personalized = false;
       instance.compareScore = sinon.spy();
       instance.stories_endpoint = "stories-endpoint";
 
       let fetchStub = globals.sandbox.stub();
       globals.set("fetch", fetchStub);
       globals.set("NewTabUtils", {blockedLinks: {isBlocked: globals.sandbox.spy()}});
-      fetchStub.resolves({ok: true, status: 200, text: () => response});
+      fetchStub.resolves({ok: true, status: 200, json: () => Promise.resolve(response)});
 
       await instance.fetchStories();
       assert.notCalled(instance.compareScore);
     });
     it("should sort items based on relevance score", () => {
       let items = [{"score": 0.1}, {"score": 0.2}];
       items = items.sort(instance.compareScore);
       assert.deepEqual(items, [{"score": 0.2}, {"score": 0.1}]);
--- a/browser/extensions/activity-stream/test/unit/unit-entry.js
+++ b/browser/extensions/activity-stream/test/unit/unit-entry.js
@@ -58,17 +58,17 @@ overrider.set({
           setIntPref() {},
           setStringPref() {},
           clearUserPref() {}
         };
       }
     },
     tm: {dispatchToMainThread: cb => cb()},
     eTLD: {getPublicSuffix() {}},
-    io: {NewURI() {}},
+    io: {newURI() {}},
     search: {
       init(cb) { cb(); },
       getVisibleEngines: () => [{identifier: "google"}, {identifier: "bing"}],
       defaultEngine: {identifier: "google"}
     }
   },
   XPCOMUtils: {
     defineLazyModuleGetter() {},
--- a/browser/modules/PingCentre.jsm
+++ b/browser/modules/PingCentre.jsm
@@ -92,17 +92,18 @@ class PingCentre {
   async sendPing(data) {
     if (!this.enabled) {
       return Promise.resolve();
     }
 
     let clientID = data.client_id || await this.telemetryClientId;
     const payload = Object.assign({
       topic: this._topic,
-      client_id: clientID
+      client_id: clientID,
+      release_channel: AppConstants.MOZ_UPDATE_CHANNEL
     }, data);
 
     if (this.logging) {
       // performance related pings cause a lot of logging, so we mute them
       if (data.action !== "activity_stream_performance") {
         Services.console.logStringMessage(`TELEMETRY PING: ${JSON.stringify(payload)}\n`);
       }
     }