Merge mozilla-inbound to mozilla-central. a=merge
authorDorel Luca <dluca@mozilla.com>
Fri, 27 Jul 2018 13:19:26 +0300
changeset 476984 87bcafe428a4ad6017e59b915581ae00aa863407
parent 476982 e56f7601927e35b9219957f49c27e8484a5184e4 (current diff)
parent 476941 ad1674e9152da31151ab9f9f099f83ca4ff2d832 (diff)
child 476985 53ea40188efab3406b5ec7709699bb673176bee6
child 477021 20335ff1bf9e4af4125810a9c70dedef3bf77166
push id211
push userfmarier@mozilla.com
push dateWed, 01 Aug 2018 21:19:47 +0000
reviewersmerge
milestone63.0a1
Merge mozilla-inbound to mozilla-central. a=merge
.eslintignore
CLOBBER
browser/base/content/test/performance/browser_preferences_usage.js
browser/base/content/test/tabs/browser_isLocalAboutURI.js
browser/components/newtab/lib/ActivityStreamMessageChannel.jsm
browser/components/newtab/moz.build
browser/components/newtab/tests/browser/.eslintrc.js
browser/components/newtab/tests/browser/browser.ini
browser/components/newtab/tests/browser/browser_activity_stream_strings.js
browser/components/newtab/tests/browser/browser_enabled_newtabpage.js
browser/components/newtab/tests/browser/browser_newtab_overrides.js
browser/components/newtab/tests/browser/browser_packaged_as_locales.js
browser/components/newtab/tests/xpcshell/.eslintrc.js
browser/components/newtab/tests/xpcshell/test_AboutNewTabService.js
browser/components/newtab/tests/xpcshell/xpcshell.ini
browser/extensions/activity-stream/.eslintignore
browser/extensions/activity-stream/.eslintrc.js
browser/extensions/activity-stream/.mcignore
browser/extensions/activity-stream/.nvmrc
browser/extensions/activity-stream/.sass-lint.yml
browser/extensions/activity-stream/.taskcluster.yml
browser/extensions/activity-stream/.travis.yml
browser/extensions/activity-stream/CODEOWNERS
browser/extensions/activity-stream/LICENSE
browser/extensions/activity-stream/README.md
browser/extensions/activity-stream/bin/download-firefox-artifact
browser/extensions/activity-stream/bin/download-firefox-travis.sh
browser/extensions/activity-stream/bin/locales.js
browser/extensions/activity-stream/bin/prepare-mochitests-dev
browser/extensions/activity-stream/bin/process-system-addon-for-package.js
browser/extensions/activity-stream/bin/render-activity-stream-html.js
browser/extensions/activity-stream/bin/strings-import.js
browser/extensions/activity-stream/bin/test-merges.js
browser/extensions/activity-stream/bin/update-version.js
browser/extensions/activity-stream/bootstrap.js
browser/extensions/activity-stream/common/Actions.jsm
browser/extensions/activity-stream/common/Dedupe.jsm
browser/extensions/activity-stream/common/PerfService.jsm
browser/extensions/activity-stream/common/PrerenderData.jsm
browser/extensions/activity-stream/common/Reducers.jsm
browser/extensions/activity-stream/content-src/.eslintrc.js
browser/extensions/activity-stream/content-src/activity-stream-prerender.jsx
browser/extensions/activity-stream/content-src/activity-stream.jsx
browser/extensions/activity-stream/content-src/asrouter/asrouter-content.jsx
browser/extensions/activity-stream/content-src/asrouter/components/Button/Button.jsx
browser/extensions/activity-stream/content-src/asrouter/components/Button/_Button.scss
browser/extensions/activity-stream/content-src/asrouter/components/ImpressionsWrapper/ImpressionsWrapper.jsx
browser/extensions/activity-stream/content-src/asrouter/components/ModalOverlay/ModalOverlay.jsx
browser/extensions/activity-stream/content-src/asrouter/components/ModalOverlay/_ModalOverlay.scss
browser/extensions/activity-stream/content-src/asrouter/components/SnippetBase/SnippetBase.jsx
browser/extensions/activity-stream/content-src/asrouter/components/SnippetBase/_SnippetBase.scss
browser/extensions/activity-stream/content-src/asrouter/schemas/message-format.md
browser/extensions/activity-stream/content-src/asrouter/schemas/provider-response.schema.json
browser/extensions/activity-stream/content-src/asrouter/template-utils.js
browser/extensions/activity-stream/content-src/asrouter/templates/OnboardingMessage/OnboardingMessage.jsx
browser/extensions/activity-stream/content-src/asrouter/templates/OnboardingMessage/_OnboardingMessage.scss
browser/extensions/activity-stream/content-src/asrouter/templates/SimpleSnippet/SimpleSnippet.jsx
browser/extensions/activity-stream/content-src/asrouter/templates/SimpleSnippet/SimpleSnippet.schema.json
browser/extensions/activity-stream/content-src/asrouter/templates/SimpleSnippet/_SimpleSnippet.scss
browser/extensions/activity-stream/content-src/components/ASRouterAdmin/ASRouterAdmin.jsx
browser/extensions/activity-stream/content-src/components/ASRouterAdmin/ASRouterAdmin.scss
browser/extensions/activity-stream/content-src/components/Base/Base.jsx
browser/extensions/activity-stream/content-src/components/Base/_Base.scss
browser/extensions/activity-stream/content-src/components/Card/Card.jsx
browser/extensions/activity-stream/content-src/components/Card/_Card.scss
browser/extensions/activity-stream/content-src/components/Card/types.js
browser/extensions/activity-stream/content-src/components/CollapsibleSection/CollapsibleSection.jsx
browser/extensions/activity-stream/content-src/components/CollapsibleSection/_CollapsibleSection.scss
browser/extensions/activity-stream/content-src/components/ComponentPerfTimer/ComponentPerfTimer.jsx
browser/extensions/activity-stream/content-src/components/ConfirmDialog/ConfirmDialog.jsx
browser/extensions/activity-stream/content-src/components/ConfirmDialog/_ConfirmDialog.scss
browser/extensions/activity-stream/content-src/components/ContextMenu/ContextMenu.jsx
browser/extensions/activity-stream/content-src/components/ContextMenu/_ContextMenu.scss
browser/extensions/activity-stream/content-src/components/ErrorBoundary/ErrorBoundary.jsx
browser/extensions/activity-stream/content-src/components/ErrorBoundary/_ErrorBoundary.scss
browser/extensions/activity-stream/content-src/components/LinkMenu/LinkMenu.jsx
browser/extensions/activity-stream/content-src/components/ManualMigration/ManualMigration.jsx
browser/extensions/activity-stream/content-src/components/ManualMigration/_ManualMigration.scss
browser/extensions/activity-stream/content-src/components/Search/Search.jsx
browser/extensions/activity-stream/content-src/components/Search/_Search.scss
browser/extensions/activity-stream/content-src/components/SectionMenu/SectionMenu.jsx
browser/extensions/activity-stream/content-src/components/Sections/Sections.jsx
browser/extensions/activity-stream/content-src/components/Sections/_Sections.scss
browser/extensions/activity-stream/content-src/components/StartupOverlay/StartupOverlay.jsx
browser/extensions/activity-stream/content-src/components/StartupOverlay/_StartupOverlay.scss
browser/extensions/activity-stream/content-src/components/TopSites/TopSite.jsx
browser/extensions/activity-stream/content-src/components/TopSites/TopSiteForm.jsx
browser/extensions/activity-stream/content-src/components/TopSites/TopSiteFormInput.jsx
browser/extensions/activity-stream/content-src/components/TopSites/TopSites.jsx
browser/extensions/activity-stream/content-src/components/TopSites/TopSitesConstants.js
browser/extensions/activity-stream/content-src/components/TopSites/_TopSites.scss
browser/extensions/activity-stream/content-src/components/Topics/Topics.jsx
browser/extensions/activity-stream/content-src/components/Topics/_Topics.scss
browser/extensions/activity-stream/content-src/lib/constants.js
browser/extensions/activity-stream/content-src/lib/detect-user-session-start.js
browser/extensions/activity-stream/content-src/lib/init-store.js
browser/extensions/activity-stream/content-src/lib/link-menu-options.js
browser/extensions/activity-stream/content-src/lib/screenshot-utils.js
browser/extensions/activity-stream/content-src/lib/section-menu-options.js
browser/extensions/activity-stream/content-src/lib/snippets.js
browser/extensions/activity-stream/content-src/styles/_activity-stream.scss
browser/extensions/activity-stream/content-src/styles/_icons.scss
browser/extensions/activity-stream/content-src/styles/_normalize.scss
browser/extensions/activity-stream/content-src/styles/_theme.scss
browser/extensions/activity-stream/content-src/styles/_variables.scss
browser/extensions/activity-stream/content-src/styles/activity-stream-linux.scss
browser/extensions/activity-stream/content-src/styles/activity-stream-mac.scss
browser/extensions/activity-stream/content-src/styles/activity-stream-windows.scss
browser/extensions/activity-stream/contributing.md
browser/extensions/activity-stream/css/activity-stream-linux.css
browser/extensions/activity-stream/css/activity-stream-linux.css.map
browser/extensions/activity-stream/css/activity-stream-mac.css
browser/extensions/activity-stream/css/activity-stream-mac.css.map
browser/extensions/activity-stream/css/activity-stream-windows.css
browser/extensions/activity-stream/css/activity-stream-windows.css.map
browser/extensions/activity-stream/data/content/activity-stream.bundle.js
browser/extensions/activity-stream/data/content/activity-stream.bundle.js.map
browser/extensions/activity-stream/data/content/assets/fox-tail.png
browser/extensions/activity-stream/data/content/assets/glyph-add-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-arrowhead-down-12.svg
browser/extensions/activity-stream/data/content/assets/glyph-arrowhead-down-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-cancel-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-delete-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-dismiss-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-edit-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-highlights-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-import-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-info-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-maximize-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-minimize-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-modal-delete-32.svg
browser/extensions/activity-stream/data/content/assets/glyph-newWindow-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-open-file-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-pin-12.svg
browser/extensions/activity-stream/data/content/assets/glyph-pin-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-pocket-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-topsites-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-trending-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-unpin-16.svg
browser/extensions/activity-stream/data/content/assets/glyph-webextension-16.svg
browser/extensions/activity-stream/data/content/assets/illustration-addons@2x.png
browser/extensions/activity-stream/data/content/assets/illustration-gift@2x.png
browser/extensions/activity-stream/data/content/assets/illustration-privatebrowsing@2x.png
browser/extensions/activity-stream/data/content/assets/illustration-screenshots@2x.png
browser/extensions/activity-stream/data/content/assets/sync-devices.svg
browser/extensions/activity-stream/data/content/assets/topic-show-more-12.svg
browser/extensions/activity-stream/data/content/tippytop/images/aliexpress-com@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/allegro-pl@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/amazon@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/avito-ru@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/bbc-uk@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/ebay@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/facebook-com@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/leboncoin-fr@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/ok-ru@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/olx-pl@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/reddit-com@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/twitter-com@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/vk-com@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/wikipedia-org@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/wykop-pl@2x.png
browser/extensions/activity-stream/data/content/tippytop/images/youtube-com@2x.png
browser/extensions/activity-stream/data/content/tippytop/top_sites.json
browser/extensions/activity-stream/docs/ISSUE_TEMPLATE.md
browser/extensions/activity-stream/docs/v2-system-addon/1.GETTING_STARTED.md
browser/extensions/activity-stream/docs/v2-system-addon/data_dictionary.md
browser/extensions/activity-stream/docs/v2-system-addon/data_events.md
browser/extensions/activity-stream/docs/v2-system-addon/mochitests.md
browser/extensions/activity-stream/docs/v2-system-addon/preferences.md
browser/extensions/activity-stream/docs/v2-system-addon/sections.md
browser/extensions/activity-stream/docs/v2-system-addon/snippets.md
browser/extensions/activity-stream/docs/v2-system-addon/telemetry.md
browser/extensions/activity-stream/docs/v2-system-addon/test-merges.md
browser/extensions/activity-stream/docs/v2-system-addon/unit_testing_guide.md
browser/extensions/activity-stream/install.rdf.in
browser/extensions/activity-stream/jar.mn
browser/extensions/activity-stream/karma.mc.config.js
browser/extensions/activity-stream/lib/ASRouter.jsm
browser/extensions/activity-stream/lib/ASRouterFeed.jsm
browser/extensions/activity-stream/lib/ASRouterTargeting.jsm
browser/extensions/activity-stream/lib/AboutPreferences.jsm
browser/extensions/activity-stream/lib/ActivityStream.jsm
browser/extensions/activity-stream/lib/ActivityStreamMessageChannel.jsm
browser/extensions/activity-stream/lib/ActivityStreamPrefs.jsm
browser/extensions/activity-stream/lib/ActivityStreamStorage.jsm
browser/extensions/activity-stream/lib/DownloadsManager.jsm
browser/extensions/activity-stream/lib/FaviconFeed.jsm
browser/extensions/activity-stream/lib/FilterAdult.jsm
browser/extensions/activity-stream/lib/HighlightsFeed.jsm
browser/extensions/activity-stream/lib/LinksCache.jsm
browser/extensions/activity-stream/lib/ManualMigration.jsm
browser/extensions/activity-stream/lib/NewTabInit.jsm
browser/extensions/activity-stream/lib/OnboardingMessageProvider.jsm
browser/extensions/activity-stream/lib/PersistentCache.jsm
browser/extensions/activity-stream/lib/PlacesFeed.jsm
browser/extensions/activity-stream/lib/PrefsFeed.jsm
browser/extensions/activity-stream/lib/Screenshots.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/SystemTickFeed.jsm
browser/extensions/activity-stream/lib/TelemetryFeed.jsm
browser/extensions/activity-stream/lib/TippyTopProvider.jsm
browser/extensions/activity-stream/lib/TopSitesFeed.jsm
browser/extensions/activity-stream/lib/TopStoriesFeed.jsm
browser/extensions/activity-stream/lib/UTEventReporting.jsm
browser/extensions/activity-stream/lib/UserDomainAffinityProvider.jsm
browser/extensions/activity-stream/loaders/inject-loader.js
browser/extensions/activity-stream/locales/ach/strings.properties
browser/extensions/activity-stream/locales/an/strings.properties
browser/extensions/activity-stream/locales/ar/strings.properties
browser/extensions/activity-stream/locales/ast/strings.properties
browser/extensions/activity-stream/locales/az/strings.properties
browser/extensions/activity-stream/locales/be/strings.properties
browser/extensions/activity-stream/locales/bg/strings.properties
browser/extensions/activity-stream/locales/bn-BD/strings.properties
browser/extensions/activity-stream/locales/bn-IN/strings.properties
browser/extensions/activity-stream/locales/br/strings.properties
browser/extensions/activity-stream/locales/bs/strings.properties
browser/extensions/activity-stream/locales/ca/strings.properties
browser/extensions/activity-stream/locales/cak/strings.properties
browser/extensions/activity-stream/locales/crh/strings.properties
browser/extensions/activity-stream/locales/cs/strings.properties
browser/extensions/activity-stream/locales/cy/strings.properties
browser/extensions/activity-stream/locales/da/strings.properties
browser/extensions/activity-stream/locales/de/strings.properties
browser/extensions/activity-stream/locales/dsb/strings.properties
browser/extensions/activity-stream/locales/el/strings.properties
browser/extensions/activity-stream/locales/en-CA/strings.properties
browser/extensions/activity-stream/locales/en-GB/strings.properties
browser/extensions/activity-stream/locales/en-US/strings.properties
browser/extensions/activity-stream/locales/eo/strings.properties
browser/extensions/activity-stream/locales/es-AR/strings.properties
browser/extensions/activity-stream/locales/es-CL/strings.properties
browser/extensions/activity-stream/locales/es-ES/strings.properties
browser/extensions/activity-stream/locales/es-MX/strings.properties
browser/extensions/activity-stream/locales/et/strings.properties
browser/extensions/activity-stream/locales/eu/strings.properties
browser/extensions/activity-stream/locales/fa/strings.properties
browser/extensions/activity-stream/locales/ff/strings.properties
browser/extensions/activity-stream/locales/fi/strings.properties
browser/extensions/activity-stream/locales/fr/strings.properties
browser/extensions/activity-stream/locales/fy-NL/strings.properties
browser/extensions/activity-stream/locales/ga-IE/strings.properties
browser/extensions/activity-stream/locales/gd/strings.properties
browser/extensions/activity-stream/locales/gl/strings.properties
browser/extensions/activity-stream/locales/gn/strings.properties
browser/extensions/activity-stream/locales/gu-IN/strings.properties
browser/extensions/activity-stream/locales/he/strings.properties
browser/extensions/activity-stream/locales/hi-IN/strings.properties
browser/extensions/activity-stream/locales/hr/strings.properties
browser/extensions/activity-stream/locales/hsb/strings.properties
browser/extensions/activity-stream/locales/hu/strings.properties
browser/extensions/activity-stream/locales/hy-AM/strings.properties
browser/extensions/activity-stream/locales/ia/strings.properties
browser/extensions/activity-stream/locales/id/strings.properties
browser/extensions/activity-stream/locales/it/strings.properties
browser/extensions/activity-stream/locales/ja-JP-mac/strings.properties
browser/extensions/activity-stream/locales/ja/strings.properties
browser/extensions/activity-stream/locales/ka/strings.properties
browser/extensions/activity-stream/locales/kab/strings.properties
browser/extensions/activity-stream/locales/kk/strings.properties
browser/extensions/activity-stream/locales/km/strings.properties
browser/extensions/activity-stream/locales/kn/strings.properties
browser/extensions/activity-stream/locales/ko/strings.properties
browser/extensions/activity-stream/locales/lij/strings.properties
browser/extensions/activity-stream/locales/lo/strings.properties
browser/extensions/activity-stream/locales/lt/strings.properties
browser/extensions/activity-stream/locales/ltg/strings.properties
browser/extensions/activity-stream/locales/lv/strings.properties
browser/extensions/activity-stream/locales/mai/strings.properties
browser/extensions/activity-stream/locales/mk/strings.properties
browser/extensions/activity-stream/locales/ml/strings.properties
browser/extensions/activity-stream/locales/mr/strings.properties
browser/extensions/activity-stream/locales/ms/strings.properties
browser/extensions/activity-stream/locales/my/strings.properties
browser/extensions/activity-stream/locales/nb-NO/strings.properties
browser/extensions/activity-stream/locales/ne-NP/strings.properties
browser/extensions/activity-stream/locales/nl/strings.properties
browser/extensions/activity-stream/locales/nn-NO/strings.properties
browser/extensions/activity-stream/locales/oc/strings.properties
browser/extensions/activity-stream/locales/pa-IN/strings.properties
browser/extensions/activity-stream/locales/pl/strings.properties
browser/extensions/activity-stream/locales/pt-BR/strings.properties
browser/extensions/activity-stream/locales/pt-PT/strings.properties
browser/extensions/activity-stream/locales/rm/strings.properties
browser/extensions/activity-stream/locales/ro/strings.properties
browser/extensions/activity-stream/locales/ru/strings.properties
browser/extensions/activity-stream/locales/si/strings.properties
browser/extensions/activity-stream/locales/sk/strings.properties
browser/extensions/activity-stream/locales/sl/strings.properties
browser/extensions/activity-stream/locales/sq/strings.properties
browser/extensions/activity-stream/locales/sr/strings.properties
browser/extensions/activity-stream/locales/sv-SE/strings.properties
browser/extensions/activity-stream/locales/ta/strings.properties
browser/extensions/activity-stream/locales/te/strings.properties
browser/extensions/activity-stream/locales/th/strings.properties
browser/extensions/activity-stream/locales/tl/strings.properties
browser/extensions/activity-stream/locales/tr/strings.properties
browser/extensions/activity-stream/locales/uk/strings.properties
browser/extensions/activity-stream/locales/ur/strings.properties
browser/extensions/activity-stream/locales/uz/strings.properties
browser/extensions/activity-stream/locales/vi/strings.properties
browser/extensions/activity-stream/locales/zh-CN/strings.properties
browser/extensions/activity-stream/locales/zh-TW/strings.properties
browser/extensions/activity-stream/mochitest.sh
browser/extensions/activity-stream/moz.build
browser/extensions/activity-stream/package-lock.json
browser/extensions/activity-stream/package.json
browser/extensions/activity-stream/prerendered/locales/ach/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ach/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ach/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ach/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ach/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/an/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/an/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/an/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/an/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/an/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ar/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ar/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ar/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ar/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ar/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ast/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ast/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ast/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ast/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ast/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/az/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/az/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/az/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/az/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/az/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/be/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/be/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/be/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/be/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/be/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/bg/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/bg/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/bg/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/bg/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/bg/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/bn-BD/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/bn-BD/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/bn-BD/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/bn-BD/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/bn-BD/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/bn-IN/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/bn-IN/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/bn-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/bn-IN/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/bn-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/br/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/br/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/br/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/br/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/br/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/bs/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/bs/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/bs/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/bs/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/bs/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ca/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ca/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ca/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ca/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ca/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/cak/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/cak/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/cak/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/cak/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/cak/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/crh/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/crh/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/crh/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/crh/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/crh/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/cs/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/cs/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/cs/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/cs/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/cs/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/cy/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/cy/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/cy/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/cy/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/cy/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/da/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/da/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/da/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/da/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/da/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/de/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/de/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/de/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/de/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/de/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/dsb/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/dsb/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/dsb/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/dsb/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/dsb/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/el/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/el/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/el/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/el/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/el/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/en-CA/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/en-CA/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/en-CA/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/en-CA/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/en-CA/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/en-GB/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/en-GB/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/en-GB/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/en-GB/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/en-GB/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/en-US/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/en-US/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/en-US/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/en-US/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/en-US/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/eo/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/eo/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/eo/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/eo/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/eo/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/es-AR/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/es-AR/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/es-AR/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/es-AR/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/es-AR/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/es-CL/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/es-CL/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/es-CL/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/es-CL/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/es-CL/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/es-ES/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/es-ES/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/es-ES/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/es-ES/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/es-ES/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/es-MX/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/es-MX/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/es-MX/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/es-MX/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/es-MX/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/et/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/et/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/et/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/et/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/et/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/eu/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/eu/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/eu/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/eu/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/eu/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/fa/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/fa/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/fa/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/fa/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/fa/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ff/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ff/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ff/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ff/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ff/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/fi/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/fi/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/fi/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/fi/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/fi/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/fr/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/fr/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/fr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/fr/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/fr/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/fy-NL/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/fy-NL/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/fy-NL/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/fy-NL/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/fy-NL/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ga-IE/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ga-IE/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ga-IE/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ga-IE/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ga-IE/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/gd/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/gd/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/gd/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/gd/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/gd/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/gl/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/gl/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/gl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/gl/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/gl/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/gn/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/gn/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/gn/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/gn/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/gn/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/gu-IN/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/gu-IN/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/gu-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/gu-IN/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/gu-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/he/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/he/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/he/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/he/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/he/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/hi-IN/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/hi-IN/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/hi-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/hi-IN/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/hi-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/hr/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/hr/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/hr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/hr/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/hr/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/hsb/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/hsb/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/hsb/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/hsb/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/hsb/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/hu/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/hu/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/hu/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/hu/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/hu/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/hy-AM/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/hy-AM/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/hy-AM/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/hy-AM/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/hy-AM/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ia/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ia/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ia/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ia/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ia/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/id/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/id/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/id/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/id/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/id/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/it/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/it/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/it/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/it/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/it/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ja-JP-mac/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ja-JP-mac/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ja-JP-mac/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ja-JP-mac/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ja-JP-mac/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ja/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ja/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ja/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ja/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ja/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ka/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ka/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ka/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ka/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ka/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/kab/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/kab/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/kab/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/kab/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/kab/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/kk/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/kk/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/kk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/kk/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/kk/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/km/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/km/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/km/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/km/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/km/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/kn/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/kn/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/kn/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/kn/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/kn/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ko/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ko/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ko/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ko/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ko/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/lij/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/lij/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/lij/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/lij/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/lij/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/lo/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/lo/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/lo/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/lo/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/lo/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/lt/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/lt/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/lt/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/lt/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/lt/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ltg/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ltg/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ltg/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ltg/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ltg/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/lv/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/lv/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/lv/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/lv/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/lv/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/mai/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/mai/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/mai/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/mai/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/mai/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/mk/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/mk/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/mk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/mk/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/mk/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ml/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ml/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ml/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ml/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ml/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/mr/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/mr/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/mr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/mr/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/mr/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ms/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ms/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ms/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ms/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ms/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/my/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/my/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/my/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/my/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/my/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/nb-NO/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/nb-NO/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/nb-NO/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/nb-NO/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/nb-NO/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ne-NP/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ne-NP/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ne-NP/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ne-NP/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ne-NP/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/nl/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/nl/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/nl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/nl/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/nl/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/nn-NO/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/nn-NO/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/nn-NO/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/nn-NO/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/nn-NO/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/oc/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/oc/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/oc/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/oc/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/oc/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/pa-IN/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/pa-IN/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/pa-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/pa-IN/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/pa-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/pl/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/pl/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/pl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/pl/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/pl/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/pt-BR/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/pt-BR/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/pt-BR/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/pt-BR/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/pt-BR/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/pt-PT/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/pt-PT/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/pt-PT/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/pt-PT/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/pt-PT/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/rm/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/rm/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/rm/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/rm/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/rm/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ro/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ro/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ro/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ro/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ro/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ru/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ru/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ru/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ru/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ru/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/si/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/si/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/si/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/si/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/si/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/sk/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/sk/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/sk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/sk/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/sk/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/sl/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/sl/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/sl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/sl/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/sl/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/sq/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/sq/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/sq/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/sq/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/sq/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/sr/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/sr/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/sr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/sr/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/sr/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/sv-SE/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/sv-SE/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/sv-SE/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/sv-SE/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/sv-SE/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ta/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ta/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ta/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ta/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ta/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/te/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/te/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/te/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/te/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/te/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/th/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/th/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/th/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/th/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/th/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/tl/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/tl/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/tl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/tl/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/tl/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/tr/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/tr/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/tr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/tr/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/tr/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/uk/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/uk/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/uk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/uk/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/uk/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/ur/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ur/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/ur/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/ur/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/ur/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/uz/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/uz/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/uz/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/uz/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/uz/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/vi/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/vi/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/vi/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/vi/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/vi/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/zh-CN/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/zh-CN/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/zh-CN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/zh-CN/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/zh-CN/activity-stream.html
browser/extensions/activity-stream/prerendered/locales/zh-TW/activity-stream-noscripts.html
browser/extensions/activity-stream/prerendered/locales/zh-TW/activity-stream-prerendered-noscripts.html
browser/extensions/activity-stream/prerendered/locales/zh-TW/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/locales/zh-TW/activity-stream-strings.js
browser/extensions/activity-stream/prerendered/locales/zh-TW/activity-stream.html
browser/extensions/activity-stream/prerendered/static/activity-stream-debug-noscripts.html
browser/extensions/activity-stream/prerendered/static/activity-stream-debug.html
browser/extensions/activity-stream/prerendered/static/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/static/activity-stream-prerendered-debug-noscripts.html
browser/extensions/activity-stream/prerendered/static/activity-stream-prerendered-debug.html
browser/extensions/activity-stream/test/.eslintrc.js
browser/extensions/activity-stream/test/functional/mochitest/.eslintrc.js
browser/extensions/activity-stream/test/functional/mochitest/blue_page.html
browser/extensions/activity-stream/test/functional/mochitest/browser.ini
browser/extensions/activity-stream/test/functional/mochitest/browser_as_load_location.js
browser/extensions/activity-stream/test/functional/mochitest/browser_as_render.js
browser/extensions/activity-stream/test/functional/mochitest/browser_asrouter_targeting.js
browser/extensions/activity-stream/test/functional/mochitest/browser_getScreenshots.js
browser/extensions/activity-stream/test/functional/mochitest/browser_highlights_section.js
browser/extensions/activity-stream/test/functional/mochitest/browser_topsites_contextMenu_options.js
browser/extensions/activity-stream/test/functional/mochitest/browser_topsites_section.js
browser/extensions/activity-stream/test/functional/mochitest/head.js
browser/extensions/activity-stream/test/schemas/pings.js
browser/extensions/activity-stream/test/unit/activity-stream-prerender.test.jsx
browser/extensions/activity-stream/test/unit/asrouter/ASRouter.test.js
browser/extensions/activity-stream/test/unit/asrouter/ASRouterFeed.test.js
browser/extensions/activity-stream/test/unit/asrouter/ASRouterTargeting.test.js
browser/extensions/activity-stream/test/unit/asrouter/MessageLoaderUtils.test.js
browser/extensions/activity-stream/test/unit/asrouter/asrouter-content.test.jsx
browser/extensions/activity-stream/test/unit/asrouter/constants.js
browser/extensions/activity-stream/test/unit/asrouter/template-utils.test.js
browser/extensions/activity-stream/test/unit/asrouter/templates/SimpleSnippet.test.jsx
browser/extensions/activity-stream/test/unit/common/Actions.test.js
browser/extensions/activity-stream/test/unit/common/Dedupe.test.js
browser/extensions/activity-stream/test/unit/common/PerfService.test.js
browser/extensions/activity-stream/test/unit/common/PrerenderData.test.js
browser/extensions/activity-stream/test/unit/common/Reducers.test.js
browser/extensions/activity-stream/test/unit/content-src/components/Base.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/Card.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/CollapsibleSection.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/ComponentPerfTimer.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/ConfirmDialog.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/ContextMenu.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/ErrorBoundary.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/LinkMenu.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/ManualMigration.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/Search.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/SectionMenu.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/Sections.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/StartupOverlay.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/TopSites.test.jsx
browser/extensions/activity-stream/test/unit/content-src/components/Topics.test.jsx
browser/extensions/activity-stream/test/unit/content-src/lib/detect-user-session-start.test.js
browser/extensions/activity-stream/test/unit/content-src/lib/init-store.test.js
browser/extensions/activity-stream/test/unit/content-src/lib/screenshot-utils.test.js
browser/extensions/activity-stream/test/unit/content-src/lib/snippets.test.js
browser/extensions/activity-stream/test/unit/lib/AboutPreferences.test.js
browser/extensions/activity-stream/test/unit/lib/ActivityStream.test.js
browser/extensions/activity-stream/test/unit/lib/ActivityStreamMessageChannel.test.js
browser/extensions/activity-stream/test/unit/lib/ActivityStreamPrefs.test.js
browser/extensions/activity-stream/test/unit/lib/ActivityStreamStorage.test.js
browser/extensions/activity-stream/test/unit/lib/DownloadsManager.test.js
browser/extensions/activity-stream/test/unit/lib/FaviconFeed.test.js
browser/extensions/activity-stream/test/unit/lib/FilterAdult.test.js
browser/extensions/activity-stream/test/unit/lib/HighlightsFeed.test.js
browser/extensions/activity-stream/test/unit/lib/ManualMigration.test.js
browser/extensions/activity-stream/test/unit/lib/NewTabInit.test.js
browser/extensions/activity-stream/test/unit/lib/PersistentCache.test.js
browser/extensions/activity-stream/test/unit/lib/PlacesFeed.test.js
browser/extensions/activity-stream/test/unit/lib/PrefsFeed.test.js
browser/extensions/activity-stream/test/unit/lib/Screenshots.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/SystemTickFeed.test.js
browser/extensions/activity-stream/test/unit/lib/TelemetryFeed.test.js
browser/extensions/activity-stream/test/unit/lib/TippyTopProvider.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/lib/UTEventReporting.test.js
browser/extensions/activity-stream/test/unit/lib/UserDomainAffinityProvider.test.js
browser/extensions/activity-stream/test/unit/unit-entry.js
browser/extensions/activity-stream/test/unit/utils.js
browser/extensions/activity-stream/vendor/PROP_TYPES_LICENSE
browser/extensions/activity-stream/vendor/REACT_AND_REACT_DOM_LICENSE
browser/extensions/activity-stream/vendor/REACT_INTL_LICENSE
browser/extensions/activity-stream/vendor/REACT_REDUX_LICENSE
browser/extensions/activity-stream/vendor/REDUX_LICENSE
browser/extensions/activity-stream/vendor/Redux.jsm
browser/extensions/activity-stream/vendor/prop-types.js
browser/extensions/activity-stream/vendor/react-dev.js
browser/extensions/activity-stream/vendor/react-dom-dev.js
browser/extensions/activity-stream/vendor/react-dom.js
browser/extensions/activity-stream/vendor/react-intl.js
browser/extensions/activity-stream/vendor/react-redux.js
browser/extensions/activity-stream/vendor/react.js
browser/extensions/activity-stream/vendor/redux.js
browser/extensions/activity-stream/webpack.prerender.config.js
browser/extensions/activity-stream/webpack.system-addon.config.js
browser/extensions/activity-stream/yamscripts.yml
browser/extensions/moz.build
dom/interfaces/base/nsIIdleObserver.idl
python/mozbuild/mozbuild/test/codecoverage/test_lcov_rewrite.py
testing/runtimes/mochitest-browser-chrome-e10s.runtimes.json
testing/runtimes/mochitest-browser-chrome.runtimes.json
toolkit/content/license.html
tools/lint/codespell.yml
--- a/.eslintignore
+++ b/.eslintignore
@@ -85,17 +85,17 @@ browser/components/translation/cld2/**
 browser/extensions/followonsearch/**
 browser/extensions/screenshots/**
 browser/extensions/pdfjs/content/build**
 browser/extensions/pdfjs/content/web**
 # generated or library files in pocket
 browser/extensions/pocket/content/panels/js/tmpl.js
 browser/extensions/pocket/content/panels/js/vendor/**
 # Activity Stream has incompatible eslintrc. `npm run lint` from its directory
-browser/extensions/activity-stream/**
+browser/components/newtab/**
 # The only file in browser/locales/ is pre-processed.
 browser/locales/**
 # imported from chromium
 browser/extensions/mortar/**
 # Generated data files
 browser/extensions/formautofill/phonenumberutils/PhoneNumberMetaData.jsm
 
 # devtools/ exclusions
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,9 +17,9 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
-Bug 1371485 - Moving gyp requires a clobber.
+Bug 1474414 - Moving Activity Stream out of system-addon requires a clobber.
--- a/Makefile.in
+++ b/Makefile.in
@@ -264,26 +264,23 @@ ifndef MOZ_AUTOMATION
 prepsymbolsarchive: recurse_syms
 endif
 
 .PHONY: symbolsfullarchive
 symbolsfullarchive: prepsymbolsarchive
 	$(RM) '$(DIST)/$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip'
 	$(call py_action,symbols_archive,'$(DIST)/$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip' \
                                      $(abspath $(DIST)/crashreporter-symbols) \
-                                     --exclude '*test*' \
-                                     --exclude '*Test*' \
-                                     --compress '**/*.sym')
+                                     --full-archive)
 
 .PHONY: symbolsarchive
 symbolsarchive: prepsymbolsarchive
 	$(RM) '$(DIST)/$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip'
 	$(call py_action,symbols_archive,'$(DIST)/$(PKG_PATH)$(SYMBOL_ARCHIVE_BASENAME).zip' \
-                                     $(abspath $(DIST)/crashreporter-symbols) \
-                                     --include '**/*.sym')
+                                     $(abspath $(DIST)/crashreporter-symbols))
 
 ifdef MOZ_CRASHREPORTER
 buildsymbols: symbolsfullarchive symbolsarchive
 else
 buildsymbols:
 endif
 
 uploadsymbols:
