Bug 1549863 - Add 3-card layout, card adjustments and bug fixes to Activity Stream r=r1cky
authorEd Lee <edilee@mozilla.com>
Wed, 08 May 2019 00:38:11 +0000
changeset 531806 690025a0dcd52340c05432a84131d5239df2d61a
parent 531805 c04cde900d273ffa3c4990dbfea94495b12e54e1
child 531807 3245e485822f8681ec8cacdc49d761f01efd74b9
push id11265
push userffxbld-merge
push dateMon, 13 May 2019 10:53:39 +0000
treeherdermozilla-beta@77e0fe8dbdd3 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersr1cky
bugs1549863
milestone68.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1549863 - Add 3-card layout, card adjustments and bug fixes to Activity Stream r=r1cky Differential Revision: https://phabricator.services.mozilla.com/D30286
browser/components/newtab/bin/render-activity-stream-html.js
browser/components/newtab/common/Actions.jsm
browser/components/newtab/common/Reducers.jsm
browser/components/newtab/content-src/asrouter/asrouter-content.jsx
browser/components/newtab/content-src/asrouter/components/ModalOverlay/ModalOverlay.jsx
browser/components/newtab/content-src/asrouter/templates/StartupOverlay/StartupOverlay.jsx
browser/components/newtab/content-src/asrouter/templates/Trailhead/Trailhead.jsx
browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss
browser/components/newtab/content-src/components/DiscoveryStreamBase/DiscoveryStreamBase.jsx
browser/components/newtab/content-src/components/DiscoveryStreamComponents/CardGrid/_CardGrid.scss
browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSCard/_DSCard.scss
browser/components/newtab/content-src/components/DiscoveryStreamComponents/Hero/_Hero.scss
browser/components/newtab/content-src/components/DiscoveryStreamComponents/List/_List.scss
browser/components/newtab/content-src/lib/selectLayoutRender.js
browser/components/newtab/content-src/styles/_theme.scss
browser/components/newtab/css/activity-stream-linux.css
browser/components/newtab/css/activity-stream-mac.css
browser/components/newtab/css/activity-stream-windows.css
browser/components/newtab/data/content/activity-stream.bundle.js
browser/components/newtab/docs/v2-system-addon/data_events.md
browser/components/newtab/jar.mn
browser/components/newtab/lib/ASRouter.jsm
browser/components/newtab/lib/ActivityStream.jsm
browser/components/newtab/lib/BookmarkPanelHub.jsm
browser/components/newtab/lib/DiscoveryStreamFeed.jsm
browser/components/newtab/lib/OnboardingMessageProvider.jsm
browser/components/newtab/lib/TopSitesFeed.jsm
browser/components/newtab/prerendered/locales/ach/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ach/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ach/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ach/activity-stream.html
browser/components/newtab/prerendered/locales/an/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/an/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/an/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/an/activity-stream.html
browser/components/newtab/prerendered/locales/ar/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ar/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ar/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ar/activity-stream.html
browser/components/newtab/prerendered/locales/ast/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ast/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ast/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ast/activity-stream.html
browser/components/newtab/prerendered/locales/az/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/az/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/az/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/az/activity-stream.html
browser/components/newtab/prerendered/locales/be/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/be/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/be/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/be/activity-stream.html
browser/components/newtab/prerendered/locales/bg/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/bg/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/bg/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/bg/activity-stream.html
browser/components/newtab/prerendered/locales/bn/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/bn/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/bn/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/bn/activity-stream.html
browser/components/newtab/prerendered/locales/br/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/br/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/br/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/br/activity-stream.html
browser/components/newtab/prerendered/locales/bs/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/bs/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/bs/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/bs/activity-stream.html
browser/components/newtab/prerendered/locales/ca/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ca/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ca/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ca/activity-stream.html
browser/components/newtab/prerendered/locales/cak/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/cak/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/cak/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/cak/activity-stream.html
browser/components/newtab/prerendered/locales/crh/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/crh/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/crh/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/crh/activity-stream.html
browser/components/newtab/prerendered/locales/cs/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/cs/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/cs/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/cs/activity-stream.html
browser/components/newtab/prerendered/locales/cy/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/cy/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/cy/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/cy/activity-stream.html
browser/components/newtab/prerendered/locales/da/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/da/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/da/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/da/activity-stream.html
browser/components/newtab/prerendered/locales/de/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/de/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/de/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/de/activity-stream.html
browser/components/newtab/prerendered/locales/dsb/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/dsb/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/dsb/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/dsb/activity-stream.html
browser/components/newtab/prerendered/locales/el/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/el/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/el/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/el/activity-stream.html
browser/components/newtab/prerendered/locales/en-CA/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/en-CA/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/en-CA/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/en-CA/activity-stream.html
browser/components/newtab/prerendered/locales/en-GB/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/en-GB/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/en-GB/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/en-GB/activity-stream.html
browser/components/newtab/prerendered/locales/en-US/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/en-US/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/en-US/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/en-US/activity-stream.html
browser/components/newtab/prerendered/locales/eo/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/eo/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/eo/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/eo/activity-stream.html
browser/components/newtab/prerendered/locales/es-AR/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/es-AR/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/es-AR/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/es-AR/activity-stream.html
browser/components/newtab/prerendered/locales/es-CL/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/es-CL/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/es-CL/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/es-CL/activity-stream.html
browser/components/newtab/prerendered/locales/es-ES/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/es-ES/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/es-ES/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/es-ES/activity-stream.html
browser/components/newtab/prerendered/locales/es-MX/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/es-MX/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/es-MX/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/es-MX/activity-stream.html
browser/components/newtab/prerendered/locales/et/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/et/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/et/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/et/activity-stream.html
browser/components/newtab/prerendered/locales/eu/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/eu/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/eu/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/eu/activity-stream.html
browser/components/newtab/prerendered/locales/fa/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/fa/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/fa/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/fa/activity-stream.html
browser/components/newtab/prerendered/locales/ff/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ff/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ff/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ff/activity-stream.html
browser/components/newtab/prerendered/locales/fi/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/fi/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/fi/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/fi/activity-stream.html
browser/components/newtab/prerendered/locales/fr/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/fr/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/fr/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/fr/activity-stream.html
browser/components/newtab/prerendered/locales/fy-NL/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/fy-NL/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/fy-NL/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/fy-NL/activity-stream.html
browser/components/newtab/prerendered/locales/ga-IE/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ga-IE/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ga-IE/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ga-IE/activity-stream.html
browser/components/newtab/prerendered/locales/gd/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/gd/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/gd/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/gd/activity-stream.html
browser/components/newtab/prerendered/locales/gl/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/gl/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/gl/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/gl/activity-stream.html
browser/components/newtab/prerendered/locales/gn/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/gn/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/gn/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/gn/activity-stream.html
browser/components/newtab/prerendered/locales/gu-IN/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/gu-IN/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/gu-IN/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/gu-IN/activity-stream.html
browser/components/newtab/prerendered/locales/he/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/he/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/he/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/he/activity-stream.html
browser/components/newtab/prerendered/locales/hi-IN/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/hi-IN/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/hi-IN/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/hi-IN/activity-stream.html
browser/components/newtab/prerendered/locales/hr/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/hr/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/hr/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/hr/activity-stream.html
browser/components/newtab/prerendered/locales/hsb/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/hsb/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/hsb/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/hsb/activity-stream.html
browser/components/newtab/prerendered/locales/hu/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/hu/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/hu/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/hu/activity-stream.html
browser/components/newtab/prerendered/locales/hy-AM/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/hy-AM/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/hy-AM/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/hy-AM/activity-stream.html
browser/components/newtab/prerendered/locales/ia/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ia/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ia/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ia/activity-stream.html
browser/components/newtab/prerendered/locales/id/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/id/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/id/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/id/activity-stream.html
browser/components/newtab/prerendered/locales/is/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/is/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/is/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/is/activity-stream.html
browser/components/newtab/prerendered/locales/it/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/it/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/it/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/it/activity-stream.html
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream.html
browser/components/newtab/prerendered/locales/ja/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ja/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ja/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ja/activity-stream.html
browser/components/newtab/prerendered/locales/ka/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ka/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ka/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ka/activity-stream.html
browser/components/newtab/prerendered/locales/kab/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/kab/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/kab/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/kab/activity-stream.html
browser/components/newtab/prerendered/locales/kk/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/kk/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/kk/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/kk/activity-stream.html
browser/components/newtab/prerendered/locales/km/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/km/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/km/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/km/activity-stream.html
browser/components/newtab/prerendered/locales/kn/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/kn/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/kn/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/kn/activity-stream.html
browser/components/newtab/prerendered/locales/ko/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ko/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ko/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ko/activity-stream.html
browser/components/newtab/prerendered/locales/lij/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/lij/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/lij/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/lij/activity-stream.html
browser/components/newtab/prerendered/locales/lo/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/lo/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/lo/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/lo/activity-stream.html
browser/components/newtab/prerendered/locales/lt/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/lt/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/lt/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/lt/activity-stream.html
browser/components/newtab/prerendered/locales/ltg/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ltg/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ltg/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ltg/activity-stream.html
browser/components/newtab/prerendered/locales/lv/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/lv/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/lv/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/lv/activity-stream.html
browser/components/newtab/prerendered/locales/mk/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/mk/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/mk/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/mk/activity-stream.html
browser/components/newtab/prerendered/locales/mr/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/mr/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/mr/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/mr/activity-stream.html
browser/components/newtab/prerendered/locales/ms/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ms/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ms/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ms/activity-stream.html
browser/components/newtab/prerendered/locales/my/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/my/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/my/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/my/activity-stream.html
browser/components/newtab/prerendered/locales/nb-NO/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/nb-NO/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/nb-NO/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/nb-NO/activity-stream.html
browser/components/newtab/prerendered/locales/ne-NP/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ne-NP/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ne-NP/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ne-NP/activity-stream.html
browser/components/newtab/prerendered/locales/nl/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/nl/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/nl/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/nl/activity-stream.html
browser/components/newtab/prerendered/locales/nn-NO/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/nn-NO/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/nn-NO/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/nn-NO/activity-stream.html
browser/components/newtab/prerendered/locales/oc/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/oc/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/oc/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/oc/activity-stream.html
browser/components/newtab/prerendered/locales/pa-IN/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/pa-IN/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/pa-IN/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/pa-IN/activity-stream.html
browser/components/newtab/prerendered/locales/pl/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/pl/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/pl/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/pl/activity-stream.html
browser/components/newtab/prerendered/locales/pt-BR/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/pt-BR/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/pt-BR/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/pt-BR/activity-stream.html
browser/components/newtab/prerendered/locales/pt-PT/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/pt-PT/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/pt-PT/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/pt-PT/activity-stream.html
browser/components/newtab/prerendered/locales/rm/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/rm/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/rm/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/rm/activity-stream.html
browser/components/newtab/prerendered/locales/ro/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ro/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ro/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ro/activity-stream.html
browser/components/newtab/prerendered/locales/ru/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ru/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ru/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ru/activity-stream.html
browser/components/newtab/prerendered/locales/si/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/si/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/si/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/si/activity-stream.html
browser/components/newtab/prerendered/locales/sk/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/sk/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/sk/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/sk/activity-stream.html
browser/components/newtab/prerendered/locales/sl/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/sl/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/sl/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/sl/activity-stream.html
browser/components/newtab/prerendered/locales/sq/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/sq/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/sq/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/sq/activity-stream.html
browser/components/newtab/prerendered/locales/sr/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/sr/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/sr/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/sr/activity-stream.html
browser/components/newtab/prerendered/locales/sv-SE/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/sv-SE/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/sv-SE/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/sv-SE/activity-stream.html
browser/components/newtab/prerendered/locales/ta/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ta/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ta/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ta/activity-stream.html
browser/components/newtab/prerendered/locales/te/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/te/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/te/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/te/activity-stream.html
browser/components/newtab/prerendered/locales/th/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/th/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/th/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/th/activity-stream.html
browser/components/newtab/prerendered/locales/tl/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/tl/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/tl/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/tl/activity-stream.html
browser/components/newtab/prerendered/locales/tr/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/tr/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/tr/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/tr/activity-stream.html
browser/components/newtab/prerendered/locales/trs/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/trs/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/trs/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/trs/activity-stream.html
browser/components/newtab/prerendered/locales/uk/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/uk/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/uk/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/uk/activity-stream.html
browser/components/newtab/prerendered/locales/ur/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ur/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ur/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ur/activity-stream.html
browser/components/newtab/prerendered/locales/uz/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/uz/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/uz/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/uz/activity-stream.html
browser/components/newtab/prerendered/locales/vi/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/vi/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/vi/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/vi/activity-stream.html
browser/components/newtab/prerendered/locales/zh-CN/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/zh-CN/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/zh-CN/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/zh-CN/activity-stream.html
browser/components/newtab/prerendered/locales/zh-TW/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/zh-TW/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/zh-TW/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/zh-TW/activity-stream.html
browser/components/newtab/prerendered/static/activity-stream-debug.html
browser/components/newtab/prerendered/static/activity-stream-prerendered-debug.html
browser/components/newtab/test/unit/asrouter/ASRouter.test.js
browser/components/newtab/test/unit/asrouter/asrouter-content.test.jsx
browser/components/newtab/test/unit/asrouter/templates/Trailhead.test.jsx
browser/components/newtab/test/unit/common/Reducers.test.js
browser/components/newtab/test/unit/content-src/components/DiscoveryStreamBase.test.jsx
browser/components/newtab/test/unit/content-src/lib/selectLayoutRender.test.js
browser/components/newtab/test/unit/lib/BookmarkPanelHub.test.js
browser/components/newtab/test/unit/lib/DiscoveryStreamFeed.test.js
browser/components/newtab/test/unit/lib/TopSitesFeed.test.js
--- a/browser/components/newtab/bin/render-activity-stream-html.js
+++ b/browser/components/newtab/bin/render-activity-stream-html.js
@@ -95,19 +95,19 @@ function templateHTML(options, html) {
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>${options.strings.newtab_page_title}</title>
     <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="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root">${isPrerendered ? html : "<!-- Regular React Rendering -->"}</div>
-    <div id="footer-asrouter-container"></div>${options.noscripts ? "" : scriptRender}
+    <div id="footer-asrouter-container" role="presentation"></div>${options.noscripts ? "" : scriptRender}
   </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
--- a/browser/components/newtab/common/Actions.jsm
+++ b/browser/components/newtab/common/Actions.jsm
@@ -38,16 +38,17 @@ for (const type of [
   "DELETE_FROM_POCKET",
   "DELETE_HISTORY_URL",
   "DIALOG_CANCEL",
   "DIALOG_OPEN",
   "DISCOVERY_STREAM_CONFIG_CHANGE",
   "DISCOVERY_STREAM_CONFIG_SETUP",
   "DISCOVERY_STREAM_CONFIG_SET_VALUE",
   "DISCOVERY_STREAM_FEEDS_UPDATE",
+  "DISCOVERY_STREAM_FEED_UPDATE",
   "DISCOVERY_STREAM_IMPRESSION_STATS",
   "DISCOVERY_STREAM_LAYOUT_RESET",
   "DISCOVERY_STREAM_LAYOUT_UPDATE",
   "DISCOVERY_STREAM_LINK_BLOCKED",
   "DISCOVERY_STREAM_LOADED_CONTENT",
   "DISCOVERY_STREAM_OPT_OUT",
   "DISCOVERY_STREAM_SPOCS_CAPS",
   "DISCOVERY_STREAM_SPOCS_ENDPOINT",
--- a/browser/components/newtab/common/Reducers.jsm
+++ b/browser/components/newtab/common/Reducers.jsm
@@ -490,20 +490,32 @@ function DiscoveryStream(prevState = INI
       return {...prevState, lastUpdated: action.data.lastUpdated || null, layout: action.data.layout || []};
     case at.DISCOVERY_STREAM_LAYOUT_RESET:
       return {...INITIAL_STATE.DiscoveryStream, config: prevState.config};
     case at.DISCOVERY_STREAM_FEEDS_UPDATE:
       return {
         ...prevState,
         feeds: {
           ...prevState.feeds,
-          data: action.data || prevState.feeds.data,
           loaded: true,
         },
       };
+    case at.DISCOVERY_STREAM_FEED_UPDATE:
+      const newData = {};
+      newData[action.data.url] = action.data.feed;
+      return {
+        ...prevState,
+        feeds: {
+          ...prevState.feeds,
+          data: {
+            ...prevState.feeds.data,
+            ...newData,
+          },
+        },
+      };
     case at.DISCOVERY_STREAM_SPOCS_CAPS:
       return {
         ...prevState,
         spocs: {
           ...prevState.spocs,
           frequency_caps: [...prevState.spocs.frequency_caps, ...action.data],
         },
       };
--- a/browser/components/newtab/content-src/asrouter/asrouter-content.jsx
+++ b/browser/components/newtab/content-src/asrouter/asrouter-content.jsx
@@ -291,16 +291,17 @@ export class ASRouterUISurface extends R
     }
     return null;
   }
 
   renderTrailhead() {
     const {message} = this.state;
     if (message.template === "trailhead") {
       return (<Trailhead
+        document={this.props.document}
         message={message}
         onAction={ASRouterUtils.executeAction}
         onDoneButton={this.dismissBundle(this.state.bundle.bundle)}
         sendUserActionTelemetry={this.sendUserActionTelemetry}
         dispatch={this.props.dispatch}
         fxaEndpoint={this.props.fxaEndpoint} />);
     }
     return null;
--- a/browser/components/newtab/content-src/asrouter/components/ModalOverlay/ModalOverlay.jsx
+++ b/browser/components/newtab/content-src/asrouter/components/ModalOverlay/ModalOverlay.jsx
@@ -21,17 +21,20 @@ export class ModalOverlayWrapper extends
     this.props.document.removeEventListener("keydown", this.onKeyDown);
     this.props.document.body.classList.remove("modal-open");
   }
 
   render() {
     const {props} = this;
     return (<React.Fragment>
       <div className="modalOverlayOuter active" onClick={props.onClose} role="presentation" />
-      <div className={`modalOverlayInner active ${props.innerClassName || ""}`}>
+      <div className={`modalOverlayInner active ${props.innerClassName || ""}`}
+        aria-labelledby={props.headerId}
+        id={props.id}
+        role="dialog">
         {props.children}
       </div>
     </React.Fragment>);
   }
 }
 
 ModalOverlayWrapper.defaultProps = {document: global.document};
 
--- a/browser/components/newtab/content-src/asrouter/templates/StartupOverlay/StartupOverlay.jsx
+++ b/browser/components/newtab/content-src/asrouter/templates/StartupOverlay/StartupOverlay.jsx
@@ -8,31 +8,33 @@ export class _StartupOverlay extends Rea
     super(props);
     this.onInputChange = this.onInputChange.bind(this);
     this.onSubmit = this.onSubmit.bind(this);
     this.clickSkip = this.clickSkip.bind(this);
     this.initScene = this.initScene.bind(this);
     this.removeOverlay = this.removeOverlay.bind(this);
     this.onInputInvalid = this.onInputInvalid.bind(this);
 
+    this.utmParams = "utm_source=activity-stream&utm_campaign=firstrun&utm_medium=referral&utm_term=trailhead-control";
+
     this.state = {
       emailInput: "",
       overlayRemoved: false,
       flowId: "",
       flowBeginTime: 0,
     };
     this.didFetch = false;
   }
 
   async componentWillUpdate() {
     if (this.props.fxa_endpoint && !this.didFetch) {
       try {
         this.didFetch = true;
-        const fxaParams = "entrypoint=activity-stream-firstrun&utm_source=activity-stream&utm_campaign=firstrun&form_type=email";
-        const response = await fetch(`${this.props.fxa_endpoint}/metrics-flow?${fxaParams}`, {credentials: "omit"});
+        const fxaParams = "entrypoint=activity-stream-firstrun&form_type=email";
+        const response = await fetch(`${this.props.fxa_endpoint}/metrics-flow?${fxaParams}&${this.utmParams}`, {credentials: "omit"});
         if (response.status === 200) {
           const {flowId, flowBeginTime} = await response.json();
           this.setState({flowId, flowBeginTime});
         } else {
           this.props.dispatch(ac.OnlyToMain({type: at.TELEMETRY_UNDESIRED_EVENT, data: {event: "FXA_METRICS_FETCH_ERROR", value: response.status}}));
         }
       } catch (error) {
         this.props.dispatch(ac.OnlyToMain({type: at.TELEMETRY_UNDESIRED_EVENT, data: {event: "FXA_METRICS_ERROR"}}));
@@ -101,38 +103,40 @@ export class _StartupOverlay extends Rea
 
   render() {
     // When skipping the onboarding tour we show AS but we are still on
     // about:welcome, prop.isFirstrun is true and StartupOverlay is rendered
     if (this.state.overlayRemoved) {
       return null;
     }
 
-    let termsLink = (<a href={`${this.props.fxa_endpoint}/legal/terms`} target="_blank" rel="noopener noreferrer"><FormattedMessage id="firstrun_terms_of_service" /></a>);
-    let privacyLink = (<a href={`${this.props.fxa_endpoint}/legal/privacy`} target="_blank" rel="noopener noreferrer"><FormattedMessage id="firstrun_privacy_notice" /></a>);
+    let termsLink = (<a href={`${this.props.fxa_endpoint}/legal/terms?${this.utmParams}`} target="_blank" rel="noopener noreferrer"><FormattedMessage id="firstrun_terms_of_service" /></a>);
+    let privacyLink = (<a href={`${this.props.fxa_endpoint}/legal/privacy?${this.utmParams}`} target="_blank" rel="noopener noreferrer"><FormattedMessage id="firstrun_privacy_notice" /></a>);
 
     return (
       <div className={`overlay-wrapper ${this.state.show ? "show" : ""}`}>
         <div className="background" />
         <div className="firstrun-scene">
           <div className="fxaccounts-container">
             <div className="firstrun-left-divider">
               <h1 className="firstrun-title"><FormattedMessage id="firstrun_title" /></h1>
               <p className="firstrun-content"><FormattedMessage id="firstrun_content" /></p>
-              <a className="firstrun-link" href="https://www.mozilla.org/firefox/features/sync/" target="_blank" rel="noopener noreferrer"><FormattedMessage id="firstrun_learn_more_link" /></a>
+              <a className="firstrun-link" href={`https://www.mozilla.org/firefox/features/sync/?${this.utmParams}`} target="_blank" rel="noopener noreferrer"><FormattedMessage id="firstrun_learn_more_link" /></a>
             </div>
             <div className="firstrun-sign-in">
               <p className="form-header"><FormattedMessage id="firstrun_form_header" /><span className="sub-header"><FormattedMessage id="firstrun_form_sub_header" /></span></p>
               <form method="get" action={this.props.fxa_endpoint} target="_blank" rel="noopener noreferrer" onSubmit={this.onSubmit}>
                 <input name="service" type="hidden" value="sync" />
                 <input name="action" type="hidden" value="email" />
                 <input name="context" type="hidden" value="fx_desktop_v3" />
                 <input name="entrypoint" type="hidden" value="activity-stream-firstrun" />
                 <input name="utm_source" type="hidden" value="activity-stream" />
                 <input name="utm_campaign" type="hidden" value="firstrun" />
+                <input name="utm_medium" type="hidden" value="referral" />
+                <input name="utm_term" type="hidden" value="trailhead-control" />
                 <input name="flow_id" type="hidden" value={this.state.flowId} />
                 <input name="flow_begin_time" type="hidden" value={this.state.flowBeginTime} />
                 <span className="error">{this.props.intl.formatMessage({id: "firstrun_invalid_input"})}</span>
                 <input className="email-input" name="email" type="email" required="true" onInvalid={this.onInputInvalid} placeholder={this.props.intl.formatMessage({id: "firstrun_email_input_placeholder"})} onChange={this.onInputChange} />
                 <div className="extra-links">
                   <FormattedMessage
                     id="firstrun_extra_legal_links"
                     values={{
--- a/browser/components/newtab/content-src/asrouter/templates/Trailhead/Trailhead.jsx
+++ b/browser/components/newtab/content-src/asrouter/templates/Trailhead/Trailhead.jsx
@@ -1,105 +1,137 @@
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
 import {injectIntl} from "react-intl";
 import {ModalOverlayWrapper} from "../../components/ModalOverlay/ModalOverlay";
 import {OnboardingCard} from "../OnboardingMessage/OnboardingMessage";
 import React from "react";
 
 const FLUENT_FILES = [
   "branding/brand.ftl",
+  "browser/branding/brandings.ftl",
   "browser/branding/sync-brand.ftl",
-  // These are finalized strings exposed to localizers
   "browser/newtab/onboarding.ftl",
-  // These are WIP/in-development strings that only get used if the string
-  // doesn't already exist in onboarding.ftl above
-  "trailhead.ftl",
 ];
 
+// From resource://devtools/client/shared/focus.js
+const FOCUSABLE_SELECTOR = [
+  "a[href]:not([tabindex='-1'])",
+  "button:not([disabled]):not([tabindex='-1'])",
+  "iframe:not([tabindex='-1'])",
+  "input:not([disabled]):not([tabindex='-1'])",
+  "select:not([disabled]):not([tabindex='-1'])",
+  "textarea:not([disabled]):not([tabindex='-1'])",
+  "[tabindex]:not([tabindex='-1'])",
+].join(", ");
+
 export class _Trailhead extends React.PureComponent {
   constructor(props) {
     super(props);
     this.closeModal = this.closeModal.bind(this);
     this.hideCardPanel = this.hideCardPanel.bind(this);
     this.onInputChange = this.onInputChange.bind(this);
+    this.onStartBlur = this.onStartBlur.bind(this);
     this.onSubmit = this.onSubmit.bind(this);
     this.onInputInvalid = this.onInputInvalid.bind(this);
+    this.onCardAction = this.onCardAction.bind(this);
 
     this.state = {
       emailInput: "",
       isModalOpen: true,
       showCardPanel: true,
       showCards: false,
       flowId: "",
       flowBeginTime: 0,
     };
     this.didFetch = false;
   }
 
+  get dialog() {
+    return this.props.document.getElementById("trailheadDialog");
+  }
+
   async componentWillMount() {
     FLUENT_FILES.forEach(file => {
       const link = document.head.appendChild(document.createElement("link"));
       link.href = file;
       link.rel = "localization";
     });
 
     if (this.props.fxaEndpoint && !this.didFetch) {
       try {
         this.didFetch = true;
-        const fxaParams = "entrypoint=activity-stream-firstrun&utm_source=activity-stream&utm_campaign=firstrun&utm_term=trailhead&form_type=email";
-        const response = await fetch(`${this.props.fxaEndpoint}/metrics-flow?${fxaParams}`, {credentials: "omit"});
+        const url = new URL(`${this.props.fxaEndpoint}/metrics-flow?entrypoint=activity-stream-firstrun&form_type=email`);
+        this.addUtmParams(url);
+        const response = await fetch(url, {credentials: "omit"});
         if (response.status === 200) {
           const {flowId, flowBeginTime} = await response.json();
           this.setState({flowId, flowBeginTime});
         } else {
           this.props.dispatch(ac.OnlyToMain({type: at.TELEMETRY_UNDESIRED_EVENT, data: {event: "FXA_METRICS_FETCH_ERROR", value: response.status}}));
         }
       } catch (error) {
         this.props.dispatch(ac.OnlyToMain({type: at.TELEMETRY_UNDESIRED_EVENT, data: {event: "FXA_METRICS_ERROR"}}));
       }
     }
   }
 
   componentDidMount() {
     // We need to remove hide-main since we should show it underneath everything that has rendered
-    global.document.body.classList.remove("hide-main");
+    this.props.document.body.classList.remove("hide-main");
 
     // Add inline-onboarding class to disable fixed search header and fixed positioned settings icon
-    global.document.body.classList.add("inline-onboarding");
+    this.props.document.body.classList.add("inline-onboarding");
+
+    // The rest of the page is "hidden" when the modal is open
+    if (this.props.message.content) {
+      this.props.document.getElementById("root").setAttribute("aria-hidden", "true");
 
-    if (!this.props.message.content) {
+      // Start with focus in the email input box
+      this.dialog.querySelector("input[name=email]").focus();
+    } else {
       // No modal overlay, let the user scroll and deal them some cards.
-      global.document.body.classList.remove("welcome");
+      this.props.document.body.classList.remove("welcome");
 
       if (this.props.message.includeBundle || this.props.message.cards) {
         this.revealCards();
       }
     }
   }
 
-  componentDidUnmount() {
-    global.document.body.classList.remove("inline-onboarding");
+  componentWillUnmount() {
+    this.props.document.body.classList.remove("inline-onboarding");
   }
 
   onInputChange(e) {
     let error = e.target.previousSibling;
     this.setState({emailInput: e.target.value});
     error.classList.remove("active");
     e.target.classList.remove("invalid");
   }
 
+  onStartBlur(event) {
+    // Make sure focus stays within the dialog when tabbing from the button
+    const {dialog} = this;
+    if (event.relatedTarget &&
+        !(dialog.compareDocumentPosition(event.relatedTarget) &
+          dialog.DOCUMENT_POSITION_CONTAINED_BY)) {
+      dialog.querySelector(FOCUSABLE_SELECTOR).focus();
+    }
+  }
+
   onSubmit() {
     this.props.dispatch(ac.UserEvent({event: "SUBMIT_EMAIL", ...this._getFormInfo()}));
 
     global.addEventListener("visibilitychange", this.closeModal);
   }
 
   closeModal() {
     global.removeEventListener("visibilitychange", this.closeModal);
-    global.document.body.classList.remove("welcome");
+    this.props.document.body.classList.remove("welcome");
+    this.props.document.getElementById("root").removeAttribute("aria-hidden");
     this.setState({isModalOpen: false});
     this.revealCards();
     this.props.dispatch(ac.UserEvent({event: "SKIPPED_SIGNIN", ...this._getFormInfo()}));
   }
 
   /**
    * Report to telemetry additional information about the form submission.
    */
@@ -126,91 +158,131 @@ export class _Trailhead extends React.Pu
 
   getStringValue(str) {
     if (str.property_id) {
       str.value = this.props.intl.formatMessage({id: str.property_id});
     }
     return str.value;
   }
 
+  /**
+   * Takes in a url as a string or URL object and returns a URL object with the
+   * utm_* parameters added to it. If a URL object is passed in, the paraemeters
+   * are added to it (the return value can be ignored in that case as it's the
+   * same object).
+   */
+  addUtmParams(url, isCard = false) {
+    let returnUrl = url;
+    if (typeof returnUrl === "string") {
+      returnUrl = new URL(url);
+    }
+    returnUrl.searchParams.append("utm_source", "activity-stream");
+    returnUrl.searchParams.append("utm_campaign", "firstrun");
+    returnUrl.searchParams.append("utm_medium", "referral");
+    returnUrl.searchParams.append("utm_term", `${this.props.message.utm_term}${isCard ? "-card" : ""}`);
+    return returnUrl;
+  }
+
+  onCardAction(action) {
+    let actionUpdates = {};
+
+    if (action.type === "OPEN_URL") {
+      let url = new URL(action.data.args);
+      this.addUtmParams(url, true);
+
+      if (action.addFlowParams) {
+        url.searchParams.append("flow_id", this.state.flowId);
+        url.searchParams.append("flow_begin_time", this.state.flowBeginTime);
+      }
+
+      actionUpdates = {data: {...action.data, args: url}};
+    }
+
+    this.props.onAction({...action, ...actionUpdates});
+  }
+
   render() {
     const {props} = this;
-    const {bundle: cards, content} = props.message;
+    const {bundle: cards, content, utm_term} = props.message;
     const innerClassName = [
       "trailhead",
       content && content.className,
     ].filter(v => v).join(" ");
     return (<>
-    {this.state.isModalOpen && content ? <ModalOverlayWrapper innerClassName={innerClassName} onClose={this.closeModal}>
+    {this.state.isModalOpen && content ? <ModalOverlayWrapper innerClassName={innerClassName} onClose={this.closeModal} id="trailheadDialog" headerId="trailheadHeader">
       <div className="trailheadInner">
         <div className="trailheadContent">
-          <h1 data-l10n-id={content.title.string_id}>{this.getStringValue(content.title)}</h1>
+          <h1 data-l10n-id={content.title.string_id}
+            id="trailheadHeader">{this.getStringValue(content.title)}</h1>
           {content.subtitle &&
             <p data-l10n-id={content.subtitle.string_id}>{this.getStringValue(content.subtitle)}</p>
           }
           <ul className="trailheadBenefits">
             {content.benefits.map(item => (
               <li key={item.id} className={item.id}>
                 <h3 data-l10n-id={item.title.string_id}>{this.getStringValue(item.title)}</h3>
                 <p data-l10n-id={item.text.string_id}>{this.getStringValue(item.text)}</p>
               </li>
             ))}
           </ul>
-          <a className="trailheadLearn" data-l10n-id={content.learn.text.string_id} href={content.learn.url}>
+          <a className="trailheadLearn" data-l10n-id={content.learn.text.string_id} href={this.addUtmParams(content.learn.url)}>
             {this.getStringValue(content.learn.text)}
           </a>
         </div>
         <div className="trailheadForm">
           <h3 data-l10n-id={content.form.title.string_id}>{this.getStringValue(content.form.title)}</h3>
           <p data-l10n-id={content.form.text.string_id}>{this.getStringValue(content.form.text)}</p>
           <form method="get" action={this.props.fxaEndpoint} target="_blank" rel="noopener noreferrer" onSubmit={this.onSubmit}>
             <input name="service" type="hidden" value="sync" />
             <input name="action" type="hidden" value="email" />
             <input name="context" type="hidden" value="fx_desktop_v3" />
             <input name="entrypoint" type="hidden" value="activity-stream-firstrun" />
             <input name="utm_source" type="hidden" value="activity-stream" />
             <input name="utm_campaign" type="hidden" value="firstrun" />
-            <input name="utm_term" type="hidden" value="trailhead" />
+            <input name="utm_term" type="hidden" value={utm_term} />
             <input name="flow_id" type="hidden" value={this.state.flowId} />
             <input name="flow_begin_time" type="hidden" value={this.state.flowBeginTime} />
+            <input name="style" type="hidden" value="trailhead" />
             <p data-l10n-id="onboarding-join-form-email-error" className="error" />
             <input
               data-l10n-id={content.form.email.string_id}
               placeholder={this.getStringValue(content.form.email)}
               name="email"
               type="email"
               required="true"
               onInvalid={this.onInputInvalid}
               onChange={this.onInputChange} />
             <p className="trailheadTerms" data-l10n-id="onboarding-join-form-legal">
               <a data-l10n-name="terms"
-                href="https://accounts.firefox.com/legal/terms" />
+                href={this.addUtmParams("https://accounts.firefox.com/legal/terms")} />
               <a data-l10n-name="privacy"
-                href="https://accounts.firefox.com/legal/privacy" />
+                href={this.addUtmParams("https://accounts.firefox.com/legal/privacy")} />
             </p>
             <button data-l10n-id={content.form.button.string_id} type="submit">
               {this.getStringValue(content.form.button)}
             </button>
           </form>
         </div>
       </div>
 
       <button className="trailheadStart"
         data-l10n-id={content.skipButton.string_id}
+        onBlur={this.onStartBlur}
         onClick={this.closeModal}>{this.getStringValue(content.skipButton)}</button>
     </ModalOverlayWrapper> : null}
     {(cards && cards.length) ? <div className={`trailheadCards ${this.state.showCardPanel ? "expanded" : "collapsed"}`}>
-      <div className="trailheadCardsInner">
+      <div className="trailheadCardsInner"
+        aria-hidden={!this.state.showCards}>
         <h1 data-l10n-id="onboarding-welcome-header" />
         <div className={`trailheadCardGrid${this.state.showCards ? " show" : ""}`}>
         {cards.map(card => (
           <OnboardingCard key={card.id}
             className="trailheadCard"
             sendUserActionTelemetry={props.sendUserActionTelemetry}
-            onAction={props.onAction}
+            onAction={this.onCardAction}
             UISurface="TRAILHEAD"
             {...card} />
         ))}
         </div>
         {this.state.showCardPanel &&
           <button
             className="icon icon-dismiss" onClick={this.hideCardPanel}
             title={props.intl.formatMessage({id: "menu_action_dismiss"})}
--- a/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss
+++ b/browser/components/newtab/content-src/asrouter/templates/Trailhead/_Trailhead.scss
@@ -5,21 +5,16 @@
   $benefit-icon-spacing-small: $benefit-icon-size-small + 12px;
   $responsive-breakpoint: 850px;
 
   background: url('#{$image-path}trailhead/accounts-form-bg.jpg') bottom / cover;
   color: $white;
   height: auto;
   top: 100px;
 
-  @media (max-height: 700px) {
-    position: absolute;
-    top: 20px;
-  }
-
   a {
     color: $white;
     text-decoration: underline;
   }
 
   input,
   button {
     border-radius: 4px;
@@ -178,28 +173,48 @@
       .error.active {
         inset-inline-start: 0;
         z-index: 0;
       }
     }
 
     button,
     input {
-      border: 0;
       width: 100%;
     }
 
     input {
       background-color: $white;
+      border: 1px solid $grey-50;
+      box-shadow: none;
       color: $grey-70;
       font-size: 15px;
+      transition: border-color 150ms, box-shadow 150ms;
+
+      &:hover {
+        border-color: $grey-90;
+      }
+
+      &:focus {
+        border-color: $blue-50;
+        box-shadow: 0 0 0 3px $email-input-focus;
+      }
+
+      &.invalid {
+        border-color: $red-60;
+      }
+
+      &.invalid:focus {
+        box-shadow: 0 0 0 3px $email-input-invalid;
+      }
     }
 
     button {
       background-color: $blue-60;
+      border: 0;
       cursor: pointer;
       display: block;
       font-size: 15px;
       font-weight: 400;
       padding: 14px;
 
       &:hover,
       &:focus {
@@ -396,14 +411,19 @@
     }
   }
 
   .asrouter-toggle {
     position: absolute;
   }
 }
 
-// If the window is too short, we need to allow scrolling so user can get to Start Browsing button.
-@media (max-height: 700px) {
+// If the window is too short or narrow, we need to allow scrolling so user can get to Start Browsing button.
+@media (max-height: 760px), (max-width: 924px) {
   .activity-stream.welcome.inline-onboarding {
     overflow: auto;
   }
+
+  .trailhead {
+    position: absolute;
+    top: 20px;
+  }
 }
--- a/browser/components/newtab/content-src/components/DiscoveryStreamBase/DiscoveryStreamBase.jsx
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamBase/DiscoveryStreamBase.jsx
@@ -165,24 +165,21 @@ export class _DiscoveryStreamBase extend
     if (this.props.DiscoveryStream.layout !== oldProps.DiscoveryStream.layout) {
       rickRollCache = [];
     }
   }
 
   render() {
     // Select layout render data by adding spocs and position to recommendations
     const {layoutRender, spocsFill} = selectLayoutRender(this.props.DiscoveryStream, this.props.Prefs.values, rickRollCache);
-    const {config, feeds, spocs} = this.props.DiscoveryStream;
-    if (!spocs.loaded || !feeds.loaded) {
-      return null;
-    }
+    const {config, spocs, feeds} = this.props.DiscoveryStream;
 
     // Send SPOCS Fill if any. Note that it should not send it again if the same
     // page gets re-rendered by state changes.
-    if (spocsFill.length && !this._spocsFillSent) {
+    if (spocs.loaded && feeds.loaded && spocsFill.length && !this._spocsFillSent) {
       this.props.dispatch(ac.DiscoveryStreamSpocsFill({spoc_fills: spocsFill}));
       this._spocsFillSent = true;
     }
 
     // Allow rendering without extracting special components
     if (!config.collapsible) {
       return this.renderLayout(layoutRender);
     }
@@ -203,16 +200,20 @@ export class _DiscoveryStreamBase extend
         }
       }
       return null;
     };
 
     // Get "topstories" Section state for default values
     const topStories = this.props.Sections.find(s => s.id === "topstories");
 
+    if (!topStories) {
+      return null;
+    }
+
     // Extract TopSites to render before the rest and Message to use for header
     const topSites = extractComponent("TopSites");
     const message = extractComponent("Message") || {
       header: {
         link_text: topStories.learnMore.link.id,
         link_url: topStories.learnMore.link.href,
         title: topStories.title,
       },
@@ -250,16 +251,19 @@ export class _DiscoveryStreamBase extend
   renderLayout(layoutRender) {
     const styles = [];
     return (
       <div className="discovery-stream ds-layout">
         {layoutRender.map((row, rowIndex) => (
           <div key={`row-${rowIndex}`} className={`ds-column ds-column-${row.width}`}>
             <div className="ds-column-grid">
               {row.components.map((component, componentIndex) => {
+                if (!component) {
+                  return null;
+                }
                 styles[rowIndex] = [...styles[rowIndex] || [], component.styles];
                 return (<div key={`component-${componentIndex}`}>
                   {this.renderComponent(component, row.width)}
                 </div>);
               })}
             </div>
           </div>
         ))}
--- a/browser/components/newtab/content-src/components/DiscoveryStreamComponents/CardGrid/_CardGrid.scss
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/CardGrid/_CardGrid.scss
@@ -44,17 +44,17 @@
     }
   }
 
   &.ds-card-grid-no-border {
     .ds-card {
       background: none;
 
       .meta {
-        padding: 16px 0;
+        padding: 12px 0;
       }
     }
   }
 
   // "2/3 width layout"
   .ds-column-5 &,
   .ds-column-6 &,
   .ds-column-7 &,
@@ -74,16 +74,16 @@
 
       .title {
         font-size: 17px;
         line-height: 24px;
       }
     }
 
     &.ds-card-grid-divisible-by-4 .title {
-      @include limit-visibile-lines(3, 20, 14);
+      @include limit-visibile-lines(3, 20, 15);
     }
   }
 
   &.empty {
     grid-template-columns: auto;
   }
 }
--- a/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSCard/_DSCard.scss
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/DSCard/_DSCard.scss
@@ -67,57 +67,58 @@
       @include ds-fade-in;
     }
   }
 
   .meta {
     display: flex;
     flex-direction: column;
     flex-grow: 1;
-    padding: 16px;
+    padding: 12px;
 
     .info-wrap {
       flex-grow: 1;
+      margin: 0 0 12px;
     }
 
     .title {
       // show only 3 lines of copy
       @include limit-visibile-lines(3, $header-line-height, $header-font-size);
       font-weight: 600;
     }
 
     .excerpt {
       // show only 3 lines of copy
       @include limit-visibile-lines(3, $excerpt-line-height, $excerpt-font-size);
     }
 
     .context,
     .source {
       @include dark-theme-only {
-        color: $teal-10;
+        color: $grey-40;
       }
 
       font-size: 13px;
-      color: $teal-80;
+      color: $grey-50;
     }
   }
 
   header {
     @include dark-theme-only {
       color: $grey-10;
     }
 
     line-height: $header-line-height * 1px;
     font-size: $header-font-size * 1px;
     color: $grey-90;
   }
 
   p {
     @include dark-theme-only {
-      color: $grey-30;
+      color: $grey-10;
     }
 
     font-size: $excerpt-font-size * 1px;
     line-height: $excerpt-line-height * 1px;
-    color: $grey-50;
-    margin: 8px 0 0;
+    color: $grey-90;
+    margin: 0;
   }
 }
--- a/browser/components/newtab/content-src/components/DiscoveryStreamComponents/Hero/_Hero.scss
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/Hero/_Hero.scss
@@ -10,17 +10,22 @@
 
   p {
     line-height: 1.538;
     margin: 8px 0;
   }
 
   .excerpt {
     @include limit-visibile-lines(3, 20, 14);
-    margin: 4px 0 8px;
+    @include dark-theme-only {
+      color: $grey-10;
+    }
+
+    color: $grey-90;
+    margin: 0 0 10px;
   }
 
   .ds-card:not(.placeholder) {
     border: 0;
     padding-bottom: 20px;
 
     p {
       margin-top: 4px;
@@ -114,34 +119,34 @@
 
       header {
         @include dark-theme-only {
           color: $white;
         }
 
         @include limit-visibile-lines(4, 28, 22);
         color: $grey-90;
-        margin-bottom: 8px;
+        margin-bottom: 0;
       }
 
       .context {
         @include dark-theme-only {
           color: $teal-10;
         }
 
         color: $teal-70;
       }
 
       .source {
         @include dark-theme-only {
-          color: $teal-10;
+          color: $grey-40;
         }
 
         font-size: 13px;
-        color: $teal-80;
+        color: $grey-50;
         margin-bottom: 0;
         overflow-x: hidden;
         text-overflow: ellipsis;
       }
     }
   }
 
   // "2/3 width layout"
@@ -207,17 +212,17 @@
       display: flex;
       flex-direction: column;
 
       .img-wrapper {
         margin: 0;
       }
 
       .img {
-        margin-bottom: 16px;
+        margin-bottom: 12px;
         height: 0;
         padding-top: 50%; // 2:1 aspect ratio
       }
 
       .meta {
         flex-grow: 1;
         display: flex;
         padding: 0 24px 0 0;
--- a/browser/components/newtab/content-src/components/DiscoveryStreamComponents/List/_List.scss
+++ b/browser/components/newtab/content-src/components/DiscoveryStreamComponents/List/_List.scss
@@ -215,20 +215,20 @@
     line-height: $item-line-height * 1px;
     margin: 0;
   }
 
   .ds-list-item-info,
   .ds-list-item-context {
     @include limit-visibile-lines(1, $item-line-height, $item-font-size);
     @include dark-theme-only {
-      color: $teal-10;
+      color: $grey-40;
     }
 
-    color: $teal-80;
+    color: $grey-50;
     font-size: 13px;
     text-overflow: ellipsis;
   }
 
   .ds-list-item-title {
     font-weight: 600;
     margin-bottom: 4px;
   }
--- a/browser/components/newtab/content-src/lib/selectLayoutRender.js
+++ b/browser/components/newtab/content-src/lib/selectLayoutRender.js
@@ -1,54 +1,59 @@
 export const selectLayoutRender = (state, prefs, rickRollCache) => {
   const {layout, feeds, spocs} = state;
   let spocIndex = 0;
   let bufferRollCache = [];
   // Records the chosen and unchosen spocs by the probability selection.
   let chosenSpocs = new Set();
   let unchosenSpocs = new Set();
 
-  // rickRollCache stores random probability values for each spoc position. This cache is empty
-  // on page refresh and gets filled with random values on first render inside maybeInjectSpocs.
-  const isFirstRun = !rickRollCache.length;
+  function rollForSpocs(data, spocsConfig) {
+    const recommendations = [...data.recommendations];
+    for (let position of spocsConfig.positions) {
+      const spoc = spocs.data.spocs[spocIndex];
+      if (!spoc) {
+        break;
+      }
+
+      // Cache random number for a position
+      let rickRoll;
+      if (!rickRollCache.length) {
+        rickRoll = Math.random();
+        bufferRollCache.push(rickRoll);
+      } else {
+        rickRoll = rickRollCache.shift();
+        bufferRollCache.push(rickRoll);
+      }
+
+      if (rickRoll <= spocsConfig.probability) {
+        spocIndex++;
+        recommendations.splice(position.index, 0, spoc);
+        chosenSpocs.add(spoc);
+      } else {
+        unchosenSpocs.add(spoc);
+      }
+    }
+
+    return {
+      ...data,
+      recommendations,
+    };
+  }
 
   function maybeInjectSpocs(data, spocsConfig) {
-    if (data &&
-        spocsConfig && spocsConfig.positions && spocsConfig.positions.length &&
-        spocs.data.spocs && spocs.data.spocs.length) {
-      const recommendations = [...data.recommendations];
-      for (let position of spocsConfig.positions) {
-        const spoc = spocs.data.spocs[spocIndex];
-        if (!spoc) {
-          break;
-        }
-
-        // Cache random number for a position
-        let rickRoll;
-        if (isFirstRun) {
-          rickRoll = Math.random();
-          rickRollCache.push(rickRoll);
-        } else {
-          rickRoll = rickRollCache.shift();
-          bufferRollCache.push(rickRoll);
-        }
-
-        if (rickRoll <= spocsConfig.probability) {
-          spocIndex++;
-          recommendations.splice(position.index, 0, spoc);
-          chosenSpocs.add(spoc);
-        } else {
-          unchosenSpocs.add(spoc);
-        }
+    // Do we ever expect to possibly have a spoc.
+    if (data && spocsConfig && spocsConfig.positions && spocsConfig.positions.length) {
+      // We expect a spoc, spocs are loaded, but the server returned no spocs.
+      if (!spocs.data.spocs || !spocs.data.spocs.length) {
+        return data;
       }
 
-      return {
-        ...data,
-        recommendations,
-      };
+      // We expect a spoc, spocs are loaded, and we have spocs available.
+      return rollForSpocs(data, spocsConfig);
     }
 
     return data;
   }
 
   const positions = {};
   const DS_COMPONENTS = ["Message", "SectionTitle", "Navigation",
     "CardGrid", "Hero", "HorizontalRule", "List"];
@@ -58,66 +63,83 @@ export const selectLayoutRender = (state
   if (!prefs["feeds.topsites"]) {
     filterArray.push("TopSites");
   }
 
   if (!prefs["feeds.section.topstories"]) {
     filterArray.push(...DS_COMPONENTS);
   }
 
-  const layoutRender = layout.map(row => ({
-    ...row,
+  const handleComponent = component => {
+    positions[component.type] = positions[component.type] || 0;
+
+    let {data} = feeds.data[component.feed.url];
 
-    // Loops through desired components and adds a .data property
-    // containing data from feeds
-    components: row.components.filter(c => !filterArray.includes(c.type)).map(component => {
-      if (!component.feed || !feeds.data[component.feed.url]) {
-        return component;
-      }
+    if (component && component.properties && component.properties.offset) {
+      data = {
+        ...data,
+        recommendations: data.recommendations.slice(component.properties.offset),
+      };
+    }
+
+    data = maybeInjectSpocs(data, component.spocs);
 
-      positions[component.type] = positions[component.type] || 0;
-
-      let {data} = feeds.data[component.feed.url];
+    let items = 0;
+    if (component.properties && component.properties.items) {
+      items = Math.min(component.properties.items, data.recommendations.length);
+    }
 
-      if (component && component.properties && component.properties.offset) {
-        data = {
-          ...data,
-          recommendations: data.recommendations.slice(component.properties.offset),
-        };
-      }
+    // loop through a component items
+    // Store the items position sequentially for multiple components of the same type.
+    // Example: A second card grid starts pos offset from the last card grid.
+    for (let i = 0; i < items; i++) {
+      data.recommendations[i].pos = positions[component.type]++;
+    }
+
+    return {...component, data};
+  };
 
-      data = maybeInjectSpocs(data, component.spocs);
-
-      // If empty, fill rickRollCache with random probability values from bufferRollCache
-      if (!rickRollCache.length) {
-        rickRollCache.push(...bufferRollCache);
-      }
-
-      let items = 0;
-      if (component.properties && component.properties.items) {
-        items = Math.min(component.properties.items, data.recommendations.length);
+  const renderLayout = () => {
+    const renderedLayoutArray = [];
+    for (const row of layout.filter(r => r.components.length)) {
+      let components = [];
+      renderedLayoutArray.push({
+        ...row,
+        components,
+      });
+      for (const component of row.components.filter(c => !filterArray.includes(c.type))) {
+        if (component.feed) {
+          const spocsConfig = component.spocs;
+          // Are we still waiting on a feed/spocs, render what we have, and bail out early.
+          if (!feeds.data[component.feed.url] ||
+            (spocsConfig && spocsConfig.positions && spocsConfig.positions.length && !spocs.loaded)) {
+            return renderedLayoutArray;
+          }
+          components.push(handleComponent(component));
+        } else {
+          components.push(component);
+        }
       }
+    }
+    return renderedLayoutArray;
+  };
 
-      // loop through a component items
-      // Store the items position sequentially for multiple components of the same type.
-      // Example: A second card grid starts pos offset from the last card grid.
-      for (let i = 0; i < items; i++) {
-        data.recommendations[i].pos = positions[component.type]++;
-      }
+  const layoutRender = renderLayout(layout);
 
-      return {...component, data};
-    }),
-  })).filter(row => row.components.length);
+  // If empty, fill rickRollCache with random probability values from bufferRollCache
+  if (!rickRollCache.length) {
+    rickRollCache.push(...bufferRollCache);
+  }
 
   // Generate the payload for the SPOCS Fill ping. Note that a SPOC could be rejected
   // by the `probability_selection` first, then gets chosen for the next position. For
   // all other SPOCS that never went through the probabilistic selection, its reason will
   // be "out_of_position".
   let spocsFill = [];
-  if (spocs.data.spocs) {
+  if (spocs.loaded && feeds.loaded && spocs.data.spocs) {
     const chosenSpocsFill = [...chosenSpocs]
       .map(spoc => ({id: spoc.id, reason: "n/a", displayed: 1, full_recalc: 0}));
     const unchosenSpocsFill = [...unchosenSpocs]
       .filter(spoc => !chosenSpocs.has(spoc))
       .map(spoc => ({id: spoc.id, reason: "probability_selection", displayed: 0, full_recalc: 0}));
     const outOfPositionSpocsFill = spocs.data.spocs.slice(spocIndex)
       .filter(spoc => !unchosenSpocs.has(spoc))
       .map(spoc => ({id: spoc.id, reason: "out_of_position", displayed: 0, full_recalc: 0}));
--- a/browser/components/newtab/content-src/styles/_theme.scss
+++ b/browser/components/newtab/content-src/styles/_theme.scss
@@ -143,12 +143,12 @@ body {
     // Snippets
     --newtab-snippets-background-color: #{$grey-70};
     --newtab-snippets-hairline-color: #{$white-10};
 
     // Trailhead
     --trailhead-header-text-color: #{$white-60};
     --trailhead-cards-background-color: #{$grey-90-10};
     --trailhead-card-button-background-color: #{$grey-90-30};
-    --trailhead-card-button-background-hover-color: #{$grey-90-40};
-    --trailhead-card-button-background-active-color: #{$grey-90-50};
+    --trailhead-card-button-background-hover-color: #{$grey-90-50};
+    --trailhead-card-button-background-active-color: #{$grey-90-70};
   }
 }
--- a/browser/components/newtab/css/activity-stream-linux.css
+++ b/browser/components/newtab/css/activity-stream-linux.css
@@ -115,18 +115,18 @@ body {
     --newtab-card-hairline-color: rgba(249, 249, 250, 0.1);
     --newtab-card-placeholder-color: #4A4A4F;
     --newtab-card-shadow: 0 1px 8px 0 rgba(12, 12, 13, 0.2);
     --newtab-snippets-background-color: #38383D;
     --newtab-snippets-hairline-color: rgba(255, 255, 255, 0.1);
     --trailhead-header-text-color: rgba(255, 255, 255, 0.6);
     --trailhead-cards-background-color: rgba(12, 12, 13, 0.1);
     --trailhead-card-button-background-color: rgba(12, 12, 13, 0.3);
-    --trailhead-card-button-background-hover-color: rgba(12, 12, 13, 0.4);
-    --trailhead-card-button-background-active-color: rgba(12, 12, 13, 0.5); }
+    --trailhead-card-button-background-hover-color: rgba(12, 12, 13, 0.5);
+    --trailhead-card-button-background-active-color: rgba(12, 12, 13, 0.7); }
 
 .icon {
   background-position: center center;
   background-repeat: no-repeat;
   background-size: 16px;
   -moz-context-properties: fill;
   display: inline-block;
   fill: var(--newtab-icon-primary-color);
@@ -1915,17 +1915,17 @@ main {
       outline: none; }
       [lwt-newtab-brighttext] .ds-card-grid.ds-card-grid-border .ds-card:not(.placeholder):hover {
         box-shadow: 0 0 0 5px #4A4A4F; }
     .ds-card-grid.ds-card-grid-border .ds-card:not(.placeholder) .img-wrapper .img img {
       border-radius: 4px 4px 0 0; }
   .ds-card-grid.ds-card-grid-no-border .ds-card {
     background: none; }
     .ds-card-grid.ds-card-grid-no-border .ds-card .meta {
-      padding: 16px 0; }
+      padding: 12px 0; }
   .ds-column-5 .ds-card-grid,
   .ds-column-6 .ds-card-grid,
   .ds-column-7 .ds-card-grid,
   .ds-column-8 .ds-card-grid {
     grid-template-columns: repeat(2, 1fr); }
   .ds-column-9 .ds-card-grid,
   .ds-column-10 .ds-card-grid,
   .ds-column-11 .ds-card-grid,
@@ -1941,36 +1941,39 @@ main {
       .ds-column-11 .ds-card-grid.ds-card-grid-divisible-by-3 .title,
       .ds-column-12 .ds-card-grid.ds-card-grid-divisible-by-3 .title {
         font-size: 17px;
         line-height: 24px; }
     .ds-column-9 .ds-card-grid.ds-card-grid-divisible-by-4 .title,
     .ds-column-10 .ds-card-grid.ds-card-grid-divisible-by-4 .title,
     .ds-column-11 .ds-card-grid.ds-card-grid-divisible-by-4 .title,
     .ds-column-12 .ds-card-grid.ds-card-grid-divisible-by-4 .title {
-      font-size: 14px;
+      font-size: 15px;
       line-height: 20px;
-      max-height: 4.28571em;
+      max-height: 4em;
       overflow: hidden; }
   .ds-card-grid.empty {
     grid-template-columns: auto; }
 
 .ds-hero {
   position: relative; }
   .ds-hero header {
     font-weight: 600; }
   .ds-hero p {
     line-height: 1.538;
     margin: 8px 0; }
   .ds-hero .excerpt {
     font-size: 14px;
     line-height: 20px;
     max-height: 4.28571em;
     overflow: hidden;
-    margin: 4px 0 8px; }
+    color: #0C0C0D;
+    margin: 0 0 10px; }
+    [lwt-newtab-brighttext] .ds-hero .excerpt {
+      color: #F9F9FA; }
   .ds-hero .ds-card:not(.placeholder) {
     border: 0;
     padding-bottom: 20px; }
     .ds-hero .ds-card:not(.placeholder) p {
       margin-top: 4px; }
     .ds-hero .ds-card:not(.placeholder):hover {
       border: 0;
       box-shadow: none;
@@ -2027,31 +2030,31 @@ main {
       flex-direction: column;
       justify-content: space-between; }
       .ds-hero .wrapper .meta header {
         font-size: 22px;
         line-height: 28px;
         max-height: 5.09091em;
         overflow: hidden;
         color: #0C0C0D;
-        margin-bottom: 8px; }
+        margin-bottom: 0; }
         [lwt-newtab-brighttext] .ds-hero .wrapper .meta header {
           color: #FFF; }
       .ds-hero .wrapper .meta .context {
         color: #008EA4; }
         [lwt-newtab-brighttext] .ds-hero .wrapper .meta .context {
           color: #A7FFFE; }
       .ds-hero .wrapper .meta .source {
         font-size: 13px;
-        color: #005A71;
+        color: #737373;
         margin-bottom: 0;
         overflow-x: hidden;
         text-overflow: ellipsis; }
         [lwt-newtab-brighttext] .ds-hero .wrapper .meta .source {
-          color: #A7FFFE; }
+          color: #B1B1B3; }
   .ds-column-5 .ds-hero .wrapper,
   .ds-column-6 .ds-hero .wrapper,
   .ds-column-7 .ds-hero .wrapper,
   .ds-column-8 .ds-hero .wrapper {
     display: grid;
     grid-template-columns: repeat(2, 1fr);
     grid-column-gap: 24px; }
     .ds-column-5 .ds-hero .wrapper .img-wrapper,
@@ -2125,17 +2128,17 @@ main {
       .ds-column-10 .ds-hero .wrapper .img-wrapper,
       .ds-column-11 .ds-hero .wrapper .img-wrapper,
       .ds-column-12 .ds-hero .wrapper .img-wrapper {
         margin: 0; }
       .ds-column-9 .ds-hero .wrapper .img,
       .ds-column-10 .ds-hero .wrapper .img,
       .ds-column-11 .ds-hero .wrapper .img,
       .ds-column-12 .ds-hero .wrapper .img {
-        margin-bottom: 16px;
+        margin-bottom: 12px;
         height: 0;
         padding-top: 50%; }
       .ds-column-9 .ds-hero .wrapper .meta,
       .ds-column-10 .ds-hero .wrapper .meta,
       .ds-column-11 .ds-hero .wrapper .meta,
       .ds-column-12 .ds-hero .wrapper .meta {
         flex-grow: 1;
         display: flex;
@@ -2361,22 +2364,22 @@ main {
     line-height: 20px;
     margin: 0; }
   .ds-list-item .ds-list-item-info,
   .ds-list-item .ds-list-item-context {
     font-size: 14px;
     line-height: 20px;
     max-height: 1.42857em;
     overflow: hidden;
-    color: #005A71;
+    color: #737373;
     font-size: 13px;
     text-overflow: ellipsis; }
     [lwt-newtab-brighttext] .ds-list-item .ds-list-item-info, [lwt-newtab-brighttext]
     .ds-list-item .ds-list-item-context {
-      color: #A7FFFE; }
+      color: #B1B1B3; }
   .ds-list-item .ds-list-item-title {
     font-weight: 600;
     margin-bottom: 4px; }
   .ds-list-item .ds-list-item-text {
     display: flex;
     flex-direction: column;
     justify-content: space-between; }
   .ds-list-item .ds-list-image {
@@ -2620,50 +2623,51 @@ main {
       box-shadow: 0 0 0 1px #0A84FF inset, 0 0 0 1px #0A84FF, 0 0 0 5px rgba(10, 132, 255, 0.3);
       transition: box-shadow 150ms;
       border-radius: 4px;
       outline: none; }
   .ds-card .meta {
     display: flex;
     flex-direction: column;
     flex-grow: 1;
-    padding: 16px; }
+    padding: 12px; }
     .ds-card .meta .info-wrap {
-      flex-grow: 1; }
+      flex-grow: 1;
+      margin: 0 0 12px; }
     .ds-card .meta .title {
       font-size: 17px;
       line-height: 24px;
       max-height: 4.23529em;
       overflow: hidden;
       font-weight: 600; }
     .ds-card .meta .excerpt {
       font-size: 14px;
       line-height: 20px;
       max-height: 4.28571em;
       overflow: hidden; }
     .ds-card .meta .context,
     .ds-card .meta .source {
       font-size: 13px;
-      color: #005A71; }
+      color: #737373; }
       [lwt-newtab-brighttext] .ds-card .meta .context, [lwt-newtab-brighttext]
       .ds-card .meta .source {
-        color: #A7FFFE; }
+        color: #B1B1B3; }
   .ds-card header {
     line-height: 24px;
     font-size: 17px;
     color: #0C0C0D; }
     [lwt-newtab-brighttext] .ds-card header {
       color: #F9F9FA; }
   .ds-card p {
     font-size: 14px;
     line-height: 20px;
-    color: #737373;
-    margin: 8px 0 0; }
+    color: #0C0C0D;
+    margin: 0; }
     [lwt-newtab-brighttext] .ds-card p {
-      color: #D7D7DB; }
+      color: #F9F9FA; }
 
 .ds-image {
   display: block;
   position: relative; }
   .ds-image img,
   .ds-image .broken-image {
     background-color: var(--newtab-card-placeholder-color);
     position: absolute;
@@ -3704,20 +3708,16 @@ a.firstrun-link {
     opacity: 1;
     transform: translateY(0); } }
 
 .trailhead {
   background: url("../data/content/assets/trailhead/accounts-form-bg.jpg") bottom/cover;
   color: #FFF;
   height: auto;
   top: 100px; }
-  @media (max-height: 700px) {
-    .trailhead {
-      position: absolute;
-      top: 20px; } }
   .trailhead a {
     color: #FFF;
     text-decoration: underline; }
   .trailhead input,
   .trailhead button {
     border-radius: 4px;
     padding: 10px; }
   .trailhead .trailheadInner {
@@ -3815,24 +3815,36 @@ a.firstrun-link {
         line-height: 20px; }
     .trailhead .trailheadForm form {
       position: relative; }
       .trailhead .trailheadForm form .error.active {
         inset-inline-start: 0;
         z-index: 0; }
     .trailhead .trailheadForm button,
     .trailhead .trailheadForm input {
-      border: 0;
       width: 100%; }
     .trailhead .trailheadForm input {
       background-color: #FFF;
+      border: 1px solid #737373;
+      box-shadow: none;
       color: #38383D;
-      font-size: 15px; }
+      font-size: 15px;
+      transition: border-color 150ms, box-shadow 150ms; }
+      .trailhead .trailheadForm input:hover {
+        border-color: #0C0C0D; }
+      .trailhead .trailheadForm input:focus {
+        border-color: #0A84FF;
+        box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3); }
+      .trailhead .trailheadForm input.invalid {
+        border-color: #D70022; }
+      .trailhead .trailheadForm input.invalid:focus {
+        box-shadow: 0 0 0 3px rgba(215, 0, 34, 0.3); }
     .trailhead .trailheadForm button {
       background-color: #0060DF;
+      border: 0;
       cursor: pointer;
       display: block;
       font-size: 15px;
       font-weight: 400;
       padding: 14px; }
       .trailhead .trailheadForm button:hover, .trailhead .trailheadForm button:focus {
         background-color: #0250BB; }
       .trailhead .trailheadForm button:focus {
@@ -3961,11 +3973,14 @@ a.firstrun-link {
 .inline-onboarding .outer-wrapper {
   position: relative; }
   .inline-onboarding .outer-wrapper .prefs-button button {
     position: absolute; }
 
 .inline-onboarding .asrouter-toggle {
   position: absolute; }
 
-@media (max-height: 700px) {
+@media (max-height: 760px), (max-width: 924px) {
   .activity-stream.welcome.inline-onboarding {
-    overflow: auto; } }
+    overflow: auto; }
+  .trailhead {
+    position: absolute;
+    top: 20px; } }
--- a/browser/components/newtab/css/activity-stream-mac.css
+++ b/browser/components/newtab/css/activity-stream-mac.css
@@ -118,18 +118,18 @@ body {
     --newtab-card-hairline-color: rgba(249, 249, 250, 0.1);
     --newtab-card-placeholder-color: #4A4A4F;
     --newtab-card-shadow: 0 1px 8px 0 rgba(12, 12, 13, 0.2);
     --newtab-snippets-background-color: #38383D;
     --newtab-snippets-hairline-color: rgba(255, 255, 255, 0.1);
     --trailhead-header-text-color: rgba(255, 255, 255, 0.6);
     --trailhead-cards-background-color: rgba(12, 12, 13, 0.1);
     --trailhead-card-button-background-color: rgba(12, 12, 13, 0.3);
-    --trailhead-card-button-background-hover-color: rgba(12, 12, 13, 0.4);
-    --trailhead-card-button-background-active-color: rgba(12, 12, 13, 0.5); }
+    --trailhead-card-button-background-hover-color: rgba(12, 12, 13, 0.5);
+    --trailhead-card-button-background-active-color: rgba(12, 12, 13, 0.7); }
 
 .icon {
   background-position: center center;
   background-repeat: no-repeat;
   background-size: 16px;
   -moz-context-properties: fill;
   display: inline-block;
   fill: var(--newtab-icon-primary-color);
@@ -1918,17 +1918,17 @@ main {
       outline: none; }
       [lwt-newtab-brighttext] .ds-card-grid.ds-card-grid-border .ds-card:not(.placeholder):hover {
         box-shadow: 0 0 0 5px #4A4A4F; }
     .ds-card-grid.ds-card-grid-border .ds-card:not(.placeholder) .img-wrapper .img img {
       border-radius: 4px 4px 0 0; }
   .ds-card-grid.ds-card-grid-no-border .ds-card {
     background: none; }
     .ds-card-grid.ds-card-grid-no-border .ds-card .meta {
-      padding: 16px 0; }
+      padding: 12px 0; }
   .ds-column-5 .ds-card-grid,
   .ds-column-6 .ds-card-grid,
   .ds-column-7 .ds-card-grid,
   .ds-column-8 .ds-card-grid {
     grid-template-columns: repeat(2, 1fr); }
   .ds-column-9 .ds-card-grid,
   .ds-column-10 .ds-card-grid,
   .ds-column-11 .ds-card-grid,
@@ -1944,36 +1944,39 @@ main {
       .ds-column-11 .ds-card-grid.ds-card-grid-divisible-by-3 .title,
       .ds-column-12 .ds-card-grid.ds-card-grid-divisible-by-3 .title {
         font-size: 17px;
         line-height: 24px; }
     .ds-column-9 .ds-card-grid.ds-card-grid-divisible-by-4 .title,
     .ds-column-10 .ds-card-grid.ds-card-grid-divisible-by-4 .title,
     .ds-column-11 .ds-card-grid.ds-card-grid-divisible-by-4 .title,
     .ds-column-12 .ds-card-grid.ds-card-grid-divisible-by-4 .title {
-      font-size: 14px;
+      font-size: 15px;
       line-height: 20px;
-      max-height: 4.28571em;
+      max-height: 4em;
       overflow: hidden; }
   .ds-card-grid.empty {
     grid-template-columns: auto; }
 
 .ds-hero {
   position: relative; }
   .ds-hero header {
     font-weight: 600; }
   .ds-hero p {
     line-height: 1.538;
     margin: 8px 0; }
   .ds-hero .excerpt {
     font-size: 14px;
     line-height: 20px;
     max-height: 4.28571em;
     overflow: hidden;
-    margin: 4px 0 8px; }
+    color: #0C0C0D;
+    margin: 0 0 10px; }
+    [lwt-newtab-brighttext] .ds-hero .excerpt {
+      color: #F9F9FA; }
   .ds-hero .ds-card:not(.placeholder) {
     border: 0;
     padding-bottom: 20px; }
     .ds-hero .ds-card:not(.placeholder) p {
       margin-top: 4px; }
     .ds-hero .ds-card:not(.placeholder):hover {
       border: 0;
       box-shadow: none;
@@ -2030,31 +2033,31 @@ main {
       flex-direction: column;
       justify-content: space-between; }
       .ds-hero .wrapper .meta header {
         font-size: 22px;
         line-height: 28px;
         max-height: 5.09091em;
         overflow: hidden;
         color: #0C0C0D;
-        margin-bottom: 8px; }
+        margin-bottom: 0; }
         [lwt-newtab-brighttext] .ds-hero .wrapper .meta header {
           color: #FFF; }
       .ds-hero .wrapper .meta .context {
         color: #008EA4; }
         [lwt-newtab-brighttext] .ds-hero .wrapper .meta .context {
           color: #A7FFFE; }
       .ds-hero .wrapper .meta .source {
         font-size: 13px;
-        color: #005A71;
+        color: #737373;
         margin-bottom: 0;
         overflow-x: hidden;
         text-overflow: ellipsis; }
         [lwt-newtab-brighttext] .ds-hero .wrapper .meta .source {
-          color: #A7FFFE; }
+          color: #B1B1B3; }
   .ds-column-5 .ds-hero .wrapper,
   .ds-column-6 .ds-hero .wrapper,
   .ds-column-7 .ds-hero .wrapper,
   .ds-column-8 .ds-hero .wrapper {
     display: grid;
     grid-template-columns: repeat(2, 1fr);
     grid-column-gap: 24px; }
     .ds-column-5 .ds-hero .wrapper .img-wrapper,
@@ -2128,17 +2131,17 @@ main {
       .ds-column-10 .ds-hero .wrapper .img-wrapper,
       .ds-column-11 .ds-hero .wrapper .img-wrapper,
       .ds-column-12 .ds-hero .wrapper .img-wrapper {
         margin: 0; }
       .ds-column-9 .ds-hero .wrapper .img,
       .ds-column-10 .ds-hero .wrapper .img,
       .ds-column-11 .ds-hero .wrapper .img,
       .ds-column-12 .ds-hero .wrapper .img {
-        margin-bottom: 16px;
+        margin-bottom: 12px;
         height: 0;
         padding-top: 50%; }
       .ds-column-9 .ds-hero .wrapper .meta,
       .ds-column-10 .ds-hero .wrapper .meta,
       .ds-column-11 .ds-hero .wrapper .meta,
       .ds-column-12 .ds-hero .wrapper .meta {
         flex-grow: 1;
         display: flex;
@@ -2364,22 +2367,22 @@ main {
     line-height: 20px;
     margin: 0; }
   .ds-list-item .ds-list-item-info,
   .ds-list-item .ds-list-item-context {
     font-size: 14px;
     line-height: 20px;
     max-height: 1.42857em;
     overflow: hidden;
-    color: #005A71;
+    color: #737373;
     font-size: 13px;
     text-overflow: ellipsis; }
     [lwt-newtab-brighttext] .ds-list-item .ds-list-item-info, [lwt-newtab-brighttext]
     .ds-list-item .ds-list-item-context {
-      color: #A7FFFE; }
+      color: #B1B1B3; }
   .ds-list-item .ds-list-item-title {
     font-weight: 600;
     margin-bottom: 4px; }
   .ds-list-item .ds-list-item-text {
     display: flex;
     flex-direction: column;
     justify-content: space-between; }
   .ds-list-item .ds-list-image {
@@ -2623,50 +2626,51 @@ main {
       box-shadow: 0 0 0 1px #0A84FF inset, 0 0 0 1px #0A84FF, 0 0 0 5px rgba(10, 132, 255, 0.3);
       transition: box-shadow 150ms;
       border-radius: 4px;
       outline: none; }
   .ds-card .meta {
     display: flex;
     flex-direction: column;
     flex-grow: 1;
-    padding: 16px; }
+    padding: 12px; }
     .ds-card .meta .info-wrap {
-      flex-grow: 1; }
+      flex-grow: 1;
+      margin: 0 0 12px; }
     .ds-card .meta .title {
       font-size: 17px;
       line-height: 24px;
       max-height: 4.23529em;
       overflow: hidden;
       font-weight: 600; }
     .ds-card .meta .excerpt {
       font-size: 14px;
       line-height: 20px;
       max-height: 4.28571em;
       overflow: hidden; }
     .ds-card .meta .context,
     .ds-card .meta .source {
       font-size: 13px;
-      color: #005A71; }
+      color: #737373; }
       [lwt-newtab-brighttext] .ds-card .meta .context, [lwt-newtab-brighttext]
       .ds-card .meta .source {
-        color: #A7FFFE; }
+        color: #B1B1B3; }
   .ds-card header {
     line-height: 24px;
     font-size: 17px;
     color: #0C0C0D; }
     [lwt-newtab-brighttext] .ds-card header {
       color: #F9F9FA; }
   .ds-card p {
     font-size: 14px;
     line-height: 20px;
-    color: #737373;
-    margin: 8px 0 0; }
+    color: #0C0C0D;
+    margin: 0; }
     [lwt-newtab-brighttext] .ds-card p {
-      color: #D7D7DB; }
+      color: #F9F9FA; }
 
 .ds-image {
   display: block;
   position: relative; }
   .ds-image img,
   .ds-image .broken-image {
     background-color: var(--newtab-card-placeholder-color);
     position: absolute;
@@ -3707,20 +3711,16 @@ a.firstrun-link {
     opacity: 1;
     transform: translateY(0); } }
 
 .trailhead {
   background: url("../data/content/assets/trailhead/accounts-form-bg.jpg") bottom/cover;
   color: #FFF;
   height: auto;
   top: 100px; }
-  @media (max-height: 700px) {
-    .trailhead {
-      position: absolute;
-      top: 20px; } }
   .trailhead a {
     color: #FFF;
     text-decoration: underline; }
   .trailhead input,
   .trailhead button {
     border-radius: 4px;
     padding: 10px; }
   .trailhead .trailheadInner {
@@ -3818,24 +3818,36 @@ a.firstrun-link {
         line-height: 20px; }
     .trailhead .trailheadForm form {
       position: relative; }
       .trailhead .trailheadForm form .error.active {
         inset-inline-start: 0;
         z-index: 0; }
     .trailhead .trailheadForm button,
     .trailhead .trailheadForm input {
-      border: 0;
       width: 100%; }
     .trailhead .trailheadForm input {
       background-color: #FFF;
+      border: 1px solid #737373;
+      box-shadow: none;
       color: #38383D;
-      font-size: 15px; }
+      font-size: 15px;
+      transition: border-color 150ms, box-shadow 150ms; }
+      .trailhead .trailheadForm input:hover {
+        border-color: #0C0C0D; }
+      .trailhead .trailheadForm input:focus {
+        border-color: #0A84FF;
+        box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3); }
+      .trailhead .trailheadForm input.invalid {
+        border-color: #D70022; }
+      .trailhead .trailheadForm input.invalid:focus {
+        box-shadow: 0 0 0 3px rgba(215, 0, 34, 0.3); }
     .trailhead .trailheadForm button {
       background-color: #0060DF;
+      border: 0;
       cursor: pointer;
       display: block;
       font-size: 15px;
       font-weight: 400;
       padding: 14px; }
       .trailhead .trailheadForm button:hover, .trailhead .trailheadForm button:focus {
         background-color: #0250BB; }
       .trailhead .trailheadForm button:focus {
@@ -3964,11 +3976,14 @@ a.firstrun-link {
 .inline-onboarding .outer-wrapper {
   position: relative; }
   .inline-onboarding .outer-wrapper .prefs-button button {
     position: absolute; }
 
 .inline-onboarding .asrouter-toggle {
   position: absolute; }
 
-@media (max-height: 700px) {
+@media (max-height: 760px), (max-width: 924px) {
   .activity-stream.welcome.inline-onboarding {
-    overflow: auto; } }
+    overflow: auto; }
+  .trailhead {
+    position: absolute;
+    top: 20px; } }
--- a/browser/components/newtab/css/activity-stream-windows.css
+++ b/browser/components/newtab/css/activity-stream-windows.css
@@ -115,18 +115,18 @@ body {
     --newtab-card-hairline-color: rgba(249, 249, 250, 0.1);
     --newtab-card-placeholder-color: #4A4A4F;
     --newtab-card-shadow: 0 1px 8px 0 rgba(12, 12, 13, 0.2);
     --newtab-snippets-background-color: #38383D;
     --newtab-snippets-hairline-color: rgba(255, 255, 255, 0.1);
     --trailhead-header-text-color: rgba(255, 255, 255, 0.6);
     --trailhead-cards-background-color: rgba(12, 12, 13, 0.1);
     --trailhead-card-button-background-color: rgba(12, 12, 13, 0.3);
-    --trailhead-card-button-background-hover-color: rgba(12, 12, 13, 0.4);
-    --trailhead-card-button-background-active-color: rgba(12, 12, 13, 0.5); }
+    --trailhead-card-button-background-hover-color: rgba(12, 12, 13, 0.5);
+    --trailhead-card-button-background-active-color: rgba(12, 12, 13, 0.7); }
 
 .icon {
   background-position: center center;
   background-repeat: no-repeat;
   background-size: 16px;
   -moz-context-properties: fill;
   display: inline-block;
   fill: var(--newtab-icon-primary-color);
@@ -1915,17 +1915,17 @@ main {
       outline: none; }
       [lwt-newtab-brighttext] .ds-card-grid.ds-card-grid-border .ds-card:not(.placeholder):hover {
         box-shadow: 0 0 0 5px #4A4A4F; }
     .ds-card-grid.ds-card-grid-border .ds-card:not(.placeholder) .img-wrapper .img img {
       border-radius: 4px 4px 0 0; }
   .ds-card-grid.ds-card-grid-no-border .ds-card {
     background: none; }
     .ds-card-grid.ds-card-grid-no-border .ds-card .meta {
-      padding: 16px 0; }
+      padding: 12px 0; }
   .ds-column-5 .ds-card-grid,
   .ds-column-6 .ds-card-grid,
   .ds-column-7 .ds-card-grid,
   .ds-column-8 .ds-card-grid {
     grid-template-columns: repeat(2, 1fr); }
   .ds-column-9 .ds-card-grid,
   .ds-column-10 .ds-card-grid,
   .ds-column-11 .ds-card-grid,
@@ -1941,36 +1941,39 @@ main {
       .ds-column-11 .ds-card-grid.ds-card-grid-divisible-by-3 .title,
       .ds-column-12 .ds-card-grid.ds-card-grid-divisible-by-3 .title {
         font-size: 17px;
         line-height: 24px; }
     .ds-column-9 .ds-card-grid.ds-card-grid-divisible-by-4 .title,
     .ds-column-10 .ds-card-grid.ds-card-grid-divisible-by-4 .title,
     .ds-column-11 .ds-card-grid.ds-card-grid-divisible-by-4 .title,
     .ds-column-12 .ds-card-grid.ds-card-grid-divisible-by-4 .title {
-      font-size: 14px;
+      font-size: 15px;
       line-height: 20px;
-      max-height: 4.28571em;
+      max-height: 4em;
       overflow: hidden; }
   .ds-card-grid.empty {
     grid-template-columns: auto; }
 
 .ds-hero {
   position: relative; }
   .ds-hero header {
     font-weight: 600; }
   .ds-hero p {
     line-height: 1.538;
     margin: 8px 0; }
   .ds-hero .excerpt {
     font-size: 14px;
     line-height: 20px;
     max-height: 4.28571em;
     overflow: hidden;
-    margin: 4px 0 8px; }
+    color: #0C0C0D;
+    margin: 0 0 10px; }
+    [lwt-newtab-brighttext] .ds-hero .excerpt {
+      color: #F9F9FA; }
   .ds-hero .ds-card:not(.placeholder) {
     border: 0;
     padding-bottom: 20px; }
     .ds-hero .ds-card:not(.placeholder) p {
       margin-top: 4px; }
     .ds-hero .ds-card:not(.placeholder):hover {
       border: 0;
       box-shadow: none;
@@ -2027,31 +2030,31 @@ main {
       flex-direction: column;
       justify-content: space-between; }
       .ds-hero .wrapper .meta header {
         font-size: 22px;
         line-height: 28px;
         max-height: 5.09091em;
         overflow: hidden;
         color: #0C0C0D;
-        margin-bottom: 8px; }
+        margin-bottom: 0; }
         [lwt-newtab-brighttext] .ds-hero .wrapper .meta header {
           color: #FFF; }
       .ds-hero .wrapper .meta .context {
         color: #008EA4; }
         [lwt-newtab-brighttext] .ds-hero .wrapper .meta .context {
           color: #A7FFFE; }
       .ds-hero .wrapper .meta .source {
         font-size: 13px;
-        color: #005A71;
+        color: #737373;
         margin-bottom: 0;
         overflow-x: hidden;
         text-overflow: ellipsis; }
         [lwt-newtab-brighttext] .ds-hero .wrapper .meta .source {
-          color: #A7FFFE; }
+          color: #B1B1B3; }
   .ds-column-5 .ds-hero .wrapper,
   .ds-column-6 .ds-hero .wrapper,
   .ds-column-7 .ds-hero .wrapper,
   .ds-column-8 .ds-hero .wrapper {
     display: grid;
     grid-template-columns: repeat(2, 1fr);
     grid-column-gap: 24px; }
     .ds-column-5 .ds-hero .wrapper .img-wrapper,
@@ -2125,17 +2128,17 @@ main {
       .ds-column-10 .ds-hero .wrapper .img-wrapper,
       .ds-column-11 .ds-hero .wrapper .img-wrapper,
       .ds-column-12 .ds-hero .wrapper .img-wrapper {
         margin: 0; }
       .ds-column-9 .ds-hero .wrapper .img,
       .ds-column-10 .ds-hero .wrapper .img,
       .ds-column-11 .ds-hero .wrapper .img,
       .ds-column-12 .ds-hero .wrapper .img {
-        margin-bottom: 16px;
+        margin-bottom: 12px;
         height: 0;
         padding-top: 50%; }
       .ds-column-9 .ds-hero .wrapper .meta,
       .ds-column-10 .ds-hero .wrapper .meta,
       .ds-column-11 .ds-hero .wrapper .meta,
       .ds-column-12 .ds-hero .wrapper .meta {
         flex-grow: 1;
         display: flex;
@@ -2361,22 +2364,22 @@ main {
     line-height: 20px;
     margin: 0; }
   .ds-list-item .ds-list-item-info,
   .ds-list-item .ds-list-item-context {
     font-size: 14px;
     line-height: 20px;
     max-height: 1.42857em;
     overflow: hidden;
-    color: #005A71;
+    color: #737373;
     font-size: 13px;
     text-overflow: ellipsis; }
     [lwt-newtab-brighttext] .ds-list-item .ds-list-item-info, [lwt-newtab-brighttext]
     .ds-list-item .ds-list-item-context {
-      color: #A7FFFE; }
+      color: #B1B1B3; }
   .ds-list-item .ds-list-item-title {
     font-weight: 600;
     margin-bottom: 4px; }
   .ds-list-item .ds-list-item-text {
     display: flex;
     flex-direction: column;
     justify-content: space-between; }
   .ds-list-item .ds-list-image {
@@ -2620,50 +2623,51 @@ main {
       box-shadow: 0 0 0 1px #0A84FF inset, 0 0 0 1px #0A84FF, 0 0 0 5px rgba(10, 132, 255, 0.3);
       transition: box-shadow 150ms;
       border-radius: 4px;
       outline: none; }
   .ds-card .meta {
     display: flex;
     flex-direction: column;
     flex-grow: 1;
-    padding: 16px; }
+    padding: 12px; }
     .ds-card .meta .info-wrap {
-      flex-grow: 1; }
+      flex-grow: 1;
+      margin: 0 0 12px; }
     .ds-card .meta .title {
       font-size: 17px;
       line-height: 24px;
       max-height: 4.23529em;
       overflow: hidden;
       font-weight: 600; }
     .ds-card .meta .excerpt {
       font-size: 14px;
       line-height: 20px;
       max-height: 4.28571em;
       overflow: hidden; }
     .ds-card .meta .context,
     .ds-card .meta .source {
       font-size: 13px;
-      color: #005A71; }
+      color: #737373; }
       [lwt-newtab-brighttext] .ds-card .meta .context, [lwt-newtab-brighttext]
       .ds-card .meta .source {
-        color: #A7FFFE; }
+        color: #B1B1B3; }
   .ds-card header {
     line-height: 24px;
     font-size: 17px;
     color: #0C0C0D; }
     [lwt-newtab-brighttext] .ds-card header {
       color: #F9F9FA; }
   .ds-card p {
     font-size: 14px;
     line-height: 20px;
-    color: #737373;
-    margin: 8px 0 0; }
+    color: #0C0C0D;
+    margin: 0; }
     [lwt-newtab-brighttext] .ds-card p {
-      color: #D7D7DB; }
+      color: #F9F9FA; }
 
 .ds-image {
   display: block;
   position: relative; }
   .ds-image img,
   .ds-image .broken-image {
     background-color: var(--newtab-card-placeholder-color);
     position: absolute;
@@ -3704,20 +3708,16 @@ a.firstrun-link {
     opacity: 1;
     transform: translateY(0); } }
 
 .trailhead {
   background: url("../data/content/assets/trailhead/accounts-form-bg.jpg") bottom/cover;
   color: #FFF;
   height: auto;
   top: 100px; }
-  @media (max-height: 700px) {
-    .trailhead {
-      position: absolute;
-      top: 20px; } }
   .trailhead a {
     color: #FFF;
     text-decoration: underline; }
   .trailhead input,
   .trailhead button {
     border-radius: 4px;
     padding: 10px; }
   .trailhead .trailheadInner {
@@ -3815,24 +3815,36 @@ a.firstrun-link {
         line-height: 20px; }
     .trailhead .trailheadForm form {
       position: relative; }
       .trailhead .trailheadForm form .error.active {
         inset-inline-start: 0;
         z-index: 0; }
     .trailhead .trailheadForm button,
     .trailhead .trailheadForm input {
-      border: 0;
       width: 100%; }
     .trailhead .trailheadForm input {
       background-color: #FFF;
+      border: 1px solid #737373;
+      box-shadow: none;
       color: #38383D;
-      font-size: 15px; }
+      font-size: 15px;
+      transition: border-color 150ms, box-shadow 150ms; }
+      .trailhead .trailheadForm input:hover {
+        border-color: #0C0C0D; }
+      .trailhead .trailheadForm input:focus {
+        border-color: #0A84FF;
+        box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3); }
+      .trailhead .trailheadForm input.invalid {
+        border-color: #D70022; }
+      .trailhead .trailheadForm input.invalid:focus {
+        box-shadow: 0 0 0 3px rgba(215, 0, 34, 0.3); }
     .trailhead .trailheadForm button {
       background-color: #0060DF;
+      border: 0;
       cursor: pointer;
       display: block;
       font-size: 15px;
       font-weight: 400;
       padding: 14px; }
       .trailhead .trailheadForm button:hover, .trailhead .trailheadForm button:focus {
         background-color: #0250BB; }
       .trailhead .trailheadForm button:focus {
@@ -3961,11 +3973,14 @@ a.firstrun-link {
 .inline-onboarding .outer-wrapper {
   position: relative; }
   .inline-onboarding .outer-wrapper .prefs-button button {
     position: absolute; }
 
 .inline-onboarding .asrouter-toggle {
   position: absolute; }
 
-@media (max-height: 700px) {
+@media (max-height: 760px), (max-width: 924px) {
   .activity-stream.welcome.inline-onboarding {
-    overflow: auto; } }
+    overflow: auto; }
+  .trailhead {
+    position: absolute;
+    top: 20px; } }
--- a/browser/components/newtab/data/content/activity-stream.bundle.js
+++ b/browser/components/newtab/data/content/activity-stream.bundle.js
@@ -192,17 +192,17 @@ const globalImportContext = typeof Windo
 
 // Create an object that avoids accidental differing key/value pairs:
 // {
 //   INIT: "INIT",
 //   UNINIT: "UNINIT"
 // }
 const actionTypes = {};
 
-for (const type of ["ADDONS_INFO_REQUEST", "ADDONS_INFO_RESPONSE", "ARCHIVE_FROM_POCKET", "AS_ROUTER_INITIALIZED", "AS_ROUTER_PREF_CHANGED", "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", "DISCOVERY_STREAM_CONFIG_CHANGE", "DISCOVERY_STREAM_CONFIG_SETUP", "DISCOVERY_STREAM_CONFIG_SET_VALUE", "DISCOVERY_STREAM_FEEDS_UPDATE", "DISCOVERY_STREAM_IMPRESSION_STATS", "DISCOVERY_STREAM_LAYOUT_RESET", "DISCOVERY_STREAM_LAYOUT_UPDATE", "DISCOVERY_STREAM_LINK_BLOCKED", "DISCOVERY_STREAM_LOADED_CONTENT", "DISCOVERY_STREAM_OPT_OUT", "DISCOVERY_STREAM_SPOCS_CAPS", "DISCOVERY_STREAM_SPOCS_ENDPOINT", "DISCOVERY_STREAM_SPOCS_FILL", "DISCOVERY_STREAM_SPOCS_UPDATE", "DISCOVERY_STREAM_SPOC_IMPRESSION", "DOWNLOAD_CHANGED", "FAKE_FOCUS_SEARCH", "FILL_SEARCH_TERM", "HANDOFF_SEARCH_TO_AWESOMEBAR", "HIDE_SEARCH", "INIT", "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", "POCKET_CTA", "POCKET_LINK_DELETED_OR_ARCHIVED", "POCKET_LOGGED_IN", "POCKET_WAITING_FOR_SPOC", "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", "SHOW_SEARCH", "SKIPPED_SIGNIN", "SNIPPETS_BLOCKLIST_CLEARED", "SNIPPETS_BLOCKLIST_UPDATED", "SNIPPETS_DATA", "SNIPPETS_PREVIEW_MODE", "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_CLOSE_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_EDIT", "TOP_SITES_INSERT", "TOP_SITES_OPEN_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_PIN", "TOP_SITES_PREFS_UPDATED", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "TOTAL_BOOKMARKS_REQUEST", "TOTAL_BOOKMARKS_RESPONSE", "UNINIT", "UPDATE_PINNED_SEARCH_SHORTCUTS", "UPDATE_SEARCH_SHORTCUTS", "UPDATE_SECTION_PREFS", "WEBEXT_CLICK", "WEBEXT_DISMISS"]) {
+for (const type of ["ADDONS_INFO_REQUEST", "ADDONS_INFO_RESPONSE", "ARCHIVE_FROM_POCKET", "AS_ROUTER_INITIALIZED", "AS_ROUTER_PREF_CHANGED", "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", "DISCOVERY_STREAM_CONFIG_CHANGE", "DISCOVERY_STREAM_CONFIG_SETUP", "DISCOVERY_STREAM_CONFIG_SET_VALUE", "DISCOVERY_STREAM_FEEDS_UPDATE", "DISCOVERY_STREAM_FEED_UPDATE", "DISCOVERY_STREAM_IMPRESSION_STATS", "DISCOVERY_STREAM_LAYOUT_RESET", "DISCOVERY_STREAM_LAYOUT_UPDATE", "DISCOVERY_STREAM_LINK_BLOCKED", "DISCOVERY_STREAM_LOADED_CONTENT", "DISCOVERY_STREAM_OPT_OUT", "DISCOVERY_STREAM_SPOCS_CAPS", "DISCOVERY_STREAM_SPOCS_ENDPOINT", "DISCOVERY_STREAM_SPOCS_FILL", "DISCOVERY_STREAM_SPOCS_UPDATE", "DISCOVERY_STREAM_SPOC_IMPRESSION", "DOWNLOAD_CHANGED", "FAKE_FOCUS_SEARCH", "FILL_SEARCH_TERM", "HANDOFF_SEARCH_TO_AWESOMEBAR", "HIDE_SEARCH", "INIT", "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", "POCKET_CTA", "POCKET_LINK_DELETED_OR_ARCHIVED", "POCKET_LOGGED_IN", "POCKET_WAITING_FOR_SPOC", "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", "SHOW_SEARCH", "SKIPPED_SIGNIN", "SNIPPETS_BLOCKLIST_CLEARED", "SNIPPETS_BLOCKLIST_UPDATED", "SNIPPETS_DATA", "SNIPPETS_PREVIEW_MODE", "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_CLOSE_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_EDIT", "TOP_SITES_INSERT", "TOP_SITES_OPEN_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_PIN", "TOP_SITES_PREFS_UPDATED", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "TOTAL_BOOKMARKS_REQUEST", "TOTAL_BOOKMARKS_RESPONSE", "UNINIT", "UPDATE_PINNED_SEARCH_SHORTCUTS", "UPDATE_SEARCH_SHORTCUTS", "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 ["INSTALL_ADDON_FROM_URL", "OPEN_APPLICATIONS_MENU", "OPEN_PRIVATE_BROWSER_WINDOW", "OPEN_URL", "OPEN_ABOUT_PAGE", "OPEN_PREFERENCES_PAGE", "SHOW_FIREFOX_ACCOUNTS", "PIN_CURRENT_TAB"]) {
@@ -2196,16 +2196,17 @@ class ASRouterUISurface extends react__W
 
   renderTrailhead() {
     const {
       message
     } = this.state;
 
     if (message.template === "trailhead") {
       return react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(_templates_Trailhead_Trailhead__WEBPACK_IMPORTED_MODULE_13__["Trailhead"], {
+        document: this.props.document,
         message: message,
         onAction: ASRouterUtils.executeAction,
         onDoneButton: this.dismissBundle(this.state.bundle.bundle),
         sendUserActionTelemetry: this.sendUserActionTelemetry,
         dispatch: this.props.dispatch,
         fxaEndpoint: this.props.fxaEndpoint
       });
     }
@@ -2724,17 +2725,20 @@ class ModalOverlayWrapper extends react_
     const {
       props
     } = this;
     return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
       className: "modalOverlayOuter active",
       onClick: props.onClose,
       role: "presentation"
     }), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
-      className: `modalOverlayInner active ${props.innerClassName || ""}`
+      className: `modalOverlayInner active ${props.innerClassName || ""}`,
+      "aria-labelledby": props.headerId,
+      id: props.id,
+      role: "dialog"
     }, props.children));
   }
 
 }
 ModalOverlayWrapper.defaultProps = {
   document: global.document
 };
 class ModalOverlay extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
@@ -2983,31 +2987,32 @@ class _StartupOverlay extends react__WEB
   constructor(props) {
     super(props);
     this.onInputChange = this.onInputChange.bind(this);
     this.onSubmit = this.onSubmit.bind(this);
     this.clickSkip = this.clickSkip.bind(this);
     this.initScene = this.initScene.bind(this);
     this.removeOverlay = this.removeOverlay.bind(this);
     this.onInputInvalid = this.onInputInvalid.bind(this);
+    this.utmParams = "utm_source=activity-stream&utm_campaign=firstrun&utm_medium=referral&utm_term=trailhead-control";
     this.state = {
       emailInput: "",
       overlayRemoved: false,
       flowId: "",
       flowBeginTime: 0
     };
     this.didFetch = false;
   }
 
   async componentWillUpdate() {
     if (this.props.fxa_endpoint && !this.didFetch) {
       try {
         this.didFetch = true;
-        const fxaParams = "entrypoint=activity-stream-firstrun&utm_source=activity-stream&utm_campaign=firstrun&form_type=email";
-        const response = await fetch(`${this.props.fxa_endpoint}/metrics-flow?${fxaParams}`, {
+        const fxaParams = "entrypoint=activity-stream-firstrun&form_type=email";
+        const response = await fetch(`${this.props.fxa_endpoint}/metrics-flow?${fxaParams}&${this.utmParams}`, {
           credentials: "omit"
         });
 
         if (response.status === 200) {
           const {
             flowId,
             flowBeginTime
           } = await response.json();
@@ -3116,24 +3121,24 @@ class _StartupOverlay extends react__WEB
   render() {
     // When skipping the onboarding tour we show AS but we are still on
     // about:welcome, prop.isFirstrun is true and StartupOverlay is rendered
     if (this.state.overlayRemoved) {
       return null;
     }
 
     let termsLink = react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("a", {
-      href: `${this.props.fxa_endpoint}/legal/terms`,
+      href: `${this.props.fxa_endpoint}/legal/terms?${this.utmParams}`,
       target: "_blank",
       rel: "noopener noreferrer"
     }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
       id: "firstrun_terms_of_service"
     }));
     let privacyLink = react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("a", {
-      href: `${this.props.fxa_endpoint}/legal/privacy`,
+      href: `${this.props.fxa_endpoint}/legal/privacy?${this.utmParams}`,
       target: "_blank",
       rel: "noopener noreferrer"
     }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
       id: "firstrun_privacy_notice"
     }));
     return react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
       className: `overlay-wrapper ${this.state.show ? "show" : ""}`
     }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
@@ -3149,17 +3154,17 @@ class _StartupOverlay extends react__WEB
     }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
       id: "firstrun_title"
     })), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("p", {
       className: "firstrun-content"
     }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
       id: "firstrun_content"
     })), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("a", {
       className: "firstrun-link",
-      href: "https://www.mozilla.org/firefox/features/sync/",
+      href: `https://www.mozilla.org/firefox/features/sync/?${this.utmParams}`,
       target: "_blank",
       rel: "noopener noreferrer"
     }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
       id: "firstrun_learn_more_link"
     }))), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
       className: "firstrun-sign-in"
     }, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("p", {
       className: "form-header"
@@ -3195,16 +3200,24 @@ class _StartupOverlay extends react__WEB
       name: "utm_source",
       type: "hidden",
       value: "activity-stream"
     }), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
       name: "utm_campaign",
       type: "hidden",
       value: "firstrun"
     }), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
+      name: "utm_medium",
+      type: "hidden",
+      value: "referral"
+    }), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
+      name: "utm_term",
+      type: "hidden",
+      value: "trailhead-control"
+    }), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
       name: "flow_id",
       type: "hidden",
       value: this.state.flowId
     }), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", {
       name: "flow_begin_time",
       type: "hidden",
       value: this.state.flowBeginTime
     }), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", {
@@ -3274,51 +3287,57 @@ module.exports = ReactRedux;
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
 function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
 
 
 
 
 
 
-const FLUENT_FILES = ["branding/brand.ftl", "browser/branding/sync-brand.ftl", // These are finalized strings exposed to localizers
-"browser/newtab/onboarding.ftl", // These are WIP/in-development strings that only get used if the string
-// doesn't already exist in onboarding.ftl above
-"trailhead.ftl"];
+const FLUENT_FILES = ["branding/brand.ftl", "browser/branding/brandings.ftl", "browser/branding/sync-brand.ftl", "browser/newtab/onboarding.ftl"]; // From resource://devtools/client/shared/focus.js
+
+const FOCUSABLE_SELECTOR = ["a[href]:not([tabindex='-1'])", "button:not([disabled]):not([tabindex='-1'])", "iframe:not([tabindex='-1'])", "input:not([disabled]):not([tabindex='-1'])", "select:not([disabled]):not([tabindex='-1'])", "textarea:not([disabled]):not([tabindex='-1'])", "[tabindex]:not([tabindex='-1'])"].join(", ");
 class _Trailhead extends react__WEBPACK_IMPORTED_MODULE_4___default.a.PureComponent {
   constructor(props) {
     super(props);
     this.closeModal = this.closeModal.bind(this);
     this.hideCardPanel = this.hideCardPanel.bind(this);
     this.onInputChange = this.onInputChange.bind(this);
+    this.onStartBlur = this.onStartBlur.bind(this);
     this.onSubmit = this.onSubmit.bind(this);
     this.onInputInvalid = this.onInputInvalid.bind(this);
+    this.onCardAction = this.onCardAction.bind(this);
     this.state = {
       emailInput: "",
       isModalOpen: true,
       showCardPanel: true,
       showCards: false,
       flowId: "",
       flowBeginTime: 0
     };
     this.didFetch = false;
   }
 
+  get dialog() {
+    return this.props.document.getElementById("trailheadDialog");
+  }
+
   async componentWillMount() {
     FLUENT_FILES.forEach(file => {
       const link = document.head.appendChild(document.createElement("link"));
       link.href = file;
       link.rel = "localization";
     });
 
     if (this.props.fxaEndpoint && !this.didFetch) {
       try {
         this.didFetch = true;
-        const fxaParams = "entrypoint=activity-stream-firstrun&utm_source=activity-stream&utm_campaign=firstrun&utm_term=trailhead&form_type=email";
-        const response = await fetch(`${this.props.fxaEndpoint}/metrics-flow?${fxaParams}`, {
+        const url = new URL(`${this.props.fxaEndpoint}/metrics-flow?entrypoint=activity-stream-firstrun&form_type=email`);
+        this.addUtmParams(url);
+        const response = await fetch(url, {
           credentials: "omit"
         });
 
         if (response.status === 200) {
           const {
             flowId,
             flowBeginTime
           } = await response.json();
@@ -3343,54 +3362,70 @@ class _Trailhead extends react__WEBPACK_
           }
         }));
       }
     }
   }
 
   componentDidMount() {
     // We need to remove hide-main since we should show it underneath everything that has rendered
-    global.document.body.classList.remove("hide-main"); // Add inline-onboarding class to disable fixed search header and fixed positioned settings icon
-
-    global.document.body.classList.add("inline-onboarding");
-
-    if (!this.props.message.content) {
+    this.props.document.body.classList.remove("hide-main"); // Add inline-onboarding class to disable fixed search header and fixed positioned settings icon
+
+    this.props.document.body.classList.add("inline-onboarding"); // The rest of the page is "hidden" when the modal is open
+
+    if (this.props.message.content) {
+      this.props.document.getElementById("root").setAttribute("aria-hidden", "true"); // Start with focus in the email input box
+
+      this.dialog.querySelector("input[name=email]").focus();
+    } else {
       // No modal overlay, let the user scroll and deal them some cards.
-      global.document.body.classList.remove("welcome");
+      this.props.document.body.classList.remove("welcome");
 
       if (this.props.message.includeBundle || this.props.message.cards) {
         this.revealCards();
       }
     }
   }
 
-  componentDidUnmount() {
-    global.document.body.classList.remove("inline-onboarding");
+  componentWillUnmount() {
+    this.props.document.body.classList.remove("inline-onboarding");
   }
 
   onInputChange(e) {
     let error = e.target.previousSibling;
     this.setState({
       emailInput: e.target.value
     });
     error.classList.remove("active");
     e.target.classList.remove("invalid");
   }
 
+  onStartBlur(event) {
+    // Make sure focus stays within the dialog when tabbing from the button
+    const {
+      dialog
+    } = this;
+
+    if (event.relatedTarget && !(dialog.compareDocumentPosition(event.relatedTarget) & dialog.DOCUMENT_POSITION_CONTAINED_BY)) {
+      dialog.querySelector(FOCUSABLE_SELECTOR).focus();
+    }
+  }
+
   onSubmit() {
     this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
       event: "SUBMIT_EMAIL",
       ...this._getFormInfo()
     }));
     global.addEventListener("visibilitychange", this.closeModal);
   }
 
   closeModal() {
     global.removeEventListener("visibilitychange", this.closeModal);
-    global.document.body.classList.remove("welcome");
+    this.props.document.body.classList.remove("welcome");
+    this.props.document.getElementById("root").removeAttribute("aria-hidden");
     this.setState({
       isModalOpen: false
     });
     this.revealCards();
     this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
       event: "SKIPPED_SIGNIN",
       ...this._getFormInfo()
     }));
@@ -3434,50 +3469,99 @@ class _Trailhead extends react__WEBPACK_
     if (str.property_id) {
       str.value = this.props.intl.formatMessage({
         id: str.property_id
       });
     }
 
     return str.value;
   }
+  /**
+   * Takes in a url as a string or URL object and returns a URL object with the
+   * utm_* parameters added to it. If a URL object is passed in, the paraemeters
+   * are added to it (the return value can be ignored in that case as it's the
+   * same object).
+   */
+
+
+  addUtmParams(url, isCard = false) {
+    let returnUrl = url;
+
+    if (typeof returnUrl === "string") {
+      returnUrl = new URL(url);
+    }
+
+    returnUrl.searchParams.append("utm_source", "activity-stream");
+    returnUrl.searchParams.append("utm_campaign", "firstrun");
+    returnUrl.searchParams.append("utm_medium", "referral");
+    returnUrl.searchParams.append("utm_term", `${this.props.message.utm_term}${isCard ? "-card" : ""}`);
+    return returnUrl;
+  }
+
+  onCardAction(action) {
+    let actionUpdates = {};
+
+    if (action.type === "OPEN_URL") {
+      let url = new URL(action.data.args);
+      this.addUtmParams(url, true);
+
+      if (action.addFlowParams) {
+        url.searchParams.append("flow_id", this.state.flowId);
+        url.searchParams.append("flow_begin_time", this.state.flowBeginTime);
+      }
+
+      actionUpdates = {
+        data: { ...action.data,
+          args: url
+        }
+      };
+    }
+
+    this.props.onAction({ ...action,
+      ...actionUpdates
+    });
+  }
 
   render() {
     const {
       props
     } = this;
     const {
       bundle: cards,
-      content
+      content,
+      utm_term
     } = props.message;
     const innerClassName = ["trailhead", content && content.className].filter(v => v).join(" ");
     return react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_4___default.a.Fragment, null, this.state.isModalOpen && content ? react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_2__["ModalOverlayWrapper"], {
       innerClassName: innerClassName,
-      onClose: this.closeModal
+      onClose: this.closeModal,
+      id: "trailheadDialog",
+      headerId: "trailheadHeader"
     }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
       className: "trailheadInner"
     }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
       className: "trailheadContent"
     }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h1", {
-      "data-l10n-id": content.title.string_id
+      "data-l10n-id": content.title.string_id,
+      id: "trailheadHeader"
     }, this.getStringValue(content.title)), content.subtitle && react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("p", {
       "data-l10n-id": content.subtitle.string_id
     }, this.getStringValue(content.subtitle)), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("ul", {
       className: "trailheadBenefits"
     }, content.benefits.map(item => react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("li", {
       key: item.id,
       className: item.id
     }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h3", {
       "data-l10n-id": item.title.string_id
     }, this.getStringValue(item.title)), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("p", {
       "data-l10n-id": item.text.string_id
     }, this.getStringValue(item.text))))), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("a", {
       className: "trailheadLearn",
       "data-l10n-id": content.learn.text.string_id,
-      href: content.learn.url
+      href: this.addUtmParams(content.learn.url)
     }, this.getStringValue(content.learn.text))), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
       className: "trailheadForm"
     }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h3", {
       "data-l10n-id": content.form.title.string_id
     }, this.getStringValue(content.form.title)), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("p", {
       "data-l10n-id": content.form.text.string_id
     }, this.getStringValue(content.form.text)), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("form", {
       method: "get",
@@ -3507,65 +3591,71 @@ class _Trailhead extends react__WEBPACK_
       value: "activity-stream"
     }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("input", {
       name: "utm_campaign",
       type: "hidden",
       value: "firstrun"
     }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("input", {
       name: "utm_term",
       type: "hidden",
-      value: "trailhead"
+      value: utm_term
     }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("input", {
       name: "flow_id",
       type: "hidden",
       value: this.state.flowId
     }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("input", {
       name: "flow_begin_time",
       type: "hidden",
       value: this.state.flowBeginTime
+    }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("input", {
+      name: "style",
+      type: "hidden",
+      value: "trailhead"
     }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("p", {
       "data-l10n-id": "onboarding-join-form-email-error",
       className: "error"
     }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("input", {
       "data-l10n-id": content.form.email.string_id,
       placeholder: this.getStringValue(content.form.email),
       name: "email",
       type: "email",
       required: "true",
       onInvalid: this.onInputInvalid,
       onChange: this.onInputChange
     }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("p", {
       className: "trailheadTerms",
       "data-l10n-id": "onboarding-join-form-legal"
     }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("a", {
       "data-l10n-name": "terms",
-      href: "https://accounts.firefox.com/legal/terms"
+      href: this.addUtmParams("https://accounts.firefox.com/legal/terms")
     }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("a", {
       "data-l10n-name": "privacy",
-      href: "https://accounts.firefox.com/legal/privacy"
+      href: this.addUtmParams("https://accounts.firefox.com/legal/privacy")
     })), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("button", {
       "data-l10n-id": content.form.button.string_id,
       type: "submit"
     }, this.getStringValue(content.form.button))))), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("button", {
       className: "trailheadStart",
       "data-l10n-id": content.skipButton.string_id,
+      onBlur: this.onStartBlur,
       onClick: this.closeModal
     }, this.getStringValue(content.skipButton))) : null, cards && cards.length ? react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
       className: `trailheadCards ${this.state.showCardPanel ? "expanded" : "collapsed"}`
     }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
-      className: "trailheadCardsInner"
+      className: "trailheadCardsInner",
+      "aria-hidden": !this.state.showCards
     }, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h1", {
       "data-l10n-id": "onboarding-welcome-header"
     }), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
       className: `trailheadCardGrid${this.state.showCards ? " show" : ""}`
     }, cards.map(card => react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(_OnboardingMessage_OnboardingMessage__WEBPACK_IMPORTED_MODULE_3__["OnboardingCard"], _extends({
       key: card.id,
       className: "trailheadCard",
       sendUserActionTelemetry: props.sendUserActionTelemetry,
-      onAction: props.onAction,
+      onAction: this.onCardAction,
       UISurface: "TRAILHEAD"
     }, card)))), this.state.showCardPanel && react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("button", {
       className: "icon icon-dismiss",
       onClick: this.hideCardPanel,
       title: props.intl.formatMessage({
         id: "menu_action_dismiss"
       }),
       "aria-label": props.intl.formatMessage({
@@ -8333,55 +8423,63 @@ const selectLayoutRender = (state, prefs
     layout,
     feeds,
     spocs
   } = state;
   let spocIndex = 0;
   let bufferRollCache = []; // Records the chosen and unchosen spocs by the probability selection.
 
   let chosenSpocs = new Set();
-  let unchosenSpocs = new Set(); // rickRollCache stores random probability values for each spoc position. This cache is empty
-  // on page refresh and gets filled with random values on first render inside maybeInjectSpocs.
-
-  const isFirstRun = !rickRollCache.length;
+  let unchosenSpocs = new Set();
+
+  function rollForSpocs(data, spocsConfig) {
+    const recommendations = [...data.recommendations];
+
+    for (let position of spocsConfig.positions) {
+      const spoc = spocs.data.spocs[spocIndex];
+
+      if (!spoc) {
+        break;
+      } // Cache random number for a position
+
+
+      let rickRoll;
+
+      if (!rickRollCache.length) {
+        rickRoll = Math.random();
+        bufferRollCache.push(rickRoll);
+      } else {
+        rickRoll = rickRollCache.shift();
+        bufferRollCache.push(rickRoll);
+      }
+
+      if (rickRoll <= spocsConfig.probability) {
+        spocIndex++;
+        recommendations.splice(position.index, 0, spoc);
+        chosenSpocs.add(spoc);
+      } else {
+        unchosenSpocs.add(spoc);
+      }
+    }
+
+    return { ...data,
+      recommendations
+    };
+  }
 
   function maybeInjectSpocs(data, spocsConfig) {
-    if (data && spocsConfig && spocsConfig.positions && spocsConfig.positions.length && spocs.data.spocs && spocs.data.spocs.length) {
-      const recommendations = [...data.recommendations];
-
-      for (let position of spocsConfig.positions) {
-        const spoc = spocs.data.spocs[spocIndex];
-
-        if (!spoc) {
-          break;
-        } // Cache random number for a position
-
-
-        let rickRoll;
-
-        if (isFirstRun) {
-          rickRoll = Math.random();
-          rickRollCache.push(rickRoll);
-        } else {
-          rickRoll = rickRollCache.shift();
-          bufferRollCache.push(rickRoll);
-        }
-
-        if (rickRoll <= spocsConfig.probability) {
-          spocIndex++;
-          recommendations.splice(position.index, 0, spoc);
-          chosenSpocs.add(spoc);
-        } else {
-          unchosenSpocs.add(spoc);
-        }
-      }
-
-      return { ...data,
-        recommendations
-      };
+    // Do we ever expect to possibly have a spoc.
+    if (data && spocsConfig && spocsConfig.positions && spocsConfig.positions.length) {
+      // We expect a spoc, spocs are loaded, but the server returned no spocs.
+      if (!spocs.data.spocs || !spocs.data.spocs.length) {
+        return data;
+      } // We expect a spoc, spocs are loaded, and we have spocs available.
+
+
+      return rollForSpocs(data, spocsConfig);
     }
 
     return data;
   }
 
   const positions = {};
   const DS_COMPONENTS = ["Message", "SectionTitle", "Navigation", "CardGrid", "Hero", "HorizontalRule", "List"];
   const filterArray = [];
@@ -8389,66 +8487,87 @@ const selectLayoutRender = (state, prefs
   if (!prefs["feeds.topsites"]) {
     filterArray.push("TopSites");
   }
 
   if (!prefs["feeds.section.topstories"]) {
     filterArray.push(...DS_COMPONENTS);
   }
 
-  const layoutRender = layout.map(row => ({ ...row,
-    // Loops through desired components and adds a .data property
-    // containing data from feeds
-    components: row.components.filter(c => !filterArray.includes(c.type)).map(component => {
-      if (!component.feed || !feeds.data[component.feed.url]) {
-        return component;
-      }
-
-      positions[component.type] = positions[component.type] || 0;
-      let {
-        data
-      } = feeds.data[component.feed.url];
-
-      if (component && component.properties && component.properties.offset) {
-        data = { ...data,
-          recommendations: data.recommendations.slice(component.properties.offset)
-        };
-      }
-
-      data = maybeInjectSpocs(data, component.spocs); // If empty, fill rickRollCache with random probability values from bufferRollCache
-
-      if (!rickRollCache.length) {
-        rickRollCache.push(...bufferRollCache);
-      }
-
-      let items = 0;
-
-      if (component.properties && component.properties.items) {
-        items = Math.min(component.properties.items, data.recommendations.length);
-      } // loop through a component items
-      // Store the items position sequentially for multiple components of the same type.
-      // Example: A second card grid starts pos offset from the last card grid.
-
-
-      for (let i = 0; i < items; i++) {
-        data.recommendations[i].pos = positions[component.type]++;
-      }
-
-      return { ...component,
-        data
+  const handleComponent = component => {
+    positions[component.type] = positions[component.type] || 0;
+    let {
+      data
+    } = feeds.data[component.feed.url];
+
+    if (component && component.properties && component.properties.offset) {
+      data = { ...data,
+        recommendations: data.recommendations.slice(component.properties.offset)
       };
-    })
-  })).filter(row => row.components.length); // Generate the payload for the SPOCS Fill ping. Note that a SPOC could be rejected
+    }
+
+    data = maybeInjectSpocs(data, component.spocs);
+    let items = 0;
+
+    if (component.properties && component.properties.items) {
+      items = Math.min(component.properties.items, data.recommendations.length);
+    } // loop through a component items
+    // Store the items position sequentially for multiple components of the same type.
+    // Example: A second card grid starts pos offset from the last card grid.
+
+
+    for (let i = 0; i < items; i++) {
+      data.recommendations[i].pos = positions[component.type]++;
+    }
+
+    return { ...component,
+      data
+    };
+  };
+
+  const renderLayout = () => {
+    const renderedLayoutArray = [];
+
+    for (const row of layout.filter(r => r.components.length)) {
+      let components = [];
+      renderedLayoutArray.push({ ...row,
+        components
+      });
+
+      for (const component of row.components.filter(c => !filterArray.includes(c.type))) {
+        if (component.feed) {
+          const spocsConfig = component.spocs; // Are we still waiting on a feed/spocs, render what we have, and bail out early.
+
+          if (!feeds.data[component.feed.url] || spocsConfig && spocsConfig.positions && spocsConfig.positions.length && !spocs.loaded) {
+            return renderedLayoutArray;
+          }
+
+          components.push(handleComponent(component));
+        } else {
+          components.push(component);
+        }
+      }
+    }
+
+    return renderedLayoutArray;
+  };
+
+  const layoutRender = renderLayout(layout); // If empty, fill rickRollCache with random probability values from bufferRollCache
+
+  if (!rickRollCache.length) {
+    rickRollCache.push(...bufferRollCache);
+  } // Generate the payload for the SPOCS Fill ping. Note that a SPOC could be rejected
   // by the `probability_selection` first, then gets chosen for the next position. For
   // all other SPOCS that never went through the probabilistic selection, its reason will
   // be "out_of_position".
 
+
   let spocsFill = [];
 
-  if (spocs.data.spocs) {
+  if (spocs.loaded && feeds.loaded && spocs.data.spocs) {
     const chosenSpocsFill = [...chosenSpocs].map(spoc => ({
       id: spoc.id,
       reason: "n/a",
       displayed: 1,
       full_recalc: 0
     }));
     const unchosenSpocsFill = [...unchosenSpocs].filter(spoc => !chosenSpocs.has(spoc)).map(spoc => ({
       id: spoc.id,
@@ -8674,27 +8793,22 @@ class DiscoveryStreamBase_DiscoveryStrea
   render() {
     // Select layout render data by adding spocs and position to recommendations
     const {
       layoutRender,
       spocsFill
     } = selectLayoutRender(this.props.DiscoveryStream, this.props.Prefs.values, rickRollCache);
     const {
       config,
-      feeds,
-      spocs
-    } = this.props.DiscoveryStream;
-
-    if (!spocs.loaded || !feeds.loaded) {
-      return null;
-    } // Send SPOCS Fill if any. Note that it should not send it again if the same
+      spocs,
+      feeds
+    } = this.props.DiscoveryStream; // Send SPOCS Fill if any. Note that it should not send it again if the same
     // page gets re-rendered by state changes.
 
-
-    if (spocsFill.length && !this._spocsFillSent) {
+    if (spocs.loaded && feeds.loaded && spocsFill.length && !this._spocsFillSent) {
       this.props.dispatch(Actions["actionCreators"].DiscoveryStreamSpocsFill({
         spoc_fills: spocsFill
       }));
       this._spocsFillSent = true;
     } // Allow rendering without extracting special components
 
 
     if (!config.collapsible) {
@@ -8717,17 +8831,22 @@ class DiscoveryStreamBase_DiscoveryStrea
           }
         }
       }
 
       return null;
     }; // Get "topstories" Section state for default values
 
 
-    const topStories = this.props.Sections.find(s => s.id === "topstories"); // Extract TopSites to render before the rest and Message to use for header
+    const topStories = this.props.Sections.find(s => s.id === "topstories");
+
+    if (!topStories) {
+      return null;
+    } // Extract TopSites to render before the rest and Message to use for header
+
 
     const topSites = extractComponent("TopSites");
     const message = extractComponent("Message") || {
       header: {
         link_text: topStories.learnMore.link.id,
         link_url: topStories.learnMore.link.href,
         title: topStories.title
       }
@@ -8760,16 +8879,20 @@ class DiscoveryStreamBase_DiscoveryStrea
     return external_React_default.a.createElement("div", {
       className: "discovery-stream ds-layout"
     }, layoutRender.map((row, rowIndex) => external_React_default.a.createElement("div", {
       key: `row-${rowIndex}`,
       className: `ds-column ds-column-${row.width}`
     }, external_React_default.a.createElement("div", {
       className: "ds-column-grid"
     }, row.components.map((component, componentIndex) => {
+      if (!component) {
+        return null;
+      }
+
       styles[rowIndex] = [...(styles[rowIndex] || []), component.styles];
       return external_React_default.a.createElement("div", {
         key: `component-${componentIndex}`
       }, this.renderComponent(component, row.width));
     })))), this.renderStyles(styles));
   }
 
 }
@@ -11781,17 +11904,17 @@ class CachedIterable {
 
     if (seen.length === 0 || seen[seen.length - 1].done === false) {
       seen.push(iterator.next());
     }
   }
 
 }
 // CONCATENATED MODULE: ./node_modules/fluent/src/fallback.js
-function _asyncIterator(iterable) { var method; if (typeof Symbol !== "undefined") { if (Symbol.asyncIterator) { method = iterable[Symbol.asyncIterator]; if (method != null) return method.call(iterable); } if (Symbol.iterator) { method = iterable[Symbol.iterator]; if (method != null) return method.call(iterable); } } throw new TypeError("Object is not async iterable"); }
+function _asyncIterator(iterable) { var method; if (typeof Symbol === "function") { if (Symbol.asyncIterator) { method = iterable[Symbol.asyncIterator]; if (method != null) return method.call(iterable); } if (Symbol.iterator) { method = iterable[Symbol.iterator]; if (method != null) return method.call(iterable); } } throw new TypeError("Object is not async iterable"); }
 
 /*
  * @overview
  *
  * Functions for managing ordered sequences of MessageContexts.
  *
  * An ordered iterable of MessageContext instances can represent the current
  * negotiated fallback chain of languages.  This iterable can be used to find
@@ -13226,21 +13349,31 @@ function DiscoveryStream(prevState = INI
     case Actions["actionTypes"].DISCOVERY_STREAM_LAYOUT_RESET:
       return { ...INITIAL_STATE.DiscoveryStream,
         config: prevState.config
       };
 
     case Actions["actionTypes"].DISCOVERY_STREAM_FEEDS_UPDATE:
       return { ...prevState,
         feeds: { ...prevState.feeds,
-          data: action.data || prevState.feeds.data,
           loaded: true
         }
       };
 
+    case Actions["actionTypes"].DISCOVERY_STREAM_FEED_UPDATE:
+      const newData = {};
+      newData[action.data.url] = action.data.feed;
+      return { ...prevState,
+        feeds: { ...prevState.feeds,
+          data: { ...prevState.feeds.data,
+            ...newData
+          }
+        }
+      };
+
     case Actions["actionTypes"].DISCOVERY_STREAM_SPOCS_CAPS:
       return { ...prevState,
         spocs: { ...prevState.spocs,
           frequency_caps: [...prevState.spocs.frequency_caps, ...action.data]
         }
       };
 
     case Actions["actionTypes"].DISCOVERY_STREAM_SPOCS_ENDPOINT:
--- a/browser/components/newtab/docs/v2-system-addon/data_events.md
+++ b/browser/components/newtab/docs/v2-system-addon/data_events.md
@@ -995,33 +995,33 @@ This reports the user's interaction with
   "client_id": "26288a14-5cc4-d14f-ae0a-bb01ef45be9c",
   "action": "cfr_user_event",
   "addon_version": "20180710100040",
   "impression_id": "n/a",
   "locale": "en-US",
   "source": "CFR",
   // message_id could be the ID of the recommendation, such as "wikipedia_addon"
   "message_id": "wikipedia_addon",
-  "event": "[INSTALL | PIN | BLOCK | DISMISS | RATIONALE | LEARN_MORE | CLICK_DOORHANGER | MANAGE]"
+  "event": "[IMPRESSION | INSTALL | PIN | BLOCK | DISMISS | RATIONALE | LEARN_MORE | CLICK | CLICK_DOORHANGER | MANAGE]"
 }
 ```
 
 #### CFR interaction pings for release channel
 ```js
 {
   "client_id": "n/a",
   "action": "cfr_user_event",
   "addon_version": "20180710100040",
   "impression_id": "{005deed0-e3e4-4c02-a041-17405fd703f6}",
   "locale": "en-US",
   "source": "CFR",
   // message_id should be a bucket ID in the release channel, we may not use the
   // individual ID, such as addon ID, per legal's request
   "message_id": "bucket_id",
-  "event": "[INSTALL | PIN | BLOCK | DISMISS | RATIONALE | LEARN_MORE | CLICK_DOORHANGER | MANAGE]"
+  "event": "[IMPRESSION | INSTALL | PIN | BLOCK | DISMISS | RATIONALE | LEARN_MORE | CLICK | CLICK_DOORHANGER | MANAGE]"
 }
 ```
 
 ### Targeting error pings
 
 This reports when an error has occurred when parsing/evaluating a JEXL targeting string in a message.
 
 ```js
--- a/browser/components/newtab/jar.mn
+++ b/browser/components/newtab/jar.mn
@@ -1,15 +1,12 @@
 # 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/.
 
-[localization] en-US.jar:
-  trailhead.ftl (./data/trailhead.wip)
-
 browser.jar:
 % resource activity-stream %res/activity-stream/ contentaccessible=yes
   res/activity-stream/lib/ (./lib/*)
   res/activity-stream/common/ (./common/*)
   res/activity-stream/vendor/Redux.jsm (./vendor/Redux.jsm)
   res/activity-stream/vendor/react.js (./vendor/react.js)
   res/activity-stream/vendor/react-dom.js (./vendor/react-dom.js)
 #ifndef RELEASE_OR_BETA
--- a/browser/components/newtab/lib/ASRouter.jsm
+++ b/browser/components/newtab/lib/ASRouter.jsm
@@ -36,16 +36,17 @@ ChromeUtils.defineModuleGetter(this, "Te
 ChromeUtils.defineModuleGetter(this, "ClientEnvironment",
   "resource://normandy/lib/ClientEnvironment.jsm");
 ChromeUtils.defineModuleGetter(this, "Sampling",
   "resource://gre/modules/components-utils/Sampling.jsm");
 
 const TRAILHEAD_CONFIG = {
   OVERRIDE_PREF: "trailhead.firstrun.branches",
   DID_SEE_ABOUT_WELCOME_PREF: "trailhead.firstrun.didSeeAboutWelcome",
+  INTERRUPTS_EXPERIMENT_PREF: "trailhead.firstrun.interruptsExperiment",
   BRANCHES: {
     interrupts: [
       ["control"],
       ["join"],
       ["sync"],
       ["nofirstrun"],
       ["cards"],
     ],
@@ -564,17 +565,17 @@ class _ASRouter {
     this.messageChannel.addMessageListener(INCOMING_MESSAGE_NAME, this.onMessage);
     this._storage = storage;
     this.WHITELIST_HOSTS = this._loadSnippetsWhitelistHosts();
     this.dispatchToAS = dispatchToAS;
     this.dispatch = this.dispatch.bind(this);
 
     ASRouterPreferences.init();
     ASRouterPreferences.addListener(this.onPrefChange);
-    BookmarkPanelHub.init(this.handleMessageRequest, this.addImpression);
+    BookmarkPanelHub.init(this.handleMessageRequest, this.addImpression, this.dispatch);
 
     this._loadLocalProviders();
 
     // We need to check whether to set up telemetry for trailhead
     await this.setupTrailhead();
 
     const messageBlockList = await this._storage.get("messageBlockList") || [];
     const providerBlockList = await this._storage.get("providerBlockList") || [];
@@ -742,16 +743,23 @@ class _ASRouter {
 
     if (experiment) {
       TelemetryEnvironment.setExperimentActive(
         // In order for ping centre to pick this up, it MUST start with activity-stream
         `activity-stream-firstrun-trailhead-${experiment}`,
         experiment === "interrupts" ? interrupt : triplet,
         {type: "as-firstrun"}
       );
+
+      // On the first time setting the interrupts experiment, expose the branch
+      // for normandy to target for survey study.
+      if (experiment === "interrupts" &&
+          !Services.prefs.prefHasUserValue(TRAILHEAD_CONFIG.INTERRUPTS_EXPERIMENT_PREF)) {
+        Services.prefs.setStringPref(TRAILHEAD_CONFIG.INTERRUPTS_EXPERIMENT_PREF, interrupt);
+      }
     }
   }
 
   // Return an object containing targeting parameters used to select messages
   _getMessagesContext() {
     const {previousSessionEnd, trailheadInterrupt, trailheadTriplet} = this.state;
 
     return {
--- a/browser/components/newtab/lib/ActivityStream.jsm
+++ b/browser/components/newtab/lib/ActivityStream.jsm
@@ -155,17 +155,17 @@ const PREFS_CONFIG = new Map([
     title: "Number of rows of Top Stories to display",
     value: 1,
   }],
   ["sectionOrder", {
     title: "The rendering order for the sections",
     value: "topsites,topstories,highlights",
   }],
   ["improvesearch.noDefaultSearchTile", {
-    title: "Experiment to remove tiles that are the same as the default search",
+    title: "Remove tiles that are the same as the default search",
     value: true,
   }],
   ["improvesearch.topSiteSearchShortcuts.searchEngines", {
     title: "An ordered, comma-delimited list of search shortcuts that we should try and pin",
     // This pref is dynamic as the shortcuts vary depending on the region
     getValue: ({geo}) => {
       if (!geo) {
         return "";
@@ -210,17 +210,17 @@ const PREFS_CONFIG = new Map([
       // Block specific messages from this local provider
       exclude: [],
     }),
   }],
   ["asrouter.providers.cfr-fxa", {
     title: "Configuration for CFR FxA Messages provider",
     value: JSON.stringify({
       id: "cfr-fxa",
-      enabled: false,
+      enabled: true,
       type: "remote-settings",
       bucket: "cfr-fxa",
       frequency: {custom: [{period: "daily", cap: 1}]},
     }),
   }],
   // See browser/app/profile/firefox.js for other ASR preferences. They must be defined there to enable roll-outs.
   ["discoverystream.config", {
     title: "Configuration for the new pocket new tab",
--- a/browser/components/newtab/lib/BookmarkPanelHub.jsm
+++ b/browser/components/newtab/lib/BookmarkPanelHub.jsm
@@ -11,44 +11,49 @@ ChromeUtils.defineModuleGetter(this, "Se
   "resource://gre/modules/Services.jsm");
 
 class _BookmarkPanelHub {
   constructor() {
     this._id = "BookmarkPanelHub";
     this._trigger = {id: "bookmark-panel"};
     this._handleMessageRequest = null;
     this._addImpression = null;
+    this._dispatch = null;
     this._initalized = false;
     this._response = null;
     this._l10n = null;
 
     this.messageRequest = this.messageRequest.bind(this);
     this.toggleRecommendation = this.toggleRecommendation.bind(this);
+    this.sendUserEventTelemetry = this.sendUserEventTelemetry.bind(this);
     this.collapseMessage = this.collapseMessage.bind(this);
   }
 
   /**
    * @param {function} handleMessageRequest
    * @param {function} addImpression
+   * @param {function} dispatch - Used for sending user telemetry information
    */
-  init(handleMessageRequest, addImpression) {
+  init(handleMessageRequest, addImpression, dispatch) {
     this._handleMessageRequest = handleMessageRequest;
     this._addImpression = addImpression;
+    this._dispatch = dispatch;
     this._l10n = new DOMLocalization([
       "browser/branding/sync-brand.ftl",
       "browser/newtab/asrouter.ftl",
     ]);
     this._initalized = true;
   }
 
   uninit() {
     this._l10n = null;
     this._initalized = false;
     this._handleMessageRequest = null;
     this._addImpression = null;
+    this._dispatch = null;
     this._response = null;
   }
 
   /**
    * Checks if a similar cached requests exists before forwarding the request
    * to ASRouter. Caches only 1 request, unique identifier is `request.url`.
    * Caching ensures we don't duplicate requests and telemetry pings.
    * Return value is important for the caller to know if a message will be
@@ -78,16 +83,17 @@ class _BookmarkPanelHub {
       target,
       win,
       url: target.url,
     };
 
     if (response && response.content) {
       this.showMessage(response.content, target, win);
       this.sendImpression();
+      this.sendUserEventTelemetry("IMPRESSION");
     } else {
       this.hideMessage(target);
     }
 
     target.infoButton.disabled = !response;
 
     return !!response;
   }
@@ -106,24 +112,26 @@ class _BookmarkPanelHub {
       recommendation.addEventListener("click", async e => {
         target.hidePopup();
         const url = await FxAccounts.config.promiseEmailFirstURI("bookmark");
         win.ownerGlobal.openLinkIn(url, "tabshifted", {
           private: false,
           triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal({}),
           csp: null,
         });
+        this.sendUserEventTelemetry("CLICK");
       });
       recommendation.style.color = message.color;
       recommendation.style.background = `-moz-linear-gradient(-45deg, ${message.background_color_1} 0%, ${message.background_color_2} 70%)`;
       const close = createElement("a");
       close.setAttribute("id", "cfrClose");
       close.setAttribute("aria-label", "close");
       this._l10n.setAttributes(close, message.close_button.tooltiptext);
       close.addEventListener("click", e => {
+        this.sendUserEventTelemetry("DISMISS");
         this.collapseMessage();
         target.close(e);
       });
       const title = createElement("h1");
       title.setAttribute("id", "editBookmarkPanelRecommendationTitle");
       this._l10n.setAttributes(title, message.title);
       const content = createElement("p");
       content.setAttribute("id", "editBookmarkPanelRecommendationContent");
@@ -176,16 +184,27 @@ class _BookmarkPanelHub {
   _forceShowMessage(message) {
     this.toggleRecommendation(true);
     this.showMessage(message.content, this._response.target, this._response.win);
   }
 
   sendImpression() {
     this._addImpression(this._response);
   }
+
+  sendUserEventTelemetry(event) {
+    this._sendTelemetry({message_id: this._response.id, bucket_id: this._response.id, event});
+  }
+
+  _sendTelemetry(ping) {
+    this._dispatch({
+      type: "DOORHANGER_TELEMETRY",
+      data: {action: "cfr_user_event", source: "CFR", ...ping},
+    });
+  }
 }
 
 this._BookmarkPanelHub = _BookmarkPanelHub;
 
 /**
  * BookmarkPanelHub - singleton instance of _BookmarkPanelHub that can initiate
  * message requests and render messages.
  */
--- a/browser/components/newtab/lib/DiscoveryStreamFeed.jsm
+++ b/browser/components/newtab/lib/DiscoveryStreamFeed.jsm
@@ -261,44 +261,51 @@ this.DiscoveryStreamFeed = class Discove
    * buildFeedPromise - Adds the promise result to newFeeds and
    *                    pushes a promise to newsFeedsPromises.
    * @param {Object} Has both newFeedsPromises (Array) and newFeeds (Object)
    * @param {Boolean} isStartup We have different cache handling for startup.
    * @returns {Function} We return a function so we can contain
    *                     the scope for isStartup and the promises object.
    *                     Combines feed results and promises for each component with a feed.
    */
-  buildFeedPromise({newFeedsPromises, newFeeds}, isStartup) {
+  buildFeedPromise({newFeedsPromises, newFeeds}, isStartup, sendUpdate) {
     return component => {
       const {url} = component.feed;
 
       if (!newFeeds[url]) {
         // We initially stub this out so we don't fetch dupes,
         // we then fill in with the proper object inside the promise.
         newFeeds[url] = {};
         const feedPromise = this.getComponentFeed(url, isStartup);
+
         feedPromise.then(feed => {
           newFeeds[url] = this.filterRecommendations(feed);
+          sendUpdate({
+            type: at.DISCOVERY_STREAM_FEED_UPDATE,
+            data: {
+              feed: newFeeds[url],
+              url,
+            },
+          });
 
           // We grab affinities off the first feed for the moment.
           // Ideally this would be returned from the server on the layout,
           // or from another endpoint.
           if (!this.affinities) {
             const {settings} = feed.data;
             this.affinities = {
               timeSegments: settings.timeSegments,
               parameterSets: settings.domainAffinityParameterSets,
               maxHistoryQueryResults: settings.maxHistoryQueryResults || DEFAULT_MAX_HISTORY_QUERY_RESULTS,
               version: settings.version,
             };
           }
         }).catch(/* istanbul ignore next */ error => {
           Cu.reportError(`Error trying to load component feed ${url}: ${error}`);
         });
-
         newFeedsPromises.push(feedPromise);
       }
     };
   }
 
   filterRecommendations(feed) {
     if (feed && feed.data && feed.data.recommendations && feed.data.recommendations.length) {
       const {data} = this.filterBlocked(feed.data, "recommendations");
@@ -312,65 +319,67 @@ this.DiscoveryStreamFeed = class Discove
 
   /**
    * reduceFeedComponents - Filters out components with no feeds, and combines
    *                        all feeds on this component with the feeds from other components.
    * @param {Boolean} isStartup We have different cache handling for startup.
    * @returns {Function} We return a function so we can contain the scope for isStartup.
    *                     Reduces feeds into promises and feed data.
    */
-  reduceFeedComponents(isStartup) {
+  reduceFeedComponents(isStartup, sendUpdate) {
     return (accumulator, row) => {
       row.components
         .filter(component => component && component.feed)
-        .forEach(this.buildFeedPromise(accumulator, isStartup));
+        .forEach(this.buildFeedPromise(accumulator, isStartup, sendUpdate));
       return accumulator;
     };
   }
 
   /**
    * buildFeedPromises - Filters out rows with no components,
    *                     and gets us a promise for each unique feed.
    * @param {Object} layout This is the Discovery Stream layout object.
    * @param {Boolean} isStartup We have different cache handling for startup.
    * @returns {Object} An object with newFeedsPromises (Array) and newFeeds (Object),
    *                   we can Promise.all newFeedsPromises to get completed data in newFeeds.
    */
-  buildFeedPromises(layout, isStartup) {
+  buildFeedPromises(layout, isStartup, sendUpdate) {
     const initialData = {
       newFeedsPromises: [],
       newFeeds: {},
     };
     return layout
       .filter(row => row && row.components)
-      .reduce(this.reduceFeedComponents(isStartup), initialData);
+      .reduce(this.reduceFeedComponents(isStartup, sendUpdate), initialData);
   }
 
   async loadComponentFeeds(sendUpdate, isStartup) {
     const {DiscoveryStream} = this.store.getState();
 
     if (!DiscoveryStream || !DiscoveryStream.layout) {
       return;
     }
 
     // Reset the flag that indicates whether or not at least one API request
     // was issued to fetch the component feed in `getComponentFeed()`.
     this.componentFeedFetched = false;
     const start = perfService.absNow();
-    const {newFeedsPromises, newFeeds} = this.buildFeedPromises(DiscoveryStream.layout, isStartup);
+    const {newFeedsPromises, newFeeds} = this.buildFeedPromises(DiscoveryStream.layout, isStartup, sendUpdate);
 
     // Each promise has a catch already built in, so no need to catch here.
     await Promise.all(newFeedsPromises);
 
     if (this.componentFeedFetched) {
       this.cleanUpTopRecImpressionPref(newFeeds);
       this.componentFeedRequestTime = Math.round(perfService.absNow() - start);
     }
     await this.cache.set("feeds", newFeeds);
-    sendUpdate({type: at.DISCOVERY_STREAM_FEEDS_UPDATE, data: newFeeds});
+    sendUpdate({
+      type: at.DISCOVERY_STREAM_FEEDS_UPDATE,
+    });
   }
 
   async loadSpocs(sendUpdate, isStartup) {
     const cachedData = await this.cache.get() || {};
     let spocs;
 
     if (this.showSpocs) {
       spocs = cachedData.spocs;
@@ -610,28 +619,29 @@ this.DiscoveryStreamFeed = class Discove
       return !campaignCapExceeded;
     }
     return true;
   }
 
   async getComponentFeed(feedUrl, isStartup) {
     const cachedData = await this.cache.get() || {};
     const {feeds} = cachedData;
+
     let feed = feeds ? feeds[feedUrl] : null;
     if (this.isExpired({cachedData, key: "feed", url: feedUrl, isStartup})) {
       const feedResponse = await this.fetchFromEndpoint(feedUrl);
       if (feedResponse) {
         const {data: scoredItems} = this.scoreItems(feedResponse.recommendations);
         const {recsExpireTime} = feedResponse.settings;
         const recommendations = this.rotate(scoredItems, recsExpireTime);
         this.componentFeedFetched = true;
         feed = {
           lastUpdated: Date.now(),
           data: {
-            ...feedResponse,
+            settings: feedResponse.settings,
             recommendations,
           },
         };
       } else {
         Cu.reportError("No response for feed");
       }
     }
 
@@ -668,18 +678,18 @@ this.DiscoveryStreamFeed = class Discove
     const {updateOpenTabs, isStartup} = options;
     const dispatch = updateOpenTabs ?
       action => this.store.dispatch(ac.BroadcastToContent(action)) :
       this.store.dispatch;
 
     this.loadAffinityScoresCache();
     await this.loadLayout(dispatch, isStartup);
     await Promise.all([
+      this.loadSpocs(dispatch, isStartup).catch(error => Cu.reportError(`Error trying to load spocs feed: ${error}`)),
       this.loadComponentFeeds(dispatch, isStartup).catch(error => Cu.reportError(`Error trying to load component feeds: ${error}`)),
-      this.loadSpocs(dispatch, isStartup).catch(error => Cu.reportError(`Error trying to load spocs feed: ${error}`)),
     ]);
     if (isStartup) {
       await this._maybeUpdateCachedData();
     }
   }
 
   // We have to rotate stories on the client so that
   // active stories are at the front of the list, followed by stories that have expired
@@ -1027,103 +1037,109 @@ defaultLayoutResp = {
       ],
     },
     {
       "width": 12,
       "components": [
         {
           "type": "CardGrid",
           "properties": {
-            "items": 4,
+            "items": 3,
           },
           "header": {
             "title": "",
           },
           "feed": {
             "embed_reference": null,
             "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?version=3&consumer_key=$apiKey&locale_lang=en-US",
           },
           "spocs": {
             "probability": 1,
             "positions": [
               {
-                "index": 3,
+                "index": 2,
               },
             ],
           },
         },
       ],
     },
     {
       "width": 12,
       "components": [
         {
           "type": "CardGrid",
           "header": {
             "title": "Health & Fitness 💪",
           },
           "feed": {
             "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=4&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
+            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=4&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
           },
           "properties": {
             "items": 4,
             "has_numbers": false,
             "has_images": true,
-            "border": "no-border",
+          },
+          "styles": {
+            ".ds-header": "margin-top: 4px;",
           },
           "spocs": {
             "probability": 1,
             "positions": [
               {
-                "index": 3,
+                "index": 2,
               },
             ],
           },
         },
       ],
     },
     {
       "width": 12,
       "components": [
         {
           "type": "CardGrid",
           "header": {
             "title": "Tech 🖥",
           },
           "feed": {
             "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=5&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
+            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=5&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
           },
           "properties": {
             "items": 4,
             "has_numbers": false,
             "has_images": true,
-            "border": "no-border",
+          },
+          "styles": {
+            ".ds-header": "margin-top: 4px;",
           },
         },
       ],
     },
     {
       "width": 12,
       "components": [
         {
           "type": "CardGrid",
           "header": {
             "title": "Entertainment 🍿",
           },
           "feed": {
             "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=8&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
+            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=8&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
           },
           "properties": {
             "items": 4,
             "has_numbers": false,
             "has_images": true,
-            "border": "no-border",
+          },
+          "styles": {
+            ".ds-header": "margin-top: 4px;",
           },
           "spocs": {
             "probability": 1,
             "positions": [
               {
                 "index": 3,
               },
             ],
@@ -1136,65 +1152,71 @@ defaultLayoutResp = {
       "components": [
         {
           "type": "CardGrid",
           "header": {
             "title": "Personal Finance 💰",
           },
           "feed": {
             "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=2&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
+            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=2&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
+          },
+          "styles": {
+            ".ds-header": "margin-top: 4px;",
           },
           "properties": {
             "items": 4,
             "has_numbers": false,
             "has_images": true,
-            "border": "no-border",
           },
         },
       ],
     },
     {
       "width": 12,
       "components": [
         {
           "type": "CardGrid",
           "header": {
             "title": "Business 💼",
           },
           "feed": {
             "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=1&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
+            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=1&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
           },
           "properties": {
             "items": 4,
             "has_numbers": false,
             "has_images": true,
-            "border": "no-border",
+          },
+          "styles": {
+            ".ds-header": "margin-top: 4px;",
           },
         },
       ],
     },
     {
       "width": 12,
       "components": [
         {
           "type": "CardGrid",
           "header": {
             "title": "Science 🔬",
           },
           "feed": {
             "embed_reference": null,
-            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=7&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
+            "url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=7&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
           },
           "properties": {
             "items": 4,
             "has_numbers": false,
             "has_images": true,
-            "border": "no-border",
+          },
+          "styles": {
+            ".ds-header": "margin-top: 4px;",
           },
           "spocs": {
             "probability": 1,
             "positions": [
               {
                 "index": 3,
               },
             ],
--- a/browser/components/newtab/lib/OnboardingMessageProvider.jsm
+++ b/browser/components/newtab/lib/OnboardingMessageProvider.jsm
@@ -143,16 +143,17 @@ const ONBOARDING_MESSAGES = async () => 
     trigger: {id: "showOnboarding"},
   },
   {
     id: "TRAILHEAD_1",
     template: "trailhead",
     targeting: "trailheadInterrupt == 'join'",
     trigger: {id: "firstRun"},
     includeBundle: {length: 3, template: "onboarding", trigger: {id: "showOnboarding"}},
+    utm_term: "trailhead-join",
     content: {
       className: "joinCohort",
       title: {string_id: "onboarding-welcome-body"},
       benefits: ["products", "knowledge", "privacy"].map(id => (
         {
           id,
           title: {string_id: `onboarding-benefit-${id}-title`},
           text: {string_id: `onboarding-benefit-${id}-text`},
@@ -172,16 +173,17 @@ const ONBOARDING_MESSAGES = async () => 
     },
   },
   {
     id: "TRAILHEAD_2",
     template: "trailhead",
     targeting: "trailheadInterrupt == 'sync'",
     trigger: {id: "firstRun"},
     includeBundle: {length: 3, template: "onboarding", trigger: {id: "showOnboarding"}},
+    utm_term: "trailhead-sync",
     content: {
       className: "syncCohort",
       title: {property_id: "firstrun_title"},
       subtitle: {property_id: "firstrun_content"},
       benefits: [],
       learn: {
         text: {property_id: "firstrun_learn_more_link"},
         url: "https://www.mozilla.org/firefox/accounts/",
@@ -196,16 +198,17 @@ const ONBOARDING_MESSAGES = async () => 
     },
   },
   {
     id: "TRAILHEAD_3",
     template: "trailhead",
     targeting: "trailheadInterrupt == 'cards'",
     trigger: {id: "firstRun"},
     includeBundle: {length: 3, template: "onboarding", trigger: {id: "showOnboarding"}},
+    utm_term: "trailhead-cards",
   },
   {
     id: "TRAILHEAD_4",
     template: "trailhead",
     targeting: "trailheadInterrupt == 'nofirstrun'",
     trigger: {id: "firstRun"},
   },
   {
@@ -236,17 +239,18 @@ const ONBOARDING_MESSAGES = async () => 
     content: {
       title: {string_id: "onboarding-data-sync-title"},
       text: {string_id: "onboarding-data-sync-text"},
       icon: "devices",
       primary_button: {
         label: {string_id: "onboarding-data-sync-button"},
         action: {
           type: "OPEN_URL",
-          data: {args: "https://accounts.firefox.com/?service=sync&action=email&context=fx_desktop_v3&entrypoint=activity-stream-firstrun&utm_source=activity-stream&utm_campaign=firstrun", where: "tabshifted"},
+          addFlowParams: true,
+          data: {args: "https://accounts.firefox.com/?service=sync&action=email&context=fx_desktop_v3&entrypoint=activity-stream-firstrun&style=trailhead", where: "tabshifted"},
         },
       },
     },
     targeting: "trailheadTriplet == 'supercharge'",
     trigger: {id: "showOnboarding"},
   },
   {
     id: "TRAILHEAD_CARD_3",
@@ -269,21 +273,21 @@ const ONBOARDING_MESSAGES = async () => 
     trigger: {id: "showOnboarding"},
   },
   {
     id: "TRAILHEAD_CARD_4",
     template: "onboarding",
     bundled: 3,
     order: 1,
     content: {
-      title: {string_id: "onboarding-private-browsing-title"},
-      text: {string_id: "onboarding-private-browsing-text"},
+      title: {string_id: "onboarding-browse-privately-title"},
+      text: {string_id: "onboarding-browse-privately-text"},
       icon: "private",
       primary_button: {
-        label: {string_id: "onboarding-private-browsing-button"},
+        label: {string_id: "onboarding-browse-privately-button"},
         action: {type: "OPEN_PRIVATE_BROWSER_WINDOW"},
       },
     },
     targeting: "trailheadTriplet == 'privacy'",
     trigger: {id: "showOnboarding"},
   },
   {
     id: "TRAILHEAD_CARD_5",
@@ -293,17 +297,17 @@ const ONBOARDING_MESSAGES = async () => 
     content: {
       title: {string_id: "onboarding-firefox-send-title"},
       text: {string_id: "onboarding-firefox-send-text"},
       icon: "ffsend",
       primary_button: {
         label: {string_id: "onboarding-firefox-send-button"},
         action: {
           type: "OPEN_URL",
-          data: {args: "https://send.firefox.com/?utm_source=activity-stream?utm_medium=referral?utm_campaign=firstrun", where: "tabshifted"},
+          data: {args: "https://send.firefox.com/", where: "tabshifted"},
         },
       },
     },
     targeting: "trailheadTriplet == 'payoff'",
     trigger: {id: "showOnboarding"},
   },
   {
     id: "TRAILHEAD_CARD_6",
@@ -324,35 +328,16 @@ const ONBOARDING_MESSAGES = async () => 
     },
     targeting: "trailheadTriplet in ['supercharge', 'multidevice']",
     trigger: {id: "showOnboarding"},
   },
   {
     id: "TRAILHEAD_CARD_7",
     template: "onboarding",
     bundled: 3,
-    content: {
-      title: {string_id: "onboarding-privacy-right-title"},
-      text: {string_id: "onboarding-privacy-right-text"},
-      icon: "pledge",
-      primary_button: {
-        label: {string_id: "onboarding-privacy-right-button"},
-        action: {
-          type: "OPEN_URL",
-          data: {args: "https://www.mozilla.org/?privacy-right", where: "tabshifted"},
-        },
-      },
-    },
-    targeting: "trailheadTriplet == 'unused'",
-    trigger: {id: "showOnboarding"},
-  },
-  {
-    id: "TRAILHEAD_CARD_8",
-    template: "onboarding",
-    bundled: 3,
     order: 3,
     content: {
       title: {string_id: "onboarding-send-tabs-title"},
       text: {string_id: "onboarding-send-tabs-text"},
       icon: "sendtab",
       primary_button: {
         label: {string_id: "onboarding-send-tabs-button"},
         action: {
@@ -360,17 +345,17 @@ const ONBOARDING_MESSAGES = async () => 
           data: {args: "https://blog.mozilla.org/firefox/send-tabs-a-better-way/", where: "tabshifted"},
         },
       },
     },
     targeting: "trailheadTriplet == 'multidevice'",
     trigger: {id: "showOnboarding"},
   },
   {
-    id: "TRAILHEAD_CARD_9",
+    id: "TRAILHEAD_CARD_8",
     template: "onboarding",
     bundled: 3,
     order: 2,
     content: {
       title: {string_id: "onboarding-pocket-anywhere-title"},
       text: {string_id: "onboarding-pocket-anywhere-text"},
       icon: "pocket",
       primary_button: {
@@ -380,17 +365,17 @@ const ONBOARDING_MESSAGES = async () => 
           data: {args: "https://getpocket.com/firefox_learnmore", where: "tabshifted"},
         },
       },
     },
     targeting: "trailheadTriplet == 'multidevice'",
     trigger: {id: "showOnboarding"},
   },
   {
-    id: "TRAILHEAD_CARD_10",
+    id: "TRAILHEAD_CARD_9",
     template: "onboarding",
     bundled: 3,
     order: 3,
     content: {
       title: {string_id: "onboarding-lockwise-passwords-title"},
       text: {string_id: "onboarding-lockwise-passwords-text"},
       icon: "lockwise",
       primary_button: {
@@ -400,17 +385,17 @@ const ONBOARDING_MESSAGES = async () => 
           data: {args: "https://lockwise.firefox.com/", where: "tabshifted"},
         },
       },
     },
     targeting: "trailheadTriplet == 'privacy'",
     trigger: {id: "showOnboarding"},
   },
   {
-    id: "TRAILHEAD_CARD_11",
+    id: "TRAILHEAD_CARD_10",
     template: "onboarding",
     bundled: 3,
     order: 4,
     content: {
       title: {string_id: "onboarding-facebook-container-title"},
       text: {string_id: "onboarding-facebook-container-text"},
       icon: "fbcont",
       primary_button: {
--- a/browser/components/newtab/lib/TopSitesFeed.jsm
+++ b/browser/components/newtab/lib/TopSitesFeed.jsm
@@ -37,17 +37,17 @@ const DEFAULT_TOP_SITES = [];
 const FRECENCY_THRESHOLD = 100 + 1; // 1 visit (skip first-run/one-time pages)
 const MIN_FAVICON_SIZE = 96;
 const CACHED_LINK_PROPS_TO_MIGRATE = ["screenshot", "customScreenshot"];
 const PINNED_FAVICON_PROPS_TO_MIGRATE = ["favicon", "faviconRef", "faviconSize"];
 const SECTION_ID = "topsites";
 const ROWS_PREF = "topSitesRows";
 
 // Search experiment stuff
-const NO_DEFAULT_SEARCH_TILE_EXP_PREF = "improvesearch.noDefaultSearchTile";
+const FILTER_DEFAULT_SEARCH_PREF = "improvesearch.noDefaultSearchTile";
 const SEARCH_FILTERS = [
   "google",
   "search.yahoo",
   "yahoo",
   "bing",
   "ask",
   "duckduckgo",
 ];
@@ -82,17 +82,17 @@ this.TopSitesFeed = class TopSitesFeed {
   uninit() {
     PageThumbs.removeExpirationFilter(this);
     Services.obs.removeObserver(this, "browser-search-engine-modified");
   }
 
   observe(subj, topic, data) {
     // We should update the current top sites if the search engine has been changed since
     // the search engine that gets filtered out of top sites has changed.
-    if (topic === "browser-search-engine-modified" && data === "engine-default" && this.store.getState().Prefs.values[NO_DEFAULT_SEARCH_TILE_EXP_PREF]) {
+    if (topic === "browser-search-engine-modified" && data === "engine-default" && this.store.getState().Prefs.values[FILTER_DEFAULT_SEARCH_PREF]) {
       delete this._currentSearchHostname;
       this._currentSearchHostname = getShortURLForCurrentSearch();
       this.refresh({broadcast: true});
     }
   }
 
   _dedupeKey(site) {
     return site && site.hostname;
@@ -122,30 +122,24 @@ this.TopSitesFeed = class TopSitesFeed {
       if (site.customScreenshotURL) {
         acc.push(site.customScreenshotURL);
       }
       return acc;
     }, []));
   }
 
   /**
-   * isExperimentOnAndLinkFilteredSearch - is the experiment on and does a given hostname match the user's default search engine?
+   * shouldFilterSearchTile - is default filtering enabled and does a given hostname match the user's default search engine?
    *
    * @param {string} hostname a top site hostname, such as "amazon" or "foo"
    * @returns {bool}
    */
-  isExperimentOnAndLinkFilteredSearch(hostname) {
-    if (!this.store.getState().Prefs.values[NO_DEFAULT_SEARCH_TILE_EXP_PREF]) {
-      return false;
-    }
-    // If TopSite Search Shortcuts is enabled we don't want to filter those sites out
-    if (this.store.getState().Prefs.values[SEARCH_SHORTCUTS_EXPERIMENT] && getSearchProvider(hostname)) {
-      return false;
-    }
-    if (SEARCH_FILTERS.includes(hostname) || hostname === this._currentSearchHostname) {
+  shouldFilterSearchTile(hostname) {
+    if (this.store.getState().Prefs.values[FILTER_DEFAULT_SEARCH_PREF] &&
+      (SEARCH_FILTERS.includes(hostname) || hostname === this._currentSearchHostname)) {
       return true;
     }
     return false;
   }
 
   /**
    * _maybeInsertSearchShortcuts - if the search shortcuts experiment is running,
    *                               insert search shortcuts if needed
@@ -222,31 +216,31 @@ this.TopSitesFeed = class TopSitesFeed {
     let frecent = [];
     const cache = await this.frecentCache.request({
       // We need to overquery due to the top 5 alexa search + default search possibly being removed
       numItems: numItems + SEARCH_FILTERS.length + 1,
       topsiteFrecency: FRECENCY_THRESHOLD,
     });
     for (let link of cache) {
       const hostname = shortURL(link);
-      if (!this.isExperimentOnAndLinkFilteredSearch(hostname)) {
+      if (!this.shouldFilterSearchTile(hostname)) {
         frecent.push({
           ...(searchShortcutsExperiment ? await this.topSiteToSearchTopSite(link) : link),
           hostname,
         });
       }
     }
 
     // Remove any defaults that have been blocked.
     let notBlockedDefaultSites = [];
     for (let link of DEFAULT_TOP_SITES) {
       const searchProvider = getSearchProvider(shortURL(link));
       if (NewTabUtils.blockedLinks.isBlocked({url: link.url})) {
         continue;
-      } else if (this.isExperimentOnAndLinkFilteredSearch(link.hostname)) {
+      } else if (this.shouldFilterSearchTile(link.hostname)) {
         continue;
         // If we've previously blocked a search shortcut, remove the default top site
         // that matches the hostname
       } else if (searchProvider && NewTabUtils.blockedLinks.isBlocked({url: searchProvider.url})) {
         continue;
       }
       notBlockedDefaultSites.push(
         searchShortcutsExperiment ? await this.topSiteToSearchTopSite(link) : link,
@@ -665,17 +659,17 @@ this.TopSitesFeed = class TopSitesFeed {
         this.refresh({broadcast: true});
         break;
       case at.PREF_CHANGED:
         switch (action.data.name) {
           case DEFAULT_SITES_PREF:
             this.refreshDefaults(action.data.value);
             break;
           case ROWS_PREF:
-          case NO_DEFAULT_SEARCH_TILE_EXP_PREF:
+          case FILTER_DEFAULT_SEARCH_PREF:
           case SEARCH_SHORTCUTS_SEARCH_ENGINES_PREF:
             this.refresh({broadcast: true});
             break;
           case SEARCH_SHORTCUTS_EXPERIMENT:
             if (action.data.value) {
               this.updateCustomSearchShortcuts();
             } else {
               this.disableSearchImprovements();
--- a/browser/components/newtab/prerendered/locales/ach/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/ach/activity-stream-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Dirica matidi manyen</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><!-- Regular React Rendering --></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
   </body>
 </html>
--- a/browser/components/newtab/prerendered/locales/ach/activity-stream-prerendered-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/ach/activity-stream-prerendered-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Dirica matidi manyen</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><div><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><div class="search-inner-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>Yeny kakube</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Yeny kakube" title="Yeny kakube"/><button id="searchSubmit" class="search-button" title="Yeny"><span class="sr-only"><span>Yeny</span></span></button></div></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>Kakube maloyo</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Yab jami ayera"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>Lami tam obedo Pocket</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Yab jami ayera"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="top-stories-bottom-container"><div class="wrapper-more-recommendations"></div></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>Wiye madito</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Yab jami ayera"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="Yub potbuk me dirica matidi mamegi manyen"></button></div></div></main></div></div></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
   </body>
 </html>
--- a/browser/components/newtab/prerendered/locales/ach/activity-stream-prerendered.html
+++ b/browser/components/newtab/prerendered/locales/ach/activity-stream-prerendered.html
@@ -4,19 +4,19 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Dirica matidi manyen</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><div><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><div class="search-inner-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>Yeny kakube</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Yeny kakube" title="Yeny kakube"/><button id="searchSubmit" class="search-button" title="Yeny"><span class="sr-only"><span>Yeny</span></span></button></div></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>Kakube maloyo</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Yab jami ayera"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>Lami tam obedo Pocket</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Yab jami ayera"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="top-stories-bottom-container"><div class="wrapper-more-recommendations"></div></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>Wiye madito</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Yab jami ayera"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="Yub potbuk me dirica matidi mamegi manyen"></button></div></div></main></div></div></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
     <script src="resource://activity-stream/prerendered/static/activity-stream-initial-state.js"></script>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
     <script src="chrome://browser/content/contentTheme.js"></script>
     <script src="resource://activity-stream/vendor/react.js"></script>
     <script src="resource://activity-stream/vendor/react-dom.js"></script>
     <script src="resource://activity-stream/vendor/prop-types.js"></script>
     <script src="resource://activity-stream/vendor/react-intl.js"></script>
     <script src="resource://activity-stream/vendor/redux.js"></script>
--- a/browser/components/newtab/prerendered/locales/ach/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/ach/activity-stream.html
@@ -4,19 +4,19 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Dirica matidi manyen</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><!-- Regular React Rendering --></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
     <script src="chrome://browser/content/contentTheme.js"></script>
     <script src="resource://activity-stream/vendor/react.js"></script>
     <script src="resource://activity-stream/vendor/react-dom.js"></script>
     <script src="resource://activity-stream/vendor/prop-types.js"></script>
     <script src="resource://activity-stream/vendor/react-intl.js"></script>
     <script src="resource://activity-stream/vendor/redux.js"></script>
     <script src="resource://activity-stream/vendor/react-redux.js"></script>
--- a/browser/components/newtab/prerendered/locales/an/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/an/activity-stream-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Nueva Pestanya</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><!-- Regular React Rendering --></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
   </body>
 </html>
--- a/browser/components/newtab/prerendered/locales/an/activity-stream-prerendered-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/an/activity-stream-prerendered-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Nueva Pestanya</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><div><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><div class="search-inner-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>Mirar en o Web</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Mirar en o Web" title="Mirar en o Web"/><button id="searchSubmit" class="search-button" title="Mirar"><span class="sr-only"><span>Mirar</span></span></button></div></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>Mas freqüents</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Ubrir lo menú contextual d&#x27;a sección</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>Recomendau per Pocket</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Ubrir lo menú contextual d&#x27;a sección</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="top-stories-bottom-container"><div class="wrapper-more-recommendations"></div></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>Destacaus</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Ubrir lo menú contextual d&#x27;a sección</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="Personaliza la tuya pachina de Nueva Pestanya"></button></div></div></main></div></div></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
   </body>
 </html>
--- a/browser/components/newtab/prerendered/locales/an/activity-stream-prerendered.html
+++ b/browser/components/newtab/prerendered/locales/an/activity-stream-prerendered.html
@@ -4,19 +4,19 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Nueva Pestanya</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><div><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><div class="search-inner-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>Mirar en o Web</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Mirar en o Web" title="Mirar en o Web"/><button id="searchSubmit" class="search-button" title="Mirar"><span class="sr-only"><span>Mirar</span></span></button></div></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>Mas freqüents</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Ubrir lo menú contextual d&#x27;a sección</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar este puesto"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>Recomendau per Pocket</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Ubrir lo menú contextual d&#x27;a sección</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="top-stories-bottom-container"><div class="wrapper-more-recommendations"></div></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>Destacaus</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Ubrir lo menú contextual d&#x27;a sección</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="Personaliza la tuya pachina de Nueva Pestanya"></button></div></div></main></div></div></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
     <script src="resource://activity-stream/prerendered/static/activity-stream-initial-state.js"></script>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
     <script src="chrome://browser/content/contentTheme.js"></script>
     <script src="resource://activity-stream/vendor/react.js"></script>
     <script src="resource://activity-stream/vendor/react-dom.js"></script>
     <script src="resource://activity-stream/vendor/prop-types.js"></script>
     <script src="resource://activity-stream/vendor/react-intl.js"></script>
     <script src="resource://activity-stream/vendor/redux.js"></script>
--- a/browser/components/newtab/prerendered/locales/an/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/an/activity-stream.html
@@ -4,19 +4,19 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Nueva Pestanya</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><!-- Regular React Rendering --></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
     <script src="chrome://browser/content/contentTheme.js"></script>
     <script src="resource://activity-stream/vendor/react.js"></script>
     <script src="resource://activity-stream/vendor/react-dom.js"></script>
     <script src="resource://activity-stream/vendor/prop-types.js"></script>
     <script src="resource://activity-stream/vendor/react-intl.js"></script>
     <script src="resource://activity-stream/vendor/redux.js"></script>
     <script src="resource://activity-stream/vendor/react-redux.js"></script>
--- a/browser/components/newtab/prerendered/locales/ar/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/ar/activity-stream-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>لسان جديد</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><!-- Regular React Rendering --></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
   </body>
 </html>
--- a/browser/components/newtab/prerendered/locales/ar/activity-stream-prerendered-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/ar/activity-stream-prerendered-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>لسان جديد</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><div><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><div class="search-inner-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>ابحث في الوِب</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="ابحث في الوِب" title="ابحث في الوِب"/><button id="searchSubmit" class="search-button" title="ابحث"><span class="sr-only"><span>ابحث</span></span></button></div></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>المواقع الأكثر زيارة</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="افتح القائمة"><span class="sr-only"><span>افتح قائمة القسم السياقية</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>ينصح به Pocket</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="افتح القائمة"><span class="sr-only"><span>افتح قائمة القسم السياقية</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="top-stories-bottom-container"><div class="wrapper-more-recommendations"></div></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>أهم الأحداث</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="افتح القائمة"><span class="sr-only"><span>افتح قائمة القسم السياقية</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="خصص صفحة اللسان الجديد"></button></div></div></main></div></div></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
   </body>
 </html>
--- a/browser/components/newtab/prerendered/locales/ar/activity-stream-prerendered.html
+++ b/browser/components/newtab/prerendered/locales/ar/activity-stream-prerendered.html
@@ -4,19 +4,19 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>لسان جديد</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><div><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><div class="search-inner-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>ابحث في الوِب</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="ابحث في الوِب" title="ابحث في الوِب"/><button id="searchSubmit" class="search-button" title="ابحث"><span class="sr-only"><span>ابحث</span></span></button></div></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>المواقع الأكثر زيارة</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="افتح القائمة"><span class="sr-only"><span>افتح قائمة القسم السياقية</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="حرّر هذا الموقع"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>ينصح به Pocket</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="افتح القائمة"><span class="sr-only"><span>افتح قائمة القسم السياقية</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="top-stories-bottom-container"><div class="wrapper-more-recommendations"></div></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>أهم الأحداث</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="افتح القائمة"><span class="sr-only"><span>افتح قائمة القسم السياقية</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="خصص صفحة اللسان الجديد"></button></div></div></main></div></div></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
     <script src="resource://activity-stream/prerendered/static/activity-stream-initial-state.js"></script>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
     <script src="chrome://browser/content/contentTheme.js"></script>
     <script src="resource://activity-stream/vendor/react.js"></script>
     <script src="resource://activity-stream/vendor/react-dom.js"></script>
     <script src="resource://activity-stream/vendor/prop-types.js"></script>
     <script src="resource://activity-stream/vendor/react-intl.js"></script>
     <script src="resource://activity-stream/vendor/redux.js"></script>
--- a/browser/components/newtab/prerendered/locales/ar/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/ar/activity-stream.html
@@ -4,19 +4,19 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>لسان جديد</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><!-- Regular React Rendering --></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
     <script src="chrome://browser/content/contentTheme.js"></script>
     <script src="resource://activity-stream/vendor/react.js"></script>
     <script src="resource://activity-stream/vendor/react-dom.js"></script>
     <script src="resource://activity-stream/vendor/prop-types.js"></script>
     <script src="resource://activity-stream/vendor/react-intl.js"></script>
     <script src="resource://activity-stream/vendor/redux.js"></script>
     <script src="resource://activity-stream/vendor/react-redux.js"></script>
--- a/browser/components/newtab/prerendered/locales/ast/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/ast/activity-stream-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Llingüeta nueva</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><!-- Regular React Rendering --></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
   </body>
 </html>
--- a/browser/components/newtab/prerendered/locales/ast/activity-stream-prerendered-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/ast/activity-stream-prerendered-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Llingüeta nueva</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><div><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><div class="search-inner-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>Guetar na web</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Guetar na web" title="Guetar na web"/><button id="searchSubmit" class="search-button" title="Guetar"><span class="sr-only"><span>Guetar</span></span></button></div></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>Más visitaos</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>Recomendáu por Pocket</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="top-stories-bottom-container"><div class="wrapper-more-recommendations"></div></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>Destacaos</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="Personalizar páxina Llingüeta nueva"></button></div></div></main></div></div></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
   </body>
 </html>
--- a/browser/components/newtab/prerendered/locales/ast/activity-stream-prerendered.html
+++ b/browser/components/newtab/prerendered/locales/ast/activity-stream-prerendered.html
@@ -4,19 +4,19 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Llingüeta nueva</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><div><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><div class="search-inner-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>Guetar na web</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Guetar na web" title="Guetar na web"/><button id="searchSubmit" class="search-button" title="Guetar"><span class="sr-only"><span>Guetar</span></span></button></div></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>Más visitaos</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>Recomendáu por Pocket</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="top-stories-bottom-container"><div class="wrapper-more-recommendations"></div></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>Destacaos</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Open menu"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="Personalizar páxina Llingüeta nueva"></button></div></div></main></div></div></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
     <script src="resource://activity-stream/prerendered/static/activity-stream-initial-state.js"></script>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
     <script src="chrome://browser/content/contentTheme.js"></script>
     <script src="resource://activity-stream/vendor/react.js"></script>
     <script src="resource://activity-stream/vendor/react-dom.js"></script>
     <script src="resource://activity-stream/vendor/prop-types.js"></script>
     <script src="resource://activity-stream/vendor/react-intl.js"></script>
     <script src="resource://activity-stream/vendor/redux.js"></script>
--- a/browser/components/newtab/prerendered/locales/ast/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/ast/activity-stream.html
@@ -4,19 +4,19 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Llingüeta nueva</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><!-- Regular React Rendering --></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
     <script src="chrome://browser/content/contentTheme.js"></script>
     <script src="resource://activity-stream/vendor/react.js"></script>
     <script src="resource://activity-stream/vendor/react-dom.js"></script>
     <script src="resource://activity-stream/vendor/prop-types.js"></script>
     <script src="resource://activity-stream/vendor/react-intl.js"></script>
     <script src="resource://activity-stream/vendor/redux.js"></script>
     <script src="resource://activity-stream/vendor/react-redux.js"></script>
--- a/browser/components/newtab/prerendered/locales/az/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/az/activity-stream-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Yeni Vərəq</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><!-- Regular React Rendering --></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
   </body>
 </html>
--- a/browser/components/newtab/prerendered/locales/az/activity-stream-prerendered-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/az/activity-stream-prerendered-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Yeni Vərəq</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><div><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><div class="search-inner-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>İnternetdə Axtar</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="İnternetdə Axtar" title="İnternetdə Axtar"/><button id="searchSubmit" class="search-button" title="Axtar"><span class="sr-only"><span>Axtar</span></span></button></div></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>Qabaqcıl Saytlar</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Menyunu aç"><span class="sr-only"><span>Kontekst menyusu bölməsini aç</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>Pocket məsləhət görür</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Menyunu aç"><span class="sr-only"><span>Kontekst menyusu bölməsini aç</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="top-stories-bottom-container"><div class="wrapper-more-recommendations"></div></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>Seçilmişlər</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Menyunu aç"><span class="sr-only"><span>Kontekst menyusu bölməsini aç</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="Yeni Vərəq səhifənizi fərdiləşdirin"></button></div></div></main></div></div></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
   </body>
 </html>
--- a/browser/components/newtab/prerendered/locales/az/activity-stream-prerendered.html
+++ b/browser/components/newtab/prerendered/locales/az/activity-stream-prerendered.html
@@ -4,19 +4,19 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Yeni Vərəq</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><div><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><div class="search-inner-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>İnternetdə Axtar</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="İnternetdə Axtar" title="İnternetdə Axtar"/><button id="searchSubmit" class="search-button" title="Axtar"><span class="sr-only"><span>Axtar</span></span></button></div></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>Qabaqcıl Saytlar</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Menyunu aç"><span class="sr-only"><span>Kontekst menyusu bölməsini aç</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a tabindex="0" draggable="true"><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Bu saytı düzəlt"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>Pocket məsləhət görür</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Menyunu aç"><span class="sr-only"><span>Kontekst menyusu bölməsini aç</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="top-stories-bottom-container"><div class="wrapper-more-recommendations"></div></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target-container"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>Seçilmişlər</span></span><span class="click-target"></span><span class="learn-more-link-wrapper"></span></span></h3><div><button class="context-menu-button icon" title="Menyunu aç"><span class="sr-only"><span>Kontekst menyusu bölməsini aç</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="Yeni Vərəq səhifənizi fərdiləşdirin"></button></div></div></main></div></div></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
     <script src="resource://activity-stream/prerendered/static/activity-stream-initial-state.js"></script>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
     <script src="chrome://browser/content/contentTheme.js"></script>
     <script src="resource://activity-stream/vendor/react.js"></script>
     <script src="resource://activity-stream/vendor/react-dom.js"></script>
     <script src="resource://activity-stream/vendor/prop-types.js"></script>
     <script src="resource://activity-stream/vendor/react-intl.js"></script>
     <script src="resource://activity-stream/vendor/redux.js"></script>
--- a/browser/components/newtab/prerendered/locales/az/activity-stream.html
+++ b/browser/components/newtab/prerendered/locales/az/activity-stream.html
@@ -4,19 +4,19 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Yeni Vərəq</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><!-- Regular React Rendering --></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
     <script src="chrome://browser/content/contentSearchUI.js"></script>
     <script src="chrome://browser/content/contentTheme.js"></script>
     <script src="resource://activity-stream/vendor/react.js"></script>
     <script src="resource://activity-stream/vendor/react-dom.js"></script>
     <script src="resource://activity-stream/vendor/prop-types.js"></script>
     <script src="resource://activity-stream/vendor/react-intl.js"></script>
     <script src="resource://activity-stream/vendor/redux.js"></script>
     <script src="resource://activity-stream/vendor/react-redux.js"></script>
--- a/browser/components/newtab/prerendered/locales/be/activity-stream-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/be/activity-stream-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Новая картка</title>
     <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="resource://activity-stream/css/activity-stream.css" />
   </head>
   <body class="activity-stream">
-    <div id="header-asrouter-container"></div>
+    <div id="header-asrouter-container" role="presentation"></div>
     <div id="root"><!-- Regular React Rendering --></div>
-    <div id="footer-asrouter-container"></div>
+    <div id="footer-asrouter-container" role="presentation"></div>
   </body>
 </html>
--- a/browser/components/newtab/prerendered/locales/be/activity-stream-prerendered-noscripts.html
+++ b/browser/components/newtab/prerendered/locales/be/activity-stream-prerendered-noscripts.html
@@ -4,13 +4,13 @@
     <meta charset="utf-8">
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>Новая картка</title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />