Merge f-t to m-c, a=merge
authorPhil Ringnalda <philringnalda@gmail.com>
Fri, 18 Sep 2015 21:46:16 -0700
changeset 297668 4313752f69956ae248bd4e7ff3913c8dd4252698
parent 297643 9f7b7ab7dc1f3eaf14e35c2d066600520cc9b842 (current diff)
parent 297667 e2df07d3f7eeed73375efe23aca5f56335a575c4 (diff)
child 297669 6049203c2e7bd0a333fb4c3d1cab31c8e2c4cc71
child 297683 07711f754650f049206413f2c7a3f4adc6cc0ab6
child 297688 23b8065ffcbdc153db901e00efb6444b42a4b0e2
child 297713 ba4c3b2bb93503f89a83fd0fb8bf69f78a402d49
push id962
push userjlund@mozilla.com
push dateFri, 04 Dec 2015 23:28:54 +0000
treeherdermozilla-release@23a2d286e80f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone43.0a1
first release with
nightly linux32
4313752f6995 / 43.0a1 / 20150919030207 / files
nightly linux64
4313752f6995 / 43.0a1 / 20150919030207 / files
nightly mac
4313752f6995 / 43.0a1 / 20150919030207 / files
nightly win32
4313752f6995 / 43.0a1 / 20150919030207 / files
nightly win64
4313752f6995 / 43.0a1 / 20150919030207 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge f-t to m-c, a=merge
browser/app/profile/firefox.js
browser/devtools/debugger/content/stores/event-listeners.js
browser/devtools/debugger/content/stores/index.js
browser/devtools/shared/D3_LICENSE
browser/devtools/shared/content/react-dev.js
browser/devtools/shared/content/react.js
browser/devtools/shared/create-dispatcher.js
browser/devtools/shared/d3.js
browser/devtools/shared/fluxify/bindActionCreators.js
browser/devtools/shared/fluxify/dispatcher.js
browser/devtools/shared/fluxify/logMiddleware.js
browser/devtools/shared/fluxify/moz.build
browser/devtools/shared/fluxify/test/unit/head.js
browser/devtools/shared/fluxify/test/unit/stores-for-testing.js
browser/devtools/shared/fluxify/test/unit/test_dispatcher.js
browser/devtools/shared/fluxify/test/unit/test_middlewares.js
browser/devtools/shared/fluxify/test/unit/xpcshell.ini
browser/devtools/shared/fluxify/thunkMiddleware.js
browser/devtools/shared/fluxify/waitUntilService.js
browser/devtools/webaudioeditor/lib/DAGRE_D3_LICENSE
browser/devtools/webaudioeditor/lib/dagre-d3.js
mobile/android/chrome/content/browser.js
mobile/android/themes/core/images/spinning_throbber.svg
toolkit/components/telemetry/Histograms.json
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1874,17 +1874,17 @@ pref("media.gmp-provider.enabled", true)
 
 pref("browser.apps.URL", "https://marketplace.firefox.com/discovery/");
 
 #ifdef NIGHTLY_BUILD
 pref("browser.polaris.enabled", false);
 pref("privacy.trackingprotection.ui.enabled", false);
 #endif
 pref("privacy.trackingprotection.introCount", 0);
-pref("privacy.trackingprotection.introURL", "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/tracking-protection-pbm");
+pref("privacy.trackingprotection.introURL", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/tracking-protection/start/");
 
 #ifndef RELEASE_BUILD
 // At the moment, autostart.2 is used, while autostart.1 is unused.
 // We leave it here set to false to reset users' defaults and allow
 // us to change everybody to true in the future, when desired.
 pref("browser.tabs.remote.autostart.1", false);
 pref("browser.tabs.remote.autostart.2", true);
 #endif
--- a/browser/components/loop/content/js/conversation.js
+++ b/browser/components/loop/content/js/conversation.js
@@ -129,16 +129,19 @@ loop.conversation = (function(mozL10n) {
     var sdkDriver = new loop.OTSdkDriver({
       isDesktop: true,
       useDataChannels: useDataChannels,
       dispatcher: dispatcher,
       sdk: OT,
       mozLoop: navigator.mozLoop
     });
 
+    // expose for functional tests
+    loop.conversation._sdkDriver = sdkDriver;
+
     // Create the stores.
     var conversationAppStore = new loop.store.ConversationAppStore({
       dispatcher: dispatcher,
       mozLoop: navigator.mozLoop
     });
     var conversationStore = new loop.store.ConversationStore(dispatcher, {
       client: client,
       isDesktop: true,
--- a/browser/components/loop/content/js/conversation.jsx
+++ b/browser/components/loop/content/js/conversation.jsx
@@ -129,16 +129,19 @@ loop.conversation = (function(mozL10n) {
     var sdkDriver = new loop.OTSdkDriver({
       isDesktop: true,
       useDataChannels: useDataChannels,
       dispatcher: dispatcher,
       sdk: OT,
       mozLoop: navigator.mozLoop
     });
 
+    // expose for functional tests
+    loop.conversation._sdkDriver = sdkDriver;
+
     // Create the stores.
     var conversationAppStore = new loop.store.ConversationAppStore({
       dispatcher: dispatcher,
       mozLoop: navigator.mozLoop
     });
     var conversationStore = new loop.store.ConversationStore(dispatcher, {
       client: client,
       isDesktop: true,
--- a/browser/components/loop/content/shared/css/conversation.css
+++ b/browser/components/loop/content/shared/css/conversation.css
@@ -452,25 +452,45 @@ html[dir="rtl"] .room-failure > .setting
 }
 
 .conversation-window-dropdown > li {
   padding: .2rem;
   font-size: 1rem;
   white-space: nowrap;
 }
 
+.screen-share-menu.dropdown-menu,
 .settings-menu.dropdown-menu {
   left: auto;
   bottom: 3.1rem;
+}
+
+.screen-share-menu.dropdown-menu {
+  /*offset dropdown menu to be above menu button*/
+  right: 40px;
+}
+
+.settings-menu.dropdown-menu {
+  /*offset dropdown menu to be above menu button*/
   right: 14px;
 }
 
+html[dir="rtl"] .screen-share-menu.dropdown-menu,
 html[dir="rtl"] .settings-menu.dropdown-menu {
+  right: auto;
+}
+
+html[dir="rtl"] .screen-share-menu.dropdown-menu {
+  /*offset dropdown menu to be above menu button*/
+  left: 40px;
+}
+
+html[dir="rtl"] .settings-menu.dropdown-menu {
+  /*offset dropdown menu to be above menu button*/
   left: 14px;
-  right: auto;
 }
 
 .settings-menu.dropdown-menu.menu-below {
   top: 11.5rem;
   bottom: auto;
 }
 
 /* Expired call url page */
--- a/browser/components/loop/content/shared/js/views.js
+++ b/browser/components/loop/content/shared/js/views.js
@@ -145,35 +145,35 @@ loop.shared.views = (function(_, mozL10n
         "btn": true,
         "btn-screen-share": true,
         "transparent-button": true,
         "menu-showing": this.state.showMenu,
         "active": isActive,
         "disabled": this.props.state === SCREEN_SHARE_STATES.PENDING
       });
       var dropdownMenuClasses = cx({
-        "native-dropdown-menu": true,
-        "conversation-window-dropdown": true,
-        "hide": !this.state.showMenu,
-        "visually-hidden": true
+        "screen-share-menu": true,
+        "dropdown-menu": true,
+        "hide": !this.state.showMenu
       });
       var windowSharingClasses = cx({
+        "dropdown-menu-item": true,
         "disabled": this.state.windowSharingDisabled
       });
 
       return (
         React.createElement("div", null, 
           React.createElement("button", {className: screenShareClasses, 
                   onClick: this.handleClick, 
                   ref: "menu-button", 
                   title: this._getTitle()}, 
             isActive ? null : React.createElement("span", {className: "chevron"})
           ), 
           React.createElement("ul", {className: dropdownMenuClasses, ref: "menu"}, 
-            React.createElement("li", {onClick: this._handleShareTabs}, 
+            React.createElement("li", {className: "dropdown-menu-item", onClick: this._handleShareTabs}, 
               mozL10n.get("share_tabs_button_title2")
             ), 
             React.createElement("li", {className: windowSharingClasses, onClick: this._handleShareWindows}, 
               mozL10n.get("share_windows_button_title")
             )
           )
         )
       );
--- a/browser/components/loop/content/shared/js/views.jsx
+++ b/browser/components/loop/content/shared/js/views.jsx
@@ -145,35 +145,35 @@ loop.shared.views = (function(_, mozL10n
         "btn": true,
         "btn-screen-share": true,
         "transparent-button": true,
         "menu-showing": this.state.showMenu,
         "active": isActive,
         "disabled": this.props.state === SCREEN_SHARE_STATES.PENDING
       });
       var dropdownMenuClasses = cx({
-        "native-dropdown-menu": true,
-        "conversation-window-dropdown": true,
-        "hide": !this.state.showMenu,
-        "visually-hidden": true
+        "screen-share-menu": true,
+        "dropdown-menu": true,
+        "hide": !this.state.showMenu
       });
       var windowSharingClasses = cx({
+        "dropdown-menu-item": true,
         "disabled": this.state.windowSharingDisabled
       });
 
       return (
         <div>
           <button className={screenShareClasses}
                   onClick={this.handleClick}
                   ref="menu-button"
                   title={this._getTitle()}>
             {isActive ? null : <span className="chevron"/>}
           </button>
           <ul className={dropdownMenuClasses} ref="menu">
-            <li onClick={this._handleShareTabs}>
+            <li className="dropdown-menu-item" onClick={this._handleShareTabs}>
               {mozL10n.get("share_tabs_button_title2")}
             </li>
             <li className={windowSharingClasses} onClick={this._handleShareWindows}>
               {mozL10n.get("share_windows_button_title")}
             </li>
           </ul>
         </div>
       );
--- a/browser/components/loop/test/shared/views_test.js
+++ b/browser/components/loop/test/shared/views_test.js
@@ -164,79 +164,79 @@ describe("loop.shared.views", function()
         var comp = TestUtils.renderIntoDocument(
           React.createElement(sharedViews.ScreenShareControlButton, {
             dispatcher: dispatcher,
             visible: true,
             state: SCREEN_SHARE_STATES.INACTIVE
           }));
 
         TestUtils.Simulate.click(comp.getDOMNode().querySelector(
-          ".conversation-window-dropdown > li"));
+          ".screen-share-menu > li"));
 
         sinon.assert.calledOnce(dispatcher.dispatch);
         sinon.assert.calledWithExactly(dispatcher.dispatch,
           new sharedActions.StartScreenShare({ type: "browser" }));
       });
 
     it("should dispatch a 'window' StartScreenShare action on option click",
       function() {
         var comp = TestUtils.renderIntoDocument(
           React.createElement(sharedViews.ScreenShareControlButton, {
             dispatcher: dispatcher,
             visible: true,
             state: SCREEN_SHARE_STATES.INACTIVE
           }));
 
         TestUtils.Simulate.click(comp.getDOMNode().querySelector(
-          ".conversation-window-dropdown > li:last-child"));
+          ".screen-share-menu > li:last-child"));
 
         sinon.assert.calledOnce(dispatcher.dispatch);
         sinon.assert.calledWithExactly(dispatcher.dispatch,
           new sharedActions.StartScreenShare({ type: "window" }));
       });
 
     it("should have the 'window' option enabled", function() {
       var comp = TestUtils.renderIntoDocument(
         React.createElement(sharedViews.ScreenShareControlButton, {
           dispatcher: dispatcher,
           visible: true,
           state: SCREEN_SHARE_STATES.INACTIVE
         }));
 
-      var node = comp.getDOMNode().querySelector(".conversation-window-dropdown > li:last-child");
+      var node = comp.getDOMNode().querySelector(".screen-share-menu > li:last-child");
       expect(node.classList.contains("disabled")).eql(false);
     });
 
     it("should disable the 'window' option on Windows XP", function() {
       OS = "win";
       OSVersion = { major: 5, minor: 1 };
 
       var comp = TestUtils.renderIntoDocument(
         React.createElement(sharedViews.ScreenShareControlButton, {
           dispatcher: dispatcher,
           visible: true,
           state: SCREEN_SHARE_STATES.INACTIVE
         }));
 
-      var node = comp.getDOMNode().querySelector(".conversation-window-dropdown > li:last-child");
+      var node = comp.getDOMNode().querySelector(".screen-share-menu > li:last-child");
       expect(node.classList.contains("disabled")).eql(true);
     });
 
     it("should disable the 'window' option on OSX 10.6", function() {
       OS = "mac";
       OSVersion = { major: 10, minor: 6 };
 
       var comp = TestUtils.renderIntoDocument(
         React.createElement(sharedViews.ScreenShareControlButton, {
           dispatcher: dispatcher,
           visible: true,
           state: SCREEN_SHARE_STATES.INACTIVE
         }));
 
-      var node = comp.getDOMNode().querySelector(".conversation-window-dropdown > li:last-child");
+      var node = comp.getDOMNode().querySelector(".screen-share-menu > li:last-child");
       expect(node.classList.contains("disabled")).eql(true);
     });
 
     it("should dispatch a EndScreenShare action on click when the state is active",
       function() {
         var comp = TestUtils.renderIntoDocument(
           React.createElement(sharedViews.ScreenShareControlButton, {
             dispatcher: dispatcher,
--- a/browser/components/search/content/search.xml
+++ b/browser/components/search/content/search.xml
@@ -330,28 +330,34 @@
 
           this.openSuggestionsPanel();
         ]]></body>
       </method>
 
       <method name="handleSearchCommand">
         <parameter name="aEvent"/>
         <parameter name="aEngine"/>
+        <parameter name="aForceNewTab"/>
         <body><![CDATA[
           var textBox = this._textbox;
           var textValue = textBox.value;
 
           var where = "current";
 
           // Open ctrl/cmd clicks on one-off buttons in a new background tab.
           if (aEvent && aEvent.originalTarget.getAttribute("anonid") == "search-go-button") {
             if (aEvent.button == 2)
               return;
             where = whereToOpenLink(aEvent, false, true);
           }
+          else if (aForceNewTab) {
+            where = "tab";
+            if (Services.prefs.getBoolPref("browser.tabs.loadInBackground"))
+              where += "-background";
+          }
           else {
             var newTabPref = Services.prefs.getBoolPref("browser.search.openintab");
             if (((aEvent instanceof KeyboardEvent) && aEvent.altKey) ^ newTabPref)
               where = "tab";
             if ((aEvent instanceof MouseEvent) &&
                 (aEvent.button == 1 || aEvent.getModifierState("Accel"))) {
               where = "tab-background";
             }
@@ -375,16 +381,18 @@
                 source = "oneoff";
               } else if (target.classList.contains("search-panel-header") ||
                          target.parentNode.classList.contains("search-panel-header")) {
                 source = "header";
               }
             } else if (aEvent instanceof XULCommandEvent) {
               if (target.getAttribute("anonid") == "paste-and-search") {
                 source = "paste";
+              } else if (target.getAttribute("anonid") == "search-one-offs-context-open-in-new-tab") {
+                source = "oneoff-context";
               }
             }
 
             if (!aEngine) {
               aEngine = this.currentEngine;
             }
             BrowserSearch.recordOneoffSearchInTelemetry(aEngine, source, type, where);
           }
@@ -1002,17 +1010,17 @@
 
     </handlers>
   </binding>
 
   <binding id="browser-search-autocomplete-result-popup" extends="chrome://browser/content/urlbarBindings.xml#browser-autocomplete-result-popup">
     <resources>
       <stylesheet src="chrome://browser/skin/searchbar.css"/>
     </resources>
-    <content ignorekeys="true" level="top" consumeoutsideclicks="never">
+    <content ignorekeys="true" level="top" consumeoutsideclicks="never" context="_child">
       <xul:hbox anonid="searchbar-engine" xbl:inherits="showonlysettings"
                 class="search-panel-header search-panel-current-engine">
         <xul:image class="searchbar-engine-image" xbl:inherits="src"/>
         <xul:label anonid="searchbar-engine-name" flex="1" crop="end"
                    role="presentation"/>
       </xul:hbox>
       <xul:tree anonid="tree" flex="1"
                 class="autocomplete-tree plain search-panel-tree"
@@ -1044,23 +1052,34 @@
       <xul:description anonid="search-panel-one-offs"
                        role="group"
                        class="search-panel-one-offs"/>
       <xul:vbox anonid="add-engines"/>
       <xul:button anonid="search-settings"
                   oncommand="showSettings();"
                   class="search-setting-button search-panel-header"
                   label="&changeSearchSettings.button;"/>
+      <xul:menupopup anonid="search-one-offs-context-menu">
+        <xul:menuitem anonid="search-one-offs-context-open-in-new-tab"
+                      label="&searchInNewTab.label;"
+                      accesskey="&searchInNewTab.accesskey;"/>
+        <xul:menuitem anonid="search-one-offs-context-set-default"
+                      label="&searchSetAsDefault.label;"
+                      accesskey="&searchSetAsDefault.accesskey;"/>
+      </xul:menupopup>
     </content>
     <implementation>
       <!-- Popup rollup is triggered by native events before the mousedown event
            reaches the DOM. The will be set to true by the popuphiding event and
            false after the mousedown event has been triggered to detect what
            caused rollup. -->
       <field name="_isHiding">false</field>
+      <!-- When a context menu is opened on a one-off button, this is set to the
+           engine of that button for use with the context menu actions. -->
+      <field name="_contextEngine">null</field>
       <field name="_bundle">null</field>
       <property name="bundle" readonly="true">
         <getter>
           <![CDATA[
             if (!this._bundle) {
               const kBundleURI = "chrome://browser/locale/search.properties";
               this._bundle = Services.strings.createBundle(kBundleURI);
             }
@@ -1096,22 +1115,51 @@
         <body><![CDATA[
           BrowserUITelemetry.countSearchSettingsEvent("searchbar");
           openPreferences("paneSearch");
           // If the preference tab was already selected, the panel doesn't
           // close itself automatically.
           BrowserSearch.searchBar._textbox.closePopup();
         ]]></body>
       </method>
+
+      <constructor><![CDATA[
+        // Prevent popup events from the context menu from reaching the autocomplete
+        // binding (or other listeners).
+        let menu = document.getAnonymousElementByAttribute(this, "anonid", "search-one-offs-context-menu");
+        let listener = aEvent => aEvent.stopPropagation();
+        menu.addEventListener("popupshowing", listener);
+        menu.addEventListener("popuphiding", listener);
+        menu.addEventListener("popupshown", aEvent => {
+          this._ignoreMouseEvents = true;
+          aEvent.stopPropagation();
+        });
+        menu.addEventListener("popuphidden", aEvent => {
+          this._ignoreMouseEvents = false;
+          aEvent.stopPropagation();
+        });
+      ]]></constructor>
     </implementation>
     <handlers>
       <handler event="popuphidden"><![CDATA[
         Services.tm.mainThread.dispatch(function() {
           document.getElementById("searchbar").textbox.selectedButton = null;
         }, Ci.nsIThread.DISPATCH_NORMAL);
+        this._contextEngine = null;
+      ]]></handler>
+
+      <handler event="contextmenu"><![CDATA[
+        let target = event.originalTarget;
+        // Prevent the context menu from appearing except on the one off buttons.
+        if (!target.classList.contains("searchbar-engine-one-off-item") ||
+            target.classList.contains("dummy")) {
+          event.preventDefault();
+          return;
+        }
+        this._contextEngine = target.engine;
       ]]></handler>
 
       <handler event="popupshowing"><![CDATA[
         // First handle deciding if we are showing the reduced version of the
         // popup containing only the preferences button. We do this if the
         // glass icon has been clicked if the text field is empty.
         let searchbar = document.getElementById("searchbar");
         let tree = document.getAnonymousElementByAttribute(this, "anonid",
@@ -1316,46 +1364,62 @@
         event.preventDefault();
       ]]></handler>
 
       <handler event="mouseover"><![CDATA[
         let target = event.originalTarget;
         if (target.localName != "button")
           return;
 
+        // Ignore mouse events when the context menu is open.
+         if (this._ignoreMouseEvents)
+           return;
+
         if ((target.classList.contains("searchbar-engine-one-off-item") &&
              !target.classList.contains("dummy")) ||
             target.classList.contains("addengine-item") ||
             target.classList.contains("search-setting-button")) {
           let textbox = document.getElementById("searchbar").textbox;
           textbox.selectedButton = target;
           textbox.selectionFromMouseOver = true;
         }
       ]]></handler>
 
       <handler event="mouseout"><![CDATA[
         let target = event.originalTarget;
         if (target.localName != "button")
           return;
 
+        // Don't deselect the current button if the context menu is open.
+        if (this._ignoreMouseEvents)
+          return;
+
         let textbox = document.getElementById("searchbar").textbox;
         if (textbox.selectedButton == target)
           textbox.selectedButton = null;
       ]]></handler>
 
       <handler event="click"><![CDATA[
         if (event.button == 2)
           return; // ignore right clicks.
 
         let button = event.originalTarget;
         let engine = button.engine || button.parentNode.engine;
 
         if (!engine)
           return;
 
+        // For some reason, if the context menu had been opened prior to the
+        // click, the suggestions popup won't be closed after loading the search
+        // in the current tab - so we hide it manually. Some focusing magic
+        // that happens when a search is loaded ensures that the popup is opened
+        // again if it needs to be, so we don't need to worry about which cases
+        // require manual hiding.
+        this.hidePopup();
+
         let searchbar = document.getElementById("searchbar");
         searchbar.handleSearchCommand(event, engine);
       ]]></handler>
 
       <handler event="command"><![CDATA[
         let target = event.originalTarget;
         if (target.classList.contains("addengine-item")) {
           // On success, hide and reshow the panel to show the new engine.
@@ -1368,16 +1432,39 @@
               Components.utils.reportError("Error adding search engine: " + errorCode);
             }
           }
           Services.search.addEngine(target.getAttribute("uri"),
                                     Ci.nsISearchEngine.DATA_XML,
                                     target.getAttribute("image"), false,
                                     installCallback);
         }
+        let anonid = target.getAttribute("anonid");
+        if (anonid == "search-one-offs-context-open-in-new-tab") {
+          let searchbar = document.getElementById("searchbar");
+          searchbar.handleSearchCommand(event, this._contextEngine, true);
+        }
+        if (anonid == "search-one-offs-context-set-default") {
+          let currentEngine = Services.search.currentEngine;
+
+          // Make the target button of the context menu reflect the current
+          // search engine first. Doing this as opposed to rebuilding all the
+          // one-off buttons avoids flicker.
+          let button = document.getElementById("searchbar-engine-one-off-item-" +
+            this._contextEngine.name.replace(/ /g, '-'));
+          button.id = "searchbar-engine-one-off-item-" + currentEngine.name.replace(/ /g, '-');
+          let uri = "chrome://browser/skin/search-engine-placeholder.png";
+          if (currentEngine.iconURI)
+            uri = PlacesUtils.getImageURLForResolution(window, currentEngine.iconURI.spec);
+          button.setAttribute("image", uri);
+          button.setAttribute("tooltiptext", currentEngine.name);
+          button.engine = currentEngine;
+
+          Services.search.currentEngine = this._contextEngine;
+        }
       ]]></handler>
 
       <handler event="popuphiding"><![CDATA[
         this._isHiding = true;
         setTimeout(() => {
           this._isHiding = false;
         }, 0);
       ]]></handler>
rename from browser/devtools/debugger/content/stores/event-listeners.js
rename to browser/devtools/debugger/content/actions/event-listeners.js
--- a/browser/devtools/debugger/content/stores/event-listeners.js
+++ b/browser/devtools/debugger/content/actions/event-listeners.js
@@ -1,50 +1,22 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
-const constants = require('../constants');
-const promise = require('promise');
-const { rdpInvoke, asPaused } = require('../utils');
+const constants = require("../constants");
+const { rdpInvoke, asPaused } = require("../utils");
 const { reportException } = require("devtools/toolkit/DevToolsUtils");
 
 const FETCH_EVENT_LISTENERS_DELAY = 200; // ms
 
-const initialState = {
-  activeEventNames: [],
-  listeners: [],
-  fetchingListeners: false,
-};
-
-function update(state = initialState, action, emitChange) {
-  switch(action.type) {
-  case constants.UPDATE_EVENT_BREAKPOINTS:
-    state.activeEventNames = action.eventNames;
-    emitChange('activeEventNames', state.activeEventNames);
-    break;
-  case constants.FETCH_EVENT_LISTENERS:
-    if (action.status === "begin") {
-      state.fetchingListeners = true;
-    }
-    else if (action.status === "done") {
-      state.fetchingListeners = false;
-      state.listeners = action.listeners;
-      emitChange('listeners', state.listeners);
-    }
-    break;
-  }
-
-  return state;
-};
-
 function fetchEventListeners() {
   return (dispatch, getState) => {
-    // Make sure we're not sending a batch of closely repeated requests.
+    // Make sure we"re not sending a batch of closely repeated requests.
     // This can easily happen whenever new sources are fetched.
     setNamedTimeout("event-listeners-fetch", FETCH_EVENT_LISTENERS_DELAY, () => {
       // In case there is still a request of listeners going on (it
       // takes several RDP round trips right now), make sure we wait
       // on a currently running request
       if (getState().eventListeners.fetchingListeners) {
         dispatch({
           type: services.WAIT_UNTIL,
@@ -76,31 +48,31 @@ function fetchEventListeners() {
     });
   };
 }
 
 const _getListeners = Task.async(function*() {
   const response = yield rdpInvoke(gThreadClient, gThreadClient.eventListeners);
 
   // Make sure all the listeners are sorted by the event type, since
-  // they're not guaranteed to be clustered together.
+  // they"re not guaranteed to be clustered together.
   response.listeners.sort((a, b) => a.type > b.type ? 1 : -1);
 
   // Add all the listeners in the debugger view event linsteners container.
   let fetchedDefinitions = new Map();
   let listeners = [];
   for (let listener of response.listeners) {
     let definitionSite;
     if (fetchedDefinitions.has(listener.function.actor)) {
       definitionSite = fetchedDefinitions.get(listener.function.actor);
     } else if (listener.function.class == "Function") {
       definitionSite = yield _getDefinitionSite(listener.function);
       if (!definitionSite) {
-        // We don't know where this listener comes from so don't show it in
-        // the UI as breaking on it doesn't work (bug 942899).
+        // We don"t know where this listener comes from so don"t show it in
+        // the UI as breaking on it doesn"t work (bug 942899).
         continue;
       }
 
       fetchedDefinitions.set(listener.function.actor, definitionSite);
     }
     listener.function.url = definitionSite;
     listeners.push(listener);
   }
@@ -136,12 +108,9 @@ function updateEventBreakpoints(eventNam
           type: constants.UPDATE_EVENT_BREAKPOINTS,
           eventNames: eventNames
         });
       });
     });
   }
 }
 
-module.exports = {
-  update: update,
-  actions: { updateEventBreakpoints, fetchEventListeners }
-}
+module.exports = { updateEventBreakpoints, fetchEventListeners };
new file mode 100644
--- /dev/null
+++ b/browser/devtools/debugger/content/reducers/event-listeners.js
@@ -0,0 +1,37 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const constants = require('../constants');
+
+const FETCH_EVENT_LISTENERS_DELAY = 200; // ms
+
+const initialState = {
+  activeEventNames: [],
+  listeners: [],
+  fetchingListeners: false,
+};
+
+function update(state = initialState, action, emit) {
+  switch(action.type) {
+  case constants.UPDATE_EVENT_BREAKPOINTS:
+    state.activeEventNames = action.eventNames;
+    emit("@redux:activeEventNames", state.activeEventNames);
+    break;
+  case constants.FETCH_EVENT_LISTENERS:
+    if (action.status === "begin") {
+      state.fetchingListeners = true;
+    }
+    else if (action.status === "done") {
+      state.fetchingListeners = false;
+      state.listeners = action.listeners;
+      emit("@redux:listeners", state.listeners);
+    }
+    break;
+  }
+
+  return state;
+}
+
+module.exports = update;
rename from browser/devtools/debugger/content/stores/index.js
rename to browser/devtools/debugger/content/reducers/index.js
--- a/browser/devtools/debugger/content/stores/index.js
+++ b/browser/devtools/debugger/content/reducers/index.js
@@ -1,8 +1,8 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
 const eventListeners = require('./event-listeners');
 
-module.exports = { eventListeners };
+exports.eventListeners = eventListeners;
--- a/browser/devtools/debugger/content/views/event-listeners-view.js
+++ b/browser/devtools/debugger/content/views/event-listeners-view.js
@@ -1,33 +1,32 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
-const actions = require('../stores/event-listeners').actions;
-const bindActionCreators = require('devtools/shared/fluxify/bindActionCreators');
+const actions = require('../actions/event-listeners');
+const { bindActionCreators } = require('devtools/shared/vendor/redux');
 
 /**
  * Functions handling the event listeners UI.
  */
-function EventListenersView(dispatcher, DebuggerController) {
+function EventListenersView(store, DebuggerController) {
   dumpn("EventListenersView was instantiated");
 
-  this.actions = bindActionCreators(actions, dispatcher.dispatch);
-  this.getState = () => dispatcher.getState().eventListeners;
-
-  this.Breakpoints = DebuggerController.Breakpoints;
-
-  dispatcher.onChange({
-    "eventListeners": { "listeners": this.renderListeners }
-  }, this);
+  this.actions = bindActionCreators(actions, store.dispatch);
+  this.getState = () => store.getState().eventListeners;
 
   this._onCheck = this._onCheck.bind(this);
   this._onClick = this._onClick.bind(this);
+  this._onListeners = this._onListeners.bind(this);
+
+  this.Breakpoints = DebuggerController.Breakpoints;
+  this.controller = DebuggerController;
+  this.controller.on("@redux:listeners", this._onListeners);
 }
 
 EventListenersView.prototype = Heritage.extend(WidgetMethods, {
   /**
    * Initialization function, called when the debugger is started.
    */
   initialize: function() {
     dumpn("Initializing the EventListenersView");
@@ -48,18 +47,20 @@ EventListenersView.prototype = Heritage.
   },
 
   /**
    * Destruction function, called when the debugger is closed.
    */
   destroy: function() {
     dumpn("Destroying the EventListenersView");
 
+    this.controller.off("@redux:listeners", this._onListeners);
     this.widget.removeEventListener("check", this._onCheck, false);
     this.widget.removeEventListener("click", this._onClick, false);
+    this.controller = this.Breakpoints = null;
   },
 
   renderListeners: function(listeners) {
     listeners.forEach(listener => {
       this.addListener(listener, { staged: true });
     });
 
     // Flushes all the prepared events into the event listeners container.
@@ -280,15 +281,22 @@ EventListenersView.prototype = Heritage.
     // when retrieving the target's item, to ignore the checkbox.
     let eventItem = this.getItemForElement(target, { noSiblings: true });
     if (eventItem) {
       let newState = eventItem.attachment.checkboxState ^= 1;
       this.callMethod("checkItem", eventItem.target, newState);
     }
   },
 
+  /**
+   * Called when listeners change.
+   */
+  _onListeners: function(_, listeners) {
+    this.renderListeners(listeners);
+  },
+
   _eventCheckboxTooltip: "",
   _onSelectorString: "",
   _inSourceString: "",
   _inNativeCodeString: ""
 });
 
 module.exports = EventListenersView;
--- a/browser/devtools/debugger/debugger-controller.js
+++ b/browser/devtools/debugger/debugger-controller.js
@@ -1275,17 +1275,17 @@ SourceScripts.prototype = {
 
     // If there are any stored breakpoints for this source, display them again,
     // both in the editor and the breakpoints pane.
     DebuggerController.Breakpoints.updatePaneBreakpoints();
     DebuggerController.Breakpoints.updateEditorBreakpoints();
 
     // Make sure the events listeners are up to date.
     if (DebuggerView.instrumentsPaneTab == "events-tab") {
-      dispatcher.dispatch(actions.fetchEventListeners());
+      store.dispatch(actions.fetchEventListeners());
     }
 
     // Signal that a new source has been added.
     window.emit(EVENTS.NEW_SOURCE);
   },
 
   /**
    * Callback for the debugger's active thread getSources() method.
@@ -2050,16 +2050,17 @@ var Prefs = new ViewHelpers.Prefs("devto
   autoBlackBox: ["Bool", "debugger.auto-black-box"],
   promiseDebuggerEnabled: ["Bool", "debugger.promise"]
 });
 
 /**
  * Convenient way of emitting events from the panel window.
  */
 EventEmitter.decorate(this);
+EventEmitter.decorate(DebuggerController);
 
 /**
  * Preliminary setup for the DebuggerController object.
  */
 DebuggerController.initialize();
 DebuggerController.Parser = new Parser();
 DebuggerController.Workers = new Workers();
 DebuggerController.ThreadState = new ThreadState();
--- a/browser/devtools/debugger/debugger-view.js
+++ b/browser/devtools/debugger/debugger-view.js
@@ -30,26 +30,29 @@ const SEARCH_VARIABLE_FLAG = "*";
 const SEARCH_AUTOFILL = [SEARCH_GLOBAL_FLAG, SEARCH_FUNCTION_FLAG, SEARCH_TOKEN_FLAG];
 const EDITOR_VARIABLE_HOVER_DELAY = 750; // ms
 const EDITOR_VARIABLE_POPUP_POSITION = "topcenter bottomleft";
 const TOOLBAR_ORDER_POPUP_POSITION = "topcenter bottomleft";
 const RESIZE_REFRESH_RATE = 50; // ms
 const PROMISE_DEBUGGER_URL =
   "chrome://browser/content/devtools/promisedebugger/promise-debugger.xhtml";
 
-const createDispatcher = require('devtools/shared/create-dispatcher')();
-const stores = require('./content/stores/index');
-const dispatcher = createDispatcher(stores);
-const waitUntilService = require('devtools/shared/fluxify/waitUntilService');
+const debuggerControllerEmit = DebuggerController.emit.bind(DebuggerController);
+const createStore = require("devtools/shared/redux/create-store")();
+const { combineEmittingReducers } = require("devtools/shared/redux/reducers");
+const reducers = require("./content/reducers/index");
+const store = createStore(combineEmittingReducers(reducers, debuggerControllerEmit));
+const { NAME: WAIT_UNTIL_NAME } = require("devtools/shared/redux/middleware/wait-service");
+
 const services = {
-  WAIT_UNTIL: waitUntilService.name
+  WAIT_UNTIL: WAIT_UNTIL_NAME
 };
 
 const EventListenersView = require('./content/views/event-listeners-view');
-const actions = require('./content/stores/event-listeners').actions;
+const actions = require('./content/actions/event-listeners');
 
 /**
  * Object defining the debugger view components.
  */
 var DebuggerView = {
   /**
    * Initializes the debugger view.
    *
@@ -621,17 +624,17 @@ var DebuggerView = {
     }, 0);
   },
 
   /**
    * Handles a tab selection event on the instruments pane.
    */
   _onInstrumentsPaneTabSelect: function() {
     if (this._instrumentsPane.selectedTab.id == "events-tab") {
-      dispatcher.dispatch(actions.fetchEventListeners());
+      store.dispatch(actions.fetchEventListeners());
     }
   },
 
   /**
    * Handles a host change event issued by the parent toolbox.
    *
    * @param string aType
    *        The host type, either "bottom", "side" or "window".
@@ -923,9 +926,9 @@ ResultsPanelContainer.prototype = Herita
 
   _anchor: null,
   _panel: null,
   position: RESULTS_PANEL_POPUP_POSITION,
   left: 0,
   top: 0
 });
 
-DebuggerView.EventListeners = new EventListenersView(dispatcher, DebuggerController);
+DebuggerView.EventListeners = new EventListenersView(store, DebuggerController);
--- a/browser/devtools/debugger/moz.build
+++ b/browser/devtools/debugger/moz.build
@@ -13,14 +13,18 @@ EXTRA_JS_MODULES.devtools.debugger.conte
     'content/globalActions.js',
     'content/utils.js'
 ]
 
 EXTRA_JS_MODULES.devtools.debugger.content.views += [
     'content/views/event-listeners-view.js'
 ]
 
-EXTRA_JS_MODULES.devtools.debugger.content.stores += [
-    'content/stores/event-listeners.js',
-    'content/stores/index.js'
+EXTRA_JS_MODULES.devtools.debugger.content.reducers += [
+    'content/reducers/event-listeners.js',
+    'content/reducers/index.js'
+]
+
+EXTRA_JS_MODULES.devtools.debugger.content.actions += [
+    'content/actions/event-listeners.js',
 ]
 
 BROWSER_CHROME_MANIFESTS += ['test/mochitest/browser.ini']
--- a/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-02.js
+++ b/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-02.js
@@ -8,30 +8,30 @@
 
 const TAB_URL = EXAMPLE_URL + "doc_event-listeners-02.html";
 
 function test() {
   initDebugger(TAB_URL).then(([aTab,, aPanel]) => {
     let gDebugger = aPanel.panelWin;
     let gView = gDebugger.DebuggerView;
     let gEvents = gView.EventListeners;
-    let gDispatcher = gDebugger.dispatcher;
+    let gStore = gDebugger.store;
     let constants = gDebugger.require('./content/constants');
 
     Task.spawn(function*() {
       yield waitForSourceShown(aPanel, ".html");
       yield testFetchOnFocus();
       yield testFetchOnReloadWhenFocused();
       yield testFetchOnReloadWhenNotFocused();
       yield closeDebuggerAndFinish(aPanel);
     });
 
     function testFetchOnFocus() {
       return Task.spawn(function*() {
-        let fetched = afterDispatch(gDispatcher, constants.FETCH_EVENT_LISTENERS);
+        let fetched = afterDispatch(gStore, constants.FETCH_EVENT_LISTENERS);
 
         gView.toggleInstrumentsPane({ visible: true, animated: false }, 1);
         is(gView.instrumentsPaneHidden, false,
           "The instruments pane should be visible now.");
         is(gView.instrumentsPaneTab, "events-tab",
           "The events tab should be selected.");
 
         yield fetched;
@@ -40,17 +40,17 @@ function test() {
           "Event listeners were fetched when the events tab was selected");
         is(gEvents.itemCount, 4,
           "There should be 4 events displayed in the view.");
       });
     }
 
     function testFetchOnReloadWhenFocused() {
       return Task.spawn(function*() {
-        let fetched = afterDispatch(gDispatcher, constants.FETCH_EVENT_LISTENERS);
+        let fetched = afterDispatch(gStore, constants.FETCH_EVENT_LISTENERS);
 
         let reloading = once(gDebugger.gTarget, "will-navigate");
         let reloaded = waitForSourcesAfterReload();
         gDebugger.DebuggerController._target.activeTab.reload();
 
         yield reloading;
 
         is(gEvents.itemCount, 0,
@@ -71,17 +71,17 @@ function test() {
           "There should be 4 events displayed in the view after reloading.");
         ok(true,
           "Event listeners were added back after the target finished navigating.");
       });
     }
 
     function testFetchOnReloadWhenNotFocused() {
       return Task.spawn(function*() {
-        gDispatcher.dispatch({
+        gStore.dispatch({
           type: gDebugger.services.WAIT_UNTIL,
           predicate: action => {
             return (action.type === constants.FETCH_EVENT_LISTENERS ||
                     action.type === constants.UPDATE_EVENT_BREAKPOINTS);
           },
           run: (dispatch, getState, action) => {
             if(action.type === constants.FETCH_EVENT_LISTENERS) {
               ok(false, "Shouldn't have fetched any event listeners.");
--- a/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-03.js
+++ b/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-03.js
@@ -7,23 +7,23 @@
 
 const TAB_URL = EXAMPLE_URL + "doc_event-listeners-02.html";
 
 function test() {
   initDebugger(TAB_URL).then(([aTab,, aPanel]) => {
     let gDebugger = aPanel.panelWin;
     let gView = gDebugger.DebuggerView;
     let gEvents = gView.EventListeners;
-    let gDispatcher = gDebugger.dispatcher;
+    let gStore = gDebugger.store;
     let constants = gDebugger.require('./content/constants');
 
     Task.spawn(function*() {
       yield waitForSourceShown(aPanel, ".html");
 
-      let fetched = afterDispatch(gDispatcher, constants.FETCH_EVENT_LISTENERS);
+      let fetched = afterDispatch(gStore, constants.FETCH_EVENT_LISTENERS);
       gView.toggleInstrumentsPane({ visible: true, animated: false }, 1);
       yield fetched;
 
       is(gEvents.widget._parent.querySelectorAll(".side-menu-widget-group").length, 3,
         "There should be 3 groups shown in the view.");
       is(gEvents.widget._parent.querySelectorAll(".side-menu-widget-group-checkbox").length, 3,
         "There should be a checkbox for each group shown in the view.");
 
--- a/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-04.js
+++ b/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-04.js
@@ -9,50 +9,50 @@
 const TAB_URL = EXAMPLE_URL + "doc_event-listeners-02.html";
 
 function test() {
   initDebugger(TAB_URL).then(([aTab,, aPanel]) => {
     let gDebugger = aPanel.panelWin;
     let gView = gDebugger.DebuggerView;
     let gController = gDebugger.DebuggerController
     let gEvents = gView.EventListeners;
-    let gDispatcher = gDebugger.dispatcher;
-    let getState = gDispatcher.getState;
+    let gStore = gDebugger.store;
+    let getState = gStore.getState;
     let constants = gDebugger.require('./content/constants');
 
     Task.spawn(function*() {
       yield waitForSourceShown(aPanel, ".html");
 
-      let fetched = afterDispatch(gDispatcher, constants.FETCH_EVENT_LISTENERS);
+      let fetched = afterDispatch(gStore, constants.FETCH_EVENT_LISTENERS);
       gView.toggleInstrumentsPane({ visible: true, animated: false }, 1);
       yield fetched;
 
       testEventItem(0, false);
       testEventItem(1, false);
       testEventItem(2, false);
       testEventItem(3, false);
       testEventGroup("interactionEvents", false);
       testEventGroup("keyboardEvents", false);
       testEventGroup("mouseEvents", false);
       testEventArrays("change,click,keydown,keyup", "");
 
-      let updated = afterDispatch(gDispatcher, constants.UPDATE_EVENT_BREAKPOINTS);
+      let updated = afterDispatch(gStore, constants.UPDATE_EVENT_BREAKPOINTS);
       EventUtils.sendMouseEvent({ type: "click" }, getItemCheckboxNode(0), gDebugger);
       yield updated;
 
       testEventItem(0, true);
       testEventItem(1, false);
       testEventItem(2, false);
       testEventItem(3, false);
       testEventGroup("interactionEvents", false);
       testEventGroup("keyboardEvents", false);
       testEventGroup("mouseEvents", false);
       testEventArrays("change,click,keydown,keyup", "change");
 
-      updated = afterDispatch(gDispatcher, constants.UPDATE_EVENT_BREAKPOINTS);
+      updated = afterDispatch(gStore, constants.UPDATE_EVENT_BREAKPOINTS);
       EventUtils.sendMouseEvent({ type: "click" }, getItemCheckboxNode(0), gDebugger);
       yield updated;
 
       testEventItem(0, false);
       testEventItem(1, false);
       testEventItem(2, false);
       testEventItem(3, false);
       testEventGroup("interactionEvents", false);
--- a/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-05.js
+++ b/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-05.js
@@ -10,76 +10,76 @@
 const TAB_URL = EXAMPLE_URL + "doc_event-listeners-02.html";
 
 function test() {
   initDebugger(TAB_URL).then(([aTab,, aPanel]) => {
     let gDebugger = aPanel.panelWin;
     let gView = gDebugger.DebuggerView;
     let gController = gDebugger.DebuggerController
     let gEvents = gView.EventListeners;
-    let gDispatcher = gDebugger.dispatcher;
-    let getState = gDispatcher.getState;
+    let gStore = gDebugger.store;
+    let getState = gStore.getState;
     let constants = gDebugger.require('./content/constants');
 
     Task.spawn(function*() {
       yield waitForSourceShown(aPanel, ".html");
 
-      let fetched = afterDispatch(gDispatcher, constants.FETCH_EVENT_LISTENERS);
+      let fetched = afterDispatch(gStore, constants.FETCH_EVENT_LISTENERS);
       gView.toggleInstrumentsPane({ visible: true, animated: false }, 1);
       yield fetched;
 
       testEventItem(0, false);
       testEventItem(1, false);
       testEventItem(2, false);
       testEventItem(3, false);
       testEventGroup("interactionEvents", false);
       testEventGroup("keyboardEvents", false);
       testEventGroup("mouseEvents", false);
       testEventArrays("change,click,keydown,keyup", "");
 
-      let updated = afterDispatch(gDispatcher, constants.UPDATE_EVENT_BREAKPOINTS);
+      let updated = afterDispatch(gStore, constants.UPDATE_EVENT_BREAKPOINTS);
       EventUtils.sendMouseEvent({ type: "click" }, getGroupCheckboxNode("interactionEvents"), gDebugger);
       yield updated;
 
       testEventItem(0, true);
       testEventItem(1, false);
       testEventItem(2, false);
       testEventItem(3, false);
       testEventGroup("interactionEvents", true);
       testEventGroup("keyboardEvents", false);
       testEventGroup("mouseEvents", false);
       testEventArrays("change,click,keydown,keyup", "change");
 
-      updated = afterDispatch(gDispatcher, constants.UPDATE_EVENT_BREAKPOINTS);
+      updated = afterDispatch(gStore, constants.UPDATE_EVENT_BREAKPOINTS);
       EventUtils.sendMouseEvent({ type: "click" }, getGroupCheckboxNode("interactionEvents"), gDebugger);
       yield updated;
 
       testEventItem(0, false);
       testEventItem(1, false);
       testEventItem(2, false);
       testEventItem(3, false);
       testEventGroup("interactionEvents", false);
       testEventGroup("keyboardEvents", false);
       testEventGroup("mouseEvents", false);
       testEventArrays("change,click,keydown,keyup", "");
 
-      updated = afterDispatch(gDispatcher, constants.UPDATE_EVENT_BREAKPOINTS);
+      updated = afterDispatch(gStore, constants.UPDATE_EVENT_BREAKPOINTS);
       EventUtils.sendMouseEvent({ type: "click" }, getGroupCheckboxNode("keyboardEvents"), gDebugger);
       yield updated;
 
       testEventItem(0, false);
       testEventItem(1, false);
       testEventItem(2, true);
       testEventItem(3, true);
       testEventGroup("interactionEvents", false);
       testEventGroup("keyboardEvents", true);
       testEventGroup("mouseEvents", false);
       testEventArrays("change,click,keydown,keyup", "keydown,keyup");
 
-      updated = afterDispatch(gDispatcher, constants.UPDATE_EVENT_BREAKPOINTS);
+      updated = afterDispatch(gStore, constants.UPDATE_EVENT_BREAKPOINTS);
       EventUtils.sendMouseEvent({ type: "click" }, getGroupCheckboxNode("keyboardEvents"), gDebugger);
       yield updated;
 
       testEventItem(0, false);
       testEventItem(1, false);
       testEventItem(2, false);
       testEventItem(3, false);
       testEventGroup("interactionEvents", false);
--- a/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-06.js
+++ b/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-06.js
@@ -10,80 +10,80 @@ const TAB_URL = EXAMPLE_URL + "doc_event
 
 function test() {
   initDebugger(TAB_URL).then(([aTab,, aPanel]) => {
     let gDebugger = aPanel.panelWin;
     let gView = gDebugger.DebuggerView;
     let gController = gDebugger.DebuggerController
     let gEvents = gView.EventListeners;
     let gBreakpoints = gController.Breakpoints;
-    let gDispatcher = gDebugger.dispatcher;
-    let getState = gDispatcher.getState;
+    let gStore = gDebugger.store;
+    let getState = gStore.getState;
     let constants = gDebugger.require('./content/constants');
 
     Task.spawn(function*() {
       yield waitForSourceShown(aPanel, ".html");
 
-      let fetched = afterDispatch(gDispatcher, constants.FETCH_EVENT_LISTENERS);
+      let fetched = afterDispatch(gStore, constants.FETCH_EVENT_LISTENERS);
       gView.toggleInstrumentsPane({ visible: true, animated: false }, 1);
       yield fetched;
 
       testEventItem(0, false);
       testEventItem(1, false);
       testEventItem(2, false);
       testEventItem(3, false);
       testEventGroup("interactionEvents", false);
       testEventGroup("keyboardEvents", false);
       testEventGroup("mouseEvents", false);
       testEventArrays("change,click,keydown,keyup", "");
 
-      let updated = afterDispatch(gDispatcher, constants.UPDATE_EVENT_BREAKPOINTS);
+      let updated = afterDispatch(gStore, constants.UPDATE_EVENT_BREAKPOINTS);
       EventUtils.sendMouseEvent({ type: "click" }, getItemCheckboxNode(0), gDebugger);
       EventUtils.sendMouseEvent({ type: "click" }, getItemCheckboxNode(1), gDebugger);
       EventUtils.sendMouseEvent({ type: "click" }, getItemCheckboxNode(2), gDebugger);
       yield updated;
 
       testEventItem(0, true);
       testEventItem(1, true);
       testEventItem(2, true);
       testEventItem(3, false);
       testEventGroup("interactionEvents", false);
       testEventGroup("keyboardEvents", false);
       testEventGroup("mouseEvents", false);
       testEventArrays("change,click,keydown,keyup", "change,click,keydown");
 
       reload(aPanel);
-      yield afterDispatch(gDispatcher, constants.FETCH_EVENT_LISTENERS);
+      yield afterDispatch(gStore, constants.FETCH_EVENT_LISTENERS);
 
       testEventItem(0, true);
       testEventItem(1, true);
       testEventItem(2, true);
       testEventItem(3, false);
       testEventGroup("interactionEvents", false);
       testEventGroup("keyboardEvents", false);
       testEventGroup("mouseEvents", false);
       testEventArrays("change,click,keydown,keyup", "change,click,keydown");
 
-      updated = afterDispatch(gDispatcher, constants.UPDATE_EVENT_BREAKPOINTS);
+      updated = afterDispatch(gStore, constants.UPDATE_EVENT_BREAKPOINTS);
       EventUtils.sendMouseEvent({ type: "click" }, getItemCheckboxNode(0), gDebugger);
       EventUtils.sendMouseEvent({ type: "click" }, getItemCheckboxNode(1), gDebugger);
       EventUtils.sendMouseEvent({ type: "click" }, getItemCheckboxNode(2), gDebugger);
       yield updated;
 
       testEventItem(0, false);
       testEventItem(1, false);
       testEventItem(2, false);
       testEventItem(3, false);
       testEventGroup("interactionEvents", false);
       testEventGroup("keyboardEvents", false);
       testEventGroup("mouseEvents", false);
       testEventArrays("change,click,keydown,keyup", "");
 
       reload(aPanel);
-      yield afterDispatch(gDispatcher, constants.FETCH_EVENT_LISTENERS);
+      yield afterDispatch(gStore, constants.FETCH_EVENT_LISTENERS);
 
       testEventItem(0, false);
       testEventItem(1, false);
       testEventItem(2, false);
       testEventItem(3, false);
       testEventGroup("interactionEvents", false);
       testEventGroup("keyboardEvents", false);
       testEventGroup("mouseEvents", false);
--- a/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-08.js
+++ b/browser/devtools/debugger/test/mochitest/browser_dbg_break-on-dom-08.js
@@ -8,35 +8,35 @@
 const TAB_URL = EXAMPLE_URL + "doc_event-listeners-02.html";
 
 function test() {
   initDebugger(TAB_URL).then(([aTab,, aPanel]) => {
     let gTab = aTab;
     let gDebugger = aPanel.panelWin;
     let gView = gDebugger.DebuggerView;
     let gEvents = gView.EventListeners;
-    let gDispatcher = gDebugger.dispatcher;
-    let getState = gDispatcher.getState;
+    let gStore = gDebugger.store;
+    let getState = gStore.getState;
     let constants = gDebugger.require('./content/constants');
 
     Task.spawn(function*() {
       yield waitForSourceShown(aPanel, ".html");
       yield callInTab(gTab, "addBodyClickEventListener");
 
-      let fetched = afterDispatch(gDispatcher, constants.FETCH_EVENT_LISTENERS);
+      let fetched = afterDispatch(gStore, constants.FETCH_EVENT_LISTENERS);
       gView.toggleInstrumentsPane({ visible: true, animated: false }, 1);
       yield fetched;
       yield ensureThreadClientState(aPanel, "attached");
 
       is(gView.instrumentsPaneHidden, false,
         "The instruments pane should be visible.");
       is(gView.instrumentsPaneTab, "events-tab",
         "The events tab should be selected.");
 
-      let updated = afterDispatch(gDispatcher, constants.UPDATE_EVENT_BREAKPOINTS);
+      let updated = afterDispatch(gStore, constants.UPDATE_EVENT_BREAKPOINTS);
       EventUtils.sendMouseEvent({ type: "click" }, getItemCheckboxNode(1), gDebugger);
       yield updated;
       yield ensureThreadClientState(aPanel, "attached");
 
       let paused = waitForCaretAndScopes(aPanel, 48);
       generateMouseClickInTab(gTab, "content.document.body");
       yield paused;
       yield ensureThreadClientState(aPanel, "paused");
--- a/browser/devtools/debugger/test/mochitest/browser_dbg_event-listeners-04.js
+++ b/browser/devtools/debugger/test/mochitest/browser_dbg_event-listeners-04.js
@@ -26,21 +26,21 @@ add_task(function* () {
   info("Attaching an event handler via add-on sdk content scripts.");
   let worker = sdkTab.attach({
     contentScript: "document.body.addEventListener('click', e => alert(e))",
     onError: ok.bind(this, false)
   });
 
   let [,, panel, win] = yield initDebugger(tab);
   let gDebugger = panel.panelWin;
-  let gDispatcher = gDebugger.dispatcher;
+  let gStore = gDebugger.store;
   let constants = gDebugger.require('./content/constants');
-  let eventListeners = gDebugger.require('./content/stores/event-listeners');
-  let fetched = afterDispatch(gDispatcher, constants.FETCH_EVENT_LISTENERS);
+  let actions = gDebugger.require('./content/actions/event-listeners');
+  let fetched = afterDispatch(gStore, constants.FETCH_EVENT_LISTENERS);
 
   info("Scheduling event listener fetch.");
-  gDispatcher.dispatch(eventListeners.actions.fetchEventListeners());
+  gStore.dispatch(actions.fetchEventListeners());
 
   info("Waiting for updated event listeners to arrive.");
   yield fetched;
 
   ok(true, "The listener update did not hang.");
 });
--- a/browser/devtools/debugger/test/mochitest/head.js
+++ b/browser/devtools/debugger/test/mochitest/head.js
@@ -1187,20 +1187,20 @@ function setBreakpoint(sourceClient, loc
   return rdpInvoke(sourceClient, sourceClient.setBreakpoint, location);
 }
 
 function source(sourceClient) {
   info("Getting source.\n");
   return rdpInvoke(sourceClient, sourceClient.source);
 }
 
-function afterDispatch(dispatcher, type) {
+function afterDispatch(store, type) {
   info("Waiting on dispatch: " + type);
   return new Promise(resolve => {
-    dispatcher.dispatch({
+    store.dispatch({
       // Normally we would use `services.WAIT_UNTIL`, but use the
       // internal name here so tests aren't forced to always pass it
       // in
       type: "@@service/waitUntil",
       predicate: action => (
         action.type === type &&
         action.status ? action.status === "done" : true
       ),
--- a/browser/devtools/jar.mn
+++ b/browser/devtools/jar.mn
@@ -1,13 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 browser.jar:
+    content/browser/devtools/d3.js                                     (shared/vendor/d3.js)
+    content/browser/devtools/dagre-d3.js                               (shared/vendor/dagre-d3.js)
     content/browser/devtools/widgets.css                               (shared/widgets/widgets.css)
     content/browser/devtools/widgets/VariablesView.xul                 (shared/widgets/VariablesView.xul)
     content/browser/devtools/markup-view.xhtml                         (markupview/markup-view.xhtml)
     content/browser/devtools/markup-view.css                           (markupview/markup-view.css)
     content/browser/devtools/projecteditor.xul                               (projecteditor/chrome/content/projecteditor.xul)
     content/browser/devtools/readdir.js                                (projecteditor/lib/helpers/readdir.js)
     content/browser/devtools/projecteditor-loader.xul                        (projecteditor/chrome/content/projecteditor-loader.xul)
     content/browser/devtools/projecteditor-test.xul                          (projecteditor/chrome/content/projecteditor-test.xul)
@@ -79,19 +81,17 @@ browser.jar:
     content/browser/devtools/debugger/filter-view.js                   (debugger/views/filter-view.js)
     content/browser/devtools/debugger/utils.js                         (debugger/utils.js)
     content/browser/devtools/shadereditor.xul                          (shadereditor/shadereditor.xul)
     content/browser/devtools/shadereditor.js                           (shadereditor/shadereditor.js)
     content/browser/devtools/canvasdebugger.xul                        (canvasdebugger/canvasdebugger.xul)
     content/browser/devtools/canvasdebugger.js                         (canvasdebugger/canvasdebugger.js)
     content/browser/devtools/canvasdebugger/snapshotslist.js           (canvasdebugger/snapshotslist.js)
     content/browser/devtools/canvasdebugger/callslist.js               (canvasdebugger/callslist.js)
-    content/browser/devtools/d3.js                                     (shared/d3.js)
     content/browser/devtools/webaudioeditor.xul                        (webaudioeditor/webaudioeditor.xul)
-    content/browser/devtools/dagre-d3.js                               (webaudioeditor/lib/dagre-d3.js)
     content/browser/devtools/webaudioeditor/includes.js                (webaudioeditor/includes.js)
     content/browser/devtools/webaudioeditor/models.js                  (webaudioeditor/models.js)
     content/browser/devtools/webaudioeditor/controller.js              (webaudioeditor/controller.js)
     content/browser/devtools/webaudioeditor/views/utils.js             (webaudioeditor/views/utils.js)
     content/browser/devtools/webaudioeditor/views/context.js           (webaudioeditor/views/context.js)
     content/browser/devtools/webaudioeditor/views/inspector.js         (webaudioeditor/views/inspector.js)
     content/browser/devtools/webaudioeditor/views/properties.js        (webaudioeditor/views/properties.js)
     content/browser/devtools/webaudioeditor/views/automation.js        (webaudioeditor/views/automation.js)
--- a/browser/devtools/shared/browser-loader.js
+++ b/browser/devtools/shared/browser-loader.js
@@ -18,16 +18,17 @@ catch(e) {
   // will be loaded if this is true, and that file doesn't get built
   // into the release version of Firefox, so this will only work with
   // dev environments.
   appConstants = {
     DEBUG_JS_MODULES: true
   };
 }
 
+const VENDOR_CONTENT_URL = "resource:///modules/devtools/shared/vendor";
 
 /*
  * Create a loader to be used in a browser environment. This evaluates
  * modules in their own environment, but sets window (the normal
  * global object) as the sandbox prototype, so when a variable is not
  * defined it checks `window` before throwing an error. This makes all
  * browser APIs available to modules by default, like a normal browser
  * environment, but modules are still evaluated in their own scope.
@@ -50,30 +51,31 @@ catch(e) {
  *         - require: a function to require modules with
  */
 function BrowserLoader(baseURI, window) {
   const loaderOptions = devtools.require('@loader/options');
 
   let dynamicPaths = {};
   if (appConstants.DEBUG_JS_MODULES) {
     // Load in the dev version of React
-    dynamicPaths["devtools/shared/content/react"] =
-      "resource:///modules/devtools/shared/content/react-dev.js";
+    dynamicPaths["devtools/shared/vendor/react"] =
+      "resource:///modules/devtools/vendor/react-dev.js";
   }
 
   const opts = {
     id: "browser-loader",
     sharedGlobal: true,
     sandboxPrototype: window,
     paths: Object.assign({}, loaderOptions.paths, dynamicPaths),
     invisibleToDebugger: loaderOptions.invisibleToDebugger,
     require: (id, require) => {
       const uri = require.resolve(id);
+
       if (!uri.startsWith(baseURI) &&
-          !uri.startsWith("resource:///modules/devtools/shared/content")) {
+          !uri.startsWith(VENDOR_CONTENT_URL)) {
         return devtools.require(uri);
       }
       return require(uri);
     }
   };
 
   // The main.js file does not have to actually exist. It just
   // represents the base environment, so requires will be relative to
deleted file mode 100644
--- a/browser/devtools/shared/fluxify/bindActionCreators.js
+++ /dev/null
@@ -1,28 +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/. */
-"use strict";
-
-function bindActionCreator(actionCreator, dispatch) {
-  return (...args) => dispatch(actionCreator(...args));
-}
-
-/**
- * Wraps action creator functions into a function that automatically
- * dispatches the created action with `dispatch`. Normally action
- * creators simply return actions, but wrapped functions will
- * automatically dispatch.
- *
- * @param {object} actionCreators
- *        An object of action creator functions (names as keys)
- * @param {function} dispatch
- */
-function bindActionCreators(actionCreators, dispatch) {
-  let actions = {};
-  for (let k of Object.keys(actionCreators)) {
-    actions[k] = bindActionCreator(actionCreators[k], dispatch);
-  }
-  return actions;
-}
-
-module.exports = bindActionCreators;
deleted file mode 100644
--- a/browser/devtools/shared/fluxify/dispatcher.js
+++ /dev/null
@@ -1,247 +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/. */
-"use strict";
-
-const { entries, compose } = require("devtools/toolkit/DevToolsUtils");
-
-/**
- * A store creator that creates a dispatch function that runs the
- * provided middlewares before actually dispatching. This allows
- * simple middleware to augment the kinds of actions that can
- * be dispatched. This would be used like this:
- * `createDispatcher = applyMiddleware([fooMiddleware, ...])(createDispatcher)`
- *
- * Middlewares are simple functions that are provided `dispatch` and
- * `getState` functions. They create functions that accept actions and
- * can re-dispatch them in any way they want. A common scenario is
- * asynchronously dispatching multiple actions. Here is a full
- * middleware:
- *
- * function thunkMiddleware({ dispatch, getState }) {
- *  return next => action => {
- *    return typeof action === 'function' ?
- *      action(dispatch, getState) :
- *      next(action);
- *  }
- * }
- *
- * `next` is essentially a `dispatch` function, but it calls the next
- * middelware in the chain (or the real `dispatch` function). Using
- * this middleware, you can return a function that gives you a
- * dispatch function:
- *
- * function actionCreator(timeout) {
- *   return (dispatch, getState) => {
- *     dispatch({ type: TIMEOUT, status: "start" });
- *     setTimeout(() => dispatch({ type: TIMEOUT, status: "end" }),
- *                timeout);
- *   }
- * }
- *
- */
-function applyMiddleware(...middlewares) {
-  return next => stores => {
-    const dispatcher = next(stores);
-    let dispatch = dispatcher.dispatch;
-
-    const api = {
-      getState: dispatcher.getState,
-      dispatch: action => dispatch(action)
-    };
-    const chain = middlewares.map(middleware => middleware(api));
-    dispatch = compose(...chain)(dispatcher.dispatch);
-
-    return Object.assign({}, dispatcher, { dispatch: dispatch });
-  }
-}
-
-/*
- * The heart of the system. This creates a dispatcher which is the
- * interface between views and stores. Views can use a dispatcher
- * instance to dispatch actions, which know nothing about the stores.
- * Actions are broadcasted to all registered stores, and stores can
- * handle the action and update their state. The dispatcher gives
- * stores an `emitChange` function, which signifies that a piece of
- * state has changed. The dispatcher will notify all views that are
- * listening to that piece of state, registered with `onChange`.
- *
- * Views generally are stateless, pure components (eventually React
- * components). They simply take state and render it.
- *
- * Stores make up the entire app state, and are all grouped together
- * into a single app state atom, returned by the dispatcher's
- * `getState` function. The shape of the app state is determined by
- * the `stores` object passed in to the dispatcher, so if
- * `{ foo: fooStore }` was passed to `createDispatcher` the app state
- * would be `{ foo: fooState }`
- *
- * Actions are just JavaScript object with a `type` property and any
- * other fields pertinent to the action. Action creators should
- * generally be used to create actions, which are just functions that
- * return the action object. Additionally, the `bindActionCreators`
- * module provides a function for automatically binding action
- * creators to a dispatch function, so calling them automatically
- * dispatches. For example:
- *
- * ```js
- * // Manually dispatch
- * dispatcher.dispatch({ type: constants.ADD_ITEM, item: item });
- * // Using an action creator
- * dispatcher.dispatch(addItem(item));
- *
- * // Using an action creator bound to dispatch
- * actions = bindActionCreators({ addItem: addItem });
- * actions.addItem(item);
- * ```
- *
- * Our system expects stores to exist as an `update` function. You
- * should define an update function in a module, and optionally
- * any action creators that are useful to go along with it. Here is
- * an example store file:
- *
- * ```js
- * const initialState = { items: [] };
- * function update(state = initialState, action, emitChange) {
- *   if (action.type === constants.ADD_ITEM) {
- *     state.items.push(action.item);
- *     emitChange("items", state.items);
- *   }
- *
- *   return state;
- * }
- *
- * function addItem(item) {
- *   return {
- *     type: constants.ADD_ITEM,
- *     item: item
- *   };
- * }
- *
- * module.exports = {
- *   update: update,
- *   actions: { addItem }
- * }
- * ```
- *
- * Lastly, "constants" are simple strings that specify action names.
- * Usually the entire set of available action types are specified in
- * a `constants.js` file, so they are available globally. Use
- * variables that are the same name as the string, for example
- * `const ADD_ITEM = "ADD_ITEM"`.
- *
- * This entire system was inspired by Redux, which hopefully we will
- * eventually use once things get cleaned up enough. You should read
- * its docs, and keep in mind that it calls stores "reducers" and the
- * dispatcher instance is called a single store.
- * http://rackt.github.io/redux/
- */
-function createDispatcher(stores) {
-  const state = {};
-  const listeners = {};
-  let enqueuedChanges = [];
-  let isDispatching = false;
-
-  // Validate the stores to make sure they have the right shape,
-  // and accumulate the initial state
-  entries(stores).forEach(([name, store]) => {
-    if (!store || typeof store.update !== "function") {
-      throw new Error("Error creating dispatcher: store \"" + name +
-                      "\" does not have an `update` function");
-    }
-
-    state[name] = store.update(undefined, {});
-  });
-
-  function getState() {
-    return state;
-  }
-
-  function emitChange(storeName, dataName, payload) {
-    enqueuedChanges.push([storeName, dataName, payload]);
-  }
-
-  function onChange(paths, view) {
-    entries(paths).forEach(([storeName, data]) => {
-      if (!stores[storeName]) {
-        throw new Error("Error adding onChange handler to store: store " +
-                        "\"" + storeName + "\" does not exist");
-      }
-
-      if (!listeners[storeName]) {
-        listeners[storeName] = [];
-      }
-
-      if (typeof data == 'function') {
-        listeners[storeName].push(data.bind(view));
-      }
-      else {
-        entries(data).forEach(([watchedName, handler]) => {
-          listeners[storeName].push((payload, dataName, storeName) => {
-            if (dataName === watchedName) {
-              handler.call(view, payload, dataName, storeName);
-            }
-          });
-        });
-      }
-    });
-  }
-
-  /**
-   * Flush any enqueued state changes from the dispatch cycle. Listeners
-   * are not immediately notified of changes, only after dispatching
-   * is completed, to ensure that all state is consistent (in the case
-   * of multiple stores changes at once).
-   */
-  function flushChanges() {
-    enqueuedChanges.forEach(([storeName, dataName, payload]) => {
-      if (listeners[storeName]) {
-        listeners[storeName].forEach(listener => {
-          listener(payload, dataName, storeName);
-        });
-      }
-    });
-
-    enqueuedChanges = [];
-  }
-
-  function dispatch(action) {
-    if (isDispatching) {
-      throw new Error('Cannot dispatch in the middle of a dispatch');
-    }
-    if (!action.type) {
-      throw new Error(
-        'action type is null, ' +
-        'did you make a typo when publishing this action? ' +
-        JSON.stringify(action, null, 2)
-      );
-    }
-
-    isDispatching = true;
-    try {
-      entries(stores).forEach(([name, store]) => {
-        state[name] = store.update(
-          state[name],
-          action,
-          emitChange.bind(null, name)
-        );
-      });
-    }
-    finally {
-      isDispatching = false;
-    }
-
-    flushChanges();
-  }
-
-  return {
-    getState,
-    dispatch,
-    onChange
-  };
-}
-
-module.exports = {
-  createDispatcher: createDispatcher,
-  applyMiddleware: applyMiddleware
-};
deleted file mode 100644
--- a/browser/devtools/shared/fluxify/test/unit/head.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-"use strict";
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-const Cr = Components.results;
-const CC = Components.Constructor;
-
-const { require } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
-const createDispatcher = require('devtools/shared/create-dispatcher')({ log: true });
-const waitUntilService = require('devtools/shared/fluxify/waitUntilService');
-const services = {
-  WAIT_UNTIL: waitUntilService.name
-};
-
-const Services = require("Services");
-const { waitForTick, waitForTime } = require("devtools/toolkit/DevToolsUtils");
-
-var loadSubScript = Cc[
-  '@mozilla.org/moz/jssubscript-loader;1'
-].getService(Ci.mozIJSSubScriptLoader).loadSubScript;
-
-function getFileUrl(name, allowMissing=false) {
-  let file = do_get_file(name, allowMissing);
-  return Services.io.newFileURI(file).spec;
-}
deleted file mode 100644
--- a/browser/devtools/shared/fluxify/test/unit/stores-for-testing.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-// This file should be loaded with `loadSubScript` because it contains
-// stateful stores that need a new instance per test.
-
-const NumberStore = {
-  update: (state = 1, action, emitChange) => {
-    switch(action.type) {
-    case constants.ADD_NUMBER: {
-      const newState = state + action.value;
-      emitChange('number', newState);
-      return newState;
-    }
-    case constants.DOUBLE_NUMBER: {
-      const newState = state * 2;
-      emitChange('number', newState);
-      return newState;
-    }}
-
-    return state;
-  },
-
-  constants: {
-    ADD_NUMBER: 'ADD_NUMBER',
-    DOUBLE_NUMBER: 'DOUBLE_NUMBER'
-  }
-};
-
-const itemsInitialState = {
-  list: []
-};
-const ItemStore = {
-  update: (state = itemsInitialState, action, emitChange) => {
-    switch(action.type) {
-    case constants.ADD_ITEM:
-      state.list.push(action.item);
-      emitChange('list', state.list);
-      return state;
-    }
-
-    return state;
-  },
-
-  constants: {
-    ADD_ITEM: 'ADD_ITEM'
-  }
-}
deleted file mode 100644
--- a/browser/devtools/shared/fluxify/test/unit/test_dispatcher.js
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-loadSubScript(getFileUrl("stores-for-testing.js"));
-const constants = Object.assign(
-  {},
-  NumberStore.constants,
-  ItemStore.constants
-);
-const stores = { number: NumberStore,
-                 items: ItemStore };
-
-function addNumber(num) {
-  return {
-    type: constants.ADD_NUMBER,
-    value: num
-  }
-}
-
-function addItem(item) {
-  return {
-    type: constants.ADD_ITEM,
-    item: item
-  };
-}
-
-// Tests
-
-function run_test() {
-  testInitialValue();
-  testDispatch();
-  testEmitChange();
-  run_next_test();
-}
-
-function testInitialValue() {
-  do_print("Testing initial value");
-  const dispatcher = createDispatcher(stores);
-  equal(dispatcher.getState().number, 1);
-}
-
-function testDispatch() {
-  do_print("Testing dispatch");
-
-  const dispatcher = createDispatcher(stores);
-  dispatcher.dispatch(addNumber(5));
-  equal(dispatcher.getState().number, 6);
-
-  dispatcher.dispatch(addNumber(2));
-  equal(dispatcher.getState().number, 8);
-
-  // It should ignore unknown action types
-  dispatcher.dispatch({ type: "FOO" });
-  equal(dispatcher.getState().number, 8);
-}
-
-function testEmitChange() {
-  do_print("Testing change emittters");
-  const dispatcher = createDispatcher(stores);
-  let listenerRan = false;
-
-  const numberView = {
-    x: 3,
-    renderNumber: function(num) {
-      ok(this.x, 3, "listener ran in context of view");
-      ok(num, 10);
-      listenerRan = true;
-    }
-  }
-
-  // Views can listen to changes in state by specifying which part of
-  // the state to listen to and giving a handler function. The
-  // function will be run with the view as `this`.
-  dispatcher.onChange({
-    "number": numberView.renderNumber
-  }, numberView);
-
-  dispatcher.dispatch(addNumber(9));
-  ok(listenerRan, "number listener actually ran");
-  listenerRan = false;
-
-  const itemsView = {
-    renderList: function(items) {
-      ok(items.length, 1);
-      ok(items[0].name = "james");
-      listenerRan = true;
-    }
-  }
-
-  // You can listen to deeper sections of the state by nesting objects
-  // to specify the path to that state. You can do this 1 level deep;
-  // you cannot arbitrarily nest state listeners.
-  dispatcher.onChange({
-    "items": {
-      "list": itemsView.renderList
-    }
-  }, itemsView);
-
-  dispatcher.dispatch(addItem({ name: "james" }));
-  ok(listenerRan, "items listener actually ran");
-}
deleted file mode 100644
--- a/browser/devtools/shared/fluxify/test/unit/test_middlewares.js
+++ /dev/null
@@ -1,114 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-loadSubScript(getFileUrl('stores-for-testing.js'));
-const constants = NumberStore.constants;
-const stores = { number: NumberStore };
-
-function run_test() {
-  run_next_test();
-}
-
-add_task(function* testThunkDispatch() {
-  do_print("Testing thunk dispatch");
-  // The thunk middleware allows you to return a function from an
-  // action creator which takes `dispatch` and `getState` functions as
-  // arguments. This allows the action creator to fire multiple
-  // actions manually with `dispatch`, possibly asynchronously.
-
-  function addNumberLater(num) {
-    return dispatch => {
-      // Just do it in the next tick, no need to wait too long
-      waitForTick().then(() => {
-        dispatch({
-          type: constants.ADD_NUMBER,
-          value: num
-        });
-      });
-    };
-  }
-
-  function addNumber(num) {
-    return (dispatch, getState) => {
-      dispatch({
-        type: constants.ADD_NUMBER,
-        value: getState().number > 10 ? (num * 2) : num
-      });
-    };
-  }
-
-  const dispatcher = createDispatcher(stores);
-  equal(dispatcher.getState().number, 1);
-  dispatcher.dispatch(addNumberLater(5));
-  equal(dispatcher.getState().number, 1, "state should not have changed");
-  yield waitForTick();
-  equal(dispatcher.getState().number, 6, "state should have changed");
-
-  dispatcher.dispatch(addNumber(5));
-  equal(dispatcher.getState().number, 11);
-  dispatcher.dispatch(addNumber(2));
-  // 2 * 2 should have actually been added because the state is
-  // greater than 10 (the action creator changes the value based on
-  // the current state)
-  equal(dispatcher.getState().number, 15);
-});
-
-add_task(function* testWaitUntilService() {
-  do_print("Testing waitUntil service");
-  // The waitUntil service allows you to queue functions to be run at a
-  // later time, depending on a predicate. As actions comes through
-  // the system, you predicate will be called with each action. Once
-  // your predicate returns true, the queued function will be run and
-  // removed from the pending queue.
-
-  function addWhenDoubled(num) {
-    return {
-      type: services.WAIT_UNTIL,
-      predicate: action => action.type === constants.DOUBLE_NUMBER,
-      run: (dispatch, getState, action) => {
-        ok(action.type, constants.DOUBLE_NUMBER);
-        ok(getState(), 10);
-
-        dispatch({
-          type: constants.ADD_NUMBER,
-          value: 2
-        });
-      }
-    };
-  }
-
-  function addWhenGreaterThan(threshold, num) {
-    return (dispatch, getState) => {
-      dispatch({
-        type: services.WAIT_UNTIL,
-        predicate: () => getState().number > threshold,
-        run: () => {
-          dispatch({
-            type: constants.ADD_NUMBER,
-            value: num
-          });
-        }
-      });
-    }
-  }
-
-  const dispatcher = createDispatcher(stores);
-
-  // Add a pending action that adds 2 after the number is doubled
-  equal(dispatcher.getState().number, 1);
-  dispatcher.dispatch(addWhenDoubled(2));
-  equal(dispatcher.getState().number, 1);
-  dispatcher.dispatch({ type: constants.DOUBLE_NUMBER });
-  // Note how the pending function we added ran synchronously. It
-  // should have added 2 after doubling 1, so 1 * 2 + 2 = 4
-  equal(dispatcher.getState().number, 4);
-
-  // Add a pending action that adds 5 once the number is greater than 10
-  dispatcher.dispatch(addWhenGreaterThan(10, 5));
-  equal(dispatcher.getState().number, 4);
-  dispatcher.dispatch({ type: constants.ADD_NUMBER, value: 10 });
-  // Again, the pending function we added ran synchronously. It should
-  // have added 5 more after 10 was added, since the number was
-  // greater than 10.
-  equal(dispatcher.getState().number, 19);
-});
deleted file mode 100644
--- a/browser/devtools/shared/fluxify/test/unit/xpcshell.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-[DEFAULT]
-tags = devtools
-head = head.js
-tail =
-firefox-appdir = browser
-skip-if = toolkit == 'android' || toolkit == 'gonk'
-
-support-files =
-  stores-for-testing.js
-
-[test_dispatcher.js]
-[test_middlewares.js]
\ No newline at end of file
--- a/browser/devtools/shared/moz.build
+++ b/browser/devtools/shared/moz.build
@@ -2,16 +2,21 @@
 # vim: set filetype=python:
 # 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/.
 
 BROWSER_CHROME_MANIFESTS += ['test/browser.ini']
 XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini']
 
+DIRS += [
+    'redux',
+    'vendor',
+]
+
 EXTRA_JS_MODULES.devtools += [
     'AppCacheUtils.jsm',
     'Curl.jsm',
     'DeveloperToolbar.jsm',
     'DOMHelpers.jsm',
     'Jsbeautify.jsm',
     'Parser.jsm',
     'SplitView.jsm',
@@ -27,52 +32,40 @@ EXTRA_JS_MODULES.devtools += [
     'widgets/VariablesView.jsm',
     'widgets/VariablesViewController.jsm',
     'widgets/ViewHelpers.jsm',
 ]
 
 EXTRA_JS_MODULES.devtools.shared += [
     'autocomplete-popup.js',
     'browser-loader.js',
-    'create-dispatcher.js',
     'devices.js',
     'doorhanger.js',
     'frame-script-utils.js',
     'getjson.js',
     'inplace-editor.js',
     'node-attribute-parser.js',
     'observable-object.js',
     'options-view.js',
     'poller.js',
     'source-utils.js',
     'telemetry.js',
     'theme-switching.js',
     'theme.js',
     'undo.js'
 ]
 
-EXTRA_JS_MODULES.devtools.shared.content += [
-    'content/react.js'
-]
-
-if CONFIG['DEBUG_JS_MODULES']:
-    EXTRA_JS_MODULES.devtools.shared.content += [
-        'content/react-dev.js'
-    ]
-
 EXTRA_JS_MODULES.devtools.shared.widgets += [
     'widgets/BarGraphWidget.js',
     'widgets/CubicBezierPresets.js',
     'widgets/CubicBezierWidget.js',
     'widgets/FastListWidget.js',
     'widgets/FilterWidget.js',
     'widgets/FlameGraph.js',
     'widgets/Graphs.js',
     'widgets/LineGraphWidget.js',
     'widgets/MdnDocsWidget.js',
     'widgets/MountainGraphWidget.js',
     'widgets/Spectrum.js',
     'widgets/TableWidget.js',
     'widgets/Tooltip.js',
     'widgets/TreeWidget.js',
 ]
-
-DIRS += ['fluxify']
rename from browser/devtools/shared/create-dispatcher.js
rename to browser/devtools/shared/redux/create-store.js
--- a/browser/devtools/shared/create-dispatcher.js
+++ b/browser/devtools/shared/redux/create-store.js
@@ -1,31 +1,35 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
-const fluxify = require('./fluxify/dispatcher');
-const thunkMiddleware = require('./fluxify/thunkMiddleware');
-const logMiddleware = require('./fluxify/logMiddleware');
-const waitUntilService = require('./fluxify/waitUntilService')
-const { compose } = require('devtools/toolkit/DevToolsUtils');
+const { createStore, applyMiddleware } = require("devtools/shared/vendor/redux");
+const { thunk } = require("./middleware/thunk");
+const { waitUntilService } = require("./middleware/wait-service");
+const { log } = require("./middleware/log");
 
 /**
  * This creates a dispatcher with all the standard middleware in place
  * that all code requires. It can also be optionally configured in
  * various ways, such as logging and recording.
  *
  * @param {object} opts - boolean configuration flags
  *        - log: log all dispatched actions to console
+ *        - middleware: array of middleware to be included in the redux store
  */
 module.exports = (opts={}) => {
   const middleware = [
-    thunkMiddleware,
-    waitUntilService.service
+    thunk,
+    waitUntilService
   ];
 
   if (opts.log) {
-    middleware.push(logMiddleware);
+    middleware.push(log);
   }
 
-  return fluxify.applyMiddleware(...middleware)(fluxify.createDispatcher);
+  if (opts.middleware) {
+    opts.middleware.forEach(fn => middleware.push(fn));
+  }
+
+  return applyMiddleware(...middleware)(createStore);
 }
rename from browser/devtools/shared/fluxify/logMiddleware.js
rename to browser/devtools/shared/redux/middleware/log.js
--- a/browser/devtools/shared/fluxify/logMiddleware.js
+++ b/browser/devtools/shared/redux/middleware/log.js
@@ -2,16 +2,16 @@
  * 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";
 
 /**
  * A middleware that logs all actions coming through the system
  * to the console.
  */
-function logMiddleware({ dispatch, getState }) {
+function log({ dispatch, getState }) {
   return next => action => {
-    console.log('[DISPATCH]', JSON.stringify(action));
+    console.log("[DISPATCH]", JSON.stringify(action));
     next(action);
   }
 }
 
-module.exports = logMiddleware;
+exports.log = log;
rename from browser/devtools/shared/fluxify/thunkMiddleware.js
rename to browser/devtools/shared/redux/middleware/thunk.js
--- a/browser/devtools/shared/fluxify/thunkMiddleware.js
+++ b/browser/devtools/shared/redux/middleware/thunk.js
@@ -4,17 +4,16 @@
 "use strict";
 
 /**
  * A middleware that allows thunks (functions) to be dispatched.
  * If it's a thunk, it is called with `dispatch` and `getState`,
  * allowing the action to create multiple actions (most likely
  * asynchronously).
  */
-function thunkMiddleware({ dispatch, getState }) {
+function thunk({ dispatch, getState }) {
   return next => action => {
     return typeof action === "function"
       ? action(dispatch, getState)
       : next(action);
   }
 }
-
-module.exports = thunkMiddleware;
+exports.thunk = thunk;
rename from browser/devtools/shared/fluxify/waitUntilService.js
rename to browser/devtools/shared/redux/middleware/wait-service.js
--- a/browser/devtools/shared/fluxify/waitUntilService.js
+++ b/browser/devtools/shared/redux/middleware/wait-service.js
@@ -1,35 +1,35 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
-const NAME = "@@service/waitUntil";
-
 /**
  * A middleware which acts like a service, because it is stateful
  * and "long-running" in the background. It provides the ability
  * for actions to install a function to be run once when a specific
  * condition is met by an action coming through the system. Think of
  * it as a thunk that blocks until the condition is met. Example:
  *
  * ```js
- * const services = { WAIT_UNTIL: require('waitUntilService').name };
+ * const services = { WAIT_UNTIL: require('wait-service').NAME };
  *
  * { type: services.WAIT_UNTIL,
  *   predicate: action => action.type === constants.ADD_ITEM,
  *   run: (dispatch, getState, action) => {
  *     // Do anything here. You only need to accept the arguments
  *     // if you need them. `action` is the action that satisfied
  *     // the predicate.
  *   }
  * }
  * ```
  */
+const NAME = exports.NAME = "@@service/waitUntil";
+
 function waitUntilService({ dispatch, getState }) {
   let pending = [];
 
   function checkPending(action) {
     let readyRequests = [];
     let stillPending = [];
 
     // Find the pending requests whose predicates are satisfied with
@@ -57,13 +57,9 @@ function waitUntilService({ dispatch, ge
       pending.push(action);
     }
     else {
       next(action);
       checkPending(action);
     }
   }
 }
-
-module.exports = {
-  service: waitUntilService,
-  name: NAME
-};
+exports.waitUntilService = waitUntilService;
new file mode 100644
--- /dev/null
+++ b/browser/devtools/shared/redux/moz.build
@@ -0,0 +1,16 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+EXTRA_JS_MODULES.devtools.shared.redux += [
+    'create-store.js',
+    'reducers.js',
+]
+
+EXTRA_JS_MODULES.devtools.shared.redux.middleware += [
+    'middleware/log.js',
+    'middleware/thunk.js',
+    'middleware/wait-service.js',
+]
new file mode 100644
--- /dev/null
+++ b/browser/devtools/shared/redux/reducers.js
@@ -0,0 +1,33 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const { combineReducers } = require("devtools/shared/vendor/redux");
+
+/**
+ * Function that takes a hash of reducers, like `combineReducers`,
+ * and an `emit` function and returns a function to be used as a reducer
+ * for a Redux store. This allows all reducers defined here to receive
+ * a third argument, the `emit` function, for event-based subscriptions
+ * from within reducers.
+ *
+ * @param {Object} reducers
+ * @param {Function} emit
+ * @return {Function}
+ */
+function combineEmittingReducers (reducers, emit) {
+  // Wrap each reducer with a wrapper function that calls
+  // the reducer with a third argument, an `emit` function.
+  // Use this rather than a new custom top level reducer that would ultimately
+  // have to replicate redux's `combineReducers` so we only pass in correct state,
+  // the error checking, and other edge cases.
+  function wrapReduce (newReducers, key) {
+    newReducers[key] = (state, action) => reducers[key](state, action, emit);
+    return newReducers;
+  }
+
+  return combineReducers(Object.keys(reducers).reduce(wrapReduce, Object.create(null)));
+}
+
+exports.combineEmittingReducers = combineEmittingReducers;
rename from browser/devtools/shared/D3_LICENSE
rename to browser/devtools/shared/vendor/D3_LICENSE
rename from browser/devtools/webaudioeditor/lib/DAGRE_D3_LICENSE
rename to browser/devtools/shared/vendor/DAGRE_D3_LICENSE
new file mode 100644
--- /dev/null
+++ b/browser/devtools/shared/vendor/REDUX_LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Dan Abramov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
rename from browser/devtools/shared/d3.js
rename to browser/devtools/shared/vendor/d3.js
rename from browser/devtools/webaudioeditor/lib/dagre-d3.js
rename to browser/devtools/shared/vendor/dagre-d3.js
rename from browser/devtools/shared/fluxify/moz.build
rename to browser/devtools/shared/vendor/moz.build
--- a/browser/devtools/shared/fluxify/moz.build
+++ b/browser/devtools/shared/vendor/moz.build
@@ -1,15 +1,15 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # 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/.
 
-EXTRA_JS_MODULES.devtools.shared.fluxify += [
-    'bindActionCreators.js',
-    'dispatcher.js',
-    'logMiddleware.js',
-    'thunkMiddleware.js',
-    'waitUntilService.js'
+EXTRA_JS_MODULES.devtools.shared.vendor += [
+    'react.js',
+    'redux.js',
 ]
 
-XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini']
\ No newline at end of file
+if CONFIG['DEBUG_JS_MODULES']:
+    EXTRA_JS_MODULES.devtools.shared.vendor += [
+        'content/react-dev.js'
+    ]
rename from browser/devtools/shared/content/react-dev.js
rename to browser/devtools/shared/vendor/react-dev.js
rename from browser/devtools/shared/content/react.js
rename to browser/devtools/shared/vendor/react.js
new file mode 100644
--- /dev/null
+++ b/browser/devtools/shared/vendor/redux.js
@@ -0,0 +1,610 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else if(typeof exports === 'object')
+		exports["Redux"] = factory();
+	else
+		root["Redux"] = factory();
+})(this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId])
+/******/ 			return installedModules[moduleId].exports;
+
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			exports: {},
+/******/ 			id: moduleId,
+/******/ 			loaded: false
+/******/ 		};
+
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ 		// Flag the module as loaded
+/******/ 		module.loaded = true;
+
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+
+
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+	var _createStore = __webpack_require__(1);
+
+	var _createStore2 = _interopRequireDefault(_createStore);
+
+	var _utilsCombineReducers = __webpack_require__(7);
+
+	var _utilsCombineReducers2 = _interopRequireDefault(_utilsCombineReducers);
+
+	var _utilsBindActionCreators = __webpack_require__(6);
+
+	var _utilsBindActionCreators2 = _interopRequireDefault(_utilsBindActionCreators);
+
+	var _utilsApplyMiddleware = __webpack_require__(5);
+
+	var _utilsApplyMiddleware2 = _interopRequireDefault(_utilsApplyMiddleware);
+
+	var _utilsCompose = __webpack_require__(2);
+
+	var _utilsCompose2 = _interopRequireDefault(_utilsCompose);
+
+	exports.createStore = _createStore2['default'];
+	exports.combineReducers = _utilsCombineReducers2['default'];
+	exports.bindActionCreators = _utilsBindActionCreators2['default'];
+	exports.applyMiddleware = _utilsApplyMiddleware2['default'];
+	exports.compose = _utilsCompose2['default'];
+
+/***/ },
+/* 1 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports['default'] = createStore;
+
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+	var _utilsIsPlainObject = __webpack_require__(3);
+
+	var _utilsIsPlainObject2 = _interopRequireDefault(_utilsIsPlainObject);
+
+	/**
+	 * These are private action types reserved by Redux.
+	 * For any unknown actions, you must return the current state.
+	 * If the current state is undefined, you must return the initial state.
+	 * Do not reference these action types directly in your code.
+	 */
+	var ActionTypes = {
+	  INIT: '@@redux/INIT'
+	};
+
+	exports.ActionTypes = ActionTypes;
+	/**
+	 * Creates a Redux store that holds the state tree.
+	 * The only way to change the data in the store is to call `dispatch()` on it.
+	 *
+	 * There should only be a single store in your app. To specify how different
+	 * parts of the state tree respond to actions, you may combine several reducers
+	 * into a single reducer function by using `combineReducers`.
+	 *
+	 * @param {Function} reducer A function that returns the next state tree, given
+	 * the current state tree and the action to handle.
+	 *
+	 * @param {any} [initialState] The initial state. You may optionally specify it
+	 * to hydrate the state from the server in universal apps, or to restore a
+	 * previously serialized user session.
+	 * If you use `combineReducers` to produce the root reducer function, this must be
+	 * an object with the same shape as `combineReducers` keys.
+	 *
+	 * @returns {Store} A Redux store that lets you read the state, dispatch actions
+	 * and subscribe to changes.
+	 */
+
+	function createStore(reducer, initialState) {
+	  if (typeof reducer !== 'function') {
+	    throw new Error('Expected the reducer to be a function.');
+	  }
+
+	  var currentReducer = reducer;
+	  var currentState = initialState;
+	  var listeners = [];
+	  var isDispatching = false;
+
+	  /**
+	   * Reads the state tree managed by the store.
+	   *
+	   * @returns {any} The current state tree of your application.
+	   */
+	  function getState() {
+	    return currentState;
+	  }
+
+	  /**
+	   * Adds a change listener. It will be called any time an action is dispatched,
+	   * and some part of the state tree may potentially have changed. You may then
+	   * call `getState()` to read the current state tree inside the callback.
+	   *
+	   * @param {Function} listener A callback to be invoked on every dispatch.
+	   * @returns {Function} A function to remove this change listener.
+	   */
+	  function subscribe(listener) {
+	    listeners.push(listener);
+
+	    return function unsubscribe() {
+	      var index = listeners.indexOf(listener);
+	      listeners.splice(index, 1);
+	    };
+	  }
+
+	  /**
+	   * Dispatches an action. It is the only way to trigger a state change.
+	   *
+	   * The `reducer` function, used to create the store, will be called with the
+	   * current state tree and the given `action`. Its return value will
+	   * be considered the **next** state of the tree, and the change listeners
+	   * will be notified.
+	   *
+	   * The base implementation only supports plain object actions. If you want to
+	   * dispatch a Promise, an Observable, a thunk, or something else, you need to
+	   * wrap your store creating function into the corresponding middleware. For
+	   * example, see the documentation for the `redux-thunk` package. Even the
+	   * middleware will eventually dispatch plain object actions using this method.
+	   *
+	   * @param {Object} action A plain object representing “what changed”. It is
+	   * a good idea to keep actions serializable so you can record and replay user
+	   * sessions, or use the time travelling `redux-devtools`.
+	   *
+	   * @returns {Object} For convenience, the same action object you dispatched.
+	   *
+	   * Note that, if you use a custom middleware, it may wrap `dispatch()` to
+	   * return something else (for example, a Promise you can await).
+	   */
+	  function dispatch(action) {
+	    if (!_utilsIsPlainObject2['default'](action)) {
+	      throw new Error('Actions must be plain objects. Use custom middleware for async actions.');
+	    }
+
+	    if (isDispatching) {
+	      throw new Error('Reducers may not dispatch actions.');
+	    }
+
+	    try {
+	      isDispatching = true;
+	      currentState = currentReducer(currentState, action);
+	    } finally {
+	      isDispatching = false;
+	    }
+
+	    listeners.slice().forEach(function (listener) {
+	      return listener();
+	    });
+	    return action;
+	  }
+
+	  /**
+	   * Replaces the reducer currently used by the store to calculate the state.
+	   *
+	   * You might need this if your app implements code splitting and you want to
+	   * load some of the reducers dynamically. You might also need this if you
+	   * implement a hot reloading mechanism for Redux.
+	   *
+	   * @param {Function} nextReducer The reducer for the store to use instead.
+	   * @returns {void}
+	   */
+	  function replaceReducer(nextReducer) {
+	    currentReducer = nextReducer;
+	    dispatch({ type: ActionTypes.INIT });
+	  }
+
+	  // When a store is created, an "INIT" action is dispatched so that every
+	  // reducer returns their initial state. This effectively populates
+	  // the initial state tree.
+	  dispatch({ type: ActionTypes.INIT });
+
+	  return {
+	    dispatch: dispatch,
+	    subscribe: subscribe,
+	    getState: getState,
+	    replaceReducer: replaceReducer
+	  };
+	}
+
+/***/ },
+/* 2 */
+/***/ function(module, exports) {
+
+	/**
+	 * Composes single-argument functions from right to left.
+	 *
+	 * @param {...Function} funcs The functions to compose.
+	 * @returns {Function} A function obtained by composing functions from right to
+	 * left. For example, compose(f, g, h) is identical to x => h(g(f(x))).
+	 */
+	"use strict";
+
+	exports.__esModule = true;
+	exports["default"] = compose;
+
+	function compose() {
+	  for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
+	    funcs[_key] = arguments[_key];
+	  }
+
+	  return function (arg) {
+	    return funcs.reduceRight(function (composed, f) {
+	      return f(composed);
+	    }, arg);
+	  };
+	}
+
+	module.exports = exports["default"];
+
+/***/ },
+/* 3 */
+/***/ function(module, exports) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports['default'] = isPlainObject;
+	var fnToString = function fnToString(fn) {
+	  return Function.prototype.toString.call(fn);
+	};
+
+	/**
+	 * @param {any} obj The object to inspect.
+	 * @returns {boolean} True if the argument appears to be a plain object.
+	 */
+
+	function isPlainObject(obj) {
+	  if (!obj || typeof obj !== 'object') {
+	    return false;
+	  }
+
+	  var proto = typeof obj.constructor === 'function' ? Object.getPrototypeOf(obj) : Object.prototype;
+
+	  if (proto === null) {
+	    return true;
+	  }
+
+	  var constructor = proto.constructor;
+
+	  return typeof constructor === 'function' && constructor instanceof constructor && fnToString(constructor) === fnToString(Object);
+	}
+
+	module.exports = exports['default'];
+
+/***/ },
+/* 4 */
+/***/ function(module, exports) {
+
+	/**
+	 * Applies a function to every key-value pair inside an object.
+	 *
+	 * @param {Object} obj The source object.
+	 * @param {Function} fn The mapper function that receives the value and the key.
+	 * @returns {Object} A new object that contains the mapped values for the keys.
+	 */
+	"use strict";
+
+	exports.__esModule = true;
+	exports["default"] = mapValues;
+
+	function mapValues(obj, fn) {
+	  return Object.keys(obj).reduce(function (result, key) {
+	    result[key] = fn(obj[key], key);
+	    return result;
+	  }, {});
+	}
+
+	module.exports = exports["default"];
+
+/***/ },
+/* 5 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+
+	var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+	exports['default'] = applyMiddleware;
+
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+	var _compose = __webpack_require__(2);
+
+	var _compose2 = _interopRequireDefault(_compose);
+
+	/**
+	 * Creates a store enhancer that applies middleware to the dispatch method
+	 * of the Redux store. This is handy for a variety of tasks, such as expressing
+	 * asynchronous actions in a concise manner, or logging every action payload.
+	 *
+	 * See `redux-thunk` package as an example of the Redux middleware.
+	 *
+	 * Because middleware is potentially asynchronous, this should be the first
+	 * store enhancer in the composition chain.
+	 *
+	 * Note that each middleware will be given the `dispatch` and `getState` functions
+	 * as named arguments.
+	 *
+	 * @param {...Function} middlewares The middleware chain to be applied.
+	 * @returns {Function} A store enhancer applying the middleware.
+	 */
+
+	function applyMiddleware() {
+	  for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) {
+	    middlewares[_key] = arguments[_key];
+	  }
+
+	  return function (next) {
+	    return function (reducer, initialState) {
+	      var store = next(reducer, initialState);
+	      var _dispatch = store.dispatch;
+	      var chain = [];
+
+	      var middlewareAPI = {
+	        getState: store.getState,
+	        dispatch: function dispatch(action) {
+	          return _dispatch(action);
+	        }
+	      };
+	      chain = middlewares.map(function (middleware) {
+	        return middleware(middlewareAPI);
+	      });
+	      _dispatch = _compose2['default'].apply(undefined, chain)(store.dispatch);
+
+	      return _extends({}, store, {
+	        dispatch: _dispatch
+	      });
+	    };
+	  };
+	}
+
+	module.exports = exports['default'];
+
+/***/ },
+/* 6 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports['default'] = bindActionCreators;
+
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+	var _utilsMapValues = __webpack_require__(4);
+
+	var _utilsMapValues2 = _interopRequireDefault(_utilsMapValues);
+
+	function bindActionCreator(actionCreator, dispatch) {
+	  return function () {
+	    return dispatch(actionCreator.apply(undefined, arguments));
+	  };
+	}
+
+	/**
+	 * Turns an object whose values are action creators, into an object with the
+	 * same keys, but with every function wrapped into a `dispatch` call so they
+	 * may be invoked directly. This is just a convenience method, as you can call
+	 * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.
+	 *
+	 * For convenience, you can also pass a single function as the first argument,
+	 * and get a function in return.
+	 *
+	 * @param {Function|Object} actionCreators An object whose values are action
+	 * creator functions. One handy way to obtain it is to use ES6 `import * as`
+	 * syntax. You may also pass a single function.
+	 *
+	 * @param {Function} dispatch The `dispatch` function available on your Redux
+	 * store.
+	 *
+	 * @returns {Function|Object} The object mimicking the original object, but with
+	 * every action creator wrapped into the `dispatch` call. If you passed a
+	 * function as `actionCreators`, the return value will also be a single
+	 * function.
+	 */
+
+	function bindActionCreators(actionCreators, dispatch) {
+	  if (typeof actionCreators === 'function') {
+	    return bindActionCreator(actionCreators, dispatch);
+	  }
+
+	  if (typeof actionCreators !== 'object' || actionCreators == null) {
+	    // eslint-disable-line no-eq-null
+	    throw new Error('bindActionCreators expected an object or a function, instead received ' + typeof actionCreators + '. ' + 'Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?');
+	  }
+
+	  return _utilsMapValues2['default'](actionCreators, function (actionCreator) {
+	    return bindActionCreator(actionCreator, dispatch);
+	  });
+	}
+
+	module.exports = exports['default'];
+
+/***/ },
+/* 7 */
+/***/ function(module, exports, __webpack_require__) {
+
+	'use strict';
+
+	exports.__esModule = true;
+	exports['default'] = combineReducers;
+
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
+
+	var _createStore = __webpack_require__(1);
+
+	var _utilsIsPlainObject = __webpack_require__(3);
+
+	var _utilsIsPlainObject2 = _interopRequireDefault(_utilsIsPlainObject);
+
+	var _utilsMapValues = __webpack_require__(4);
+
+	var _utilsMapValues2 = _interopRequireDefault(_utilsMapValues);
+
+	var _utilsPick = __webpack_require__(8);
+
+	var _utilsPick2 = _interopRequireDefault(_utilsPick);
+
+	/* eslint-disable no-console */
+
+	function getErrorMessage(key, action) {
+	  var actionType = action && action.type;
+	  var actionName = actionType && '"' + actionType.toString() + '"' || 'an action';
+
+	  return 'Reducer "' + key + '" returned undefined handling ' + actionName + '. ' + 'To ignore an action, you must explicitly return the previous state.';
+	}
+
+	function verifyStateShape(initialState, currentState) {
+	  var reducerKeys = Object.keys(currentState);
+
+	  if (reducerKeys.length === 0) {
+	    console.error('Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.');
+	    return;
+	  }
+
+	  if (!_utilsIsPlainObject2['default'](initialState)) {
+	    console.error('initialState has unexpected type of "' + ({}).toString.call(initialState).match(/\s([a-z|A-Z]+)/)[1] + '". Expected initialState to be an object with the following ' + ('keys: "' + reducerKeys.join('", "') + '"'));
+	    return;
+	  }
+
+	  var unexpectedKeys = Object.keys(initialState).filter(function (key) {
+	    return reducerKeys.indexOf(key) < 0;
+	  });
+
+	  if (unexpectedKeys.length > 0) {
+	    console.error('Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('"' + unexpectedKeys.join('", "') + '" in initialState will be ignored. ') + ('Expected to find one of the known reducer keys instead: "' + reducerKeys.join('", "') + '"'));
+	  }
+	}
+
+	/**
+	 * Turns an object whose values are different reducer functions, into a single
+	 * reducer function. It will call every child reducer, and gather their results
+	 * into a single state object, whose keys correspond to the keys of the passed
+	 * reducer functions.
+	 *
+	 * @param {Object} reducers An object whose values correspond to different
+	 * reducer functions that need to be combined into one. One handy way to obtain
+	 * it is to use ES6 `import * as reducers` syntax. The reducers may never return
+	 * undefined for any action. Instead, they should return their initial state
+	 * if the state passed to them was undefined, and the current state for any
+	 * unrecognized action.
+	 *
+	 * @returns {Function} A reducer function that invokes every reducer inside the
+	 * passed object, and builds a state object with the same shape.
+	 */
+
+	function combineReducers(reducers) {
+	  var finalReducers = _utilsPick2['default'](reducers, function (val) {
+	    return typeof val === 'function';
+	  });
+
+	  Object.keys(finalReducers).forEach(function (key) {
+	    var reducer = finalReducers[key];
+	    if (typeof reducer(undefined, { type: _createStore.ActionTypes.INIT }) === 'undefined') {
+	      throw new Error('Reducer "' + key + '" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined.');
+	    }
+
+	    var type = Math.random().toString(36).substring(7).split('').join('.');
+	    if (typeof reducer(undefined, { type: type }) === 'undefined') {
+	      throw new Error('Reducer "' + key + '" returned undefined when probed with a random type. ' + ('Don\'t try to handle ' + _createStore.ActionTypes.INIT + ' or other actions in "redux/*" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined.');
+	    }
+	  });
+
+	  var defaultState = _utilsMapValues2['default'](finalReducers, function () {
+	    return undefined;
+	  });
+	  var stateShapeVerified;
+
+	  return function combination(state, action) {
+	    if (state === undefined) state = defaultState;
+
+	    var finalState = _utilsMapValues2['default'](finalReducers, function (reducer, key) {
+	      var newState = reducer(state[key], action);
+	      if (typeof newState === 'undefined') {
+	        throw new Error(getErrorMessage(key, action));
+	      }
+	      return newState;
+	    });
+
+	    if (true) {
+	      if (!stateShapeVerified) {
+	        verifyStateShape(state, finalState);
+	        stateShapeVerified = true;
+	      }
+	    }
+
+	    return finalState;
+	  };
+	}
+
+	module.exports = exports['default'];
+
+/***/ },
+/* 8 */
+/***/ function(module, exports) {
+
+	/**
+	 * Picks key-value pairs from an object where values satisfy a predicate.
+	 *
+	 * @param {Object} obj The object to pick from.
+	 * @param {Function} fn The predicate the values must satisfy to be copied.
+	 * @returns {Object} The object with the values that satisfied the predicate.
+	 */
+	"use strict";
+
+	exports.__esModule = true;
+	exports["default"] = pick;
+
+	function pick(obj, fn) {
+	  return Object.keys(obj).reduce(function (result, key) {
+	    if (fn(obj[key])) {
+	      result[key] = obj[key];
+	    }
+	    return result;
+	  }, {});
+	}
+
+	module.exports = exports["default"];
+
+/***/ }
+/******/ ])
+});
+;
\ No newline at end of file
--- a/browser/devtools/webaudioeditor/webaudioeditor.xul
+++ b/browser/devtools/webaudioeditor/webaudioeditor.xul
@@ -13,17 +13,17 @@
 ]>
 
 <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
   <script type="application/javascript;version=1.8"
           src="chrome://browser/content/devtools/theme-switching.js"/>
 
   <script type="application/javascript" src="chrome://browser/content/devtools/d3.js"/>
-  <script type="application/javascript" src="dagre-d3.js"/>
+  <script type="application/javascript" src="chrome://browser/content/devtools/dagre-d3.js"/>
   <script type="application/javascript" src="webaudioeditor/includes.js"/>
   <script type="application/javascript" src="webaudioeditor/models.js"/>
   <script type="application/javascript" src="webaudioeditor/controller.js"/>
   <script type="application/javascript" src="webaudioeditor/views/utils.js"/>
   <script type="application/javascript" src="webaudioeditor/views/context.js"/>
   <script type="application/javascript" src="webaudioeditor/views/inspector.js"/>
   <script type="application/javascript" src="webaudioeditor/views/properties.js"/>
   <script type="application/javascript" src="webaudioeditor/views/automation.js"/>
--- a/browser/locales/en-US/chrome/browser/browser.dtd
+++ b/browser/locales/en-US/chrome/browser/browser.dtd
@@ -466,16 +466,21 @@ These should match what Safari and other
      searchFor.label and searchWith.label. This string will be used instead of
      them when the user has not typed any keyword. -->
 <!ENTITY searchWithHeader.label       "Search with:">
 <!-- LOCALIZATION NOTE (changeSearchSettings.button):
      This string won't wrap, so if the translated string is longer,
      consider translating it as if it said only "Search Settings". -->
 <!ENTITY changeSearchSettings.button  "Change Search Settings">
 
+<!ENTITY searchInNewTab.label         "Search in New Tab">
+<!ENTITY searchInNewTab.accesskey     "T">
+<!ENTITY searchSetAsDefault.label     "Set As Default Search Engine">
+<!ENTITY searchSetAsDefault.accesskey "D">
+
 <!ENTITY tabView.commandkey           "e">
 
 <!ENTITY openLinkCmdInTab.label       "Open Link in New Tab">
 <!ENTITY openLinkCmdInTab.accesskey   "T">
 <!ENTITY openLinkCmd.label            "Open Link in New Window">
 <!ENTITY openLinkCmd.accesskey        "W">
 <!ENTITY openLinkInPrivateWindowCmd.label "Open Link in New Private Window">
 <!ENTITY openLinkInPrivateWindowCmd.accesskey "P">
--- a/browser/themes/shared/urlbarSearchSuggestionsNotification.inc.css
+++ b/browser/themes/shared/urlbarSearchSuggestionsNotification.inc.css
@@ -1,10 +1,11 @@
 #PopupAutoCompleteRichResult > hbox[anonid="search-suggestions-notification"] {
   border-bottom: 1px solid hsla(210, 4%, 10%, 0.14);
+  color: -moz-FieldText;
   background-color: hsla(210, 4%, 10%, 0.07);
   padding: 6px 0;
   -moz-padding-start: 44px;
   -moz-padding-end: 6px;
   background-image: url("chrome://browser/skin/info.svg");
   background-clip: padding-box;
   background-position: 20px center;
   background-repeat: no-repeat;
--- a/mobile/android/app/mobile.js
+++ b/mobile/android/app/mobile.js
@@ -940,8 +940,20 @@ pref("dom.vr.cardboard.enabled", true);
 
 pref("browser.tabs.showAudioPlayingIcon", true);
 
 // Enable service workers and fetch interception on Nightly Fennec
 #ifdef NIGHTLY_BUILD
 pref("dom.serviceWorkers.enabled", true);
 pref("dom.serviceWorkers.interception.enabled", true);
 #endif
+
+// The remote content URL where FxAccountsWebChannel messages originate.  Must use HTTPS.
+pref("identity.fxaccounts.remote.webchannel.uri", "https://accounts.firefox.com");
+
+// The remote URL of the Firefox Account profile server.
+pref("identity.fxaccounts.remote.profile.uri", "https://profile.accounts.firefox.com/v1");
+
+// The remote URL of the Firefox Account oauth server.
+pref("identity.fxaccounts.remote.oauth.uri", "https://oauth.accounts.firefox.com/v1"); 
+
+// Token server used by Firefox Account-authenticated Sync.
+pref("identity.sync.tokenserver.uri", "https://token.services.mozilla.com/1.0/sync/1.5");
--- a/mobile/android/base/AboutPages.java
+++ b/mobile/android/base/AboutPages.java
@@ -7,16 +7,17 @@ package org.mozilla.gecko;
 
 import org.mozilla.gecko.annotation.RobocopTarget;
 import org.mozilla.gecko.home.HomeConfig;
 import org.mozilla.gecko.home.HomeConfig.PanelType;
 import org.mozilla.gecko.util.StringUtils;
 
 public class AboutPages {
     // All of our special pages.
+    public static final String ACCOUNTS        = "about:accounts";
     public static final String ADDONS          = "about:addons";
     public static final String CONFIG          = "about:config";
     public static final String DOWNLOADS       = "about:downloads";
     public static final String FIREFOX         = "about:firefox";
     public static final String HEALTHREPORT    = "about:healthreport";
     public static final String HOME            = "about:home";
     public static final String LOGINS          = "about:logins";
     public static final String PRIVATEBROWSING = "about:privatebrowsing";
@@ -67,16 +68,17 @@ public class AboutPages {
     }
 
     public static boolean isAboutPage(String page, String url) {
         return url != null && url.toLowerCase().startsWith(page);
 
     }
 
     private static final String[] DEFAULT_ICON_PAGES = new String[] {
+        ACCOUNTS,
         ADDONS,
         CONFIG,
         DOWNLOADS,
         FIREFOX,
         HEALTHREPORT,
         UPDATER
     };
 
--- a/mobile/android/base/AccountsHelper.java
+++ b/mobile/android/base/AccountsHelper.java
@@ -16,16 +16,17 @@ import android.content.Intent;
 import android.util.Log;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.mozilla.gecko.fxa.FirefoxAccounts;
 import org.mozilla.gecko.fxa.FxAccountConstants;
 import org.mozilla.gecko.fxa.authenticator.AndroidFxAccount;
 import org.mozilla.gecko.fxa.login.Engaged;
 import org.mozilla.gecko.fxa.login.State;
+import org.mozilla.gecko.restrictions.Restriction;
 import org.mozilla.gecko.sync.Utils;
 import org.mozilla.gecko.sync.setup.SyncAccounts;
 import org.mozilla.gecko.util.EventCallback;
 import org.mozilla.gecko.util.NativeEventListener;
 import org.mozilla.gecko.util.NativeJSObject;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
@@ -69,16 +70,26 @@ public class AccountsHelper implements N
                 "Accounts:UpdateFirefoxAccountFromJSON",
                 "Accounts:Create",
                 "Accounts:DeleteFirefoxAccount",
                 "Accounts:Exist");
     }
 
     @Override
     public void handleMessage(String event, NativeJSObject message, final EventCallback callback) {
+        if (!RestrictedProfiles.isAllowed(mContext, Restriction.DISALLOW_MODIFY_ACCOUNTS)) {
+            // We register for messages in all contexts; we drop, with a log and an error to JavaScript,
+            // when the profile is restricted.  It's better to return errors than silently ignore messages.
+            Log.e(LOGTAG, "Profile is not allowed to modify accounts!  Ignoring event: " + event);
+            if (callback != null) {
+                callback.sendError("Profile is not allowed to modify accounts!");
+            }
+            return;
+        }
+
         if ("Accounts:CreateFirefoxAccountFromJSON".equals(event)) {
             AndroidFxAccount fxAccount = null;
             try {
                 final NativeJSObject json = message.getObject("json");
                 final String email = json.getString("email");
                 final String uid = json.getString("uid");
                 final boolean verified = json.optBoolean("verified", false);
                 final byte[] unwrapkB = Utils.hex2Byte(json.getString("unwrapBKey"));
--- a/mobile/android/base/BrowserApp.java
+++ b/mobile/android/base/BrowserApp.java
@@ -5,31 +5,29 @@
 
 package org.mozilla.gecko;
 
 import org.mozilla.gecko.annotation.RobocopTarget;
 import org.mozilla.gecko.AppConstants.Versions;
 import org.mozilla.gecko.DynamicToolbar.PinReason;
 import org.mozilla.gecko.DynamicToolbar.VisibilityTransition;
 import org.mozilla.gecko.GeckoProfileDirectories.NoMozillaDirectoryException;
-import org.mozilla.gecko.PrintHelper;
 import org.mozilla.gecko.Tabs.TabEvents;
 import org.mozilla.gecko.animation.PropertyAnimator;
 import org.mozilla.gecko.animation.TransitionsTracker;
 import org.mozilla.gecko.animation.ViewHelper;
 import org.mozilla.gecko.db.BrowserContract.Combined;
 import org.mozilla.gecko.db.BrowserDB;
 import org.mozilla.gecko.db.SuggestedSites;
 import org.mozilla.gecko.distribution.Distribution;
 import org.mozilla.gecko.favicons.Favicons;
 import org.mozilla.gecko.favicons.LoadFaviconTask;
 import org.mozilla.gecko.favicons.OnFaviconLoadedListener;
 import org.mozilla.gecko.favicons.decoders.IconDirectoryEntry;
 import org.mozilla.gecko.firstrun.FirstrunPane;
-import org.mozilla.gecko.gfx.BitmapUtils;
 import org.mozilla.gecko.gfx.DynamicToolbarAnimator;
 import org.mozilla.gecko.gfx.ImmutableViewportMetrics;
 import org.mozilla.gecko.gfx.LayerView;
 import org.mozilla.gecko.health.BrowserHealthRecorder;
 import org.mozilla.gecko.health.BrowserHealthReporter;
 import org.mozilla.gecko.health.HealthRecorder;
 import org.mozilla.gecko.health.SessionInformation;
 import org.mozilla.gecko.home.BrowserSearch;
@@ -92,17 +90,16 @@ import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.nfc.NdefMessage;
 import android.nfc.NdefRecord;
 import android.nfc.NfcAdapter;
 import android.nfc.NfcEvent;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.StrictMode;
@@ -2576,17 +2573,17 @@ public class BrowserApp extends GeckoApp
                 super.onActivityResult(requestCode, resultCode, data);
         }
     }
 
     private void showFirstrunPager() {
         if (mFirstrunPane == null) {
             final ViewStub firstrunPagerStub = (ViewStub) findViewById(R.id.firstrun_pager_stub);
             mFirstrunPane = (FirstrunPane) firstrunPagerStub.inflate();
-            mFirstrunPane.load(getSupportFragmentManager());
+            mFirstrunPane.load(getApplicationContext(), getSupportFragmentManager());
             mFirstrunPane.registerOnFinishListener(new FirstrunPane.OnFinishListener() {
                 @Override
                 public void onFinish() {
                     BrowserApp.this.mFirstrunPane = null;
                 }
             });
         }
 
--- a/mobile/android/base/TelemetryContract.java
+++ b/mobile/android/base/TelemetryContract.java
@@ -159,16 +159,19 @@ public interface TelemetryContract {
 
         // Action triggered from a notification in the Android notification bar.
         NOTIFICATION("notification"),
 
         // Action triggered from a pageaction in the URLBar.
         // Note: Only used in JavaScript for now, but here for completeness.
         PAGEACTION("pageaction"),
 
+        // Action triggered from one of a series of views, such as ViewPager.
+        PANEL("panel"),
+
         // Action triggered from a settings screen.
         SETTINGS("settings"),
 
         // Actions triggered from the share overlay.
         SHARE_OVERLAY("shareoverlay"),
 
         // Action triggered from a suggestion provided to the user.
         SUGGESTION("suggestion"),
@@ -202,16 +205,19 @@ public interface TelemetryContract {
      * Telemetry.startUISession() as the "sessionName" parameter.
      *
      * Please keep this list sorted.
      */
     public enum Session {
         // Awesomescreen (including frecency search) is active.
         AWESOMESCREEN("awesomescreen.1"),
 
+        // Used to tag experiments being run.
+        EXPERIMENT("experiment.1"),
+
         // Started the very first time we believe the application has been launched.
         FIRSTRUN("firstrun.1"),
 
         // Awesomescreen frecency search is active.
         FRECENCY("frecency.1"),
 
         // Started when a user enters a given home panel.
         // Session name is dynamic, encoded as "homepanel.1:<panel_id>"
--- a/mobile/android/base/firstrun/FirstrunPager.java
+++ b/mobile/android/base/firstrun/FirstrunPager.java
@@ -6,50 +6,81 @@
 package org.mozilla.gecko.firstrun;
 
 import android.content.Context;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentPagerAdapter;
 import android.support.v4.view.ViewPager;
 import android.util.AttributeSet;
+import android.util.Log;
 import com.nineoldandroids.animation.Animator;
 import com.nineoldandroids.animation.AnimatorSet;
 import com.nineoldandroids.animation.ObjectAnimator;
 import com.nineoldandroids.view.ViewHelper;
 
 import org.mozilla.gecko.RestrictedProfiles;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
 import org.mozilla.gecko.animation.TransitionsTracker;
 
 import java.util.List;
 
 public class FirstrunPager extends ViewPager {
+
     private Context context;
-    protected FirstrunPane.OnFinishListener listener;
+    protected FirstrunPanel.PagerNavigation pagerNavigation;
 
     public FirstrunPager(Context context) {
         this(context, null);
     }
 
     public FirstrunPager(Context context, AttributeSet attrs) {
         super(context, attrs);
         this.context = context;
     }
 
-    public void load(FragmentManager fm, FirstrunPane.OnFinishListener listener) {
-        final List<FirstrunPagerConfig.FirstrunPanel> panels;
+    public void load(Context appContext, FragmentManager fm, final FirstrunPane.OnFinishListener onFinishListener) {
+        final List<FirstrunPagerConfig.FirstrunPanelConfig> panels;
 
         if (RestrictedProfiles.isUserRestricted(context)) {
             panels = FirstrunPagerConfig.getRestricted();
         } else {
-            panels = FirstrunPagerConfig.getDefault();
+            panels = FirstrunPagerConfig.getDefault(appContext);
         }
 
         setAdapter(new ViewPagerAdapter(fm, panels));
-        this.listener = listener;
+        this.pagerNavigation = new FirstrunPanel.PagerNavigation() {
+            @Override
+            public void next() {
+                final int currentPage = FirstrunPager.this.getCurrentItem();
+                if (currentPage < FirstrunPager.this.getChildCount() - 1) {
+                    FirstrunPager.this.setCurrentItem(currentPage + 1);
+                }
+            }
+
+            @Override
+            public void finish() {
+                if (onFinishListener != null) {
+                    onFinishListener.onFinish();
+                }
+            }
+        };
+        addOnPageChangeListener(new OnPageChangeListener() {
+            @Override
+            public void onPageScrolled(int i, float v, int i1) {}
+
+            @Override
+            public void onPageSelected(int i) {
+                Telemetry.sendUIEvent(TelemetryContract.Event.SHOW, TelemetryContract.Method.PANEL, "onboarding." + i);
+            }
+
+            @Override
+            public void onPageScrollStateChanged(int i) {}
+        });
 
         animateLoad();
     }
 
     public void hide() {
         setAdapter(null);
     }
 
@@ -68,27 +99,33 @@ public class FirstrunPager extends ViewP
         set.playTogether(alphaAnimator, translateAnimator);
         set.setStartDelay(400);
         TransitionsTracker.track(set);
 
         set.start();
     }
 
     private class ViewPagerAdapter extends FragmentPagerAdapter {
-        private List<FirstrunPagerConfig.FirstrunPanel> panels;
+        private final List<FirstrunPagerConfig.FirstrunPanelConfig> panels;
+        private final Fragment[] fragments;
 
-        public ViewPagerAdapter(FragmentManager fm, List<FirstrunPagerConfig.FirstrunPanel> panels) {
+        public ViewPagerAdapter(FragmentManager fm, List<FirstrunPagerConfig.FirstrunPanelConfig> panels) {
             super(fm);
             this.panels = panels;
+            this.fragments = new Fragment[panels.size()];
         }
 
         @Override
         public Fragment getItem(int i) {
-            final Fragment fragment = Fragment.instantiate(context, panels.get(i).getClassname());
-            ((FirstrunPanel) fragment).setOnFinishListener(listener);
+            Fragment fragment = this.fragments[i];
+            if (fragment == null) {
+                fragment = Fragment.instantiate(context, panels.get(i).getClassname());
+                ((FirstrunPanel) fragment).setPagerNavigation(pagerNavigation);
+                fragments[i] = fragment;
+            }
             return fragment;
         }
 
         @Override
         public int getCount() {
             return panels.size();
         }
 
--- a/mobile/android/base/firstrun/FirstrunPagerConfig.java
+++ b/mobile/android/base/firstrun/FirstrunPagerConfig.java
@@ -1,36 +1,74 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
  * 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/. */
 
 package org.mozilla.gecko.firstrun;
 
+import android.content.Context;
+import android.util.Log;
+import com.keepsafe.switchboard.SwitchBoard;
+import org.mozilla.gecko.AppConstants;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
+
 import java.util.LinkedList;
 import java.util.List;
 
 public class FirstrunPagerConfig {
-    public static List<FirstrunPanel> getDefault() {
-        final List<FirstrunPanel> panels = new LinkedList<>();
-        panels.add(new FirstrunPanel(WelcomePanel.class.getName(), WelcomePanel.TITLE_RES));
+    public static final String LOGTAG = "FirstrunPagerConfig";
+    public static final String ONBOARDING_A = "onboarding-a";
+    public static final String ONBOARDING_B = "onboarding-b";
+
+    public static List<FirstrunPanelConfig> getDefault(Context context) {
+        final List<FirstrunPanelConfig> panels = new LinkedList<>();
+        if (isInExperimentLocal(context, ONBOARDING_A)) {
+            panels.add(new FirstrunPanelConfig(WelcomePanel.class.getName(), WelcomePanel.TITLE_RES));
+            Telemetry.startUISession(TelemetryContract.Session.EXPERIMENT, ONBOARDING_A);
+        } else if (isInExperimentLocal(context, ONBOARDING_B)) {
+            // Strings used for first run, pulled from existing strings.
+            panels.add(new FirstrunPanelConfig(ImportPanel.class.getName(), ImportPanel.TITLE_RES));
+            panels.add(new FirstrunPanelConfig(SyncPanel.class.getName(), SyncPanel.TITLE_RES));
+            Telemetry.startUISession(TelemetryContract.Session.EXPERIMENT, ONBOARDING_B);
+        } else {
+            Log.d(LOGTAG, "Not in an experiment!");
+            panels.add(new FirstrunPanelConfig(WelcomePanel.class.getName(), WelcomePanel.TITLE_RES));
+        }
+
         return panels;
     }
 
-    public static List<FirstrunPanel> getRestricted() {
-        final List<FirstrunPanel> panels = new LinkedList<>();
-        panels.add(new FirstrunPanel(RestrictedWelcomePanel.class.getName(), RestrictedWelcomePanel.TITLE_RES));
+    /*
+     * Wrapper method for using local bucketing rather than server-side.
+     * This needs to match the server-side bucketing used on mozilla-switchboard.herokuapp.com.
+     */
+    private static boolean isInExperimentLocal(Context context, String name) {
+        if (AppConstants.MOZ_SWITCHBOARD) {
+            if (SwitchBoard.isInBucket(context, 0, 50)) {
+                return ONBOARDING_A.equals(name);
+            } else if (SwitchBoard.isInBucket(context, 50, 100)) {
+                return ONBOARDING_B.equals(name);
+            }
+        }
+        return false;
+    }
+
+    public static List<FirstrunPanelConfig> getRestricted() {
+        final List<FirstrunPanelConfig> panels = new LinkedList<>();
+        panels.add(new FirstrunPanelConfig(RestrictedWelcomePanel.class.getName(), RestrictedWelcomePanel.TITLE_RES));
         return panels;
     }
 
-    public static class FirstrunPanel {
+    public static class FirstrunPanelConfig {
         private String classname;
         private int titleRes;
 
-        public FirstrunPanel(String resource, int titleRes) {
+        public FirstrunPanelConfig(String resource, int titleRes) {
             this.classname= resource;
             this.titleRes = titleRes;
         }
 
         public String getClassname() {
             return this.classname;
         }
 
--- a/mobile/android/base/firstrun/FirstrunPane.java
+++ b/mobile/android/base/firstrun/FirstrunPane.java
@@ -10,16 +10,18 @@ import android.support.v4.app.FragmentMa
 import android.util.AttributeSet;
 
 import android.view.View;
 import android.widget.LinearLayout;
 import com.nineoldandroids.animation.Animator;
 import com.nineoldandroids.animation.AnimatorListenerAdapter;
 import com.nineoldandroids.animation.ObjectAnimator;
 import org.mozilla.gecko.R;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
 import org.mozilla.gecko.animation.TransitionsTracker;
 
 public class FirstrunPane extends LinearLayout {
     public static final String PREF_FIRSTRUN_ENABLED = "startpane_enabled";
 
     public static interface OnFinishListener {
         public void onFinish();
     }
@@ -30,20 +32,20 @@ public class FirstrunPane extends Linear
 
     public FirstrunPane(Context context) {
         this(context, null);
     }
     public FirstrunPane(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
-    public void load(FragmentManager fm) {
+    public void load(Context appContext, FragmentManager fm) {
         visible = true;
         pager = (FirstrunPager) findViewById(R.id.firstrun_pager);
-        pager.load(fm, new OnFinishListener() {
+        pager.load(appContext, fm, new OnFinishListener() {
             @Override
             public void onFinish() {
                 hide();
             }
         });
     }
 
     public boolean isVisible() {
@@ -52,16 +54,20 @@ public class FirstrunPane extends Linear
 
     public void hide() {
         visible = false;
         pager.hide();
         if (onFinishListener != null) {
             onFinishListener.onFinish();
         }
         animateHide();
+
+        // Stop all versions of firstrun A/B sessions.
+        Telemetry.stopUISession(TelemetryContract.Session.EXPERIMENT, FirstrunPagerConfig.ONBOARDING_A);
+        Telemetry.stopUISession(TelemetryContract.Session.EXPERIMENT, FirstrunPagerConfig.ONBOARDING_B);
     }
 
     private void animateHide() {
         final Animator alphaAnimator = ObjectAnimator.ofFloat(this, "alpha", 0);
         alphaAnimator.setDuration(150);
         alphaAnimator.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
--- a/mobile/android/base/firstrun/FirstrunPanel.java
+++ b/mobile/android/base/firstrun/FirstrunPanel.java
@@ -5,20 +5,30 @@
 
 package org.mozilla.gecko.firstrun;
 
 import android.support.v4.app.Fragment;
 
 public class FirstrunPanel extends Fragment {
 
     public static final int TITLE_RES = -1;
-    protected FirstrunPane.OnFinishListener onFinishListener;
+    public interface PagerNavigation {
+        void next();
+        void finish();
+    }
+    protected PagerNavigation pagerNavigation;
 
-    public void setOnFinishListener(FirstrunPane.OnFinishListener listener) {
-        this.onFinishListener = listener;
+    public void setPagerNavigation(PagerNavigation listener) {
+        this.pagerNavigation = listener;
+    }
+
+    protected void next() {
+        if (pagerNavigation != null) {
+            pagerNavigation.next();
+        }
     }
 
     protected void close() {
-        if (onFinishListener != null) {
-            onFinishListener.onFinish();
+        if (pagerNavigation != null) {
+            pagerNavigation.finish();
         }
     }
 }
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/firstrun/ImportPanel.java
@@ -0,0 +1,159 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * 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/. */
+
+package org.mozilla.gecko.firstrun;
+
+import android.app.AlertDialog;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
+import org.mozilla.gecko.preferences.AndroidImport;
+import org.mozilla.gecko.util.ThreadUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class ImportPanel extends FirstrunPanel {
+    public static final String LOGTAG = "GeckoImportPanel";
+    public static final int TITLE_RES = R.string.firstrun_import_title;
+    private static final int AUTOADVANCE_DELAY_MS = 1500;
+
+    // These match the item positions in R.array.pref_import_android_entries.
+    private static int BOOKMARKS_INDEX = 0;
+    private static int HISTORY_INDEX = 1;
+
+    private ImageView confirmImage;
+    private Button choiceButton;
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
+        final ViewGroup root = (ViewGroup) inflater.inflate(R.layout.firstrun_import_fragment, container, false);
+        choiceButton = (Button) root.findViewById(R.id.import_action_button);
+        confirmImage = (ImageView) root.findViewById(R.id.confirm_check);
+        choiceButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+                final List<Integer> checked = new ArrayList<>(Arrays.asList(0, 1));
+                Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, "firstrun-import-action");
+                builder.setTitle(R.string.firstrun_import_action)
+                       .setMultiChoiceItems(R.array.pref_import_android_entries, makeBooleanArray(R.array.pref_import_android_defaults), new DialogInterface.OnMultiChoiceClickListener() {
+                           @Override
+                           public void onClick(DialogInterface dialogInterface, int index, boolean isChecked) {
+                               // Add telemetry for toggling checkboxes.
+                               Telemetry.sendUIEvent(TelemetryContract.Event.EDIT, TelemetryContract.Method.DIALOG, "firstrun-import-dialog-checkbox");
+                               if (isChecked && !checked.contains(index)) {
+                                   checked.add(index);
+                               } else if (!isChecked && checked.contains(index)) {
+                                   checked.remove(checked.indexOf(index));
+                               }
+                           }
+                       })
+                       .setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {
+                           @Override
+                           public void onClick(DialogInterface dialog, int i) {
+                               Telemetry.sendUIEvent(TelemetryContract.Event.CANCEL, TelemetryContract.Method.BUTTON, "firstrun-import-dialog");
+                               dialog.dismiss();
+                           }
+                       })
+                       .setPositiveButton(R.string.firstrun_import_dialog_button, new DialogInterface.OnClickListener() {
+                           @Override
+                           public void onClick(DialogInterface dialog, int i) {
+                               final boolean importBookmarks = checked.contains(BOOKMARKS_INDEX);
+                               final boolean importHistory = checked.contains(HISTORY_INDEX);
+
+                               runImport(importBookmarks, importHistory);
+
+                               // Telemetry for what options are confirmed.
+                               final int importState = (importBookmarks ? 1 : 0) + (importHistory ? 2 : 0);
+                               Telemetry.sendUIEvent(TelemetryContract.Event.SAVE, TelemetryContract.Method.BUTTON, "firstrun-import-dialog-" + importState);
+                               dialog.dismiss();
+                           }
+                       });
+
+                builder.create().show();
+            }
+        });
+
+        root.findViewById(R.id.import_link).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, "firstrun-import-next");
+                pagerNavigation.next();
+            }
+        });
+
+        return root;
+    }
+
+    private boolean[] makeBooleanArray(int resId) {
+        final String[] defaults = getResources().getStringArray(resId);
+        final boolean[] booleanArray = new boolean[defaults.length];
+        for (int i = 0; i < defaults.length; i++) {
+            booleanArray[i] = defaults[i].equals("true");
+        }
+        return booleanArray;
+    }
+
+    protected void runImport(final boolean doBookmarks, final boolean doHistory) {
+        Log.d(LOGTAG, "Importing Android history/bookmarks");
+        if (!doBookmarks && !doHistory) {
+            return;
+        }
+
+        final Context context = getActivity();
+        final String dialogTitle = context.getString(R.string.firstrun_import_progress_title);
+
+        final ProgressDialog dialog =
+                ProgressDialog.show(context,
+                        dialogTitle,
+                        context.getString(R.string.bookmarkhistory_import_wait),
+                        true);
+
+        final Runnable stopCallback = new Runnable() {
+            @Override
+            public void run() {
+                ThreadUtils.postToUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        confirmImage.setVisibility(View.VISIBLE);
+                        choiceButton.setVisibility(View.GONE);
+
+                        dialog.dismiss();
+
+                        ThreadUtils.postDelayedToUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                next();
+                            }
+                        }, AUTOADVANCE_DELAY_MS);
+                    }
+                });
+            }
+        };
+
+        ThreadUtils.postToBackgroundThread(
+            // Constructing AndroidImport may need finding the profile,
+            // which hits disk, so it needs to go into a Runnable too.
+            new Runnable() {
+                @Override
+                public void run() {
+                    new AndroidImport(context, stopCallback, doBookmarks, doHistory).run();
+                }
+            }
+        );
+    }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/firstrun/SyncPanel.java
@@ -0,0 +1,49 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * 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/. */
+
+package org.mozilla.gecko.firstrun;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.Telemetry;
+import org.mozilla.gecko.TelemetryContract;
+import org.mozilla.gecko.fxa.activities.FxAccountGetStartedActivity;
+
+public class SyncPanel extends FirstrunPanel {
+    // XXX: To simplify localization, this uses the pref_sync string. If this is used in the final product, add a new string to Nightly.
+    public static final int TITLE_RES = R.string.pref_sync;
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
+        final ViewGroup root = (ViewGroup) inflater.inflate(R.layout.firstrun_sync_fragment, container, false);
+        // TODO: Update id names.
+        root.findViewById(R.id.welcome_account).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, "firstrun-sync");
+
+                final Intent accountIntent = new Intent(getActivity(), FxAccountGetStartedActivity.class);
+                startActivity(accountIntent);
+
+                close();
+            }
+        });
+
+        root.findViewById(R.id.welcome_browse).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, "firstrun-browser");
+                close();
+            }
+        });
+
+        return root;
+    }
+}
--- a/mobile/android/base/firstrun/WelcomePanel.java
+++ b/mobile/android/base/firstrun/WelcomePanel.java
@@ -5,33 +5,36 @@
 
 package org.mozilla.gecko.firstrun;
 
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.ImageView;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.Telemetry;
 import org.mozilla.gecko.TelemetryContract;
 import org.mozilla.gecko.fxa.FxAccountConstants;