--- a/browser/base/content/test/performance/browser_preferences_usage.js
+++ b/browser/base/content/test/performance/browser_preferences_usage.js
@@ -88,17 +88,17 @@ add_task(async function startup() {
     "layout.css.dpi": {
       min: 45,
       max: 75,
     },
     "network.loadinfo.skip_type_assertion": {
       max: 650,
     },
     "extensions.getAddons.cache.enabled": {
-      min: 9,
+      min: 8,
       max: 55,
     },
   };
 
   let startupRecorder = Cc["@mozilla.org/test/startuprecorder;1"].getService().wrappedJSObject;
   await startupRecorder.done;
 
   ok(startupRecorder.data.prefStats, "startupRecorder has prefStats");
--- a/browser/base/content/test/tabs/browser_isLocalAboutURI.js
+++ b/browser/base/content/test/tabs/browser_isLocalAboutURI.js
@@ -28,17 +28,17 @@ add_task(function test_URI() {
 
 add_task(function test_URI_with_resolved() {
   const check = (spec, resolvedSpec, expect, description) => {
     const URI = Services.io.newURI(spec);
     const resolvedURI = Services.io.newURI(resolvedSpec);
     is(gBrowser._isLocalAboutURI(URI, resolvedURI), expect, description);
   };
   check("about:newtab",
-    "jar:file:///Applications/Firefox.app/Contents/Resources/browser/features/activity-stream@mozilla.org.xpi!/chrome/content/data/content/activity-stream.html",
+    "jar:file:///Applications/Firefox.app/Contents/Resources/browser/omni.ja!/chrome/browser/res/activity-stream/prerendered/en-US/activity-stream.html",
     true,
     "about:newtab with jar is local");
   check("about:newtab",
     "file:///mozilla-central/browser/base/content/newtab/newTab.xhtml",
     true,
     "about:newtab with file is local");
   check("about:newtab",
     "https://www.mozilla.org/newtab",
rename from browser/extensions/activity-stream/.eslintignore
rename to browser/components/newtab/.eslintignore
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/.eslintrc.js
@@ -0,0 +1,235 @@
+module.exports = {
+  // When adding items to this file please check for effects on sub-directories.
+  "parserOptions": {
+    "ecmaFeatures": {
+      "jsx": true
+    },
+    "sourceType": "module"
+  },
+  "env": {
+    "node": true
+  },
+  "plugins": [
+    "import", // require("eslint-plugin-import")
+    "json", // require("eslint-plugin-json")
+    "promise", // require("eslint-plugin-promise")
+    "react" // require("eslint-plugin-react")
+  ],
+  "extends": [
+    "eslint:recommended",
+    "plugin:mozilla/recommended" // require("eslint-plugin-mozilla")
+  ],
+  "globals": {
+    // Remove this when m-c updates their eslint: See https://github.com/mozilla/activity-stream/pull/4219
+    "RPMSendAsyncMessage": true
+  },
+  "overrides": [{
+    // Use a configuration that's more appropriate for JSMs
+    "files": "**/*.jsm",
+    "parserOptions": {
+      "sourceType": "script"
+    },
+    "env": {
+      "node": false
+    },
+    "rules": {
+      "no-implicit-globals": 0
+    }
+  }],
+  "rules": {
+    "promise/catch-or-return": 2,
+    "promise/param-names": 2,
+
+    "react/jsx-boolean-value": [2, "always"],
+    "react/jsx-closing-bracket-location": [2, "after-props"],
+    "react/jsx-curly-spacing": [2, "never"],
+    "react/jsx-equals-spacing": [2, "never"],
+    "react/jsx-key": 2,
+    "react/jsx-no-bind": 2,
+    "react/jsx-no-comment-textnodes": 2,
+    "react/jsx-no-duplicate-props": 2,
+    "react/jsx-no-target-blank": 2,
+    "react/jsx-no-undef": 2,
+    "react/jsx-pascal-case": 2,
+    "react/jsx-space-before-closing": [2, "always"],
+    "react/jsx-uses-react": 2,
+    "react/jsx-uses-vars": 2,
+    "react/jsx-wrap-multilines": 2,
+    "react/no-access-state-in-setstate": 2,
+    "react/no-danger": 2,
+    "react/no-deprecated": 2,
+    "react/no-did-mount-set-state": 2,
+    "react/no-did-update-set-state": 2,
+    "react/no-direct-mutation-state": 2,
+    "react/no-is-mounted": 2,
+    "react/no-unknown-property": 2,
+    "react/require-render-return": 2,
+    "react/self-closing-comp": 2,
+
+    "accessor-pairs": [2, {"setWithoutGet": true, "getWithoutSet": false}],
+    "array-bracket-newline": [2, "consistent"],
+    "array-bracket-spacing": [2, "never"],
+    "array-callback-return": 2,
+    "array-element-newline": 0,
+    "arrow-body-style": [2, "as-needed"],
+    "arrow-parens": [2, "as-needed"],
+    "block-scoped-var": 2,
+    "callback-return": 0,
+    "camelcase": 0,
+    "capitalized-comments": 0,
+    "class-methods-use-this": 0,
+    "comma-dangle": [2, "never"],
+    "consistent-this": [2, "use-bind"],
+    "curly": [2, "all"],
+    "default-case": 0,
+    "dot-location": [2, "property"],
+    "eqeqeq": 2,
+    "for-direction": 2,
+    "func-name-matching": 2,
+    "func-names": 0,
+    "func-style": 0,
+    "function-paren-newline": 0,
+    "getter-return": 2,
+    "global-require": 0,
+    "guard-for-in": 2,
+    "handle-callback-err": 2,
+    "id-blacklist": 0,
+    "id-length": 0,
+    "id-match": 0,
+    "implicit-arrow-linebreak": 0,
+    // XXX Switch back to indent once mozilla-central has decided what it is using.
+    "indent": 0,
+    "indent-legacy": ["error", 2, {"SwitchCase": 1}],
+    "init-declarations": 0,
+    "jsx-quotes": [2, "prefer-double"],
+    "line-comment-position": 0,
+    "lines-around-comment": ["error", {
+      "allowClassStart": true,
+      "allowObjectStart": true,
+      "beforeBlockComment": true
+    }],
+    "lines-between-class-members": 2,
+    "max-depth": [2, 4],
+    "max-len": 0,
+    "max-lines": 0,
+    "max-nested-callbacks": [2, 4],
+    "max-params": [2, 6],
+    "max-statements": [2, 50],
+    "max-statements-per-line": [2, {"max": 2}],
+    "multiline-comment-style": 0,
+    "multiline-ternary": 0,
+    "new-cap": [2, {"newIsCap": true, "capIsNew": false}],
+    "new-parens": 2,
+    "newline-after-var": 0,
+    "newline-before-return": 0,
+    "newline-per-chained-call": [2, {"ignoreChainWithDepth": 3}],
+    "no-alert": 2,
+    "no-await-in-loop": 0,
+    "no-bitwise": 0,
+    "no-buffer-constructor": 2,
+    "no-catch-shadow": 2,
+    "no-confusing-arrow": [2, {"allowParens": true}],
+    "no-console": 1,
+    "no-continue": 0,
+    "no-div-regex": 2,
+    "no-duplicate-imports": 2,
+    "no-empty-function": 0,
+    "no-eq-null": 2,
+    "no-extend-native": 2,
+    "no-extra-label": 2,
+    "no-extra-parens": 0,
+    "no-floating-decimal": 2,
+    "no-implicit-coercion": [2, {"allow": ["!!"]}],
+    "no-implicit-globals": 2,
+    "no-inline-comments": 0,
+    "no-invalid-this": 0,
+    "no-label-var": 2,
+    "no-loop-func": 2,
+    "no-magic-numbers": 0,
+    "no-mixed-operators": [2, {"allowSamePrecedence": true, "groups": [["&", "|", "^", "~", "<<", ">>", ">>>"], ["==", "!=", "===", "!==", ">", ">=", "<", "<="], ["&&", "||"], ["in", "instanceof"]]}],
+    "no-mixed-requires": 2,
+    "no-multi-assign": 2,
+    "no-multi-str": 2,
+    "no-multiple-empty-lines": [2, {"max": 1, "maxBOF": 0, "maxEOF": 0}],
+    "no-negated-condition": 0,
+    "no-negated-in-lhs": 2,
+    "no-new": 2,
+    "no-new-func": 2,
+    "no-new-require": 2,
+    "no-octal-escape": 2,
+    "no-param-reassign": 2,
+    "no-path-concat": 2,
+    "no-plusplus": 0,
+    "no-process-env": 0,
+    "no-process-exit": 2,
+    "no-proto": 2,
+    "no-prototype-builtins": 2,
+    "no-restricted-globals": 0,
+    "no-restricted-imports": 0,
+    "no-restricted-modules": 0,
+    "no-restricted-properties": 0,
+    "no-restricted-syntax": 0,
+    "no-return-assign": [2, "except-parens"],
+    "no-script-url": 2,
+    "no-sequences": 2,
+    "no-shadow": 2,
+    "no-spaced-func": 2,
+    "no-sync": 0,
+    "no-template-curly-in-string": 2,
+    "no-ternary": 0,
+    "no-throw-literal": 2,
+    "no-undef-init": 2,
+    "no-undefined": 0,
+    "no-underscore-dangle": 0,
+    "no-unmodified-loop-condition": 2,
+    "no-unused-expressions": 2,
+    "no-use-before-define": 2,
+    "no-useless-computed-key": 2,
+    "no-useless-constructor": 2,
+    "no-useless-rename": 2,
+    "no-var": 2,
+    "no-void": 2,
+    "no-warning-comments": 0, // TODO: Change to `1`?
+    "nonblock-statement-body-position": 2,
+    "object-curly-newline": [2, {"multiline": true}],
+    "object-curly-spacing": [2, "never"],
+    "object-property-newline": [2, {"allowMultiplePropertiesPerLine": true}],
+    "one-var": [2, "never"],
+    "one-var-declaration-per-line": [2, "initializations"],
+    "operator-assignment": [2, "always"],
+    "operator-linebreak": [2, "after"],
+    "padded-blocks": [2, "never"],
+    "padding-line-between-statements": 0,
+    "prefer-arrow-callback": ["error", {"allowNamedFunctions": true}],
+    "prefer-const": 0, // TODO: Change to `1`?
+    "prefer-destructuring": [2, {"AssignmentExpression": {"array": true}, "VariableDeclarator": {"array": true, "object": true}}],
+    "prefer-numeric-literals": 2,
+    "prefer-promise-reject-errors": 2,
+    "prefer-reflect": 0,
+    "prefer-rest-params": 2,
+    "prefer-spread": 2,
+    "prefer-template": 2,
+    "quote-props": [2, "consistent"],
+    "radix": [2, "always"],
+    "require-await": 2,
+    "require-jsdoc": 0,
+    "semi-spacing": [2, {"before": false, "after": true}],
+    "semi-style": 2,
+    "sort-imports": [2, {"ignoreCase": true}],
+    "sort-keys": 0,
+    "sort-vars": 2,
+    "space-in-parens": [2, "never"],
+    "strict": 0,
+    "switch-colon-spacing": 2,
+    "symbol-description": 2,
+    "template-curly-spacing": [2, "never"],
+    "template-tag-spacing": 2,
+    "unicode-bom": [2, "never"],
+    "valid-jsdoc": [0, {"requireReturn": false, "requireParamDescription": false, "requireReturnDescription": false}],
+    "vars-on-top": 2,
+    "wrap-iife": [2, "inside"],
+    "wrap-regex": 0,
+    "yield-star-spacing": [2, "after"],
+    "yoda": [2, "never"]
+  }
+};
rename from browser/extensions/activity-stream/.mcignore
rename to browser/components/newtab/.mcignore
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/.nvmrc
@@ -0,0 +1,1 @@
+8.*
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/.sass-lint.yml
@@ -0,0 +1,26 @@
+options:
+  merge-default-rules: true
+  max-warnings: 0
+
+files:
+  include: 'content-src/**/*.scss'
+
+rules:
+  class-name-format: 0
+  extends-before-declarations: 2
+  extends-before-mixins: 2
+  force-element-nesting: 0
+  force-pseudo-nesting: 0
+  hex-notation: [2, {style: uppercase}]
+  indentation: [2, {size: 2}]
+  leading-zero: [2, {include: true}]
+  mixins-before-declarations: [2, {exclude: [breakpoint, mq]}]
+  nesting-depth: [2, {max-depth: 4}]
+  no-debug: 1
+  no-duplicate-properties: 2
+  no-misspelled-properties: [2, {extra-properties: [-moz-context-properties]}]
+  no-url-domains: 0
+  no-vendor-prefixes: 0
+  no-warn: 1
+  placeholder-in-extend: 2
+  property-sort-order: 0
rename from browser/extensions/activity-stream/.taskcluster.yml
rename to browser/components/newtab/.taskcluster.yml
rename from browser/extensions/activity-stream/.travis.yml
rename to browser/components/newtab/.travis.yml
rename from browser/extensions/activity-stream/CODEOWNERS
rename to browser/components/newtab/CODEOWNERS
rename from browser/extensions/activity-stream/LICENSE
rename to browser/components/newtab/LICENSE
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/README.md
@@ -0,0 +1,24 @@
+# activity-stream
+
+[![Task Status](https://github.taskcluster.net/v1/repository/mozilla/activity-stream/master/badge.svg)](https://github.taskcluster.net/v1/repository/mozilla/activity-stream/master/latest)
+
+This system add-on replaces the new tab page in Firefox with a new design and
+functionality as part of the Activity Stream project.
+
+The files in this directory, including vendor dependencies, are imported from the
+system-addon directory in https://github.com/mozilla/activity-stream.
+
+Read [docs/v2-system-addon](https://github.com/mozilla/activity-stream/tree/master/docs/v2-system-addon/1.GETTING_STARTED.md) for more detail.
+
+## Where should I file bugs?
+
+We regularly check the ActivityStream:NewTab component on Bugzilla.
+
+## For Developers
+
+If you are interested in contributing, take a look at [this guide](contributing.md) on where to find us and how to contribute,
+and [this guide](docs/v2-system-addon/1.GETTING_STARTED.md) for getting your development environment set up.
+
+## For Localizers
+
+Activity Stream localization is managed via [Pontoon](https://pontoon.mozilla.org/projects/activity-stream-new-tab/), not direct pull requests to the repository. If you want to fix a typo, add a new language, or simply know more about localization, please get in touch with the [existing localization team](https://pontoon.mozilla.org/teams/) for your language, or Mozilla’s [l10n-drivers](https://wiki.mozilla.org/L10n:Mozilla_Team#Mozilla_Corporation) for guidance.
rename from browser/extensions/activity-stream/bin/download-firefox-artifact
rename to browser/components/newtab/bin/download-firefox-artifact
rename from browser/extensions/activity-stream/bin/download-firefox-travis.sh
rename to browser/components/newtab/bin/download-firefox-travis.sh
rename from browser/extensions/activity-stream/bin/locales.js
rename to browser/components/newtab/bin/locales.js
rename from browser/extensions/activity-stream/bin/prepare-mochitests-dev
rename to browser/components/newtab/bin/prepare-mochitests-dev
rename from browser/extensions/activity-stream/bin/process-system-addon-for-package.js
rename to browser/components/newtab/bin/process-system-addon-for-package.js
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/bin/render-activity-stream-html.js
@@ -0,0 +1,252 @@
+ /* eslint-disable no-console */
+const fs = require("fs");
+const {mkdir} = require("shelljs");
+const path = require("path");
+
+// Note: this file is generated by webpack from content-src/activity-stream-prerender.jsx
+const {prerender} = require("./prerender");
+
+const {CENTRAL_LOCALES, DEFAULT_LOCALE} = require("./locales");
+
+// Note: DEFAULT_OPTIONS.baseUrl should match BASE_URL in aboutNewTabService.js
+//       in mozilla-central.
+const DEFAULT_OPTIONS = {
+  addonPath: "..",
+  baseUrl: "resource://activity-stream/"
+};
+
+// Locales that should be displayed RTL
+const RTL_LIST = ["ar", "he", "fa", "ur"];
+
+/**
+ * Get the language part of the locale.
+ */
+function getLanguage(locale) {
+  return locale.split("-")[0];
+}
+
+/**
+ * Get the best strings for a single provided locale using similar locales and
+ * DEFAULT_LOCALE as fallbacks.
+ */
+function getStrings(locale, allStrings) {
+  const availableLocales = Object.keys(allStrings);
+
+  const language = getLanguage(locale);
+  const similarLocales = availableLocales.filter(other =>
+    other !== locale && getLanguage(other) === language);
+
+  // Rank locales from least desired to most desired
+  const localeFallbacks = [DEFAULT_LOCALE, ...similarLocales, locale];
+
+  // Get strings from each locale replacing with those from more desired ones
+  return Object.assign({}, ...localeFallbacks.map(l => allStrings[l]));
+}
+
+/**
+ * Get the text direction of the locale.
+ */
+function getTextDirection(locale) {
+  return RTL_LIST.includes(locale.split("-")[0]) ? "rtl" : "ltr";
+}
+
+/**
+ * templateHTML - Generates HTML for activity stream, given some options and
+ * prerendered HTML if necessary.
+ *
+ * @param  {obj} options
+ *         {str} options.locale         The locale to render in lang="" attribute
+ *         {str} options.direction      The language direction to render in dir="" attribute
+ *         {str} options.baseUrl        The base URL for all local assets
+ *         {bool} options.debug         Should we use dev versions of JS libraries?
+ *         {bool} options.noscripts     Should we include scripts in the prerendered files?
+ * @param  {str} html    The prerendered HTML created with React.renderToString (optional)
+ * @return {str}         An HTML document as a string
+ */
+function templateHTML(options, html) {
+  const isPrerendered = !!html;
+  const debugString = options.debug ? "-dev" : "";
+  const scripts = [
+    "chrome://browser/content/contentSearchUI.js",
+    "chrome://browser/content/contentTheme.js",
+    `${options.baseUrl}vendor/react${debugString}.js`,
+    `${options.baseUrl}vendor/react-dom${debugString}.js`,
+    `${options.baseUrl}vendor/prop-types.js`,
+    `${options.baseUrl}vendor/react-intl.js`,
+    `${options.baseUrl}vendor/redux.js`,
+    `${options.baseUrl}vendor/react-redux.js`,
+    `${options.baseUrl}prerendered/${options.locale}/activity-stream-strings.js`,
+    `${options.baseUrl}data/content/activity-stream.bundle.js`
+  ];
+  if (isPrerendered) {
+    scripts.unshift(`${options.baseUrl}prerendered/static/activity-stream-initial-state.js`);
+  }
+  const scriptTag = `
+    <script>
+// Don't directly load the following scripts as part of html to let the page
+// finish loading to render the content sooner.
+for (const src of ${JSON.stringify(scripts, null, 2)}) {
+  // These dynamically inserted scripts by default are async, but we need them
+  // to load in the desired order (i.e., bundle last).
+  const script = document.body.appendChild(document.createElement("script"));
+  script.async = false;
+  script.src = src;
+}
+    </script>`;
+  return `<!doctype html>
+<html lang="${options.locale}" dir="${options.direction}">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
+    <title>${options.strings.newtab_page_title}</title>
+    <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
+    <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
+    <link rel="stylesheet" href="${options.baseUrl}css/activity-stream.css" />
+  </head>
+  <body class="activity-stream">
+    <div id="root">${isPrerendered ? html : ""}</div>
+    <div id="snippets-container">
+      <div id="snippets"></div>
+    </div>${options.noscripts ? "" : scriptTag}
+  </body>
+</html>
+`;
+}
+
+/**
+ * templateJs - Generates a js file that passes the initial state of the prerendered
+ * DOM to the React version. This is necessary to ensure the checksum matches when
+ * React mounts so that it can attach to the prerendered elements instead of blowing
+ * them away.
+ *
+ * Note that this may no longer be necessary in React 16 and we should review whether
+ * it is still necessary.
+ *
+ * @param  {string} name The name of the global to expose
+ * @param  {string} desc Extra description to include in a js comment
+ * @param  {obj}   state The data to expose as a window global
+ * @return {str}         The js file as a string
+ */
+function templateJs(name, desc, state) {
+  return `// Note - this is a generated ${desc} file.
+window.${name} = ${JSON.stringify(state, null, 2)};
+`;
+}
+
+/**
+ * writeFiles - Writes to the desired files the result of a template given
+ * various prerendered data and options.
+ *
+ * @param {string} name          Something to identify in the console
+ * @param {string} destPath      Path to write the files to
+ * @param {Map}    filesMap      Mapping of a string file name to templater
+ * @param {Object} prerenderData Contains the html and state
+ * @param {Object} options       Various options for the templater
+ */
+function writeFiles(name, destPath, filesMap, {html, state}, options) {
+  for (const [file, templater] of filesMap) {
+    fs.writeFileSync(path.join(destPath, file), templater({html, options, state}));
+  }
+  console.log("\x1b[32m", `✓ ${name}`, "\x1b[0m");
+}
+
+const STATIC_FILES = new Map([
+  ["activity-stream-debug.html", ({options}) => templateHTML(options)],
+  ["activity-stream-debug-noscripts.html", ({options}) => templateHTML(Object.assign({}, options, {noscripts: true}))],
+  ["activity-stream-initial-state.js", ({state}) => templateJs("gActivityStreamPrerenderedState", "static", state)],
+  ["activity-stream-prerendered-debug.html", ({html, options}) => templateHTML(options, html)],
+  ["activity-stream-prerendered-debug-noscripts.html", ({html, options}) => templateHTML(Object.assign({}, options, {noscripts: true}), html)]
+]);
+
+const LOCALIZED_FILES = new Map([
+  ["activity-stream-prerendered.html", ({html, options}) => templateHTML(options, html)],
+  ["activity-stream-prerendered-noscripts.html", ({html, options}) => templateHTML(Object.assign({}, options, {noscripts: true}), html)],
+  ["activity-stream-strings.js", ({options: {locale, strings}}) => templateJs("gActivityStreamStrings", locale, strings)],
+  ["activity-stream.html", ({options}) => templateHTML(options)],
+  ["activity-stream-noscripts.html", ({options}) => templateHTML(Object.assign({}, options, {noscripts: true}))]
+]);
+
+/**
+ * main - Parses command line arguments, generates html and js with templates,
+ *        and writes files to their specified locations.
+ */
+function main() { // eslint-disable-line max-statements
+  // This code parses command line arguments passed to this script.
+  // Note: process.argv.slice(2) is necessary because the first two items in
+  // process.argv are paths
+  const args = require("minimist")(process.argv.slice(2), {
+    alias: {
+      addonPath: "a",
+      baseUrl: "b"
+    }
+  });
+
+  const baseOptions = Object.assign({debug: false}, DEFAULT_OPTIONS, args || {});
+  const addonPath = path.resolve(__dirname, baseOptions.addonPath);
+  const allStrings = require(`${baseOptions.addonPath}/data/locales.json`);
+  const extraLocales = Object.keys(allStrings).filter(locale =>
+    locale !== DEFAULT_LOCALE && !CENTRAL_LOCALES.includes(locale));
+
+  const prerenderedPath = path.join(addonPath, "prerendered");
+  console.log(`Writing prerendered files to individual directories under ${prerenderedPath}:`);
+
+  // Save default locale's strings to compare against other locales' strings
+  let defaultStrings;
+  let langStrings;
+  const isSubset = (strings, existing) => existing &&
+    Object.keys(strings).every(key => strings[key] === existing[key]);
+
+  // Process the default locale first then all the ones from mozilla-central
+  const localizedLocales = [];
+  const skippedLocales = [];
+  for (const locale of [DEFAULT_LOCALE, ...CENTRAL_LOCALES]) {
+    // Skip the locale if it would have resulted in duplicate packaged files
+    const strings = getStrings(locale, allStrings);
+    if (isSubset(strings, defaultStrings) || isSubset(strings, langStrings)) {
+      skippedLocales.push(locale);
+      continue;
+    }
+
+    const prerenderData  = prerender(locale, strings);
+    const options = Object.assign({}, baseOptions, {
+      direction: getTextDirection(locale),
+      locale,
+      strings
+    });
+
+    // Put locale-specific files in their own directory
+    const localePath = path.join(prerenderedPath, "locales", locale);
+    mkdir("-p", localePath);
+    writeFiles(locale, localePath, LOCALIZED_FILES, prerenderData, options);
+
+    // Only write static files once for the default locale
+    if (locale === DEFAULT_LOCALE) {
+      const staticPath = path.join(prerenderedPath, "static");
+      mkdir("-p", staticPath);
+      writeFiles(`${locale} (static)`, staticPath, STATIC_FILES, prerenderData,
+        Object.assign({}, options, {debug: true}));
+
+      // Save the default strings to compare against other locales' strings
+      defaultStrings = strings;
+    }
+
+    // Save the language's strings to maybe reuse for the next similar locales
+    if (getLanguage(locale) === locale) {
+      langStrings = strings;
+    }
+
+    localizedLocales.push(locale);
+  }
+
+  if (skippedLocales.length) {
+    console.log("\x1b[33m", `Skipped the following locales because they use the same strings as ${DEFAULT_LOCALE} or its language locale: ${skippedLocales.join(", ")}`, "\x1b[0m");
+  }
+  if (extraLocales.length) {
+    console.log("\x1b[33m", `Skipped the following locales because they are not in CENTRAL_LOCALES: ${extraLocales.join(", ")}`, "\x1b[0m");
+  }
+
+  // Provide some help to copy/paste locales if tests are failing
+  console.log(`\nIf aboutNewTabService tests are failing for unexpected locales, make sure its list is updated:\nconst ACTIVITY_STREAM_LOCALES = "${localizedLocales.join(" ")}".split(" ");`);
+}
+
+main();
new file mode 100755
--- /dev/null
+++ b/browser/components/newtab/bin/strings-import.js
@@ -0,0 +1,88 @@
+#! /usr/bin/env node
+"use strict";
+
+/* eslint-disable no-console */
+const fetch = require("node-fetch");
+
+/* globals cd, ls, mkdir, rm, ShellString */
+require("shelljs/global");
+
+const {CENTRAL_LOCALES, DEFAULT_LOCALE} = require("./locales");
+const L10N_CENTRAL = "https://hg.mozilla.org/l10n-central";
+const PROPERTIES_PATH = "raw-file/default/browser/chrome/browser/activity-stream/newtab.properties";
+const STRINGS_FILE = "strings.properties";
+
+// Get all the locales in l10n-central
+async function getLocales() {
+  console.log(`Getting locales from ${L10N_CENTRAL}`);
+
+  // Add sub repository locales that mozilla-central builds
+  const locales = [];
+  const unbuilt = [];
+  const subrepos = await (await fetch(`${L10N_CENTRAL}?style=json`)).json();
+  subrepos.entries.forEach(({name}) => {
+    if (CENTRAL_LOCALES.includes(name)) {
+      locales.push(name);
+    } else {
+      unbuilt.push(name);
+    }
+  });
+
+  console.log(`Got ${locales.length} mozilla-central locales: ${locales}`);
+  console.log(`Skipped ${unbuilt.length} unbuilt locales: ${unbuilt}`);
+
+  return locales;
+}
+
+// Save the properties file to the locale's directory
+async function saveProperties(locale) {
+  // Only save a file if the repository has the file
+  const url = `${L10N_CENTRAL}/${locale}/${PROPERTIES_PATH}`;
+  const response = await fetch(url);
+  if (!response.ok) {
+    // Indicate that this locale didn't save
+    return locale;
+  }
+
+  // Save the file to the right place
+  const text = await response.text();
+  mkdir(locale);
+  cd(locale);
+  ShellString(text).to(STRINGS_FILE);
+  cd("..");
+
+  // Indicate that we were successful in saving
+  return "";
+}
+
+// Replace and update each locale's strings
+async function updateLocales() {
+  console.log("Switching to and deleting existing l10n tree under: locales");
+
+  cd("locales");
+  ls().forEach(dir => {
+    // Keep the default/source locale as it might have newer strings
+    if (dir !== DEFAULT_LOCALE) {
+      rm("-r", dir);
+    }
+  });
+
+  // Save the properties file for each locale one at a time to avoid too many
+  // parallel connections (resulting in ECONNRESET / socket hang up)
+  const missing = [];
+  for (const locale of await getLocales()) {
+    process.stdout.write(`${locale} `);
+    if (await saveProperties(locale)) {
+      missing.push(locale);
+    }
+  }
+
+  console.log("");
+  console.log(`Skipped ${missing.length} locales without strings: ${missing.sort()}`);
+
+  console.log(`
+Please check the diffs, add/remove files, and then commit the result. Suggested commit message:
+chore(l10n): Update from l10n-central ${new Date()}`);
+}
+
+updateLocales().catch(console.error);
rename from browser/extensions/activity-stream/bin/test-merges.js
rename to browser/components/newtab/bin/test-merges.js
rename from browser/extensions/activity-stream/bin/update-version.js
rename to browser/components/newtab/bin/update-version.js
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/common/Actions.jsm
@@ -0,0 +1,398 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+this.MAIN_MESSAGE_TYPE = "ActivityStream:Main";
+this.CONTENT_MESSAGE_TYPE = "ActivityStream:Content";
+this.PRELOAD_MESSAGE_TYPE = "ActivityStream:PreloadedBrowser";
+this.UI_CODE = 1;
+this.BACKGROUND_PROCESS = 2;
+
+/**
+ * globalImportContext - Are we in UI code (i.e. react, a dom) or some kind of background process?
+ *                       Use this in action creators if you need different logic
+ *                       for ui/background processes.
+ */
+const globalImportContext = typeof Window === "undefined" ? BACKGROUND_PROCESS : UI_CODE;
+// Export for tests
+this.globalImportContext = globalImportContext;
+
+// Create an object that avoids accidental differing key/value pairs:
+// {
+//   INIT: "INIT",
+//   UNINIT: "UNINIT"
+// }
+const actionTypes = {};
+for (const type of [
+  "ADDONS_INFO_REQUEST",
+  "ADDONS_INFO_RESPONSE",
+  "ARCHIVE_FROM_POCKET",
+  "AS_ROUTER_TELEMETRY_USER_EVENT",
+  "BLOCK_URL",
+  "BOOKMARK_URL",
+  "COPY_DOWNLOAD_LINK",
+  "DELETE_BOOKMARK_BY_ID",
+  "DELETE_FROM_POCKET",
+  "DELETE_HISTORY_URL",
+  "DIALOG_CANCEL",
+  "DIALOG_OPEN",
+  "DISABLE_ONBOARDING",
+  "DOWNLOAD_CHANGED",
+  "INIT",
+  "MIGRATION_CANCEL",
+  "MIGRATION_COMPLETED",
+  "MIGRATION_START",
+  "NEW_TAB_INIT",
+  "NEW_TAB_INITIAL_STATE",
+  "NEW_TAB_LOAD",
+  "NEW_TAB_REHYDRATED",
+  "NEW_TAB_STATE_REQUEST",
+  "NEW_TAB_UNLOAD",
+  "OPEN_DOWNLOAD_FILE",
+  "OPEN_LINK",
+  "OPEN_NEW_WINDOW",
+  "OPEN_PRIVATE_WINDOW",
+  "OPEN_WEBEXT_SETTINGS",
+  "PAGE_PRERENDERED",
+  "PLACES_BOOKMARK_ADDED",
+  "PLACES_BOOKMARK_REMOVED",
+  "PLACES_HISTORY_CLEARED",
+  "PLACES_LINKS_CHANGED",
+  "PLACES_LINK_BLOCKED",
+  "PLACES_LINK_DELETED",
+  "PLACES_SAVED_TO_POCKET",
+  "PREFS_INITIAL_VALUES",
+  "PREF_CHANGED",
+  "PREVIEW_REQUEST",
+  "PREVIEW_REQUEST_CANCEL",
+  "PREVIEW_RESPONSE",
+  "REMOVE_DOWNLOAD_FILE",
+  "RICH_ICON_MISSING",
+  "SAVE_SESSION_PERF_DATA",
+  "SAVE_TO_POCKET",
+  "SCREENSHOT_UPDATED",
+  "SECTION_DEREGISTER",
+  "SECTION_DISABLE",
+  "SECTION_ENABLE",
+  "SECTION_MOVE",
+  "SECTION_OPTIONS_CHANGED",
+  "SECTION_REGISTER",
+  "SECTION_UPDATE",
+  "SECTION_UPDATE_CARD",
+  "SETTINGS_CLOSE",
+  "SETTINGS_OPEN",
+  "SET_PREF",
+  "SHOW_DOWNLOAD_FILE",
+  "SHOW_FIREFOX_ACCOUNTS",
+  "SKIPPED_SIGNIN",
+  "SNIPPETS_BLOCKLIST_CLEARED",
+  "SNIPPETS_BLOCKLIST_UPDATED",
+  "SNIPPETS_DATA",
+  "SNIPPETS_RESET",
+  "SNIPPET_BLOCKED",
+  "SUBMIT_EMAIL",
+  "SYSTEM_TICK",
+  "TELEMETRY_IMPRESSION_STATS",
+  "TELEMETRY_PERFORMANCE_EVENT",
+  "TELEMETRY_UNDESIRED_EVENT",
+  "TELEMETRY_USER_EVENT",
+  "TOP_SITES_CANCEL_EDIT",
+  "TOP_SITES_EDIT",
+  "TOP_SITES_INSERT",
+  "TOP_SITES_PIN",
+  "TOP_SITES_PREFS_UPDATED",
+  "TOP_SITES_UNPIN",
+  "TOP_SITES_UPDATED",
+  "TOTAL_BOOKMARKS_REQUEST",
+  "TOTAL_BOOKMARKS_RESPONSE",
+  "UNINIT",
+  "UPDATE_SECTION_PREFS",
+  "WEBEXT_CLICK",
+  "WEBEXT_DISMISS"
+]) {
+  actionTypes[type] = type;
+}
+
+// These are acceptable actions for AS Router messages to have. They can show up
+// as call-to-action buttons in snippets, onboarding tour, etc.
+const ASRouterActions = {};
+for (const type of [
+  "OPEN_PRIVATE_BROWSER_WINDOW",
+  "OPEN_URL",
+  "OPEN_ABOUT_PAGE"
+]) {
+  ASRouterActions[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 ? {...action.meta} : {};
+  if (!options || !options.from || !options.to) {
+    throw new Error("Routed Messages must have options as the second parameter, and must at least include a .from and .to property.");
+  }
+  // For each of these fields, if they are passed as an option,
+  // add them to the action. If they are not defined, remove them.
+  ["from", "to", "toTarget", "fromTarget", "skipMain", "skipLocal"].forEach(o => {
+    if (typeof options[o] !== "undefined") {
+      meta[o] = options[o];
+    } else if (meta[o]) {
+      delete meta[o];
+    }
+  });
+  return {...action, meta};
+}
+
+/**
+ * AlsoToMain - Creates a message that will be dispatched locally and also sent to the Main process.
+ *
+ * @param  {object} action Any redux action (required)
+ * @param  {object} options
+ * @param  {bool}   skipLocal Used by OnlyToMain to skip the main reducer
+ * @param  {string} fromTarget The id of the content port from which the action originated. (optional)
+ * @return {object} An action with added .meta properties
+ */
+function AlsoToMain(action, fromTarget, skipLocal) {
+  return _RouteMessage(action, {
+    from: CONTENT_MESSAGE_TYPE,
+    to: MAIN_MESSAGE_TYPE,
+    fromTarget,
+    skipLocal
+  });
+}
+
+/**
+ * OnlyToMain - Creates a message that will be sent to the Main process and skip the local reducer.
+ *
+ * @param  {object} action Any redux action (required)
+ * @param  {object} options
+ * @param  {string} fromTarget The id of the content port from which the action originated. (optional)
+ * @return {object} An action with added .meta properties
+ */
+function OnlyToMain(action, fromTarget) {
+  return AlsoToMain(action, fromTarget, true);
+}
+
+/**
+ * BroadcastToContent - Creates a message that will be dispatched to main and sent to ALL content processes.
+ *
+ * @param  {object} action Any redux action (required)
+ * @return {object} An action with added .meta properties
+ */
+function BroadcastToContent(action) {
+  return _RouteMessage(action, {
+    from: MAIN_MESSAGE_TYPE,
+    to: CONTENT_MESSAGE_TYPE
+  });
+}
+
+/**
+ * AlsoToOneContent - Creates a message that will be will be dispatched to the main store
+ *                    and also sent to a particular Content process.
+ *
+ * @param  {object} action Any redux action (required)
+ * @param  {string} target The id of a content port
+ * @param  {bool} skipMain Used by OnlyToOneContent to skip the main process
+ * @return {object} An action with added .meta properties
+ */
+function AlsoToOneContent(action, target, skipMain) {
+  if (!target) {
+    throw new Error("You must provide a target ID as the second parameter of AlsoToOneContent. If you want to send to all content processes, use BroadcastToContent");
+  }
+  return _RouteMessage(action, {
+    from: MAIN_MESSAGE_TYPE,
+    to: CONTENT_MESSAGE_TYPE,
+    toTarget: target,
+    skipMain
+  });
+}
+
+/**
+ * OnlyToOneContent - Creates a message that will be sent to a particular Content process
+ *                    and skip the main reducer.
+ *
+ * @param  {object} action Any redux action (required)
+ * @param  {string} target The id of a content port
+ * @return {object} An action with added .meta properties
+ */
+function OnlyToOneContent(action, target) {
+  return AlsoToOneContent(action, target, true);
+}
+
+/**
+ * AlsoToPreloaded - Creates a message that dispatched to the main reducer and also sent to the preloaded tab.
+ *
+ * @param  {object} action Any redux action (required)
+ * @return {object} An action with added .meta properties
+ */
+function AlsoToPreloaded(action) {
+  return _RouteMessage(action, {
+    from: MAIN_MESSAGE_TYPE,
+    to: PRELOAD_MESSAGE_TYPE
+  });
+}
+
+/**
+ * UserEvent - A telemetry ping indicating a user action. This should only
+ *                   be sent from the UI during a user session.
+ *
+ * @param  {object} data Fields to include in the ping (source, etc.)
+ * @return {object} An AlsoToMain action
+ */
+function UserEvent(data) {
+  return AlsoToMain({
+    type: actionTypes.TELEMETRY_USER_EVENT,
+    data
+  });
+}
+
+/**
+ * ASRouterUserEvent - A telemetry ping indicating a user action from AS router. This should only
+ *                     be sent from the UI during a user session.
+ *
+ * @param  {object} data Fields to include in the ping (source, etc.)
+ * @return {object} An AlsoToMain action
+ */
+function ASRouterUserEvent(data) {
+  return AlsoToMain({
+    type: actionTypes.AS_ROUTER_TELEMETRY_USER_EVENT,
+    data
+  });
+}
+
+/**
+ * UndesiredEvent - A telemetry ping indicating an undesired state.
+ *
+ * @param  {object} data Fields to include in the ping (value, etc.)
+ * @param  {int} importContext (For testing) Override the import context for testing.
+ * @return {object} An action. For UI code, a AlsoToMain action.
+ */
+function UndesiredEvent(data, importContext = globalImportContext) {
+  const action = {
+    type: actionTypes.TELEMETRY_UNDESIRED_EVENT,
+    data
+  };
+  return importContext === UI_CODE ? AlsoToMain(action) : action;
+}
+
+/**
+ * PerfEvent - A telemetry ping indicating a performance-related event.
+ *
+ * @param  {object} data Fields to include in the ping (value, etc.)
+ * @param  {int} importContext (For testing) Override the import context for testing.
+ * @return {object} An action. For UI code, a AlsoToMain action.
+ */
+function PerfEvent(data, importContext = globalImportContext) {
+  const action = {
+    type: actionTypes.TELEMETRY_PERFORMANCE_EVENT,
+    data
+  };
+  return importContext === UI_CODE ? AlsoToMain(action) : action;
+}
+
+/**
+ * ImpressionStats - A telemetry ping indicating an impression stats.
+ *
+ * @param  {object} data Fields to include in the ping
+ * @param  {int} importContext (For testing) Override the import context for testing.
+ * #return {object} An action. For UI code, a AlsoToMain action.
+ */
+function ImpressionStats(data, importContext = globalImportContext) {
+  const action = {
+    type: actionTypes.TELEMETRY_IMPRESSION_STATS,
+    data
+  };
+  return importContext === UI_CODE ? AlsoToMain(action) : action;
+}
+
+function SetPref(name, value, importContext = globalImportContext) {
+  const action = {type: actionTypes.SET_PREF, data: {name, value}};
+  return importContext === UI_CODE ? AlsoToMain(action) : action;
+}
+
+function WebExtEvent(type, data, importContext = globalImportContext) {
+  if (!data || !data.source) {
+    throw new Error("WebExtEvent actions should include a property \"source\", the id of the webextension that should receive the event.");
+  }
+  const action = {type, data};
+  return importContext === UI_CODE ? AlsoToMain(action) : action;
+}
+
+this.actionTypes = actionTypes;
+this.ASRouterActions = ASRouterActions;
+
+this.actionCreators = {
+  BroadcastToContent,
+  UserEvent,
+  ASRouterUserEvent,
+  UndesiredEvent,
+  PerfEvent,
+  ImpressionStats,
+  AlsoToOneContent,
+  OnlyToOneContent,
+  AlsoToMain,
+  OnlyToMain,
+  AlsoToPreloaded,
+  SetPref,
+  WebExtEvent
+};
+
+// These are helpers to test for certain kinds of actions
+this.actionUtils = {
+  isSendToMain(action) {
+    if (!action.meta) {
+      return false;
+    }
+    return action.meta.to === MAIN_MESSAGE_TYPE && action.meta.from === CONTENT_MESSAGE_TYPE;
+  },
+  isBroadcastToContent(action) {
+    if (!action.meta) {
+      return false;
+    }
+    if (action.meta.to === CONTENT_MESSAGE_TYPE && !action.meta.toTarget) {
+      return true;
+    }
+    return false;
+  },
+  isSendToOneContent(action) {
+    if (!action.meta) {
+      return false;
+    }
+    if (action.meta.to === CONTENT_MESSAGE_TYPE && action.meta.toTarget) {
+      return true;
+    }
+    return false;
+  },
+  isSendToPreloaded(action) {
+    if (!action.meta) {
+      return false;
+    }
+    return action.meta.to === PRELOAD_MESSAGE_TYPE &&
+      action.meta.from === MAIN_MESSAGE_TYPE;
+  },
+  isFromMain(action) {
+    if (!action.meta) {
+      return false;
+    }
+    return action.meta.from === MAIN_MESSAGE_TYPE &&
+      action.meta.to === CONTENT_MESSAGE_TYPE;
+  },
+  getPortIdOfSender(action) {
+    return (action.meta && action.meta.fromTarget) || null;
+  },
+  _RouteMessage
+};
+
+const EXPORTED_SYMBOLS = [
+  "actionTypes",
+  "actionCreators",
+  "actionUtils",
+  "ASRouterActions",
+  "globalImportContext",
+  "UI_CODE",
+  "BACKGROUND_PROCESS",
+  "MAIN_MESSAGE_TYPE",
+  "CONTENT_MESSAGE_TYPE",
+  "PRELOAD_MESSAGE_TYPE"
+];
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/common/Dedupe.jsm
@@ -0,0 +1,34 @@
+this.Dedupe = class Dedupe {
+  constructor(createKey) {
+    this.createKey = createKey || this.defaultCreateKey;
+  }
+
+  defaultCreateKey(item) {
+    return item;
+  }
+
+  /**
+   * Dedupe any number of grouped elements favoring those from earlier groups.
+   *
+   * @param {Array} groups Contains an arbitrary number of arrays of elements.
+   * @returns {Array} A matching array of each provided group deduped.
+   */
+  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)) {
+          valueMap.set(key, value);
+        }
+      }
+      result.push(valueMap);
+      valueMap.forEach((value, key) => globalKeys.add(key));
+    }
+    return result.map(m => Array.from(m.values()));
+  }
+};
+
+const EXPORTED_SYMBOLS = ["Dedupe"];
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/common/PerfService.jsm
@@ -0,0 +1,125 @@
+/* globals Services */
+"use strict";
+
+/* istanbul ignore if */
+if (typeof ChromeUtils !== "undefined") {
+  ChromeUtils.import("resource://gre/modules/Services.jsm");
+}
+
+let usablePerfObj;
+
+/* istanbul ignore if */
+/* istanbul ignore else */
+if (typeof Services !== "undefined") {
+  // Borrow the high-resolution timer from the hidden window....
+  usablePerfObj = Services.appShell.hiddenDOMWindow.performance;
+} else if (typeof performance !== "undefined") {
+  // we must be running in content space
+  // eslint-disable-next-line no-undef
+  usablePerfObj = performance;
+} else {
+  // This is a dummy object so this file doesn't crash in the node prerendering
+  // task.
+  usablePerfObj = {
+    now() {},
+    mark() {}
+  };
+}
+
+function _PerfService(options) {
+  // For testing, so that we can use a fake Window.performance object with
+  // known state.
+  if (options && options.performanceObj) {
+    this._perf = options.performanceObj;
+  } else {
+    this._perf = usablePerfObj;
+  }
+}
+
+_PerfService.prototype = {
+  /**
+   * Calls the underlying mark() method on the appropriate Window.performance
+   * object to add a mark with the given name to the appropriate performance
+   * timeline.
+   *
+   * @param  {String} name  the name to give the current mark
+   * @return {void}
+   */
+  mark: function mark(str) {
+    this._perf.mark(str);
+  },
+
+  /**
+   * Calls the underlying getEntriesByName on the appropriate Window.performance
+   * object.
+   *
+   * @param  {String} name
+   * @param  {String} type eg "mark"
+   * @return {Array}       Performance* objects
+   */
+  getEntriesByName: function getEntriesByName(name, type) {
+    return this._perf.getEntriesByName(name, type);
+  },
+
+  /**
+   * The timeOrigin property from the appropriate performance object.
+   * Used to ensure that timestamps from the add-on code and the content code
+   * are comparable.
+   *
+   * @note If this is called from a context without a window
+   * (eg a JSM in chrome), it will return the timeOrigin of the XUL hidden
+   * window, which appears to be the first created window (and thus
+   * timeOrigin) in the browser.  Note also, however, there is also a private
+   * hidden window, presumably for private browsing, which appears to be
+   * created dynamically later.  Exactly how/when that shows up needs to be
+   * investigated.
+   *
+   * @return {Number} A double of milliseconds with a precision of 0.5us.
+   */
+  get timeOrigin() {
+    return this._perf.timeOrigin;
+  },
+
+  /**
+   * Returns the "absolute" version of performance.now(), i.e. one that
+   * should ([bug 1401406](https://bugzilla.mozilla.org/show_bug.cgi?id=1401406)
+   * be comparable across both chrome and content.
+   *
+   * @return {Number}
+   */
+  absNow: function absNow() {
+    return this.timeOrigin + this._perf.now();
+  },
+
+  /**
+   * This returns the absolute startTime from the most recent performance.mark()
+   * with the given name.
+   *
+   * @param  {String} name  the name to lookup the start time for
+   *
+   * @return {Number}       the returned start time, as a DOMHighResTimeStamp
+   *
+   * @throws {Error}        "No Marks with the name ..." if none are available
+   *
+   * @note Always surround calls to this by try/catch.  Otherwise your code
+   * may fail when the `privacy.resistFingerprinting` pref is true.  When
+   * this pref is set, all attempts to get marks will likely fail, which will
+   * cause this method to throw.
+   *
+   * See [bug 1369303](https://bugzilla.mozilla.org/show_bug.cgi?id=1369303)
+   * for more info.
+   */
+  getMostRecentAbsMarkStartByName(name) {
+    let entries = this.getEntriesByName(name, "mark");
+
+    if (!entries.length) {
+      throw new Error(`No marks with the name ${name}`);
+    }
+
+    let mostRecentEntry = entries[entries.length - 1];
+    return this._perf.timeOrigin + mostRecentEntry.startTime;
+  }
+};
+
+this.perfService = new _PerfService();
+const EXPORTED_SYMBOLS = ["_PerfService", "perfService"];
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/common/PrerenderData.jsm
@@ -0,0 +1,105 @@
+class _PrerenderData {
+  constructor(options) {
+    this.initialPrefs = options.initialPrefs;
+    this.initialSections = options.initialSections;
+    this._setValidation(options.validation);
+  }
+
+  get validation() {
+    return this._validation;
+  }
+
+  set validation(value) {
+    this._setValidation(value);
+  }
+
+  get invalidatingPrefs() {
+    return this._invalidatingPrefs;
+  }
+
+    // This is needed so we can use it in the constructor
+  _setValidation(value = []) {
+    this._validation = value;
+    this._invalidatingPrefs = value.reduce((result, next) => {
+      if (typeof next === "string") {
+        result.push(next);
+        return result;
+      } else if (next && next.oneOf) {
+        return result.concat(next.oneOf);
+      } else if (next && next.indexedDB) {
+        return result.concat(next.indexedDB);
+      }
+      throw new Error("Your validation configuration is not properly configured");
+    }, []);
+  }
+
+  arePrefsValid(getPref, indexedDBPrefs) {
+    for (const prefs of this.validation) {
+      // {oneOf: ["foo", "bar"]}
+      if (prefs && prefs.oneOf && !prefs.oneOf.some(name => getPref(name) === this.initialPrefs[name])) {
+        return false;
+
+        // {indexedDB: ["foo", "bar"]}
+      } else if (indexedDBPrefs && prefs && prefs.indexedDB) {
+        const anyModifiedPrefs = prefs.indexedDB.some(prefName => indexedDBPrefs.some(pref => pref && pref[prefName]));
+        if (anyModifiedPrefs) {
+          return false;
+        }
+        // "foo"
+      } else if (getPref(prefs) !== this.initialPrefs[prefs]) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
+
+this.PrerenderData = new _PrerenderData({
+  initialPrefs: {
+    "migrationExpired": true,
+    "feeds.topsites": true,
+    "showSearch": true,
+    "topSitesRows": 1,
+    "feeds.section.topstories": true,
+    "feeds.section.highlights": true,
+    "sectionOrder": "topsites,topstories,highlights",
+    "collapsed": false
+  },
+  // Prefs listed as invalidating will prevent the prerendered version
+  // of AS from being used if their value is something other than what is listed
+  // here. This is required because some preferences cause the page layout to be
+  // too different for the prerendered version to be used. Unfortunately, this
+  // will result in users who have modified some of their preferences not being
+  // able to get the benefits of prerendering.
+  validation: [
+    "feeds.topsites",
+    "showSearch",
+    "topSitesRows",
+    "sectionOrder",
+    // This means if either of these are set to their default values,
+    // prerendering can be used.
+    {oneOf: ["feeds.section.topstories", "feeds.section.highlights"]},
+    // If any component has the following preference set to `true` it will
+    // invalidate the prerendered version.
+    {indexedDB: ["collapsed"]}
+  ],
+  initialSections: [
+    {
+      enabled: true,
+      icon: "pocket",
+      id: "topstories",
+      order: 1,
+      title: {id: "header_recommended_by", values: {provider: "Pocket"}}
+    },
+    {
+      enabled: true,
+      id: "highlights",
+      icon: "highlights",
+      order: 2,
+      title: {id: "header_highlights"}
+    }
+  ]
+});
+
+this._PrerenderData = _PrerenderData;
+const EXPORTED_SYMBOLS = ["PrerenderData", "_PrerenderData"];
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/common/Reducers.jsm
@@ -0,0 +1,380 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const {actionTypes: at} = ChromeUtils.import("resource://activity-stream/common/Actions.jsm", {});
+const {Dedupe} = ChromeUtils.import("resource://activity-stream/common/Dedupe.jsm", {});
+
+const TOP_SITES_DEFAULT_ROWS = 1;
+const TOP_SITES_MAX_SITES_PER_ROW = 8;
+
+const dedupe = new Dedupe(site => site && site.url);
+
+const INITIAL_STATE = {
+  App: {
+    // Have we received real data from the app yet?
+    initialized: false
+  },
+  Snippets: {initialized: false},
+  TopSites: {
+    // Have we received real data from history yet?
+    initialized: false,
+    // The history (and possibly default) links
+    rows: [],
+    // Used in content only to dispatch action to TopSiteForm.
+    editForm: null
+  },
+  Prefs: {
+    initialized: false,
+    values: {}
+  },
+  Dialog: {
+    visible: false,
+    data: {}
+  },
+  Sections: []
+};
+
+function App(prevState = INITIAL_STATE.App, action) {
+  switch (action.type) {
+    case at.INIT:
+      return Object.assign({}, prevState, action.data || {}, {initialized: true});
+    default:
+      return prevState;
+  }
+}
+
+/**
+ * insertPinned - Inserts pinned links in their specified slots
+ *
+ * @param {array} a list of links
+ * @param {array} a list of pinned links
+ * @return {array} resulting list of links with pinned links inserted
+ */
+function insertPinned(links, pinned) {
+  // Remove any pinned links
+  const pinnedUrls = pinned.map(link => link && link.url);
+  let newLinks = links.filter(link => (link ? !pinnedUrls.includes(link.url) : false));
+  newLinks = newLinks.map(link => {
+    if (link && link.isPinned) {
+      delete link.isPinned;
+      delete link.pinIndex;
+    }
+    return link;
+  });
+
+  // Then insert them in their specified location
+  pinned.forEach((val, index) => {
+    if (!val) { return; }
+    let link = Object.assign({}, val, {isPinned: true, pinIndex: index});
+    if (index > newLinks.length) {
+      newLinks[index] = link;
+    } else {
+      newLinks.splice(index, 0, link);
+    }
+  });
+
+  return newLinks;
+}
+
+function TopSites(prevState = INITIAL_STATE.TopSites, action) {
+  let hasMatch;
+  let newRows;
+  switch (action.type) {
+    case at.TOP_SITES_UPDATED:
+      if (!action.data || !action.data.links) {
+        return prevState;
+      }
+      return Object.assign({}, prevState, {initialized: true, rows: action.data.links}, action.data.pref ? {pref: action.data.pref} : {});
+    case at.TOP_SITES_PREFS_UPDATED:
+      return Object.assign({}, prevState, {pref: action.data.pref});
+    case at.TOP_SITES_EDIT:
+      return Object.assign({}, prevState, {
+        editForm: {
+          index: action.data.index,
+          previewResponse: null
+        }
+      });
+    case at.TOP_SITES_CANCEL_EDIT:
+      return Object.assign({}, prevState, {editForm: null});
+    case at.PREVIEW_RESPONSE:
+      if (!prevState.editForm || action.data.url !== prevState.editForm.previewUrl) {
+        return prevState;
+      }
+      return Object.assign({}, prevState, {
+        editForm: {
+          index: prevState.editForm.index,
+          previewResponse: action.data.preview,
+          previewUrl: action.data.url
+        }
+      });
+    case at.PREVIEW_REQUEST:
+      if (!prevState.editForm) {
+        return prevState;
+      }
+      return Object.assign({}, prevState, {
+        editForm: {
+          index: prevState.editForm.index,
+          previewResponse: null,
+          previewUrl: action.data.url
+        }
+      });
+    case at.PREVIEW_REQUEST_CANCEL:
+      if (!prevState.editForm) {
+        return prevState;
+      }
+      return Object.assign({}, prevState, {
+        editForm: {
+          index: prevState.editForm.index,
+          previewResponse: null
+        }
+      });
+    case at.SCREENSHOT_UPDATED:
+      newRows = prevState.rows.map(row => {
+        if (row && row.url === action.data.url) {
+          hasMatch = true;
+          return Object.assign({}, row, {screenshot: action.data.screenshot});
+        }
+        return row;
+      });
+      return hasMatch ? Object.assign({}, prevState, {rows: newRows}) : prevState;
+    case at.PLACES_BOOKMARK_ADDED:
+      if (!action.data) {
+        return prevState;
+      }
+      newRows = prevState.rows.map(site => {
+        if (site && site.url === action.data.url) {
+          const {bookmarkGuid, bookmarkTitle, dateAdded} = action.data;
+          return Object.assign({}, site, {bookmarkGuid, bookmarkTitle, bookmarkDateCreated: dateAdded});
+        }
+        return site;
+      });
+      return Object.assign({}, prevState, {rows: newRows});
+    case at.PLACES_BOOKMARK_REMOVED:
+      if (!action.data) {
+        return prevState;
+      }
+      newRows = prevState.rows.map(site => {
+        if (site && site.url === action.data.url) {
+          const newSite = Object.assign({}, site);
+          delete newSite.bookmarkGuid;
+          delete newSite.bookmarkTitle;
+          delete newSite.bookmarkDateCreated;
+          return newSite;
+        }
+        return site;
+      });
+      return Object.assign({}, prevState, {rows: newRows});
+    case at.PLACES_LINK_DELETED:
+      if (!action.data) {
+        return prevState;
+      }
+      newRows = prevState.rows.filter(site => action.data.url !== site.url);
+      return Object.assign({}, prevState, {rows: newRows});
+    default:
+      return prevState;
+  }
+}
+
+function Dialog(prevState = INITIAL_STATE.Dialog, action) {
+  switch (action.type) {
+    case at.DIALOG_OPEN:
+      return Object.assign({}, prevState, {visible: true, data: action.data});
+    case at.DIALOG_CANCEL:
+      return Object.assign({}, prevState, {visible: false});
+    case at.DELETE_HISTORY_URL:
+      return Object.assign({}, INITIAL_STATE.Dialog);
+    default:
+      return prevState;
+  }
+}
+
+function Prefs(prevState = INITIAL_STATE.Prefs, action) {
+  let newValues;
+  switch (action.type) {
+    case at.PREFS_INITIAL_VALUES:
+      return Object.assign({}, prevState, {initialized: true, values: action.data});
+    case at.PREF_CHANGED:
+      newValues = Object.assign({}, prevState.values);
+      newValues[action.data.name] = action.data.value;
+      return Object.assign({}, prevState, {values: newValues});
+    default:
+      return prevState;
+  }
+}
+
+function Sections(prevState = INITIAL_STATE.Sections, action) {
+  let hasMatch;
+  let newState;
+  switch (action.type) {
+    case at.SECTION_DEREGISTER:
+      return prevState.filter(section => section.id !== action.data);
+    case at.SECTION_REGISTER:
+      // If section exists in prevState, update it
+      newState = prevState.map(section => {
+        if (section && section.id === action.data.id) {
+          hasMatch = true;
+          return Object.assign({}, section, action.data);
+        }
+        return section;
+      });
+      // Otherwise, append it
+      if (!hasMatch) {
+        const initialized = !!(action.data.rows && action.data.rows.length > 0);
+        const section = Object.assign({title: "", rows: [], enabled: false}, action.data, {initialized});
+        newState.push(section);
+      }
+      return newState;
+    case at.SECTION_UPDATE:
+      newState = prevState.map(section => {
+        if (section && section.id === action.data.id) {
+          // If the action is updating rows, we should consider initialized to be true.
+          // This can be overridden if initialized is defined in the action.data
+          const initialized = action.data.rows ? {initialized: true} : {};
+
+          // Make sure pinned cards stay at their current position when rows are updated.
+          // Disabling a section (SECTION_UPDATE with empty rows) does not retain pinned cards.
+          if (action.data.rows && action.data.rows.length > 0 && section.rows.find(card => card.pinned)) {
+            const rows = Array.from(action.data.rows);
+            section.rows.forEach((card, index) => {
+              if (card.pinned) {
+                rows.splice(index, 0, card);
+              }
+            });
+            return Object.assign({}, section, initialized, Object.assign({}, action.data, {rows}));
+          }
+
+          return Object.assign({}, section, initialized, action.data);
+        }
+        return section;
+      });
+
+      if (!action.data.dedupeConfigurations) {
+        return newState;
+      }
+
+      action.data.dedupeConfigurations.forEach(dedupeConf => {
+        newState = newState.map(section => {
+          if (section.id === dedupeConf.id) {
+            const dedupedRows = dedupeConf.dedupeFrom.reduce((rows, dedupeSectionId) => {
+              const dedupeSection = newState.find(s => s.id === dedupeSectionId);
+              const [, newRows] = dedupe.group(dedupeSection.rows, rows);
+              return newRows;
+            }, section.rows);
+
+            return Object.assign({}, section, {rows: dedupedRows});
+          }
+
+          return section;
+        });
+      });
+
+      return newState;
+    case at.SECTION_UPDATE_CARD: