Merge mc -> pine draft
authorGregor Wagner <gwagner@mozilla.com>
Mon, 30 Nov 2015 14:05:36 +0100
changeset 388234 b1c4cf64515b6140205164b64d914ddc45314b3d
parent 388233 4326780ff3635d16bacf19bea67593a82e25f54f (current diff)
parent 312078 a18630f9ab42ddfde03ba8c7757a42069c48c7ed (diff)
child 388235 80baa2277a0f37f544429ad1259a070778be33ce
push id23132
push userbmo:lissyx+mozillians@lissyx.dyndns.org
push dateFri, 15 Jul 2016 10:07:12 +0000
milestone45.0a1
Merge mc -> pine
b2g/app/b2g.js
b2g/config/gaia.json
browser/app/jar.mn
browser/base/content/browser-loop.js
browser/components/loop/.eslintignore
browser/components/loop/.eslintrc
browser/components/loop/.eslintrc-gecko
browser/components/loop/.gitignore
browser/components/loop/README.txt
browser/components/loop/build-jsx
browser/components/loop/content/conversation.html
browser/components/loop/content/css/panel.css
browser/components/loop/content/js/.eslintrc
browser/components/loop/content/js/conversation.js
browser/components/loop/content/js/conversation.jsx
browser/components/loop/content/js/conversationAppStore.js
browser/components/loop/content/js/feedbackViews.js
browser/components/loop/content/js/feedbackViews.jsx
browser/components/loop/content/js/otconfig.js
browser/components/loop/content/js/panel.js
browser/components/loop/content/js/panel.jsx
browser/components/loop/content/js/roomStore.js
browser/components/loop/content/js/roomViews.js
browser/components/loop/content/js/roomViews.jsx
browser/components/loop/content/libs/l10n.js
browser/components/loop/content/panel.html
browser/components/loop/content/shared/README.md
browser/components/loop/content/shared/css/common.css
browser/components/loop/content/shared/css/conversation.css
browser/components/loop/content/shared/css/reset.css
browser/components/loop/content/shared/img/02.png
browser/components/loop/content/shared/img/02@2x.png
browser/components/loop/content/shared/img/animated-spinner.svg
browser/components/loop/content/shared/img/audio-call-avatar.svg
browser/components/loop/content/shared/img/audio-default-16x16@1.5x.png
browser/components/loop/content/shared/img/audio-default-16x16@2x.png
browser/components/loop/content/shared/img/avatars.svg
browser/components/loop/content/shared/img/beta-ribbon.svg
browser/components/loop/content/shared/img/chatbubble-arrow-left.svg
browser/components/loop/content/shared/img/chatbubble-arrow-right.svg
browser/components/loop/content/shared/img/check.svg
browser/components/loop/content/shared/img/ellipsis-v.svg
browser/components/loop/content/shared/img/empty_conversations.svg
browser/components/loop/content/shared/img/empty_search.svg
browser/components/loop/content/shared/img/facemute-14x14.png
browser/components/loop/content/shared/img/facemute-14x14@2x.png
browser/components/loop/content/shared/img/firefox-avatar.svg
browser/components/loop/content/shared/img/firefox-logo.png
browser/components/loop/content/shared/img/hangup-inverse-14x14.png
browser/components/loop/content/shared/img/hangup-inverse-14x14@2x.png
browser/components/loop/content/shared/img/happy.png
browser/components/loop/content/shared/img/hello_logo.svg
browser/components/loop/content/shared/img/helloicon.svg
browser/components/loop/content/shared/img/icon_32.png
browser/components/loop/content/shared/img/icon_64.png
browser/components/loop/content/shared/img/icons-10x10.svg
browser/components/loop/content/shared/img/icons-14x14.svg
browser/components/loop/content/shared/img/icons-16x16.svg
browser/components/loop/content/shared/img/movistar.png
browser/components/loop/content/shared/img/movistar@2x.png
browser/components/loop/content/shared/img/mute-inverse-14x14.png
browser/components/loop/content/shared/img/mute-inverse-14x14@2x.png
browser/components/loop/content/shared/img/sad.png
browser/components/loop/content/shared/img/sad_hello_icon_64x64.svg
browser/components/loop/content/shared/img/spinner.png
browser/components/loop/content/shared/img/spinner.svg
browser/components/loop/content/shared/img/spinner@2x.png
browser/components/loop/content/shared/img/svg/audio-hover.svg
browser/components/loop/content/shared/img/svg/audio-mute-hover.svg
browser/components/loop/content/shared/img/svg/audio-mute.svg
browser/components/loop/content/shared/img/svg/audio.svg
browser/components/loop/content/shared/img/svg/cam_audio-no.svg
browser/components/loop/content/shared/img/svg/cam_audio.svg
browser/components/loop/content/shared/img/svg/cam_audio_h.svg
browser/components/loop/content/shared/img/svg/exit.svg
browser/components/loop/content/shared/img/svg/glyph-email-16x16.svg
browser/components/loop/content/shared/img/svg/glyph-facebook-16x16.svg
browser/components/loop/content/shared/img/svg/glyph-help-16x16.svg
browser/components/loop/content/shared/img/svg/glyph-link-16x16.svg
browser/components/loop/content/shared/img/svg/glyph-user-16x16.svg
browser/components/loop/content/shared/img/svg/media-group-left-hover.svg
browser/components/loop/content/shared/img/svg/media-group-right-hover.svg
browser/components/loop/content/shared/img/svg/media-group.svg
browser/components/loop/content/shared/img/svg/settings-hover.svg
browser/components/loop/content/shared/img/svg/settings.svg
browser/components/loop/content/shared/img/svg/sharing-active.svg
browser/components/loop/content/shared/img/svg/sharing-hover.svg
browser/components/loop/content/shared/img/svg/sharing-pending.svg
browser/components/loop/content/shared/img/svg/sharing.svg
browser/components/loop/content/shared/img/svg/video-hover.svg
browser/components/loop/content/shared/img/svg/video-mute-hover.svg
browser/components/loop/content/shared/img/svg/video-mute.svg
browser/components/loop/content/shared/img/svg/video.svg
browser/components/loop/content/shared/img/telefonica.png
browser/components/loop/content/shared/img/telefonica@2x.png
browser/components/loop/content/shared/img/vivo.png
browser/components/loop/content/shared/img/vivo@2x.png
browser/components/loop/content/shared/js/actions.js
browser/components/loop/content/shared/js/activeRoomStore.js
browser/components/loop/content/shared/js/crypto.js
browser/components/loop/content/shared/js/dispatcher.js
browser/components/loop/content/shared/js/linkifiedTextView.js
browser/components/loop/content/shared/js/linkifiedTextView.jsx
browser/components/loop/content/shared/js/mixins.js
browser/components/loop/content/shared/js/models.js
browser/components/loop/content/shared/js/otSdkDriver.js
browser/components/loop/content/shared/js/store.js
browser/components/loop/content/shared/js/textChatStore.js
browser/components/loop/content/shared/js/textChatView.js
browser/components/loop/content/shared/js/textChatView.jsx
browser/components/loop/content/shared/js/urlRegExps.js
browser/components/loop/content/shared/js/utils.js
browser/components/loop/content/shared/js/validate.js
browser/components/loop/content/shared/js/views.js
browser/components/loop/content/shared/js/views.jsx
browser/components/loop/content/shared/libs/backbone-1.2.1.js
browser/components/loop/content/shared/libs/classnames-2.2.0.js
browser/components/loop/content/shared/libs/lodash-3.9.3.js
browser/components/loop/content/shared/libs/react-0.13.3-prod.js
browser/components/loop/content/shared/libs/react-0.13.3.js
browser/components/loop/content/shared/libs/sdk-content/css/ot.css
browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-chrome.png
browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-copy-firefox.png
browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-denied-firefox.png
browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-predenied-chrome.png
browser/components/loop/content/shared/libs/sdk-content/images/rtc/access-prompt-chrome.png
browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-publisher.png
browser/components/loop/content/shared/libs/sdk-content/images/rtc/audioonly-subscriber.png
browser/components/loop/content/shared/libs/sdk-content/images/rtc/buttons.png
browser/components/loop/content/shared/libs/sdk-content/images/rtc/loader.gif
browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-off.png
browser/components/loop/content/shared/libs/sdk-content/images/rtc/mic-on.png
browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-off.png
browser/components/loop/content/shared/libs/sdk-content/images/rtc/speaker-on.png
browser/components/loop/content/shared/libs/sdk-content/js/dynamic_config.min.js
browser/components/loop/content/shared/libs/sdk.js
browser/components/loop/content/shared/sounds/connected.ogg
browser/components/loop/content/shared/sounds/connecting.ogg
browser/components/loop/content/shared/sounds/failure.ogg
browser/components/loop/content/shared/sounds/message.ogg
browser/components/loop/content/shared/sounds/ringtone.ogg
browser/components/loop/content/shared/sounds/room-joined-in.ogg
browser/components/loop/content/shared/sounds/room-joined.ogg
browser/components/loop/content/shared/sounds/room-left.ogg
browser/components/loop/content/shared/sounds/terminated.ogg
browser/components/loop/jar.mn
browser/components/loop/manifest.ini
browser/components/loop/modules/.eslintrc
browser/components/loop/modules/LoopRooms.jsm
browser/components/loop/modules/LoopRoomsCache.jsm
browser/components/loop/modules/MozLoopAPI.jsm
browser/components/loop/modules/MozLoopPushHandler.jsm
browser/components/loop/modules/MozLoopService.jsm
browser/components/loop/modules/MozLoopWorker.js
browser/components/loop/moz.build
browser/components/loop/run-all-loop-tests.sh
browser/components/loop/standalone/.gitignore
browser/components/loop/standalone/Makefile
browser/components/loop/standalone/README.md
browser/components/loop/standalone/content/css/webapp.css
browser/components/loop/standalone/content/favicon.ico
browser/components/loop/standalone/content/img/gum-chrome.svg
browser/components/loop/standalone/content/img/gum-firefox.svg
browser/components/loop/standalone/content/img/gum-opera.svg
browser/components/loop/standalone/content/img/gum-others.svg
browser/components/loop/standalone/content/img/hello-logo-text.svg
browser/components/loop/standalone/content/img/logo.png
browser/components/loop/standalone/content/img/mozilla-logo.svg
browser/components/loop/standalone/content/index.html
browser/components/loop/standalone/content/js/standaloneAppStore.js
browser/components/loop/standalone/content/js/standaloneMetricsStore.js
browser/components/loop/standalone/content/js/standaloneMozLoop.js
browser/components/loop/standalone/content/js/standaloneRoomViews.js
browser/components/loop/standalone/content/js/standaloneRoomViews.jsx
browser/components/loop/standalone/content/js/webapp.js
browser/components/loop/standalone/content/js/webapp.jsx
browser/components/loop/standalone/content/l10n/en-US/loop.properties
browser/components/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js
browser/components/loop/standalone/content/libs/l10n-gaia-upstream.txt
browser/components/loop/standalone/content/robots.txt
browser/components/loop/standalone/content/webappEntryPoint.js
browser/components/loop/standalone/package.json
browser/components/loop/standalone/server.js
browser/components/loop/standalone/webpack.config.js
browser/components/loop/test/.eslintrc
browser/components/loop/test/coverage/index.html
browser/components/loop/test/desktop-local/.eslintrc
browser/components/loop/test/desktop-local/README.md
browser/components/loop/test/desktop-local/conversationAppStore_test.js
browser/components/loop/test/desktop-local/conversation_test.js
browser/components/loop/test/desktop-local/feedbackViews_test.js
browser/components/loop/test/desktop-local/index.html
browser/components/loop/test/desktop-local/l10n_test.js
browser/components/loop/test/desktop-local/panel_test.js
browser/components/loop/test/desktop-local/roomStore_test.js
browser/components/loop/test/desktop-local/roomViews_test.js
browser/components/loop/test/desktop-local/test_desktop_all.py
browser/components/loop/test/functional/config.py
browser/components/loop/test/functional/hanging_threads.py
browser/components/loop/test/functional/manifest.ini
browser/components/loop/test/functional/serversetup.py
browser/components/loop/test/functional/test_1_browser_call.py
browser/components/loop/test/index.html
browser/components/loop/test/karma/head.js
browser/components/loop/test/karma/karma.conf.base.js
browser/components/loop/test/karma/karma.coverage.desktop.js
browser/components/loop/test/karma/karma.coverage.shared_standalone.js
browser/components/loop/test/mochitest/.eslintrc
browser/components/loop/test/mochitest/browser.ini
browser/components/loop/test/mochitest/browser_LoopRooms_channel.js
browser/components/loop/test/mochitest/browser_fxa_login.js
browser/components/loop/test/mochitest/browser_loop_fxa_server.js
browser/components/loop/test/mochitest/browser_mozLoop_appVersionInfo.js
browser/components/loop/test/mochitest/browser_mozLoop_chat.js
browser/components/loop/test/mochitest/browser_mozLoop_context.js
browser/components/loop/test/mochitest/browser_mozLoop_doNotDisturb.js
browser/components/loop/test/mochitest/browser_mozLoop_prefs.js
browser/components/loop/test/mochitest/browser_mozLoop_sharingListeners.js
browser/components/loop/test/mochitest/browser_mozLoop_socialShare.js
browser/components/loop/test/mochitest/browser_mozLoop_telemetry.js
browser/components/loop/test/mochitest/browser_toolbarbutton.js
browser/components/loop/test/mochitest/head.js
browser/components/loop/test/mochitest/loop_fxa.sjs
browser/components/loop/test/mochitest/test_loopLinkClicker_channel.html
browser/components/loop/test/package.json
browser/components/loop/test/shared/activeRoomStore_test.js
browser/components/loop/test/shared/crypto_test.js
browser/components/loop/test/shared/dispatcher_test.js
browser/components/loop/test/shared/frontend_tester.py
browser/components/loop/test/shared/index.html
browser/components/loop/test/shared/linkifiedTextView_test.js
browser/components/loop/test/shared/mixins_test.js
browser/components/loop/test/shared/models_test.js
browser/components/loop/test/shared/otSdkDriver_test.js
browser/components/loop/test/shared/sdk_mock.js
browser/components/loop/test/shared/store_test.js
browser/components/loop/test/shared/test_shared_all.py
browser/components/loop/test/shared/textChatStore_test.js
browser/components/loop/test/shared/textChatView_test.js
browser/components/loop/test/shared/utils_test.js
browser/components/loop/test/shared/validate_test.js
browser/components/loop/test/shared/vendor/chai-3.0.0.js
browser/components/loop/test/shared/vendor/chai-as-promised-5.1.0.js
browser/components/loop/test/shared/vendor/mocha-2.2.5.css
browser/components/loop/test/shared/vendor/mocha-2.2.5.js
browser/components/loop/test/shared/vendor/sinon-1.16.1.js
browser/components/loop/test/shared/views_test.js
browser/components/loop/test/standalone/index.html
browser/components/loop/test/standalone/standaloneAppStore_test.js
browser/components/loop/test/standalone/standaloneMetricsStore_test.js
browser/components/loop/test/standalone/standaloneMozLoop_test.js
browser/components/loop/test/standalone/standaloneRoomViews_test.js
browser/components/loop/test/standalone/test_standalone_all.py
browser/components/loop/test/standalone/webapp_test.js
browser/components/loop/test/ui-showcase/test_ui-showcase.py
browser/components/loop/test/visual-regression/README.md
browser/components/loop/test/visual-regression/screenshot
browser/components/loop/test/xpcshell/.eslintrc
browser/components/loop/test/xpcshell/head.js
browser/components/loop/test/xpcshell/test_looppush_initialize.js
browser/components/loop/test/xpcshell/test_looprooms.js
browser/components/loop/test/xpcshell/test_looprooms_encryption_in_fxa.js
browser/components/loop/test/xpcshell/test_looprooms_first_notification.js
browser/components/loop/test/xpcshell/test_looprooms_upgrade_to_encryption.js
browser/components/loop/test/xpcshell/test_loopservice_dnd.js
browser/components/loop/test/xpcshell/test_loopservice_encryptionkey.js
browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js
browser/components/loop/test/xpcshell/test_loopservice_hawk_request.js
browser/components/loop/test/xpcshell/test_loopservice_initialize.js
browser/components/loop/test/xpcshell/test_loopservice_locales.js
browser/components/loop/test/xpcshell/test_loopservice_loop_prefs.js
browser/components/loop/test/xpcshell/test_loopservice_registration.js
browser/components/loop/test/xpcshell/test_loopservice_registration_retry.js
browser/components/loop/test/xpcshell/test_loopservice_restart.js
browser/components/loop/test/xpcshell/test_loopservice_token_invalid.js
browser/components/loop/test/xpcshell/test_loopservice_token_save.js
browser/components/loop/test/xpcshell/test_loopservice_token_send.js
browser/components/loop/test/xpcshell/test_loopservice_token_validation.js
browser/components/loop/test/xpcshell/xpcshell.ini
browser/components/loop/ui/README.md
browser/components/loop/ui/fake-l10n.js
browser/components/loop/ui/fake-mozLoop.js
browser/components/loop/ui/index.html
browser/components/loop/ui/react-frame-component.js
browser/components/loop/ui/sample-img/video-screen-local.png
browser/components/loop/ui/sample-img/video-screen-remote.png
browser/components/loop/ui/sample-img/video-screen-terminal.png
browser/components/loop/ui/ui-showcase.css
browser/components/loop/ui/ui-showcase.js
browser/components/loop/ui/ui-showcase.jsx
browser/modules/ContentCrashReporters.jsm
browser/themes/linux/loop/menuPanel.png
browser/themes/linux/loop/menuPanel@2x.png
browser/themes/linux/loop/toolbar-inverted.png
browser/themes/linux/loop/toolbar-inverted@2x.png
browser/themes/linux/loop/toolbar.png
browser/themes/linux/loop/toolbar@2x.png
browser/themes/osx/loop/menuPanel-yosemite.png
browser/themes/osx/loop/menuPanel-yosemite@2x.png
browser/themes/osx/loop/menuPanel.png
browser/themes/osx/loop/menuPanel@2x.png
browser/themes/osx/loop/toolbar-inverted.png
browser/themes/osx/loop/toolbar-inverted@2x.png
browser/themes/osx/loop/toolbar-yosemite.png
browser/themes/osx/loop/toolbar-yosemite@2x.png
browser/themes/osx/loop/toolbar.png
browser/themes/osx/loop/toolbar@2x.png
browser/themes/shared/aboutNetError_info.svg
browser/themes/windows/loop/menuPanel-aero.png
browser/themes/windows/loop/menuPanel-aero@2x.png
browser/themes/windows/loop/menuPanel.png
browser/themes/windows/loop/menuPanel@2x.png
browser/themes/windows/loop/toolbar-XP.png
browser/themes/windows/loop/toolbar-XP@2x.png
browser/themes/windows/loop/toolbar-aero.png
browser/themes/windows/loop/toolbar-aero@2x.png
browser/themes/windows/loop/toolbar-inverted.png
browser/themes/windows/loop/toolbar-inverted@2x.png
browser/themes/windows/loop/toolbar-lunaSilver.png
browser/themes/windows/loop/toolbar-lunaSilver@2x.png
browser/themes/windows/loop/toolbar-win8.png
browser/themes/windows/loop/toolbar-win8@2x.png
browser/themes/windows/loop/toolbar.png
browser/themes/windows/loop/toolbar@2x.png
browser/themes/windows/tabbrowser/newtab-XPVista7.png
browser/themes/windows/tabbrowser/newtab-XPVista7@2x.png
browser/themes/windows/tabbrowser/newtab-inverted-XPVista7.png
browser/themes/windows/tabbrowser/newtab-inverted-XPVista7@2x.png
browser/themes/windows/tabbrowser/newtab-inverted.png
browser/themes/windows/tabbrowser/newtab-inverted@2x.png
browser/themes/windows/tabbrowser/newtab.png
browser/themes/windows/tabbrowser/newtab@2x.png
browser/themes/windows/tabbrowser/tab-arrow-left-XPVista7.png
browser/themes/windows/tabbrowser/tab-arrow-left-XPVista7@2x.png
browser/themes/windows/tabbrowser/tab-arrow-left-inverted.png
browser/themes/windows/tabbrowser/tab-arrow-left-inverted@2x.png
browser/themes/windows/tabbrowser/tab-arrow-left.png
browser/themes/windows/tabbrowser/tab-arrow-left@2x.png
build/mobile/b2gautomation.py
config/static-checking.js
configure.in
devtools/.eslintignore
devtools/client/memory/components/test/mochitest/chrome.ini
devtools/client/memory/components/test/mochitest/head.js
devtools/client/memory/components/test/mochitest/test_tree_01.html
devtools/client/memory/components/test/mochitest/test_tree_02.html
devtools/client/memory/components/test/mochitest/test_tree_03.html
devtools/client/memory/components/test/mochitest/test_tree_04.html
devtools/client/memory/components/test/mochitest/test_tree_05.html
devtools/client/memory/components/test/mochitest/test_tree_06.html
devtools/client/memory/components/test/mochitest/test_tree_07.html
devtools/client/memory/components/test/mochitest/test_tree_08.html
devtools/client/memory/components/tree.js
devtools/server/tests/mochitest/test_registerActor.html
dom/animation/Animation.cpp
dom/animation/Animation.h
dom/asmjscache/AsmJSCache.cpp
dom/base/Navigator.cpp
dom/base/test/mochitest.ini
dom/canvas/test/mochitest.ini
dom/contacts/tests/contacts_chromescript.js
dom/devicestorage/ipc/ipc.json
dom/devicestorage/ipc/mochitest.ini
dom/devicestorage/ipc/test_ipc.html
dom/media/apple/AppleDecoder.cpp
dom/media/apple/AppleDecoder.h
dom/media/apple/AppleMP3Reader.cpp
dom/media/apple/AppleMP3Reader.h
dom/media/apple/moz.build
dom/media/omx/MediaCodecDecoder.cpp
dom/media/omx/MediaCodecDecoder.h
dom/media/omx/MediaCodecReader.cpp
dom/media/omx/MediaCodecReader.h
dom/media/omx/RtspMediaCodecReader.cpp
dom/media/omx/RtspMediaCodecReader.h
dom/media/test/mochitest.ini
dom/media/test/test_eme_playback.html
dom/media/tests/mochitest/mochitest.ini
dom/quota/QuotaManager.cpp
dom/quota/Utilities.h
dom/quota/nsIQuotaManager.idl
dom/quota/nsIQuotaRequest.idl
dom/quota/nsIUsageCallback.idl
dom/svg/test/mochitest.ini
dom/tests/mochitest/pointerlock/mochitest.ini
dom/webidl/URLUtils.webidl
dom/webidl/URLUtilsReadOnly.webidl
gfx/layers/GrallocImages.cpp
gfx/layers/YCbCrImageDataSerializer.cpp
intl/icu-patches/pkgdata-large-buffer.diff
intl/icu/source/data/coll/ug_Arab.txt
intl/icu/source/data/coll/ug_Arab_CN.txt
intl/icu/source/data/coll/ug_CN.txt
intl/icu/source/data/curr/bm_Latn.txt
intl/icu/source/data/curr/ha_Latn.txt
intl/icu/source/data/curr/ha_Latn_GH.txt
intl/icu/source/data/curr/ha_Latn_NE.txt
intl/icu/source/data/curr/ha_Latn_NG.txt
intl/icu/source/data/curr/ha_NE.txt
intl/icu/source/data/curr/ha_NG.txt
intl/icu/source/data/curr/kk_Cyrl.txt
intl/icu/source/data/curr/kk_Cyrl_KZ.txt
intl/icu/source/data/curr/kk_KZ.txt
intl/icu/source/data/curr/ks_Arab.txt
intl/icu/source/data/curr/ks_Arab_IN.txt
intl/icu/source/data/curr/ks_IN.txt
intl/icu/source/data/curr/ky_Cyrl.txt
intl/icu/source/data/curr/ky_Cyrl_KG.txt
intl/icu/source/data/curr/ky_KG.txt
intl/icu/source/data/curr/mn_Cyrl.txt
intl/icu/source/data/curr/mn_Cyrl_MN.txt
intl/icu/source/data/curr/mn_MN.txt
intl/icu/source/data/curr/ms_Latn.txt
intl/icu/source/data/curr/ms_Latn_BN.txt
intl/icu/source/data/curr/ms_Latn_MY.txt
intl/icu/source/data/curr/ms_Latn_SG.txt
intl/icu/source/data/curr/ms_MY.txt
intl/icu/source/data/curr/tzm_Latn.txt
intl/icu/source/data/curr/tzm_Latn_MA.txt
intl/icu/source/data/curr/tzm_MA.txt
intl/icu/source/data/curr/ug_Arab.txt
intl/icu/source/data/curr/ug_Arab_CN.txt
intl/icu/source/data/curr/ug_CN.txt
intl/icu/source/data/locales/bm_Latn.txt
intl/icu/source/data/locales/bm_Latn_ML.txt
intl/icu/source/data/locales/ha_Latn.txt
intl/icu/source/data/locales/ha_Latn_GH.txt
intl/icu/source/data/locales/ha_Latn_NE.txt
intl/icu/source/data/locales/ha_Latn_NG.txt
intl/icu/source/data/locales/kk_Cyrl.txt
intl/icu/source/data/locales/kk_Cyrl_KZ.txt
intl/icu/source/data/locales/ks_Arab.txt
intl/icu/source/data/locales/ks_Arab_IN.txt
intl/icu/source/data/locales/ky_Cyrl.txt
intl/icu/source/data/locales/ky_Cyrl_KG.txt
intl/icu/source/data/locales/mn_Cyrl.txt
intl/icu/source/data/locales/mn_Cyrl_MN.txt
intl/icu/source/data/locales/ms_Latn.txt
intl/icu/source/data/locales/ms_Latn_BN.txt
intl/icu/source/data/locales/ms_Latn_MY.txt
intl/icu/source/data/locales/ms_Latn_SG.txt
intl/icu/source/data/locales/nus_SD.txt
intl/icu/source/data/locales/tzm_Latn.txt
intl/icu/source/data/locales/tzm_Latn_MA.txt
intl/icu/source/data/locales/ug_Arab.txt
intl/icu/source/data/locales/ug_Arab_CN.txt
intl/icu/source/data/misc/postalCodeData.txt
intl/icu/source/data/zone/bm_Latn.txt
intl/icu/source/data/zone/ha_GH.txt
intl/icu/source/data/zone/ha_Latn.txt
intl/icu/source/data/zone/ha_Latn_GH.txt
intl/icu/source/data/zone/ha_Latn_NE.txt
intl/icu/source/data/zone/ha_Latn_NG.txt
intl/icu/source/data/zone/ha_NE.txt
intl/icu/source/data/zone/ha_NG.txt
intl/icu/source/data/zone/kk_Cyrl.txt
intl/icu/source/data/zone/kk_Cyrl_KZ.txt
intl/icu/source/data/zone/kk_KZ.txt
intl/icu/source/data/zone/ks_Arab.txt
intl/icu/source/data/zone/ks_Arab_IN.txt
intl/icu/source/data/zone/ks_IN.txt
intl/icu/source/data/zone/ky_Cyrl.txt
intl/icu/source/data/zone/ky_Cyrl_KG.txt
intl/icu/source/data/zone/ky_KG.txt
intl/icu/source/data/zone/mn_Cyrl.txt
intl/icu/source/data/zone/mn_Cyrl_MN.txt
intl/icu/source/data/zone/mn_MN.txt
intl/icu/source/data/zone/ms_BN.txt
intl/icu/source/data/zone/ms_Latn.txt
intl/icu/source/data/zone/ms_Latn_BN.txt
intl/icu/source/data/zone/ms_Latn_MY.txt
intl/icu/source/data/zone/ms_Latn_SG.txt
intl/icu/source/data/zone/ms_MY.txt
intl/icu/source/data/zone/ms_SG.txt
intl/icu/source/data/zone/tzm_Latn.txt
intl/icu/source/data/zone/tzm_Latn_MA.txt
intl/icu/source/data/zone/tzm_MA.txt
intl/icu/source/data/zone/ug_Arab.txt
intl/icu/source/data/zone/ug_Arab_CN.txt
intl/icu/source/data/zone/ug_CN.txt
intl/icu/source/i18n/filteredbrk.cpp
intl/icu/source/i18n/shareddatetimepatterngenerator.h
intl/icu/source/i18n/unicode/filteredbrk.h
intl/icu/source/test/threadtest/Makefile.in
intl/icu/source/tools/genrb/derb.c
intl/icu/source/tools/genrb/genrb.c
intl/icu/source/tools/genrb/reslist.c
intl/icu/source/tools/genrb/wrtjava.c
intl/icu/source/tools/makeconv/makeconv.c
js/public/TraceableHashTable.h
js/src/asmjs/AsmJSGlobals.h
js/src/gc/GCRuntime.h
js/src/jit-test/tests/SIMD/bool.js
js/src/jsgc.cpp
js/src/tests/ecma_7/SIMD/int16x8bool.js
js/src/tests/ecma_7/SIMD/int32x4bool.js
js/src/tests/ecma_7/SIMD/int8x16bool.js
js/src/vm/HelperThreads.cpp
js/src/vm/HelperThreads.h
js/src/vm/Runtime.cpp
js/src/vm/Runtime.h
js/xpconnect/tests/components/js/Makefile.in
js/xpconnect/tests/components/js/moz.build
js/xpconnect/tests/components/native/Makefile.in
layout/generic/frame-verify.js
layout/style/test/test_flexbox_align_self_auto.html
media/webrtc/trunk/webrtc/base/compile_assert.h
media/webrtc/trunk/webrtc/base/stringdigest.h
media/webrtc/trunk/webrtc/build/ios-webrtc.sh
media/webrtc/trunk/webrtc/build/tsan_suppressions_webrtc.cc
media/webrtc/trunk/webrtc/build/version.py
media/webrtc/trunk/webrtc/build/vie-webrtc.sh
media/webrtc/trunk/webrtc/common_audio/signal_processing/cross_correlation_neon.S
media/webrtc/trunk/webrtc/common_audio/signal_processing/downsample_fast_neon.S
media/webrtc/trunk/webrtc/common_audio/signal_processing/min_max_operations_neon.S
media/webrtc/trunk/webrtc/common_audio/signal_processing/vector_scaling_operations_neon.S
media/webrtc/trunk/webrtc/common_video/interface/texture_video_frame.h
media/webrtc/trunk/webrtc/common_video/plane_unittest.cc
media/webrtc/trunk/webrtc/common_video/texture_video_frame.cc
media/webrtc/trunk/webrtc/common_video/texture_video_frame_unittest.cc
media/webrtc/trunk/webrtc/modules/audio_coding/codecs/isac/fix/source/isacfix.gypi
media/webrtc/trunk/webrtc/modules/audio_coding/codecs/isac/main/source/isac.gypi
media/webrtc/trunk/webrtc/modules/audio_coding/codecs/tools/audio_codec_speed_tests.gypi
media/webrtc/trunk/webrtc/modules/audio_coding/codecs/tools/audio_codec_speed_tests.isolate
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_amr.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_amr.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_amrwb.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_amrwb.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_celt.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_celt.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_cng.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_cng.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_dtmf_playout.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_dtmf_playout.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_g722.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_g722.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_g7221.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_g7221.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_g7221c.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_g7221c.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_g729.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_g729.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_g7291.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_g7291.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_gsmfr.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_gsmfr.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_ilbc.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_ilbc.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_isac.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_isac.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_isac_macros.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_opus.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_opus.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_opus_unittest.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_pcm16b.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_pcm16b.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_pcma.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_pcma.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_pcmu.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_pcmu.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_red.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_red.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_speex.cc
media/webrtc/trunk/webrtc/modules/audio_coding/main/acm2/acm_speex.h
media/webrtc/trunk/webrtc/modules/audio_coding/main/test/dual_stream_unittest.cc
media/webrtc/trunk/webrtc/modules/audio_coding/neteq/audio_decoder.cc
media/webrtc/trunk/webrtc/modules/audio_coding/neteq/interface/audio_decoder.h
media/webrtc/trunk/webrtc/modules/audio_coding/neteq/test/RTPcat.cc
media/webrtc/trunk/webrtc/modules/audio_coding/neteq/test/neteq_opus_fec_quality_test.cc
media/webrtc/trunk/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer.gypi
media/webrtc/trunk/webrtc/modules/audio_device/android/OWNERS
media/webrtc/trunk/webrtc/modules/audio_processing/aecm/aecm_core_neon.S
media/webrtc/trunk/webrtc/modules/audio_processing/aecm/aecm_core_neon_offsets.c
media/webrtc/trunk/webrtc/modules/audio_processing/agc/analog_agc.c
media/webrtc/trunk/webrtc/modules/audio_processing/agc/analog_agc.h
media/webrtc/trunk/webrtc/modules/audio_processing/agc/digital_agc.c
media/webrtc/trunk/webrtc/modules/audio_processing/agc/digital_agc.h
media/webrtc/trunk/webrtc/modules/audio_processing/agc/include/gain_control.h
media/webrtc/trunk/webrtc/modules/audio_processing/gen_core_neon_offsets.gyp
media/webrtc/trunk/webrtc/modules/audio_processing/gen_core_neon_offsets_chromium.gyp
media/webrtc/trunk/webrtc/modules/audio_processing/lib_core_neon_offsets.gypi
media/webrtc/trunk/webrtc/modules/audio_processing/ns/nsx_core_neon.S
media/webrtc/trunk/webrtc/modules/audio_processing/ns/nsx_core_neon_offsets.c
media/webrtc/trunk/webrtc/modules/audio_processing/utility/fft4g.c
media/webrtc/trunk/webrtc/modules/audio_processing/utility/fft4g.h
media/webrtc/trunk/webrtc/modules/audio_processing/utility/ring_buffer.c
media/webrtc/trunk/webrtc/modules/audio_processing/utility/ring_buffer.h
media/webrtc/trunk/webrtc/modules/audio_processing/utility/ring_buffer_unittest.cc
media/webrtc/trunk/webrtc/modules/media_file/source/avi_file.cc
media/webrtc/trunk/webrtc/modules/media_file/source/avi_file.h
media/webrtc/trunk/webrtc/modules/media_file/source/media_file.gypi
media/webrtc/trunk/webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_components.gyp
media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_rtcp.gypi
media/webrtc/trunk/webrtc/modules/utility/source/frame_scaler.cc
media/webrtc/trunk/webrtc/modules/utility/source/frame_scaler.h
media/webrtc/trunk/webrtc/modules/utility/source/utility.gypi
media/webrtc/trunk/webrtc/modules/utility/source/video_coder.cc
media/webrtc/trunk/webrtc/modules/utility/source/video_coder.h
media/webrtc/trunk/webrtc/modules/utility/source/video_frames_queue.cc
media/webrtc/trunk/webrtc/modules/utility/source/video_frames_queue.h
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/OWNERS
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/benchmark.cc
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/benchmark.h
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/exportfig.m
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/normal_async_test.cc
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/normal_async_test.h
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/normal_test.cc
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/normal_test.h
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/packet_loss_test.cc
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/packet_loss_test.h
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/plotBenchmark.m
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/test.cc
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/test.h
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/test_framework.gypi
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/unit_test.cc
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/unit_test.h
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/video_source.cc
media/webrtc/trunk/webrtc/modules/video_coding/codecs/test_framework/video_source.h
media/webrtc/trunk/webrtc/modules/video_coding/main/source/er_tables_xor.h
media/webrtc/trunk/webrtc/modules/video_coding/main/source/video_coding.gypi
media/webrtc/trunk/webrtc/modules/video_coding/main/source/video_coding_test.gypi
media/webrtc/trunk/webrtc/modules/video_coding/main/test/codec_database_test.cc
media/webrtc/trunk/webrtc/modules/video_coding/main/test/codec_database_test.h
media/webrtc/trunk/webrtc/modules/video_coding/main/test/generic_codec_test.cc
media/webrtc/trunk/webrtc/modules/video_coding/main/test/generic_codec_test.h
media/webrtc/trunk/webrtc/modules/video_coding/main/test/jitter_estimate_test.h
media/webrtc/trunk/webrtc/modules/video_coding/main/test/media_opt_test.cc
media/webrtc/trunk/webrtc/modules/video_coding/main/test/media_opt_test.h
media/webrtc/trunk/webrtc/modules/video_coding/main/test/mt_rx_tx_test.cc
media/webrtc/trunk/webrtc/modules/video_coding/main/test/mt_test_common.cc
media/webrtc/trunk/webrtc/modules/video_coding/main/test/mt_test_common.h
media/webrtc/trunk/webrtc/modules/video_coding/main/test/normal_test.cc
media/webrtc/trunk/webrtc/modules/video_coding/main/test/normal_test.h
media/webrtc/trunk/webrtc/modules/video_coding/main/test/quality_modes_test.cc
media/webrtc/trunk/webrtc/modules/video_coding/main/test/quality_modes_test.h
media/webrtc/trunk/webrtc/modules/video_coding/main/test/test_callbacks.cc
media/webrtc/trunk/webrtc/modules/video_coding/main/test/test_callbacks.h
media/webrtc/trunk/webrtc/modules/video_coding/main/test/test_macros.h
media/webrtc/trunk/webrtc/modules/video_coding/main/test/video_rtp_play_mt.cc
media/webrtc/trunk/webrtc/modules/video_coding/main/test/video_source.cc
media/webrtc/trunk/webrtc/modules/video_processing/main/source/video_processing.gypi
media/webrtc/trunk/webrtc/system_wrappers/interface/compile_assert.h
media/webrtc/trunk/webrtc/system_wrappers/interface/scoped_ptr.h
media/webrtc/trunk/webrtc/system_wrappers/interface/template_util.h
media/webrtc/trunk/webrtc/system_wrappers/source/move.h
media/webrtc/trunk/webrtc/system_wrappers/source/set_thread_name_win.h
media/webrtc/trunk/webrtc/system_wrappers/source/system_wrappers.gyp
media/webrtc/trunk/webrtc/system_wrappers/source/system_wrappers_tests.gyp
media/webrtc/trunk/webrtc/system_wrappers/source/system_wrappers_unittests.isolate
media/webrtc/trunk/webrtc/test/manual/README
media/webrtc/trunk/webrtc/test/manual/adapter.js
media/webrtc/trunk/webrtc/test/manual/audio-and-video.html
media/webrtc/trunk/webrtc/test/manual/iframe-apprtc.html
media/webrtc/trunk/webrtc/test/manual/iframe-video.html
media/webrtc/trunk/webrtc/test/manual/multiple-audio.html
media/webrtc/trunk/webrtc/test/manual/multiple-video.html
media/webrtc/trunk/webrtc/test/manual/single-audio.html
media/webrtc/trunk/webrtc/test/manual/single-video.html
media/webrtc/trunk/webrtc/test/manual/two-video-devices.html
media/webrtc/trunk/webrtc/video_engine/vie_channel.cc
mobile/android/.eslintignore
mobile/android/base/RestrictedProfiles.java
mobile/android/base/build.gradle
mobile/android/base/menu/MenuItemSwitcherLayout.java
mobile/android/base/resources/drawable-hdpi/shareplane.png
mobile/android/base/resources/drawable-xhdpi/shareplane.png
mobile/android/base/resources/drawable-xxhdpi/shareplane.png
mobile/android/base/resources/drawable/overlay_send_tab_icon_menu.xml
mobile/android/base/resources/layout/menu_item_switcher_layout.xml
mobile/android/base/resources/layout/site_setting_title.xml
mobile/android/base/restrictions/Restriction.java
mobile/android/base/sync/setup/activities/ClientRecordArrayAdapter.java
mobile/android/base/sync/setup/activities/SendTabActivity.java
testing/mozharness/configs/builds/branch_specifics.py
testing/specialpowers/components/SpecialPowersObserver.js
testing/web-platform/meta/content-security-policy/blink-contrib/self-doesnt-match-blob.sub.html.ini
testing/web-platform/meta/content-security-policy/blink-contrib/star-doesnt-match-blob.sub.html.ini
testing/web-platform/meta/content-security-policy/child-src/child-src-worker-blocked.sub.html.ini
testing/web-platform/meta/dom/nodes/MutationObserver-document.html.ini
testing/web-platform/meta/mixed-content/blockable/http-csp/cross-origin-http/worker-request/top-level/keep-scheme-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/http-csp/cross-origin-http/worker-request/top-level/no-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/http-csp/cross-origin-http/worker-request/top-level/swap-scheme-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/http-csp/same-host-http/worker-request/top-level/keep-scheme-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/http-csp/same-host-http/worker-request/top-level/no-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/http-csp/same-host-http/worker-request/top-level/swap-scheme-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/meta-csp/cross-origin-http/worker-request/top-level/no-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/meta-csp/same-host-http/worker-request/top-level/no-redirect/opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/no-opt-in/cross-origin-http/worker-request/top-level/keep-scheme-redirect/no-opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/no-opt-in/cross-origin-http/worker-request/top-level/no-redirect/no-opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/no-opt-in/cross-origin-http/worker-request/top-level/swap-scheme-redirect/no-opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/no-opt-in/same-host-http/worker-request/top-level/keep-scheme-redirect/no-opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/no-opt-in/same-host-http/worker-request/top-level/no-redirect/no-opt-in-blocks.https.html.ini
testing/web-platform/meta/mixed-content/blockable/no-opt-in/same-host-http/worker-request/top-level/swap-scheme-redirect/no-opt-in-blocks.https.html.ini
testing/web-platform/meta/workers/Worker_cross_origin_security_err.htm.ini
testing/web-platform/mozilla/meta/service-workers/service-worker/register-wait-forever-in-install-worker.https.html.ini
testing/web-platform/mozilla/meta/service-workers/service-worker/unregister-then-register-new-script.https.html.ini
uriloader/exthandler/ExternalHelperAppParent.cpp
widget/gonk/HwcComposer2D.cpp
xpcom/tests/static-checker/Makefile.in
xpcom/tests/static-checker/TestStaticInitAttr.cpp
xpcom/tests/static-checker/TestStaticInitConstructor.cpp
xpcom/tests/static-checker/TestStaticInitGlobal.cpp
xpcom/tests/static-checker/TestStaticInitGlobalConst.cpp
xpcom/tests/static-checker/TestStaticInitStructOK.cpp
xpcom/tests/static-checker/flow_through_fail.cpp
xpcom/tests/static-checker/flow_through_pass.cpp
xpcom/tests/static-checker/moz.build
new file mode 100644
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,157 @@
+# Always ignore node_modules.
+**/node_modules/**/*.*
+
+# Exclude expected objdirs.
+obj*/**
+
+# We ignore all these directories by default, until we get them enabled.
+# If you are enabling a directory, please add directory specific exclusions
+# below.
+accessible/**
+addon-sdk/**
+b2g/**
+build/**
+caps/**
+chrome/**
+config/**
+db/**
+docshell/**
+dom/**
+editor/**
+embedding/**
+extensions/**
+gfx/**
+gradle/**
+hal/**
+image/**
+intl/**
+ipc/**
+js/**
+layout/**
+media/**
+memory/**
+mfbt/**
+modules/**
+mozglue/**
+netwerk/**
+nsprpub/**
+other-licenses/**
+parser/**
+probes/**
+python/**
+rdf/**
+security/**
+services/**
+startupcache/**
+storage/**
+testing/**
+toolkit/**
+tools/**
+uriloader/**
+view/**
+webapprt/**
+widget/**
+xpcom/**
+xpfe/**
+xulrunner/**
+
+# browser/ exclusions
+browser/app/**
+browser/base/**
+browser/branding/**
+browser/components/**
+browser/config/**
+browser/docs/**
+browser/experiments/**
+browser/extensions/pdfjs/**
+browser/extensions/shumway/**
+browser/fuel/**
+browser/installer/**
+browser/locales/**
+browser/modules/**
+browser/themes/**
+
+# Loop specific exclusions
+
+# This file currently uses a non-standard (and not on a standards track)
+# if statement within catch.
+browser/extensions/loop/content/modules/MozLoopWorker.js
+# This file currently uses es7 features eslint issue:
+# https://github.com/eslint/espree/issues/125
+browser/extensions/loop/content/modules/MozLoopAPI.jsm
+# Need to fix the configuration for this.
+browser/extensions/loop/bootstrap.js
+# Need to drop the preprocessing (bug 1212428)
+browser/extensions/loop/content/preferences/prefs.js
+# Libs we don't need to check
+browser/extensions/loop/content/panels/vendor
+browser/extensions/loop/content/shared/vendor
+browser/extensions/loop/standalone/content/libs
+# Libs we don't need to check
+browser/extensions/loop/test/shared/vendor
+# Coverage files
+browser/extensions/loop/test/coverage
+# These are generated react files that we don't need to check
+browser/extensions/loop/content/panels/js/conversation.js
+browser/extensions/loop/content/panels/js/conversationViews.js
+browser/extensions/loop/content/panels/js/panel.js
+browser/extensions/loop/content/panels/js/roomViews.js
+browser/extensions/loop/content/panels/js/feedbackViews.js
+browser/extensions/loop/content/shared/js/textChatView.js
+browser/extensions/loop/content/shared/js/linkifiedTextView.js
+browser/extensions/loop/content/shared/js/views.js
+browser/extensions/loop/standalone/content/js/standaloneRoomViews.js
+browser/extensions/loop/standalone/content/js/webapp.js
+browser/extensions/loop/ui/ui-showcase.js
+# Don't need to check the built tree
+browser/extensions/loop/standalone/dist
+
+# devtools/ exclusions
+# Ignore d3
+devtools/client/shared/d3.js
+devtools/client/webaudioeditor/lib/dagre-d3.js
+
+# Ignore codemirror
+devtools/client/sourceeditor/codemirror/*.js
+devtools/client/sourceeditor/codemirror/**/*.js
+
+# Ignore jquery test libs
+devtools/client/markupview/test/lib_*
+
+# Ignore pre-processed files
+devtools/client/framework/toolbox-process-window.js
+devtools/client/performance/system.js
+devtools/client/webide/webide-prefs.js
+
+# Ignore various libs
+devtools/shared/jsbeautify/*
+devtools/shared/acorn/*
+devtools/shared/tern/*
+devtools/shared/pretty-fast/*
+devtools/shared/sourcemap/*
+
+# mobile/android/ exclusions
+mobile/android/chrome/content
+mobile/android/tests/
+
+# Uses `#filter substitution`
+mobile/android/b2gdroid/app/b2gdroid.js
+mobile/android/app/mobile.js
+mobile/android/chrome/content/healthreport-prefs.js
+
+# Uses `#expand`
+mobile/android/chrome/content/about.js
+
+# Not much JS to lint and non-standard at that
+mobile/android/installer/
+mobile/android/locales/
+
+# Pretty sure we're disabling this one anyway
+mobile/android/modules/ContactService.jsm
+
+# es7 proposed: array comprehensions
+#   https://github.com/eslint/espree/issues/125
+mobile/android/modules/WebappManager.jsm
+
+# Non-standard `(catch ex if ...)`
+mobile/android/components/Snippets.js
--- a/.hgignore
+++ b/.hgignore
@@ -75,34 +75,43 @@
 ^media/libstagefright/android$
 
 # Tag files generated by GNU Global
 GTAGS
 GRTAGS
 GSYMS
 GPATH
 
-# Unit tests for Loop
+# Various items for Loop
 ^browser/components/loop/standalone/content/config\.js$
-^browser/components/loop/standalone/node_modules/
+^browser/extensions/loop/.*/node_modules/
+^browser/extensions/loop/.*\.module-cache
+^browser/extensions/loop/test/coverage/desktop
+^browser/extensions/loop/test/coverage/shared_standalone
+^browser/extensions/loop/test/visual-regression/diff
+^browser/extensions/loop/test/visual-regression/new
+^browser/extensions/loop/test/visual-regression/refs
 
 # Git clone directory for updating web-platform-tests
 ^testing/web-platform/sync/
 
 # Android Gradle artifacts.
 ^mobile/android/gradle/.gradle
 
 # XCode project cruft
 ^embedding/ios/GeckoEmbed/GeckoEmbed.xcodeproj/project.xcworkspace/xcuserdata
 ^embedding/ios/GeckoEmbed/GeckoEmbed.xcodeproj/xcuserdata
 
 # Ignore mozharness execution files
 ^testing/mozharness/logs/
 ^testing/mozharness/build/
 
+# Ignore tox generated dir
+.tox/
+
 # Ignore node_modules from eslint-plugin-mozilla
 ^testing/eslint-plugin-mozilla/node_modules/
 
 # Ignore talos virtualenv and tp5n files.
 # The tp5n set is supposed to be decompressed at
 # testing/talos/talos/page_load_test/tp5n in order to run tests like tps
 # locally. Similarly, running talos requires a Python package virtual
 # environment. Both the virtual environment and tp5n files end up littering
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,9 +17,10 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
-Bug 1214058 New xpcshell test not getting picked up
+Bug 1210165 - Update ICU to release 56.1.
+Bug 966038 - Updating ICU doesn't properly notify the Mozilla build system, necessitating a clobber.
--- a/accessible/base/AccIterator.cpp
+++ b/accessible/base/AccIterator.cpp
@@ -4,17 +4,17 @@
 
 #include "AccIterator.h"
 
 #include "AccGroupInfo.h"
 #ifdef MOZ_XUL
 #include "XULTreeAccessible.h"
 #endif
 
-#include "mozilla/dom/Element.h"
+#include "mozilla/dom/HTMLLabelElement.h"
 
 using namespace mozilla;
 using namespace mozilla::a11y;
 
 ////////////////////////////////////////////////////////////////////////////////
 // AccIterator
 ////////////////////////////////////////////////////////////////////////////////
 
@@ -129,44 +129,53 @@ RelatedAccIterator::Next()
 HTMLLabelIterator::
   HTMLLabelIterator(DocAccessible* aDocument, const Accessible* aAccessible,
                     LabelFilter aFilter) :
   mRelIter(aDocument, aAccessible->GetContent(), nsGkAtoms::_for),
   mAcc(aAccessible), mLabelFilter(aFilter)
 {
 }
 
+bool
+HTMLLabelIterator::IsLabel(Accessible* aLabel)
+{
+  dom::HTMLLabelElement* labelEl =
+    dom::HTMLLabelElement::FromContent(aLabel->GetContent());
+  return labelEl && labelEl->GetControl() == mAcc->GetContent();
+}
+
 Accessible*
 HTMLLabelIterator::Next()
 {
   // Get either <label for="[id]"> element which explicitly points to given
   // element, or <label> ancestor which implicitly point to it.
   Accessible* label = nullptr;
   while ((label = mRelIter.Next())) {
-    if (label->GetContent()->IsHTMLElement(nsGkAtoms::label))
+    if (IsLabel(label)) {
       return label;
+    }
   }
 
   // Ignore ancestor label on not widget accessible.
   if (mLabelFilter == eSkipAncestorLabel || !mAcc->IsWidget())
     return nullptr;
 
   // Go up tree to get a name of ancestor label if there is one (an ancestor
   // <label> implicitly points to us). Don't go up farther than form or
   // document.
   Accessible* walkUp = mAcc->Parent();
   while (walkUp && !walkUp->IsDoc()) {
-    nsIContent* walkUpElm = walkUp->GetContent();
-    if (walkUpElm->IsHTMLElement(nsGkAtoms::label) &&
-        !walkUpElm->HasAttr(kNameSpaceID_None, nsGkAtoms::_for)) {
+    nsIContent* walkUpEl = walkUp->GetContent();
+    if (IsLabel(walkUp) &&
+        !walkUpEl->HasAttr(kNameSpaceID_None, nsGkAtoms::_for)) {
       mLabelFilter = eSkipAncestorLabel; // prevent infinite loop
       return walkUp;
     }
 
-    if (walkUpElm->IsHTMLElement(nsGkAtoms::form))
+    if (walkUpEl->IsHTMLElement(nsGkAtoms::form))
       break;
 
     walkUp = walkUp->Parent();
   }
 
   return nullptr;
 }
 
--- a/accessible/base/AccIterator.h
+++ b/accessible/base/AccIterator.h
@@ -125,16 +125,18 @@ public:
    */
   virtual Accessible* Next() override;
 
 private:
   HTMLLabelIterator();
   HTMLLabelIterator(const HTMLLabelIterator&);
   HTMLLabelIterator& operator = (const HTMLLabelIterator&);
 
+  bool IsLabel(Accessible* aLabel);
+
   RelatedAccIterator mRelIter;
   // XXX: replace it on weak reference (bug 678429), it's safe to use raw
   // pointer now because iterators life cycle is short.
   const Accessible* mAcc;
   LabelFilter mLabelFilter;
 };
 
 