+import org.mozilla.gecko.fxa.activities.FxAccountWebFlowActivity;
 
 public class WelcomePanel extends FirstrunPanel {
     public static final int TITLE_RES = R.string.firstrun_panel_title_welcome;
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
         final ViewGroup root = (ViewGroup) inflater.inflate(R.layout.firstrun_welcome_fragment, container, false);
         root.findViewById(R.id.welcome_account).setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, "firstrun-sync");
 
                 final Intent intent = new Intent(FxAccountConstants.ACTION_FXA_GET_STARTED);
+                intent.putExtra(FxAccountWebFlowActivity.EXTRA_ENDPOINT, FxAccountConstants.ENDPOINT_FIRSTRUN);
                 intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                 startActivity(intent);
 
                 close();
             }
         });
 
         root.findViewById(R.id.welcome_browse).setOnClickListener(new View.OnClickListener() {
--- a/mobile/android/base/fxa/FxAccountConstants.java
+++ b/mobile/android/base/fxa/FxAccountConstants.java
@@ -95,9 +95,13 @@ public class FxAccountConstants {
    */
   public static final String ACCOUNT_STATE_CHANGED_ACTION = AppConstants.MOZ_ANDROID_SHARED_FXACCOUNT_TYPE + ".accounts.ACCOUNT_STATE_CHANGED_ACTION";
 
   public static final String ACTION_FXA_CONFIRM_ACCOUNT            = AppConstants.ANDROID_PACKAGE_NAME + ".ACTION_FXA_CONFIRM_ACCOUNT";
   public static final String ACTION_FXA_FINISH_MIGRATING           = AppConstants.ANDROID_PACKAGE_NAME + ".ACTION_FXA_FINISH_MIGRATING";
   public static final String ACTION_FXA_GET_STARTED                = AppConstants.ANDROID_PACKAGE_NAME + ".ACTION_FXA_GET_STARTED";
   public static final String ACTION_FXA_STATUS                     = AppConstants.ANDROID_PACKAGE_NAME + ".ACTION_FXA_STATUS";
   public static final String ACTION_FXA_UPDATE_CREDENTIALS         = AppConstants.ANDROID_PACKAGE_NAME + ".ACTION_FXA_UPDATE_CREDENTIALS";
+
+  public static final String ENDPOINT_PREFERENCES  = "preferences";
+  public static final String ENDPOINT_NOTIFICATION = "notification";
+  public static final String ENDPOINT_FIRSTRUN = "firstrun";
 }
--- a/mobile/android/base/fxa/activities/FxAccountConfirmAccountActivityWeb.java
+++ b/mobile/android/base/fxa/activities/FxAccountConfirmAccountActivityWeb.java
@@ -1,11 +1,11 @@
 /* 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/. */
 
 package org.mozilla.gecko.fxa.activities;
 
 public class FxAccountConfirmAccountActivityWeb extends FxAccountWebFlowActivity {
   public FxAccountConfirmAccountActivityWeb() {
-    super(CANNOT_RESUME_WHEN_NO_ACCOUNTS_EXIST, "settings");
+    super(CANNOT_RESUME_WHEN_NO_ACCOUNTS_EXIST, "manage");
   }
 }
--- a/mobile/android/base/fxa/activities/FxAccountGetStartedActivityWeb.java
+++ b/mobile/android/base/fxa/activities/FxAccountGetStartedActivityWeb.java
@@ -1,11 +1,11 @@
 /* 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/. */
 
 package org.mozilla.gecko.fxa.activities;
 
 public class FxAccountGetStartedActivityWeb extends FxAccountWebFlowActivity {
   public FxAccountGetStartedActivityWeb() {
-    super(CANNOT_RESUME_WHEN_ACCOUNTS_EXIST, "signin");
+    super(CANNOT_RESUME_WHEN_ACCOUNTS_EXIST, "signup");
   }
 }
--- a/mobile/android/base/fxa/activities/FxAccountStatusFragment.java
+++ b/mobile/android/base/fxa/activities/FxAccountStatusFragment.java
@@ -244,30 +244,32 @@ public class FxAccountStatusFragment
     if (preference == manageAccountPreference) {
       // There's no native equivalent, so no need to re-direct through an Intent filter.
       ActivityUtils.openURLInFennec(getActivity().getApplicationContext(), "about:accounts?action=manage");
       return true;
     }
 
     if (preference == needsPasswordPreference) {
       final Intent intent = new Intent(FxAccountConstants.ACTION_FXA_UPDATE_CREDENTIALS);
+      intent.putExtra(FxAccountWebFlowActivity.EXTRA_ENDPOINT, FxAccountConstants.ENDPOINT_PREFERENCES);
       final Bundle extras = getExtrasForAccount();
       if (extras != null) {
         intent.putExtras(extras);
       }
       // Per http://stackoverflow.com/a/8992365, this triggers a known bug with
       // the soft keyboard not being shown for the started activity. Why, Android, why?
       intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
       startActivity(intent);
 
       return true;
     }
 
     if (preference == needsFinishMigratingPreference) {
       final Intent intent = new Intent(FxAccountConstants.ACTION_FXA_FINISH_MIGRATING);
+      intent.putExtra(FxAccountWebFlowActivity.EXTRA_ENDPOINT, FxAccountConstants.ENDPOINT_PREFERENCES);
       final Bundle extras = getExtrasForAccount();
       if (extras != null) {
         intent.putExtras(extras);
       }
       // Per http://stackoverflow.com/a/8992365, this triggers a known bug with
       // the soft keyboard not being shown for the started activity. Why, Android, why?
       intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
       startActivity(intent);
@@ -279,16 +281,17 @@ public class FxAccountStatusFragment
       if (AppConstants.MOZ_ANDROID_NATIVE_ACCOUNT_UI) {
         FxAccountCodeResender.resendCode(getActivity().getApplicationContext(), fxAccount);
       }
 
       final Intent intent = new Intent(FxAccountConstants.ACTION_FXA_CONFIRM_ACCOUNT);
       // Per http://stackoverflow.com/a/8992365, this triggers a known bug with
       // the soft keyboard not being shown for the started activity. Why, Android, why?
       intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
+      intent.putExtra(FxAccountWebFlowActivity.EXTRA_ENDPOINT, FxAccountConstants.ENDPOINT_PREFERENCES);
       startActivity(intent);
 
       return true;
     }
 
     if (preference == bookmarksPreference ||
         preference == historyPreference ||
         preference == passwordsPreference ||
--- a/mobile/android/base/fxa/activities/FxAccountWebFlowActivity.java
+++ b/mobile/android/base/fxa/activities/FxAccountWebFlowActivity.java
@@ -1,28 +1,35 @@
 /* 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/. */
 
 package org.mozilla.gecko.fxa.activities;
 
+import android.content.Intent;
 import android.os.Bundle;
 import org.mozilla.gecko.Locales;
 import org.mozilla.gecko.background.common.log.Logger;
 import org.mozilla.gecko.fxa.FxAccountConstants;
-import org.mozilla.gecko.fxa.authenticator.AndroidFxAccount;
 import org.mozilla.gecko.sync.setup.activities.ActivityUtils;
 
 /**
  * Activity which shows the status activity or passes through to web flow.
  */
 public class FxAccountWebFlowActivity extends FxAccountAbstractActivity {
     protected static final String LOG_TAG = FxAccountWebFlowActivity.class.getSimpleName();
 
     protected static final String ABOUT_ACCOUNTS = "about:accounts";
+
+    public static final String EXTRA_ENDPOINT = "entrypoint";
+
+    protected static final String[] EXTRAS_TO_PASSTHROUGH = new String[] {
+            EXTRA_ENDPOINT,
+    };
+
     private final String action;
     private final String extras;
 
     public FxAccountWebFlowActivity(int resume, String action) {
         this(resume, action, null);
     }
 
     public FxAccountWebFlowActivity(int resume, String action, String extras) {
@@ -44,18 +51,38 @@ public class FxAccountWebFlowActivity ex
         super.onCreate(icicle);
     }
 
     protected boolean redirectIfAppropriate() {
         final boolean redirected = super.redirectIfAppropriate();
         if (redirected) {
             return true;
         }
-        ActivityUtils.openURLInFennec(getApplicationContext(),
-                ABOUT_ACCOUNTS + "?action=" + action + extras);
+
+        final StringBuilder sb = new StringBuilder();
+        sb.append(ABOUT_ACCOUNTS);
+        sb.append("?action=");
+        sb.append(action);
+        sb.append(extras);
+
+        // Pass through a set of known string values from intent extras to about:accounts.
+        final Intent intent = getIntent();
+        if (intent != null) {
+            for (String key : EXTRAS_TO_PASSTHROUGH) {
+                final String value = intent.getStringExtra(key);
+                if (value != null) {
+                    sb.append("&");
+                    sb.append(key);
+                    sb.append("=");
+                    sb.append(value);
+                }
+            }
+        }
+
+        ActivityUtils.openURLInFennec(getApplicationContext(), sb.toString());
         return true;
     }
 
     @Override
     public void onResume() {
         super.onResume();
 
         // We are always redirected.
--- a/mobile/android/base/fxa/sync/FxAccountNotificationManager.java
+++ b/mobile/android/base/fxa/sync/FxAccountNotificationManager.java
@@ -11,16 +11,17 @@ import android.content.Intent;
 import android.support.v4.app.NotificationCompat;
 import android.support.v4.app.NotificationCompat.Builder;
 import org.mozilla.gecko.BrowserLocaleManager;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.background.common.log.Logger;
 import org.mozilla.gecko.background.common.telemetry.TelemetryWrapper;
 import org.mozilla.gecko.background.fxa.FxAccountUtils;
 import org.mozilla.gecko.fxa.FxAccountConstants;
+import org.mozilla.gecko.fxa.activities.FxAccountWebFlowActivity;
 import org.mozilla.gecko.fxa.authenticator.AndroidFxAccount;
 import org.mozilla.gecko.fxa.login.State;
 import org.mozilla.gecko.fxa.login.State.Action;
 import org.mozilla.gecko.sync.telemetry.TelemetryContract;
 
 /**
  * Abstraction that manages notifications shown or hidden for a Firefox Account.
  * <p>
@@ -88,16 +89,19 @@ public class FxAccountNotificationManage
       title = context.getResources().getString(R.string.fxaccount_sync_finish_migrating_notification_title);
       text = context.getResources().getString(R.string.fxaccount_sync_finish_migrating_notification_text, state.email);
       notificationIntent = new Intent(FxAccountConstants.ACTION_FXA_FINISH_MIGRATING);
     } else {
       title = context.getResources().getString(R.string.fxaccount_sync_sign_in_error_notification_title);
       text = context.getResources().getString(R.string.fxaccount_sync_sign_in_error_notification_text, state.email);
       notificationIntent = new Intent(FxAccountConstants.ACTION_FXA_STATUS);
     }
+
+    notificationIntent.putExtra(FxAccountWebFlowActivity.EXTRA_ENDPOINT, FxAccountConstants.ENDPOINT_NOTIFICATION);
+
     Logger.info(LOG_TAG, "State " + state.getStateLabel() + " needs action; offering notification with title: " + title);
     FxAccountUtils.pii(LOG_TAG, "And text: " + text);
 
     final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
 
     final Builder builder = new NotificationCompat.Builder(context);
     builder
     .setContentTitle(title)
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -1,22 +1,32 @@
 <!-- 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/. -->
 
 
 <!ENTITY  no_space_to_start_error "There is not enough space available for &brandShortName; to start.">
 <!ENTITY  error_loading_file "An error occurred when trying to load files required to run &brandShortName;">
 
+<!ENTITY firstrun_panel_title_welcome "Welcome">
 <!ENTITY  onboard_start_message3 "Browse with &brandShortName;">
 <!ENTITY  onboard_start_subtext3 "Make your mobile Web browsing experience truly your own.">
 <!ENTITY  onboard_start_button_account "Sign in to &brandShortName;">
 <!ENTITY  onboard_start_button_browser "Start Browsing">
+<!ENTITY firstrun_button_next "Next">
+
 <!ENTITY  onboard_start_restricted1 "Stay safe and in control with this simplified version of &brandShortName;.">
 
+<!ENTITY firstrun_import_title "Import">
+<!ENTITY firstrun_import_message "Welcome to &brandShortName;">
+<!ENTITY firstrun_import_subtext "Import your bookmarks and history from another browser.">
+<!ENTITY firstrun_import_action "Transfer to &brandShortName;">
+<!ENTITY firstrun_import_dialog_button "Transfer">
+<!ENTITY firstrun_import_progress_title "Transferring">
+
 <!-- Localization note: These are used as the titles of different pages on the home screen.
      They are automatically converted to all caps by the Android platform. -->
 <!ENTITY  bookmarks_title "Bookmarks">
 <!ENTITY  history_title "History">
 <!ENTITY  reading_list_title "Reading List">
 <!ENTITY  recent_tabs_title "Recent Tabs">
 
 <!ENTITY  switch_to_tab "Switch to tab">
@@ -481,18 +491,16 @@ size. -->
 <!ENTITY button_cancel "Cancel">
 <!ENTITY button_yes "Yes">
 <!ENTITY button_no "No">
 <!ENTITY button_clear_data "Clear data">
 <!ENTITY button_set "Set">
 <!ENTITY button_clear "Clear">
 <!ENTITY button_copy "Copy">
 
-<!ENTITY firstrun_panel_title_welcome "Welcome">
-
 <!ENTITY home_top_sites_title "Top Sites">
 <!-- Localization note (home_top_sites_add): This string is used as placeholder
      text underneath empty thumbnails in the Top Sites page on about:home. -->
 <!ENTITY home_top_sites_add "Add a site">
 
 <!-- Localization note (home_title): This string should be kept in sync
      with the page title defined in aboutHome.dtd -->
 <!ENTITY home_title "&brandShortName; Home">
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -226,17 +226,19 @@ gbjar.sources += [
     'favicons/RemoteFavicon.java',
     'FilePicker.java',
     'FilePickerResultHandler.java',
     'FindInPageBar.java',
     'firstrun/FirstrunPager.java',
     'firstrun/FirstrunPagerConfig.java',
     'firstrun/FirstrunPane.java',
     'firstrun/FirstrunPanel.java',
+    'firstrun/ImportPanel.java',
     'firstrun/RestrictedWelcomePanel.java',
+    'firstrun/SyncPanel.java',
     'firstrun/WelcomePanel.java',
     'FormAssistPopup.java',
     'GeckoAccessibility.java',
     'GeckoActivity.java',
     'GeckoActivityStatus.java',
     'GeckoApp.java',
     'GeckoApplication.java',
     'GeckoAppShell.java',
@@ -493,16 +495,17 @@ gbjar.sources += [
     'toolbar/BrowserToolbarTablet.java',
     'toolbar/BrowserToolbarTabletBase.java',
     'toolbar/CanvasDelegate.java',
     'toolbar/ForwardButton.java',
     'toolbar/NavButton.java',
     'toolbar/PageActionLayout.java',
     'toolbar/PhoneTabsButton.java',
     'toolbar/ShapedButton.java',
+    'toolbar/ShapedButtonFrameLayout.java',
     'toolbar/SiteIdentityPopup.java',
     'toolbar/TabCounter.java',
     'toolbar/ToolbarDisplayLayout.java',
     'toolbar/ToolbarEditLayout.java',
     'toolbar/ToolbarEditText.java',
     'toolbar/ToolbarPrefs.java',
     'toolbar/ToolbarProgressView.java',
     'TouchEventInterceptor.java',
--- a/mobile/android/base/preferences/AndroidImport.java
+++ b/mobile/android/base/preferences/AndroidImport.java
@@ -18,17 +18,17 @@ import android.content.OperationApplicat
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.RemoteException;
 import android.provider.BaseColumns;
 import android.util.Log;
 
 import java.util.ArrayList;
 
-class AndroidImport implements Runnable {
+public class AndroidImport implements Runnable {
     /**
      * The Android M SDK removed several fields and methods from android.provider.Browser. This class is used as a
      * replacement to support building with the new SDK but at the same time still use these fields on lower Android
      * versions.
      */
     private static class LegacyBrowserProvider {
         public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");
 
--- a/mobile/android/base/preferences/SyncPreference.java
+++ b/mobile/android/base/preferences/SyncPreference.java
@@ -8,16 +8,17 @@ package org.mozilla.gecko.preferences;
 import android.content.Context;
 import android.content.Intent;
 import android.preference.Preference;
 import android.util.AttributeSet;
 import org.mozilla.gecko.Telemetry;
 import org.mozilla.gecko.TelemetryContract;
 import org.mozilla.gecko.TelemetryContract.Method;
 import org.mozilla.gecko.fxa.FxAccountConstants;
+import org.mozilla.gecko.fxa.activities.FxAccountWebFlowActivity;
 import org.mozilla.gecko.sync.setup.SyncAccounts;
 import org.mozilla.gecko.sync.setup.activities.SetupSyncActivity;
 
 class SyncPreference extends Preference {
     private static final boolean DEFAULT_TO_FXA = true;
 
     private final Context mContext;
 
@@ -35,16 +36,17 @@ class SyncPreference extends Preference 
             return;
         }
         Intent intent = new Intent(mContext, SetupSyncActivity.class);
         mContext.startActivity(intent);
     }
 
     private void launchFxASetup() {
         final Intent intent = new Intent(FxAccountConstants.ACTION_FXA_GET_STARTED);
+        intent.putExtra(FxAccountWebFlowActivity.EXTRA_ENDPOINT, FxAccountConstants.ENDPOINT_PREFERENCES);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
         mContext.startActivity(intent);
     }
 
     @Override
     protected void onClick() {
         // If we're not defaulting to FxA, just do what we've always done.
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3a145553833ade6de1a97f462daed61f83a5bcde
GIT binary patch
literal 21493
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7b8f5170ec503d68ab3b16677f91f7afffd2b0c9
GIT binary patch
literal 33584
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
abE@6*2!BQZHIj_<^GrcqzCiBH`~L^VcqLQ-
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6cffbae14f133083d98f21c43ec51d6702f3c356
GIT binary patch
literal 83129
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
--- a/mobile/android/base/resources/drawable/shaped_button.xml
+++ b/mobile/android/base/resources/drawable/shaped_button.xml
@@ -1,17 +1,19 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- 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/. -->
 
+<!-- If you change this view, update ShapedButton*,
+     which dynamically resets to this view. -->
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item android:state_pressed="true"
           android:drawable="@color/highlight_shaped"/>
 
     <item android:state_focused="true"
           android:state_pressed="false"
           android:drawable="@color/highlight_shaped_focused"/>
- 
+
     <item android:drawable="@color/text_and_tabs_tray_grey"/>
 
 </selector>
--- a/mobile/android/base/resources/layout/browser_toolbar.xml
+++ b/mobile/android/base/resources/layout/browser_toolbar.xml
@@ -31,17 +31,17 @@
                android:layout_alignBottom="@id/url_bar_entry"
                android:duplicateParentState="true"
                android:clickable="false"
                android:focusable="false"
                android:visibility="invisible"
                android:src="@drawable/url_bar_translating_edge"
                android:scaleType="fitXY"/>
 
-    <org.mozilla.gecko.widget.themed.ThemedFrameLayout
+    <org.mozilla.gecko.toolbar.ShapedButtonFrameLayout
             android:id="@+id/menu"
             style="@style/UrlBar.ImageButton"
             android:layout_alignParentRight="true"
             android:contentDescription="@string/menu"
             android:background="@drawable/shaped_button"
             android:visibility="gone">
 
         <org.mozilla.gecko.widget.themed.ThemedImageView
@@ -49,17 +49,17 @@
                 style="@style/UrlBar.ImageButton"
                 android:layout_height="@dimen/browser_toolbar_menu_icon_height"
                 android:layout_width="wrap_content"
                 android:scaleType="centerInside"
                 android:layout_gravity="center"
                 android:src="@drawable/menu"
                 android:tint="@color/tabs_tray_icon_grey"/>
 
-    </org.mozilla.gecko.widget.themed.ThemedFrameLayout>
+    </org.mozilla.gecko.toolbar.ShapedButtonFrameLayout>
 
     <org.mozilla.gecko.toolbar.PhoneTabsButton android:id="@+id/tabs"
                                                style="@style/UrlBar.ImageButton"
                                                android:layout_width="64dip"
                                                android:layout_toLeftOf="@id/menu"
                                                android:layout_alignWithParentIfMissing="true"
                                                android:background="@drawable/shaped_button"/>
 
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/resources/layout/firstrun_import_fragment.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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/. -->
+
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:orientation="vertical"
+            android:fillViewport="true">
+
+    <LinearLayout android:layout_width="match_parent"
+                  android:layout_height="match_parent"
+                  android:minHeight="@dimen/firstrun_min_height"
+                  android:background="@color/android:white"
+                  android:gravity="center_horizontal"
+                  android:orientation="vertical">
+
+        <FrameLayout android:layout_width="match_parent"
+                     android:layout_height="wrap_content"
+                     android:background="@color/link_blue">
+
+            <ImageView android:layout_width="wrap_content"
+                       android:layout_height="wrap_content"
+                       android:layout_gravity="center"
+                       android:adjustViewBounds="true"
+                       android:src="@drawable/firstrun_background_coffee"/>
+
+            <ImageView android:layout_width="@dimen/firstrun_brand_size"
+                       android:layout_height="@dimen/firstrun_brand_size"
+                       android:src="@drawable/large_icon"
+                       android:layout_gravity="center"/>
+        </FrameLayout>
+
+
+        <TextView android:layout_width="@dimen/firstrun_content_width"
+                      android:layout_height="wrap_content"
+                      android:gravity="center"
+                      android:paddingTop="30dp"
+                      android:textAppearance="@style/TextAppearance.FirstrunLight.Main"
+                      android:text="@string/firstrun_import_message"/>
+
+            <TextView android:layout_width="@dimen/firstrun_content_width"
+                      android:layout_height="wrap_content"
+                      android:paddingTop="20dp"
+                      android:paddingBottom="30dp"
+                      android:gravity="center"
+                      android:textAppearance="@style/TextAppearance.FirstrunRegular.Body"
+                      android:text="@string/firstrun_import_subtext"/>
+
+            <Button android:id="@+id/import_action_button"
+                    style="@style/Widget.Firstrun.Button"
+                    android:background="@drawable/button_background_action_orange_round"
+                    android:layout_gravity="center"
+                    android:text="@string/firstrun_import_action"/>
+
+            <ImageView android:id="@+id/confirm_check"
+                       android:layout_width="wrap_content"
+                       android:layout_height="60dp"
+                       android:visibility="gone"
+                       android:src="@drawable/overlay_check"/>
+
+            <TextView android:id="@+id/import_link"
+                      android:layout_width="@dimen/firstrun_content_width"
+                      android:layout_height="wrap_content"
+                      android:padding="20dp"
+                      android:gravity="center"
+                      android:textAppearance="@style/TextAppearance.FirstrunRegular.Link"
+                      android:text="@string/firstrun_button_next"/>
+        </LinearLayout>
+</ScrollView>
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/resources/layout/firstrun_sync_fragment.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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/. -->
+
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:orientation="vertical"
+            android:fillViewport="true">
+
+    <LinearLayout android:layout_width="match_parent"
+                  android:layout_height="match_parent"
+                  android:minHeight="@dimen/firstrun_min_height"
+                  android:background="@color/android:white"
+                  android:gravity="center_horizontal"
+                  android:orientation="vertical">
+
+        <FrameLayout android:layout_width="match_parent"
+                     android:layout_height="wrap_content"
+                     android:background="@color/link_blue">
+
+            <ImageView android:layout_width="wrap_content"
+                       android:layout_height="wrap_content"
+                       android:layout_gravity="center"
+                       android:adjustViewBounds="true"
+                       android:src="@drawable/firstrun_background_devices"/>
+
+            <ImageView android:layout_width="@dimen/firstrun_brand_size"
+                       android:layout_height="@dimen/firstrun_brand_size"
+                       android:src="@drawable/large_icon"
+                       android:layout_gravity="center"/>
+        </FrameLayout>
+
+        <TextView android:layout_width="@dimen/firstrun_content_width"
+                  android:layout_height="wrap_content"
+                  android:gravity="center"
+                  android:paddingTop="30dp"
+                  android:textAppearance="@style/TextAppearance.FirstrunLight.Main"
+                  android:text="@string/firstrun_welcome_message"/>
+
+        <TextView android:layout_width="@dimen/firstrun_content_width"
+                  android:layout_height="wrap_content"
+                  android:paddingTop="20dp"
+                  android:paddingBottom="30dp"
+                  android:gravity="center"
+                  android:textAppearance="@style/TextAppearance.FirstrunRegular.Body"
+                  android:text="@string/firstrun_welcome_subtext"/>
+
+        <Button android:id="@+id/welcome_account"
+                style="@style/Widget.Firstrun.Button"
+                android:background="@drawable/button_background_action_orange_round"
+                android:layout_gravity="center"
+                android:text="@string/firstrun_welcome_button_account"/>
+
+        <TextView android:id="@+id/welcome_browse"
+                  android:layout_width="@dimen/firstrun_content_width"
+                  android:layout_height="wrap_content"
+                  android:padding="20dp"
+                  android:gravity="center"
+                  android:textAppearance="@style/TextAppearance.FirstrunRegular.Link"
+                  android:text="@string/firstrun_welcome_button_browser"/>
+    </LinearLayout>
+</ScrollView>
--- a/mobile/android/base/resources/xml/preferences_privacy.xml
+++ b/mobile/android/base/resources/xml/preferences_privacy.xml
@@ -33,17 +33,18 @@
     <ListPreference android:key="network.cookie.cookieBehavior"
                     android:title="@string/pref_cookies_menu"
                     android:entries="@array/pref_cookies_entries"
                     android:entryValues="@array/pref_cookies_values"
                     android:persistent="false" />
 
     <PreferenceCategory android:title="@string/pref_category_logins">
 
-        <org.mozilla.gecko.preferences.LinkPreference  android:title="@string/pref_manage_logins"
+        <org.mozilla.gecko.preferences.LinkPreference android:key="android.not_a_preference.signon.manage"
+                                                      android:title="@string/pref_manage_logins"
                                                       url="about:logins"/>
 
         <CheckBoxPreference android:key="signon.rememberSignons"
                             android:title="@string/pref_remember_signons"
                             android:persistent="false" />
 
         <CheckBoxPreference android:key="privacy.masterpassword.enabled"
                             android:title="@string/pref_use_master_password"
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -32,23 +32,34 @@
   <string name="android_package_name_for_ui">@ANDROID_PACKAGE_NAME@</string>
 
 #include ../search/strings/search_strings.xml.in
 
 #include ../services/strings.xml.in
   <string name="no_space_to_start_error">&no_space_to_start_error;</string>
   <string name="error_loading_file">&error_loading_file;</string>
 
+
+  <string name="firstrun_panel_title_welcome">&firstrun_panel_title_welcome;</string>
   <string name="firstrun_welcome_message">&onboard_start_message3;</string>
   <string name="firstrun_welcome_subtext">&onboard_start_subtext3;</string>
   <string name="firstrun_welcome_button_account">&onboard_start_button_account;</string>
   <string name="firstrun_welcome_button_browser">&onboard_start_button_browser;</string>
+  <string name="firstrun_button_next">&firstrun_button_next;</string>
   <string name="firstrun_empty_contentDescription"></string>
+
   <string name="firstrun_welcome_restricted">&onboard_start_restricted1;</string>
 
+  <string name="firstrun_import_title">&firstrun_import_title;</string>
+  <string name="firstrun_import_message">&firstrun_import_message;</string>
+  <string name="firstrun_import_subtext">&firstrun_import_subtext;</string>
+  <string name="firstrun_import_action">&firstrun_import_action;</string>
+  <string name="firstrun_import_dialog_button">&firstrun_import_dialog_button;</string>
+  <string name="firstrun_import_progress_title">&firstrun_import_progress_title;</string>
+
   <string name="bookmarks_title">&bookmarks_title;</string>
   <string name="history_title">&history_title;</string>
   <string name="reading_list_title">&reading_list_title;</string>
   <string name="recent_tabs_title">&recent_tabs_title;</string>
 
   <string name="switch_to_tab">&switch_to_tab;</string>
 
   <string name="crash_reporter_title">&crash_reporter_title;</string>
@@ -404,18 +415,16 @@
   <string name="button_cancel">&button_cancel;</string>
   <string name="button_clear_data">&button_clear_data;</string>
   <string name="button_set">&button_set;</string>
   <string name="button_clear">&button_clear;</string>
   <string name="button_yes">&button_yes;</string>
   <string name="button_no">&button_no;</string>
   <string name="button_copy">&button_copy;</string>
 
-  <string name="firstrun_panel_title_welcome">&firstrun_panel_title_welcome;</string>
-
   <string name="home_title">&home_title;</string>
   <string name="home_top_sites_title">&home_top_sites_title;</string>
   <string name="home_top_sites_add">&home_top_sites_add;</string>
   <string name="home_history_title">&home_history_title;</string>
   <string name="home_clear_history_button">&home_clear_history_button;</string>
   <string name="home_clear_history_confirm">&home_clear_history_confirm;</string>
   <string name="home_bookmarks_empty">&home_bookmarks_empty;</string>
   <string name="home_closed_tabs_title">&home_closed_tabs_title;</string>
--- a/mobile/android/base/sync/setup/activities/ActivityUtils.java
+++ b/mobile/android/base/sync/setup/activities/ActivityUtils.java
@@ -18,16 +18,17 @@ import android.text.Html;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.TextPaint;
 import android.text.method.LinkMovementMethod;
 import android.text.style.ClickableSpan;
 import android.text.style.URLSpan;
 import android.view.View;
 import android.widget.TextView;
+import org.mozilla.gecko.tabqueue.TabQueueDispatcher;
 
 public class ActivityUtils {
   private static final String LOG_TAG = "ActivityUtils";
 
   public static void prepareLogging() {
     Logger.setThreadLogTag(SyncConstants.GLOBAL_LOG_TAG);
   }
 
@@ -59,16 +60,17 @@ public class ActivityUtils {
     if (url != null) {
       intent = new Intent(Intent.ACTION_VIEW);
       intent.setData(Uri.parse(url));
     } else {
       intent = new Intent(Intent.ACTION_MAIN);
     }
     intent.setClassName(GlobalConstants.BROWSER_INTENT_PACKAGE, GlobalConstants.BROWSER_INTENT_CLASS);
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+    intent.putExtra(TabQueueDispatcher.SKIP_TAB_QUEUE_FLAG, true);
     context.startActivity(intent);
   }
 
   /**
    * Open a clicked span in Fennec with the provided URL.
    */
   public static class FennecClickableSpan extends ClickableSpan {
     private final String url;
--- a/mobile/android/base/toolbar/ShapedButton.java
+++ b/mobile/android/base/toolbar/ShapedButton.java
@@ -13,16 +13,20 @@ import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.PorterDuff.Mode;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.StateListDrawable;
 import android.util.AttributeSet;
 
+/**
+ * A ImageButton with a custom drawn path and lightweight theme support. Note that {@link ShapedButtonFrameLayout}
+ * copies the lwt support so if you change it here, you should probably change it there.
+ */
 public class ShapedButton extends ThemedImageButton
                           implements CanvasDelegate.DrawManager {
 
     protected final Path mPath;
     protected final CanvasDelegate mCanvasDelegate;
 
     public ShapedButton(Context context, AttributeSet attrs) {
         super(context, attrs);
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/toolbar/ShapedButtonFrameLayout.java
@@ -0,0 +1,74 @@
+/* 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/. */
+
+package org.mozilla.gecko.toolbar;
+
+import org.mozilla.gecko.R;
+import org.mozilla.gecko.lwt.LightweightThemeDrawable;
+import org.mozilla.gecko.util.ColorUtils;
+import org.mozilla.gecko.widget.themed.ThemedFrameLayout;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.StateListDrawable;
+import android.util.AttributeSet;
+
+/** A FrameLayout with lightweight theme support. Note that {@link ShapedButton}'s lwt support is basically the same so
+ * if you change it here, you should probably change it there. Note also that this doesn't have ShapedButton's path code
+ * so shouldn't have "ShapedButton" in the name, but I wanted to make the connection apparent so I left it.
+ */
+public class ShapedButtonFrameLayout extends ThemedFrameLayout {
+
+    public ShapedButtonFrameLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    // The drawable is constructed as per @drawable/shaped_button.
+    @Override
+    public void onLightweightThemeChanged() {
+        final int background = ColorUtils.getColor(getContext(), R.color.text_and_tabs_tray_grey);
+        final LightweightThemeDrawable lightWeight = getTheme().getColorDrawable(this, background);
+
+        if (lightWeight == null)
+            return;
+
+        lightWeight.setAlpha(34, 34);
+
+        final StateListDrawable stateList = new StateListDrawable();
+        stateList.addState(PRESSED_ENABLED_STATE_SET, getColorDrawable(R.color.highlight_shaped));
+        stateList.addState(FOCUSED_STATE_SET, getColorDrawable(R.color.highlight_shaped_focused));
+        stateList.addState(PRIVATE_STATE_SET, getColorDrawable(R.color.text_and_tabs_tray_grey));
+        stateList.addState(EMPTY_STATE_SET, lightWeight);
+
+        setBackgroundDrawable(stateList);
+    }
+
+    @Override
+    public void onLightweightThemeReset() {
+        setBackgroundResource(R.drawable.shaped_button);
+    }
+
+    @Override
+    public void setBackgroundDrawable(Drawable drawable) {
+        if (getBackground() == null || drawable == null) {
+            super.setBackgroundDrawable(drawable);
+            return;
+        }
+
+        int[] padding =  new int[] { getPaddingLeft(),
+                                     getPaddingTop(),
+                                     getPaddingRight(),
+                                     getPaddingBottom()
+                                   };
+        drawable.setLevel(getBackground().getLevel());
+        super.setBackgroundDrawable(drawable);
+
+        setPadding(padding[0], padding[1], padding[2], padding[3]);
+    }
+
+    @Override
+    public void setBackgroundResource(int resId) {
+        setBackgroundDrawable(getResources().getDrawable(resId));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/chrome/content/aboutAccounts.js
@@ -0,0 +1,327 @@
+// -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
+/* 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/. */
+
+/**
+ * Wrap a remote fxa-content-server.
+ *
+ * An about:accounts tab loads and displays an fxa-content-server page,
+ * depending on the current Android Account status and an optional 'action'
+ * parameter.
+ *
+ * We show a spinner while the remote iframe is loading.  We expect the
+ * WebChannel message listening to the fxa-content-server to send this tab's
+ * <browser>'s messageManager a LOADED message when the remote iframe provides
+ * the WebChannel LOADED message.  See the messageManager registration and the
+ * |loadedDeferred| promise.  This loosely couples the WebChannel implementation
+ * and about:accounts!  (We need this coupling in order to distinguish
+ * WebChannel LOADED messages produced by multiple about:accounts tabs.)
+ *
+ * We capture error conditions by accessing the inner nsIWebNavigation of the
+ * iframe directly.
+ */
+
+"use strict";
+
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components; /*global Components */
+
+Cu.import("resource://gre/modules/Accounts.jsm"); /*global Accounts */
+Cu.import("resource://gre/modules/PromiseUtils.jsm"); /*global PromiseUtils */
+Cu.import("resource://gre/modules/Services.jsm"); /*global Services */
+Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils */
+
+const ACTION_URL_PARAM = "action";
+
+const COMMAND_LOADED = "fxaccounts:loaded";
+
+const log = Cu.import("resource://gre/modules/AndroidLog.jsm", {}).AndroidLog.bind("FxAccounts");
+
+XPCOMUtils.defineLazyServiceGetter(this, "ParentalControls",
+  "@mozilla.org/parental-controls-service;1", "nsIParentalControlsService");
+
+// Shows the toplevel element with |id| to be shown - all other top-level
+// elements are hidden.
+// If |id| is 'spinner', then 'remote' is also shown, with opacity 0.
+function show(id) {
+  let allTop = document.querySelectorAll(".toplevel");
+  for (let elt of allTop) {
+    if (elt.getAttribute("id") == id) {
+      elt.style.display = 'block';
+    } else {
+      elt.style.display = 'none';
+    }
+  }
+  if (id == 'spinner') {
+    document.getElementById('remote').style.display = 'block';
+    document.getElementById('remote').style.opacity = 0;
+  }
+}
+
+var loadedDeferred = null;
+
+// We have a new load starting.  Replace the existing promise with a new one,
+// and queue up the transition to remote content.
+function deferTransitionToRemoteAfterLoaded() {
+  log.d('Waiting for LOADED message.');
+  loadedDeferred = PromiseUtils.defer();
+  loadedDeferred.promise.then(() => {
+    document.getElementById("remote").style.opacity = 0;
+    show("remote");
+    document.getElementById("remote").style.opacity = 1;
+  });
+}
+
+function handleLoadedMessage(message) {
+  log.d('Got LOADED message!');
+  loadedDeferred.resolve();
+};
+
+let wrapper = {
+  iframe: null,
+
+  url: null,
+
+  init: function (url) {
+    deferTransitionToRemoteAfterLoaded();
+
+    let iframe = document.getElementById("remote");
+    this.iframe = iframe;
+    this.iframe.QueryInterface(Ci.nsIFrameLoaderOwner);
+    let docShell = this.iframe.frameLoader.docShell;
+    docShell.QueryInterface(Ci.nsIWebProgress);
+    docShell.addProgressListener(this.iframeListener, Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
+
+    this.url = url;
+    // Set the iframe's location with loadURI/LOAD_FLAGS_BYPASS_HISTORY to
+    // avoid having a new history entry being added.
+    let webNav = iframe.frameLoader.docShell.QueryInterface(Ci.nsIWebNavigation);
+    webNav.loadURI(url, Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY, null, null, null);
+  },
+
+  retry: function () {
+    deferTransitionToRemoteAfterLoaded();
+
+    let webNav = this.iframe.frameLoader.docShell.QueryInterface(Ci.nsIWebNavigation);
+    webNav.loadURI(this.url, Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY, null, null, null);
+  },
+
+  iframeListener: {
+    QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
+                                         Ci.nsISupportsWeakReference,
+                                         Ci.nsISupports]),
+
+    onStateChange: function(aWebProgress, aRequest, aState, aStatus) {
+      let failure = false;
+
+      // Captive portals sometimes redirect users
+      if ((aState & Ci.nsIWebProgressListener.STATE_REDIRECTING)) {
+        failure = true;
+      } else if ((aState & Ci.nsIWebProgressListener.STATE_STOP)) {
+        if (aRequest instanceof Ci.nsIHttpChannel) {
+          try {
+            failure = aRequest.responseStatus != 200;
+          } catch (e) {
+            failure = aStatus != Components.results.NS_OK;
+          }
+        }
+      }
+
+      // Calling cancel() will raise some OnStateChange notifications by itself,
+      // so avoid doing that more than once
+      if (failure && aStatus != Components.results.NS_BINDING_ABORTED) {
+        aRequest.cancel(Components.results.NS_BINDING_ABORTED);
+        show("networkError");
+      }
+    },
+
+    onLocationChange: function(aWebProgress, aRequest, aLocation, aFlags) {
+      if (aRequest && aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_ERROR_PAGE) {
+        aRequest.cancel(Components.results.NS_BINDING_ABORTED);
+        show("networkError");
+      }
+    },
+
+    onProgressChange: function() {},
+    onStatusChange: function() {},
+    onSecurityChange: function() {},
+  },
+};
+
+
+function retry() {
+  log.i("Retrying.");
+  show("spinner");
+  wrapper.retry();
+}
+
+function openPrefs() {
+  log.i("Opening Sync preferences.");
+  // If an Android Account exists, this will open the Status Activity.
+  // Otherwise, it will begin the Get Started flow.  This should only be shown
+  // when an Account actually exists.
+  Accounts.launchSetup();
+}
+
+function getURLForAction(action, urlParams) {
+  let url = Services.urlFormatter.formatURLPref("identity.fxaccounts.remote.webchannel.uri");
+  url = url + (url.endsWith("/") ? "" : "/") + action;
+  const CONTEXT = "fx_fennec_v1";
+  // The only service managed by Fennec, to date, is Firefox Sync.
+  const SERVICE = "sync";
+  urlParams = urlParams || new URLSearchParams("");
+  urlParams.set('service', SERVICE);
+  urlParams.set('context', CONTEXT);
+  // Ideally we'd just merge urlParams with new URL(url).searchParams, but our
+  // URLSearchParams implementation doesn't support iteration (bug 1085284).
+  let urlParamStr = urlParams.toString();
+  if (urlParamStr) {
+    url += (url.includes("?") ? "&" : "?") + urlParamStr;
+  }
+  return url;
+}
+
+function updateDisplayedEmail(user) {
+  let emailDiv = document.getElementById("email");
+  if (emailDiv && user) {
+    emailDiv.textContent = user.email;
+  }
+}
+
+function init() {
+  // Test for restrictions before getFirefoxAccount(), since that will fail if
+  // we are restricted.
+  if (!ParentalControls.isAllowed(ParentalControls.MODIFY_ACCOUNTS)) {
+    // It's better to log and show an error message than to invite user
+    // confusion by removing about:accounts entirely.  That is, if the user is
+    // restricted, this way they'll discover as much and may be able to get
+    // out of their restricted profile.  If we remove about:accounts entirely,
+    // it will look like Fennec is buggy, and the user will be very confused.
+    log.e("This profile cannot connect to Firefox Accounts: showing restricted error.");
+    show("restrictedError");
+    return;
+  }
+
+  Accounts.getFirefoxAccount().then(user => {
+    // It's possible for the window to start closing before getting the user
+    // completes.  Tests in particular can cause this.
+    if (window.closed) {
+      return;
+    }
+
+    updateDisplayedEmail(user);
+
+    // Ideally we'd use new URL(document.URL).searchParams, but for about: URIs,
+    // searchParams is empty.
+    let urlParams = new URLSearchParams(document.URL.split("?")[1] || "");
+    let action = urlParams.get(ACTION_URL_PARAM);
+    urlParams.delete(ACTION_URL_PARAM);
+
+    switch (action) {
+    case "signup":
+      if (user) {
+        // Asking to sign-up when already signed in just shows prefs.
+        show("prefs");
+      } else {
+        show("spinner");
+        wrapper.init(getURLForAction("signup", urlParams));
+      }
+      break;
+    case "signin":
+      if (user) {
+        // Asking to sign-in when already signed in just shows prefs.
+        show("prefs");
+      } else {
+        show("spinner");
+        wrapper.init(getURLForAction("signin", urlParams));
+      }
+      break;
+    case "force_auth":
+      if (user) {
+        show("spinner");
+        urlParams.set("email", user.email); // In future, pin using the UID.
+        wrapper.init(getURLForAction("force_auth", urlParams));
+      } else {
+        show("spinner");
+        wrapper.init(getURLForAction("signup", urlParams));
+      }
+      break;
+    case "manage":
+      if (user) {
+        show("spinner");
+        urlParams.set("email", user.email); // In future, pin using the UID.
+        wrapper.init(getURLForAction("settings", urlParams));
+      } else {
+        show("spinner");
+        wrapper.init(getURLForAction("signup", urlParams));
+      }
+      break;
+    default:
+      // Unrecognized or no action specified.
+      if (action) {
+        log.w("Ignoring unrecognized action: " + action);
+      }
+      if (user) {
+        show("prefs");
+      } else {
+        show("spinner");
+        wrapper.init(getURLForAction("signup", urlParams));
+      }
+      break;
+    }
+  }).catch(e => {
+    log.e("Failed to get the signed in user: " + e.toString());
+  });
+}
+
+document.addEventListener("DOMContentLoaded", function onload() {
+  document.removeEventListener("DOMContentLoaded", onload, true);
+  init();
+  var buttonRetry = document.getElementById('buttonRetry');
+  buttonRetry.addEventListener('click', retry);
+
+  var buttonOpenPrefs = document.getElementById('buttonOpenPrefs');
+  buttonOpenPrefs.addEventListener('click', openPrefs);
+}, true);
+
+// This window is contained in a XUL <browser> element.  Return the
+// messageManager of that <browser> element, or null.
+function getBrowserMessageManager() {
+  let browser = window
+        .QueryInterface(Ci.nsIInterfaceRequestor)
+        .getInterface(Ci.nsIWebNavigation)
+        .QueryInterface(Ci.nsIDocShellTreeItem)
+        .rootTreeItem
+        .QueryInterface(Ci.nsIInterfaceRequestor)
+        .getInterface(Ci.nsIDOMWindow)
+        .QueryInterface(Ci.nsIDOMChromeWindow)
+        .BrowserApp
+        .getBrowserForDocument(document);
+  if (browser) {
+    return browser.messageManager;
+  }
+  return null;
+}
+
+// Add a single listener for 'loaded' messages from the iframe in this
+// <browser>.  These 'loaded' messages are ferried from the WebChannel to just
+// this <browser>.
+let mm = getBrowserMessageManager();
+if (mm) {
+  mm.addMessageListener(COMMAND_LOADED, handleLoadedMessage);
+} else {
+  log.e('No messageManager, not listening for LOADED message!');
+}
+
+window.addEventListener("unload", function(event) {
+  try {
+    let mm = getBrowserMessageManager();
+    if (mm) {
+      mm.removeMessageListener(COMMAND_LOADED, handleLoadedMessage);
+    }
+  } catch (e) {
+    // This could fail if the page is being torn down, the tab is being
+    // destroyed, etc.
+    log.w('Not removing listener for LOADED message: ' + e.toString());
+  }
+});
new file mode 100644
--- /dev/null
+++ b/mobile/android/chrome/content/aboutAccounts.xhtml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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/. -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [
+<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd" >
+%brandDTD;
+<!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd" >
+%globalDTD;
+<!ENTITY % aboutDTD SYSTEM "chrome://browser/locale/aboutAccounts.dtd">
+%aboutDTD;
+]>
+
+<html xmlns="http://www.w3.org/1999/xhtml" dir="&locale.dir;">
+  <head>
+    <title>Firefox Sync</title>
+    <meta name="viewport" content="width=device-width; user-scalable=0" />
+    <link rel="icon" type="image/png" sizes="64x64" href="chrome://branding/content/favicon64.png" />
+    <link rel="stylesheet" href="chrome://browser/skin/spinner.css" type="text/css"/>
+    <link rel="stylesheet" href="chrome://browser/skin/aboutBase.css" type="text/css"/>
+    <link rel="stylesheet" href="chrome://browser/skin/aboutAccounts.css" type="text/css"/>
+  </head>
+  <body>
+    <div id="spinner" class="toplevel">
+      <div class="container flex-column">
+        <!-- Empty text-container for spacing. -->
+        <div class="text-container flex-column" />
+
+          <div class="mui-refresh-main">
+            <div class="mui-refresh-wrapper">
+              <div class="mui-spinner-wrapper">
+                <div class="mui-spinner-main">
+                  <div class="mui-spinner-left">
+                    <div class="mui-half-circle-left" />
+                  </div>
+                  <div class="mui-spinner-right">
+                    <div class="mui-half-circle-right" />
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+
+      </div>
+    </div>
+
+    <iframe mozframetype="content" id="remote" class="toplevel" />
+
+    <div id="prefs" class="toplevel">
+      <div class="container flex-column">
+        <div class="text-container flex-column">
+          <div class="text">&aboutAccounts.connected.title;</div>
+          <div class="hint">&aboutAccounts.connected.description;</div>
+          <div id="email" class="hint"></div>
+        </div>
+        <a id="buttonOpenPrefs" tabindex="0" href="#">&aboutAccounts.syncPreferences.label;</a>
+      </div>
+    </div>
+
+    <div id="networkError" class="toplevel">
+      <div class="container flex-column">
+        <div class="text-container flex-column">
+          <div class="text">&aboutAccounts.noConnection.title;</div>
+        </div>
+        <div class="button-row">
+          <button id="buttonRetry" class="button" tabindex="1">&aboutAccounts.retry.label;</button>
+        </div>
+      </div>
+    </div>
+
+    <div id="restrictedError" class="toplevel">
+      <div class="container flex-column">
+        <div class="text-container flex-column">
+          <div class="text">&aboutAccounts.restrictedError.title;</div>
+          <div class="hint">&aboutAccounts.restrictedError.description;</div>
+        </div>
+      </div>
+    </div>
+
+    <script type="application/javascript;version=1.8" src="chrome://browser/content/aboutAccounts.js"></script>
+  </body>
+</html>
--- a/mobile/android/chrome/content/aboutLogins.xhtml
+++ b/mobile/android/chrome/content/aboutLogins.xhtml
@@ -11,16 +11,17 @@
 <!-- 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/. -->
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
     <title>&aboutLogins.title;</title>
     <meta name="viewport" content="width=device-width; user-scalable=0" />
     <link rel="icon" type="image/png" sizes="64x64" href="chrome://branding/content/favicon64.png" />
+    <link rel="stylesheet" href="chrome://browser/skin/spinner.css" type="text/css"/>
     <link rel="stylesheet" href="chrome://browser/skin/aboutBase.css" type="text/css"/>
     <link rel="stylesheet" href="chrome://browser/skin/aboutLogins.css" type="text/css"/>
     <script type="application/javascript;version=1.8" src="chrome://browser/content/aboutLogins.js"></script>
   </head>
   <body dir="&locale.dir;">
 
     <div id="logins-list-page">
       <div id="logins-header" class="header">
@@ -33,17 +34,32 @@
         <div id="logins-list" class="list"/>
         <div id="filter-input-container" hidden="true">
           <input id="filter-input" type="search"/>
           <div id="filter-clear"/>
         </div>
       </div>
       <div id="logins-list-loading-body" class="hidden">
         <div id="loading-img-container">
-          <object type="image/svg+xml" id="spinner" data="chrome://browser/skin/images/spinning_throbber.svg"/>
+
+          <div id="spinner" class="mui-refresh-main">
+            <div class="mui-refresh-wrapper">
+              <div class="mui-spinner-wrapper">
+                <div class="mui-spinner-main">
+                  <div class="mui-spinner-left">
+                    <div class="mui-half-circle-left" />
+                  </div>
+                  <div class="mui-spinner-right">
+                    <div class="mui-half-circle-right" />
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+
         </div>
       </div>
       <div id="empty-body" class="hidden">
         <div id="empty-obj-text-container">
           <object type="image/svg+xml" id="empty-icon" data="chrome://browser/skin/images/icon_key_emptypage.svg"/>
           <div class="empty-text">&aboutLogins.emptyLoginText;</div>
           <div class="empty-hint">&aboutLogins.emptyLoginHint;</div>
         </div>
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -550,19 +550,25 @@ var BrowserApp = {
       InitLater(() => AccessFu.attach(window), window, "AccessFu");
     }
 
     if (!AppConstants.MOZ_ANDROID_NATIVE_ACCOUNT_UI) {
       // We can't delay registering WebChannel listeners: if the first page is
       // about:accounts, which can happen when starting the Firefox Account flow
       // from the first run experience, or via the Firefox Account Status
       // Activity, we can and do miss messages from the fxa-content-server.
-      console.log("browser.js: loading Firefox Accounts WebChannel");
-      Cu.import("resource://gre/modules/FxAccountsWebChannel.jsm");
-      EnsureFxAccountsWebChannel();
+      // However, we never allow suitably restricted profiles from listening to
+      // fxa-content-server messages.
+      if (ParentalControls.isAllowed(ParentalControls.MODIFY_ACCOUNTS)) {
+        console.log("browser.js: loading Firefox Accounts WebChannel");
+        Cu.import("resource://gre/modules/FxAccountsWebChannel.jsm");
+        EnsureFxAccountsWebChannel();
+      } else {
+        console.log("browser.js: not loading Firefox Accounts WebChannel; this profile cannot connect to Firefox Accounts.");
+      }
     }
 
     // Notify Java that Gecko has loaded.
     Messaging.sendRequest({ type: "Gecko:Ready" });
 
     this.deck.addEventListener("DOMContentLoaded", function BrowserApp_delayedStartup() {
       BrowserApp.deck.removeEventListener("DOMContentLoaded", BrowserApp_delayedStartup, false);
 
--- a/mobile/android/chrome/jar.mn
+++ b/mobile/android/chrome/jar.mn
@@ -55,16 +55,20 @@ chrome.jar:
 #ifdef MOZ_SERVICES_HEALTHREPORT
   content/aboutHealthReport.xhtml      (content/aboutHealthReport.xhtml)
   content/aboutHealthReport.js         (content/aboutHealthReport.js)
 #endif
 #ifdef MOZ_DEVICES
   content/aboutDevices.xhtml           (content/aboutDevices.xhtml)
   content/aboutDevices.js              (content/aboutDevices.js)
 #endif
+#ifndef MOZ_ANDROID_NATIVE_ACCOUNT_UI
+  content/aboutAccounts.xhtml          (content/aboutAccounts.xhtml)
+  content/aboutAccounts.js             (content/aboutAccounts.js)
+#endif
   content/aboutLogins.xhtml            (content/aboutLogins.xhtml)
   content/aboutLogins.js               (content/aboutLogins.js)
 #ifdef NIGHTLY_BUILD
   content/WebcompatReporter.js         (content/WebcompatReporter.js)
 #endif
 #ifdef MOZ_PAY
   content/payment.xhtml                (content/payment.xhtml)
 #endif
--- a/mobile/android/components/AboutRedirector.js
+++ b/mobile/android/components/AboutRedirector.js
@@ -84,16 +84,22 @@ if (AppConstants.MOZ_SERVICES_HEALTHREPO
   };
 }
 if (AppConstants.MOZ_DEVICES) {
   modules['devices'] = {
     uri: "chrome://browser/content/aboutDevices.xhtml",
     privileged: true
   };
 }
+if (!AppConstants.MOZ_ANDROID_NATIVE_ACCOUNT_UI) {
+  modules['accounts'] = {
+    uri: "chrome://browser/content/aboutAccounts.xhtml",
+    privileged: true
+  };
+}
 
 function AboutRedirector() {}
 AboutRedirector.prototype = {
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
   classID: Components.ID("{322ba47e-7047-4f71-aebf-cb7d69325cd9}"),
 
   _getModuleInfo: function (aURI) {
     let moduleName = aURI.path.replace(/[?#].*/, "").toLowerCase();
--- a/mobile/android/components/MobileComponents.manifest
+++ b/mobile/android/components/MobileComponents.manifest
@@ -15,17 +15,19 @@ contract @mozilla.org/network/protocol/a
 contract @mozilla.org/network/protocol/about;1?what=healthreport {322ba47e-7047-4f71-aebf-cb7d69325cd9}
 #endif
 #ifdef MOZ_SAFE_BROWSING
 contract @mozilla.org/network/protocol/about;1?what=blocked {322ba47e-7047-4f71-aebf-cb7d69325cd9}
 #endif
 #ifdef MOZ_DEVICES
 contract @mozilla.org/network/protocol/about;1?what=devices {322ba47e-7047-4f71-aebf-cb7d69325cd9}
 #endif
-
+#ifndef MOZ_ANDROID_NATIVE_ACCOUNT_UI
+contract @mozilla.org/network/protocol/about;1?what=accounts {322ba47e-7047-4f71-aebf-cb7d69325cd9}
+#endif
 contract @mozilla.org/network/protocol/about;1?what=logins {322ba47e-7047-4f71-aebf-cb7d69325cd9}
 
 # DirectoryProvider.js
 component {ef0f7a87-c1ee-45a8-8d67-26f586e46a4b} DirectoryProvider.js
 contract @mozilla.org/browser/directory-provider;1 {ef0f7a87-c1ee-45a8-8d67-26f586e46a4b}
 category xpcom-directory-providers browser-directory-provider @mozilla.org/browser/directory-provider;1
 
 # stylesheets
new file mode 100644
--- /dev/null
+++ b/mobile/android/locales/en-US/chrome/aboutAccounts.dtd
@@ -0,0 +1,13 @@
+<!-- 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/. -->
+
+<!ENTITY aboutAccounts.connected.title "Firefox Accounts">
+<!ENTITY aboutAccounts.connected.description "You are connected as">
+<!ENTITY aboutAccounts.syncPreferences.label "Tap here to check Sync settings">
+
+<!ENTITY aboutAccounts.noConnection.title "No Internet connection">
+<!ENTITY aboutAccounts.retry.label "Try again">
+
+<!ENTITY aboutAccounts.restrictedError.title "Restricted">
+<!ENTITY aboutAccounts.restrictedError.description "You cannot manage Firefox Accounts from this profile.">
--- a/mobile/android/locales/jar.mn
+++ b/mobile/android/locales/jar.mn
@@ -3,16 +3,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/.
 
 
 @AB_CD@.jar:
 % locale browser @AB_CD@ %locale/@AB_CD@/browser/
   locale/@AB_CD@/browser/about.dtd                (%chrome/about.dtd)
 #ifndef MOZ_ANDROID_NATIVE_ACCOUNT_UI
+  locale/@AB_CD@/browser/aboutAccounts.dtd        (%chrome/aboutAccounts.dtd)
   locale/@AB_CD@/browser/aboutAccounts.properties (%chrome/aboutAccounts.properties)
 #endif
   locale/@AB_CD@/browser/aboutAddons.dtd          (%chrome/aboutAddons.dtd)
   locale/@AB_CD@/browser/aboutAddons.properties   (%chrome/aboutAddons.properties)
 #ifdef MOZ_DEVICES
   locale/@AB_CD@/browser/aboutDevices.dtd         (%chrome/aboutDevices.dtd)
 #endif
   locale/@AB_CD@/browser/aboutCertError.dtd       (%chrome/aboutCertError.dtd)
new file mode 100644
--- /dev/null
+++ b/mobile/android/themes/core/aboutAccounts.css
@@ -0,0 +1,91 @@
+/* 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/. */
+
+html, body {
+  height: 100%;
+  width: 100%;
+}
+
+div {
+  transition: opacity 0.4s ease-in;
+}
+
+#spinner {
+  transition: opacity 0.2s ease-in;
+}
+
+#remote {
+  border: 0;
+  opacity: 0;
+  transition: opacity 0.4s ease-in;
+}
+
+.text {
+  color: #363B40;
+  font-size: 25px;
+  font-weight: lighter;
+  margin-bottom: 20px;
+}
+
+.hint {
+  color: #777777;
+  font-size: 20px;
+  margin-bottom: 20px;
+}
+
+a {
+  color: #0096DD; /* link_blue */
+  text-decoration: none;
+  font-size: 20px;
+  margin-bottom: 20px;
+}
+
+a:active {
+  color: #0082C6; /* link_blue_pressed */
+}
+
+.toplevel {
+  width: 100%;
+  height: 100%;
+  position: absolute;
+}
+
+.container {
+  height: 100%;
+  padding-left: 30px;
+  padding-right: 30px;
+}
+
+.text-container {
+  padding-top: 60px;
+  padding-left: 30px;
+  padding-right: 30px;
+}
+
+.flex-column {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  text-align: center;
+}
+
+.button-row {
+  flex: 0;
+  width: 100%;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  text-align: center;
+  justify-content: center;
+}
+
+.button {
+  flex: 1;
+  height: 60px;
+  background-color: #E66000; /*matched to action_orange in java codebase*/
+  color: #FFFFFF;
+  font-size: 20px;
+  border-radius: 4px;
+  border-width: 0px;
+}
--- a/mobile/android/themes/core/aboutLogins.css
+++ b/mobile/android/themes/core/aboutLogins.css
@@ -195,18 +195,16 @@ body {
 #loading-img-container{
   display: flex;
   align-items: center;
   justify-content: center;
 }
 
 #spinner {
   margin-top: 60px;
-  height: 60px;
-  width: 60px;
 }
 
 #empty-body {
   padding-left: 60px;
   padding-right: 60px;
 }
 
 #empty-obj-text-container {
deleted file mode 100644
--- a/mobile/android/themes/core/images/spinning_throbber.svg
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- 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/. -->
-
-<svg class="spinner" width="65px" height="65px" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg">
-  <style type="text/css">
-    .spinner {
-      animation: rotator 1.4s linear infinite;
-      }
-
-    @keyframes rotator {
-      0% {
-        transform: rotate(0deg);
-      }
-      100% {
-        transform: rotate(270deg);
-      }
-    }
-
-    .path {
-      stroke-dasharray: 187;
-      stroke-dashoffset: 0;
-      transform-origin: center;
-      animation: dash 1.4s ease-in-out infinite, colors 5.6s ease-in-out infinite;
-    }
-
-    @keyframes colors {
-      0% {
-        stroke: #FF9500;
-      }
-      25% {
-        stroke: #FF9500;
-      }
-      50% {
-        stroke: #FF9500;
-      }
-      75% {
-        stroke: #FF9500;
-      }
-      100% {
-        stroke: #FF9500;
-      }
-    }
-
-    @keyframes dash {
-      0% {
-        stroke-dashoffset: 187;
-      }
-      50% {
-        stroke-dashoffset: 46.75;
-        transform: rotate(135deg);
-      }
-      100% {
-        stroke-dashoffset: 187;
-        transform: rotate(450deg);
-      }
-    }
-  </style>
-  <circle class="path" fill="none" stroke-width="6" stroke-linecap="round" cx="33" cy="33" r="30"></circle>
-</svg>
--- a/mobile/android/themes/core/jar.mn
+++ b/mobile/android/themes/core/jar.mn
@@ -3,16 +3,19 @@
 # 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:
 % skin browser classic/1.0 %skin/
   skin/aboutPage.css                        (aboutPage.css)
   skin/about.css                            (about.css)
+#ifndef MOZ_ANDROID_NATIVE_ACCOUNT_UI
+  skin/aboutAccounts.css                    (aboutAccounts.css)
+#endif
 * skin/aboutAddons.css                      (aboutAddons.css)
 * skin/aboutBase.css                        (aboutBase.css)
 #ifdef MOZ_DEVICES
   skin/aboutDevices.css                     (aboutDevices.css)
 #endif
 * skin/aboutDownloads.css                   (aboutDownloads.css)
   skin/aboutFeedback.css                    (aboutFeedback.css)
 #ifdef MOZ_SERVICES_HEALTHREPORT
@@ -24,32 +27,32 @@ chrome.jar:
   skin/aboutReaderContent.css               (aboutReaderContent.css)
   skin/aboutReaderControls.css              (aboutReaderControls.css)
   skin/aboutSupport.css                     (aboutSupport.css)
   skin/browser.css                          (browser.css)
 * skin/content.css                          (content.css)
   skin/config.css                           (config.css)
   skin/touchcontrols.css                    (touchcontrols.css)
   skin/netError.css                         (netError.css)
+  skin/spinner.css                          (spinner.css)
 % override chrome://global/skin/about.css chrome://browser/skin/about.css
 % override chrome://global/skin/aboutMemory.css chrome://browser/skin/aboutMemory.css
 % override chrome://global/skin/aboutReader.css chrome://browser/skin/aboutReader.css
 % override chrome://global/skin/aboutReaderContent.css chrome://browser/skin/aboutReaderContent.css
 % override chrome://global/skin/aboutReaderControls.css chrome://browser/skin/aboutReaderControls.css
 % override chrome://global/skin/aboutSupport.css chrome://browser/skin/aboutSupport.css
 % override chrome://global/skin/media/videocontrols.css chrome://browser/skin/touchcontrols.css
 % override chrome://global/skin/netError.css chrome://browser/skin/netError.css
 
 #ifdef MOZ_PAY
   skin/payment.css                         (payment.css)
 #endif
 #
 
 * skin/aboutLogins.css                      (aboutLogins.css)
-  skin/images/spinning_throbber.svg         (images/spinning_throbber.svg)
 
   skin/images/search.png                    (images/search.png)
   skin/images/lock.png                      (images/lock.png)
   skin/images/textfield.png                 (images/textfield.png)
 
   skin/images/5stars.png                    (images/5stars.png)
   skin/images/amo-logo.png                  (images/amo-logo.png)
   skin/images/arrowdown-16.png              (images/arrowdown-16.png)
new file mode 100644
--- /dev/null
+++ b/mobile/android/themes/core/spinner.css
@@ -0,0 +1,124 @@
+/* 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/. */
+
+.mui-refresh-main {
+  padding: 0;
+  overflow: hidden;
+  border-radius: 999px;
+  position: relative;
+}
+
+.mui-refresh-wrapper {
+  width: 60px;
+  height: 60px;
+}
+
+.mui-spinner-main {
+  width: 60px;
+  height: 60px;
+  position: relative;
+  animation: sporadic-rotate 5.25s cubic-bezier(.35, 0, .25, 1) infinite;
+}
+
+.mui-spinner-wrapper {
+  animation: outer-rotate 2.91667s linear infinite;
+}
+
+.mui-spinner-left, .mui-spinner-right {
+  position: absolute;
+  top: 0;
+  height: 60px;
+  width: 30px;
+  overflow: hidden;
+}
+
+.mui-spinner-left {
+  left: 0;
+}
+
+.mui-spinner-right {
+  right: 0;
+}
+
+.mui-half-circle-left, .mui-half-circle-right  {
+  position: absolute;
+  top: 0;
+  width: 60px;
+  height: 60px;
+  box-sizing: border-box;
+  border-width: 5px;
+  border-style: solid;
+  border-color: #000 #000 transparent;
+  border-radius: 999px;
+  animation-iteration-count: infinite;
+  animation-duration: 1.3125s;
+  animation-timing-function: cubic-bezier(.35, 0, .25, 1);
+}
+
+.mui-half-circle-left {
+  left: 0;
+  border-right-color: transparent;
+  border-top-color: #FF9500; /*matched to fennec_ui_orange in java codebase*/
+  border-left-color: #FF9500; /*matched to fennec_ui_orange in java codebase*/
+  animation-name: left-wobble;
+}
+
+.mui-half-circle-right {
+  right: 0;
+  border-left-color: transparent;
+  border-top-color: #FF9500; /*matched to fennec_ui_orange in java codebase*/
+  border-right-color: #FF9500; /*matched to fennec_ui_orange in java codebase*/
+  animation-name: right-wobble;
+}
+
+@keyframes outer-rotate {
+  100% {
+    transform: rotate(360deg);
+  }
+}
+
+@keyframes left-wobble {
+  0%, 100% {
+    transform: rotate(130deg);
+  }
+  50% {
+    transform: rotate(-5deg);
+  }
+}
+
+@keyframes right-wobble {
+  0%, 100% {
+    transform: rotate(-130deg);
+  }
+  50% {
+    transform: rotate(5deg);
+  }
+}
+
+@keyframes sporadic-rotate {
+  12.5% {
+    transform: rotate(135deg);
+  }
+  25% {
+    transform: rotate(270deg);
+  }
+  37.5% {
+    transform: rotate(405deg);
+  }
+  50% {
+    transform: rotate(540deg);
+  }
+  62.5% {
+    transform: rotate(675deg);
+  }
+  75% {
+    transform: rotate(810deg);
+  }
+  87.5% {
+    transform: rotate(945deg);
+  }
+  100% {
+    transform: rotate(1080deg);
+  }
+}
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -8171,49 +8171,49 @@
     "expires_in_version": "45",
     "kind": "enumerated",
     "n_values": 8,
     "releaseChannelCollection": "opt-out",
     "description": "Number of times the sharing feature has been enabled and disabled (0=WINDOW_ENABLED, 1=WINDOW_DISABLED, 2=BROWSER_ENABLED, 3=BROWSER_DISABLED)"
   },
   "LOOP_SHARING_ROOM_URL": {
     "alert_emails": ["firefox-dev@mozilla.org", "mdeboer@mozilla.com"],
-    "expires_in_version": "44",
+    "expires_in_version": "45",
     "kind": "enumerated",
     "n_values": 8,
     "releaseChannelCollection": "opt-out",
     "description": "Number of times a room URL is shared (0=COPY_FROM_PANEL, 1=COPY_FROM_CONVERSATION, 2=EMAIL_FROM_CALLFAILED, 3=EMAIL_FROM_CONVERSATION)"
   },
   "LOOP_ROOM_CREATE": {
     "alert_emails": ["firefox-dev@mozilla.org", "mdeboer@mozilla.com"],
-    "expires_in_version": "44",
+    "expires_in_version": "45",
     "kind": "enumerated",
     "n_values": 4,
     "releaseChannelCollection": "opt-out",
     "description": "Number of times a room create action is performed (0=CREATE_SUCCESS, 1=CREATE_FAIL)"
   },
   "LOOP_ROOM_DELETE": {
     "alert_emails": ["firefox-dev@mozilla.org", "mdeboer@mozilla.com"],
-    "expires_in_version": "44",
+    "expires_in_version": "45",
     "kind": "enumerated",
     "n_values": 4,
     "releaseChannelCollection": "opt-out",
     "description": "Number of times a room delete action is performed (0=DELETE_SUCCESS, 2=DELETE_FAIL)"
   },
   "LOOP_ROOM_CONTEXT_ADD": {
     "alert_emails": ["firefox-dev@mozilla.org", "mdeboer@mozilla.com"],
-    "expires_in_version": "44",
+    "expires_in_version": "45",
     "kind": "enumerated",
     "n_values": 8,
     "releaseChannelCollection": "opt-out",
     "description": "Number of times a room context action is performed (0=ADD_FROM_PANEL, 1=ADD_FROM_CONVERSATION)"
   },
   "LOOP_ROOM_CONTEXT_CLICK": {
     "alert_emails": ["firefox-dev@mozilla.org", "mdeboer@mozilla.com"],
-    "expires_in_version": "44",
+    "expires_in_version": "45",
     "kind": "count",
     "releaseChannelCollection": "opt-out",
     "description": "Number times room context is clicked to visit the attached URL"
   },
   "E10S_AUTOSTART": {
     "expires_in_version": "never",
     "kind": "boolean",
     "description": "Whether a session is set to autostart e10s windows"
--- a/toolkit/content/license.html
+++ b/toolkit/content/license.html
@@ -123,16 +123,17 @@
 #ifdef MOZ_WEBSPEECH_POCKETSPHINX
       <li><a href="about:license#pocketsphinx">Pocketsphinx License</a></li>
 #endif
       <li><a href="about:license#praton">praton License</a></li>
       <li><a href="about:license#qcms">qcms License</a></li>
       <li><a href="about:license#qrcode-generator">QR Code Generator License</a></li>
       <li><a href="about:license#react">React License</a></li>
       <li><a href="about:license#xdg">Red Hat xdg_user_dir_lookup License</a></li>
+      <li><a href="about:license#redux">Redux License</a></li>
       <li><a href="about:license#hunspell-ru">Russian Spellchecking Dictionary License</a></li>
       <li><a href="about:license#sctp">SCTP Licenses</a></li>
       <li><a href="about:license#skia">Skia License</a></li>
       <li><a href="about:license#snappy">Snappy License</a></li>
 #ifdef USE_STLPORT
       <li><a href="about:license#stlport">STLport License</a></li>
 #endif
       <li><a href="about:license#sunsoft">SunSoft License</a></li>
@@ -4504,16 +4505,43 @@ EXPRESS OR IMPLIED, INCLUDING BUT NOT LI
 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
 </pre>
 
+    <hr>
+
+    <h1><a id="redux"></a>Redux License</h1>
+
+    <p>This license applies to the file
+    <span class="path">browser/devtools/shared/vendor/redux.js</span>.</p>
+<pre>
+Copyright (c) 2015 Dan Abramov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+</pre>
 
     <hr>
 
     <h1><a id="hunspell-ru"></a>Russian Spellchecking Dictionary License</h1>
 
     <p>This license applies to the Russian Spellchecking Dictionary. (This
       code only ships in some localized versions of this product.)</p>