--- a/accessible/generic/DocAccessible.cpp
+++ b/accessible/generic/DocAccessible.cpp
@@ -2156,17 +2156,17 @@ DocAccessible::MoveChild(Accessible* aCh
   MaybeNotifyOfValueChange(parent);
   FireDelayedEvent(reorderEvent);
 }
 
 void
 DocAccessible::PutChildrenBack(nsTArray<RefPtr<Accessible> >* aChildren,
                                uint32_t aStartIdx)
 {
-  nsTArray<Accessible*> containers;
+  nsTArray<RefPtr<Accessible> > containers;
   for (auto idx = aStartIdx; idx < aChildren->Length(); idx++) {
     Accessible* child = aChildren->ElementAt(idx);
 
     // If the child is in the tree then remove it from the owner.
     if (child->IsInDocument()) {
       Accessible* owner = child->Parent();
       if (!owner) {
         NS_ERROR("Cannot put the child back. No parent, a broken tree.");
@@ -2193,17 +2193,21 @@ DocAccessible::PutChildrenBack(nsTArray<
         containers.IndexOf(container) == nsTArray<Accessible*>::NoIndex) {
       containers.AppendElement(container);
     }
   }
 
   // And put it back where it belongs to.
   aChildren->RemoveElementsAt(aStartIdx, aChildren->Length() - aStartIdx);
   for (uint32_t idx = 0; idx < containers.Length(); idx++) {
-    UpdateTreeOnInsertion(containers[idx]);
+    NS_ASSERTION(containers[idx]->IsInDocument(),
+                 "A container has been destroyed.");
+    if (containers[idx]->IsInDocument()) {
+      UpdateTreeOnInsertion(containers[idx]);
+    }
   }
 }
 
 void
 DocAccessible::CacheChildrenInSubtree(Accessible* aRoot,
                                       Accessible** aFocusedAcc)
 {
   // If the accessible is focused then report a focus event after all related
--- a/accessible/html/HTMLElementAccessibles.cpp
+++ b/accessible/html/HTMLElementAccessibles.cpp
@@ -63,17 +63,17 @@ HTMLLabelAccessible::NativeName(nsString
   return aName.IsEmpty() ? eNameOK : eNameFromSubtree;
 }
 
 Relation
 HTMLLabelAccessible::RelationByType(RelationType aType)
 {
   Relation rel = AccessibleWrap::RelationByType(aType);
   if (aType == RelationType::LABEL_FOR) {
-    RefPtr<dom::HTMLLabelElement> label = dom::HTMLLabelElement::FromContent(mContent);
+    dom::HTMLLabelElement* label = dom::HTMLLabelElement::FromContent(mContent);
     rel.AppendTarget(mDoc, label->GetControl());
   }
 
   return rel;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // nsHTMLOuputAccessible
--- a/accessible/ipc/DocAccessibleChild.cpp
+++ b/accessible/ipc/DocAccessibleChild.cpp
@@ -368,16 +368,40 @@ DocAccessibleChild::RecvGetLevelInternal
   Accessible* acc = IdToAccessible(aID);
   if (acc) {
     *aLevel = acc->GetLevelInternal();
   }
   return true;
 }
 
 bool
+DocAccessibleChild::RecvScrollTo(const uint64_t& aID,
+                                 const uint32_t& aScrollType)
+{
+  Accessible* acc = IdToAccessible(aID);
+  if (acc) {
+    nsCoreUtils::ScrollTo(acc->Document()->PresShell(), acc->GetContent(),
+                          aScrollType);
+  }
+
+  return true;
+}
+
+bool
+DocAccessibleChild::RecvScrollToPoint(const uint64_t& aID, const uint32_t& aScrollType, const int32_t& aX, const int32_t& aY)
+{
+  Accessible* acc = IdToAccessible(aID);
+  if (acc) {
+    acc->ScrollToPoint(aScrollType, aX, aY);
+  }
+
+  return true;
+}
+
+bool
 DocAccessibleChild::RecvCaretLineNumber(const uint64_t& aID, int32_t* aLineNumber)
 {
   HyperTextAccessible* acc = IdToHyperTextAccessible(aID);
   *aLineNumber = acc && acc->IsTextRole() ? acc->CaretLineNumber() : 0;
   return true;
 }
 
 bool
--- a/accessible/ipc/DocAccessibleChild.h
+++ b/accessible/ipc/DocAccessibleChild.h
@@ -93,16 +93,21 @@ public:
   virtual bool RecvLandmarkRole(const uint64_t& aID, nsString* aLandmark) override;
 
   virtual bool RecvARIARoleAtom(const uint64_t& aID, nsString* aRole) override;
 
   virtual bool RecvGetLevelInternal(const uint64_t& aID, int32_t* aLevel) override;
 
   virtual bool RecvAttributes(const uint64_t& aID,
                               nsTArray<Attribute> *aAttributes) override;
+  virtual bool RecvScrollTo(const uint64_t& aID, const uint32_t& aScrollType)
+    override;
+  virtual bool RecvScrollToPoint(const uint64_t& aID,
+                                 const uint32_t& aScrollType,
+                                 const int32_t& aX, const int32_t& aY) override;
 
   virtual bool RecvCaretLineNumber(const uint64_t& aID, int32_t* aLineNumber)
     override;
   virtual bool RecvCaretOffset(const uint64_t& aID, int32_t* aOffset)
     override;
   virtual bool RecvSetCaretOffset(const uint64_t& aID, const int32_t& aOffset)
     override;
 
--- a/accessible/ipc/PDocAccessible.ipdl
+++ b/accessible/ipc/PDocAccessible.ipdl
@@ -81,16 +81,19 @@ child:
   prio(high) sync Attributes(uint64_t aID) returns(Attribute[] attributes);
   prio(high) sync RelationByType(uint64_t aID, uint32_t aRelationType)
     returns(uint64_t[] targets);
   prio(high) sync Relations(uint64_t aID) returns(RelationTargets[] relations);
   prio(high) sync IsSearchbox(uint64_t aID) returns(bool retval);
   prio(high) sync LandmarkRole(uint64_t aID) returns(nsString landmark);
   prio(high) sync ARIARoleAtom(uint64_t aID) returns(nsString role);
   prio(high) sync GetLevelInternal(uint64_t aID) returns(int32_t aLevel);
+  async ScrollTo(uint64_t aID, uint32_t aScrollType);
+  async ScrollToPoint(uint64_t aID, uint32_t aScrollType, int32_t aX,
+                      int32_t aY);
 
   // AccessibleText
 
   // TextSubstring is getText in IDL.
   prio(high) sync CaretLineNumber(uint64_t aID) returns(int32_t aLineNumber);
   prio(high) sync CaretOffset(uint64_t aID) returns(int32_t aOffset);
    async SetCaretOffset(uint64_t aID, int32_t aOffset);
   prio(high) sync CharacterCount(uint64_t aID) returns(int32_t aCount);
--- a/accessible/ipc/ProxyAccessible.cpp
+++ b/accessible/ipc/ProxyAccessible.cpp
@@ -195,16 +195,28 @@ ProxyAccessible::ARIARoleAtom() const
 int32_t
 ProxyAccessible::GetLevelInternal()
 {
   int32_t level = 0;
   Unused << mDoc->SendGetLevelInternal(mID, &level);
   return level;
 }
 
+void
+ProxyAccessible::ScrollTo(uint32_t aScrollType)
+{
+  Unused << mDoc->SendScrollTo(mID, aScrollType);
+}
+
+void
+ProxyAccessible::ScrollToPoint(uint32_t aScrollType, int32_t aX, int32_t aY)
+{
+  Unused << mDoc->SendScrollToPoint(mID, aScrollType, aX, aY);
+}
+
 int32_t
 ProxyAccessible::CaretLineNumber()
 {
   int32_t line = -1;
   Unused << mDoc->SendCaretOffset(mID, &line);
   return line;
 }
 
--- a/accessible/ipc/ProxyAccessible.h
+++ b/accessible/ipc/ProxyAccessible.h
@@ -139,16 +139,18 @@ public:
 
   bool IsSearchbox() const;
 
   nsIAtom* LandmarkRole() const;
 
   nsIAtom* ARIARoleAtom() const;
 
   int32_t GetLevelInternal();
+  void ScrollTo(uint32_t aScrollType);
+  void ScrollToPoint(uint32_t aScrollType, int32_t aX, int32_t aY);
 
   int32_t CaretLineNumber();
   int32_t CaretOffset();
   void SetCaretOffset(int32_t aOffset);
 
   int32_t CharacterCount();
   int32_t SelectionCount();
 
--- a/accessible/mac/mozAccessible.mm
+++ b/accessible/mac/mozAccessible.mm
@@ -547,17 +547,17 @@ ConvertToNSArray(nsTArray<ProxyAccessibl
     return nil;
 
   // Convert the given screen-global point in the cocoa coordinate system (with
   // origin in the bottom-left corner of the screen) into point in the Gecko
   // coordinate system (with origin in a top-left screen point).
   NSScreen* mainView = [[NSScreen screens] objectAtIndex:0];
   NSPoint tmpPoint = NSMakePoint(point.x,
                                  [mainView frame].size.height - point.y);
-  nsIntPoint geckoPoint = nsCocoaUtils::
+  LayoutDeviceIntPoint geckoPoint = nsCocoaUtils::
     CocoaPointsToDevPixels(tmpPoint, nsCocoaUtils::GetBackingScaleFactor(mainView));
 
   mozAccessible* nativeChild = nil;
   if (accWrap) {
     Accessible* child = accWrap->ChildAtPoint(geckoPoint.x, geckoPoint.y,
                                   Accessible::eDeepestChild);
     if (child)
       nativeChild = GetNativeFromGeckoAccessible(child);
--- a/accessible/tests/mochitest/hyperlink/test_general.html
+++ b/accessible/tests/mochitest/hyperlink/test_general.html
@@ -193,25 +193,16 @@ https://bugzilla.mozilla.org/show_bug.cg
       id = "linkWithTitleNameFromImg";
       linkAcc = getAccessible(id, [nsIAccessibleHyperLink]);
       testThis(id, linkAcc, ROLE_LINK, 1, "The title for link", true, 447,
                448);
       testStates(linkAcc, STATE_LINKED, 0);
       testAction(id, linkAcc, "jump");
 
       //////////////////////////////////////////////////////////////////////////
-      // Link with label, no name from the subtree (bug 438325).
-      id = "linkWithLabelNoNameFromSubtree";
-      linkAcc = getAccessible(id, [nsIAccessibleHyperLink]);
-      testThis(id, linkAcc, ROLE_LINK, 1, "Link with label and nested image:",
-               true, 450, 451);
-      testStates(linkAcc, STATE_LINKED, 0);
-      testAction(id, linkAcc, "jump");
-
-      //////////////////////////////////////////////////////////////////////////
       // Text accessible shouldn't implement nsIAccessibleHyperLink
       var res = isAccessible(getNode("namedAnchor").firstChild,
                              [nsIAccessibleHyperLink]);
       ok(!res, "Text accessible shouldn't implement nsIAccessibleHyperLink");
 
       //////////////////////////////////////////////////////////////////////////
       // Test focus
       gQueue = new eventQueue();
@@ -273,19 +264,16 @@ https://bugzilla.mozilla.org/show_bug.cg
       id="linkWithTitleNoNameFromSubtree" href="http://www.heise.de/"
       title="Link with title"><img src=""/></a
   ><br>Link with title attribute (name from subtree): <a 
       id="linkWithTitleNameFromSubtree" href="http://www.heise.de/"
       title="Link with title">the name from subtree</a
   ><br>Link with title attribute (name from nested image): <a 
       id="linkWithTitleNameFromImg" href="http://www.heise.de/"
       title="Link with title"><img src="" alt="The title for link"/></a
-  ><br><label for="linkWithLabelNoNameFromSubtree">Link with label and nested image: </label><a 
-      id="linkWithLabelNoNameFromSubtree"
-      href="http://www.heise.de/"><img src=""/></a
-  ><br>Map that is used to group links (www.w3.org/TR/WCAG10-HTML-TECHS/#group-bypass), also see the bug 431615:<br
+  ><br><br>Map that is used to group links (www.w3.org/TR/WCAG10-HTML-TECHS/#group-bypass), also see the bug 431615:<br
   ><map id="linksmap" title="Site navigation"><ul
     ><li><a href="http://mozilla.org">About the project</a></li
     ><li><a href="http://mozilla.org">Sites and sounds</a></li
     ></ul
   ></map
 ></body>
 </html>
--- a/accessible/tests/mochitest/name/markuprules.xml
+++ b/accessible/tests/mochitest/name/markuprules.xml
@@ -87,60 +87,65 @@
   <ruledfn>
 
     <!-- bricks -->
     <ruleset id="ARIA">
       <rule attr="aria-labelledby" type="ref"/>
       <rule attr="aria-label" type="string"/>
     </ruleset>
 
-    <ruleset id="HTMLElm:Head">
+    <ruleset id="HTMLControl:Head">
       <ruleset ref="ARIA"/>
       <rule elm="label" elmattr="for"/>
     </ruleset>
 
     <!-- general -->
     <ruleset id="HTMLControl">
-      <ruleset ref="ARIA"/>
-      <rule elm="label" elmattr="for"/>
+      <ruleset ref="HTMLControl:Head"/>
       <rule fromsubtree="true"/>
       <rule attr="title" type="string"/>
     </ruleset>
 
     <ruleset id="HTMLElm">
-      <ruleset ref="HTMLElm:Head"/>
+      <ruleset ref="ARIA"/>
       <rule attr="title" type="string"/>
     </ruleset>
 
     <!-- specific -->
+    <ruleset id="HTMLARIAGridCell">
+      <ruleset ref="ARIA"/>
+      <rule fromsubtree="true"/>
+      <rule attr="title" type="string"/>
+    </ruleset>
+
     <ruleset id="HTMLInputButton">
-      <ruleset ref="HTMLElm:Head"/>
+      <ruleset ref="HTMLControl:Head"/>
       <rule attr="value" type="string" explict-name="false" reordered="true"/>
       <rule attr="title" type="string"/>
     </ruleset>
 
     <ruleset id="HTMLInputSubmit" defaultName="Submit Query">
-      <ruleset ref="HTMLElm:Head"/>
+      <ruleset ref="HTMLControl:Head"/>
       <rule attr="value" type="string" explict-name="false" textchanged="true"/>
     </ruleset>
 
     <ruleset id="HTMLInputReset" defaultName="Reset">
-      <ruleset ref="HTMLElm:Head"/>
+      <ruleset ref="HTMLControl:Head"/>
       <rule attr="value" type="string" explict-name="false" textchanged="true"/>
     </ruleset>
 
     <ruleset id="HTMLInputImage">
-      <ruleset ref="HTMLElm:Head"/>
+      <ruleset ref="HTMLControl:Head"/>
       <rule attr="alt" type="string" recreated="true"/>
       <rule attr="value" type="string" recreated="true"/>
       <rule attr="title" type="string"/>
     </ruleset>
 
     <ruleset id="HTMLInputImageNoValidSrc" defaultName="Submit Query">
-      <ruleset ref="HTMLElm:Head"/>
+      <ruleset ref="HTMLControl:Head"/>
       <rule attr="alt" type="string" explict-name="false" recreated="true"/>
       <rule attr="value" type="string" explict-name="false" recreated="true"/>
     </ruleset>
 
     <ruleset id="HTMLOption">
       <ruleset ref="ARIA"/>
       <rule attr="label" type="string"/>
       <rule fromsubtree="true"/>
@@ -155,17 +160,17 @@
 
     <ruleset id="HTMLImgEmptyAlt">
       <ruleset ref="ARIA"/>
       <rule attr="title" type="string"/>
       <rule attr="alt" type="string"/>
     </ruleset>
 
     <ruleset id="HTMLTable">
-      <ruleset ref="HTMLElm:Head"/>
+      <ruleset ref="ARIA"/>
       <rule elm="caption"/>
       <rule attr="summary" type="string"/>
       <rule attr="title" type="string"/>
     </ruleset>
   </ruledfn>
 
   <rulesample>
 
@@ -316,17 +321,17 @@
               <html:li>This is a list</html:li>
             </html:ul>
           </html:td>
         </html:tr>
       </html:table>
     </markup>
 
     <markup id="HTMLTdARIAGridCellTest"
-            ref="html:table/html:tr/html:td" ruleset="HTMLControl">
+            ref="html:table/html:tr/html:td" ruleset="HTMLARIAGridCell">
       <html:span id="l1" textequiv="test2">test2</html:span>
       <html:span id="l2" textequiv="test3">test3</html:span>
       <html:label for="gc" textequiv="test4">test4</html:label>
       <html:table>
         <html:tr>
           <html:td id="gc"
                    role="gridcell"
                    aria-label="test1"
--- a/accessible/tests/mochitest/name/test_general.html
+++ b/accessible/tests/mochitest/name/test_general.html
@@ -115,16 +115,20 @@
 
       // The label element and the button are in the same document. Gets the
       // name from the label subtree.
       testName("btn_label_indocument", "in document");
 
       // Multiple label elements for single button
       testName("btn_label_multi", "label1label2");
 
+      // Multiple controls inside a label element
+      testName("ctrl_in_label_1", "Enable a button control");
+      testName("ctrl_in_label_2", "button");
+
 
       //////////////////////////////////////////////////////////////////////////
       // name from children
 
       // ARIA role button is presented allowing the name calculation from
       // children.
       testName("btn_children", "14");
 
@@ -442,16 +446,22 @@
   <label for="btn_label_indocument">in document</label>
   <button id="btn_label_indocument">13</button>
 
   <!-- multiple label elements for single button -->
   <label for="btn_label_multi">label1</label>
   <label for="btn_label_multi">label2</label>
   <button id="btn_label_multi">button</button>
 
+  <!-- a label containing more than one controls -->
+  <label>
+    Enable <input id="ctrl_in_label_1" type="checkbox"> a
+    <input id="ctrl_in_label_2" type="button" value="button"> control
+  </label>
+
   <!-- name from children -->
   <span id="btn_children" role="button">14</span>
 
   <!-- no name from content, ARIA role overrides this rule -->
   <button id="btn_nonamefromcontent" role="img">1</button>
 
   <!-- name from children, hidden children -->
   <div role="listbox" tabindex="0">
--- a/accessible/tests/mochitest/name/test_link.html
+++ b/accessible/tests/mochitest/name/test_link.html
@@ -18,19 +18,16 @@
     function doTest()
     {
       // aria-label
       testName("aria_label", "anchor label");
 
       // aria-labelledby
       testName("aria_labelledby", "text");
 
-      // html:label
-      testName("label", "label");
-
       // name from content
       testName("namefromcontent", "1");
 
       // name from content
       testName("namefromimg", "img title");
 
       // no name from content
       testName("nonamefromcontent", null);
@@ -66,21 +63,16 @@
 
   <!-- aria-labelledby, preferred to html:label -->
   <span id="text">text</span>
   <label for="aria_labelledby">label</label>
   <a id="aria_labelledby" href="mozilla.org"
      aria-labelledby="text">1</a>
   <br/>
 
-  <!-- label, preferred to name from content -->
-  <label for="label">label</label>
-  <a id="label" href="mozilla.org">1</a>
-  <br/>
-
   <!-- name from content, preferred to @title -->
   <a id="namefromcontent" href="mozilla.org"
      title="title">1</a>
   <br/>
 
   <!-- name from content, preferred to @title -->
   <a id="namefromimg" href="mozilla.org"
      title="title"><img alt="img title" /></a>
--- a/accessible/windows/ia2/ia2Accessible.cpp
+++ b/accessible/windows/ia2/ia2Accessible.cpp
@@ -274,18 +274,23 @@ STDMETHODIMP
 ia2Accessible::scrollTo(enum IA2ScrollType aScrollType)
 {
   A11Y_TRYBLOCK_BEGIN
 
   AccessibleWrap* acc = static_cast<AccessibleWrap*>(this);
   if (acc->IsDefunct())
     return CO_E_OBJNOTCONNECTED;
 
-  nsCoreUtils::ScrollTo(acc->Document()->PresShell(),
-                        acc->GetContent(), aScrollType);
+  if (acc->IsProxy()) {
+    acc->Proxy()->ScrollTo(aScrollType);
+  } else {
+    nsCoreUtils::ScrollTo(acc->Document()->PresShell(), acc->GetContent(),
+                          aScrollType);
+  }
+
   return S_OK;
 
   A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::scrollToPoint(enum IA2CoordinateType aCoordType,
                               long aX, long aY)
@@ -295,17 +300,22 @@ ia2Accessible::scrollToPoint(enum IA2Coo
   AccessibleWrap* acc = static_cast<AccessibleWrap*>(this);
   if (acc->IsDefunct())
     return CO_E_OBJNOTCONNECTED;
 
   uint32_t geckoCoordType = (aCoordType == IA2_COORDTYPE_SCREEN_RELATIVE) ?
     nsIAccessibleCoordinateType::COORDTYPE_SCREEN_RELATIVE :
     nsIAccessibleCoordinateType::COORDTYPE_PARENT_RELATIVE;
 
-  acc->ScrollToPoint(geckoCoordType, aX, aY);
+  if (acc->IsProxy()) {
+    acc->Proxy()->ScrollToPoint(geckoCoordType, aX, aY);
+  } else {
+    acc->ScrollToPoint(geckoCoordType, aX, aY);
+  }
+
   return S_OK;
 
   A11Y_TRYBLOCK_END
 }
 
 STDMETHODIMP
 ia2Accessible::get_groupPosition(long* aGroupLevel,
                                  long* aSimilarItemsInGroup,
--- a/accessible/windows/msaa/nsWinUtils.cpp
+++ b/accessible/windows/msaa/nsWinUtils.cpp
@@ -41,17 +41,17 @@ already_AddRefed<nsIDOMCSSStyleDeclarati
 nsWinUtils::GetComputedStyleDeclaration(nsIContent* aContent)
 {
   nsIContent* elm = nsCoreUtils::GetDOMElementFor(aContent);
   if (!elm)
     return nullptr;
 
   // Returns number of items in style declaration
   nsCOMPtr<nsPIDOMWindow> window =
-    do_QueryInterface(elm->OwnerDoc()->GetWindow());
+    do_QueryInterface(elm->OwnerDoc()->GetInnerWindow());
   if (!window)
     return nullptr;
 
   ErrorResult dummy;
   nsCOMPtr<nsICSSDeclaration> cssDecl;
   nsCOMPtr<Element> domElement(do_QueryInterface(elm));
   cssDecl = window->GetComputedStyle(*domElement, EmptyString(), dummy);
   nsCOMPtr<nsIDOMCSSStyleDeclaration> domDecl = do_QueryInterface(cssDecl);
--- a/addon-sdk/source/lib/sdk/base64.js
+++ b/addon-sdk/source/lib/sdk/base64.js
@@ -33,11 +33,11 @@ exports.decode = function (data, charset
 
   return atob(data);
 }
 
 exports.encode = function (data, charset) {
   if (isUTF8(charset))
     return btoa(unescape(encodeURIComponent(data)))
 
-  data = String.fromCharCode(...[(c.charCodeAt(0) & 0xff) for (c of data)]);
+  data = String.fromCharCode(...Array.from(data, c => (c.charCodeAt(0) & 0xff)));
   return btoa(data);
 }
--- a/addon-sdk/source/lib/sdk/content/context-menu.js
+++ b/addon-sdk/source/lib/sdk/content/context-menu.js
@@ -302,17 +302,17 @@ function getItemWorkerForWindow(item, wi
 }
 
 // A very simple remote proxy for every item. It's job is to provide data for
 // the main process to use to determine visibility state and to call into
 // content scripts when clicked.
 var RemoteItem = Class({
   initialize: function(options, manager) {
     this.id = options.id;
-    this.contexts = [instantiateContext(c) for (c of options.contexts)];
+    this.contexts = options.contexts.map(instantiateContext);
     this.contentScript = options.contentScript;
     this.contentScriptFile = options.contentScriptFile;
 
     this.manager = manager;
 
     this.workerMap = new Map();
     keepAlive.set(this.id, this);
   },
--- a/addon-sdk/source/lib/sdk/content/utils.js
+++ b/addon-sdk/source/lib/sdk/content/utils.js
@@ -85,17 +85,17 @@ function WorkerHost (workerFor) {
   }
 }
 exports.WorkerHost = WorkerHost;
 
 function makeChildOptions(options) {
   function makeStringArray(arrayOrValue) {
     if (!arrayOrValue)
       return [];
-    return [String(v) for (v of [].concat(arrayOrValue))];
+    return [].concat(arrayOrValue).map(String);
   }
 
   return {
     id: String(uuid()),
     contentScript: makeStringArray(options.contentScript),
     contentScriptFile: makeStringArray(options.contentScriptFile),
     contentScriptOptions: options.contentScriptOptions ?
                           JSON.stringify(options.contentScriptOptions) :
--- a/addon-sdk/source/lib/sdk/content/worker-child.js
+++ b/addon-sdk/source/lib/sdk/content/worker-child.js
@@ -129,20 +129,20 @@ function exceptions(key, value) {
   let _errorType = value.constructor.name;
   let { message, fileName, lineNumber, stack, name } = value;
   return { _errorType, message, fileName, lineNumber, stack, name };
 }
 
 // workers for windows in this tab
 var keepAlive = new Map();
 
-process.port.on('sdk/worker/create', (process, options) => {
-  options.window = getByInnerId(options.windowId);
-  if (!options.window)
-    return;
+process.port.on('sdk/worker/create', (process, options, cpows) => {
+  options.window = cpows.window;
+  let worker = new WorkerChild(options);
 
-  let worker = new WorkerChild(options);
+  let frame = frames.getFrameForWindow(options.window.top);
+  frame.port.emit('sdk/worker/connect', options.id, options.window.location.href);
 });
 
 when(reason => {
   for (let worker of keepAlive.values())
     worker.destroy(reason);
 });
--- a/addon-sdk/source/lib/sdk/content/worker.js
+++ b/addon-sdk/source/lib/sdk/content/worker.js
@@ -111,39 +111,31 @@ const Worker = Class({
   toString: () => '[object Worker]',
 
   detach: method(detach),
   destroy: method(destroy),
 })
 exports.Worker = Worker;
 
 attach.define(Worker, function(worker, window) {
-  // This method of attaching should be deprecated
-
-  if (Cu.isCrossProcessWrapper(window))
-    throw new Error("Attaching worker to a window from another " +
-                    "process directly is not supported.");
-
   let model = modelFor(worker);
   if (model.attached)
     detach(worker);
 
-  model.window = window;
-  let frame = null;
-  let tab = getTabForContentWindowNoShim(window);
-  if (tab)
-    frame = frames.getFrameForBrowser(getBrowserForTab(tab));
+  let childOptions = makeChildOptions(model.options);
+  processes.port.emitCPOW('sdk/worker/create', [childOptions], { window });
 
-  let childOptions = makeChildOptions(model.options);
-  childOptions.windowId = getInnerId(window);
-
-  processes.port.emit('sdk/worker/create', childOptions);
-
-  connect(worker, frame, { id: childOptions.id, url: String(window.location) });
-})
+  let listener = (frame, id, url) => {
+    if (id != childOptions.id)
+      return;
+    frames.port.off('sdk/worker/connect', listener);
+    connect(worker, frame, { id, url });
+  };
+  frames.port.on('sdk/worker/connect', listener);
+});
 
 connect.define(Worker, function(worker, frame, { id, url }) {
   let model = modelFor(worker);
   if (model.attached)
     detach(worker);
 
   model.id = id;
   model.frame = frame;
@@ -154,29 +146,28 @@ connect.define(Worker, function(worker, 
   processes.port.on('sdk/worker/event', worker.receive);
 
   model.attached = true;
   model.destroyed = false;
   model.frozen = false;
 
   model.earlyEvents.forEach(args => worker.send(...args));
   model.earlyEvents = [];
-  emit(worker, 'attach', model.window);
+  emit(worker, 'attach');
 });
 
 // unload and release the child worker, release window reference
 detach.define(Worker, function(worker) {
   let model = modelFor(worker);
   if (!model.attached)
     return;
 
   processes.port.off('sdk/worker/event', worker.receive);
   model.attached = false;
   model.destroyed = true;
-  model.window = null;
   emit(worker, 'detach');
 });
 
 isPrivate.define(Worker, ({ tab }) => isPrivate(tab));
 
 // Something in the parent side has destroyed the worker, tell the child to
 // detach, the child will respond when it has detached
 destroy.define(Worker, function(worker, reason) {
--- a/addon-sdk/source/lib/sdk/context-menu.js
+++ b/addon-sdk/source/lib/sdk/context-menu.js
@@ -350,17 +350,17 @@ function itemActivated(item, clickedNode
   let process = processes.getById(lastContextProcessId);
   if (process)
     process.port.emit('sdk/contextmenu/activateitems', items, data);
 }
 
 function serializeItem(item) {
   return {
     id: internal(item).id,
-    contexts: [c.serialize() for (c of item.context)],
+    contexts: item.context.map(c => c.serialize()),
     contentScript: item.contentScript,
     contentScriptFile: item.contentScriptFile,
   };
 }
 
 // All things that appear in the context menu extend this
 var BaseItem = Class({
   initialize: function initialize() {
--- a/addon-sdk/source/lib/sdk/deprecated/unit-test.js
+++ b/addon-sdk/source/lib/sdk/deprecated/unit-test.js
@@ -375,17 +375,17 @@ TestRunner.prototype = {
         this.pass("There is a clean UI.");
       });
     }).
     then(() => {
       this.testRunSummary.push({
         name: this.test.name,
         passed: this.test.passed,
         failed: this.test.failed,
-        errors: [error for (error in this.test.errors)].join(", ")
+        errors: Object.keys(this.test.errors).join(", ")
       });
 
       if (this.onDone !== null) {
         let onDone = this.onDone;
         this.onDone = null;
         timer.setTimeout(_ => onDone(this));
       }
     }).
--- a/addon-sdk/source/lib/sdk/remote/child.js
+++ b/addon-sdk/source/lib/sdk/remote/child.js
@@ -2,17 +2,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
 const { isChildLoader } = require('./core');
 if (!isChildLoader)
   throw new Error("Cannot load sdk/remote/child in a main process loader.");
 
-const { Ci, Cc } = require('chrome');
+const { Ci, Cc, Cu } = require('chrome');
 const runtime = require('../system/runtime');
 const { Class } = require('../core/heritage');
 const { Namespace } = require('../core/namespace');
 const { omit } = require('../util/object');
 const { when } = require('../system/unload');
 const { EventTarget } = require('../event/target');
 const { emit } = require('../event/core');
 const { Disposable } = require('../core/disposable');
@@ -34,31 +34,47 @@ const process = {
     return runtime.processID;
   },
   get isRemote() {
     return runtime.processType != MAIN_PROCESS;
   }
 };
 exports.process = process;
 
-process.port.emit = (...args) => {
-  mm.sendAsyncMessage('sdk/remote/process/message', {
-    loaderID,
-    args
-  });
+function definePort(obj, name) {
+  obj.port.emit = (event, ...args) => {
+    let manager = ns(obj).messageManager;
+    if (!manager)
+      return;
+
+    manager.sendAsyncMessage(name, { loaderID, event, args });
+  };
 }
 
-function processMessageReceived({ data }) {
+function messageReceived({ data, objects }) {
   // Ignore messages from other loaders
   if (data.loaderID != loaderID)
     return;
-  let [event, ...args] = data.args;
-  emit(process.port, event, process, ...args);
+
+  let keys = Object.keys(objects);
+  if (keys.length) {
+    // If any objects are CPOWs then ignore this message. We don't want child
+    // processes interracting with CPOWs
+    if (!keys.every(name => !Cu.isCrossProcessWrapper(objects[name])))
+      return;
+
+    data.args.push(objects);
+  }
+
+  emit(this.port, data.event, this, ...data.args);
 }
 
+ns(process).messageManager = mm;
+definePort(process, 'sdk/remote/process/message');
+let processMessageReceived = messageReceived.bind(process);
 mm.addMessageListener('sdk/remote/process/message', processMessageReceived);
 
 when(() => {
   mm.removeMessageListener('sdk/remote/process/message', processMessageReceived);
   frames = null;
 });
 
 process.port.on('sdk/remote/require', (process, uri) => {
@@ -106,46 +122,34 @@ function arrayContainsListener(array, li
 
 function makeFrameEventListener(frame, callback) {
   return callback.bind(frame);
 }
 
 var FRAME_ID = 0;
 var tabMap = new Map();
 
-function frameMessageReceived({ data }) {
-  if (data.loaderID != loaderID)
-    return;
-  let [event, ...args] = data.args;
-  emit(this.port, event, this, ...args);
-}
-
 const Frame = Class({
   implements: [ Disposable ],
   extends: EventTarget,
   setup: function(contentFrame) {
     // This ID should be unique for this loader across all processes
     ns(this).id = runtime.processID + ":" + FRAME_ID++;
 
     ns(this).contentFrame = contentFrame;
     ns(this).messageManager = contentFrame;
     ns(this).domListeners = [];
 
     tabMap.set(contentFrame.docShell, this);
 
-    ns(this).messageReceived = frameMessageReceived.bind(this);
+    ns(this).messageReceived = messageReceived.bind(this);
     ns(this).messageManager.addMessageListener('sdk/remote/frame/message', ns(this).messageReceived);
 
     this.port = new EventTarget();
-    this.port.emit = (...args) => {
-      ns(this).messageManager.sendAsyncMessage('sdk/remote/frame/message', {
-        loaderID,
-        args
-      });
-    };
+    definePort(this, 'sdk/remote/frame/message');
 
     ns(this).messageManager.sendAsyncMessage('sdk/remote/frame/attach', {
       loaderID,
       frameID: ns(this).id,
       processID: runtime.processID
     });
 
     frames.attachItem(this);
--- a/addon-sdk/source/lib/sdk/remote/parent.js
+++ b/addon-sdk/source/lib/sdk/remote/parent.js
@@ -68,45 +68,56 @@ const ppmm = Cc['@mozilla.org/parentproc
              getService(Ci.nsIMessageBroadcaster);
 const gmm = Cc['@mozilla.org/globalmessagemanager;1'].
             getService(Ci.nsIMessageBroadcaster);
 
 const ns = Namespace();
 
 var processMap = new Map();
 
-function processMessageReceived({ target, data }) {
+function definePort(obj, name) {
+  obj.port.emitCPOW = (event, args, cpows = {}) => {
+    let manager = ns(obj).messageManager;
+    if (!manager)
+      return;
+
+    let method = manager instanceof Ci.nsIMessageBroadcaster ?
+                 "broadcastAsyncMessage" : "sendAsyncMessage";
+
+    manager[method](name, { loaderID, event, args }, cpows);
+  };
+
+  obj.port.emit = (event, ...args) => obj.port.emitCPOW(event, args);
+}
+
+function messageReceived({ target, data }) {
+  // Ignore messages from other loaders
   if (data.loaderID != loaderID)
     return;
-  let [event, ...args] = data.args;
-  emit(this.port, event, this, ...args);
+
+  emit(this.port, data.event, this, ...data.args);
 }
 
 // Process represents a gecko process that can load webpages. Each process
 // contains a number of Frames. This class is used to send and receive messages
 // from a single process.
 const Process = Class({
   implements: [ Disposable ],
   extends: EventTarget,
   setup: function(id, messageManager, isRemote) {
     ns(this).id = id;
     ns(this).isRemote = isRemote;
     ns(this).messageManager = messageManager;
-    ns(this).messageReceived = processMessageReceived.bind(this);
+    ns(this).messageReceived = messageReceived.bind(this);
     this.destroy = this.destroy.bind(this);
     ns(this).messageManager.addMessageListener('sdk/remote/process/message', ns(this).messageReceived);
     ns(this).messageManager.addMessageListener('child-process-shutdown', this.destroy);
 
     this.port = new EventTarget();
-    this.port.emit = (...args) => {
-      ns(this).messageManager.sendAsyncMessage('sdk/remote/process/message', {
-        loaderID,
-        args
-      });
-    };
+    definePort(this, 'sdk/remote/process/message');
 
     // Load any remote modules
     for (let module of remoteModules.values())
       this.port.emit('sdk/remote/require', module);
 
     processMap.set(ns(this).id, this);
     processes.attachItem(this);
   },
@@ -127,41 +138,30 @@ const Process = Class({
 
 // Processes gives an API for enumerating an sending and receiving messages from
 // all processes as well as detecting when a new process starts.
 const Processes = Class({
   implements: [ EventParent ],
   extends: EventTarget,
   initialize: function() {
     EventParent.prototype.initialize.call(this);
+    ns(this).messageManager = ppmm;
 
     this.port = new EventTarget();
-    this.port.emit = (...args) => {
-      ppmm.broadcastAsyncMessage('sdk/remote/process/message', {
-        loaderID,
-        args
-      });
-    };
+    definePort(this, 'sdk/remote/process/message');
   },
 
   getById: function(id) {
     return processMap.get(id);
   }
 });
 var processes = exports.processes = new Processes();
 
 var frameMap = new Map();
 
-function frameMessageReceived({ target, data }) {
-  if (data.loaderID != loaderID)
-    return;
-  let [event, ...args] = data.args;
-  emit(this.port, event, this, ...args);
-}
-
 function setFrameProcess(frame, process) {
   ns(frame).process = process;
   frames.attachItem(frame);
 }
 
 // Frames display webpages in a process. In the main process every Frame is
 // linked with a <browser> or <iframe> element. 
 const Frame = Class({
@@ -169,29 +169,21 @@ const Frame = Class({
   extends: EventTarget,
   setup: function(id, node) {
     ns(this).id = id;
     ns(this).node = node;
 
     let frameLoader = node.QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader;
     ns(this).messageManager = frameLoader.messageManager;
 
-    ns(this).messageReceived = frameMessageReceived.bind(this);
+    ns(this).messageReceived = messageReceived.bind(this);
     ns(this).messageManager.addMessageListener('sdk/remote/frame/message', ns(this).messageReceived);
 
     this.port = new EventTarget();
-    this.port.emit = (...args) => {
-      let manager = ns(this).messageManager;
-      if (!manager)
-        return;
-      manager.sendAsyncMessage('sdk/remote/frame/message', {
-        loaderID,
-        args
-      });
-    };
+    definePort(this, 'sdk/remote/frame/message');
 
     frameMap.set(ns(this).messageManager, this);
   },
 
   dispose: function() {
     emit(this, 'detach', this);
     ns(this).messageManager.removeMessageListener('sdk/remote/frame/message', ns(this).messageReceived);
 
@@ -225,24 +217,20 @@ system.on('message-manager-disconnect', 
 
 // Provides an API for enumerating and sending and receiving messages from all
 // Frames
 const FrameList = Class({
   implements: [ EventParent ],
   extends: EventTarget,
   initialize: function() {
     EventParent.prototype.initialize.call(this);
+    ns(this).messageManager = gmm;
 
     this.port = new EventTarget();
-    this.port.emit = (...args) => {
-      gmm.broadcastAsyncMessage('sdk/remote/frame/message', {
-        loaderID,
-        args
-      });
-    };
+    definePort(this, 'sdk/remote/frame/message');
   },
 
   // Returns the frame for a browser element
   getFrameForBrowser: function(browser) {
     for (let frame of this) {
       if (frame.frameElement == browser)
         return frame;
     }
--- a/addon-sdk/source/lib/sdk/test/harness.js
+++ b/addon-sdk/source/lib/sdk/test/harness.js
@@ -188,17 +188,17 @@ function showResults() {
   if (gWeakrefInfo) {
     gWeakrefInfo.forEach(
       function(info) {
         var ref = info.weakref.get();
         if (ref !== null) {
           var data = ref.__url__ ? ref.__url__ : ref;
           var warning = data == "[object Object]"
             ? "[object " + data.constructor.name + "(" +
-              [p for (p in data)].join(", ") + ")]"
+              Object.keys(data).join(", ") + ")]"
             : data;
           console.warn("LEAK", warning, info.bin);
         }
       }
     );
   }
 
   onDone(results);
@@ -456,18 +456,17 @@ var consoleListener = {
     if (!(object instanceof Ci.nsIScriptError))
       return;
     this.errorsLogged++;
     var message = object.QueryInterface(Ci.nsIConsoleMessage).message;
     if (IMPORTANT_ERRORS.find(msg => message.indexOf(msg) >= 0)) {
       testConsole.error(message);
       return;
     }
-    var pointless = [err for (err of POINTLESS_ERRORS)
-                         if (message.indexOf(err) >= 0)];
+    var pointless = POINTLESS_ERRORS.filter(err => message.indexOf(err) >= 0);
     if (pointless.length == 0 && message)
       testConsole.log(message);
   }
 };
 
 function TestRunnerConsole(base, options) {
   let proto = extend(base, {
     errorsLogged: 0,
--- a/addon-sdk/source/lib/sdk/timers.js
+++ b/addon-sdk/source/lib/sdk/timers.js
@@ -57,17 +57,17 @@ var immediates = new Map();
 
 var dispatcher = _ => {
   // Allow scheduling of a new dispatch loop.
   dispatcher.scheduled = false;
   // Take a snapshot of timer `id`'s that have being present before
   // starting a dispatch loop, in order to ignore timers registered
   // in side effect to dispatch while also skipping immediates that
   // were removed in side effect.
-  let ids = [id for ([id] of immediates)];
+  let ids = [...immediates.keys()];
   for (let id of ids) {
     let immediate = immediates.get(id);
     if (immediate) {
       immediates.delete(id);
       try { immediate(); }
       catch (error) { console.exception(error); }
     }
   }
--- a/addon-sdk/source/test/addons/e10s-remote/main.js
+++ b/addon-sdk/source/test/addons/e10s-remote/main.js
@@ -2,16 +2,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const LOCAL_URI = "about:robots";
 const REMOTE_URI = "data:text/html;charset=utf-8,remote";
 
+const { Cu } = require('chrome');
 const { Loader } = require('sdk/test/loader');
 const { getTabs, openTab, closeTab, setTabURL, getBrowserForTab, getURI } = require('sdk/tabs/utils');
 const { getMostRecentBrowserWindow } = require('sdk/window/utils');
 const { cleanUI } = require("sdk/test/utils");
 const { setTimeout } = require("sdk/timers");
 const { promiseEvent, promiseDOMEvent, promiseEventOnItemAndContainer,
         waitForProcesses, getChildFrameCount, isE10S } = require("./utils");
 const { after } = require('sdk/test/utils');
@@ -41,52 +42,59 @@ exports["test process restart"] = functi
     return;
   }
 
   let window = getMostRecentBrowserWindow();
 
   let tabs = getTabs(window);
   assert.equal(tabs.length, 1, "Should have just the one tab to start with");
   let tab = tabs[0];
+  let browser = getBrowserForTab(tab);
 
   let loader = new Loader(module);
   let { processes, frames } = yield waitForProcesses(loader);
 
   let remoteProcess = Array.filter(processes, p => p.isRemote)[0];
   let localProcess = Array.filter(processes, p => !p.isRemote)[0];
   let remoteFrame = Array.filter(frames, f => f.process == remoteProcess)[0];
 
   // Switch the remote tab to a local URI which should kill the remote process
 
   let frameDetach = promiseEventOnItemAndContainer(assert, remoteFrame, frames, 'detach');
   let frameAttach = promiseTabFrameAttach(frames);
   let processDetach = promiseEventOnItemAndContainer(assert, remoteProcess, processes, 'detach');
+  let browserLoad = promiseDOMEvent(browser, "load", true);
   setTabURL(tab, LOCAL_URI);
   // The load should kill the remote frame
   yield frameDetach;
   // And create a new frame in the local process
   let [newFrame] = yield frameAttach;
   assert.equal(newFrame.process, localProcess, "New frame should be in the local process");
   // And kill the process
   yield processDetach;
+  yield browserLoad;
 
   frameDetach = promiseEventOnItemAndContainer(assert, newFrame, frames, 'detach');
   let processAttach = promiseEvent(processes, 'attach');
   frameAttach = promiseTabFrameAttach(frames);
+  browserLoad = promiseDOMEvent(browser, "load", true);
   setTabURL(tab, REMOTE_URI);
   // The load should kill the remote frame
   yield frameDetach;
   // And create a new remote process
   [remoteProcess] = yield processAttach;
   assert.ok(remoteProcess.isRemote, "Process should be remote");
   // And create a new frame in the remote process
   [newFrame] = yield frameAttach;
   assert.equal(newFrame.process, remoteProcess, "New frame should be in the remote process");
+  yield browserLoad;
 
+  browserLoad = promiseDOMEvent(browser, "load", true);
   setTabURL(tab, "about:blank");
+  yield browserLoad;
 
   loader.unload();
 };
 
 // Test that we find the right number of processes and that messaging between
 // them works and none of the streams cross
 exports["test process list"] = function*(assert) {
   let loader = new Loader(module);
@@ -531,13 +539,40 @@ exports["test cannot load in wrong loade
     assert.ok(!loaded, "Process couldn't load sdk/remote/parent.");
     assert.ok(/Cannot load sdk\/remote\/parent in a child loader/.test(message),
               "Should have seen the right exception.");
   }
 
   loader.unload();
 };
 
+exports["test send cpow"] = function*(assert) {
+  if (!isE10S) {
+    assert.pass("Skipping test in non-e10s mode");
+    return;
+  }
+
+  let window = getMostRecentBrowserWindow();
+
+  let tabs = getTabs(window);
+  assert.equal(tabs.length, 1, "Should have just the one tab to start with");
+  let tab = tabs[0];
+  let browser = getBrowserForTab(tab);
+
+  assert.ok(Cu.isCrossProcessWrapper(browser.contentWindow),
+            "Should have a CPOW for the browser content window");
+
+  let loader = new Loader(module);
+  let { processes } = yield waitForProcesses(loader);
+
+  processes.port.emitCPOW('sdk/test/cpow', ['foobar'], { window: browser.contentWindow });
+  let [process, arg, id] = yield promiseEvent(processes.port, 'sdk/test/cpow');
+
+  assert.ok(process.isRemote, "Response should come from the remote process");
+  assert.equal(arg, "foobar", "Argument should have passed through");
+  assert.equal(id, browser.outerWindowID, "Should have got the ID from the child");
+};
+
 after(exports, function*(name, assert) {
   yield cleanUI();
 });
 
 require('sdk/test/runner').runTestsFromModule(module);
--- a/addon-sdk/source/test/addons/e10s-remote/remote-module.js
+++ b/addon-sdk/source/test/addons/e10s-remote/remote-module.js
@@ -4,16 +4,17 @@
 
 const { when } = require('sdk/system/unload');
 const { process, frames } = require('sdk/remote/child');
 const { loaderID } = require('@loader/options');
 const { processID } = require('sdk/system/runtime');
 const system = require('sdk/system/events');
 const { Cu } = require('chrome');
 const { isChildLoader } = require('sdk/remote/core');
+const { getOuterId } = require('sdk/window/utils');
 
 function log(str) {
   console.log("remote[" + loaderID + "][" + processID + "]: " + str);
 }
 
 log("module loaded");
 
 process.port.emit('sdk/test/load');
@@ -117,8 +118,12 @@ frames.port.on('sdk/test/unregisterframe
 
 frames.port.on('sdk/test/registerframeevent', (frame) => {
   frame.addEventListener("Test:Event", listener, true);
 });
 
 frames.port.on('sdk/test/unregisterframeevent', (frame) => {
   frame.removeEventListener("Test:Event", listener, true);
 });
+
+process.port.on('sdk/test/cpow', (process, arg, cpows) => {
+  process.port.emit('sdk/test/cpow', arg, getOuterId(cpows.window));
+});
--- a/addon-sdk/source/test/addons/remote/main.js
+++ b/addon-sdk/source/test/addons/remote/main.js
@@ -2,16 +2,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const LOCAL_URI = "about:robots";
 const REMOTE_URI = "data:text/html;charset=utf-8,remote";
 
+const { Cu } = require('chrome');
 const { Loader } = require('sdk/test/loader');
 const { getTabs, openTab, closeTab, setTabURL, getBrowserForTab, getURI } = require('sdk/tabs/utils');
 const { getMostRecentBrowserWindow } = require('sdk/window/utils');
 const { cleanUI } = require("sdk/test/utils");
 const { setTimeout } = require("sdk/timers");
 const { promiseEvent, promiseDOMEvent, promiseEventOnItemAndContainer,
         waitForProcesses, getChildFrameCount, isE10S } = require("./utils");
 const { after } = require('sdk/test/utils');
@@ -41,52 +42,59 @@ exports["test process restart"] = functi
     return;
   }
 
   let window = getMostRecentBrowserWindow();
 
   let tabs = getTabs(window);
   assert.equal(tabs.length, 1, "Should have just the one tab to start with");
   let tab = tabs[0];
+  let browser = getBrowserForTab(tab);
 
   let loader = new Loader(module);
   let { processes, frames } = yield waitForProcesses(loader);
 
   let remoteProcess = Array.filter(processes, p => p.isRemote)[0];
   let localProcess = Array.filter(processes, p => !p.isRemote)[0];
   let remoteFrame = Array.filter(frames, f => f.process == remoteProcess)[0];
 
   // Switch the remote tab to a local URI which should kill the remote process
 
   let frameDetach = promiseEventOnItemAndContainer(assert, remoteFrame, frames, 'detach');
   let frameAttach = promiseTabFrameAttach(frames);
   let processDetach = promiseEventOnItemAndContainer(assert, remoteProcess, processes, 'detach');
+  let browserLoad = promiseDOMEvent(browser, "load", true);
   setTabURL(tab, LOCAL_URI);
   // The load should kill the remote frame
   yield frameDetach;
   // And create a new frame in the local process
   let [newFrame] = yield frameAttach;
   assert.equal(newFrame.process, localProcess, "New frame should be in the local process");
   // And kill the process
   yield processDetach;
+  yield browserLoad;
 
   frameDetach = promiseEventOnItemAndContainer(assert, newFrame, frames, 'detach');
   let processAttach = promiseEvent(processes, 'attach');
   frameAttach = promiseTabFrameAttach(frames);
+  browserLoad = promiseDOMEvent(browser, "load", true);
   setTabURL(tab, REMOTE_URI);
   // The load should kill the remote frame
   yield frameDetach;
   // And create a new remote process
   [remoteProcess] = yield processAttach;
   assert.ok(remoteProcess.isRemote, "Process should be remote");
   // And create a new frame in the remote process
   [newFrame] = yield frameAttach;
   assert.equal(newFrame.process, remoteProcess, "New frame should be in the remote process");
+  yield browserLoad;
 
+  browserLoad = promiseDOMEvent(browser, "load", true);
   setTabURL(tab, "about:blank");
+  yield browserLoad;
 
   loader.unload();
 };
 
 // Test that we find the right number of processes and that messaging between
 // them works and none of the streams cross
 exports["test process list"] = function*(assert) {
   let loader = new Loader(module);
@@ -531,13 +539,40 @@ exports["test cannot load in wrong loade
     assert.ok(!loaded, "Process couldn't load sdk/remote/parent.");
     assert.ok(/Cannot load sdk\/remote\/parent in a child loader/.test(message),
               "Should have seen the right exception.");
   }
 
   loader.unload();
 };
 
+exports["test send cpow"] = function*(assert) {
+  if (!isE10S) {
+    assert.pass("Skipping test in non-e10s mode");
+    return;
+  }
+
+  let window = getMostRecentBrowserWindow();
+
+  let tabs = getTabs(window);
+  assert.equal(tabs.length, 1, "Should have just the one tab to start with");
+  let tab = tabs[0];
+  let browser = getBrowserForTab(tab);
+
+  assert.ok(Cu.isCrossProcessWrapper(browser.contentWindow),
+            "Should have a CPOW for the browser content window");
+
+  let loader = new Loader(module);
+  let { processes } = yield waitForProcesses(loader);
+
+  processes.port.emitCPOW('sdk/test/cpow', ['foobar'], { window: browser.contentWindow });
+  let [process, arg, id] = yield promiseEvent(processes.port, 'sdk/test/cpow');
+
+  assert.ok(process.isRemote, "Response should come from the remote process");
+  assert.equal(arg, "foobar", "Argument should have passed through");
+  assert.equal(id, browser.outerWindowID, "Should have got the ID from the child");
+};
+
 after(exports, function*(name, assert) {
   yield cleanUI();
 });
 
 require('sdk/test/runner').runTestsFromModule(module);
--- a/addon-sdk/source/test/addons/remote/remote-module.js
+++ b/addon-sdk/source/test/addons/remote/remote-module.js
@@ -4,16 +4,17 @@
 
 const { when } = require('sdk/system/unload');
 const { process, frames } = require('sdk/remote/child');
 const { loaderID } = require('@loader/options');
 const { processID } = require('sdk/system/runtime');
 const system = require('sdk/system/events');
 const { Cu } = require('chrome');
 const { isChildLoader } = require('sdk/remote/core');
+const { getOuterId } = require('sdk/window/utils');
 
 function log(str) {
   console.log("remote[" + loaderID + "][" + processID + "]: " + str);
 }
 
 log("module loaded");
 
 process.port.emit('sdk/test/load');
@@ -117,8 +118,12 @@ frames.port.on('sdk/test/unregisterframe
 
 frames.port.on('sdk/test/registerframeevent', (frame) => {
   frame.addEventListener("Test:Event", listener, true);
 });
 
 frames.port.on('sdk/test/unregisterframeevent', (frame) => {
   frame.removeEventListener("Test:Event", listener, true);
 });
+
+process.port.on('sdk/test/cpow', (process, arg, cpows) => {
+  process.port.emit('sdk/test/cpow', arg, getOuterId(cpows.window));
+});
--- a/addon-sdk/source/test/test-clipboard.js
+++ b/addon-sdk/source/test/test-clipboard.js
@@ -15,16 +15,20 @@ const io = Cc["@mozilla.org/network/io-s
 
 const base64png = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYA" +
                   "AABzenr0AAAASUlEQVRYhe3O0QkAIAwD0eyqe3Q993AQ3cBSUKpygfsNTy" +
                   "N5ugbQpK0BAADgP0BRDWXWlwEAAAAAgPsA3rzDaAAAAHgPcGrpgAnzQ2FG" +
                   "bWRR9AAAAABJRU5ErkJggg%3D%3D";
 
 const { base64jpeg } = require("./fixtures");
 
+const { platform } = require("sdk/system");
+// For Windows, Mac and Linux, platform returns the following: winnt, darwin and linux.
+var isWindows = platform.toLowerCase().indexOf("win") == 0;
+
 const canvasHTML = "data:text/html," + encodeURIComponent(
   "<html>\
     <body>\
       <canvas width='32' height='32'></canvas>\
     </body>\
   </html>"
 );
 
@@ -94,29 +98,36 @@ exports["test With No Flavor"] = functio
   // Confirm we can still get the clipboard using the full flavor
   assert.equal(clip.get(fullFlavor), contents);
 };
 
 // Test the slightly less common case where we specify the flavor
 exports["test With Flavor"] = function(assert) {
   var contents = "<b>hello there</b>";
   var contentsText = "hello there";
+
+  // On windows, HTML clipboard includes extra data.
+  // The values are from widget/windows/nsDataObj.cpp.
+  var contentsWindowsHtml = "<html><body>\n<!--StartFragment-->" +
+                            contents +
+                            "<!--EndFragment-->\n</body>\n</html>";
+
   var flavor = "html";
   var fullFlavor = "text/html";
   var unicodeFlavor = "text";
   var unicodeFullFlavor = "text/unicode";
   var clip = require("sdk/clipboard");
 
   assert.ok(clip.set(contents, flavor));
 
   assert.equal(clip.currentFlavors[0], unicodeFlavor);
   assert.equal(clip.currentFlavors[1], flavor);
   assert.equal(clip.get(), contentsText);
-  assert.equal(clip.get(flavor), contents);
-  assert.equal(clip.get(fullFlavor), contents);
+  assert.equal(clip.get(flavor), isWindows ? contentsWindowsHtml : contents);
+  assert.equal(clip.get(fullFlavor), isWindows ? contentsWindowsHtml : contents);
   assert.equal(clip.get(unicodeFlavor), contentsText);
   assert.equal(clip.get(unicodeFullFlavor), contentsText);
 };
 
 // Test that the typical case still works when we specify the flavor to set
 exports["test With Redundant Flavor"] = function(assert) {
   var contents = "<b>hello there</b>";
   var flavor = "text";
--- a/addon-sdk/source/test/test-content-worker.js
+++ b/addon-sdk/source/test/test-content-worker.js
@@ -113,24 +113,25 @@ exports["test:sample"] = WorkerTest(
         });
       },
       contentScriptWhen: "ready",
       onMessage: function(msg) {
         assert.equal("bye!", msg);
         assert.equal(worker.url, window.location.href,
                          "worker.url still works");
         done();
+      },
+      onAttach: function() {
+        assert.equal(worker.url, window.location.href,
+                         "worker.url works");
+        assert.equal(worker.contentURL, window.location.href,
+                         "worker.contentURL works");
+        worker.postMessage("hi!");
       }
     });
-
-    assert.equal(worker.url, window.location.href,
-                     "worker.url works");
-    assert.equal(worker.contentURL, window.location.href,
-                     "worker.contentURL works");
-    worker.postMessage("hi!");
   }
 );
 
 exports["test:emit"] = WorkerTest(
   DEFAULT_CONTENT_URL,
   function(assert, browser, done) {
 
     let worker =  Worker({
@@ -836,20 +837,19 @@ exports["test:worker events"] = WorkerTe
   function (assert, browser, done) {
     let window = browser.contentWindow;
     let events = [];
     let worker = Worker({
       window: window,
       contentScript: 'new ' + function WorkerScope() {
         self.postMessage('start');
       },
-      onAttach: win => {
+      onAttach: () => {
         events.push('attach');
         assert.pass('attach event called when attached');
-        assert.equal(window, win, 'attach event passes in attached window');
       },
       onError: err => {
         assert.equal(err.message, 'Custom',
           'Error passed into error event');
         worker.detach();
       },
       onMessage: msg => {
         assert.pass('`onMessage` handles postMessage')
@@ -871,23 +871,26 @@ exports["test:onDetach in contentScript 
   function(assert, browser, done) {
     let worker = Worker({
       window: browser.contentWindow,
       contentScript: 'new ' + function WorkerScope() {
         self.port.on('detach', function(reason) {
           window.location.hash += '!' + reason;
         })
       },
+
+      onAttach: function() {
+        browser.contentWindow.addEventListener('hashchange', _ => {
+          assert.equal(browser.contentWindow.location.hash, '#detach!',
+                       "location.href is as expected");
+          done();
+        })
+        worker.destroy();
+      }
     });
-    browser.contentWindow.addEventListener('hashchange', _ => {
-      assert.equal(browser.contentWindow.location.hash, '#detach!',
-                   "location.href is as expected");
-      done();
-    })
-    worker.destroy();
   }
 );
 
 exports["test:onDetach in contentScript on unload"] = WorkerTest(
   "data:text/html;charset=utf-8,foo#detach",
   function(assert, browser, done) {
     let { loader } = LoaderWithHookedConsole(module);
     let worker = loader.require("sdk/content/worker").Worker({
--- a/addon-sdk/source/test/test-file.js
+++ b/addon-sdk/source/test/test-file.js
@@ -60,22 +60,19 @@ exports.testBasename = function(assert) 
 
   path = file.join(path, "bar");
   assert.equal(file.basename(path), "bar",
                    "basename should work on paths with multiple components");
 };
 
 exports.testList = function(assert) {
   let list = file.list(profilePath);
-  let found = [ true for (name of list)
-                    if (name === fileNameInProfile) ];
+  let found = list.filter(name => name === fileNameInProfile);
 
-  if (found.length > 1)
-    assert.fail("a dir can't contain two files of the same name!");
-  assert.equal(found[0], true, "file.list() should work");
+  assert.equal(found.length, 1, "file.list() should work");
 
   assert.throws(function() {
     file.list(filePathInProfile);
   }, ERRORS.NOT_A_DIRECTORY, "file.list() on non-dir should raise error");
 
   assert.throws(function() {
     file.list(file.join(dirPathInProfile, "does-not-exist"));
   }, ERRORS.FILE_NOT_FOUND, "file.list() on nonexistent should raise error");
--- a/addon-sdk/source/test/test-sandbox.js
+++ b/addon-sdk/source/test/test-sandbox.js
@@ -112,27 +112,29 @@ exports['test load script with data: URL
   let code = "var chars = 'გამარჯობა';";
   let fixture = sandbox();
   load(fixture, "data:," + encodeURIComponent(code));
 
   assert.equal(fixture.chars, 'გამარჯობა', 'complex chars were loaded correctly');
 };
 
 exports['test metadata']  = function(assert) {
+  let self = require('sdk/self');
+
   let dbg = new Debugger();
   dbg.onNewGlobalObject = function(global) {
     let metadata = Cu.getSandboxMetadata(global.unsafeDereference());
     assert.ok(metadata, 'this global has attached metadata');
     assert.equal(metadata.addonID, self.id, 'addon ID is set');
 
     dbg.onNewGlobalObject = undefined;
   }
 
   let fixture = sandbox();
-  let self = require('sdk/self');
+  assert.equal(dbg.onNewGlobalObject, undefined, 'Should have reset the handler');
 }
 
 exports['test nuke sandbox'] = function(assert) {
 
   let fixture = sandbox('http://example.com');
   fixture.foo = 'foo';
 
   let ref = evaluate(fixture, 'let a = {bar: "bar"}; a');
--- a/b2g/app/b2g.js
+++ b/b2g/app/b2g.js
@@ -339,20 +339,16 @@ pref("image.mem.allow_locking_in_content
 // Almost everything that was factored into 'max_decoded_image_kb' is now stored
 // in the surface cache.  1/8 of main memory is 32MB on a 256MB device, which is
 // about the same as the old 'max_decoded_image_kb'.
 pref("image.mem.surfacecache.max_size_kb", 131072);  // 128MB
 pref("image.mem.surfacecache.size_factor", 8);  // 1/8 of main memory
 pref("image.mem.surfacecache.discard_factor", 2);  // Discard 1/2 of the surface cache at a time.
 pref("image.mem.surfacecache.min_expiration_ms", 86400000); // 24h, we rely on the out of memory hook
 
-// XXX this isn't a good check for "are touch events supported", but
-// we don't really have a better one at the moment.
-// enable touch events interfaces
-pref("dom.w3c_touch_events.enabled", 1);
 pref("dom.w3c_touch_events.safetyX", 0); // escape borders in units of 1/240"
 pref("dom.w3c_touch_events.safetyY", 120); // escape borders in units of 1/240"
 
 #ifdef MOZ_SAFE_BROWSING
 pref("browser.safebrowsing.enabled", true);
 // Prevent loading of pages identified as malware
 pref("browser.safebrowsing.malware.enabled", true);
 pref("browser.safebrowsing.downloads.enabled", true);
@@ -527,16 +523,19 @@ pref("dom.mozPay.enabled", true);
 // supposed to enable this REPEATING_PRECISE_CAN_SKIP behavior.  The
 // secondary bug isn't really worth investigating since it's obseleted
 // by bug 710563.
 pref("layout.frame_rate.precise", true);
 
 // Handle hardware buttons in the b2g chrome package
 pref("b2g.keys.menu.enabled", true);
 
+// Display simulator software buttons
+pref("b2g.software-buttons", false);
+
 // Screen timeout in seconds
 pref("power.screen.timeout", 60);
 
 pref("full-screen-api.enabled", true);
 
 #ifndef MOZ_WIDGET_GONK
 // If we're not actually on physical hardware, don't make the top level widget
 // fullscreen when transitioning to fullscreen. This means in emulated
--- a/b2g/branding/browserhtml/content/jar.mn
+++ b/b2g/branding/browserhtml/content/jar.mn
@@ -1,10 +1,10 @@
 # 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/.
 
 chrome.jar:
-% content branding %content/branding/
+% content branding %content/branding/ contentaccessible=yes
   content/branding/about.png                     (about.png)
   content/branding/logoWordmark.png              (logoWordmark.png)
   content/branding/logo.png                      (logo.png)
   content/branding/favicon32.png                 (favicon32.png)
--- a/b2g/branding/horizon/content/jar.mn
+++ b/b2g/branding/horizon/content/jar.mn
@@ -1,10 +1,10 @@
 # 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/.
 
 chrome.jar:
-% content branding %content/branding/
+% content branding %content/branding/ contentaccessible=yes
   content/branding/about.png                     (about.png)
   content/branding/logoWordmark.png              (logoWordmark.png)
   content/branding/logo.png                      (logo.png)
   content/branding/favicon32.png                 (favicon32.png)
--- a/b2g/branding/official/content/jar.mn
+++ b/b2g/branding/official/content/jar.mn
@@ -1,10 +1,10 @@
 # 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/.
 
 chrome.jar:
-% content branding %content/branding/
+% content branding %content/branding/ contentaccessible=yes
   content/branding/about.png                     (about.png)
   content/branding/logoWordmark.png              (logoWordmark.png)
   content/branding/logo.png                      (logo.png)
   content/branding/favicon32.png                 (favicon32.png)
--- a/b2g/branding/unofficial/content/jar.mn
+++ b/b2g/branding/unofficial/content/jar.mn
@@ -1,10 +1,10 @@
 # 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/.
 
 chrome.jar:
-% content branding %content/branding/
+% content branding %content/branding/ contentaccessible=yes
   content/branding/about.png                     (about.png)
   content/branding/logoWordmark.png              (logoWordmark.png)
   content/branding/logo.png                      (logo.png)
   content/branding/favicon32.png                 (favicon32.png)
--- a/b2g/chrome/content/desktop.js
+++ b/b2g/chrome/content/desktop.js
@@ -10,38 +10,48 @@ var isMulet = "ResponsiveUI" in browserW
 function enableTouch() {
   let require = Cu.import('resource://devtools/shared/Loader.jsm', {})
                   .devtools.require;
   let { TouchEventSimulator } = require('devtools/shared/touch/simulator');
   let touchEventSimulator = new TouchEventSimulator(shell.contentBrowser);
   touchEventSimulator.start();
 }
 
+// Some additional buttons are displayed on simulators to fake hardware buttons.
 function setupButtons() {
-  let homeButton = document.getElementById('home-button');
-  if (!homeButton) {
-    // The toolbar only exists in b2g desktop build with
-    // FXOS_SIMULATOR turned on.
-    return;
-  }
+  let link = document.createElement('link');
+  link.type = 'text/css';
+  link.rel = 'stylesheet';
+  link.href = 'chrome://b2g/content/desktop.css';
+  document.head.appendChild(link);
+
+  let footer = document.createElement('footer');
+  footer.id = 'controls';
+  document.body.appendChild(footer);
+  let homeButton = document.createElement('button');
+  homeButton.id = 'home-button';
+  footer.appendChild(homeButton);
+  let rotateButton = document.createElement('button');
+  rotateButton.id = 'rotate-button';
+  footer.appendChild(rotateButton);
+
   homeButton.addEventListener('mousedown', function() {
     let window = shell.contentBrowser.contentWindow;
     let e = new window.KeyboardEvent('keydown', {key: 'Home'});
     window.dispatchEvent(e);
     homeButton.classList.add('active');
   });
   homeButton.addEventListener('mouseup', function() {
     let window = shell.contentBrowser.contentWindow;
     let e = new window.KeyboardEvent('keyup', {key: 'Home'});
     window.dispatchEvent(e);
     homeButton.classList.remove('active');
   });
 
   Cu.import("resource://gre/modules/GlobalSimulatorScreen.jsm");
-  let rotateButton = document.getElementById('rotate-button');
   rotateButton.addEventListener('mousedown', function() {
     rotateButton.classList.add('active');
   });
   rotateButton.addEventListener('mouseup', function() {
     GlobalSimulatorScreen.flipScreen();
     rotateButton.classList.remove('active');
   });
 }
@@ -160,17 +170,19 @@ function openDevtools() {
   gDevTools.showToolbox(target);
 }
 
 window.addEventListener('ContentStart', function() {
   // On Firefox Mulet, touch events are enabled within the responsive mode
   if (!isMulet) {
     enableTouch();
   }
-  setupButtons();
+  if (Services.prefs.getBoolPref('b2g.software-buttons')) {
+    setupButtons();
+  }
   checkDebuggerPort();
   setupStorage();
   // On Firefox mulet, we automagically enable the responsive mode
   // and show the devtools
   if (isMulet) {
     initResponsiveDesign(browserWindow);
     openDevtools();
   }
--- a/b2g/chrome/content/devtools/hud.js
+++ b/b2g/chrome/content/devtools/hud.js
@@ -441,16 +441,17 @@ var consoleWatcher = {
     'Mixed Content Message',
     'CSP',
     'Invalid HSTS Headers',
     'Invalid HPKP Headers',
     'Insecure Password Field',
     'SSL',
     'CORS'
   ],
+  _reflowThreshold: 0,
 
   init(client) {
     this._client = client;
     this.consoleListener = this.consoleListener.bind(this);
 
     let watching = this._watching;
 
     for (let key in watching) {
@@ -463,16 +464,20 @@ var consoleWatcher = {
 
         // If unwatched, remove any existing widgets for that metric.
         for (let target of this._targets.values()) {
           target.clear({name: metric});
         }
       });
     }
 
+    SettingsListener.observe('hud.reflows.duration', this._reflowThreshold, threshold => {
+      this._reflowThreshold = threshold;
+    });
+
     client.addListener('logMessage', this.consoleListener);
     client.addListener('pageError', this.consoleListener);
     client.addListener('consoleAPICall', this.consoleListener);
     client.addListener('reflowActivity', this.consoleListener);
   },
 
   trackTarget(target) {
     target.register('reflows');
@@ -567,16 +572,22 @@ var consoleWatcher = {
         break;
 
       case 'reflowActivity':
         metric.name = 'reflows';
 
         let {start, end, sourceURL, interruptible} = packet;
         metric.interruptible = interruptible;
         let duration = Math.round((end - start) * 100) / 100;
+
+        // Record the reflow if the duration exceeds the threshold.
+        if (duration < this._reflowThreshold) {
+          return;
+        }
+
         output += 'Reflow: ' + duration + 'ms';
         if (sourceURL) {
           output += ' ' + this.formatSourceURL(packet);
         }
 
         // Telemetry also records reflow duration.
         target._logHistogram({
           name: 'reflow_duration',
--- a/b2g/chrome/content/shell.html
+++ b/b2g/chrome/content/shell.html
@@ -13,19 +13,16 @@
       macanimationtype="document"
       fullscreenbutton="true"
       chromemargin="0,0,0,0"
 #endif
       >
 
 <head>
   <link rel="stylesheet" href="shell.css" type="text/css">
-#ifdef FXOS_SIMULATOR
-  <link rel="stylesheet" href="desktop.css" type="text/css">
-#endif
   <script type="text/javascript">
   <!-- Add raptor performance marker -->
   window.performance.mark('gecko-shell-html-load');
   </script>
   <script type="application/javascript;version=1.8"
           src="chrome://b2g/content/settings.js"> </script>
   <script type="application/javascript;version=1.8"
           src="chrome://b2g/content/shell.js"> </script>
@@ -47,27 +44,16 @@
   <script type="application/javascript;version=1.8"
           src="chrome://b2g/content/devtools/adb.js"> </script>
 #endif
   <!-- manages DevTools server state -->
   <script type="application/javascript;version=1.8"
           src="chrome://b2g/content/devtools/debugger.js"> </script>
 </head>
   <body id="container">
-#ifdef FXOS_SIMULATOR
-#ifndef MOZ_MULET
-    <!--
-     Some additional buttons are displayed on desktop to fake hardware buttons.
-    -->
-    <footer id="controls">
-      <button id="home-button"></button>
-      <button id="rotate-button"></button>
-    </footer>
-#endif
-#endif
 #ifndef MOZ_GRAPHENE
 #ifdef MOZ_WIDGET_COCOA
     <!--
      If the document is empty at startup, we don't display the window
      at all on Mac OS...
     -->
     <h1 id="placeholder">wtf mac os!</h1>
 #endif
--- a/b2g/chrome/jar.mn
+++ b/b2g/chrome/jar.mn
@@ -1,39 +1,37 @@
 #filter substitution
 # 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/.
 
 
 chrome.jar:
-% content branding %content/branding/
+% content branding %content/branding/ contentaccessible=yes
 % content b2g %content/
 
   content/arrow.svg                     (content/arrow.svg)
 * content/settings.js                   (content/settings.js)
 * content/shell.html                    (content/shell.html)
 * content/shell.js                      (content/shell.js)
   content/shell_remote.html             (content/shell_remote.html)
   content/shell_remote.js               (content/shell_remote.js)
 * content/shell.css                     (content/shell.css)
   content/blank.html                    (content/blank.html)
   content/blank.css                     (content/blank.css)
 #ifdef MOZ_WIDGET_GONK
   content/devtools/adb.js               (content/devtools/adb.js)
 #endif
 * content/devtools/debugger.js          (content/devtools/debugger.js)
   content/devtools/hud.js               (content/devtools/hud.js)
-#ifdef FXOS_SIMULATOR
+#ifndef MOZ_WIDGET_GONK
   content/desktop.css                   (content/desktop.css)
   content/images/desktop/home-black.png (content/images/desktop/home-black.png)
   content/images/desktop/home-white.png (content/images/desktop/home-white.png)
   content/images/desktop/rotate.png     (content/images/desktop/rotate.png)
-#endif
-#ifndef MOZ_WIDGET_GONK
   content/desktop.js                    (content/desktop.js)
   content/screen.js                     (content/screen.js)
   content/runapp.js                     (content/runapp.js)
 #endif
 * content/content.css                   (content/content.css)
   content/touchcontrols.css             (content/touchcontrols.css)
 
   content/identity.js                   (content/identity.js)
--- a/b2g/components/AboutServiceWorkers.jsm
+++ b/b2g/components/AboutServiceWorkers.jsm
@@ -30,17 +30,17 @@ function serializeServiceWorkerInfo(aSer
   let result = {};
 
   Object.keys(aServiceWorkerInfo).forEach(property => {
     if (typeof aServiceWorkerInfo[property] == "function") {
       return;
     }
     if (property === "principal") {
       result.principal = {
-        origin: aServiceWorkerInfo.principal.origin,
+        origin: aServiceWorkerInfo.principal.originNoSuffix,
         originAttributes: aServiceWorkerInfo.principal.originAttributes
       };
       return;
     }
     result[property] = aServiceWorkerInfo[property];
   });
 
   return result;
--- a/b2g/config/aries/sources.xml
+++ b/b2g/config/aries/sources.xml
@@ -10,26 +10,26 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="cba7e4b86361af31b153cfebaf99900e0b860f7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="702773bee0b70e479ccebe5e061f571e977bc376"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
-  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9a58f2e395da17c252f61f28900b5b09aeb813bd"/>
+  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="94bbf7890326d37f03fd2a6822b6618b08bec8e2"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5de6856fad82857028f9f059f50680a9bea5b75c"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="ebdad82e61c16772f6cd47e9f11936bf6ebe9aa0"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="8b880805d454664b3eed11d0f053cdeafa1ff06e"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" revision="a1e239a0bb5cd1d69680bf1075883aa9a7bf2429"/>
   <project groups="linux,x86" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" revision="c7931763d41be602407ed9d71e2c0292c6597e00"/>
   <project groups="linux,x86" name="platform/prebuilts/python/linux-x86/2.7.5" path="prebuilts/python/linux-x86/2.7.5" revision="a32003194f707f66a2d8cdb913ed1869f1926c5d"/>
@@ -105,17 +105,17 @@
   <project name="platform/frameworks/wilhelm" path="frameworks/wilhelm" revision="f0c3b4edf597c40aae4ea311575f39c8bcf203df"/>
   <project name="platform/libcore" path="libcore" revision="baf7d8068dd501cfa338d3a8b1b87216d6ce0571"/>
   <project name="platform/libnativehelper" path="libnativehelper" revision="50c4430e32849530ced32680fd6ee98963b3f7ac"/>
   <project name="platform/ndk" path="ndk" revision="e58ef003be4306bb53a8c11331146f39e4eab31f"/>
   <project name="platform_prebuilts_misc" path="prebuilts/misc" remote="b2g" revision="c739cffa6394c06e099ea48879a20341b6163338"/>
   <project name="platform/prebuilts/ndk" path="prebuilts/ndk" revision="c792f0bd9fff7aea2887c60bbb3a9bbdb534ffa3"/>
   <project name="platform/prebuilts/sdk" path="prebuilts/sdk" revision="69d524e80cdf3981006627c65ac85f3a871238a3"/>
   <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="5a48c04c4bb5f079bc757e29864a42427378e051"/>
-  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="07a49d1f7a7a0a1e7d70fef353c2700434ffdc5c"/>
+  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="bdb3469b9302bb22e7df8912e582feefbd05d55f"/>
   <project name="platform/system/extras" path="system/extras" revision="576f57b6510de59c08568b53c0fb60588be8689e"/>
   <project name="platform_system_libfdio" path="system/libfdio" remote="b2g" revision="34adfb400e031f3dd3353d92413572db5e3a7376"/>
   <project name="platform/system/netd" path="system/netd" revision="a6531f7befb49b1c81bc0de7e51c5482b308e1c5"/>
   <project name="platform/system/security" path="system/security" revision="ee8068b9e7bfb2770635062fc9c2035be2142bd8"/>
   <project name="platform/system/vold" path="system/vold" revision="42fa2a0f14f965970a4b629a176bbd2666edf017"/>
   <project name="platform/external/curl" path="external/curl" revision="e68addd988448959ea8157c5de637346b4180c33"/>
   <project name="platform/external/icu4c" path="external/icu4c" revision="d3ec7428eb276db43b7ed0544e09344a6014806c"/>
   <project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="76c4bf4bc430a1b8317f2f21ef735867733e50cc"/>
@@ -127,17 +127,17 @@
   <project name="device/qcom/common" path="device/qcom/common" revision="2501e5940ba69ece7654ff85611c76ae5bda299c"/>
   <project name="codeaurora_kernel_msm" path="kernel" remote="b2g" revision="d620691cad7aee780018e98159ff03bf99840317"/>
   <project name="init_sh" path="external/init_sh" remote="b2g" revision="feb58d2b397e45ead9b904d5c4d9255df408db56"/>
   <project name="platform_bionic" path="bionic" remote="b2g" revision="3e85c4683c121530c1c3a48c696a569bf5f587e2"/>
   <project name="platform_external_bluetooth_bluedroid" path="external/bluetooth/bluedroid" remote="b2g" revision="70f536bd97d901b96b94669ae1aa2fd0fb54b258"/>
   <project name="platform/external/libnfc-nci" path="external/libnfc-nci" revision="0a01977f34d6e86fe23d6c0ec75e96ba988bbebb"/>
   <project name="platform_external_libnfc-pn547" path="external/libnfc-pn547" remote="b2g" revision="5bb999b84b8adc14f6bea004d523ba258dea8188"/>
   <project name="platform/external/wpa_supplicant_8" path="external/wpa_supplicant_8" revision="5b71e40213f650459e95d35b6f14af7e88d8ab62"/>
-  <project name="platform_frameworks_av" path="frameworks/av" remote="b2g" revision="a920312eb6299b6cc11f7136254c4b0ba7a663be"/>
+  <project name="platform_frameworks_av" path="frameworks/av" remote="b2g" revision="5d5bcc83d6c32874701f0df78ed1119e006bd10a"/>
   <project name="platform/frameworks/base" path="frameworks/base" revision="da8e6bc53c8bc669da0bb627904d08aa293f2497"/>
   <project name="platform/frameworks/native" path="frameworks/native" revision="a46a9f1ac0ed5662d614c277cbb14eb3f332f365"/>
   <project name="platform/hardware/libhardware" path="hardware/libhardware" revision="7196881a0e9dd7bfbbcf0af64c8064e70f0fa094"/>
   <project name="platform/hardware/broadcom/wlan" path="hardware/broadcom/wlan" revision="15a9b66de9b7d84c7ea63df3a834f095bca9e493"/>
   <project name="platform/hardware/qcom/audio" path="hardware/qcom/audio" revision="8d7676dfb68ee0cd069affedd5d1e97316a184ba"/>
   <project name="platform/hardware/qcom/camera" path="hardware/qcom/camera" revision="2a1ded216a91bf62a72b1640cf01ab4998f37028"/>
   <project name="hardware_qcom_display" path="hardware/qcom/display" remote="b2g" revision="4a83e04c3fecffbcab75cd59bad2ae5f342778b7"/>
   <project name="platform/hardware/qcom/gps" path="hardware/qcom/gps" revision="9883ea57b0668d8f60dba025d4522dfa69a1fbfa"/>
--- a/b2g/config/dolphin/sources.xml
+++ b/b2g/config/dolphin/sources.xml
@@ -10,26 +10,26 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="cba7e4b86361af31b153cfebaf99900e0b860f7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="702773bee0b70e479ccebe5e061f571e977bc376"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
-  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9a58f2e395da17c252f61f28900b5b09aeb813bd"/>
+  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="94bbf7890326d37f03fd2a6822b6618b08bec8e2"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5de6856fad82857028f9f059f50680a9bea5b75c"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="ebdad82e61c16772f6cd47e9f11936bf6ebe9aa0"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="8b880805d454664b3eed11d0f053cdeafa1ff06e"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" revision="a1e239a0bb5cd1d69680bf1075883aa9a7bf2429"/>
   <project groups="linux,x86" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" revision="c7931763d41be602407ed9d71e2c0292c6597e00"/>
   <project groups="linux,x86" name="platform/prebuilts/python/linux-x86/2.7.5" path="prebuilts/python/linux-x86/2.7.5" revision="83760d213fb3bec7b4117d266fcfbf6fe2ba14ab"/>
@@ -111,17 +111,17 @@
   <project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="68b0c269fd1889f47ecfb9119c05281e9b6db0af"/>
   <project name="platform/libcore" path="libcore" revision="e195beab082c09217318fc19250caeaf4c1bd800"/>
   <project name="platform/libnativehelper" path="libnativehelper" revision="feeb36c2bd4adfe285f98f5de92e0f3771b2c115"/>
   <project name="platform/ndk" path="ndk" revision="e58ef003be4306bb53a8c11331146f39e4eab31f"/>
   <project name="platform_prebuilts_misc" path="prebuilts/misc" remote="b2g" revision="c739cffa6394c06e099ea48879a20341b6163338"/>
   <project name="platform/prebuilts/ndk" path="prebuilts/ndk" revision="c792f0bd9fff7aea2887c60bbb3a9bbdb534ffa3"/>
   <project name="platform/prebuilts/sdk" path="prebuilts/sdk" revision="cfcef469537869947abb9aa1d656774cc2678d4c"/>
   <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="5a48c04c4bb5f079bc757e29864a42427378e051"/>
-  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="07a49d1f7a7a0a1e7d70fef353c2700434ffdc5c"/>
+  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="bdb3469b9302bb22e7df8912e582feefbd05d55f"/>
   <project name="platform/system/extras" path="system/extras" revision="10e78a05252b3de785f88c2d0b9ea8a428009c50"/>
   <project name="platform/system/media" path="system/media" revision="188b3e51e0a2ce1e16dc8067edef7be3d2365ad9"/>
   <project name="platform_system_libfdio" path="system/libfdio" remote="b2g" revision="34adfb400e031f3dd3353d92413572db5e3a7376"/>
   <project name="platform/system/netd" path="system/netd" revision="3ae56364946d4a5bf5a5f83f12f9a45a30398e33"/>
   <project name="platform/system/security" path="system/security" revision="ee8068b9e7bfb2770635062fc9c2035be2142bd8"/>
   <project name="platform/system/vold" path="system/vold" revision="fe12a9e2268da653d1cd4c39ec89a42211d22f25"/>
   <!--original fetch url was http://sprdsource.spreadtrum.com:8085/b2g/android-->
   <remote fetch="https://git.mozilla.org/external/sprd-aosp" name="sprd-aosp"/>
--- a/b2g/config/emulator-ics/sources.xml
+++ b/b2g/config/emulator-ics/sources.xml
@@ -1,111 +1,112 @@
 <?xml version="1.0" ?><manifest>
   <!--original fetch url was https://android.googlesource.com/-->
   <remote fetch="https://git.mozilla.org/external/aosp" name="aosp"/>
+  <!--original fetch url was git://github.com/apitrace/-->
+  <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
+  <!--original fetch url was git://github.com/mozilla-b2g/-->
+  <remote fetch="https://git.mozilla.org/b2g" name="b2g"/>
+  <!--original fetch url was https://git.mozilla.org/b2g-->
+  <remote fetch="https://git.mozilla.org/b2g" name="b2gmozilla"/>
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
-  <!--original fetch url was https://git.mozilla.org/b2g-->
-  <remote fetch="https://git.mozilla.org/b2g" name="b2gmozilla"/>
-  <!--original fetch url was git://github.com/mozilla-b2g/-->
-  <remote fetch="https://git.mozilla.org/b2g" name="b2g"/>
   <!--original fetch url was git://github.com/mozilla/-->
   <remote fetch="https://git.mozilla.org/b2g" name="mozilla"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
-  <!--original fetch url was git://github.com/apitrace/-->
-  <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
-  <!-- Gonk specific things and forks -->
+  <!-- Gecko and Gaia -->
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="702773bee0b70e479ccebe5e061f571e977bc376"/>
+  <!-- Gonk-specific things and forks -->
+  <project name="platform_bionic" path="bionic" remote="b2g" revision="e2b3733ba3fa5e3f404e983d2e4142b1f6b1b846"/>
   <project name="platform_build" path="build" remote="b2g" revision="1b0db93fb6b870b03467aff50d6419771ba0d88c">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="cba7e4b86361af31b153cfebaf99900e0b860f7b"/>
-  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9a58f2e395da17c252f61f28900b5b09aeb813bd"/>
-  <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
+  <project name="android-development" path="development" remote="b2g" revision="2bdf22305b523af644e1891b4ddfd9229336d0ce"/>
+  <project name="platform_external_apriori" path="external/apriori" remote="b2g" revision="11816ad0406744f963537b23d68ed9c2afb412bd"/>
+  <project name="platform_external_elfcopy" path="external/elfcopy" remote="b2g" revision="62c1bed1c4505369cac2e72fbe30452a598fb690"/>
+  <project name="platform_external_elfutils" path="external/elfutils" remote="b2g" revision="72940dec691fa3255e13df01f8c53b620e446066"/>
+  <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
+  <project name="platform_external_opensans" path="external/opensans" remote="b2g" revision="b5b4c226ca1d71e936153cf679dda6d3d60e2354"/>
+  <project name="screencap-gonk" path="external/screencap-gonk" remote="b2g" revision="e6403c71e9eca8cb943739d5a0a192deac60fc51"/>
+  <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="c72c9278ddc2f442d193474993d36e7f2cfb08c4"/>
+  <project name="platform_frameworks_base" path="frameworks/base" remote="b2g" revision="6afc63abe52776ae6a1d32a2d927e630a743a86a"/>
+  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
+  <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="cb4604d5a578efd027277059ce3e0f6e3af59bd1"/>
-  <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="c72c9278ddc2f442d193474993d36e7f2cfb08c4"/>
-  <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
-  <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
+  <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
+  <project name="android-sdk" path="sdk" remote="b2g" revision="4f46930827957afbce500a4a920755a218bf3155"/>
+  <project name="darwinstreamingserver" path="system/darwinstreamingserver" remote="b2g" revision="cf85968c7f85e0ec36e72c87ceb4837a943b8af6"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
-  <project name="platform_bionic" path="bionic" remote="b2g" revision="e2b3733ba3fa5e3f404e983d2e4142b1f6b1b846"/>
   <project name="platform/bootable/recovery" path="bootable/recovery" revision="425f8b5fadf5889834c5acd27d23c9e0b2129c28"/>
   <project name="device/common" path="device/common" revision="42b808b7e93d0619286ae8e59110b176b7732389"/>
   <project name="device/sample" path="device/sample" revision="237bd668d0f114d801a8d6455ef5e02cc3577587"/>
-  <project name="platform_external_apriori" path="external/apriori" remote="b2g" revision="11816ad0406744f963537b23d68ed9c2afb412bd"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <project name="platform/external/bluetooth/bluez" path="external/bluetooth/bluez" revision="52a1a862a8bac319652b8f82d9541ba40bfa45ce"/>
   <project name="platform/external/bluetooth/glib" path="external/bluetooth/glib" revision="0febbc94a1c40c0227958b7f27764145ec6297bc"/>
   <project name="platform/external/bluetooth/hcidump" path="external/bluetooth/hcidump" revision="03c410e4f80e73d2650b2d6973a11984d096100e"/>
   <project name="platform/external/bsdiff" path="external/bsdiff" revision="85a68103754b1e5473dca7becd76834848c77c35"/>
   <project name="platform/external/bzip2" path="external/bzip2" revision="960142b2e6a4269517467d44e4e953549ff56c38"/>
   <project name="platform/external/dbus" path="external/dbus" revision="07274c4eed41f20d79265f049710b5bf08a3ef20"/>
   <project name="platform/external/dhcpcd" path="external/dhcpcd" revision="c543c0f363dee48a80ef17cff1d5b98fd426b01a"/>
   <project name="platform/external/dnsmasq" path="external/dnsmasq" revision="4e6e5ea3872facb3ad2d84784c108865cc8d536d"/>
-  <project name="platform_external_elfcopy" path="external/elfcopy" remote="b2g" revision="62c1bed1c4505369cac2e72fbe30452a598fb690"/>
-  <project name="platform_external_elfutils" path="external/elfutils" remote="b2g" revision="72940dec691fa3255e13df01f8c53b620e446066"/>
   <project name="platform/external/expat" path="external/expat" revision="728203a4d1c40de1a5fa5dcfa68057faaf3aac50"/>
   <project name="platform/external/fdlibm" path="external/fdlibm" revision="6d128260b94c366d4066c8452e6a8d23533db244"/>
   <project name="platform/external/flac" path="external/flac" revision="e3b0a1fcadcfd1cfd2ebe217ada8ae12ceb3e292"/>
   <project name="platform/external/freetype" path="external/freetype" revision="15321e16a085b9b5c85cf029aee86bf57b2e65c1"/>
   <project name="platform/external/giflib" path="external/giflib" revision="6dbee1b36e184a0d39314254924a61837bd1ed3a"/>
   <project name="platform/external/gtest" path="external/gtest" revision="8c212ebe53bb2baab3575f03069016f1fb11e449"/>
   <project name="platform/external/harfbuzz" path="external/harfbuzz" revision="6b66309486b04d2107ab745a48d37c659da468fd"/>
   <!-- icu4c is missing the default tag in caf, that's the *only* reason for the hardcode -->
   <project name="platform/external/icu4c" path="external/icu4c" revision="0fa67b93b831c6636ca18b152a1b1b14cc99b034"/>
+  <project name="platform/external/iproute2" path="external/iproute2" revision="c66c5716d5335e450f7a7b71ccc6a604fb2f41d2"/>
   <project name="platform/external/iptables" path="external/iptables" revision="32e954f4bcb000ce8f3d8be13bce435eef0cb725"/>
   <project name="platform/external/jpeg" path="external/jpeg" revision="3d70825f75a11a0e625c7be4f5889571e7509456"/>
   <project name="platform/external/libgsm" path="external/libgsm" revision="45b9af864cff193c98605d3fb8fb88d01e209e4a"/>
   <project name="platform/external/liblzf" path="external/liblzf" revision="e214a332b5dbb70e9ab5f37ad6e8fbe05a5759aa"/>
   <project name="platform/external/libnfc-nxp" path="external/libnfc-nxp" revision="46f667ba6c2fd83e4b419ccb16934ded55625b1d"/>
   <project name="platform/external/libnl-headers" path="external/libnl-headers" revision="dedb7df404eb8ca534c12aa47401f42b075d43f6"/>
   <project name="platform/external/libpng" path="external/libpng" revision="b994ba2e3e54734c34f624926e5fbfbca5735cde"/>
   <project name="platform/external/libvpx" path="external/libvpx" revision="7513a8f86d594184f9ac6250289d22817fe5d740"/>
   <project name="platform/external/mksh" path="external/mksh" revision="2aa9dc166c783c3afbaa90dd8b5b334031c4ad4d"/>
-  <project name="platform_external_opensans" path="external/opensans" remote="b2g" revision="b5b4c226ca1d71e936153cf679dda6d3d60e2354"/>
   <project name="platform/external/openssl" path="external/openssl" revision="95c40b11e6d98ad944d64c38e30693ac025e2c88"/>
   <project name="platform/external/protobuf" path="external/protobuf" revision="046e97ace354aa350845465635e4816fb27c9994"/>
   <project name="platform/external/safe-iop" path="external/safe-iop" revision="6282e9cd4c1eb3dc16bfb3592eff58fb6bd13022"/>
-  <project name="screencap-gonk" path="external/screencap-gonk" remote="b2g" revision="e6403c71e9eca8cb943739d5a0a192deac60fc51"/>
   <project name="platform/external/skia" path="external/skia" revision="8c1c7cfacd82a174c65fcbf839d7037e3692aee8"/>
   <project name="platform/external/sonivox" path="external/sonivox" revision="7839a53c7c252fc5f8b1ab685a00cfcf0c7d0c39"/>
   <project name="platform/external/speex" path="external/speex" revision="863479d6859d3cae16e76db5f97ea3e35b7f2bd8"/>
   <project name="platform/external/sqlite" path="external/sqlite" revision="9acb3e17217c007a4469565ab01cf037d01ea090"/>
   <project name="platform/external/stlport" path="external/stlport" revision="a069b0806a337f9e1f335757d771d59879979434"/>
   <project name="platform/external/strace" path="external/strace" revision="89824cc5029c90f44fab65dfd27f1b516dfd512b"/>
   <project name="platform/external/svox" path="external/svox" revision="3c1f325f0f5a16e041fc60e53d45d6bd57007cfe"/>
   <project name="platform/external/tagsoup" path="external/tagsoup" revision="0fc3ae734d777a1e95c7633351de1d4764ac36ca"/>
   <project name="platform/external/tinyalsa" path="external/tinyalsa" revision="3747f266d4df878e5b1738a4204e7c1ea26ed381"/>
   <project name="platform/external/tremolo" path="external/tremolo" revision="d3079cb5cb6a27ec5b3f7ecdaaba69d5232d4101"/>
   <project name="platform/external/webp" path="external/webp" revision="4a06b031b9072f65c034fe5ece2633d978d50815"/>
   <project name="platform/external/webrtc" path="external/webrtc" revision="117f1940fa0f4529783bdefe5bf3ac255e707ace"/>
   <project name="platform/external/wpa_supplicant" path="external/wpa_supplicant" revision="550e9f4ace79b684e246f6a17d3b8d30999afc4e"/>
   <project name="platform/external/wpa_supplicant_8" path="external/wpa_supplicant_8" revision="7a182ff25e44f2bc66448a9b9738a97ab43aaaaf"/>
+  <project name="platform/external/yaffs2" path="external/yaffs2" revision="ccb649c33105a3f537dd4e71111d7afe0dd5e95c"/>
   <project name="platform/external/zlib" path="external/zlib" revision="d381d56e7dd4572a47935b353c8893727f5f50cb"/>
-  <project name="platform/external/yaffs2" path="external/yaffs2" revision="ccb649c33105a3f537dd4e71111d7afe0dd5e95c"/>
-  <project name="platform_frameworks_base" path="frameworks/base" remote="b2g" revision="6afc63abe52776ae6a1d32a2d927e630a743a86a"/>
   <project name="platform/frameworks/opt/emoji" path="frameworks/opt/emoji" revision="7f2253709fc8ec200997a684b44ad946ba813f16"/>
   <project name="platform/frameworks/support" path="frameworks/support" revision="b0d785331d7dc80ac06daa12434830ddcea7cc52"/>
   <project name="platform/hardware/libhardware" path="hardware/libhardware" revision="8d951a39a693d00e90e3d8c4d64fe619d0a1e72f"/>
   <project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="af9565aa8be0136463ec549d9d3abdd906d2c390"/>
   <project name="platform/libcore" path="libcore" revision="027162a7afeec9f68a8e0b25bbf3c574ee4ed66d"/>
   <project name="platform/ndk" path="ndk" revision="ffbb37a4985ca4aa9ae11f5593e79efcabce5515"/>
   <project name="platform/prebuilt" path="prebuilt" revision="a4062cc40fcaa0776dc880ce591b4c515d36f420"/>
+  <project name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="d2685281e2e54ca14d1df304867aa82c37b27162"/>
+  <project name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="627f9b20fc518937b93747a7ff1ed4f5ed46e06f"/>
+  <project name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" revision="d9735fc81434f2af2c44d86ca57740c673c8d9bc"/>
+  <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="acba00cdb4596c6dcb61ed06f14cf4ec89623539"/>
   <project name="platform/system/bluetooth" path="system/bluetooth" revision="507e46e553586bec971551322f20d066c80a0788"/>
   <project name="platform/system/core" path="system/core" revision="91e5551f88aea5aa64e1b4f8b4b52d7be2b28b64"/>
   <project name="platform/system/extras" path="system/extras" revision="0205c49fedf29620165c6b4e6db3d13739c93396"/>
   <project name="platform/system/media" path="system/media" revision="7f17e3995d1588cfcc309b56525652794b6513ef"/>
   <project name="platform/system/netd" path="system/netd" revision="3d298fde142bee3fc4f07f63f16f2d8ce42339c0"/>
   <project name="platform/system/vold" path="system/vold" revision="919829940468066a32f403980b43f6ebfee5d314"/>
-  <!-- Emulator specific things -->
-  <project name="android-development" path="development" remote="b2g" revision="2bdf22305b523af644e1891b4ddfd9229336d0ce"/>
+  <!-- Emulator-specific things -->
   <project name="device_generic_goldfish" path="device/generic/goldfish" remote="b2g" revision="fc5f390fa314385e2a84629ea88284a60b40f7c4"/>
-  <project name="platform/external/iproute2" path="external/iproute2" revision="c66c5716d5335e450f7a7b71ccc6a604fb2f41d2"/>
-  <project name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="d2685281e2e54ca14d1df304867aa82c37b27162"/>
-  <project name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="627f9b20fc518937b93747a7ff1ed4f5ed46e06f"/>
-  <project name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" revision="d9735fc81434f2af2c44d86ca57740c673c8d9bc"/>
-  <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="acba00cdb4596c6dcb61ed06f14cf4ec89623539"/>
   <project name="platform_prebuilts_qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="02c32feb2fe97037be0ac4dace3a6a5025ac895d"/>
-  <project name="android-sdk" path="sdk" remote="b2g" revision="4f46930827957afbce500a4a920755a218bf3155"/>
-  <project name="darwinstreamingserver" path="system/darwinstreamingserver" remote="b2g" revision="cf85968c7f85e0ec36e72c87ceb4837a943b8af6"/>
 </manifest>
--- a/b2g/config/emulator-jb/sources.xml
+++ b/b2g/config/emulator-jb/sources.xml
@@ -12,20 +12,20 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="660169a3d7e034a892359e39135e8c2785a6ad6f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="cba7e4b86361af31b153cfebaf99900e0b860f7b"/>
-  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9a58f2e395da17c252f61f28900b5b09aeb813bd"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="702773bee0b70e479ccebe5e061f571e977bc376"/>
+  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="94bbf7890326d37f03fd2a6822b6618b08bec8e2"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5de6856fad82857028f9f059f50680a9bea5b75c"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="9025e50b9d29b3cabbbb21e1dd94d0d13121a17e"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="b89fda71fcd0fa0cf969310e75be3ea33e048b44"/>
@@ -113,17 +113,17 @@
   <project name="platform/libcore" path="libcore" revision="3552ed1686d04a65b85e56ccc24ff3fcf77725e6"/>
   <project name="platform/libnativehelper" path="libnativehelper" revision="4792069e90385889b0638e97ae62c67cdf274e22"/>
   <project name="platform/ndk" path="ndk" revision="7666b97bbaf1d645cdd6b4430a367b7a2bb53369"/>
   <project name="platform/prebuilts/misc" path="prebuilts/misc" revision="f6ab40b3257abc07741188fd173ac392575cc8d2"/>
   <project name="platform/prebuilts/ndk" path="prebuilts/ndk" revision="e52099755d0bd3a579130eefe8e58066cc6c0cb6"/>
   <project name="platform/prebuilts/sdk" path="prebuilts/sdk" revision="842e33e43a55ea44833b9e23e4d180fa17c843af"/>
   <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="5db24726f0f42124304195a6bdea129039eeeaeb"/>
   <project name="platform/system/bluetooth" path="system/bluetooth" revision="930ae098543881f47eac054677726ee4b998b2f8"/>
-  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="07a49d1f7a7a0a1e7d70fef353c2700434ffdc5c"/>
+  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="bdb3469b9302bb22e7df8912e582feefbd05d55f"/>
   <project name="platform_system_core" path="system/core" remote="b2g" revision="542d1f59dc331b472307e5bd043101d14d5a3a3e"/>
   <project name="platform/system/extras" path="system/extras" revision="18c1180e848e7ab8691940481f5c1c8d22c37b3e"/>
   <project name="platform_system_libfdio" path="system/libfdio" remote="b2g" revision="34adfb400e031f3dd3353d92413572db5e3a7376"/>
   <project name="platform/system/media" path="system/media" revision="d90b836f66bf1d9627886c96f3a2d9c3007fbb80"/>
   <project name="platform/system/netd" path="system/netd" revision="56112dd7b811301b718d0643a82fd5cac9522073"/>
   <project name="platform/system/security" path="system/security" revision="f48ff68fedbcdc12b570b7699745abb6e7574907"/>
   <project name="platform/system/vold" path="system/vold" revision="8de05d4a52b5a91e7336e6baa4592f945a6ddbea"/>
   <default remote="caf" revision="refs/tags/android-4.3_r2.1" sync-j="4"/>
--- a/b2g/config/emulator-kk/sources.xml
+++ b/b2g/config/emulator-kk/sources.xml
@@ -10,25 +10,25 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="cba7e4b86361af31b153cfebaf99900e0b860f7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="702773bee0b70e479ccebe5e061f571e977bc376"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9a58f2e395da17c252f61f28900b5b09aeb813bd"/>
+  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="94bbf7890326d37f03fd2a6822b6618b08bec8e2"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5de6856fad82857028f9f059f50680a9bea5b75c"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="f92a936f2aa97526d4593386754bdbf02db07a12"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="6e47ff2790f5656b5b074407829ceecf3e6188c4"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="1950e4760fa14688b83cdbb5acaa1af9f82ef434"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" revision="ac6eb97a37035c09fb5ede0852f0881e9aadf9ad"/>
   <project groups="linux,x86" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" revision="737f591c5f95477148d26602c7be56cbea0cdeb9"/>
   <project groups="linux,x86" name="platform/prebuilts/python/linux-x86/2.7.5" path="prebuilts/python/linux-x86/2.7.5" revision="51da9b1981be481b92a59a826d4d78dc73d0989a"/>
@@ -109,33 +109,33 @@
   <project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="01f436c51dc68aec7cc1c85fda6e6792b2a95066"/>
   <project name="platform/libcore" path="libcore" revision="9877ade9617bb0db6e59aa2a54719a9bc92600f3"/>
   <project name="platform/libnativehelper" path="libnativehelper" revision="46c96ace65eb1ccab05bf15b9bf8e53e443039af"/>
   <project name="platform/ndk" path="ndk" revision="cb5519af32ae7b4a9c334913a612462ecd04c5d0"/>
   <project name="platform_prebuilts_misc" path="prebuilts/misc" remote="b2g" revision="c739cffa6394c06e099ea48879a20341b6163338"/>
   <project name="platform/prebuilts/ndk" path="prebuilts/ndk" revision="6aa61f8557a22039a30b42b7f283996381fd625d"/>
   <project name="platform/prebuilts/sdk" path="prebuilts/sdk" revision="b562b01c93de9578d5db537b6a602a38e1aaa0ce"/>
   <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="387f03e815f57d536dd922706db1622bddba8d81"/>
-  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="07a49d1f7a7a0a1e7d70fef353c2700434ffdc5c"/>
+  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="bdb3469b9302bb22e7df8912e582feefbd05d55f"/>
   <project name="platform/system/extras" path="system/extras" revision="5356165f67f4a81c2ef28671c13697f1657590df"/>
   <project name="platform/system/media" path="system/media" revision="be0e2fe59a8043fa5200f75697df9220a99abe9d"/>
   <project name="platform_system_libfdio" path="system/libfdio" remote="b2g" revision="34adfb400e031f3dd3353d92413572db5e3a7376"/>
   <project name="platform/system/netd" path="system/netd" revision="36704b0da24debcab8090156568ac236315036bb"/>
   <project name="platform/system/security" path="system/security" revision="583374f69f531ba68fc3dcbff1f74893d2a96406"/>
   <project name="platform/system/vold" path="system/vold" revision="d4455b8cf361f8353e8aebac15ffd64b4aedd2b9"/>
   <project name="platform/external/icu4c" path="external/icu4c" remote="aosp" revision="b4c6379528887dc25ca9991a535a8d92a61ad6b6"/>
   <project name="platform_frameworks_av" path="frameworks/av" remote="b2g" revision="2da3a2d5100f8afa1229bb50aa2a29ea0aaf8417"/>
   <project name="platform_system_core" path="system/core" remote="b2g" revision="8586f55fe4b015911b48e731b69c592ad82a0807"/>
   <default remote="caf" revision="refs/tags/android-4.4.2_r1" sync-j="4"/>
   <!-- Emulator specific things -->
   <project name="device/generic/armv7-a-neon" path="device/generic/armv7-a-neon" revision="72ffdf71c68a96309212eb13d63560d66db14c9e"/>
   <project name="device_generic_goldfish" path="device/generic/goldfish" remote="b2g" revision="58800ecb50e4e41cfb0a36cb43c82b73fb3612e5"/>
   <project name="platform_bionic" path="bionic" remote="b2g" revision="3e85c4683c121530c1c3a48c696a569bf5f587e2"/>
-  <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="5a50f96a1d7c788817abb7c57acbb75172c1f48d"/>
+  <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="b2f83825411be614e8f7ec75fc731fc9c67a7078"/>
   <project name="platform/external/libnfc-nci" path="external/libnfc-nci" revision="f37bd545063039e30a92f2550ae78c0e6e4e2d08"/>
   <project name="platform_external_wpa_supplicant_8" path="external/wpa_supplicant_8" remote="b2g" revision="0c6a6547cd1fd302fa2b0f6e375654df36bf0ec4"/>
-  <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="29cbaa03a380ab69d47c476dd433059f7680837c"/>
+  <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="d3ab8090c5c2ac77429575131c4718d96bfb93cc"/>
   <project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="5f4b68c799927b6e078f987b12722c3a6ccd4a45"/>
   <project name="platform/development" path="development" revision="5968ff4e13e0d696ad8d972281fc27ae5a12829b"/>
   <project name="platform_prebuilts_qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="6a1bb59af65b6485b1090522f66fac95c3f9e22c"/>
   <project name="android-sdk" path="sdk" remote="b2g" revision="0951179277915335251c5e11d242e4e1a8c2236f"/>
   <project name="darwinstreamingserver" path="system/darwinstreamingserver" remote="b2g" revision="cf85968c7f85e0ec36e72c87ceb4837a943b8af6"/>
 </manifest>
--- a/b2g/config/emulator-l/sources.xml
+++ b/b2g/config/emulator-l/sources.xml
@@ -10,25 +10,25 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="c9d4fe680662ee44a4bdea42ae00366f5df399cf">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="cba7e4b86361af31b153cfebaf99900e0b860f7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="702773bee0b70e479ccebe5e061f571e977bc376"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9a58f2e395da17c252f61f28900b5b09aeb813bd"/>
+  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="94bbf7890326d37f03fd2a6822b6618b08bec8e2"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5de6856fad82857028f9f059f50680a9bea5b75c"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
   <project groups="pdk,linux" name="platform/prebuilts/clang/linux-x86/host/3.5" path="prebuilts/clang/linux-x86/host/3.5" revision="ffc05a232799fe8fcb3e47b7440b52b1fb4244c0"/>
   <project groups="pdk,linux,arm" name="platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" path="prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" revision="337e0ef5e40f02a1ae59b90db0548976c70a7226"/>
   <project groups="pdk,linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.8" revision="8af5ff6f5dced9eb5a8127459df6c75d24342204"/>
   <project groups="pdk,linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" revision="30915518fa7ea07166efedc191a4f40aef516fe7"/>
   <project groups="pdk,linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6" revision="96eee58e3389fb05a835310d6a06a6ba4486097a"/>
   <project groups="pdk,linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.8" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.8" revision="7c8a46698171aa2e0be09edb43d15a6acf832770"/>
@@ -121,24 +121,24 @@
   <project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="8d075b4d5e9e032b18fbc8b5def63827d1b4a30d"/>
   <project name="platform/libcore" path="libcore" revision="bdec7d684c083760bef7bc4ba2429cceccaaf7d0"/>
   <project name="platform/libnativehelper" path="libnativehelper" revision="27bcc086236cedd31c056303e255c6d0ea3d4a50"/>
   <project name="platform/ndk" path="ndk" revision="42e85f81cc6c74af145056ee80b06e520cccb9a7"/>
   <project name="platform_prebuilts_misc" path="prebuilts/misc" remote="b2g" revision="179d485578c6907c0daf343a3bd7bc53b5e137a1"/>
   <project name="platform/prebuilts/ndk" path="prebuilts/ndk" revision="1d080491f26dfdfd76d5bbc3e6b40c660e8565af"/>
   <project name="platform/prebuilts/sdk" path="prebuilts/sdk" revision="61a10cbd19d6b7fc052a8cb92dfa1b37b93754f3"/>
   <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="9e892a67a01671f312c76b0880dedaa6ba478148"/>
-  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="07a49d1f7a7a0a1e7d70fef353c2700434ffdc5c"/>
+  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="bdb3469b9302bb22e7df8912e582feefbd05d55f"/>
   <project name="platform/system/extras" path="system/extras" revision="47fa016e2248b80aebd5928402c7409f8e0ca64e"/>
   <project name="platform_system_libfdio" path="system/libfdio" remote="b2g" revision="34adfb400e031f3dd3353d92413572db5e3a7376"/>
   <project name="platform/system/media" path="system/media" revision="70bfebc66d9c6a4c614a8c7efde90e8e7e1d8641"/>
   <project name="platform/system/netd" path="system/netd" revision="d113f0ceefa9ce29eb3c86e2d23c7417a70b4048"/>
   <project name="platform/system/security" path="system/security" revision="94e1617f6f2bc2286d005e79cffa6bf0721b06b3"/>
   <project name="platform/system/vold" path="system/vold" revision="c065e301e38ea0c241164e2a373e1ecefbeaf2ec"/>
-  <project name="platform_frameworks_av" path="frameworks/av" remote="b2g" revision="e372b6a77f71c8f9fbbf6f8adbfa7bf8ef45dc60"/>
+  <project name="platform_frameworks_av" path="frameworks/av" remote="b2g" revision="6971327dda6bead878724ac1c767ee2d23a2a9e1"/>
   <project name="platform_frameworks_base" path="frameworks/base" remote="b2g" revision="04e26ebdc36ca83f4ee3e9e2082b3fcf04c5b971"/>
   <project name="platform_frameworks_wilhelm" path="frameworks/wilhelm" remote="b2g" revision="0dbf5baafadf6d233c0a29e392fa3293f0121673"/>
   <project name="platform_system_core" path="system/core" remote="b2g" revision="f594bc64eacac490857748b1139ffcb34c856bbd"/>
   <project name="platform_external_sepolicy" path="external/sepolicy" remote="b2g" revision="3f6be48a46c54dd8cacaf216ab5b145de5ffefd2"/>
   <default remote="caf" revision="refs/tags/android-5.1.0_r1" sync-j="4"/>
   <!-- Emulator specific things -->
   <project name="device/generic/armv7-a-neon" path="device/generic/armv7-a-neon" revision="fe7df1bc8dd0fd71571505d7be1c31a4ad1e40fb"/>
   <project name="device_generic_goldfish" path="device/generic/goldfish" remote="b2g" revision="dc8c7896562bf63190befb3e6b21310a4b7144fa"/>
--- a/b2g/config/emulator/sources.xml
+++ b/b2g/config/emulator/sources.xml
@@ -1,111 +1,112 @@
 <?xml version="1.0" ?><manifest>
   <!--original fetch url was https://android.googlesource.com/-->
   <remote fetch="https://git.mozilla.org/external/aosp" name="aosp"/>
+  <!--original fetch url was git://github.com/apitrace/-->
+  <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
+  <!--original fetch url was git://github.com/mozilla-b2g/-->
+  <remote fetch="https://git.mozilla.org/b2g" name="b2g"/>
+  <!--original fetch url was https://git.mozilla.org/b2g-->
+  <remote fetch="https://git.mozilla.org/b2g" name="b2gmozilla"/>
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
-  <!--original fetch url was https://git.mozilla.org/b2g-->
-  <remote fetch="https://git.mozilla.org/b2g" name="b2gmozilla"/>
-  <!--original fetch url was git://github.com/mozilla-b2g/-->
-  <remote fetch="https://git.mozilla.org/b2g" name="b2g"/>
   <!--original fetch url was git://github.com/mozilla/-->
   <remote fetch="https://git.mozilla.org/b2g" name="mozilla"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
-  <!--original fetch url was git://github.com/apitrace/-->
-  <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
-  <!-- Gonk specific things and forks -->
+  <!-- Gecko and Gaia -->
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="702773bee0b70e479ccebe5e061f571e977bc376"/>
+  <!-- Gonk-specific things and forks -->
+  <project name="platform_bionic" path="bionic" remote="b2g" revision="e2b3733ba3fa5e3f404e983d2e4142b1f6b1b846"/>
   <project name="platform_build" path="build" remote="b2g" revision="1b0db93fb6b870b03467aff50d6419771ba0d88c">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="cba7e4b86361af31b153cfebaf99900e0b860f7b"/>
-  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9a58f2e395da17c252f61f28900b5b09aeb813bd"/>
-  <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
+  <project name="android-development" path="development" remote="b2g" revision="2bdf22305b523af644e1891b4ddfd9229336d0ce"/>
+  <project name="platform_external_apriori" path="external/apriori" remote="b2g" revision="11816ad0406744f963537b23d68ed9c2afb412bd"/>
+  <project name="platform_external_elfcopy" path="external/elfcopy" remote="b2g" revision="62c1bed1c4505369cac2e72fbe30452a598fb690"/>
+  <project name="platform_external_elfutils" path="external/elfutils" remote="b2g" revision="72940dec691fa3255e13df01f8c53b620e446066"/>
+  <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
+  <project name="platform_external_opensans" path="external/opensans" remote="b2g" revision="b5b4c226ca1d71e936153cf679dda6d3d60e2354"/>
+  <project name="screencap-gonk" path="external/screencap-gonk" remote="b2g" revision="e6403c71e9eca8cb943739d5a0a192deac60fc51"/>
+  <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="c72c9278ddc2f442d193474993d36e7f2cfb08c4"/>
+  <project name="platform_frameworks_base" path="frameworks/base" remote="b2g" revision="6afc63abe52776ae6a1d32a2d927e630a743a86a"/>
+  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
+  <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="cb4604d5a578efd027277059ce3e0f6e3af59bd1"/>
-  <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="c72c9278ddc2f442d193474993d36e7f2cfb08c4"/>
-  <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
-  <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
+  <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
+  <project name="android-sdk" path="sdk" remote="b2g" revision="4f46930827957afbce500a4a920755a218bf3155"/>
+  <project name="darwinstreamingserver" path="system/darwinstreamingserver" remote="b2g" revision="cf85968c7f85e0ec36e72c87ceb4837a943b8af6"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
-  <project name="platform_bionic" path="bionic" remote="b2g" revision="e2b3733ba3fa5e3f404e983d2e4142b1f6b1b846"/>
   <project name="platform/bootable/recovery" path="bootable/recovery" revision="425f8b5fadf5889834c5acd27d23c9e0b2129c28"/>
   <project name="device/common" path="device/common" revision="42b808b7e93d0619286ae8e59110b176b7732389"/>
   <project name="device/sample" path="device/sample" revision="237bd668d0f114d801a8d6455ef5e02cc3577587"/>
-  <project name="platform_external_apriori" path="external/apriori" remote="b2g" revision="11816ad0406744f963537b23d68ed9c2afb412bd"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <project name="platform/external/bluetooth/bluez" path="external/bluetooth/bluez" revision="52a1a862a8bac319652b8f82d9541ba40bfa45ce"/>
   <project name="platform/external/bluetooth/glib" path="external/bluetooth/glib" revision="0febbc94a1c40c0227958b7f27764145ec6297bc"/>
   <project name="platform/external/bluetooth/hcidump" path="external/bluetooth/hcidump" revision="03c410e4f80e73d2650b2d6973a11984d096100e"/>
   <project name="platform/external/bsdiff" path="external/bsdiff" revision="85a68103754b1e5473dca7becd76834848c77c35"/>
   <project name="platform/external/bzip2" path="external/bzip2" revision="960142b2e6a4269517467d44e4e953549ff56c38"/>
   <project name="platform/external/dbus" path="external/dbus" revision="07274c4eed41f20d79265f049710b5bf08a3ef20"/>
   <project name="platform/external/dhcpcd" path="external/dhcpcd" revision="c543c0f363dee48a80ef17cff1d5b98fd426b01a"/>
   <project name="platform/external/dnsmasq" path="external/dnsmasq" revision="4e6e5ea3872facb3ad2d84784c108865cc8d536d"/>
-  <project name="platform_external_elfcopy" path="external/elfcopy" remote="b2g" revision="62c1bed1c4505369cac2e72fbe30452a598fb690"/>
-  <project name="platform_external_elfutils" path="external/elfutils" remote="b2g" revision="72940dec691fa3255e13df01f8c53b620e446066"/>
   <project name="platform/external/expat" path="external/expat" revision="728203a4d1c40de1a5fa5dcfa68057faaf3aac50"/>
   <project name="platform/external/fdlibm" path="external/fdlibm" revision="6d128260b94c366d4066c8452e6a8d23533db244"/>
   <project name="platform/external/flac" path="external/flac" revision="e3b0a1fcadcfd1cfd2ebe217ada8ae12ceb3e292"/>
   <project name="platform/external/freetype" path="external/freetype" revision="15321e16a085b9b5c85cf029aee86bf57b2e65c1"/>
   <project name="platform/external/giflib" path="external/giflib" revision="6dbee1b36e184a0d39314254924a61837bd1ed3a"/>
   <project name="platform/external/gtest" path="external/gtest" revision="8c212ebe53bb2baab3575f03069016f1fb11e449"/>
   <project name="platform/external/harfbuzz" path="external/harfbuzz" revision="6b66309486b04d2107ab745a48d37c659da468fd"/>
   <!-- icu4c is missing the default tag in caf, that's the *only* reason for the hardcode -->
   <project name="platform/external/icu4c" path="external/icu4c" revision="0fa67b93b831c6636ca18b152a1b1b14cc99b034"/>
+  <project name="platform/external/iproute2" path="external/iproute2" revision="c66c5716d5335e450f7a7b71ccc6a604fb2f41d2"/>
   <project name="platform/external/iptables" path="external/iptables" revision="32e954f4bcb000ce8f3d8be13bce435eef0cb725"/>
   <project name="platform/external/jpeg" path="external/jpeg" revision="3d70825f75a11a0e625c7be4f5889571e7509456"/>
   <project name="platform/external/libgsm" path="external/libgsm" revision="45b9af864cff193c98605d3fb8fb88d01e209e4a"/>
   <project name="platform/external/liblzf" path="external/liblzf" revision="e214a332b5dbb70e9ab5f37ad6e8fbe05a5759aa"/>
   <project name="platform/external/libnfc-nxp" path="external/libnfc-nxp" revision="46f667ba6c2fd83e4b419ccb16934ded55625b1d"/>
   <project name="platform/external/libnl-headers" path="external/libnl-headers" revision="dedb7df404eb8ca534c12aa47401f42b075d43f6"/>
   <project name="platform/external/libpng" path="external/libpng" revision="b994ba2e3e54734c34f624926e5fbfbca5735cde"/>
   <project name="platform/external/libvpx" path="external/libvpx" revision="7513a8f86d594184f9ac6250289d22817fe5d740"/>
   <project name="platform/external/mksh" path="external/mksh" revision="2aa9dc166c783c3afbaa90dd8b5b334031c4ad4d"/>
-  <project name="platform_external_opensans" path="external/opensans" remote="b2g" revision="b5b4c226ca1d71e936153cf679dda6d3d60e2354"/>
   <project name="platform/external/openssl" path="external/openssl" revision="95c40b11e6d98ad944d64c38e30693ac025e2c88"/>
   <project name="platform/external/protobuf" path="external/protobuf" revision="046e97ace354aa350845465635e4816fb27c9994"/>
   <project name="platform/external/safe-iop" path="external/safe-iop" revision="6282e9cd4c1eb3dc16bfb3592eff58fb6bd13022"/>
-  <project name="screencap-gonk" path="external/screencap-gonk" remote="b2g" revision="e6403c71e9eca8cb943739d5a0a192deac60fc51"/>
   <project name="platform/external/skia" path="external/skia" revision="8c1c7cfacd82a174c65fcbf839d7037e3692aee8"/>
   <project name="platform/external/sonivox" path="external/sonivox" revision="7839a53c7c252fc5f8b1ab685a00cfcf0c7d0c39"/>
   <project name="platform/external/speex" path="external/speex" revision="863479d6859d3cae16e76db5f97ea3e35b7f2bd8"/>
   <project name="platform/external/sqlite" path="external/sqlite" revision="9acb3e17217c007a4469565ab01cf037d01ea090"/>
   <project name="platform/external/stlport" path="external/stlport" revision="a069b0806a337f9e1f335757d771d59879979434"/>
   <project name="platform/external/strace" path="external/strace" revision="89824cc5029c90f44fab65dfd27f1b516dfd512b"/>
   <project name="platform/external/svox" path="external/svox" revision="3c1f325f0f5a16e041fc60e53d45d6bd57007cfe"/>
   <project name="platform/external/tagsoup" path="external/tagsoup" revision="0fc3ae734d777a1e95c7633351de1d4764ac36ca"/>
   <project name="platform/external/tinyalsa" path="external/tinyalsa" revision="3747f266d4df878e5b1738a4204e7c1ea26ed381"/>
   <project name="platform/external/tremolo" path="external/tremolo" revision="d3079cb5cb6a27ec5b3f7ecdaaba69d5232d4101"/>
   <project name="platform/external/webp" path="external/webp" revision="4a06b031b9072f65c034fe5ece2633d978d50815"/>
   <project name="platform/external/webrtc" path="external/webrtc" revision="117f1940fa0f4529783bdefe5bf3ac255e707ace"/>
   <project name="platform/external/wpa_supplicant" path="external/wpa_supplicant" revision="550e9f4ace79b684e246f6a17d3b8d30999afc4e"/>
   <project name="platform/external/wpa_supplicant_8" path="external/wpa_supplicant_8" revision="7a182ff25e44f2bc66448a9b9738a97ab43aaaaf"/>
+  <project name="platform/external/yaffs2" path="external/yaffs2" revision="ccb649c33105a3f537dd4e71111d7afe0dd5e95c"/>
   <project name="platform/external/zlib" path="external/zlib" revision="d381d56e7dd4572a47935b353c8893727f5f50cb"/>
-  <project name="platform/external/yaffs2" path="external/yaffs2" revision="ccb649c33105a3f537dd4e71111d7afe0dd5e95c"/>
-  <project name="platform_frameworks_base" path="frameworks/base" remote="b2g" revision="6afc63abe52776ae6a1d32a2d927e630a743a86a"/>
   <project name="platform/frameworks/opt/emoji" path="frameworks/opt/emoji" revision="7f2253709fc8ec200997a684b44ad946ba813f16"/>
   <project name="platform/frameworks/support" path="frameworks/support" revision="b0d785331d7dc80ac06daa12434830ddcea7cc52"/>
   <project name="platform/hardware/libhardware" path="hardware/libhardware" revision="8d951a39a693d00e90e3d8c4d64fe619d0a1e72f"/>
   <project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="af9565aa8be0136463ec549d9d3abdd906d2c390"/>
   <project name="platform/libcore" path="libcore" revision="027162a7afeec9f68a8e0b25bbf3c574ee4ed66d"/>
   <project name="platform/ndk" path="ndk" revision="ffbb37a4985ca4aa9ae11f5593e79efcabce5515"/>
   <project name="platform/prebuilt" path="prebuilt" revision="a4062cc40fcaa0776dc880ce591b4c515d36f420"/>
+  <project name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="d2685281e2e54ca14d1df304867aa82c37b27162"/>
+  <project name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="627f9b20fc518937b93747a7ff1ed4f5ed46e06f"/>
+  <project name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" revision="d9735fc81434f2af2c44d86ca57740c673c8d9bc"/>
+  <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="acba00cdb4596c6dcb61ed06f14cf4ec89623539"/>
   <project name="platform/system/bluetooth" path="system/bluetooth" revision="507e46e553586bec971551322f20d066c80a0788"/>
   <project name="platform/system/core" path="system/core" revision="91e5551f88aea5aa64e1b4f8b4b52d7be2b28b64"/>
   <project name="platform/system/extras" path="system/extras" revision="0205c49fedf29620165c6b4e6db3d13739c93396"/>
   <project name="platform/system/media" path="system/media" revision="7f17e3995d1588cfcc309b56525652794b6513ef"/>
   <project name="platform/system/netd" path="system/netd" revision="3d298fde142bee3fc4f07f63f16f2d8ce42339c0"/>
   <project name="platform/system/vold" path="system/vold" revision="919829940468066a32f403980b43f6ebfee5d314"/>
-  <!-- Emulator specific things -->
-  <project name="android-development" path="development" remote="b2g" revision="2bdf22305b523af644e1891b4ddfd9229336d0ce"/>
+  <!-- Emulator-specific things -->
   <project name="device_generic_goldfish" path="device/generic/goldfish" remote="b2g" revision="fc5f390fa314385e2a84629ea88284a60b40f7c4"/>
-  <project name="platform/external/iproute2" path="external/iproute2" revision="c66c5716d5335e450f7a7b71ccc6a604fb2f41d2"/>
-  <project name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="d2685281e2e54ca14d1df304867aa82c37b27162"/>
-  <project name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="627f9b20fc518937b93747a7ff1ed4f5ed46e06f"/>
-  <project name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" revision="d9735fc81434f2af2c44d86ca57740c673c8d9bc"/>
-  <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="acba00cdb4596c6dcb61ed06f14cf4ec89623539"/>
   <project name="platform_prebuilts_qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="02c32feb2fe97037be0ac4dace3a6a5025ac895d"/>
-  <project name="android-sdk" path="sdk" remote="b2g" revision="4f46930827957afbce500a4a920755a218bf3155"/>
-  <project name="darwinstreamingserver" path="system/darwinstreamingserver" remote="b2g" revision="cf85968c7f85e0ec36e72c87ceb4837a943b8af6"/>
 </manifest>
--- a/b2g/config/flame-kk/sources.xml
+++ b/b2g/config/flame-kk/sources.xml
@@ -10,26 +10,26 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="cba7e4b86361af31b153cfebaf99900e0b860f7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="702773bee0b70e479ccebe5e061f571e977bc376"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
-  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9a58f2e395da17c252f61f28900b5b09aeb813bd"/>
+  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="94bbf7890326d37f03fd2a6822b6618b08bec8e2"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5de6856fad82857028f9f059f50680a9bea5b75c"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="ebdad82e61c16772f6cd47e9f11936bf6ebe9aa0"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="8b880805d454664b3eed11d0f053cdeafa1ff06e"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" revision="a1e239a0bb5cd1d69680bf1075883aa9a7bf2429"/>
   <project groups="linux,x86" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" revision="c7931763d41be602407ed9d71e2c0292c6597e00"/>
   <project groups="linux,x86" name="platform/prebuilts/python/linux-x86/2.7.5" path="prebuilts/python/linux-x86/2.7.5" revision="a32003194f707f66a2d8cdb913ed1869f1926c5d"/>
@@ -104,17 +104,17 @@
   <project name="platform/frameworks/wilhelm" path="frameworks/wilhelm" revision="f0c3b4edf597c40aae4ea311575f39c8bcf203df"/>
   <project name="platform/libcore" path="libcore" revision="baf7d8068dd501cfa338d3a8b1b87216d6ce0571"/>
   <project name="platform/libnativehelper" path="libnativehelper" revision="50c4430e32849530ced32680fd6ee98963b3f7ac"/>
   <project name="platform/ndk" path="ndk" revision="e58ef003be4306bb53a8c11331146f39e4eab31f"/>
   <project name="platform_prebuilts_misc" path="prebuilts/misc" remote="b2g" revision="c739cffa6394c06e099ea48879a20341b6163338"/>
   <project name="platform/prebuilts/ndk" path="prebuilts/ndk" revision="c792f0bd9fff7aea2887c60bbb3a9bbdb534ffa3"/>
   <project name="platform/prebuilts/sdk" path="prebuilts/sdk" revision="69d524e80cdf3981006627c65ac85f3a871238a3"/>
   <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="5a48c04c4bb5f079bc757e29864a42427378e051"/>
-  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="07a49d1f7a7a0a1e7d70fef353c2700434ffdc5c"/>
+  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="bdb3469b9302bb22e7df8912e582feefbd05d55f"/>
   <project name="platform/system/extras" path="system/extras" revision="576f57b6510de59c08568b53c0fb60588be8689e"/>
   <project name="platform_system_libfdio" path="system/libfdio" remote="b2g" revision="34adfb400e031f3dd3353d92413572db5e3a7376"/>
   <project name="platform/system/netd" path="system/netd" revision="a6531f7befb49b1c81bc0de7e51c5482b308e1c5"/>
   <project name="platform/system/security" path="system/security" revision="ee8068b9e7bfb2770635062fc9c2035be2142bd8"/>
   <project name="platform/system/vold" path="system/vold" revision="42fa2a0f14f965970a4b629a176bbd2666edf017"/>
   <project name="platform/external/curl" path="external/curl" revision="e68addd988448959ea8157c5de637346b4180c33"/>
   <project name="platform/external/icu4c" path="external/icu4c" revision="d3ec7428eb276db43b7ed0544e09344a6014806c"/>
   <project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="76c4bf4bc430a1b8317f2f21ef735867733e50cc"/>
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,9 +1,9 @@
 {
     "git": {
-        "git_revision": "cba7e4b86361af31b153cfebaf99900e0b860f7b", 
+        "git_revision": "702773bee0b70e479ccebe5e061f571e977bc376", 
         "remote": "https://git.mozilla.org/releases/gaia.git", 
         "branch": ""
     }, 
-    "revision": "d02e42f3a17e4c37ff6c2b56e792e7d762732676", 
+    "revision": "d8d3b630339c16b3bf5292813143da11a8bbb0f0", 
     "repo_path": "integration/gaia-central"
 }
--- a/b2g/config/nexus-4-kk/sources.xml
+++ b/b2g/config/nexus-4-kk/sources.xml
@@ -10,26 +10,26 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="cba7e4b86361af31b153cfebaf99900e0b860f7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="702773bee0b70e479ccebe5e061f571e977bc376"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
-  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9a58f2e395da17c252f61f28900b5b09aeb813bd"/>
+  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="94bbf7890326d37f03fd2a6822b6618b08bec8e2"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5de6856fad82857028f9f059f50680a9bea5b75c"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="f92a936f2aa97526d4593386754bdbf02db07a12"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="6e47ff2790f5656b5b074407829ceecf3e6188c4"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="1950e4760fa14688b83cdbb5acaa1af9f82ef434"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" revision="ac6eb97a37035c09fb5ede0852f0881e9aadf9ad"/>
   <project groups="linux,x86" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" revision="737f591c5f95477148d26602c7be56cbea0cdeb9"/>
   <project groups="linux,x86" name="platform/prebuilts/python/linux-x86/2.7.5" path="prebuilts/python/linux-x86/2.7.5" revision="51da9b1981be481b92a59a826d4d78dc73d0989a"/>
@@ -111,17 +111,17 @@
   <project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="01f436c51dc68aec7cc1c85fda6e6792b2a95066"/>
   <project name="platform/libcore" path="libcore" revision="9877ade9617bb0db6e59aa2a54719a9bc92600f3"/>
   <project name="platform/libnativehelper" path="libnativehelper" revision="46c96ace65eb1ccab05bf15b9bf8e53e443039af"/>
   <project name="platform/ndk" path="ndk" revision="cb5519af32ae7b4a9c334913a612462ecd04c5d0"/>
   <project name="platform_prebuilts_misc" path="prebuilts/misc" remote="b2g" revision="c739cffa6394c06e099ea48879a20341b6163338"/>
   <project name="platform/prebuilts/ndk" path="prebuilts/ndk" revision="6aa61f8557a22039a30b42b7f283996381fd625d"/>
   <project name="platform/prebuilts/sdk" path="prebuilts/sdk" revision="b562b01c93de9578d5db537b6a602a38e1aaa0ce"/>
   <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="387f03e815f57d536dd922706db1622bddba8d81"/>
-  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="07a49d1f7a7a0a1e7d70fef353c2700434ffdc5c"/>
+  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="bdb3469b9302bb22e7df8912e582feefbd05d55f"/>
   <project name="platform/system/extras" path="system/extras" revision="5356165f67f4a81c2ef28671c13697f1657590df"/>
   <project name="platform/system/media" path="system/media" revision="be0e2fe59a8043fa5200f75697df9220a99abe9d"/>
   <project name="platform_system_libfdio" path="system/libfdio" remote="b2g" revision="34adfb400e031f3dd3353d92413572db5e3a7376"/>
   <project name="platform/system/netd" path="system/netd" revision="36704b0da24debcab8090156568ac236315036bb"/>
   <project name="platform/system/security" path="system/security" revision="583374f69f531ba68fc3dcbff1f74893d2a96406"/>
   <project name="platform/system/vold" path="system/vold" revision="d4455b8cf361f8353e8aebac15ffd64b4aedd2b9"/>
   <project name="platform/external/icu4c" path="external/icu4c" remote="aosp" revision="b4c6379528887dc25ca9991a535a8d92a61ad6b6"/>
   <project name="platform_frameworks_av" path="frameworks/av" remote="b2g" revision="2da3a2d5100f8afa1229bb50aa2a29ea0aaf8417"/>
--- a/b2g/config/nexus-4/sources.xml
+++ b/b2g/config/nexus-4/sources.xml
@@ -13,20 +13,20 @@
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="660169a3d7e034a892359e39135e8c2785a6ad6f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="cba7e4b86361af31b153cfebaf99900e0b860f7b"/>
-  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9a58f2e395da17c252f61f28900b5b09aeb813bd"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="702773bee0b70e479ccebe5e061f571e977bc376"/>
+  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="94bbf7890326d37f03fd2a6822b6618b08bec8e2"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5de6856fad82857028f9f059f50680a9bea5b75c"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="9025e50b9d29b3cabbbb21e1dd94d0d13121a17e"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="b89fda71fcd0fa0cf969310e75be3ea33e048b44"/>
@@ -114,17 +114,17 @@
   <project name="platform/libcore" path="libcore" revision="3552ed1686d04a65b85e56ccc24ff3fcf77725e6"/>
   <project name="platform/libnativehelper" path="libnativehelper" revision="4792069e90385889b0638e97ae62c67cdf274e22"/>
   <project name="platform/ndk" path="ndk" revision="7666b97bbaf1d645cdd6b4430a367b7a2bb53369"/>
   <project name="platform/prebuilts/misc" path="prebuilts/misc" revision="f6ab40b3257abc07741188fd173ac392575cc8d2"/>
   <project name="platform/prebuilts/ndk" path="prebuilts/ndk" revision="e52099755d0bd3a579130eefe8e58066cc6c0cb6"/>
   <project name="platform/prebuilts/sdk" path="prebuilts/sdk" revision="842e33e43a55ea44833b9e23e4d180fa17c843af"/>
   <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="5db24726f0f42124304195a6bdea129039eeeaeb"/>
   <project name="platform/system/bluetooth" path="system/bluetooth" revision="930ae098543881f47eac054677726ee4b998b2f8"/>
-  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="07a49d1f7a7a0a1e7d70fef353c2700434ffdc5c"/>
+  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="bdb3469b9302bb22e7df8912e582feefbd05d55f"/>
   <project name="platform_system_core" path="system/core" remote="b2g" revision="542d1f59dc331b472307e5bd043101d14d5a3a3e"/>
   <project name="platform/system/extras" path="system/extras" revision="18c1180e848e7ab8691940481f5c1c8d22c37b3e"/>
   <project name="platform_system_libfdio" path="system/libfdio" remote="b2g" revision="34adfb400e031f3dd3353d92413572db5e3a7376"/>
   <project name="platform/system/media" path="system/media" revision="d90b836f66bf1d9627886c96f3a2d9c3007fbb80"/>
   <project name="platform/system/netd" path="system/netd" revision="56112dd7b811301b718d0643a82fd5cac9522073"/>
   <project name="platform/system/security" path="system/security" revision="f48ff68fedbcdc12b570b7699745abb6e7574907"/>
   <project name="platform/system/vold" path="system/vold" revision="8de05d4a52b5a91e7336e6baa4592f945a6ddbea"/>
   <default remote="caf" revision="refs/tags/android-4.3_r2.1" sync-j="4"/>
--- a/b2g/config/nexus-5-l/sources.xml
+++ b/b2g/config/nexus-5-l/sources.xml
@@ -10,26 +10,26 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="c9d4fe680662ee44a4bdea42ae00366f5df399cf">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="cba7e4b86361af31b153cfebaf99900e0b860f7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="702773bee0b70e479ccebe5e061f571e977bc376"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
-  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9a58f2e395da17c252f61f28900b5b09aeb813bd"/>
+  <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="94bbf7890326d37f03fd2a6822b6618b08bec8e2"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5de6856fad82857028f9f059f50680a9bea5b75c"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
   <project groups="pdk,linux" name="platform/prebuilts/clang/linux-x86/host/3.5" path="prebuilts/clang/linux-x86/host/3.5" revision="ffc05a232799fe8fcb3e47b7440b52b1fb4244c0"/>
   <project groups="pdk,linux,arm" name="platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" path="prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" revision="337e0ef5e40f02a1ae59b90db0548976c70a7226"/>
   <project groups="pdk,linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.8" revision="8af5ff6f5dced9eb5a8127459df6c75d24342204"/>
   <project groups="pdk,linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" revision="30915518fa7ea07166efedc191a4f40aef516fe7"/>
   <project groups="pdk,linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6" revision="96eee58e3389fb05a835310d6a06a6ba4486097a"/>
   <project groups="pdk,linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.8" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.8" revision="7c8a46698171aa2e0be09edb43d15a6acf832770"/>
@@ -122,24 +122,24 @@
   <project name="platform/hardware/libhardware_legacy" path="hardware/libhardware_legacy" revision="8d075b4d5e9e032b18fbc8b5def63827d1b4a30d"/>
   <project name="platform/libcore" path="libcore" revision="bdec7d684c083760bef7bc4ba2429cceccaaf7d0"/>
   <project name="platform/libnativehelper" path="libnativehelper" revision="27bcc086236cedd31c056303e255c6d0ea3d4a50"/>
   <project name="platform/ndk" path="ndk" revision="42e85f81cc6c74af145056ee80b06e520cccb9a7"/>
   <project name="platform_prebuilts_misc" path="prebuilts/misc" remote="b2g" revision="179d485578c6907c0daf343a3bd7bc53b5e137a1"/>
   <project name="platform/prebuilts/ndk" path="prebuilts/ndk" revision="1d080491f26dfdfd76d5bbc3e6b40c660e8565af"/>
   <project name="platform/prebuilts/sdk" path="prebuilts/sdk" revision="61a10cbd19d6b7fc052a8cb92dfa1b37b93754f3"/>
   <project name="platform/prebuilts/tools" path="prebuilts/tools" revision="9e892a67a01671f312c76b0880dedaa6ba478148"/>
-  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="07a49d1f7a7a0a1e7d70fef353c2700434ffdc5c"/>
+  <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="bdb3469b9302bb22e7df8912e582feefbd05d55f"/>
   <project name="platform/system/extras" path="system/extras" revision="47fa016e2248b80aebd5928402c7409f8e0ca64e"/>
   <project name="platform_system_libfdio" path="system/libfdio" remote="b2g" revision="34adfb400e031f3dd3353d92413572db5e3a7376"/>
   <project name="platform/system/media" path="system/media" revision="70bfebc66d9c6a4c614a8c7efde90e8e7e1d8641"/>
   <project name="platform/system/netd" path="system/netd" revision="d113f0ceefa9ce29eb3c86e2d23c7417a70b4048"/>
   <project name="platform/system/security" path="system/security" revision="94e1617f6f2bc2286d005e79cffa6bf0721b06b3"/>
   <project name="platform/system/vold" path="system/vold" revision="c065e301e38ea0c241164e2a373e1ecefbeaf2ec"/>
-  <project name="platform_frameworks_av" path="frameworks/av" remote="b2g" revision="e372b6a77f71c8f9fbbf6f8adbfa7bf8ef45dc60"/>
+  <project name="platform_frameworks_av" path="frameworks/av" remote="b2g" revision="6971327dda6bead878724ac1c767ee2d23a2a9e1"/>
   <project name="platform_frameworks_base" path="frameworks/base" remote="b2g" revision="04e26ebdc36ca83f4ee3e9e2082b3fcf04c5b971"/>
   <project name="platform_frameworks_wilhelm" path="frameworks/wilhelm" remote="b2g" revision="0dbf5baafadf6d233c0a29e392fa3293f0121673"/>
   <project name="platform_system_core" path="system/core" remote="b2g" revision="f594bc64eacac490857748b1139ffcb34c856bbd"/>
   <project name="platform_external_sepolicy" path="external/sepolicy" remote="b2g" revision="3f6be48a46c54dd8cacaf216ab5b145de5ffefd2"/>
   <default remote="caf" revision="refs/tags/android-5.1.0_r1" sync-j="4"/>
   <!-- Nexus 5 specific things -->
   <project name="device/generic/armv7-a-neon" path="device/generic/armv7-a-neon" revision="fe7df1bc8dd0fd71571505d7be1c31a4ad1e40fb"/>
   <project name="device-hammerhead" path="device/lge/hammerhead" remote="b2g" revision="1401762a4eea0b92141e8ff3100f93e9d6556fc8"/>
--- a/b2g/graphene/confvars.sh
+++ b/b2g/graphene/confvars.sh
@@ -58,8 +58,11 @@ MOZ_B2G_LOADER=1
 MOZ_ENABLE_WARNINGS_AS_ERRORS=1
 fi
 
 MOZ_JSDOWNLOADS=1
 
 MOZ_BUNDLED_FONTS=1
 
 export JS_GC_SMALL_CHUNK_SIZE=1
+
+# Include the DevTools client, not just the server (which is the default)
+MOZ_DEVTOOLS=all
--- a/b2g/graphene/graphene.js
+++ b/b2g/graphene/graphene.js
@@ -48,8 +48,15 @@ pref("b2g.nativeWindowGeometry.screenX",
 pref("b2g.nativeWindowGeometry.screenY", -1); // center
 pref("b2g.nativeWindowGeometry.fullscreen", false);
 
 pref("media.useAudioChannelService", false);
 
 #ifdef ENABLE_MARIONETTE
 pref("b2g.is_mulet", true);
 #endif
+
+// Most DevTools prefs are set from the shared file
+// devtools/client/preferences/devtools.js, but this one is currently set
+// per-app or per-channel.
+// Number of usages of the web console or scratchpad. If this is less than 5,
+// then pasting code into the web console or scratchpad is disabled
+pref("devtools.selfxss.count", 5);
new file mode 100755
--- /dev/null
+++ b/b2g/installer/flash.bat
@@ -0,0 +1,73 @@
+@ECHO OFF
+
+REM read config file
+setlocal ENABLEDELAYEDEXPANSION
+set loop=0
+for /F "tokens=*" %%A in (.config) do (
+    SET /A loop=!loop! + 1
+    set %%A
+)
+
+set DEVICE_FOUND=0
+
+REM nexus has device instead of product name
+IF [%PRODUCT_NAME%]==[] (
+ set PRODUCT_NAME=%DEVICE%
+)
+
+REM if nexus 4 assume you are in fastboot mode, can't seem to find drivers 
+IF [%DEVICE%]==[mako] (
+call :flash
+)
+
+REM push device from adb to fastboot mode
+win_adb kill-server
+win_adb devices
+win_adb get-state > devicestate.txt
+set /p DEVICE_STATE= < devicestate.txt
+
+IF NOT "%DEVICE_STATE%"=="device" (
+   ECHO Please check :
+   ECHO 1. to make sure that only one device is connected to the computer
+   ECHO 2. the device is turned on with the screen showing
+   ECHO 3. the device is set to debugging via USB : ADB Only or ADB and Devtools
+   ECHO 4. the device drivers are installed on the computer.
+   Del devicestate.txt
+   PAUSE
+   EXIT /b
+)
+
+Del devicestate.txt
+win_adb reboot bootloader
+
+TIMEOUT 5
+
+:flash
+win_fastboot devices 2> fastboot_state.txt
+set /p FASTBOOT_STATE= < fastboot_state.txt
+
+IF NOT [%FASTBOOT_STATE%]==[] (
+   ECHO Please check :
+   ECHO 1. to make sure that only one device is connected to the computer
+   ECHO 2. the device is turned on with an indication that the device is in fastboot mode
+   ECHO 3. the fastboot drivers are installed on the computer.
+   Del fastboot_state.txt
+   PAUSE
+   EXIT /b
+)
+
+Del fastboot_state.txt
+
+ECHO "Flashing build. If nothing mentions that it flashed anything and it looks stuck, make sure you have the drivers installed."
+win_fastboot flash boot out/target/product/%PRODUCT_NAME%/boot.img
+win_fastboot flash system out/target/product/%PRODUCT_NAME%/system.img
+win_fastboot flash persist out/target/product/%PRODUCT_NAME%/persist.img
+win_fastboot flash recovery out/target/product/%PRODUCT_NAME%/recovery.img
+win_fastboot flash cache out/target/product/%PRODUCT_NAME%/cache.img
+win_fastboot flash userdata out/target/product/%PRODUCT_NAME%/userdata.img
+
+ECHO "Done..."
+
+win_fastboot reboot
+echo "Just close the windows as you wish."
+TIMEOUT 5
--- a/b2g/installer/package-manifest.in
+++ b/b2g/installer/package-manifest.in
@@ -169,16 +169,17 @@
 @RESPATH@/components/docshell.xpt
 @RESPATH@/components/dom.xpt
 @RESPATH@/components/dom_activities.xpt
 @RESPATH@/components/dom_apps.xpt
 @RESPATH@/components/dom_newapps.xpt
 @RESPATH@/components/dom_audiochannel.xpt
 @RESPATH@/components/dom_base.xpt
 @RESPATH@/components/dom_system.xpt
+@RESPATH@/components/dom_workers.xpt
 #ifdef MOZ_WIDGET_GONK
 @RESPATH@/components/dom_wifi.xpt
 @RESPATH@/components/dom_system_gonk.xpt
 #endif
 #ifdef MOZ_B2G_RIL
 @RESPATH@/components/dom_wappush.xpt
 @RESPATH@/components/dom_mobileconnection.xpt
 #endif
@@ -743,16 +744,19 @@
 @RESPATH@/chrome/icons/default/default32.png
 @RESPATH@/chrome/icons/default/default48.png
 #endif
 #endif
 
 ; DevTools
 @RESPATH@/chrome/devtools@JAREXT@
 @RESPATH@/chrome/devtools.manifest
+#ifdef MOZ_GRAPHENE
+@RESPATH@/@PREF_DIR@/devtools.js
+#endif
 
 ; shell icons
 #ifdef XP_UNIX
 #ifndef XP_MACOSX
 @RESPATH@/icons/*.xpm
 @RESPATH@/icons/*.png
 #endif
 #endif
--- a/b2g/locales/en-US/chrome/overrides/appstrings.properties
+++ b/b2g/locales/en-US/chrome/overrides/appstrings.properties
@@ -27,13 +27,14 @@ externalProtocolTitle=External Protocol 
 externalProtocolPrompt=An external application must be launched to handle %1$S: links.\n\n\nRequested link:\n\n%2$S\n\nApplication: %3$S\n\n\nIf you were not expecting this request it may be an attempt to exploit a weakness in that other program. Cancel this request unless you are sure it is not malicious.\n
 #LOCALIZATION NOTE (externalProtocolUnknown): The following string is shown if the application name can't be determined
 externalProtocolUnknown=<Unknown>
 externalProtocolChkMsg=Remember my choice for all links of this type.
 externalProtocolLaunchBtn=Launch application
 malwareBlocked=The site at %S has been reported as an attack site and has been blocked based on your security preferences.
 unwantedBlocked=The site at %S has been reported as serving unwanted software and has been blocked based on your security preferences.
 phishingBlocked=The website at %S has been reported as a web forgery designed to trick users into sharing personal or financial information.
+forbiddenBlocked=The site at %S has been blocked by your browser configuration.
 cspBlocked=This page has a content security policy that prevents it from being loaded in this way.
 corruptedContentError=The page you are trying to view cannot be shown because an error in the data transmission was detected.
 remoteXUL=This page uses an unsupported technology that is no longer available by default in Firefox.
 sslv3Used=Firefox cannot guarantee the safety of your data on %S because it uses SSLv3, a broken security protocol.
 weakCryptoUsed=The owner of %S has configured their website improperly. To protect your information from being stolen, Firefox has not connected to this website.
--- a/b2g/simulator/custom-prefs.js
+++ b/b2g/simulator/custom-prefs.js
@@ -1,7 +1,8 @@
 user_pref("devtools.debugger.prompt-connection", false);
 user_pref("devtools.debugger.forbid-certified-apps", false);
 user_pref("devtools.apps.forbidden-permissions", "");
+user_pref("b2g.software-buttons", true);
 
 // Required for Mulet in order to run the debugger server from the command line
 user_pref("devtools.debugger.remote-enabled", true);
 user_pref("devtools.chrome.enabled", true);
--- a/browser/app/blocklist.xml
+++ b/browser/app/blocklist.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0"?>
-<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1447453044000">
+<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1447879967000">
   <emItems>
       <emItem  blockID="i58" id="webmaster@buzzzzvideos.info">
                         <versionRange  minVersion="0" maxVersion="*">
                     </versionRange>
                     <prefs>
               </prefs>
     </emItem>
       <emItem  blockID="i71" id="youtube@2youtube.com">
@@ -443,16 +443,25 @@
               </prefs>
     </emItem>
       <emItem  blockID="i1038" id="344141-fasf9jas08hasoiesj9ia8ws@jetpack">
                         <versionRange  minVersion="0" maxVersion="*" severity="3">
                     </versionRange>
                     <prefs>
               </prefs>
     </emItem>
+      <emItem  blockID="i1056" id="{82AF8DCA-6DE9-405D-BD5E-43525BDAD38A}">
+                        <versionRange  minVersion="0" maxVersion="7.5.0.9082" severity="1">
+                      <targetApplication  id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
+                              <versionRange  minVersion="43.0a1" maxVersion="*" />
+                          </targetApplication>
+                    </versionRange>
+                    <prefs>
+              </prefs>
+    </emItem>
       <emItem  blockID="i344" id="lrcsTube@hansanddeta.com">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
                     </versionRange>
                     <prefs>
               </prefs>
     </emItem>
       <emItem  blockID="i461" id="{8E9E3331-D360-4f87-8803-52DE43566502}">
                         <versionRange  minVersion="0" maxVersion="*" severity="1">
@@ -3342,17 +3351,17 @@
                       <device>0x9803</device>
                       <device>0x9803</device>
                       <device>0x9804</device>
                       <device>0x9805</device>
                       <device>0x9806</device>
                       <device>0x9807</device>
                   </devices>
             <feature>DIRECT3D_9_LAYERS</feature>      <featureStatus>BLOCKED_DEVICE</featureStatus>    </gfxBlacklistEntry>
-    <gfxBlacklistEntry  blockID="g511">      <os>WINNT 5.1</os>      <vendor>0x8086</vendor>            <feature>DIRECT3D_9_LAYERS, WEBGL_ANGLE</feature>      <featureStatus>BLOCKED_DRIVER_VERSION</featureStatus>      <driverVersion>6.14.10.5218</driverVersion>      <driverVersionComparator>LESS_THAN</driverVersionComparator>    </gfxBlacklistEntry>
+    <gfxBlacklistEntry  blockID="g511">      <os>WINNT 5.1</os>      <vendor>0x8086</vendor>            <feature>DIRECT3D_9_LAYERS</feature>      <featureStatus>BLOCKED_DRIVER_VERSION</featureStatus>      <driverVersion>6.14.10.5218</driverVersion>      <driverVersionComparator>LESS_THAN</driverVersionComparator>    </gfxBlacklistEntry>
     <gfxBlacklistEntry  blockID="g974">      <os>WINNT 10.0</os>      <vendor>0x1002</vendor>              <devices>
                       <device>0x6920</device>
                       <device>0x6921</device>
                       <device>0x6928</device>
                       <device>0x6929</device>
                       <device>0x692b</device>
                       <device>0x692f</device>
                       <device>0x6930</device>
@@ -3390,16 +3399,17 @@
                       <device>0x7300</device>
                       <device>0x9870</device>
                       <device>0x9874</device>
                       <device>0x9875</device>
                       <device>0x9876</device>
                       <device>0x9877</device>
                   </devices>
             <feature>DIRECT2D</feature>      <featureStatus>BLOCKED_DRIVER_VERSION</featureStatus>      <driverVersion>15.201.1151.0</driverVersion>      <driverVersionComparator>LESS_THAN</driverVersionComparator>    </gfxBlacklistEntry>
+    <gfxBlacklistEntry  blockID="g1057">      <os>WINNT 5.1</os>      <vendor>0x8086</vendor>            <feature>WEBGL_ANGLE</feature>      <featureStatus>BLOCKED_DRIVER_VERSION</featureStatus>      <driverVersion>6.14.10.5218</driverVersion>      <driverVersionComparator>LESS_THAN</driverVersionComparator>    </gfxBlacklistEntry>
     </gfxItems>
 
   <certItems>
         <certItem issuerName="MIGQMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDE2MDQGA1UEAxMtQ09NT0RPIFJTQSBEb21haW4gVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENB">
       <serialNumber>D9UltDPl4XVfSSqQOvdiwQ==</serialNumber>
     </certItem>
         <certItem issuerName="MDIxCzAJBgNVBAYTAkNOMQ4wDAYDVQQKEwVDTk5JQzETMBEGA1UEAxMKQ05OSUMgUk9PVA==">
       <serialNumber>STMAjg==</serialNumber>
deleted file mode 100644
--- a/browser/app/jar.mn
+++ /dev/null
@@ -1,3 +0,0 @@
-browser.jar:
-% resource app %
-  defaults/permissions (permissions)
--- a/browser/app/moz.build
+++ b/browser/app/moz.build
@@ -16,16 +16,17 @@ JS_PREFERENCE_FILES += [
 ]
 
 SOURCES += [
     'nsBrowserApp.cpp',
 ]
 
 FINAL_TARGET_FILES += ['blocklist.xml']
 FINAL_TARGET_FILES.defaults.profile += ['profile/prefs.js']
+FINAL_TARGET_FILES.defaults += ['permissions']
 
 DEFINES['APP_VERSION'] = CONFIG['MOZ_APP_VERSION']
 
 LOCAL_INCLUDES += [
     '!/build',
     '/toolkit/xre',
     '/xpcom/base',
     '/xpcom/build',
@@ -65,12 +66,10 @@ if CONFIG['OS_ARCH'] == 'WINNT' and not 
 DISABLE_STL_WRAPPING = True
 
 if CONFIG['MOZ_LINKER']:
     OS_LIBS += CONFIG['MOZ_ZLIB_LIBS']
 
 if CONFIG['HAVE_CLOCK_MONOTONIC']:
     OS_LIBS += CONFIG['REALTIME_LIBS']
 
-JAR_MANIFESTS += ['jar.mn']
-
 if CONFIG['GNU_CXX']:
     CXXFLAGS += ['-Wshadow']
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -481,20 +481,16 @@ pref("general.warnOnAboutConfig",       
 pref("dom.disable_window_open_feature.location",  true);
 // prevent JS from setting status messages
 pref("dom.disable_window_status_change",          true);
 // allow JS to move and resize existing windows
 pref("dom.disable_window_move_resize",            false);
 // prevent JS from monkeying with window focus, etc
 pref("dom.disable_window_flip",                   true);
 
-// Disable touch events on Desktop Firefox by default until they are properly
-// supported (bug 736048)
-pref("dom.w3c_touch_events.enabled",        0);
-
 // popups.policy 1=allow,2=reject
 pref("privacy.popups.policy",               1);
 pref("privacy.popups.usecustom",            true);
 pref("privacy.popups.showBrowserMessage",   true);
 
 pref("privacy.item.cookies",                false);
 
 pref("privacy.clearOnShutdown.history",     true);
@@ -1230,17 +1226,16 @@ pref("browser.taskbar.previews.cachetime
 pref("browser.taskbar.lists.enabled", true);
 pref("browser.taskbar.lists.frequent.enabled", true);
 pref("browser.taskbar.lists.recent.enabled", false);
 pref("browser.taskbar.lists.maxListItemCount", 7);
 pref("browser.taskbar.lists.tasks.enabled", true);
 pref("browser.taskbar.lists.refreshInSeconds", 120);
 #endif
 
-#ifdef MOZ_SERVICES_SYNC
 // The sync engines to use.
 pref("services.sync.registerEngines", "Bookmarks,Form,History,Password,Prefs,Tab,Addons");
 // Preferences to be synced by default
 pref("services.sync.prefs.sync.accessibility.blockautorefresh", true);
 pref("services.sync.prefs.sync.accessibility.browsewithcaret", true);
 pref("services.sync.prefs.sync.accessibility.typeaheadfind", true);
 pref("services.sync.prefs.sync.accessibility.typeaheadfind.linksonly", true);
 pref("services.sync.prefs.sync.addons.ignoreUserEnabledChanges", true);
@@ -1300,17 +1295,16 @@ pref("services.sync.prefs.sync.privacy.t
 pref("services.sync.prefs.sync.security.OCSP.enabled", true);
 pref("services.sync.prefs.sync.security.OCSP.require", true);
 pref("services.sync.prefs.sync.security.default_personal_cert", true);
 pref("services.sync.prefs.sync.security.tls.version.min", true);
 pref("services.sync.prefs.sync.security.tls.version.max", true);
 pref("services.sync.prefs.sync.signon.rememberSignons", true);
 pref("services.sync.prefs.sync.spellchecker.dictionary", true);
 pref("services.sync.prefs.sync.xpinstall.whitelist.required", true);
-#endif
 
 // Developer edition preferences
 #ifdef MOZ_DEV_EDITION
 sticky_pref("lightweightThemes.selectedThemeID", "firefox-devedition@mozilla.org");
 #else
 sticky_pref("lightweightThemes.selectedThemeID", "");
 #endif
 
@@ -1342,18 +1336,20 @@ pref("browser.newtabpage.rows", 3);
 pref("browser.newtabpage.columns", 5);
 
 // directory tiles download URL
 pref("browser.newtabpage.directory.source", "https://tiles.services.mozilla.com/v3/links/fetch/%LOCALE%/%CHANNEL%");
 
 // endpoint to send newtab click and view pings
 pref("browser.newtabpage.directory.ping", "https://tiles.services.mozilla.com/v3/links/");
 
-// activates the remote-hosted newtab page
+#ifndef RELEASE_BUILD
+// if true, it activates the remote-hosted newtab page
 pref("browser.newtabpage.remote", false);
+#endif
 
 // Enable the DOM fullscreen API.
 pref("full-screen-api.enabled", true);
 
 // Startup Crash Tracking
 // number of startup crashes that can occur before starting into safe mode automatically
 // (this pref has no effect if more than 6 hours have passed since the last crash)
 pref("toolkit.startup.max_resumed_crashes", 3);
@@ -1375,52 +1371,16 @@ pref("pdfjs.previousHandler.alwaysAskBef
 pref("shumway.disabled", true);
 #endif
 
 // The maximum amount of decoded image data we'll willingly keep around (we
 // might keep around more than this, but we'll try to get down to this value).
 // (This is intentionally on the high side; see bug 746055.)
 pref("image.mem.max_decoded_image_kb", 256000);
 
-pref("loop.enabled", true);
-pref("loop.textChat.enabled", true);
-pref("loop.server", "https://loop.services.mozilla.com/v0");
-pref("loop.linkClicker.url", "https://hello.firefox.com/");
-pref("loop.gettingStarted.seen", false);
-pref("loop.gettingStarted.url", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/hello/start/");
-pref("loop.gettingStarted.resumeOnFirstJoin", false);
-pref("loop.learnMoreUrl", "https://www.firefox.com/hello/");
-pref("loop.legal.ToS_url", "https://www.mozilla.org/about/legal/terms/firefox-hello/");
-pref("loop.legal.privacy_url", "https://www.mozilla.org/privacy/firefox-hello/");
-pref("loop.do_not_disturb", false);
-pref("loop.ringtone", "chrome://browser/content/loop/shared/sounds/ringtone.ogg");
-pref("loop.retry_delay.start", 60000);
-pref("loop.retry_delay.limit", 300000);
-pref("loop.ping.interval", 1800000);
-pref("loop.ping.timeout", 10000);
-pref("loop.feedback.baseUrl", "https://input.mozilla.org/api/v1/feedback");
-pref("loop.feedback.product", "Loop");
-pref("loop.debug.loglevel", "Error");
-pref("loop.debug.dispatcher", false);
-pref("loop.debug.sdk", false);
-pref("loop.debug.twoWayMediaTelemetry", false);
-pref("loop.feedback.dateLastSeenSec", 0);
-pref("loop.feedback.periodSec", 15770000); // 6 months.
-pref("loop.feedback.formURL", "https://www.mozilla.org/firefox/hello/npssurvey/");
-pref("loop.feedback.manualFormURL", "https://www.mozilla.org/firefox/hello/feedbacksurvey/");
-#ifdef DEBUG
-pref("loop.CSP", "default-src 'self' about: file: chrome: http://localhost:*; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net http://localhost:* ws://localhost:*; media-src blob:");
-#else
-pref("loop.CSP", "default-src 'self' about: file: chrome:; img-src * data:; font-src 'none'; connect-src wss://*.tokbox.com https://*.opentok.com https://*.tokbox.com wss://*.mozilla.com https://*.mozilla.org wss://*.mozaws.net; media-src blob:");
-#endif
-pref("loop.fxa_oauth.tokendata", "");
-pref("loop.fxa_oauth.profile", "");
-pref("loop.support_url", "https://support.mozilla.org/kb/group-conversations-firefox-hello-webrtc");
-pref("loop.browserSharing.showInfoBar", true);
-
 pref("social.sidebar.unload_timeout_ms", 10000);
 
 // Activation from inside of share panel is possible if activationPanelEnabled
 // is true. Pref'd off for release while usage testing is done through beta.
 pref("social.share.activationPanelEnabled", true);
 pref("social.shareDirectory", "https://activations.cdn.mozilla.net/sharePanel.html");
 
 pref("dom.identity.enabled", false);
@@ -1477,24 +1437,24 @@ pref("network.disable.ipc.security", tru
 
 // CustomizableUI debug logging.
 pref("browser.uiCustomization.debug", false);
 
 // CustomizableUI state of the browser's user interface
 pref("browser.uiCustomization.state", "");
 
 // The remote content URL shown for FxA signup. Must use HTTPS.
-pref("identity.fxaccounts.remote.signup.uri", "https://accounts.firefox.com/signup?service=sync&context=fx_desktop_v1");
+pref("identity.fxaccounts.remote.signup.uri", "https://accounts.firefox.com/signup?service=sync&context=fx_desktop_v2");
 
 // The URL where remote content that forces re-authentication for Firefox Accounts
 // should be fetched.  Must use HTTPS.
-pref("identity.fxaccounts.remote.force_auth.uri", "https://accounts.firefox.com/force_auth?service=sync&context=fx_desktop_v1");
+pref("identity.fxaccounts.remote.force_auth.uri", "https://accounts.firefox.com/force_auth?service=sync&context=fx_desktop_v2");
 
 // The remote content URL shown for signin in. Must use HTTPS.
-pref("identity.fxaccounts.remote.signin.uri", "https://accounts.firefox.com/signin?service=sync&context=fx_desktop_v1");
+pref("identity.fxaccounts.remote.signin.uri", "https://accounts.firefox.com/signin?service=sync&context=fx_desktop_v2");
 
 // The remote content URL where FxAccountsWebChannel messages originate.
 pref("identity.fxaccounts.remote.webchannel.uri", "https://accounts.firefox.com/");
 
 // The URL we take the user to when they opt to "manage" their Firefox Account.
 // Note that this will always need to be in the same TLD as the
 // "identity.fxaccounts.remote.signup.uri" pref.
 pref("identity.fxaccounts.settings.uri", "https://accounts.firefox.com/settings");
@@ -1665,9 +1625,9 @@ pref("dom.serviceWorkers.openWindow.enab
 // If you change this, ENSURE IT IS THE SAME SIZE SET
 // by about:newtab. These values are in CSS pixels.
 pref("toolkit.pageThumbs.minWidth", 280);
 pref("toolkit.pageThumbs.minHeight", 190);
 
 #ifdef NIGHTLY_BUILD
 // Enable speech synthesis, only Nightly for now
 pref("media.webspeech.synth.enabled", true);
-#endif
\ No newline at end of file
+#endif
--- a/browser/base/content/aboutNetError.xhtml
+++ b/browser/base/content/aboutNetError.xhtml
@@ -418,16 +418,17 @@
         <h1 id="et_proxyResolveFailure">&proxyResolveFailure.title;</h1>
         <h1 id="et_proxyConnectFailure">&proxyConnectFailure.title;</h1>
         <h1 id="et_contentEncodingError">&contentEncodingError.title;</h1>
         <h1 id="et_unsafeContentType">&unsafeContentType.title;</h1>
         <h1 id="et_nssFailure2">&nssFailure2.title;</h1>
         <h1 id="et_nssBadCert">&nssBadCert.title;</h1>
         <h1 id="et_malwareBlocked">&malwareBlocked.title;</h1>
         <h1 id="et_unwantedBlocked">&unwantedBlocked.title;</h1>
+        <h1 id="et_forbiddenBlocked">&forbiddenBlocked.title;</h1>
         <h1 id="et_cspBlocked">&cspBlocked.title;</h1>
         <h1 id="et_remoteXUL">&remoteXUL.title;</h1>
         <h1 id="et_corruptedContentError">&corruptedContentError.title;</h1>
         <h1 id="et_sslv3Used">&sslv3Used.title;</h1>
         <h1 id="et_weakCryptoUsed">&weakCryptoUsed.title;</h1>
       </div>
       <div id="errorDescriptionsContainer">
         <div id="ed_generic">&generic.longDesc;</div>
@@ -447,16 +448,17 @@
         <div id="ed_proxyResolveFailure">&proxyResolveFailure.longDesc;</div>
         <div id="ed_proxyConnectFailure">&proxyConnectFailure.longDesc;</div>
         <div id="ed_contentEncodingError">&contentEncodingError.longDesc;</div>
         <div id="ed_unsafeContentType">&unsafeContentType.longDesc;</div>
         <div id="ed_nssFailure2">&nssFailure2.longDesc2;</div>
         <div id="ed_nssBadCert">&nssBadCert.longDesc2;</div>
         <div id="ed_malwareBlocked">&malwareBlocked.longDesc;</div>
         <div id="ed_unwantedBlocked">&unwantedBlocked.longDesc;</div>
+        <div id="ed_forbiddenBlocked">&forbiddenBlocked.longDesc;</div>
         <div id="ed_cspBlocked">&cspBlocked.longDesc;</div>
         <div id="ed_remoteXUL">&remoteXUL.longDesc;</div>
         <div id="ed_corruptedContentError">&corruptedContentError.longDesc;</div>
         <div id="ed_sslv3Used">&sslv3Used.longDesc;</div>
         <div id="learn_more_ssl3">&sslv3Used.learnMore;</div>
         <div id="ed_weakCryptoUsed">&weakCryptoUsed.longDesc;</div>
         <div id="learn_more_weak_crypto">&weakCryptoUsed.learnMore;</div>
       </div>
--- a/browser/base/content/aboutTabCrashed.js
+++ b/browser/base/content/aboutTabCrashed.js
@@ -1,97 +1,258 @@
 /* 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/. */
 
-function parseQueryString() {
-  let URL = document.documentURI;
-  let queryString = URL.replace(/^about:tabcrashed?e=tabcrashed/, "");
+var AboutTabCrashed = {
+  /**
+   * This can be set to true once this page receives a message from the
+   * parent saying whether or not a crash report is available.
+   */
+  hasReport: false,
+
+  /**
+   * The messages that we might receive from the parent.
+   */
+  MESSAGES: [
+    "SetCrashReportAvailable",
+    "CrashReportSent",
+    "UpdateCount",
+  ],
+
+  /**
+   * Items for which we will listen for click events.
+   */
+  CLICK_TARGETS: [
+    "closeTab",
+    "restoreTab",
+    "restoreAll",
+    "sendReport",
+  ],
 
-  let titleMatch = queryString.match(/d=([^&]*)/);
-  let URLMatch = queryString.match(/u=([^&]*)/);
-  return {
-    title: titleMatch && titleMatch[1] ? decodeURIComponent(titleMatch[1]) : "",
-    URL: URLMatch && URLMatch[1] ? decodeURIComponent(URLMatch[1]) : "",
-  };
-}
+  /**
+   * Returns information about this crashed tab.
+   *
+   * @return (Object) An object with the following properties:
+   *           title (String):
+   *             The title of the page that crashed.
+   *           URL (String):
+   *             The URL of the page that crashed.
+   */
+  get pageData() {
+    delete this.pageData;
+
+    let URL = document.documentURI;
+    let queryString = URL.replace(/^about:tabcrashed?e=tabcrashed/, "");
 
-function displayUI() {
-  if (!hasReport()) {
-    return;
-  }
+    let titleMatch = queryString.match(/d=([^&]*)/);
+    let URLMatch = queryString.match(/u=([^&]*)/);
+
+    return this.pageData = {
+      title: titleMatch && titleMatch[1] ? decodeURIComponent(titleMatch[1]) : "",
+      URL: URLMatch && URLMatch[1] ? decodeURIComponent(URLMatch[1]) : "",
+    };
+  },
+
+  init() {
+    this.MESSAGES.forEach((msg) => addMessageListener(msg, this.receiveMessage.bind(this)));
+    addEventListener("DOMContentLoaded", this);
+
+    document.title = this.pageData.title;
+  },
 
-  let sendCrashReport = document.getElementById("sendReport").checked;
-  let container = document.getElementById("crash-reporter-container");
-  container.hidden = !sendCrashReport;
-}
-
-function hasReport() {
-  return document.documentElement.classList.contains("crashDumpAvailable");
-}
+  receiveMessage(message) {
+    switch(message.name) {
+      case "UpdateCount": {
+        this.showRestoreAll(message.data.count > 1);
+        break;
+      }
+      case "SetCrashReportAvailable": {
+        this.onSetCrashReportAvailable(message);
+        break;
+      }
+      case "CrashReportSent": {
+        this.onCrashReportSent();
+        break;
+      }
+    }
+  },
 
-function sendEvent(message) {
-  let comments = "";
-  let email = "";
-  let URL = "";
-  let sendCrashReport = false;
-  let emailMe = false;
-  let includeURL = false;
+  handleEvent(event) {
+    switch (event.type) {
+      case "DOMContentLoaded": {
+        this.onDOMContentLoaded();
+        break;
+      }
+      case "click": {
+        this.onClick(event);
+        break;
+      }
+    }
+  },
+
+  onDOMContentLoaded() {
+    this.CLICK_TARGETS.forEach((targetID) => {
+      let el = document.getElementById(targetID);
+      el.addEventListener("click", this);
+    });
 
-  if (hasReport()) {
-    sendCrashReport = document.getElementById("sendReport").checked;
-    if (sendCrashReport) {
-      comments = document.getElementById("comments").value.trim();
+    // Error pages are loaded as LOAD_BACKGROUND, so they don't get load events.
+    let event = new CustomEvent("AboutTabCrashedLoad", {bubbles:true});
+    document.dispatchEvent(event);
+
+    sendAsyncMessage("Load");
+  },
 
-      includeURL = document.getElementById("includeURL").checked;
-      if (includeURL) {
-        URL = parseQueryString().URL.trim();
+  onClick(event) {
+    switch(event.target.id) {
+      case "closeTab": {
+        this.sendMessage("closeTab");
+        break;
+      }
+
+      case "restoreTab": {
+        this.sendMessage("restoreTab");
+        break;
+      }
+
+      case "restoreAll": {
+        this.sendMessage("restoreAll");
+        break;
       }
 
-      emailMe = document.getElementById("emailMe").checked;
-      if (emailMe) {
-        email = document.getElementById("email").value.trim();
+      case "sendReport": {
+        this.showCrashReportUI(event.target.checked);
+        break;
+      }
+    }
+  },
+
+  /**
+   * After this page tells the parent that it has loaded, the parent
+   * will respond with whether or not a crash report is available. This
+   * method handles that message.
+   *
+   * @param message
+   *        The message from the parent, which should contain a data
+   *        Object property with the following properties:
+   *
+   *        hasReport (bool):
+   *          Whether or not there is a crash report
+   *
+   *        sendReport (bool):
+   *          Whether or not the the user prefers to send the report
+   *          by default
+   *
+   *        includeURL (bool):
+   *          Whether or not the user prefers to send the URL of
+   *          the tab that crashed.
+   *
+   *        emailMe (bool):
+   *          Whether or not to send the email address of the user
+   *          in the report.
+   *
+   *        email (String):
+   *          The email address of the user (empty if emailMe is false)
+   *
+   */
+  onSetCrashReportAvailable(message) {
+    if (message.data.hasReport) {
+      this.hasReport = true;
+      document.documentElement.classList.add("crashDumpAvailable");
+
+      let data = message.data;
+      document.getElementById("sendReport").checked = data.sendReport;
+      document.getElementById("includeURL").checked = data.includeURL;
+      document.getElementById("emailMe").checked = data.emailMe;
+      if (data.emailMe) {
+        document.getElementById("email").value = data.email;
       }
     }
-  }
+
+    let event = new CustomEvent("AboutTabCrashedReady", {bubbles:true});
+    document.dispatchEvent(event);
+  },
+
+  /**
+   * Handler for when the parent reports that the crash report associated
+   * with this about:tabcrashed page has been sent.
+   */
+  onCrashReportSent() {
+    document.documentElement.classList.remove("crashDumpAvailable");
+    document.documentElement.classList.add("crashDumpSubmitted");
+  },
+
+  /**
+   * Toggles the display of the crash report form.
+   *
+   * @param shouldShow (bool)
+   *        True if the crash report form should be shown
+   */
+  showCrashReportUI(shouldShow) {
+    let container = document.getElementById("crash-reporter-container");
+    container.hidden = !shouldShow;
+  },
 
-  let event = new CustomEvent("AboutTabCrashedMessage", {
-    bubbles: true,
-    detail: {
-      message,
-      sendCrashReport,
+  /**
+   * Toggles the display of the "Restore All" button.
+   *
+   * @param shouldShow (bool)
+   *        True if the "Restore All" button should be shown
+   */
+  showRestoreAll(shouldShow) {
+    let restoreAll = document.getElementById("restoreAll");
+    let restoreTab = document.getElementById("restoreTab");
+    if (shouldShow) {
+      restoreAll.removeAttribute("hidden");
+      restoreTab.classList.remove("primary");
+    } else {
+      restoreAll.setAttribute("hidden", true);
+      restoreTab.classList.add("primary");
+    }
+  },
+
+  /**
+   * Sends a message to the parent in response to the user choosing
+   * one of the actions available on the page. This might also send up
+   * crash report information if the user has chosen to submit a crash
+   * report.
+   *
+   * @param messageName (String)
+   *        The message to send to the parent
+   */
+  sendMessage(messageName) {
+    let comments = "";
+    let email = "";
+    let URL = "";
+    let sendReport = false;
+    let emailMe = false;
+    let includeURL = false;
+
+    if (this.hasReport) {
+      sendReport = document.getElementById("sendReport").checked;
+      if (sendReport) {
+        comments = document.getElementById("comments").value.trim();
+
+        includeURL = document.getElementById("includeURL").checked;
+        if (includeURL) {
+          URL = this.pageData.URL.trim();
+        }
+
+        emailMe = document.getElementById("emailMe").checked;
+        if (emailMe) {
+          email = document.getElementById("email").value.trim();
+        }
+      }
+    }
+
+    sendAsyncMessage(messageName, {
+      sendReport,
       comments,
       email,
       emailMe,
       includeURL,
       URL,
-    },
-  });
-
-  document.dispatchEvent(event);
-}
-
-function closeTab() {
-  sendEvent("closeTab");
-}
-
-function restoreTab() {
-  sendEvent("restoreTab");
-}
+    });
+  },
+};
 
-function restoreAll() {
-  sendEvent("restoreAll");
-}
-
-document.title = parseQueryString().title;
-
-// Error pages are loaded as LOAD_BACKGROUND, so they don't get load events.
-var event = new CustomEvent("AboutTabCrashedLoad", {bubbles:true});
-document.dispatchEvent(event);
-
-addEventListener("DOMContentLoaded", function() {
-  let sendReport = document.getElementById("sendReport");
-  sendReport.addEventListener("click", function() {
-    displayUI();
-  });
-
-  displayUI();
-});
+AboutTabCrashed.init();
\ No newline at end of file
--- a/browser/base/content/aboutTabCrashed.xhtml
+++ b/browser/base/content/aboutTabCrashed.xhtml
@@ -53,19 +53,19 @@
 
           <input type="text" id="email" placeholder="&tabCrashed.emailPlaceholder;"/>
         </div>
       </div>
 
       <p id="reportSent">&tabCrashed.reportSent;</p>
 
       <div class="button-container">
-        <button id="closeTab" onclick="closeTab()">
+        <button id="closeTab">
           &tabCrashed.closeTab;</button>
-        <button id="restoreTab" onclick="restoreTab()">
+        <button id="restoreTab">
           &tabCrashed.restoreTab;</button>
-        <button id="restoreAll" onclick="restoreAll()" autofocus="true" class="primary">
+        <button id="restoreAll" autofocus="true" class="primary">
           &tabCrashed.restoreAll;</button>
       </div>
     </div>
   </body>
   <script type="text/javascript;version=1.8" src="chrome://browser/content/aboutTabCrashed.js"/>
 </html>
--- a/browser/base/content/blockedSite.xhtml
+++ b/browser/base/content/blockedSite.xhtml
@@ -17,18 +17,19 @@
 
 <html xmlns="http://www.w3.org/1999/xhtml" class="blacklist">
   <head>
     <link rel="stylesheet" href="chrome://global/skin/netError.css" type="text/css" media="all" />
     <link rel="icon" type="image/png" id="favicon" href="chrome://global/skin/icons/blacklist_favicon.png"/>
 
     <script type="application/javascript"><![CDATA[
       // Error url MUST be formatted like this:
-      //   about:blocked?e=error_code&u=url
-      
+      //   about:blocked?e=error_code&u=url(&o=1)?
+      //     (o=1 when user overrides are allowed)
+
       // Note that this file uses document.documentURI to get
       // the URL (with the format from above). This is because
       // document.location.href gets the current URI off the docshell,
       // which is the URL displayed in the location bar, i.e.
       // the URI that the user attempted to load.
 
       function getErrorCode()
       {
@@ -50,134 +51,117 @@
 
         url = decodeURIComponent(match[1]);
 
         // If this is a view-source page, then get then real URI of the page
         if (url.startsWith("view-source:"))
           url = url.slice(12);
         return url;
       }
-      
+
+      /**
+       * Check whether this warning page should be overridable or whether
+       * the "ignore warning" button should be hidden.
+       */
+      function getOverride()
+      {
+        var url = document.documentURI;
+        var match = url.match(/&o=1&/);
+        return !!match;
+      }
+
       /**
        * Attempt to get the hostname via document.location.  Fail back
        * to getURL so that we always return something meaningful.
        */
       function getHostString()
       {
         try {
           return document.location.hostname;
         } catch (e) {
           return getURL();
         }
       }
-      
+
       function initPage()
       {
-        // Handoff to the appropriate initializer, based on error code
+        var error = "";
         switch (getErrorCode()) {
           case "malwareBlocked" :
-            initPage_malware();
+            error = "malware";
             break;
           case "phishingBlocked" :
-            initPage_phishing();
+            error = "phishing";
             break;
           case "unwantedBlocked" :
-            initPage_unwanted();
+            error = "unwanted";
             break;
+          case "forbiddenBlocked" :
+            error = "forbidden";
+            break;
+          default:
+            return;
         }
-      }        
-      
-      /**
-       * Initialize custom strings and functionality for blocked malware case
-       */
-      function initPage_malware()
-      {
-        // Remove phishing and unwanted strings
-        var el = document.getElementById("errorTitleText_phishing");
-        el.parentNode.removeChild(el);
+
+        var el;
+
+        if (error !== "malware") {
+          el = document.getElementById("errorTitleText_malware");
+          el.parentNode.removeChild(el);
+          el = document.getElementById("errorShortDescText_malware");
+          el.parentNode.removeChild(el);
+          el = document.getElementById("errorLongDescText_malware");
+          el.parentNode.removeChild(el);
+        }
 
-        el = document.getElementById("errorShortDescText_phishing");
-        el.parentNode.removeChild(el);
-
-        el = document.getElementById("errorLongDescText_phishing");
-        el.parentNode.removeChild(el);
+        if (error !== "phishing") {
+          el = document.getElementById("errorTitleText_phishing");
+          el.parentNode.removeChild(el);
+          el = document.getElementById("errorShortDescText_phishing");
+          el.parentNode.removeChild(el);
+          el = document.getElementById("errorLongDescText_phishing");
+          el.parentNode.removeChild(el);
+        }
 
-        el = document.getElementById("errorTitleText_unwanted");
-        el.parentNode.removeChild(el);
+        if (error !== "unwanted") {
+          el = document.getElementById("errorTitleText_unwanted");
+          el.parentNode.removeChild(el);
+          el = document.getElementById("errorShortDescText_unwanted");
+          el.parentNode.removeChild(el);
+          el = document.getElementById("errorLongDescText_unwanted");
+          el.parentNode.removeChild(el);
+        }
 
-        el = document.getElementById("errorShortDescText_unwanted");
-        el.parentNode.removeChild(el);
-
-        el = document.getElementById("errorLongDescText_unwanted");
-        el.parentNode.removeChild(el);
+        if (error !== "forbidden") {
+          el = document.getElementById("errorTitleText_forbidden");
+          el.parentNode.removeChild(el);
+          el = document.getElementById("errorShortDescText_forbidden");
+          el.parentNode.removeChild(el);
+        } else {
+          el = document.getElementById("ignoreWarningButton");
+          el.parentNode.removeChild(el);
+          el = document.getElementById("reportButton");
+          el.parentNode.removeChild(el);
+        }
 
         // Set sitename
-        document.getElementById("malware_sitename").textContent = getHostString();
-        document.title = document.getElementById("errorTitleText_malware")
+        document.getElementById(error + "_sitename").textContent = getHostString();
+        document.title = document.getElementById("errorTitleText_" + error)
                                  .innerHTML;
-      }
-      
-      /**
-       * Initialize custom strings and functionality for blocked malware case
-       */
-      function initPage_unwanted()
-      {
-        // Remove phishing and malware strings
-        var el = document.getElementById("errorTitleText_phishing");
-        el.parentNode.removeChild(el);
-
-        el = document.getElementById("errorShortDescText_phishing");
-        el.parentNode.removeChild(el);
-
-        el = document.getElementById("errorLongDescText_phishing");
-        el.parentNode.removeChild(el);
-
-        el = document.getElementById("errorTitleText_malware");
-        el.parentNode.removeChild(el);
-
-        el = document.getElementById("errorShortDescText_malware");
-        el.parentNode.removeChild(el);
-
-        el = document.getElementById("errorLongDescText_malware");
-        el.parentNode.removeChild(el);
 
-        // Set sitename
-        document.getElementById("unwanted_sitename").textContent = getHostString();
-        document.title = document.getElementById("errorTitleText_unwanted")
-                                 .innerHTML;
-      }
-      
-      /**
-       * Initialize custom strings and functionality for blocked phishing case
-       */
-      function initPage_phishing()
-      {
-        // Remove malware and unwanted strings
-        var el = document.getElementById("errorTitleText_malware");
-        el.parentNode.removeChild(el);
+        if (!getOverride()) {
+          var btn = document.getElementById("ignoreWarningButton");
+          if (btn) {
+            btn.parentNode.removeChild(btn);
+          }
+        }
 
-        el = document.getElementById("errorShortDescText_malware");
-        el.parentNode.removeChild(el);
-
-        el = document.getElementById("errorLongDescText_malware");
-        el.parentNode.removeChild(el);
-
-        el = document.getElementById("errorTitleText_unwanted");
-        el.parentNode.removeChild(el);
-
-        el = document.getElementById("errorShortDescText_unwanted");
-        el.parentNode.removeChild(el);
-
-        el = document.getElementById("errorLongDescText_unwanted");
-        el.parentNode.removeChild(el);
-
-        // Set sitename
-        document.getElementById("phishing_sitename").textContent = getHostString();
-        document.title = document.getElementById("errorTitleText_phishing")
-                                 .innerHTML;
+        // Inform the test harness that we're done loading the page
+        var event = new CustomEvent("AboutBlockedLoaded");
+        document.dispatchEvent(event);
       }
     ]]></script>
     <style type="text/css">
       /* Style warning button to look like a small text link in the
          bottom right. This is preferable to just using a text link
          since there is already a mechanism in browser.js for trapping
          oncommand events from unprivileged chrome pages (BrowserOnCommand).*/
       #ignoreWarningButton {
@@ -208,25 +192,27 @@
   <body dir="&locale.dir;">
     <div id="errorPageContainer">
     
       <!-- Error Title -->
       <div id="errorTitle">
         <h1 id="errorTitleText_phishing">&safeb.blocked.phishingPage.title;</h1>
         <h1 id="errorTitleText_malware">&safeb.blocked.malwarePage.title;</h1>
         <h1 id="errorTitleText_unwanted">&safeb.blocked.unwantedPage.title;</h1>
+        <h1 id="errorTitleText_forbidden">&safeb.blocked.forbiddenPage.title;</h1>
       </div>
       
       <div id="errorLongContent">
       
         <!-- Short Description -->
         <div id="errorShortDesc">
           <p id="errorShortDescText_phishing">&safeb.blocked.phishingPage.shortDesc;</p>
           <p id="errorShortDescText_malware">&safeb.blocked.malwarePage.shortDesc;</p>
           <p id="errorShortDescText_unwanted">&safeb.blocked.unwantedPage.shortDesc;</p>
+          <p id="errorShortDescText_forbidden">&safeb.blocked.forbiddenPage.shortDesc;</p>
         </div>
 
         <!-- Long Description -->
         <div id="errorLongDesc">
           <p id="errorLongDescText_phishing">&safeb.blocked.phishingPage.longDesc;</p>
           <p id="errorLongDescText_malware">&safeb.blocked.malwarePage.longDesc;</p>
           <p id="errorLongDescText_unwanted">&safeb.blocked.unwantedPage.longDesc;</p>
         </div>
--- a/browser/base/content/browser-gestureSupport.js
+++ b/browser/base/content/browser-gestureSupport.js
@@ -641,38 +641,43 @@ var gHistorySwipeAnimation = {
       // from 0.
       if (this._direction == "horizontal" || this._lastSwipeDir != "") {
         gBrowser.stop();
         this._lastSwipeDir = "RELOAD"; // just ensure that != ""
         this._canGoBack = this.canGoBack();
         this._canGoForward = this.canGoForward();
         this._handleFastSwiping();
       }
+      this.updateAnimation(0);
     }
     else {
-      this._startingIndex = gBrowser.webNavigation.sessionHistory.index;
-      this._historyIndex = this._startingIndex;
-      this._canGoBack = this.canGoBack();
-      this._canGoForward = this.canGoForward();
-      if (this.active) {
-        this._addBoxes();
-        this._takeSnapshot();
-        this._installPrevAndNextSnapshots();
-        this._lastSwipeDir = "";
+      // Get the session history from SessionStore.
+      let updateSessionHistory = sessionHistory => {
+        this._startingIndex = sessionHistory.index;
+        this._historyIndex = this._startingIndex;
+        this._canGoBack = this.canGoBack();
+        this._canGoForward = this.canGoForward();
+        if (this.active) {
+          this._addBoxes();
+          this._takeSnapshot();
+          this._installPrevAndNextSnapshots();
+          this._lastSwipeDir = "";
+        }
+        this.updateAnimation(0);
       }
+      SessionStore.getSessionHistory(gBrowser.selectedTab, updateSessionHistory);
     }
-    this.updateAnimation(0);
   },
 
   /**
    * Stops the swipe animation.
    */
   stopAnimation: function HSA_stopAnimation() {
     gHistorySwipeAnimation._removeBoxes();
-    this._historyIndex = gBrowser.webNavigation.sessionHistory.index;
+    this._historyIndex = this._getCurrentHistoryIndex();
   },
 
   /**
    * Updates the animation between two pages in history.
    *
    * @param aVal
    *        A floating point value that represents the progress of the
    *        swipe gesture.
@@ -721,16 +726,20 @@ var gHistorySwipeAnimation = {
         this._positionBox(this._nextBox, offset + aVal);
       } else {
         this._prevBox.collapsed = true;
         this._positionBox(this._curBox, aVal / dampValue);
       }
     }
   },
 
+  _getCurrentHistoryIndex: function() {
+    return SessionStore.getSessionHistory(gBrowser.selectedTab).index;
+  },
+
   /**
    * Event handler for events relevant to the history swipe animation.
    *
    * @param aEvent
    *        An event to process.
    */
   handleEvent: function HSA_handleEvent(aEvent) {
     let browser = gBrowser.selectedBrowser;
@@ -816,32 +825,36 @@ var gHistorySwipeAnimation = {
   },
 
   /**
    * Used to notify the history swipe animation that the OS sent a swipe end
    * event and that we should navigate to the page that the user swiped to, if
    * any. This will also result in the animation overlay to be torn down.
    */
   swipeEndEventReceived: function HSA_swipeEndEventReceived() {
-    if (this._lastSwipeDir != "" && this._historyIndex != this._startingIndex)
-      this._navigateToHistoryIndex();
-    else
-      this.stopAnimation();
+    // Update the session history before continuing.
+    let updateSessionHistory = sessionHistory => {
+      if (this._lastSwipeDir != "" && this._historyIndex != this._startingIndex)
+        this._navigateToHistoryIndex();
+      else
+        this.stopAnimation();
+    }
+    SessionStore.getSessionHistory(gBrowser.selectedTab, updateSessionHistory);
   },
 
   /**
    * Checks whether a particular index exists in the browser history or not.
    *
    * @param aIndex
    *        The index to check for availability for in the history.
    * @return true if the index exists in the browser history, false otherwise.
    */
   _doesIndexExistInHistory: function HSA__doesIndexExistInHistory(aIndex) {
     try {
-      gBrowser.webNavigation.sessionHistory.getEntryAtIndex(aIndex, false);
+      return SessionStore.getSessionHistory(gBrowser.selectedTab).entries[aIndex] != null;
     }
     catch(ex) {
       return false;
     }
     return true;
   },
 
   /**
@@ -954,21 +967,17 @@ var gHistorySwipeAnimation = {
 
   /**
    * Verifies that we're ready to take snapshots based on the global pref and
    * the current index in history.
    *
    * @return true if we're ready to take snapshots, false otherwise.
    */
   _readyToTakeSnapshots: function HSA__readyToTakeSnapshots() {
-    if ((this._maxSnapshots < 1) ||
-        (gBrowser.webNavigation.sessionHistory.index < 0)) {
-      return false;
-    }
-    return true;
+    return (this._maxSnapshots >= 1 && this._getCurrentHistoryIndex() >= 0);
   },
 
   /**
    * Takes a snapshot of the page the browser is currently on.
    */
   _takeSnapshot: function HSA__takeSnapshot() {
     if (!this._readyToTakeSnapshots()) {
       return;
@@ -1021,17 +1030,17 @@ var gHistorySwipeAnimation = {
    * snapshot in the list.
    *
    * @param aCanvas
    *        The snapshot to add to the list and compress.
    */
   _assignSnapshotToCurrentBrowser:
   function HSA__assignSnapshotToCurrentBrowser(aCanvas) {
     let browser = gBrowser.selectedBrowser;
-    let currIndex = browser.webNavigation.sessionHistory.index;
+    let currIndex = this._getCurrentHistoryIndex();
 
     this._removeTrackedSnapshot(currIndex, browser);
     this._addSnapshotRefToArray(currIndex, browser);
 
     if (!("snapshots" in browser))
       browser.snapshots = [];
     let snapshots = browser.snapshots;
     // Temporarily store the canvas as the compressed snapshot.
@@ -1054,17 +1063,17 @@ var gHistorySwipeAnimation = {
       // there's nothing to compress.
       return;
     }
 
     TelemetryStopwatch.start("FX_GESTURE_COMPRESS_SNAPSHOT_OF_PAGE");
     try {
       let browser = gBrowser.selectedBrowser;
       let snapshots = browser.snapshots;
-      let currIndex = browser.webNavigation.sessionHistory.index;
+      let currIndex = _getCurrentHistoryIndex();
 
       // Kick off snapshot compression.
       let canvas = snapshots[currIndex].image;
       canvas.toBlob(function(aBlob) {
           if (snapshots[currIndex]) {
             snapshots[currIndex].image = aBlob;
           }
         }, "image/png"
deleted file mode 100644
--- a/browser/base/content/browser-loop.js
+++ /dev/null
@@ -1,612 +0,0 @@
-// This Source Code Form is subject to the terms of the Mozilla Public
-// License, v. 2.0. If a copy of the MPL was not distributed with this
-// file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-// the "exported" symbols
-var LoopUI;
-
-(function() {
-  const kNSXUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
-  const kBrowserSharingNotificationId = "loop-sharing-notification";
-  const kPrefBrowserSharingInfoBar = "browserSharing.showInfoBar";
-
-  LoopUI = {
-    /**
-     * @var {XULWidgetSingleWrapper} toolbarButton Getter for the Loop toolbarbutton
-     *                                             instance for this window.
-     */
-    get toolbarButton() {
-      delete this.toolbarButton;
-      return this.toolbarButton = CustomizableUI.getWidget("loop-button").forWindow(window);
-    },
-
-    /**
-     * @var {XULElement} panel Getter for the Loop panel element.
-     */
-    get panel() {
-      delete this.panel;
-      return this.panel = document.getElementById("loop-notification-panel");
-    },
-
-    /**
-     * @var {XULElement|null} browser Getter for the Loop panel browser element.
-     *                                Will be NULL if the panel hasn't loaded yet.
-     */
-    get browser() {
-      let browser = document.querySelector("#loop-notification-panel > #loop-panel-iframe");
-      if (browser) {
-        delete this.browser;
-        this.browser = browser;
-      }
-      return browser;
-    },
-
-    /**
-     * @var {String|null} selectedTab Getter for the name of the currently selected
-     *                                tab inside the Loop panel. Will be NULL if
-     *