Merge mozilla-central to inbound. a=merge CLOSED TREE
authorGurzau Raul <rgurzau@mozilla.com>
Fri, 21 Sep 2018 07:17:03 +0300
changeset 496062 6b608b2ec3629dfa0e863f46340f3c6969beac88
parent 496061 eb6bde5f4dfdd0cfa544b0d99a4bb1153224d33b (current diff)
parent 496040 ebeba937ca2a01df86d98089f2368bb975182dcc (diff)
child 496063 5d99742ecb5f6ae8c63f1f390e3b70421a403943
push id1864
push userffxbld-merge
push dateMon, 03 Dec 2018 15:51:40 +0000
treeherdermozilla-release@f040763d99ad [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone64.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to inbound. a=merge CLOSED TREE
Cargo.lock
browser/components/payments/test/browser/head.js
media/mtransport/nricectxhandler.cpp
media/mtransport/nricectxhandler.h
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -905,17 +905,17 @@ dependencies = [
  "mp4parse_capi 0.10.1",
  "netwerk_helper 0.0.1",
  "nserror 0.1.0",
  "nsstring 0.1.0",
  "prefs_parser 0.0.1",
  "rkv 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "rsdparsa_capi 0.1.0",
  "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "u2fhid 0.2.0",
+ "u2fhid 0.2.1",
  "webrender_bindings 0.1.0",
  "xpcom 0.1.0",
 ]
 
 [[package]]
 name = "gl_generator"
 version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2475,29 +2475,29 @@ dependencies = [
 
 [[package]]
 name = "try-lock"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "u2fhid"
-version = "0.2.0"
+version = "0.2.1"
 dependencies = [
  "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "boxfnonce 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation-sys 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "devd-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
  "libudev 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
  "runloop 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "ucd-util"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -54,17 +54,17 @@ pref("extensions.systemAddon.update.url"
 pref("extensions.systemAddon.update.enabled", true);
 
 // Disable add-ons that are not installed by the user in all scopes by default.
 // See the SCOPE constants in AddonManager.jsm for values to use here.
 pref("extensions.autoDisableScopes", 15);
 // Scopes to scan for changes at startup.
 pref("extensions.startupScanScopes", 0);
 
-pref("extensions.geckoProfiler.acceptedExtensionIds", "geckoprofiler@mozilla.com,quantum-foxfooding@mozilla.com");
+pref("extensions.geckoProfiler.acceptedExtensionIds", "geckoprofiler@mozilla.com,quantum-foxfooding@mozilla.com,raptor@mozilla.org");
 #if defined(XP_LINUX) || defined (XP_MACOSX)
 pref("extensions.geckoProfiler.getSymbolRules", "localBreakpad,nm");
 #else // defined(XP_WIN)
 pref("extensions.geckoProfiler.getSymbolRules", "localBreakpad,dump_syms.exe");
 #endif
 
 
 // Add-on content security policies.
--- a/browser/app/winlauncher/LauncherProcessWin.cpp
+++ b/browser/app/winlauncher/LauncherProcessWin.cpp
@@ -132,19 +132,17 @@ IsSameBinaryAsParentProcess()
 
   WCHAR ourExe[MAX_PATH + 1] = {};
   DWORD ourExeOk = ::GetModuleFileNameW(nullptr, ourExe,
                                         mozilla::ArrayLength(ourExe));
   if (!ourExeOk || ourExeOk == mozilla::ArrayLength(ourExe)) {
     return mozilla::Nothing();
   }
 
-  bool isSame = parentExeLen == ourExeOk &&
-                !_wcsnicmp(ourExe, parentExe, ourExeOk);
-  return mozilla::Some(isSame);
+  return mozilla::DoPathsPointToIdenticalFile(parentExe, ourExe);
 }
 
 #endif // defined(MOZ_LAUNCHER_PROCESS)
 
 namespace mozilla {
 
 bool
 RunAsLauncherProcess(int& argc, wchar_t** argv)
--- a/browser/base/content/test/siteIdentity/browser.ini
+++ b/browser/base/content/test/siteIdentity/browser.ini
@@ -103,8 +103,9 @@ support-files =
 [browser_no_mcb_for_onions.js]
 tags = mcb
 support-files =
   test_no_mcb_for_onions.html
 [browser_check_identity_state.js]
 [browser_iframe_navigation.js]
 support-files =
   iframe_navigation.html
+[browser_tls_handshake_failure.js]
--- a/browser/base/content/test/siteIdentity/browser_iframe_navigation.js
+++ b/browser/base/content/test/siteIdentity/browser_iframe_navigation.js
@@ -2,20 +2,20 @@
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests that the site identity icon and related machinery reflects the correct
 // security state after navigating an iframe in various contexts.
 // See bug 1490982.
 
-const SECURE_TEST_URI =
-  "https://example.com/browser/browser/base/content/test/siteIdentity/iframe_navigation.html";
-const INSECURE_TEST_URI =
-  "http://example.com/browser/browser/base/content/test/siteIdentity/iframe_navigation.html";
+const ROOT_URI = getRootDirectory(gTestPath).replace("chrome://mochitests/content",
+                                                     "https://example.com");
+const SECURE_TEST_URI = ROOT_URI + "iframe_navigation.html";
+const INSECURE_TEST_URI = SECURE_TEST_URI.replace("https://", "http://");
 
 // From a secure URI, navigate the iframe to about:blank (should still be
 // secure).
 add_task(async function() {
   let uri = SECURE_TEST_URI + "#blank";
   await BrowserTestUtils.withNewTab(uri, async (browser) => {
     let identityMode = window.document.getElementById("identity-box").className;
     is(identityMode, "verifiedDomain", "identity should be secure before");
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/siteIdentity/browser_tls_handshake_failure.js
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Tests that the site identity indicator is properly updated for connections
+// where the TLS handshake fails.
+// See bug 1492424.
+
+add_task(async function() {
+  let rootURI = getRootDirectory(gTestPath).replace("chrome://mochitests/content",
+                                                    "https://example.com");
+  await BrowserTestUtils.withNewTab(rootURI + "dummy_page.html", async (browser) => {
+    let identityMode = window.document.getElementById("identity-box").className;
+    is(identityMode, "verifiedDomain", "identity should be secure before");
+
+    const TLS_HANDSHAKE_FAILURE_URI = "https://ssl3.example.com/";
+    // Try to connect to a server where the TLS handshake will fail.
+    BrowserTestUtils.loadURI(browser, TLS_HANDSHAKE_FAILURE_URI);
+    await BrowserTestUtils.browserLoaded(browser, false, TLS_HANDSHAKE_FAILURE_URI, true);
+
+    let newIdentityMode = window.document.getElementById("identity-box").className;
+    is(newIdentityMode, "unknownIdentity", "identity should be unknown (not secure) after");
+  });
+});
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -1769,17 +1769,18 @@ file, You can obtain one at http://mozil
               this.popup.richlistbox.currentItem._fireEvent("DOMMenuItemInactive");
             }
             // The user is typing, so don't give accessibility focus to the
             // popup, even if an item gets automatically selected.
             this.popup.richlistbox.suppressMenuItemEvent = true;
             // Only wait for a result when we are sure to get one.  In some
             // cases, like when pasting the same exact text, we may not fire
             // a new search and we won't get a result.
-            if (this.mController.handleText()) {
+            this._onInputHandledText = this.mController.handleText();
+            if (this._onInputHandledText) {
               this.gotResultForCurrentQuery = false;
               this._searchStartDate = Cu.now();
               this._deferredKeyEventQueue = [];
               if (this._deferredKeyEventTimeout) {
                 clearTimeout(this._deferredKeyEventTimeout);
                 this._deferredKeyEventTimeout = null;
               }
             }
@@ -1926,21 +1927,16 @@ file, You can obtain one at http://mozil
                   buttons.
                 * disableSearchSuggestionsNotification: Set to true to hide the
                   onboarding opt-out search suggestions notification.
       -->
       <method name="search">
         <parameter name="value"/>
         <parameter name="options"/>
         <body><![CDATA[
-          this.focus();
-          this.textValue = value;
-          // Avoid selecting the url bar text if `search` is called twice in a row
-          this.selectionStart = -1;
-
           options = options || {};
 
           if (options.disableOneOffButtons) {
             this.popup.addEventListener("popupshowing", () => {
               if (this.popup.oneOffSearchesEnabled) {
                 this.popup.oneOffSearchesEnabled = false;
                 this.popup.addEventListener("popuphidden", () => {
                   this.popup.oneOffSearchesEnabled = true;
@@ -1953,18 +1949,41 @@ file, You can obtain one at http://mozil
               this.whichSearchSuggestionsNotification != "none") {
             let which = this.whichSearchSuggestionsNotification;
             this._whichSearchSuggestionsNotification = "none";
             this.popup.addEventListener("popuphidden", () => {
               this._whichSearchSuggestionsNotification = which;
             }, {once: true});
           }
 
-          this.gotResultForCurrentQuery = false;
-          this.controller.startSearch(value);
+          // We want the value to be treated as text that the user typed.  It
+          // should go through the controller.handleText() path in onInput() so
+          // that gBrowser.userTypedValue, this.valueIsTyped, etc. are set and
+          // nsAutoCompleteController::HandleText() is called.  Set this.value
+          // and fire an input event to do that.  (If we set this.textValue we'd
+          // get an input event for free, but it would also set mIgnoreInput,
+          // skipping all of the above requirements.)
+          this.focus();
+          this.value = value;
+
+          // Avoid selecting the text if this method is called twice in a row.
+          this.selectionStart = -1;
+
+          let event = document.createEvent("Events");
+          event.initEvent("input", true, true);
+          this.dispatchEvent(event);
+
+          // handleText() ignores the value if it's the same as the previous
+          // value, but we want consecutive searches with the same value to be
+          // possible.  If handleText() returned false, then manually start a
+          // new search here.
+          if (!this._onInputHandledText) {
+            this.gotResultForCurrentQuery = false;
+            this.controller.startSearch(value);
+          }
         ]]></body>
       </method>
     </implementation>
 
     <handlers>
       <handler event="keydown"><![CDATA[
         if (this._noActionKeys.has(event.keyCode) &&
             this.popup.selectedIndex >= 0 &&
--- a/browser/components/extensions/test/mochitest/test_ext_all_apis.html
+++ b/browser/components/extensions/test/mochitest/test_ext_all_apis.html
@@ -8,17 +8,16 @@
   <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css">
 </head>
 <body>
 <script>
 "use strict";
 /* exported expectedContentApisTargetSpecific, expectedBackgroundApisTargetSpecific */
 let expectedContentApisTargetSpecific = [
-  "userScripts.setScriptAPIs",
 ];
 
 let expectedBackgroundApisTargetSpecific = [
   "tabs.MutedInfoReason",
   "tabs.TAB_ID_NONE",
   "tabs.TabStatus",
   "tabs.UpdatePropertyName",
   "tabs.WindowType",
--- a/browser/components/newtab/lib/ActivityStream.jsm
+++ b/browser/components/newtab/lib/ActivityStream.jsm
@@ -36,16 +36,17 @@ const DEFAULT_SITES = new Map([
   ["DE", "https://www.youtube.com/,https://www.facebook.com/,https://www.amazon.de/,https://www.ebay.de/,https://www.wikipedia.org/,https://www.reddit.com/"],
   ["PL", "https://www.youtube.com/,https://www.facebook.com/,https://allegro.pl/,https://www.wikipedia.org/,https://www.olx.pl/,https://www.wykop.pl/"],
   ["RU", "https://vk.com/,https://www.youtube.com/,https://ok.ru/,https://www.avito.ru/,https://www.aliexpress.com/,https://www.wikipedia.org/"],
   ["GB", "https://www.youtube.com/,https://www.facebook.com/,https://www.reddit.com/,https://www.amazon.co.uk/,https://www.bbc.co.uk/,https://www.ebay.co.uk/"],
   ["FR", "https://www.youtube.com/,https://www.facebook.com/,https://www.wikipedia.org/,https://www.amazon.fr/,https://www.leboncoin.fr/,https://twitter.com/"],
 ]);
 const GEO_PREF = "browser.search.region";
 const SPOCS_GEOS = ["US"];
+const IS_NIGHTLY_OR_UNBRANDED_BUILD = ["nightly", "default"].includes(AppConstants.MOZ_UPDATE_CHANNEL);
 
 const ONE_HOUR_IN_MS = 60 * 60 * 1000;
 
 // Determine if spocs should be shown for a geo/locale
 function showSpocs({geo}) {
   return SPOCS_GEOS.includes(geo);
 }
 
@@ -217,18 +218,18 @@ const PREFS_CONFIG = new Map([
       type: "remote",
       url: "https://snippets.cdn.mozilla.net/%STARTPAGE_VERSION%/%NAME%/%VERSION%/%APPBUILDID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/",
       updateCycleInMs: ONE_HOUR_IN_MS * 4,
       enabled: false,
     }, {
       id: "cfr",
       type: "local",
       localProvider: "CFRMessageProvider",
-      enabled: AppConstants.MOZ_UPDATE_CHANNEL !== "release",
-      cohort: 0,
+      enabled: IS_NIGHTLY_OR_UNBRANDED_BUILD,
+      cohort: IS_NIGHTLY_OR_UNBRANDED_BUILD ? "nightly" : "",
     }]),
   }],
 ]);
 
 // Array of each feed's FEEDS_CONFIG factory and values to add to PREFS_CONFIG
 const FEEDS_DATA = [
   {
     name: "aboutpreferences",
--- a/browser/components/newtab/lib/CFRMessageProvider.jsm
+++ b/browser/components/newtab/lib/CFRMessageProvider.jsm
@@ -77,16 +77,17 @@ const CFR_MESSAGES = [
         secondary: {
           label: {string_id: "cfr-doorhanger-extension-cancel-button"},
           action: {type: "CANCEL"},
         },
       },
     },
     frequency: {lifetime: 1},
     targeting: `
+      (providerCohorts.cfr in ["one_per_day_amazon", "three_per_day_amazon"]) &&
       (${JSON.stringify(AMAZON_ASSISTANT_PARAMS.existing_addons)} intersect addonsInfo.addons|keys)|length == 0 &&
       (${JSON.stringify(AMAZON_ASSISTANT_PARAMS.open_urls)} intersect topFrecentSites[.frecency >= ${AMAZON_ASSISTANT_PARAMS.min_frecency}]|mapToProperty('host'))|length > 0`,
     trigger: {id: "openURL", params: AMAZON_ASSISTANT_PARAMS.open_urls},
   },
   {
     id: "FACEBOOK_CONTAINER_1",
     template: "cfr_doorhanger",
     content: {
@@ -117,16 +118,17 @@ const CFR_MESSAGES = [
         secondary: {
           label: {string_id: "cfr-doorhanger-extension-cancel-button"},
           action: {type: "CANCEL"},
         },
       },
     },
     frequency: {lifetime: 1},
     targeting: `
+      (providerCohorts.cfr in ["one_per_day", "three_per_day", "nightly"]) &&
       (${JSON.stringify(FACEBOOK_CONTAINER_PARAMS.existing_addons)} intersect addonsInfo.addons|keys)|length == 0 &&
       (${JSON.stringify(FACEBOOK_CONTAINER_PARAMS.open_urls)} intersect topFrecentSites[.frecency >= ${FACEBOOK_CONTAINER_PARAMS.min_frecency}]|mapToProperty('host'))|length > 0`,
     trigger: {id: "openURL", params: FACEBOOK_CONTAINER_PARAMS.open_urls},
   },
   {
     id: "GOOGLE_TRANSLATE_1",
     template: "cfr_doorhanger",
     content: {
@@ -157,16 +159,17 @@ const CFR_MESSAGES = [
         secondary: {
           label: {string_id: "cfr-doorhanger-extension-cancel-button"},
           action: {type: "CANCEL"},
         },
       },
     },
     frequency: {lifetime: 1},
     targeting: `
+      (providerCohorts.cfr in ["one_per_day", "three_per_day", "nightly"]) &&
       (${JSON.stringify(GOOGLE_TRANSLATE_PARAMS.existing_addons)} intersect addonsInfo.addons|keys)|length == 0 &&
       (${JSON.stringify(GOOGLE_TRANSLATE_PARAMS.open_urls)} intersect topFrecentSites[.frecency >= ${GOOGLE_TRANSLATE_PARAMS.min_frecency}]|mapToProperty('host'))|length > 0`,
     trigger: {id: "openURL", params: GOOGLE_TRANSLATE_PARAMS.open_urls},
   },
   {
     id: "YOUTUBE_ENHANCE_1",
     template: "cfr_doorhanger",
     content: {
@@ -197,16 +200,17 @@ const CFR_MESSAGES = [
         secondary: {
           label: {string_id: "cfr-doorhanger-extension-cancel-button"},
           action: {type: "CANCEL"},
         },
       },
     },
     frequency: {lifetime: 1},
     targeting: `
+      (providerCohorts.cfr in ["one_per_day", "three_per_day", "nightly"]) &&
       (${JSON.stringify(YOUTUBE_ENHANCE_PARAMS.existing_addons)} intersect addonsInfo.addons|keys)|length == 0 &&
       (${JSON.stringify(YOUTUBE_ENHANCE_PARAMS.open_urls)} intersect topFrecentSites[.frecency >= ${YOUTUBE_ENHANCE_PARAMS.min_frecency}]|mapToProperty('host'))|length > 0`,
     trigger: {id: "openURL", params: YOUTUBE_ENHANCE_PARAMS.open_urls},
   },
   {
     id: "WIKIPEDIA_CONTEXT_MENU_SEARCH_1",
     template: "cfr_doorhanger",
     content: {
@@ -237,16 +241,17 @@ const CFR_MESSAGES = [
         secondary: {
           label: {string_id: "cfr-doorhanger-extension-cancel-button"},
           action: {type: "CANCEL"},
         },
       },
     },
     frequency: {lifetime: 1},
     targeting: `
+      (providerCohorts.cfr in ["one_per_day", "three_per_day", "nightly"]) &&
       (${JSON.stringify(WIKIPEDIA_CONTEXT_MENU_SEARCH_PARAMS.existing_addons)} intersect addonsInfo.addons|keys)|length == 0 &&
       (${JSON.stringify(WIKIPEDIA_CONTEXT_MENU_SEARCH_PARAMS.open_urls)} intersect topFrecentSites[.frecency >= ${WIKIPEDIA_CONTEXT_MENU_SEARCH_PARAMS.min_frecency}]|mapToProperty('host'))|length > 0`,
     trigger: {id: "openURL", params: WIKIPEDIA_CONTEXT_MENU_SEARCH_PARAMS.open_urls},
   },
   {
     id: "REDDIT_ENHANCEMENT_1",
     template: "cfr_doorhanger",
     content: {
@@ -277,16 +282,17 @@ const CFR_MESSAGES = [
         secondary: {
           label: {string_id: "cfr-doorhanger-extension-cancel-button"},
           action: {type: "CANCEL"},
         },
       },
     },
     frequency: {lifetime: 1},
     targeting: `
+      (providerCohorts.cfr in ["one_per_day", "three_per_day", "nightly"]) &&
       (${JSON.stringify(REDDIT_ENHANCEMENT_PARAMS.existing_addons)} intersect addonsInfo.addons|keys)|length == 0 &&
       (${JSON.stringify(REDDIT_ENHANCEMENT_PARAMS.open_urls)} intersect topFrecentSites[.frecency >= ${REDDIT_ENHANCEMENT_PARAMS.min_frecency}]|mapToProperty('host'))|length > 0`,
     trigger: {id: "openURL", params: REDDIT_ENHANCEMENT_PARAMS.open_urls},
   },
 ];
 
 const CFRMessageProvider = {
   getMessages() {
--- a/browser/components/payments/res/components/address-option.css
+++ b/browser/components/payments/res/components/address-option.css
@@ -1,68 +1,29 @@
 /* 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/. */
 
-address-option {
+address-option.rich-option {
   grid-row-gap: 5px;
-  grid-column-gap: 10px;
-  grid-template-areas:
-    "name          "
-    "street-address";
-}
-
-rich-select[open] > .rich-select-popup-box > address-option {
-  grid-template-areas:
-    "name           name          "
-    "street-address street-address"
-    "email          tel           ";
-}
-
-address-picker.payer-related > rich-select address-option {
-  grid-template-areas:
-    "name name"
-    "tel email";
 }
 
-address-option > .name {
-  grid-area: name;
-}
-
-address-option > .street-address {
-  grid-area: street-address;
-}
-
-address-option > .email {
-  grid-area: email;
-}
-
-address-option > .tel {
-  grid-area: tel;
-}
-
-address-option > .name,
-address-option > .street-address,
-address-option > .email,
-address-option > .tel {
+address-option > .line {
+  overflow: hidden;
+  text-overflow: ellipsis;
   white-space: nowrap;
 }
 
-address-picker.shipping-related address-option > .email,
-address-picker.shipping-related address-option.rich-select-selected-option > .tel {
+address-option > .line:empty {
+  /* Hide the 2nd line in cases where it's empty
+     (e.g. payer field with one or two fields requested) */
   display: none;
 }
 
-/* for payer contact details:
- * display fields selectively based on the contents of the address-fields attribute
- */
-address-picker.payer-related address-option > .name,
-address-picker.payer-related address-option > .street-address,
-address-picker.payer-related address-option > .email,
-address-picker.payer-related address-option > .tel {
-  display: none;
+address-option > .line > span {
+  white-space: nowrap;
 }
 
-address-picker[address-fields~='name'].payer-related address-option  > .name,
-address-picker[address-fields~='email'].payer-related address-option  > .email,
-address-picker[address-fields~='tel'].payer-related address-option  > .tel {
-  display: inline-block;
+address-option > .line > span:empty::before {
+  /* Show the string for missing fields in grey when the field is empty */
+  color: GrayText;
+  content: attr(data-missing-string);
 }
--- a/browser/components/payments/res/components/address-option.js
+++ b/browser/components/payments/res/components/address-option.js
@@ -1,17 +1,21 @@
 /* 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/. */
 
+/* import-globals-from ../../../../../browser/extensions/formautofill/content/autofillEditForms.js*/
 import ObservedPropertiesMixin from "../mixins/ObservedPropertiesMixin.js";
 import RichOption from "./rich-option.js";
 /* import-globals-from ../unprivileged-fallbacks.js */
 
 /**
+ * Up to two-line address display. After bug 1475684 this will also be used for
+ * the single-line <option> substitute too.
+ *
  * <rich-select>
  *  <address-option guid="98hgvnbmytfc"
  *                  address-level1="MI"
  *                  address-level2="Some City"
  *                  email="foo@example.com"
  *                  country="USA"
  *                  name="Jared Wein"
  *                  postal-code="90210"
@@ -26,50 +30,121 @@ export default class AddressOption exten
   static get recordAttributes() {
     return [
       "address-level1",
       "address-level2",
       "country",
       "email",
       "guid",
       "name",
+      "organization",
       "postal-code",
       "street-address",
       "tel",
     ];
   }
 
   static get observedAttributes() {
-    return RichOption.observedAttributes.concat(AddressOption.recordAttributes);
+    return RichOption.observedAttributes.concat(AddressOption.recordAttributes,
+                                                "address-fields",
+                                                "break-after-nth-field",
+                                                "data-field-separator");
   }
 
   constructor() {
     super();
 
-    for (let name of ["name", "street-address", "email", "tel"]) {
+    this._line1 = document.createElement("div");
+    this._line1.classList.add("line");
+    this._line2 = document.createElement("div");
+    this._line2.classList.add("line");
+
+    for (let name of AddressOption.recordAttributes) {
       this[`_${name}`] = document.createElement("span");
       this[`_${name}`].classList.add(name);
+      // XXX Bug 1490816: Use appropriate strings
+      let missingValueString = name.replace(/(-|^)([a-z])/g, ($0, $1, $2) => {
+        return $1.replace("-", " ") + $2.toUpperCase();
+      }) + " Missing";
+      this[`_${name}`].dataset.missingString = missingValueString;
     }
   }
 
   connectedCallback() {
-    for (let name of ["name", "street-address", "email", "tel"]) {
-      this.appendChild(this[`_${name}`]);
-    }
+    this.appendChild(this._line1);
+    this.appendChild(this._line2);
     super.connectedCallback();
   }
 
   static formatSingleLineLabel(address, addressFields) {
     return PaymentDialogUtils.getAddressLabel(address, addressFields);
   }
 
+  get requiredFields() {
+    if (this.hasAttribute("address-fields")) {
+      let names = this.getAttribute("address-fields").trim().split(/\s+/);
+      if (names.length) {
+        return names;
+      }
+    }
+
+    return [
+      // "address-level1", // TODO: bug 1481481 - not required for some countries e.g. DE
+      "address-level2",
+      "country",
+      "name",
+      "postal-code",
+      "street-address",
+    ];
+  }
+
   render() {
+    // Clear the lines of the fields so we can append only the ones still
+    // visible in the correct order below.
+    this._line1.textContent = "";
+    this._line2.textContent = "";
+
+    // Fill the fields with their text/strings.
     // Fall back to empty strings to prevent 'null' from appearing.
-    this._name.textContent = this.name || "";
-    this["_street-address"].textContent =
-      `${this.streetAddress || ""} ${this.addressLevel2 || ""} ` +
-      `${this.addressLevel1 || ""} ${this.postalCode || ""} ${this.country || ""}`;
-    this._email.textContent = this.email || "";
-    this._tel.textContent = this.tel || "";
+    for (let name of AddressOption.recordAttributes) {
+      let camelCaseName = super.constructor.kebabToCamelCase(name);
+      let fieldEl = this[`_${name}`];
+      fieldEl.textContent = this[camelCaseName] || "";
+    }
+
+    let {fieldsOrder} = PaymentDialogUtils.getFormFormat(this.country);
+    // A subset of the requested fields may be returned if the fields don't apply to the country.
+    let requestedVisibleFields = this.addressFields || "mailing-address";
+    let visibleFields = EditAddress.computeVisibleFields(fieldsOrder, requestedVisibleFields);
+    let visibleFieldCount = 0;
+    let requiredFields = this.requiredFields;
+    // Start by populating line 1
+    let lineEl = this._line1;
+    // Which field number to start line 2 after.
+    let breakAfterNthField = this.breakAfterNthField || 2;
+
+    // Now actually place the fields in the proper place on the lines.
+    for (let field of visibleFields) {
+      let fieldEl = this[`_${field.fieldId}`];
+      if (!fieldEl) {
+        log.warn(`address-option render: '${field.fieldId}' doesn't exist`);
+        continue;
+      }
+
+      if (!fieldEl.textContent && !requiredFields.includes(field.fieldId)) {
+        // The field is empty and we don't need to show "Missing …" so don't append.
+        continue;
+      }
+
+      if (lineEl.children.length > 0) {
+        lineEl.append(this.dataset.fieldSeparator);
+      }
+      lineEl.appendChild(fieldEl);
+
+      // Add a break after this field, if requested.
+      if (++visibleFieldCount == breakAfterNthField) {
+        lineEl = this._line2;
+      }
+    }
   }
 }
 
 customElements.define("address-option", AddressOption);
--- a/browser/components/payments/res/components/basic-card-option.css
+++ b/browser/components/payments/res/components/basic-card-option.css
@@ -1,33 +1,40 @@
 /* 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/. */
 
 basic-card-option {
-  grid-column-gap: 1ch;
-  grid-template-areas: "type cc-number cc-exp cc-name";
+  grid-column-gap: 1em;
+  grid-template-areas: "cc-type cc-number cc-exp cc-name";
+  /* Need to set a minimum width for the cc-type svg in the <img> to fill */
+  grid-template-columns: minmax(1em, auto);
   justify-content: start;
 }
 
+basic-card-option > .cc-number,
+basic-card-option > .cc-name,
+basic-card-option > .cc-exp,
+basic-card-option > .cc-type {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
 basic-card-option > .cc-number {
   grid-area: cc-number;
+  /* Don't truncate the card number */
+  overflow: visible;
 }
 
 basic-card-option > .cc-name {
   grid-area: cc-name;
 }
 
 basic-card-option > .cc-exp {
   grid-area: cc-exp;
 }
 
-basic-card-option > .type {
-  grid-area: type;
-  display: none;
+basic-card-option > .cc-type {
+  grid-area: cc-type;
+  height: 100%;
+  text-transform: capitalize;
 }
-
-basic-card-option > .cc-number,
-basic-card-option > .cc-name,
-basic-card-option > .cc-exp,
-basic-card-option > .type {
-  white-space: nowrap;
-}
--- a/browser/components/payments/res/components/basic-card-option.js
+++ b/browser/components/payments/res/components/basic-card-option.js
@@ -25,39 +25,60 @@ export default class BasicCardOption ext
   static get observedAttributes() {
     return RichOption.observedAttributes.concat(BasicCardOption.recordAttributes);
   }
 
   constructor() {
     super();
 
     for (let name of ["cc-name", "cc-number", "cc-exp", "cc-type"]) {
-      this[`_${name}`] = document.createElement("span");
+      this[`_${name}`] = document.createElement(name == "cc-type" ? "img" : "span");
       this[`_${name}`].classList.add(name);
     }
   }
 
   connectedCallback() {
     for (let name of ["cc-name", "cc-number", "cc-exp", "cc-type"]) {
       this.appendChild(this[`_${name}`]);
     }
     super.connectedCallback();
   }
 
+  static formatCCNumber(ccNumber) {
+    // XXX: Bug 1470175 - This should probably be unified with CreditCard.jsm logic.
+    return ccNumber ? ccNumber.replace(/[*]{4,}/, "****") : "";
+  }
+
   static formatSingleLineLabel(basicCard) {
-    // Fall back to empty strings to prevent 'undefined' from appearing.
-    let ccNumber = basicCard["cc-number"] || "";
-    let ccExp = basicCard["cc-exp"] || "";
-    let ccName = basicCard["cc-name"] || "";
+    let ccNumber = BasicCardOption.formatCCNumber(basicCard["cc-number"]);
+
+    // XXX Bug 1473772 - Hard-coded string
+    let ccExp = basicCard["cc-exp"] ? "Exp. " + basicCard["cc-exp"] : "";
+    let ccName = basicCard["cc-name"];
     // XXX: Bug 1491040, displaying cc-type in this context may need its own localized string
     let ccType = basicCard["cc-type"] || "";
-    return `${ccType} ${ccNumber} ${ccExp} ${ccName}`;
+    // Filter out empty/undefined tokens before joining by three spaces
+    // (&nbsp; in the middle of two normal spaces to avoid them visually collapsing in HTML)
+    return [
+      ccType.replace(/^[a-z]/, $0 => $0.toUpperCase()),
+      ccNumber,
+      ccExp,
+      ccName,
+      // XXX Bug 1473772 - Hard-coded string:
+    ].filter(str => !!str).join(" \xa0 ");
+  }
+
+  get requiredFields() {
+    return BasicCardOption.recordAttributes;
   }
 
   render() {
-    this["_cc-name"].textContent = this.ccName;
-    this["_cc-number"].textContent = this.ccNumber;
-    this["_cc-exp"].textContent = this.ccExp;
-    this["_cc-type"].textContent = this.ccType;
+    this["_cc-name"].textContent = this.ccName || "";
+    this["_cc-number"].textContent = BasicCardOption.formatCCNumber(this.ccNumber);
+    // XXX Bug 1473772 - Hard-coded string:
+    this["_cc-exp"].textContent = this.ccExp ? "Exp. " + this.ccExp : "";
+    // XXX: Bug 1491040, displaying cc-type in this context may need its own localized string
+    this["_cc-type"].alt = this.ccType || "";
+    this["_cc-type"].src = "chrome://formautofill/content/icon-credit-card-generic.svg";
   }
 }
 
 customElements.define("basic-card-option", BasicCardOption);
--- a/browser/components/payments/res/components/rich-select.css
+++ b/browser/components/payments/res/components/rich-select.css
@@ -1,36 +1,57 @@
 /* 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/. */
 
 rich-select {
-  border: 1px solid #0C0C0D33;
+  /* Include the padding in the max-width calculation so that we truncate rather
+     than grow wider than 100% of the parent. */
+  box-sizing: border-box;
   display: block;
   margin: 14px 0;
+  /* Padding for the dropmarker (copied from common.css) */
+  padding-inline-end: 24px;
   position: relative;
+  /* Don't allow the <rich-select> to grow wider than the container so that we
+     truncate with text-overflow for long options instead. */
+  max-width: 100%;
 }
 
 /* Focusing on the underlying select element outlines the outer
-rich-select wrapper making it appear like rich-select is focused. */
-rich-select:focus-within {
-  outline: 1px dotted;
+   rich-select wrapper making it appear like rich-select is focused. */
+rich-select:focus-within > select {
+  outline: 1px dotted var(--in-content-text-color);
 }
 
 /*
  * The HTML select element is hidden and placed on the rich-option
  * element to make it look like clicking on the rich-option element
  * in the closed state opens the HTML select dropdown. */
 rich-select > select {
-  opacity: 0;
+  /* Hide the text from the closed state so that the text/layout from
+     <rich-option> won't overlap it. */
+  color: transparent;
   position: absolute;
   top: 0;
   left: 0;
   width: 100%;
   height: 100%;
   margin: 0;
 }
 
+rich-select > select > option {
+  /* Reset the text color in the popup/open state */
+  color: var(--in-content-text-color);
+}
+
 .rich-option {
   display: grid;
-  background: #fff; /* TODO: system colors */
   padding: 8px;
 }
+
+.rich-select-selected-option {
+  /* Clicks on the selected rich option should go to the <select> below to open the popup */
+  pointer-events: none;
+  /* Use position:relative so this is positioned on top of the <select> which
+     also has position:relative. */
+  position: relative;
+}
--- a/browser/components/payments/res/components/rich-select.js
+++ b/browser/components/payments/res/components/rich-select.js
@@ -31,16 +31,22 @@ export default class RichSelect extends 
     this.appendChild(this.popupBox);
     this.render();
   }
 
   get selectedOption() {
     return this.getOptionByValue(this.value);
   }
 
+  get selectedRichOption() {
+    // XXX: Bug 1475684 - This can be removed once `selectedOption` returns a
+    // RichOption which extends HTMLOptionElement.
+    return this.querySelector(":scope > .rich-select-selected-option");
+  }
+
   get value() {
     return this.popupBox.value;
   }
 
   set value(guid) {
     this.popupBox.value = guid;
     this.render();
   }
@@ -68,27 +74,30 @@ export default class RichSelect extends 
 
     if (this.value) {
       let optionType = this.getAttribute("option-type");
       if (selectedRichOption.localName != optionType) {
         selectedRichOption = document.createElement(optionType);
       }
 
       let option = this.getOptionByValue(this.value);
-      let attributeNames = selectedRichOption.constructor.recordAttributes;
+      let attributeNames = selectedRichOption.constructor.observedAttributes;
       for (let attributeName of attributeNames) {
         let attributeValue = option.getAttribute(attributeName);
         if (attributeValue) {
           selectedRichOption.setAttribute(attributeName, attributeValue);
         } else {
           selectedRichOption.removeAttribute(attributeName);
         }
       }
     } else {
       selectedRichOption = new RichOption();
-      selectedRichOption.textContent = "(None selected)";
+      selectedRichOption.textContent = "(None selected)"; // XXX: bug 1473772
     }
     selectedRichOption.classList.add("rich-select-selected-option");
+    // Hide the rich-option from a11y tools since the native <select> will
+    // already provide the selected option label.
+    selectedRichOption.setAttribute("aria-hidden", "true");
     selectedRichOption = this.appendChild(selectedRichOption);
   }
 }
 
 customElements.define("rich-select", RichSelect);
--- a/browser/components/payments/res/components/shipping-option.css
+++ b/browser/components/payments/res/components/shipping-option.css
@@ -1,12 +1,16 @@
 /* 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/. */
 
 shipping-option.rich-option {
   display: block;
+  /* Below properties are to support truncating with an ellipsis for long options */
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
 }
 
 shipping-option > .label,
 shipping-option > .amount {
   white-space: nowrap;
 }
--- a/browser/components/payments/res/containers/address-picker.js
+++ b/browser/components/payments/res/containers/address-picker.js
@@ -8,28 +8,36 @@ import paymentRequest from "../paymentRe
 
 /**
  * <address-picker></address-picker>
  * Container around add/edit links and <rich-select> with
  * <address-option> listening to savedAddresses & tempAddresses.
  */
 
 export default class AddressPicker extends RichPicker {
+  static get pickerAttributes() {
+    return [
+      "address-fields",
+      "break-after-nth-field",
+      "data-field-separator",
+    ];
+  }
+
   static get observedAttributes() {
-    return RichPicker.observedAttributes.concat(["address-fields"]);
+    return RichPicker.observedAttributes.concat(AddressPicker.pickerAttributes);
   }
 
   constructor() {
     super();
     this.dropdown.setAttribute("option-type", "address-option");
   }
 
   attributeChangedCallback(name, oldValue, newValue) {
     super.attributeChangedCallback(name, oldValue, newValue);
-    if (name == "address-fields" && oldValue !== newValue) {
+    if (AddressPicker.pickerAttributes.includes(name) && oldValue !== newValue) {
       this.render(this.requestStore.getState());
     }
   }
 
   get fieldNames() {
     if (this.hasAttribute("address-fields")) {
       let names = this.getAttribute("address-fields").trim().split(/\s+/);
       if (names.length) {
@@ -95,16 +103,30 @@ export default class AddressPicker exten
         let val = address[key];
         if (val) {
           optionEl.setAttribute(key, val);
         } else {
           optionEl.removeAttribute(key);
         }
       }
 
+      optionEl.dataset.fieldSeparator = this.dataset.fieldSeparator;
+
+      if (this.hasAttribute("address-fields")) {
+        optionEl.setAttribute("address-fields", this.getAttribute("address-fields"));
+      } else {
+        optionEl.removeAttribute("address-fields");
+      }
+
+      if (this.hasAttribute("break-after-nth-field")) {
+        optionEl.setAttribute("break-after-nth-field", this.getAttribute("break-after-nth-field"));
+      } else {
+        optionEl.removeAttribute("break-after-nth-field");
+      }
+
       // fieldNames getter is not used here because it returns a default array with
       // attributes even when "address-fields" observed attribute is null.
       let addressFields = this.getAttribute("address-fields");
       optionEl.textContent = AddressOption.formatSingleLineLabel(address, addressFields);
       desiredOptions.push(optionEl);
     }
 
     this.dropdown.popupBox.textContent = "";
--- a/browser/components/payments/res/containers/payment-dialog.js
+++ b/browser/components/payments/res/containers/payment-dialog.js
@@ -260,16 +260,49 @@ export default class PaymentDialog exten
         break;
       }
       default: {
         throw new Error(`Invalid completeStatus: ${completeStatus}`);
       }
     }
   }
 
+  _renderPayerFields(state) {
+    let paymentOptions = state.request.paymentOptions;
+    let payerRequested = this._isPayerRequested(paymentOptions);
+    for (let element of this._payerRelatedEls) {
+      element.hidden = !payerRequested;
+    }
+
+    if (payerRequested) {
+      let fieldNames = new Set(); // default: ["name", "tel", "email"]
+      if (paymentOptions.requestPayerName) {
+        fieldNames.add("name");
+      }
+      if (paymentOptions.requestPayerEmail) {
+        fieldNames.add("email");
+      }
+      if (paymentOptions.requestPayerPhone) {
+        fieldNames.add("tel");
+      }
+      this._payerAddressPicker.setAttribute("address-fields", [...fieldNames].join(" "));
+      // For the payer picker we want to have a line break after the name field (#1)
+      // if all three fields are requested.
+      if (fieldNames.size == 3) {
+        this._payerAddressPicker.setAttribute("break-after-nth-field", 1);
+      } else {
+        this._payerAddressPicker.removeAttribute("break-after-nth-field");
+      }
+    } else {
+      this._payerAddressPicker.removeAttribute("address-fields");
+    }
+    this._payerAddressPicker.dataset.addAddressTitle = this.dataset.payerTitleAdd;
+    this._payerAddressPicker.dataset.editAddressTitle = this.dataset.payerTitleEdit;
+  }
+
   stateChangeCallback(state) {
     super.stateChangeCallback(state);
 
     // Don't dispatch change events for initial selectedShipping* changes at initialization
     // if requestShipping is false.
     if (state.request.paymentOptions.requestShipping) {
       if (state.selectedShippingAddress != this._cachedState.selectedShippingAddress) {
         this.changeShippingAddress(state.selectedShippingAddress);
@@ -320,38 +353,18 @@ export default class PaymentDialog exten
       genericError = this._errorText.dataset[shippingType + "GenericError"];
     }
     this._errorText.textContent = paymentDetails.error || genericError;
 
     let paymentOptions = request.paymentOptions;
     for (let element of this._shippingRelatedEls) {
       element.hidden = !paymentOptions.requestShipping;
     }
-    let payerRequested = this._isPayerRequested(paymentOptions);
-    for (let element of this._payerRelatedEls) {
-      element.hidden = !payerRequested;
-    }
 
-    if (payerRequested) {
-      let fieldNames = new Set(); // default: ["name", "tel", "email"]
-      if (paymentOptions.requestPayerName) {
-        fieldNames.add("name");
-      }
-      if (paymentOptions.requestPayerEmail) {
-        fieldNames.add("email");
-      }
-      if (paymentOptions.requestPayerPhone) {
-        fieldNames.add("tel");
-      }
-      this._payerAddressPicker.setAttribute("address-fields", [...fieldNames].join(" "));
-    } else {
-      this._payerAddressPicker.removeAttribute("address-fields");
-    }
-    this._payerAddressPicker.dataset.addAddressTitle = this.dataset.payerTitleAdd;
-    this._payerAddressPicker.dataset.editAddressTitle = this.dataset.payerTitleEdit;
+    this._renderPayerFields(state);
 
     // hide the accepted cards list if the merchant didn't specify a preference
     let basicCardMethod = request.paymentMethods
       .find(method => method.supportedMethods == "basic-card");
     let merchantNetworks = basicCardMethod && basicCardMethod.data &&
                            basicCardMethod.data.supportedNetworks;
     this._acceptedCardsList.hidden = !(merchantNetworks && merchantNetworks.length);
 
--- a/browser/components/payments/res/containers/rich-picker.css
+++ b/browser/components/payments/res/containers/rich-picker.css
@@ -30,18 +30,18 @@
   grid-area: edit;
   border-right: 1px solid #0C0C0D33;
 }
 
 .rich-picker > rich-select {
   grid-area: dropdown;
 }
 
-.invalid-selected-option > rich-select {
-  outline: 1px solid #c70011;
+.invalid-selected-option > rich-select > select {
+  border: 1px solid #c70011;
 }
 
 .rich-picker > .invalid-label {
   grid-area: invalid;
   font-weight: normal;
   color: #c70011;
 }
 
--- a/browser/components/payments/res/containers/rich-picker.js
+++ b/browser/components/payments/res/containers/rich-picker.js
@@ -58,31 +58,38 @@ export default class RichPicker extends 
   render(state) {
     this.editLink.hidden = !this.dropdown.value;
 
     this.classList.toggle("invalid-selected-option",
                           !this.isSelectedOptionValid(state));
   }
 
   get selectedOption() {
-    return this.dropdown &&
-           this.dropdown.selectedOption;
+    return this.dropdown.selectedOption;
+  }
+
+  get selectedRichOption() {
+    return this.dropdown.selectedRichOption;
+  }
+
+  get requiredFields() {
+    return this.selectedOption ? this.selectedOption.requiredFields || [] : [];
   }
 
   get fieldNames() {
     return [];
   }
 
   isSelectedOptionValid() {
     return !this.missingFieldsOfSelectedOption().length;
   }
 
   missingFieldsOfSelectedOption() {
     let selectedOption = this.selectedOption;
     if (!selectedOption) {
       return [];
     }
 
-    let fieldNames = this.fieldNames;
+    let fieldNames = this.selectedRichOption.requiredFields;
     // Return all field names that are empty or missing from the option.
     return fieldNames.filter(name => !selectedOption.getAttribute(name));
   }
 }
--- a/browser/components/payments/res/debugging.js
+++ b/browser/components/payments/res/debugging.js
@@ -51,30 +51,31 @@ let REQUEST_1 = {
           currency: "USD",
           value: "5",
         },
       },
     ],
     shippingAddressErrors: {},
     shippingOptions: [
       {
-        id: "123",
-        label: "Fast",
+        id: "std",
+        label: "Standard (3-5 business days)",
         amount: {
           currency: "USD",
           value: 10,
         },
         selected: false,
       },
       {
-        id: "456",
-        label: "Faster (default)",
+        id: "super-slow",
+        // Long to test truncation
+        label: "Ssssssssuuuuuuuuupppppeeeeeeerrrrr sssssllllllloooooowwwwww",
         amount: {
           currency: "USD",
-          value: 20,
+          value: 1.50,
         },
         selected: true,
       },
     ],
     modifiers: null,
     error: "",
   },
   paymentOptions: {
@@ -87,17 +88,29 @@ let REQUEST_1 = {
   shippingOption: "456",
 };
 
 let REQUEST_2 = {
   tabId: 9,
   topLevelPrincipal: {URI: {displayHost: "example.com"}},
   requestId: "3797081f-a96b-c34b-a58b-1083c6e66e25",
   completeStatus: "",
-  paymentMethods: [],
+  paymentMethods: [
+    {
+      "supportedMethods": "basic-card",
+      "data": {
+        "supportedNetworks": [
+          "amex",
+          "discover",
+          "mastercard",
+          "visa",
+        ],
+      },
+    },
+  ],
   paymentDetails: {
     id: "",
     totalItem: {label: "", amount: {currency: "CAD", value: "25.75"}, pending: false},
     displayItems: [
       {
         label: "Triangle",
         amount: {
           currency: "CAD",
@@ -203,19 +216,36 @@ let ADDRESSES_1 = {
     "name": "Jane Z. Doe",
     "postal-code": "94041",
     "street-address": "P.O. Box 123",
     "tel": "+1 650 555-5555",
   },
   "abcde12345": {
     "address-level2": "Mountain View",
     "country": "US",
+    "family-name": "Fields",
+    "given-name": "Mrs.",
     "guid": "abcde12345",
     "name": "Mrs. Fields",
   },
+  "german1": {
+    "additional-name": "Y.",
+    "address-level1": "",
+    "address-level2": "Berlin",
+    "country": "DE",
+    "email": "de@example.com",
+    "family-name": "Mouse",
+    "given-name": "Anon",
+    "guid": "german1",
+    "name": "Anon Y. Mouse",
+    "organization": "Mozilla",
+    "postal-code": "10997",
+    "street-address": "Schlesische Str. 27",
+    "tel": "+49 30 983333002",
+  },
   "missing-country": {
     "address-level1": "ON",
     "address-level2": "Toronto",
     "family-name": "Bogard",
     "given-name": "Kristin",
     "guid": "missing-country",
     "name": "Kristin Bogard",
     "postal-code": "H0H 0H0",
@@ -338,17 +368,16 @@ let BASIC_CARDS_1 = {
     "version": 1,
     "timeCreated": 1517890536491,
     "timeLastModified": 1517890564518,
     "timeLastUsed": 0,
     "timesUsed": 0,
     "cc-exp-month": 8,
     "cc-exp-year": 2024,
     "cc-exp": "2024-08",
-    "cc-type": "amex",
   },
 };
 
 let buttonActions = {
   debugFrame() {
     let event = new CustomEvent("paymentContentToChrome", {
       bubbles: true,
       detail: {
--- a/browser/components/payments/res/mixins/ObservedPropertiesMixin.js
+++ b/browser/components/payments/res/mixins/ObservedPropertiesMixin.js
@@ -5,31 +5,35 @@
 /**
  * Define getters and setters for observedAttributes converted to camelCase and
  * trigger a batched aynchronous call to `render` upon observed
  * attribute/property changes.
  */
 
 export default function ObservedPropertiesMixin(superClass) {
   return class ObservedProperties extends superClass {
+    static kebabToCamelCase(name) {
+      return name.replace(/-([a-z])/g, ($0, $1) => $1.toUpperCase());
+    }
+
     constructor() {
       super();
 
       this._observedPropertiesMixin = {
         pendingRender: false,
       };
 
       // Reflect property changes for `observedAttributes` to attributes.
       for (let name of (this.constructor.observedAttributes || [])) {
         if (name in this) {
           // Don't overwrite existing properties.
           continue;
         }
         // Convert attribute names from kebab-case to camelCase properties
-        Object.defineProperty(this, name.replace(/-([a-z])/g, ($0, $1) => $1.toUpperCase()), {
+        Object.defineProperty(this, ObservedProperties.kebabToCamelCase(name), {
           configurable: true,
           get() {
             return this.getAttribute(name);
           },
           set(value) {
             if (value === null || value === undefined || value === false) {
               this.removeAttribute(name);
             } else {
--- a/browser/components/payments/res/paymentRequest.xhtml
+++ b/browser/components/payments/res/paymentRequest.xhtml
@@ -18,16 +18,17 @@
   <!ENTITY pickupAddressLabel         "Pickup Address">
   <!ENTITY shippingOptionsLabel       "Shipping Options">
   <!ENTITY deliveryOptionsLabel       "Delivery Options">
   <!ENTITY pickupOptionsLabel         "Pickup Options">
   <!ENTITY shippingGenericError       "Can’t ship to this address. Select a different address.">
   <!ENTITY deliveryGenericError       "Can’t deliver to this address. Select a different address.">
   <!ENTITY pickupGenericError         "Can’t pick up from this address. Select a different address.">
   <!ENTITY paymentMethodsLabel        "Payment Method">
+  <!ENTITY address.fieldSeparator     ", ">
   <!ENTITY address.addLink.label      "Add">
   <!ENTITY address.editLink.label     "Edit">
   <!ENTITY basicCard.addLink.label    "Add">
   <!ENTITY basicCard.editLink.label   "Edit">
   <!ENTITY payer.addLink.label        "Add">
   <!ENTITY payer.editLink.label       "Edit">
   <!ENTITY shippingAddress.addPage.title  "Add Shipping Address">
   <!ENTITY shippingAddress.editPage.title "Edit Shipping Address">
@@ -127,16 +128,17 @@
     </header>
 
     <div id="main-container">
       <payment-request-page id="payment-summary">
         <div class="page-body">
           <address-picker class="shipping-related"
                           data-add-link-label="&address.addLink.label;"
                           data-edit-link-label="&address.editLink.label;"
+                          data-field-separator="&address.fieldSeparator;"
                           data-shipping-address-label="&shippingAddressLabel;"
                           data-delivery-address-label="&deliveryAddressLabel;"
                           data-pickup-address-label="&pickupAddressLabel;"
                           data-invalid-label="&invalidOption.label;"
                           selected-state-key="selectedShippingAddress"></address-picker>
 
           <shipping-option-picker class="shipping-related"
                                   data-shipping-options-label="&shippingOptionsLabel;"
@@ -150,16 +152,17 @@
                                  data-invalid-label="&invalidOption.label;"
                                  label="&paymentMethodsLabel;">
           </payment-method-picker>
           <accepted-cards hidden="hidden" label="&acceptedCards.label;"></accepted-cards>
           <address-picker class="payer-related"
                           label="&payerLabel;"
                           data-add-link-label="&payer.addLink.label;"
                           data-edit-link-label="&payer.editLink.label;"
+                          data-field-separator="&address.fieldSeparator;"
                           data-invalid-label="&invalidOption.label;"
                           selected-state-key="selectedPayerAddress"></address-picker>
         </div>
 
         <footer>
           <span class="branding">&webPaymentsBranding.label;</span>
           <button id="cancel">&cancelPaymentButton.label;</button>
           <button id="pay"
--- a/browser/components/payments/res/unprivileged-fallbacks.js
+++ b/browser/components/payments/res/unprivileged-fallbacks.js
@@ -76,21 +76,21 @@ var PaymentDialogUtils = {
       };
     }
 
     return {
       "addressLevel1Label": country == "US" ? "state" : "province",
       "postalCodeLabel": country == "US" ? "zip" : "postalCode",
       "fieldsOrder": [
         {fieldId: "name", newLine: true},
-        {fieldId: "organization", newLine: true},
         {fieldId: "street-address", newLine: true},
         {fieldId: "address-level2"},
         {fieldId: "address-level1"},
         {fieldId: "postal-code"},
+        {fieldId: "organization"},
       ],
       // The following values come from addressReferences.js and should not be changed.
       /* eslint-disable-next-line max-len */
       "postalCodePattern": country == "US" ? "(\\d{5})(?:[ \\-](\\d{4}))?" : "[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z] ?\\d[ABCEGHJ-NPRSTV-Z]\\d",
     };
   },
   getDefaultPreferences() {
     let prefValues = {
--- a/browser/components/payments/test/browser/head.js
+++ b/browser/components/payments/test/browser/head.js
@@ -339,16 +339,20 @@ add_task(async function setup_head() {
     if (msg.category == "CSP_CSPViolationWithURI" && msg.errorMessage.includes("at inline")) {
       // Ignore unknown CSP error.
       return;
     }
     if (msg.message && msg.message.match(/docShell is null.*BrowserUtils.jsm/)) {
       // Bug 1478142 - Console spam from the Find Toolbar.
       return;
     }
+    if (msg.message && msg.message.match(/PrioEncoder is not defined/)) {
+      // Bug 1492638 - Console spam from TelemetrySession.
+      return;
+    }
     if (msg.errorMessage == "AbortError: The operation was aborted. " &&
         msg.sourceName == "" && msg.lineNumber == 0) {
       return;
     }
     ok(false, msg.message || msg.errorMessage);
   });
   await setupFormAutofillStorage();
   registerCleanupFunction(function cleanup() {
--- a/browser/components/payments/test/mochitest/mochitest.ini
+++ b/browser/components/payments/test/mochitest/mochitest.ini
@@ -6,26 +6,28 @@ support-files =
    !/browser/extensions/formautofill/content/editCreditCard.xhtml
    ../../../../../browser/extensions/formautofill/content/autofillEditForms.js
    ../../../../../browser/extensions/formautofill/skin/shared/editDialog-shared.css
    ../../../../../testing/modules/sinon-2.3.2.js
    ../../res/**
    payments_common.js
 skip-if = !e10s
 
+[test_accepted_cards.html]
 [test_address_form.html]
+[test_address_option.html]
 [test_address_picker.html]
 [test_basic_card_form.html]
+[test_basic_card_option.html]
 [test_completion_error_page.html]
 [test_currency_amount.html]
 [test_labelled_checkbox.html]
 [test_order_details.html]
 [test_payer_address_picker.html]
 [test_payment_dialog.html]
 [test_payment_dialog_required_top_level_items.html]
 [test_payment_details_item.html]
 [test_payment_method_picker.html]
 [test_rich_select.html]
 [test_shipping_option_picker.html]
 [test_ObservedPropertiesMixin.html]
 [test_PaymentsStore.html]
 [test_PaymentStateSubscriberMixin.html]
-[test_accepted_cards.html]
--- a/browser/components/payments/test/mochitest/payments_common.js
+++ b/browser/components/payments/test/mochitest/payments_common.js
@@ -1,12 +1,12 @@
 "use strict";
 
 /* exported asyncElementRendered, promiseStateChange, promiseContentToChromeMessage, deepClone,
-   PTU, registerConsoleFilter, fillField */
+   PTU, registerConsoleFilter, fillField, importDialogDependencies */
 
 const PTU = SpecialPowers.Cu.import("resource://testing-common/PaymentTestUtils.jsm", {})
                             .PaymentTestUtils;
 
 /**
  * A helper to await on while waiting for an asynchronous rendering of a Custom
  * Element.
  * @returns {Promise}
@@ -38,16 +38,37 @@ function promiseContentToChromeMessage(m
         return;
       }
       document.removeEventListener("paymentContentToChrome", onCToC);
       resolve(event.detail);
     });
   });
 }
 
+/**
+ * Import the templates and stylesheets from the real shipping dialog to avoid
+ * duplication in the tests.
+ * @param {HTMLIFrameElement} templateFrame - Frame to copy the resources from
+ * @param {HTMLElement} destinationEl - Where to append the copied resources
+ */
+function importDialogDependencies(templateFrame, destinationEl) {
+  for (let template of templateFrame.contentDocument.querySelectorAll("template")) {
+    let imported = document.importNode(template, true);
+    destinationEl.appendChild(imported);
+  }
+
+  let baseURL = new URL("../../res/", window.location.href);
+  let stylesheetLinks = templateFrame.contentDocument.querySelectorAll("link[rel~='stylesheet']");
+  for (let stylesheet of stylesheetLinks) {
+    let imported = document.importNode(stylesheet, true);
+    imported.href = new URL(imported.getAttribute("href"), baseURL);
+    destinationEl.appendChild(imported);
+  }
+}
+
 function deepClone(obj) {
   return JSON.parse(JSON.stringify(obj));
 }
 
 /**
  * @param {HTMLElement} field
  * @param {string} value
  * @note This is async in case we need to make it async to handle focus in the future.
new file mode 100644
--- /dev/null
+++ b/browser/components/payments/test/mochitest/test_address_option.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+Test the address-option component
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test the address-option component</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/AddTask.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+  <script src="payments_common.js"></script>
+  <script src="../../res/vendor/custom-elements.min.js"></script>
+  <script src="../../res/unprivileged-fallbacks.js"></script>
+  <script src="autofillEditForms.js"></script>
+
+  <link rel="stylesheet" type="text/css" href="../../res/components/rich-select.css"/>
+  <link rel="stylesheet" type="text/css" href="../../res/components/address-option.css"/>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+  <p id="display">
+    <option id="option1"
+            data-field-separator=", "
+            address-level1="MI"
+            address-level2="Some City"
+            country="US"
+            email="foo@bar.com"
+            name="John Smith"
+            postal-code="90210"
+            street-address="123 Sesame Street,&#xA;Apt 40"
+            tel="+1 519 555-5555"
+            value="option1"
+            guid="option1"></option>
+    <option id="option2"
+            data-field-separator=", "
+            value="option2"
+            guid="option2"></option>
+
+    <rich-select id="richSelect1"
+                 option-type="address-option"></rich-select>
+  </p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+<script type="module">
+/** Test the address-option component **/
+
+import "../../res/components/address-option.js";
+import "../../res/components/rich-select.js";
+
+let option1 = document.getElementById("option1");
+let option2 = document.getElementById("option2");
+let richSelect1 = document.getElementById("richSelect1");
+
+add_task(async function test_populated_option_rendering() {
+  richSelect1.popupBox.appendChild(option1);
+  richSelect1.value = option1.value;
+  await asyncElementRendered();
+
+  let richOption = richSelect1.selectedRichOption;
+
+  is(richOption.name, "John Smith", "Check name getter");
+  is(richOption.streetAddress, "123 Sesame Street,\nApt 40", "Check streetAddress getter");
+  is(richOption.addressLevel2, "Some City", "Check addressLevel2 getter");
+
+  ok(!richOption.innerText.includes("undefined"), "Check for presence of 'undefined'");
+  ok(!richOption.innerText.includes("null"), "Check for presence of 'null'");
+
+  ok(!richOption._line1.innerText.trim().endsWith(","), "Line 1 should not end with a comma");
+  ok(!richOption._line2.innerText.trim().endsWith(","), "Line 2 should not end with a comma");
+  is(richOption._line1.innerText, "John Smith, 123 Sesame Street, Apt 40", "Line 1 text");
+  is(richOption._line2.innerText, "Some City, MI, 90210, US", "Line 2 text");
+
+  // Note that innerText takes visibility into account so that's why it's used over textContent here
+  is(richOption._name.innerText, "John Smith", "name text");
+  is(richOption["_street-address"].innerText, "123 Sesame Street, Apt 40", "street-address text");
+  is(richOption["_address-level2"].innerText, "Some City", "address-level2 text");
+
+  is(richOption._email.parentElement, null,
+     "Check email field isn't in the document for a mailing-address option");
+});
+
+// Same option as the last test but with @break-after-nth-field=1
+add_task(async function test_breakAfterNthField() {
+  richSelect1.popupBox.appendChild(option1);
+  richSelect1.value = option1.value;
+  await asyncElementRendered();
+
+  let richOption = richSelect1.selectedRichOption;
+  richOption.breakAfterNthField = 1;
+  await asyncElementRendered();
+
+  ok(!richOption.innerText.includes("undefined"), "Check for presence of 'undefined'");
+  ok(!richOption.innerText.includes("null"), "Check for presence of 'null'");
+
+  ok(!richOption._line1.innerText.trim().endsWith(","), "Line 1 should not end with a comma");
+  ok(!richOption._line2.innerText.trim().endsWith(","), "Line 2 should not end with a comma");
+  is(richOption._line1.innerText, "John Smith", "Line 1 text with breakAfterNthField = 1");
+  is(richOption._line2.innerText, "123 Sesame Street, Apt 40, Some City, MI, 90210, US",
+     "Line 2 text with breakAfterNthField = 1");
+});
+
+add_task(async function test_addressField_mailingAddress() {
+  richSelect1.popupBox.appendChild(option1);
+  richSelect1.value = option1.value;
+  await asyncElementRendered();
+
+  let richOption = richSelect1.selectedRichOption;
+  richOption.addressFields = "mailing-address";
+  await asyncElementRendered();
+  is(richOption.getAttribute("address-fields"), "mailing-address", "Check @address-fields");
+
+  ok(!richOption.innerText.includes("undefined"), "Check for presence of 'undefined'");
+  ok(!richOption.innerText.includes("null"), "Check for presence of 'null'");
+
+  ok(!richOption._line1.innerText.trim().endsWith(","), "Line 1 should not end with a comma");
+  ok(!richOption._line2.innerText.trim().endsWith(","), "Line 2 should not end with a comma");
+  is(richOption._line1.innerText, "John Smith, 123 Sesame Street, Apt 40", "Line 1 text");
+  is(richOption._line2.innerText, "Some City, MI, 90210, US", "Line 2 text");
+
+  ok(!isHidden(richOption._line2), "Line 2 should be visible when it's used");
+
+  is(richOption._email.parentElement, null,
+     "Check email field isn't in the document for a mailing-address option");
+});
+
+add_task(async function test_addressField_nameEmail() {
+  richSelect1.popupBox.appendChild(option1);
+  richSelect1.value = option1.value;
+  await asyncElementRendered();
+
+  let richOption = richSelect1.selectedRichOption;
+  richOption.addressFields = "name email";
+  await asyncElementRendered();
+  is(richOption.getAttribute("address-fields"), "name email", "Check @address-fields");
+
+  ok(!richOption.innerText.includes("undefined"), "Check for presence of 'undefined'");
+  ok(!richOption.innerText.includes("null"), "Check for presence of 'null'");
+
+  ok(!richOption._line1.innerText.trim().endsWith(","), "Line 1 should not end with a comma");
+  ok(!richOption._line2.innerText.trim().endsWith(","), "Line 2 should not end with a comma");
+  is(richOption._line1.innerText, "John Smith, foo@bar.com", "Line 1 text");
+  is(richOption._line2.innerText, "", "Line 2 text");
+
+  ok(isHidden(richOption._line2), "Line 2 should be hidden when it's not used");
+
+  isnot(richOption._email.parentElement, null,
+        "Check email field is in the document for a 'name email' option");
+});
+
+add_task(async function test_missing_fields_option_rendering() {
+  richSelect1.popupBox.appendChild(option2);
+  richSelect1.value = option2.value;
+  await asyncElementRendered();
+
+  let richOption = richSelect1.selectedRichOption;
+  is(richOption.name, null, "Check name getter");
+  is(richOption.streetAddress, null, "Check streetAddress getter");
+  is(richOption.addressLevel2, null, "Check addressLevel2 getter");
+
+  ok(!richOption.innerText.includes("undefined"), "Check for presence of 'undefined'");
+  ok(!richOption.innerText.includes("null"), "Check for presence of 'null'");
+
+  is(richOption._name.innerText, "", "name text");
+  is(window.getComputedStyle(richOption._name, "::before").content, "attr(data-missing-string)",
+     "Check missing field pseudo content");
+  is(richOption._name.getAttribute("data-missing-string"), "Name Missing",
+     "Check @data-missing-string");
+  is(richOption._email.parentElement, null,
+     "Check email field isn't in the document for a mailing-address option");
+});
+
+</script>
+
+</body>
+</html>
--- a/browser/components/payments/test/mochitest/test_address_picker.html
+++ b/browser/components/payments/test/mochitest/test_address_picker.html
@@ -7,25 +7,27 @@ Test the address-picker component
   <meta charset="utf-8">
   <title>Test the address-picker component</title>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/AddTask.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
   <script src="payments_common.js"></script>
   <script src="../../res/vendor/custom-elements.min.js"></script>
   <script src="../../res/unprivileged-fallbacks.js"></script>
+  <script src="autofillEditForms.js"></script>
 
   <link rel="stylesheet" type="text/css" href="../../res/containers/rich-picker.css"/>
   <link rel="stylesheet" type="text/css" href="../../res/components/rich-select.css"/>
   <link rel="stylesheet" type="text/css" href="../../res/components/address-option.css"/>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
 </head>
 <body>
   <p id="display">
     <address-picker id="picker1"
+                    data-field-separator=", "
                     selected-state-key="selectedShippingAddress"></address-picker>
   </p>
 <div id="content" style="display: none">
 
 </div>
 <pre id="test">
 </pre>
 <script type="module">
@@ -157,33 +159,33 @@ add_task(async function test_change_sele
   is(selectedOption, options[1], "Selected option should now be the second option");
   selectedShippingAddress = picker1.requestStore.getState().selectedShippingAddress;
   is(selectedShippingAddress, selectedOption.getAttribute("guid"),
      "store should have second option selected");
   ok(!picker1.classList.contains("invalid-selected-option"), "The second option has all fields");
   ok(isHidden(picker1.invalidLabel), "The invalid label should be hidden");
 });
 
-add_task(async function test_streetAddress_combines_street_level2_level1_postalCode_country() {
+add_task(async function test_address_combines_name_street_level2_level1_postalCode_country() {
   let options = picker1.dropdown.popupBox.children;
   let richoption1 = picker1.dropdown.querySelector(".rich-select-selected-option");
-  let streetAddress = richoption1.querySelector(".street-address");
   /* eslint-disable max-len */
-  is(streetAddress.textContent,
-     `${options[1].getAttribute("street-address")} ${options[1].getAttribute("address-level2")} ${options[1].getAttribute("address-level1")} ${options[1].getAttribute("postal-code")} ${options[1].getAttribute("country")}`,
+  is(richoption1.innerText,
+     `${options[1].getAttribute("name")}, ${options[1].getAttribute("street-address")}
+${options[1].getAttribute("address-level2")}, ${options[1].getAttribute("address-level1")}, ${options[1].getAttribute("postal-code")}, ${options[1].getAttribute("country")}`,
      "The address shown should be human readable and include all fields");
   /* eslint-enable max-len */
 
   picker1.dropdown.popupBox.focus();
   synthesizeKey(options[2].getAttribute("name"), {});
   await asyncElementRendered();
 
   richoption1 = picker1.dropdown.querySelector(".rich-select-selected-option");
-  streetAddress = richoption1.querySelector(".street-address");
-  is(streetAddress.textContent, " Mountain View   US",
+  // "Missing …" text is rendered via a pseudo element content and isn't included in innerText
+  is(richoption1.innerText, "Mrs. Fields, \nMountain View, , US",
      "The address shown should be human readable and include all fields");
 
   picker1.dropdown.popupBox.focus();
   synthesizeKey(options[1].getAttribute("name"), {});
   await asyncElementRendered();
 });
 
 add_task(async function test_delete() {
new file mode 100644
--- /dev/null
+++ b/browser/components/payments/test/mochitest/test_basic_card_option.html
@@ -0,0 +1,98 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+Test the basic-card-option component
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test the basic-card-option component</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/AddTask.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+  <script src="payments_common.js"></script>
+  <script src="../../res/vendor/custom-elements.min.js"></script>
+  <script src="../../res/unprivileged-fallbacks.js"></script>
+
+  <link rel="stylesheet" type="text/css" href="../../res/components/rich-select.css"/>
+  <link rel="stylesheet" type="text/css" href="../../res/components/basic-card-option.css"/>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+  <p id="display">
+    <option id="option1"
+            value="option1"
+            cc-exp="2024-06"
+            cc-name="John Smith"
+            cc-number="************5461"
+            cc-type="visa"
+            guid="option1"></option>
+    <option id="option2"
+            value="option2"
+            cc-number="************1111"
+            guid="option2"></option>
+
+    <rich-select id="richSelect1"
+                 option-type="basic-card-option"></rich-select>
+  </p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+<script type="module">
+/** Test the basic-card-option component **/
+
+import "../../res/components/basic-card-option.js";
+import "../../res/components/rich-select.js";
+
+let option1 = document.getElementById("option1");
+let option2 = document.getElementById("option2");
+let richSelect1 = document.getElementById("richSelect1");
+
+add_task(async function test_populated_option_rendering() {
+  richSelect1.popupBox.appendChild(option1);
+  richSelect1.value = option1.value;
+  await asyncElementRendered();
+
+  let richOption = richSelect1.selectedRichOption;
+  is(richOption.ccExp, "2024-06", "Check ccExp getter");
+  is(richOption.ccName, "John Smith", "Check ccName getter");
+  is(richOption.ccNumber, "************5461", "Check ccNumber getter");
+  is(richOption.ccType, "visa", "Check ccType getter");
+
+  ok(!richOption.innerText.includes("undefined"), "Check for presence of 'undefined'");
+  ok(!richOption.innerText.includes("null"), "Check for presence of 'null'");
+
+  // Note that innerText takes visibility into account so that's why it's used over textContent here
+  is(richOption["_cc-exp"].innerText, "Exp. 2024-06", "cc-exp text");
+  is(richOption["_cc-name"].innerText, "John Smith", "cc-name text");
+  is(richOption["_cc-number"].innerText, "****5461", "cc-number text");
+  is(richOption["_cc-type"].localName, "img", "cc-type localName");
+  is(richOption["_cc-type"].alt, "visa", "cc-type img alt");
+});
+
+add_task(async function test_minimal_option_rendering() {
+  richSelect1.popupBox.appendChild(option2);
+  richSelect1.value = option2.value;
+  await asyncElementRendered();
+
+  let richOption = richSelect1.selectedRichOption;
+  is(richOption.ccExp, null, "Check ccExp getter");
+  is(richOption.ccName, null, "Check ccName getter");
+  is(richOption.ccNumber, "************1111", "Check ccNumber getter");
+  is(richOption.ccType, null, "Check ccType getter");
+
+  ok(!richOption.innerText.includes("undefined"), "Check for presence of 'undefined'");
+  ok(!richOption.innerText.includes("null"), "Check for presence of 'null'");
+
+  is(richOption["_cc-exp"].innerText, "", "cc-exp text");
+  is(richOption["_cc-name"].innerText, "", "cc-name text");
+  is(richOption["_cc-number"].innerText, "****1111", "cc-number text");
+  is(richOption["_cc-type"].localName, "img", "cc-type localName");
+  is(richOption["_cc-type"].alt, "", "cc-type img alt");
+});
+
+</script>
+
+</body>
+</html>
--- a/browser/components/payments/test/mochitest/test_payer_address_picker.html
+++ b/browser/components/payments/test/mochitest/test_payer_address_picker.html
@@ -7,24 +7,25 @@ Test the paymentOptions address-picker
   <meta charset="utf-8">
   <title>Test the paymentOptions address-picker</title>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/AddTask.js"></script>
   <script src="payments_common.js"></script>
 
   <script src="../../res/vendor/custom-elements.min.js"></script>
   <script src="../../res/unprivileged-fallbacks.js"></script>
+  <script src="autofillEditForms.js"></script>
 
   <link rel="stylesheet" type="text/css" href="../../res/components/rich-select.css"/>
   <link rel="stylesheet" type="text/css" href="../../res/components/address-option.css"/>
   <link rel="stylesheet" type="text/css" href="../../res/paymentRequest.css"/>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
 </head>
 <body>
-  <p id="display">
+  <p id="display" style="height: 100vh; margin: 0;">
     <iframe id="templateFrame" src="../../res/paymentRequest.xhtml" width="0" height="0"></iframe>
   </p>
 <div id="content" style="display: none">
 
 </div>
 <pre id="test">
 </pre>
 <script type="module">
@@ -121,21 +122,17 @@ add_task(async function setup_once() {
   registerConsoleFilter(function consoleFilter(msg) {
     return msg.errorMessage.includes("selectedPayerAddress option a9e830667189 does not exist");
   });
 
   let templateFrame = document.getElementById("templateFrame");
   await SimpleTest.promiseFocus(templateFrame.contentWindow);
 
   let displayEl = document.getElementById("display");
-  // Import the templates from the real shipping dialog to avoid duplication.
-  for (let template of templateFrame.contentDocument.querySelectorAll("template")) {
-    let imported = document.importNode(template, true);
-    displayEl.appendChild(imported);
-  }
+  importDialogDependencies(templateFrame, displayEl);
 
   elDialog = new PaymentDialog();
   displayEl.appendChild(elDialog);
   elPicker = elDialog.querySelector("address-picker.payer-related");
 
   let {request} = elDialog.requestStore.getState();
   initialState = Object.assign({}, {
     changesPrevented: false,
@@ -188,30 +185,30 @@ add_task(async function test_visible_fie
   is(elPicker.dropdown.popupBox.children.length, 2, "Check dropdown has 2 addresses");
   is(closedRichOption.getAttribute("guid"), "48bnds6854t", "expected option is visible");
 
   for (let fieldName of ["name", "email", "tel"]) {
     let elem = closedRichOption.querySelector(`.${fieldName}`);
     ok(elem, `field ${fieldName} exists`);
     ok(isVisible(elem), `field ${fieldName} is visible`);
   }
-  ok(!isVisible(closedRichOption.querySelector(".street-address")),
-     "street-address is not visible");
+  ok(!closedRichOption.querySelector(".street-address"), "street-address element is not present");
 });
 
 add_task(async function test_selective_fields() {
   await setup();
   let requestStore = elPicker.requestStore;
 
   requestStore.setState({
     savedAddresses: SAVED_ADDRESSES,
     selectedPayerAddress: "48bnds6854t",
   });
 
   let payerFieldVariations = [
+    {requestPayerName: true, requestPayerEmail: true, requestPayerPhone: true },
     {requestPayerName: true, requestPayerEmail: false, requestPayerPhone: false },
     {requestPayerName: false, requestPayerEmail: true, requestPayerPhone: false },
     {requestPayerName: false, requestPayerEmail: false, requestPayerPhone: true },
     {requestPayerName: true, requestPayerEmail: true, requestPayerPhone: false },
     {requestPayerName: false, requestPayerEmail: true, requestPayerPhone: true },
     {requestPayerName: true, requestPayerEmail: false, requestPayerPhone: true },
   ];
 
@@ -219,22 +216,32 @@ add_task(async function test_selective_f
     setPaymentOptions(requestStore, payerFields);
     await asyncElementRendered();
 
     let closedRichOption = elPicker.dropdown.querySelector(".rich-select-selected-option");
     let elName = closedRichOption.querySelector(".name");
     let elEmail = closedRichOption.querySelector(".email");
     let elPhone = closedRichOption.querySelector(".tel");
 
-    is(isVisible(elName), payerFields.requestPayerName,
+    is(!!elName && isVisible(elName), payerFields.requestPayerName,
        "name field is correctly toggled");
-    is(isVisible(elEmail), payerFields.requestPayerEmail,
+    is(!!elEmail && isVisible(elEmail), payerFields.requestPayerEmail,
        "email field is correctly toggled");
-    is(isVisible(elPhone), payerFields.requestPayerPhone,
+    is(!!elPhone && isVisible(elPhone), payerFields.requestPayerPhone,
        "tel field is correctly toggled");
+
+    let numPayerFieldsRequested = [...Object.values(payerFields)].filter(val => val).length;
+    is(elPicker.getAttribute("break-after-nth-field"), numPayerFieldsRequested == 3 ? "1" : null,
+       "Check @break-after-nth-field");
+    if (numPayerFieldsRequested == 3) {
+      is(closedRichOption.breakAfterNthField, "1",
+         "Make sure @break-after-nth-field was propagated to <address-option>");
+    } else {
+      is(closedRichOption.breakAfterNthField, null, "Make sure @break-after-nth-field was cleared");
+    }
   }
 });
 
 add_task(async function test_filtered_options() {
   await setup();
   let requestStore = elPicker.requestStore;
   setPaymentOptions(requestStore, {
     requestPayerName: true,
--- a/browser/components/payments/test/mochitest/test_payment_dialog.html
+++ b/browser/components/payments/test/mochitest/test_payment_dialog.html
@@ -8,24 +8,26 @@ Test the payment-dialog custom element
   <title>Test the payment-dialog element</title>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/AddTask.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
   <script src="sinon-2.3.2.js"></script>
   <script src="payments_common.js"></script>
   <script src="../../res/vendor/custom-elements.min.js"></script>
   <script src="../../res/unprivileged-fallbacks.js"></script>
+  <script src="autofillEditForms.js"></script>
 
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <link rel="stylesheet" type="text/css" href="../../res/paymentRequest.css"/>
   <link rel="stylesheet" type="text/css" href="../../res/containers/rich-picker.css"/>
 </head>
 <body>
-  <p id="display">
-    <iframe id="templateFrame" src="../../res/paymentRequest.xhtml" width="0" height="0"></iframe>
+  <p id="display" style="height: 100vh; margin: 0;">
+    <iframe id="templateFrame" src="../../res/paymentRequest.xhtml" width="0" height="0"
+            style="float: left;"></iframe>
   </p>
 <div id="content" style="display: none">
 
 </div>
 <pre id="test">
 </pre>
 <script type="module">
 /** Test the payment-dialog element **/
@@ -34,23 +36,18 @@ Test the payment-dialog custom element
 
 import PaymentDialog from "../../res/containers/payment-dialog.js";
 
 let el1;
 
 add_task(async function setup_once() {
   let templateFrame = document.getElementById("templateFrame");
   await SimpleTest.promiseFocus(templateFrame.contentWindow);
-
   let displayEl = document.getElementById("display");
-  // Import the templates from the real shipping dialog to avoid duplication.
-  for (let template of templateFrame.contentDocument.querySelectorAll("template")) {
-    let imported = document.importNode(template, true);
-    displayEl.appendChild(imported);
-  }
+  importDialogDependencies(templateFrame, displayEl);
 
   el1 = new PaymentDialog();
   displayEl.appendChild(el1);
 
   sinon.spy(el1, "render");
   sinon.spy(el1, "stateChangeCallback");
 });
 
--- a/browser/components/payments/test/mochitest/test_payment_dialog_required_top_level_items.html
+++ b/browser/components/payments/test/mochitest/test_payment_dialog_required_top_level_items.html
@@ -7,24 +7,26 @@ Test the payment-dialog custom element
   <meta charset="utf-8">
   <title>Test the payment-dialog element</title>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/AddTask.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
   <script src="payments_common.js"></script>
   <script src="../../res/vendor/custom-elements.min.js"></script>
   <script src="../../res/unprivileged-fallbacks.js"></script>
+  <script src="autofillEditForms.js"></script>
 
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <link rel="stylesheet" type="text/css" href="../../res/paymentRequest.css"/>
   <link rel="stylesheet" type="text/css" href="../../res/containers/rich-picker.css"/>
 </head>
 <body>
-  <p id="display">
-    <iframe id="templateFrame" src="../../res/paymentRequest.xhtml" width="0" height="0"></iframe>
+  <p id="display" style="height: 100vh; margin: 0;">
+    <iframe id="templateFrame" src="../../res/paymentRequest.xhtml" width="0" height="0"
+            style="float: left;"></iframe>
   </p>
 <div id="content" style="display: none">
 
 </div>
 <pre id="test">
 </pre>
 <script type="module">
 /** Test the payment-dialog element **/
@@ -35,21 +37,17 @@ import PaymentDialog from "../../res/con
 
 let el1;
 
 add_task(async function setupOnce() {
   let templateFrame = document.getElementById("templateFrame");
   await SimpleTest.promiseFocus(templateFrame.contentWindow);
 
   let displayEl = document.getElementById("display");
-  // Import the templates from the real shipping dialog to avoid duplication.
-  for (let template of templateFrame.contentDocument.querySelectorAll("template")) {
-    let imported = document.importNode(template, true);
-    displayEl.appendChild(imported);
-  }
+  importDialogDependencies(templateFrame, displayEl);
 
   el1 = new PaymentDialog();
   displayEl.appendChild(el1);
 });
 
 async function setup({shippingRequired, payerRequired}) {
   let state = deepClone(el1.requestStore.getState());
   state.request.paymentDetails.shippingOptions = shippingRequired ? [{
--- a/browser/components/payments/test/mochitest/test_rich_select.html
+++ b/browser/components/payments/test/mochitest/test_rich_select.html
@@ -6,16 +6,18 @@ Test the rich-select component
 <head>
   <meta charset="utf-8">
   <title>Test the rich-select component</title>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/AddTask.js"></script>
   <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
   <script src="payments_common.js"></script>
   <script src="../../res/vendor/custom-elements.min.js"></script>
+  <script src="../../res/unprivileged-fallbacks.js"></script>
+  <script src="autofillEditForms.js"></script>
 
   <link rel="stylesheet" type="text/css" href="../../res/components/rich-select.css"/>
   <link rel="stylesheet" type="text/css" href="../../res/components/address-option.css"/>
   <link rel="stylesheet" type="text/css" href="../../res/components/basic-card-option.css"/>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
 </head>
 <body>
   <p id="display">
@@ -56,16 +58,17 @@ let addresses = {
   },
 };
 
 let select1 = new RichSelect();
 for (let address of Object.values(addresses)) {
   let option = document.createElement("option");
   option.textContent = address.name + " " + address["street-address"];
   option.setAttribute("value", address.guid);
+  option.dataset.fieldSeparator = ", ";
   for (let field of Object.keys(address)) {
     option.setAttribute(field, address[field]);
   }
   select1.popupBox.appendChild(option);
 }
 select1.setAttribute("option-type", "address-option");
 select1.value = "";
 document.getElementById("display").appendChild(select1);
@@ -77,16 +80,24 @@ let option2 = options[1];
 function get_selected_clone() {
   return select1.querySelector(".rich-select-selected-option");
 }
 
 function is_visible(element, message) {
   ok(!isHidden(element), message);
 }
 
+add_task(async function test_clickable_area() {
+  ok(select1, "select1 exists");
+  isnot(document.activeElement, select1.popupBox, "<select> shouldn't have focus");
+  synthesizeMouseAtCenter(select1, {});
+  is(document.activeElement, select1.popupBox, "<select> should have focus when clicked");
+  document.activeElement.blur();
+});
+
 add_task(async function test_closed_state_on_selection() {
   ok(select1, "select1 exists");
   select1.popupBox.focus();
   synthesizeKey(option1.textContent, {});
   await asyncElementRendered();
   ok(option1.selected, "option 1 is now selected");
 
   let selectedClone = get_selected_clone();
--- a/browser/extensions/formautofill/content/autofillEditForms.js
+++ b/browser/extensions/formautofill/content/autofillEditForms.js
@@ -155,20 +155,20 @@ class EditAddress extends EditAutofillFo
     super.loadRecord(record);
     this.formatForm(record.country);
   }
 
   /**
    * `mailing-address` is a special attribute token to indicate mailing fields + country.
    *
    * @param {object[]} mailingFieldsOrder - `fieldsOrder` from `getFormFormat`
+   * @param {string} addressFields - white-space-separated string of requested address fields to show
    * @returns {object[]} in the same structure as `mailingFieldsOrder` but including non-mail fields
    */
-  computeVisibleFields(mailingFieldsOrder) {
-    let addressFields = this._elements.form.dataset.addressFields;
+  static computeVisibleFields(mailingFieldsOrder, addressFields) {
     if (addressFields) {
       let requestedFieldClasses = addressFields.trim().split(/\s+/);
       let fieldClasses = [];
       if (requestedFieldClasses.includes("mailing-address")) {
         fieldClasses = fieldClasses.concat(mailingFieldsOrder);
         // `country` isn't part of the `mailingFieldsOrder` so add it when filling a mailing-address
         requestedFieldClasses.splice(requestedFieldClasses.indexOf("mailing-address"), 1,
                                      "country");
@@ -207,17 +207,18 @@ class EditAddress extends EditAutofillFo
     const {
       addressLevel1Label,
       postalCodeLabel,
       fieldsOrder: mailingFieldsOrder,
       postalCodePattern,
     } = this.getFormFormat(country);
     this._elements.addressLevel1Label.dataset.localization = addressLevel1Label;
     this._elements.postalCodeLabel.dataset.localization = postalCodeLabel;
-    let fieldClasses = this.computeVisibleFields(mailingFieldsOrder);
+    let addressFields = this._elements.form.dataset.addressFields;
+    let fieldClasses = EditAddress.computeVisibleFields(mailingFieldsOrder, addressFields);
     this.arrangeFields(fieldClasses);
     this.updatePostalCodeValidation(postalCodePattern);
   }
 
   /**
    * Update address field visibility and order based on libaddressinput data.
    *
    * @param {object[]} fieldsOrder array of objects with `fieldId` and optional `newLine` properties
--- a/browser/extensions/screenshots/bootstrap.js
+++ b/browser/extensions/screenshots/bootstrap.js
@@ -4,16 +4,18 @@ const TELEMETRY_ENABLED_PREF = "datarepo
 const PREF_BRANCH = "extensions.screenshots.";
 const USER_DISABLE_PREF = "extensions.screenshots.disabled";
 const UPLOAD_DISABLED_PREF = "extensions.screenshots.upload-disabled";
 const HISTORY_ENABLED_PREF = "places.history.enabled";
 
 ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
 ChromeUtils.defineModuleGetter(this, "AddonManager",
                                "resource://gre/modules/AddonManager.jsm");
+ChromeUtils.defineModuleGetter(this, "AddonManagerPrivate",
+                               "resource://gre/modules/AddonManager.jsm");
 ChromeUtils.defineModuleGetter(this, "AppConstants",
                                "resource://gre/modules/AppConstants.jsm");
 ChromeUtils.defineModuleGetter(this, "CustomizableUI",
                                "resource:///modules/CustomizableUI.jsm");
 ChromeUtils.defineModuleGetter(this, "LegacyExtensionsUtils",
                                "resource://gre/modules/LegacyExtensionsUtils.jsm");
 ChromeUtils.defineModuleGetter(this, "Services",
                                "resource://gre/modules/Services.jsm");
@@ -90,18 +92,16 @@ const LibraryButton = {
     const iconURL = this.ICON_URL;
     item.setAttribute("image", iconURL);
     item.setAttribute("label", this.LABEL);
 
     parent.insertBefore(item, nextSibling);
   },
 };
 
-const APP_STARTUP = 1;
-const APP_SHUTDOWN = 2;
 let addonData, startupReason;
 
 function startup(data, reason) { // eslint-disable-line no-unused-vars
   addonResourceURI = data.resourceURI;
 
   if (Services.prefs.getBoolPref(USER_DISABLE_PREF, false)) {
     AddonManager.getActiveAddons().then(result => {
       let addon = result.addons.find(a => a.id == ADDON_ID);
@@ -109,32 +109,32 @@ function startup(data, reason) { // esli
         addon.disable({allowSystemAddons: true});
       }
     });
     return;
   }
 
   addonData = data;
   startupReason = reason;
-  if (reason === APP_STARTUP) {
+  if (reason === AddonManagerPrivate.BOOTSTRAP_REASONS.APP_STARTUP) {
     appStartupObserver.register();
   } else {
     appStartupDone();
   }
   // eslint-disable-next-line promise/catch-or-return
   appStartupPromise = appStartupPromise.then(handleStartup);
 }
 
 function shutdown(data, reason) { // eslint-disable-line no-unused-vars
   const webExtension = LegacyExtensionsUtils.getEmbeddedExtensionFor({
     id: ADDON_ID,
     resourceURI: addonResourceURI
   });
   // Immediately exit if Firefox is exiting, #3323
-  if (reason === APP_SHUTDOWN) {
+  if (reason === AddonManagerPrivate.BOOTSTRAP_REASONS.APP_SHUTDOWN) {
     stop(webExtension, reason);
     return;
   }
   // Because the prefObserver is unregistered above, this _should_ terminate the promise chain.
   appStartupPromise = appStartupPromise.then(() => { stop(webExtension, reason); });
 }
 
 function install(data, reason) {} // eslint-disable-line no-unused-vars
@@ -152,35 +152,44 @@ function handleStartup() {
   });
 
   if (!webExtension.started) {
     start(webExtension);
   }
 }
 
 function start(webExtension) {
-  return webExtension.startup(startupReason, addonData).then((api) => {
+  let reasonStr = stringReasonFromNumericReason(startupReason);
+  return webExtension.startup(reasonStr, addonData).then((api) => {
     api.browser.runtime.onMessage.addListener(handleMessage);
     LibraryButton.init(webExtension);
   }).catch((err) => {
     // The startup() promise will be rejected if the webExtension was
     // already started (a harmless error), or if initializing the
     // WebExtension failed and threw (an important error).
     console.error(err);
     if (err.message !== "This embedded extension has already been started") {
       // TODO: Should we send these errors to Sentry? #2420
     }
   });
 }
 
 function stop(webExtension, reason) {
-  if (reason !== APP_SHUTDOWN) {
+  if (reason !== AddonManagerPrivate.BOOTSTRAP_REASONS.APP_SHUTDOWN) {
     LibraryButton.uninit();
   }
-  return Promise.resolve(webExtension.shutdown(reason));
+  let reasonStr = stringReasonFromNumericReason(reason);
+  return Promise.resolve(webExtension.shutdown(reasonStr));
+}
+
+function stringReasonFromNumericReason(numericReason) {
+  let { BOOTSTRAP_REASONS } = AddonManagerPrivate;
+  return Object.keys(BOOTSTRAP_REASONS).find(
+    key => BOOTSTRAP_REASONS[key] == numericReason
+  );
 }
 
 function handleMessage(msg, sender, sendReply) {
   if (!msg) {
     return;
   }
 
   if (msg.funcName === "isTelemetryEnabled") {
--- a/devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js
+++ b/devtools/client/aboutdebugging/test/browser_addons_debug_webextension_popup.js
@@ -92,17 +92,17 @@ add_task(async function testWebExtension
 
     toolbox.selectTool("webconsole")
       .then(async (console) => {
         const clickNoAutoHideMenu = () => {
           return new Promise(resolve => {
             toolbox.doc.getElementById("toolbox-meatball-menu-button").click();
             toolbox.doc.addEventListener("popupshown", () => {
               const menuItem =
-                toolbox.doc.getElementById("toolbox-meatball-menu-noautohide");
+                    toolbox.doc.getElementById("toolbox-meatball-menu-noautohide");
               menuItem.click();
               resolve();
             }, { once: true });
           });
         };
 
         dump(`Clicking the menu button\n`);
         await clickNoAutoHideMenu();
@@ -127,29 +127,41 @@ add_task(async function testWebExtension
           // Wait the initial frame update (which list the background page).
           waitForFrameListUpdate,
           // Wait the new frame update (once the extension popup has been opened).
           popupFramePromise,
         ]);
 
         dump(`Clicking the frame list button\n`);
         const btn = toolbox.doc.getElementById("command-button-frames");
-        const frameMenu = await toolbox.showFramesMenu({target: btn});
+        btn.click();
+
+        // This is webextension toolbox process. So we can't access mochitest framework.
+        const waitUntil = function(predicate, interval = 10) {
+          if (predicate()) {
+            return Promise.resolve(true);
+          }
+          return new Promise(resolve => {
+            toolbox.win.setTimeout(function() {
+              waitUntil(predicate, interval).then(() => resolve(true));
+            }, interval);
+          });
+        };
+        await waitUntil(() => btn.style.pointerEvents === "none");
         dump(`Clicked the frame list button\n`);
 
-        await frameMenu.once("open");
-
-        const frames = frameMenu.items;
+        const menuList = toolbox.doc.getElementById("toolbox-frame-menu");
+        const frames = Array.from(menuList.querySelectorAll(".command"));
 
         if (frames.length != 2) {
           throw Error(`Number of frames found is wrong: ${frames.length} != 2`);
         }
 
         const popupFrameBtn = frames.filter((frame) => {
-          return frame.label.endsWith("popup.html");
+          return frame.querySelector(".label").textContent.endsWith("popup.html");
         }).pop();
 
         if (!popupFrameBtn) {
           throw Error("Extension Popup frame not found in the listed frames");
         }
 
         const waitForNavigated = toolbox.target.once("navigate");
 
--- a/devtools/client/framework/components/ToolboxToolbar.js
+++ b/devtools/client/framework/components/ToolboxToolbar.js
@@ -2,19 +2,22 @@
  * 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 { Component, createFactory } = require("devtools/client/shared/vendor/react");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 const {div, button} = dom;
+const { getUnicodeUrl } = require("devtools/client/shared/unicode-url");
 
 const MeatballMenu = createFactory(require("devtools/client/framework/components/MeatballMenu"));
 const MenuButton = createFactory(require("devtools/client/shared/components/menu/MenuButton"));
+const MenuItem = createFactory(require("devtools/client/shared/components/menu/MenuItem"));
+const MenuList = createFactory(require("devtools/client/shared/components/menu/MenuList"));
 const ToolboxTabs = createFactory(require("devtools/client/framework/components/ToolboxTabs"));
 
 /**
  * This is the overall component for the toolbox toolbar. It is designed to not know how
  * the state is being managed, and attempts to be as pure as possible. The
  * ToolboxController component controls the changing state, and passes in everything as
  * props.
  */
@@ -82,40 +85,331 @@ class ToolboxToolbar extends Component {
       visibleToolboxButtonCount: PropTypes.number,
     };
   }
 
   constructor(props) {
     super(props);
 
     this.hideMenu = this.hideMenu.bind(this);
+    this.createFrameList = this.createFrameList.bind(this);
+    this.highlightFrame = this.highlightFrame.bind(this);
+    this.clickFrameButton = this.clickFrameButton.bind(this);
   }
 
   componentDidMount() {
     this.props.toolbox.on("panel-changed", this.hideMenu);
   }
 
   componentWillUnmount() {
     this.props.toolbox.off("panel-changed", this.hideMenu);
   }
 
   hideMenu() {
     if (this.refs.meatballMenuButton) {
       this.refs.meatballMenuButton.hideMenu();
     }
+
+    if (this.refs.frameMenuButton) {
+      this.refs.frameMenuButton.hideMenu();
+    }
+  }
+
+  /**
+   * A little helper function to call renderToolboxButtons for buttons at the start
+   * of the toolbox.
+   */
+  renderToolboxButtonsStart() {
+    return this.renderToolboxButtons(true);
+  }
+
+  /**
+   * A little helper function to call renderToolboxButtons for buttons at the end
+   * of the toolbox.
+   */
+  renderToolboxButtonsEnd() {
+    return this.renderToolboxButtons(false);
+  }
+
+  /**
+   * Render all of the tabs, this takes in a list of toolbox button states. These are plain
+   * objects that have all of the relevant information needed to render the button.
+   * See Toolbox.prototype._createButtonState in devtools/client/framework/toolbox.js for
+   * documentation on this object.
+   *
+   * @param {String} focusedButton - The id of the focused button.
+   * @param {Array} toolboxButtons - Array of objects that define the command buttons.
+   * @param {Function} focusButton - Keep a record of the currently focused button.
+   * @param {boolean} isStart - Render either the starting buttons, or ending buttons.
+   */
+  renderToolboxButtons(isStart) {
+    const {
+      focusedButton,
+      toolboxButtons,
+      focusButton
+    } = this.props;
+    const visibleButtons = toolboxButtons.filter(command => {
+      const {isVisible, isInStartContainer} = command;
+      return isVisible && (isStart ? isInStartContainer : !isInStartContainer);
+    });
+
+    if (visibleButtons.length === 0) {
+      return null;
+    }
+
+    // The RDM button, if present, should always go last
+    const rdmIndex = visibleButtons.findIndex(
+      button => button.id === "command-button-responsive"
+    );
+    if (rdmIndex !== -1 && rdmIndex !== visibleButtons.length - 1) {
+      const rdm = visibleButtons.splice(rdmIndex, 1)[0];
+      visibleButtons.push(rdm);
+    }
+
+    const renderedButtons =
+      visibleButtons.map(command => {
+        const {
+          id,
+          description,
+          disabled,
+          onClick,
+          isChecked,
+          className: buttonClass,
+          onKeyDown
+        } = command;
+
+        // If button is frame button, create menu button in order to
+        // use the doorhanger menu.
+        if (id === "command-button-frames") {
+          return this.renderFrameButton(command);
+        }
+
+        return button({
+          id,
+          title: description,
+          disabled,
+          className: (
+            "command-button devtools-button "
+            + buttonClass + (isChecked ? " checked" : "")
+          ),
+          onClick: (event) => {
+            onClick(event);
+            focusButton(id);
+          },
+          onFocus: () => focusButton(id),
+          tabIndex: id === focusedButton ? "0" : "-1",
+          onKeyDown: (event) => {
+            onKeyDown(event);
+          }
+        });
+      });
+
+    // Add the appropriate separator, if needed.
+    const children = renderedButtons;
+    if (renderedButtons.length) {
+      if (isStart) {
+        children.push(this.renderSeparator());
+        // For the end group we add a separator *before* the RDM button if it
+        // exists, but only if it is not the only button.
+      } else if (rdmIndex !== -1 && visibleButtons.length > 1) {
+        children.splice(
+          children.length - 1,
+          0,
+          this.renderSeparator()
+        );
+      }
+    }
+
+    return div({id: `toolbox-buttons-${isStart ? "start" : "end"}`}, ...children);
+  }
+
+  renderFrameButton(command) {
+    const {
+      id,
+      disabled,
+      description
+    } = command;
+
+    const { toolbox } = this.props;
+
+    return MenuButton(
+      {
+        id,
+        disabled,
+        menuId: id + "-panel",
+        doc: toolbox.doc,
+        className: "command-button devtools-button ",
+        ref: "frameMenuButton",
+        title: description,
+        onCloseButton: toolbox.highlighterUtils.unhighlight,
+      },
+      this.createFrameList
+    );
+  }
+
+  clickFrameButton(event) {
+    const { toolbox } = this.props;
+    toolbox.onSelectFrame(event.target.id);
+  }
+
+  highlightFrame(id) {
+    if (!id) {
+      return;
+    }
+
+    const { toolbox } = this.props;
+    toolbox.onHighlightFrame(id);
+  }
+
+  createFrameList() {
+    const { toolbox } = this.props;
+    if (toolbox.frameMap.size < 1) {
+      return null;
+    }
+
+    const items = [];
+    toolbox.frameMap.forEach((frame, index) => {
+      const label = toolbox.target.isWebExtension
+                    ? toolbox.target.getExtensionPathName(frame.url)
+                    : getUnicodeUrl(frame.url);
+      items.push(MenuItem({
+        id: frame.id.toString(),
+        key: "toolbox-frame-key-" + frame.id,
+        label,
+        checked: frame.id === toolbox.selectedFrameId,
+        onClick: this.clickFrameButton
+      }));
+    });
+
+    return MenuList(
+      {
+        id: "toolbox-frame-menu",
+        onHighlightedChildChange: this.highlightFrame
+      },
+      items);
+  }
+
+  /**
+   * Render a separator.
+   */
+  renderSeparator() {
+    return div({className: "devtools-separator"});
+  }
+
+  /**
+   * Render the toolbox control buttons. The following props are expected:
+   *
+   * @param {string} props.focusedButton
+   *        The id of the focused button.
+   * @param {string} props.currentToolId
+   *        The id of the currently selected tool, e.g. "inspector".
+   * @param {Object[]} props.hostTypes
+   *        Array of host type objects.
+   * @param {string} props.hostTypes[].position
+   *        Position name.
+   * @param {Function} props.hostTypes[].switchHost
+   *        Function to switch the host.
+   * @param {string} props.currentHostType
+   *        The current docking configuration.
+   * @param {boolean} props.areDockOptionsEnabled
+   *        They are not enabled in certain situations like when they are in the
+   *        WebIDE.
+   * @param {boolean} props.canCloseToolbox
+   *        Do we need to add UI for closing the toolbox? We don't when the
+   *        toolbox is undocked, for example.
+   * @param {boolean} props.isSplitConsoleActive
+   *         Is the split console currently visible?
+   *        toolbox is undocked, for example.
+   * @param {boolean|undefined} props.disableAutohide
+   *        Are we disabling the behavior where pop-ups are automatically
+   *        closed when clicking outside them?
+   *        (Only defined for the browser toolbox.)
+   * @param {Function} props.selectTool
+   *        Function to select a tool based on its id.
+   * @param {Function} props.toggleOptions
+   *        Function to turn the options panel on / off.
+   * @param {Function} props.toggleSplitConsole
+   *        Function to turn the split console on / off.
+   * @param {Function} props.toggleNoAutohide
+   *        Function to turn the disable pop-up autohide behavior on / off.
+   * @param {Function} props.closeToolbox
+   *        Completely close the toolbox.
+   * @param {Function} props.focusButton
+   *        Keep a record of the currently focused button.
+   * @param {Object} props.L10N
+   *        Localization interface.
+   * @param {Object} props.toolbox
+   *        The devtools toolbox. Used by the MenuButton component to display
+   *        the menu popup.
+   * @param {Object} refs
+   *        The components refs object. Used to keep a reference to the MenuButton
+   *        for the meatball menu so that we can tell it to resize its contents
+   *        when they change.
+   */
+  renderToolboxControls() {
+    const {
+      focusedButton,
+      canCloseToolbox,
+      closeToolbox,
+      focusButton,
+      L10N,
+      toolbox,
+    } = this.props;
+
+    const meatballMenuButtonId = "toolbox-meatball-menu-button";
+
+    const meatballMenuButton = MenuButton(
+      {
+        id: meatballMenuButtonId,
+        menuId: meatballMenuButtonId + "-panel",
+        doc: toolbox.doc,
+        onFocus: () => focusButton(meatballMenuButtonId),
+        className: "devtools-button",
+        title: L10N.getStr("toolbox.meatballMenu.button.tooltip"),
+        tabIndex: focusedButton === meatballMenuButtonId ? "0" : "-1",
+        ref: "meatballMenuButton",
+      },
+      MeatballMenu({
+        ...this.props,
+        hostTypes: this.props.areDockOptionsEnabled ? this.props.hostTypes : [],
+        onResize: () => {
+          this.refs.meatballMenuButton.resizeContent();
+        },
+      })
+    );
+
+    const closeButtonId = "toolbox-close";
+
+    const closeButton = canCloseToolbox
+      ? button({
+        id: closeButtonId,
+        onFocus: () => focusButton(closeButtonId),
+        className: "devtools-button",
+        title: L10N.getStr("toolbox.closebutton.tooltip"),
+        onClick: () => {
+          closeToolbox();
+        },
+        tabIndex: focusedButton === "toolbox-close" ? "0" : "-1",
+      })
+      : null;
+
+    return div({id: "toolbox-controls"},
+      meatballMenuButton,
+      closeButton
+    );
   }
 
   /**
    * The render function is kept fairly short for maintainability. See the individual
    * render functions for how each of the sections is rendered.
    */
   render() {
     const classnames = ["devtools-tabbar"];
-    const startButtons = renderToolboxButtonsStart(this.props);
-    const endButtons = renderToolboxButtonsEnd(this.props);
+    const startButtons = this.renderToolboxButtonsStart();
+    const endButtons = this.renderToolboxButtonsEnd();
 
     if (!startButtons) {
       classnames.push("devtools-tabbar-has-start");
     }
     if (!endButtons) {
       classnames.push("devtools-tabbar-has-end");
     }
 
@@ -123,222 +417,16 @@ class ToolboxToolbar extends Component {
       ? (
         div(
           {
             className: classnames.join(" ")
           },
           startButtons,
           ToolboxTabs(this.props),
           endButtons,
-          renderToolboxControls(this.props, this.refs)
+          this.renderToolboxControls()
         )
       )
       : div({ className: classnames.join(" ") });
   }
 }
 
 module.exports = ToolboxToolbar;
-
-/**
- * A little helper function to call renderToolboxButtons for buttons at the start
- * of the toolbox.
- */
-function renderToolboxButtonsStart(props) {
-  return renderToolboxButtons(props, true);
-}
-
-/**
-* A little helper function to call renderToolboxButtons for buttons at the end
-* of the toolbox.
- */
-function renderToolboxButtonsEnd(props) {
-  return renderToolboxButtons(props, false);
-}
-
-/**
- * Render all of the tabs, this takes in a list of toolbox button states. These are plain
- * objects that have all of the relevant information needed to render the button.
- * See Toolbox.prototype._createButtonState in devtools/client/framework/toolbox.js for
- * documentation on this object.
- *
- * @param {String} focusedButton - The id of the focused button.
- * @param {Array} toolboxButtons - Array of objects that define the command buttons.
- * @param {Function} focusButton - Keep a record of the currently focused button.
- * @param {boolean} isStart - Render either the starting buttons, or ending buttons.
- */
-function renderToolboxButtons({focusedButton, toolboxButtons, focusButton}, isStart) {
-  const visibleButtons = toolboxButtons.filter(command => {
-    const {isVisible, isInStartContainer} = command;
-    return isVisible && (isStart ? isInStartContainer : !isInStartContainer);
-  });
-
-  if (visibleButtons.length === 0) {
-    return null;
-  }
-
-  // The RDM button, if present, should always go last
-  const rdmIndex = visibleButtons.findIndex(
-    button => button.id === "command-button-responsive"
-  );
-  if (rdmIndex !== -1 && rdmIndex !== visibleButtons.length - 1) {
-    const rdm = visibleButtons.splice(rdmIndex, 1)[0];
-    visibleButtons.push(rdm);
-  }
-
-  const renderedButtons =
-    visibleButtons.map(command => {
-      const {
-        id,
-        description,
-        disabled,
-        isChecked,
-        onClick,
-        className: buttonClass,
-        onKeyDown
-      } = command;
-      return button({
-        id,
-        title: description,
-        disabled,
-        className: (
-          "command-button devtools-button "
-          + buttonClass + (isChecked ? " checked" : "")
-        ),
-        onClick: (event) => {
-          onClick(event);
-          focusButton(id);
-        },
-        onFocus: () => focusButton(id),
-        tabIndex: id === focusedButton ? "0" : "-1",
-        onKeyDown: (event) => {
-          onKeyDown(event);
-        }
-      });
-    });
-
-  // Add the appropriate separator, if needed.
-  const children = renderedButtons;
-  if (renderedButtons.length) {
-    if (isStart) {
-      children.push(renderSeparator());
-    // For the end group we add a separator *before* the RDM button if it
-    // exists, but only if it is not the only button.
-    } else if (rdmIndex !== -1 && visibleButtons.length > 1) {
-      children.splice(
-        children.length - 1,
-        0,
-        renderSeparator()
-      );
-    }
-  }
-
-  return div({id: `toolbox-buttons-${isStart ? "start" : "end"}`}, ...children);
-}
-
-/**
- * Render a separator.
- */
-function renderSeparator() {
-  return div({className: "devtools-separator"});
-}
-
-/**
- * Render the toolbox control buttons. The following props are expected:
- *
- * @param {string} props.focusedButton
- *        The id of the focused button.
- * @param {string} props.currentToolId
- *        The id of the currently selected tool, e.g. "inspector".
- * @param {Object[]} props.hostTypes
- *        Array of host type objects.
- * @param {string} props.hostTypes[].position
- *        Position name.
- * @param {Function} props.hostTypes[].switchHost
- *        Function to switch the host.
- * @param {string} props.currentHostType
- *        The current docking configuration.
- * @param {boolean} props.areDockOptionsEnabled
- *        They are not enabled in certain situations like when they are in the
- *        WebIDE.
- * @param {boolean} props.canCloseToolbox
- *        Do we need to add UI for closing the toolbox? We don't when the
- *        toolbox is undocked, for example.
- * @param {boolean} props.isSplitConsoleActive
- *         Is the split console currently visible?
- *        toolbox is undocked, for example.
- * @param {boolean|undefined} props.disableAutohide
- *        Are we disabling the behavior where pop-ups are automatically
- *        closed when clicking outside them?
- *        (Only defined for the browser toolbox.)
- * @param {Function} props.selectTool
- *        Function to select a tool based on its id.
- * @param {Function} props.toggleOptions
- *        Function to turn the options panel on / off.
- * @param {Function} props.toggleSplitConsole
- *        Function to turn the split console on / off.
- * @param {Function} props.toggleNoAutohide
- *        Function to turn the disable pop-up autohide behavior on / off.
- * @param {Function} props.closeToolbox
- *        Completely close the toolbox.
- * @param {Function} props.focusButton
- *        Keep a record of the currently focused button.
- * @param {Object} props.L10N
- *        Localization interface.
- * @param {Object} props.toolbox
- *        The devtools toolbox. Used by the MenuButton component to display
- *        the menu popup.
- * @param {Object} refs
- *        The components refs object. Used to keep a reference to the MenuButton
- *        for the meatball menu so that we can tell it to resize its contents
- *        when they change.
- */
-function renderToolboxControls(props, refs) {
-  const {
-    focusedButton,
-    canCloseToolbox,
-    closeToolbox,
-    focusButton,
-    L10N,
-    toolbox,
-  } = props;
-
-  const meatballMenuButtonId = "toolbox-meatball-menu-button";
-
-  const meatballMenuButton = MenuButton(
-    {
-      id: meatballMenuButtonId,
-      menuId: meatballMenuButtonId + "-panel",
-      doc: toolbox.doc,
-      onFocus: () => focusButton(meatballMenuButtonId),
-      className: "devtools-button",
-      title: L10N.getStr("toolbox.meatballMenu.button.tooltip"),
-      tabIndex: focusedButton === meatballMenuButtonId ? "0" : "-1",
-      ref: "meatballMenuButton",
-    },
-    MeatballMenu({
-      ...props,
-      hostTypes: props.areDockOptionsEnabled ? props.hostTypes : [],
-      onResize: () => {
-        refs.meatballMenuButton.resizeContent();
-      },
-    })
-  );
-
-  const closeButtonId = "toolbox-close";
-
-  const closeButton = canCloseToolbox
-    ? button({
-      id: closeButtonId,
-      onFocus: () => focusButton(closeButtonId),
-      className: "devtools-button",
-      title: L10N.getStr("toolbox.closebutton.tooltip"),
-      onClick: () => {
-        closeToolbox();
-      },
-      tabIndex: focusedButton === "toolbox-close" ? "0" : "-1",
-    })
-    : null;
-
-  return div({id: "toolbox-controls"},
-    meatballMenuButton,
-    closeButton
-  );
-}
--- a/devtools/client/framework/test/browser_toolbox_meatball.js
+++ b/devtools/client/framework/test/browser_toolbox_meatball.js
@@ -55,17 +55,17 @@ async function openMeatballMenuWithClick
   info("Waiting for the menu panel to be displayed");
 
   await shownListener;
   await waitUntil(() => menuPanel.classList.contains("tooltip-visible"));
 }
 
 async function closeMeatballMenuWithClick(toolbox) {
   const meatballButton = toolbox.doc.getElementById("toolbox-meatball-menu-button");
-  await waitUntil(() => meatballButton.style.pointerEvents === "none");
+  await waitUntil(() => toolbox.win.getComputedStyle(meatballButton).pointerEvents === "none");
   meatballButton.click();
 
   const menuPanel = toolbox.doc.getElementById("toolbox-meatball-menu-button-panel");
   ok(menuPanel, "meatball panel is available");
 
   info("Waiting for the menu panel to be hidden");
   await waitUntil(() => !menuPanel.classList.contains("tooltip-visible"));
 }
--- a/devtools/client/framework/test/browser_toolbox_options_frames_button.js
+++ b/devtools/client/framework/test/browser_toolbox_options_frames_button.js
@@ -46,13 +46,15 @@ add_task(async function() {
   ok(framesButton, "Frames button is rendered again.");
 
   info("Navigate to a page with frames, the frames button should be enabled.");
   await BrowserTestUtils.loadURI(tab.linkedBrowser, TEST_URL_FRAMES);
 
   framesButton = doc.getElementById("command-button-frames");
   ok(framesButton, "Frames button is still rendered.");
 
-  await waitUntil(() => !framesButton.disabled);
-  ok(!framesButton.disabled, "Frames button is not disabled.");
+  await waitUntil(() => {
+    framesButton = doc.getElementById("command-button-frames");
+    return framesButton && !framesButton.disabled;
+  });
 
   Services.prefs.clearUserPref(FRAME_BUTTON_PREF);
 });
--- a/devtools/client/framework/test/browser_toolbox_window_title_frame_select.js
+++ b/devtools/client/framework/test/browser_toolbox_window_title_frame_select.js
@@ -37,29 +37,37 @@ add_task(async function() {
   // blocks the frame popup menu opened below. See also bug 1276873
   await waitForTick();
 
   const btn = toolbox.doc.getElementById("command-button-frames");
 
   await testShortcutToOpenFrames(btn, toolbox);
 
   // Open frame menu and wait till it's available on the screen.
-  // Also check 'open' attribute on the command button.
-  ok(!btn.classList.contains("checked"), "The checked class must not be present");
-  const menu = await toolbox.showFramesMenu({target: btn});
-  await once(menu, "open");
+  // Also check 'aria-expanded' attribute on the command button.
+  is(btn.getAttribute("aria-expanded"), "false",
+     "The aria-expanded attribute must be set to false");
+  btn.click();
 
-  ok(btn.classList.contains("checked"), "The checked class must be set");
+  const panel = toolbox.doc.getElementById("command-button-frames-panel");
+  ok(panel, "popup panel has created.");
+  await waitUntil(() => panel.classList.contains("tooltip-visible"));
+
+  is(btn.getAttribute("aria-expanded"), "true",
+     "The aria-expanded attribute must be set to true");
 
   // Verify that the frame list menu is populated
-  const frames = menu.items;
+  const menuList = toolbox.doc.getElementById("toolbox-frame-menu");
+  const frames = Array.from(menuList.querySelectorAll(".command"));
   is(frames.length, 2, "We have both frames in the list");
 
-  const topFrameBtn = frames.filter(b => b.label == URL)[0];
-  const iframeBtn = frames.filter(b => b.label == IFRAME_URL)[0];
+  const topFrameBtn =
+        frames.filter(b => b.querySelector(".label").textContent == URL)[0];
+  const iframeBtn =
+        frames.filter(b => b.querySelector(".label").textContent == IFRAME_URL)[0];
   ok(topFrameBtn, "Got top level document in the list");
   ok(iframeBtn, "Got iframe document in the list");
 
   // Listen to will-navigate to check if the view is empty
   const willNavigate = toolbox.target.once("will-navigate");
 
   const onTitleChanged = waitForTitleChange(toolbox);
 
@@ -95,21 +103,22 @@ function getTitle() {
 async function testShortcutToOpenFrames(btn, toolbox) {
   info("Tests if shortcut Alt+Down opens the frames");
   // focus the button so that keyPress can be performed
   btn.focus();
   // perform keyPress - Alt+Down
   const shortcut = L10N.getStr("toolbox.showFrames.key");
   synthesizeKeyShortcut(shortcut, toolbox.win);
 
-  // wait for 200 ms for UI to render
-  await wait(200);
+  const panel = toolbox.doc.getElementById("command-button-frames-panel");
+  ok(panel, "popup panel has created.");
+  await waitUntil(() => panel.classList.contains("tooltip-visible"));
 
-  // btn should now have the checked class set
-  ok(btn.classList.contains("checked"), "The checked class must be set");
+  is(btn.getAttribute("aria-expanded"), "true",
+     "The aria-expanded attribute must be set to true");
 
   // pressing Esc should hide the menu again
-  synthesizeKeyShortcut("Esc", toolbox.win);
-  await wait(200);
+  EventUtils.sendKey("ESCAPE", toolbox.win);
+  await waitUntil(() => !panel.classList.contains("tooltip-visible"));
 
-  // btn shouldn't have the checked class set
-  ok(!btn.classList.contains("checked"), "The checked class must not be set");
+  is(btn.getAttribute("aria-expanded"), "false",
+     "The aria-expanded attribute must be set to false");
 }
--- a/devtools/client/framework/test/browser_toolbox_zoom_popup.js
+++ b/devtools/client/framework/test/browser_toolbox_zoom_popup.js
@@ -113,17 +113,23 @@ add_task(async function() {
  *         - buttonBounds {DOMRect} Bounds of the button.
  *         - menuType {string} Type of the menu, "native" or "doorhanger".
  *         - menuBounds {DOMRect} Bounds of the menu panel.
  *         - arrowBounds {DOMRect|null} Bounds of the arrow. Only set when
  *                       menuType is "doorhanger", null otherwise.
  */
 async function getButtonAndMenuInfo(doc, menuButton) {
   info("Show popup menu with click event.");
-  menuButton.click();
+  EventUtils.sendMouseEvent(
+    {
+      type: "click",
+      screenX: 1,
+    },
+    menuButton,
+    doc.defaultView);
 
   let menuPopup;
   let menuType;
   let arrowBounds = null;
   if (menuButton.hasAttribute("aria-controls")) {
     menuType = "doorhanger";
     menuPopup = doc.getElementById(menuButton.getAttribute("aria-controls"));
     await waitUntil(() => menuPopup.classList.contains("tooltip-visible"));
--- a/devtools/client/framework/toolbox.js
+++ b/devtools/client/framework/toolbox.js
@@ -19,18 +19,16 @@ var promise = require("promise");
 const { debounce } = require("devtools/shared/debounce");
 var Services = require("Services");
 var ChromeUtils = require("ChromeUtils");
 var {gDevTools} = require("devtools/client/framework/devtools");
 var EventEmitter = require("devtools/shared/event-emitter");
 var Telemetry = require("devtools/client/shared/telemetry");
 const { getUnicodeUrl } = require("devtools/client/shared/unicode-url");
 var { attachThread, detachThread } = require("./attach-thread");
-var Menu = require("devtools/client/framework/menu");
-var MenuItem = require("devtools/client/framework/menu-item");
 var { DOMHelpers } = require("resource://devtools/client/shared/DOMHelpers.jsm");
 const { KeyCodes } = require("devtools/client/shared/keycodes");
 var Startup = Cc["@mozilla.org/devtools/startup-clh;1"].getService(Ci.nsISupports)
   .wrappedJSObject;
 
 const { BrowserLoader } =
   ChromeUtils.import("resource://devtools/client/shared/browser-loader.js", {});
 
@@ -123,19 +121,16 @@ function Toolbox(target, selectedTool, h
   this.frameMap = new Map();
   this.selectedFrameId = null;
 
   this._toolRegistered = this._toolRegistered.bind(this);
   this._toolUnregistered = this._toolUnregistered.bind(this);
   this._onWillNavigate = this._onWillNavigate.bind(this);
   this._refreshHostTitle = this._refreshHostTitle.bind(this);
   this.toggleNoAutohide = this.toggleNoAutohide.bind(this);
-  this.showFramesMenu = this.showFramesMenu.bind(this);
-  this.handleKeyDownOnFramesButton = this.handleKeyDownOnFramesButton.bind(this);
-  this.showFramesMenuOnKeyDown = this.showFramesMenuOnKeyDown.bind(this);
   this._updateFrames = this._updateFrames.bind(this);
   this._splitConsoleOnKeypress = this._splitConsoleOnKeypress.bind(this);
   this.destroy = this.destroy.bind(this);
   this.highlighterUtils = getHighlighterUtils(this);
   this._highlighterReady = this._highlighterReady.bind(this);
   this._highlighterHidden = this._highlighterHidden.bind(this);
   this._applyCacheSettings = this._applyCacheSettings.bind(this);
   this._applyServiceWorkersTestingSettings =
@@ -1230,26 +1225,31 @@ Toolbox.prototype = {
 
   /**
    * Button to select a frame for the inspector to target.
    */
   _buildFrameButton() {
     this.frameButton = this._createButtonState({
       id: "command-button-frames",
       description: L10N.getStr("toolbox.frames.tooltip"),
-      onClick: this.showFramesMenu,
       isTargetSupported: target => {
         return target.activeTab && target.activeTab.traits.frames;
       },
       isCurrentlyVisible: () => {
         const hasFrames = this.frameMap.size > 1;
         const isOnOptionsPanel = this.currentToolId === "options";
         return hasFrames || isOnOptionsPanel;
       },
-      onKeyDown: this.handleKeyDownOnFramesButton
+    });
+
+    // Listen for the shortcut key to show the frame list
+    this.shortcuts.on(L10N.getStr("toolbox.showFrames.key"), event => {
+      if (event.target.id === "command-button-frames") {
+        event.target.click();
+      }
     });
 
     return this.frameButton;
   },
 
   /**
    * Toggle the picker, but also decide whether or not the highlighter should
    * focus the window. This is only desirable when the toolbox is mounted to the
@@ -2281,110 +2281,32 @@ Toolbox.prototype = {
       // it can be either an addon or browser toolbox actor
       return promise.resolve();
     }
     const { frames } = await this.target.activeTab.listFrames();
     this._updateFrames({ frames });
   },
 
   /**
-   * Show a drop down menu that allows the user to switch frames.
-   */
-  showFramesMenu: async function(event) {
-    const menu = new Menu();
-    const target = event.target;
-
-    // Need to initInspector to check presence of getNodeActorFromWindowID
-    // and use the highlighter later
-    await this.initInspector();
-    if (!("_supportsFrameHighlight" in this)) {
-    // Only works with FF58+ targets
-      this._supportsFrameHighlight =
-        await this.target.actorHasMethod("domwalker", "getNodeActorFromWindowID");
-    }
-
-    // Generate list of menu items from the list of frames.
-    this.frameMap.forEach(frame => {
-      // A frame is checked if it's the selected one.
-      const checked = frame.id == this.selectedFrameId;
-
-      let label;
-      if (this.target.isWebExtension) {
-        // Show a shorter url for extensions page.
-        label = this.target.getExtensionPathName(frame.url);
-      } else {
-        label = getUnicodeUrl(frame.url);
-      }
-
-      // Create menu item.
-      menu.append(new MenuItem({
-        label,
-        type: "radio",
-        checked,
-        click: () => {
-          this.onSelectFrame(frame.id);
-        },
-        hover: () => {
-          this.onHightlightFrame(frame.id);
-        }
-      }));
-    });
-
-    menu.once("open").then(() => {
-      this.frameButton.isChecked = true;
-    });
-
-    menu.once("close").then(() => {
-      this.frameButton.isChecked = false;
-      this.highlighterUtils.unhighlight();
-    });
-
-    // Show a drop down menu with frames.
-    // XXX Missing menu API for specifying target (anchor)
-    // and relative position to it. See also:
-    // https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Method/openPopup
-    // https://bugzilla.mozilla.org/show_bug.cgi?id=1274551
-    const rect = target.getBoundingClientRect();
-    const screenX = target.ownerDocument.defaultView.mozInnerScreenX;
-    const screenY = target.ownerDocument.defaultView.mozInnerScreenY;
-    menu.popupWithZoom(rect.left + screenX, rect.bottom + screenY, this);
-
-    return menu;
-  },
-
-  /**
-   * Handle keyDown event on 'frames' button to show available frames
-   */
-  handleKeyDownOnFramesButton: function(event) {
-    this.shortcuts.on(L10N.getStr("toolbox.showFrames.key"),
-      this.showFramesMenuOnKeyDown);
-  },
-
-  /**
-   * Show 'frames' menu on key down
-   */
-  showFramesMenuOnKeyDown: function(event) {
-    if (event.target.id == "command-button-frames") {
-      this.showFramesMenu(event);
-    }
-  },
-
-  /**
    * Select a frame by sending 'switchToFrame' packet to the backend.
    */
   onSelectFrame: function(frameId) {
     // Send packet to the backend to select specified frame and
     // wait for 'frameUpdate' event packet to update the UI.
     this.target.activeTab.switchToFrame(frameId);
   },
 
   /**
    * Highlight a frame in the page
    */
-  onHightlightFrame: async function(frameId) {
+  onHighlightFrame: async function(frameId) {
+    // Need to initInspector to check presence of getNodeActorFromWindowID
+    // and use the highlighter later
+    await this.initInspector();
+
     // Only enable frame highlighting when the top level document is targeted
     if (this._supportsFrameHighlight && this.rootFrameSelected) {
       const frameActor = await this.walker.getNodeActorFromWindowID(frameId);
       this.highlighterUtils.highlightNodeFront(frameActor);
     }
   },
 
   /**
@@ -2727,16 +2649,21 @@ Toolbox.prototype = {
 
         if (this.highlighterUtils.isRemoteHighlightable()) {
           this.walker.on("highlighter-ready", this._highlighterReady);
           this.walker.on("highlighter-hide", this._highlighterHidden);
 
           const autohide = !flags.testing;
           this._highlighter = await this._inspector.getHighlighter(autohide);
         }
+        if (!("_supportsFrameHighlight" in this)) {
+          // Only works with FF58+ targets
+          this._supportsFrameHighlight =
+            await this.target.actorHasMethod("domwalker", "getNodeActorFromWindowID");
+        }
       }.bind(this))();
     }
     return this._initInspector;
   },
 
   _onNewSelectedNodeFront: function() {
     // Emit a "selection-changed" event when the toolbox.selection has been set
     // to a new node (or cleared). Currently used in the WebExtensions APIs (to
--- a/devtools/client/inspector/test/browser_inspector_highlighter-iframes_02.js
+++ b/devtools/client/inspector/test/browser_inspector_highlighter-iframes_02.js
@@ -39,21 +39,25 @@ add_task(async function() {
 /**
  * Helper designed to switch context to another frame at the provided index.
  * Returns a promise that will resolve when the navigation is complete.
  * @return {Promise}
  */
 async function switchToFrameContext(frameIndex, toolbox, inspector) {
   // Open frame menu and wait till it's available on the screen.
   const btn = toolbox.doc.getElementById("command-button-frames");
-  const menu = await toolbox.showFramesMenu({target: btn});
-  await once(menu, "open");
+  const panel = toolbox.doc.getElementById("command-button-frames-panel");
+  btn.click();
+  ok(panel, "popup panel has created.");
+  await waitUntil(() => panel.classList.contains("tooltip-visible"));
 
   info("Select the iframe in the frame list.");
+  const menuList = toolbox.doc.getElementById("toolbox-frame-menu");
+  const firstButton = menuList.querySelectorAll(".command")[frameIndex];
   const newRoot = inspector.once("new-root");
 
-  menu.items[frameIndex].click();
+  firstButton.click();
 
   await newRoot;
   await inspector.once("inspector-updated");
 
   info("Navigation to the iframe is done.");
 }
--- a/devtools/client/inspector/test/browser_inspector_inspect_node_contextmenu.js
+++ b/devtools/client/inspector/test/browser_inspector_inspect_node_contextmenu.js
@@ -49,25 +49,28 @@ async function testContextMenuWithinIfra
 
   is(inspector.selection.nodeFront, nodeFront,
      "Right node is selected in the markup view");
 }
 
 async function changeToolboxToInnerFrame() {
   const { toolbox } = getActiveInspector();
 
-  const frameButton = toolbox.doc.getElementById("command-button-frames");
-  const menu = await toolbox.showFramesMenu({
-    target: frameButton
-  });
-  await once(menu, "open");
+  const btn = toolbox.doc.getElementById("command-button-frames");
+  const panel = toolbox.doc.getElementById("command-button-frames-panel");
+  btn.click();
+  ok(panel, "popup panel has created.");
+  await waitUntil(() => panel.classList.contains("tooltip-visible"));
 
-  const frames = menu.items;
+  info("Select the iframe in the frame list.");
+  const menuList = toolbox.doc.getElementById("toolbox-frame-menu");
+  const frames = Array.from(menuList.querySelectorAll(".command"));
   is(frames.length, 2, "Two frames shown in the switcher");
 
-  const innerFrameButton = frames.filter(f => f.label == FRAME_URI)[0];
+  const innerFrameButton =
+        frames.filter(b => b.querySelector(".label").textContent === FRAME_URI)[0];
   ok(innerFrameButton, "Found frame button for inner frame");
 
   const newRoot = toolbox.getPanel("inspector").once("new-root");
   info("Switch toolbox to inner frame");
   innerFrameButton.click();
   await newRoot;
 }
--- a/devtools/client/inspector/test/browser_inspector_select-docshell.js
+++ b/devtools/client/inspector/test/browser_inspector_select-docshell.js
@@ -24,29 +24,34 @@ add_task(async function() {
 
   assertMarkupViewIsLoaded(inspector);
 
   // Verify that the frame map button is empty at the moment.
   const btn = toolbox.doc.getElementById("command-button-frames");
   ok(!btn.firstChild, "The frame list button doesn't have any children");
 
   // Open frame menu and wait till it's available on the screen.
-  const menu = await toolbox.showFramesMenu({target: btn});
-  await once(menu, "open");
+  const panel = toolbox.doc.getElementById("command-button-frames-panel");
+  btn.click();
+  ok(panel, "popup panel has created.");
+  await waitUntil(() => panel.classList.contains("tooltip-visible"));
 
   // Verify that the menu is popuplated.
-  const frames = menu.items.slice();
+  const menuList = toolbox.doc.getElementById("toolbox-frame-menu");
+  const frames = Array.prototype.slice.call(menuList.querySelectorAll(".command"));
   is(frames.length, 2, "We have both frames in the menu");
 
   frames.sort(function(a, b) {
-    return a.label.localeCompare(b.label);
+    return a.children[0].innerHTML.localeCompare(b.children[0].innerHTML);
   });
 
-  is(frames[0].label, FrameURL, "Got top level document in the list");
-  is(frames[1].label, URL, "Got iframe document in the list");
+  is(frames[0].querySelector(".label").textContent, FrameURL,
+     "Got top level document in the list");
+  is(frames[1].querySelector(".label").textContent, URL,
+     "Got iframe document in the list");
 
   // Listen to will-navigate to check if the view is empty
   const willNavigate = toolbox.target.once("will-navigate").then(() => {
     info("Navigation to the iframe has started, the inspector should be empty");
     assertMarkupViewIsEmpty(inspector);
   });
 
   // Only select the iframe after we are able to select an element from the top
--- a/devtools/client/shared/components/menu/MenuButton.js
+++ b/devtools/client/shared/components/menu/MenuButton.js
@@ -43,16 +43,19 @@ class MenuButton extends PureComponent {
       // Defaults to -5.
       menuOffset: PropTypes.number.isRequired,
 
       // The menu content.
       children: PropTypes.any,
 
       // Callback function to be invoked when the button is clicked.
       onClick: PropTypes.func,
+
+      // Callback function to be invoked when the child panel is closed.
+      onCloseButton: PropTypes.func,
     };
   }
 
   static get defaultProps() {
     return {
       menuPosition: "bottom",
       menuOffset: -5,
     };
@@ -95,16 +98,25 @@ class MenuButton extends PureComponent {
       nextProps.menuId !== this.props.menuId
     ) {
       this.setState({ win });
       this.resetTooltip();
       this.initializeTooltip();
     }
   }
 
+  componentDidUpdate() {
+    // The MenuButton creates the child panel when initializing the MenuButton.
+    // If the children function is called during the rendering process,
+    // this child list size might change. So we need to adjust content size here.
+    if (typeof this.props.children === "function") {
+      this.resizeContent();
+    }
+  }
+
   componentWillUnmount() {
     this.resetTooltip();
   }
 
   initializeTooltip() {
     const tooltipProps = {
       type: "doorhanger",
       useXulWrapper: true,
@@ -188,16 +200,20 @@ class MenuButton extends PureComponent {
     // "popuphidden" event which triggers this callback might be dispatched
     // before the "click" event that we want to ignore.  As a result, we queue
     // up a task using setTimeout() to run after the "click" event.
     this.state.win.setTimeout(() => {
       if (this.buttonRef) {
         this.buttonRef.style.pointerEvents = "auto";
       }
     }, 0);
+
+    if (this.props.onCloseButton) {
+      this.props.onCloseButton();
+    }
   }
 
   async onClick(e) {
     if (e.target === this.buttonRef) {
       // On Mac, even after clicking the button it doesn't get focus.
       // Force focus to the button so that our keydown handlers get called.
       this.buttonRef.focus();
 
@@ -219,16 +235,22 @@ class MenuButton extends PureComponent {
             !Services.prefs.getBoolPref("ui.popup.disable_autohide", false)) {
           this.buttonRef.style.pointerEvents = "none";
         }
         await this.toggleMenu(e.target);
         // If the menu was activated by keyboard, focus the first item.
         if (wasKeyboardEvent && this.tooltip) {
           this.tooltip.focus();
         }
+
+        // MenuButton creates the children dynamically when clicking the button,
+        // so execute the goggle menu after updating the children panel.
+        if (typeof this.props.children === "function") {
+          this.forceUpdate();
+        }
       }
     // If we clicked one of the menu items, then, by default, we should
     // auto-collapse the menu.
     //
     // We check for the defaultPrevented state, however, so that menu items can
     // turn this behavior off (e.g. a menu item with an embedded button).
     } else if (this.state.expanded && !e.defaultPrevented) {
       this.hideMenu();
@@ -269,17 +291,19 @@ class MenuButton extends PureComponent {
   }
 
   render() {
     // We bypass the call to HTMLTooltip. setContent and set the panel contents
     // directly here.
     //
     // Bug 1472942: Do this for all users of HTMLTooltip.
     const menu = ReactDOM.createPortal(
-      this.props.children,
+      typeof this.props.children === "function"
+        ? this.props.children()
+        : this.props.children,
       this.tooltip.panel
     );
 
     const buttonProps = {
       // Pass through any props set on the button, except the ones we handle
       // here.
       ...omit(this.props, Object.keys(MenuButton.propTypes)),
       onClick: this.onClick,
--- a/devtools/client/shared/components/menu/MenuList.js
+++ b/devtools/client/shared/components/menu/MenuList.js
@@ -19,29 +19,54 @@ const { focusableSelector } = require("d
 class MenuList extends PureComponent {
   static get propTypes() {
     return {
       // ID to assign to the list container.
       id: PropTypes.string,
 
       // Children of the list.
       children: PropTypes.any,
+
+      // Called whenever there is a change to the hovered or selected child.
+      // The callback is passed the ID of the highlighted child or null if no
+      // child is highlighted.
+      onHighlightedChildChange: PropTypes.func,
     };
   }
 
   constructor(props) {
     super(props);
 
     this.onKeyDown = this.onKeyDown.bind(this);
+    this.onMouseOverOrFocus = this.onMouseOverOrFocus.bind(this);
+    this.onMouseOutOrBlur = this.onMouseOutOrBlur.bind(this);
+    this.notifyHighlightedChildChange = this.notifyHighlightedChildChange.bind(this);
 
     this.setWrapperRef = element => {
       this.wrapperRef = element;
     };
   }
 
+  onMouseOverOrFocus(e) {
+    this.notifyHighlightedChildChange(e.target.id);
+  }
+
+  onMouseOutOrBlur(e) {
+    const hoveredElem = this.wrapperRef.querySelector(":hover");
+    if (!hoveredElem) {
+      this.notifyHighlightedChildChange(null);
+    }
+  }
+
+  notifyHighlightedChildChange(id) {
+    if (this.props.onHighlightedChildChange) {
+      this.props.onHighlightedChildChange(id);
+    }
+  }
+
   onKeyDown(e) {
     // Check if the focus is in the list.
     if (
       !this.wrapperRef ||
       !this.wrapperRef.contains(e.target.ownerDocument.activeElement)
     ) {
       return;
     }
@@ -98,16 +123,20 @@ class MenuList extends PureComponent {
     }
   }
 
   render() {
     const attr = {
       role: "menu",
       ref: this.setWrapperRef,
       onKeyDown: this.onKeyDown,
+      onMouseOver: this.onMouseOverOrFocus,
+      onMouseOut: this.onMouseOutOrBlur,
+      onFocus: this.onMouseOverOrFocus,
+      onBlur: this.onMouseOutOrBlur
     };
 
     if (this.props.id) {
       attr.id = this.props.id;
     }
 
     // Add padding for checkbox image if necessary.
     let hasCheckbox = false;
--- a/devtools/client/themes/toolbox.css
+++ b/devtools/client/themes/toolbox.css
@@ -342,16 +342,28 @@
 #command-button-frames:-moz-locale-dir(ltr) {
   background-position: right 2px top 14px;
 }
 
 #command-button-frames:-moz-locale-dir(rtl) {
   background-position: left 2px top 14px;
 }
 
+/* Tooltip of frames menu  */
+
+#command-button-frames-panel > .tooltip-panel {
+  max-width: 500px;
+  overflow-y: auto;
+}
+
+#toolbox-frame-menu span {
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
 /* Toolbox panels */
 
 .toolbox-panel {
   display: -moz-box;
   -moz-box-flex: 1;
   visibility: collapse;
 }
 
--- a/devtools/client/webaudioeditor/test/browser_wa_reset-04.js
+++ b/devtools/client/webaudioeditor/test/browser_wa_reset-04.js
@@ -17,24 +17,27 @@ add_task(async function() {
     "The 'waiting for an audio context' notice should initially be hidden.");
   is($("#content").hidden, true,
     "The tool's content should initially be hidden.");
 
   const btn = toolbox.doc.getElementById("command-button-frames");
   ok(!btn.firstChild, "The frame list button has no children");
 
   // Open frame menu and wait till it's available on the screen.
-  const menu = await toolbox.showFramesMenu({target: btn});
-  await once(menu, "open");
+  const framePanel = toolbox.doc.getElementById("command-button-frames-panel");
+  btn.click();
+  ok(framePanel, "popup panel has created.");
+  await waitUntil(() => framePanel.classList.contains("tooltip-visible"));
 
-  const frames = menu.items;
-  is(frames.length, 2, "We have both frames in the list");
+  const menuList = toolbox.doc.getElementById("toolbox-frame-menu");
+  const buttonNodeList = menuList.querySelectorAll(".command");
+  is(buttonNodeList.length, 2, "We have both frames in the list");
 
   // Select the iframe
-  frames[1].click();
+  buttonNodeList[1].click();
 
   let navigating = once(target, "will-navigate");
 
   await navigating;
 
   is($("#reload-notice").hidden, false,
     "The 'reload this page' notice should still be visible when switching to a frame.");
   is($("#waiting-notice").hidden, true,
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..823439d1c5a5d582f61a28bb1f802e7a735e53c0
GIT binary patch
literal 195455
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
--- a/dom/media/test/mochitest.ini
+++ b/dom/media/test/mochitest.ini
@@ -402,16 +402,17 @@ support-files =
   bug1066943.webm
   bug1066943.webm^headers^
   bug1301226.wav
   bug1301226.wav^headers^
   bug1301226-odd.wav
   bug1301226-odd.wav^headers^
   bug1377278.webm
   bug1377278.webm^headers^
+  bunny.webm
   can_play_type_dash.js
   can_play_type_ogg.js
   can_play_type_wave.js
   can_play_type_webm.js
   cancellable_request.sjs
   chain.ogg
   chain.ogg^headers^
   chain.ogv
@@ -1131,16 +1132,17 @@ skip-if = toolkit == 'android' # bug 129
 skip-if = toolkit == 'android' # android(bug 1232305)
 [test_seekable1.html]
 skip-if = toolkit == 'android' # android(bug 1232305)
 [test_seekLies.html]
 skip-if = android_version == '15' || android_version == '17' # android(bug 1232305)
 [test_seekToNextFrame.html]
 skip-if = toolkit == 'android' # bug 1329391, android(bug 1232305)
 tags=seektonextframe
+[test_seek_duration.html]
 [test_source.html]
 skip-if = android_version == '17' # android(bug 1232305)
 [test_source_null.html]
 skip-if = android_version == '17' # android(bug 1232305)
 [test_source_write.html]
 skip-if = android_version == '17' # android(bug 1232305)
 [test_standalone.html]
 skip-if = toolkit == 'android' # bug 1372457
new file mode 100644
--- /dev/null
+++ b/dom/media/test/test_seek_duration.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Media test: seek tests</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+  <script type="text/javascript" src="manifest.js"></script>
+  <script type="text/javascript" src="seek_support.js"></script>
+</head>
+<body>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/**
+ * This test is used to make sure video's duration won't be changed when it
+ * reachs to the end after seeking to position where the time is very close to
+ * video's end time.
+ */
+
+SimpleTest.waitForExplicitFinish();
+
+(async function startTest()
+{
+  const video = document.createElement('video');
+  video.src = "bunny.webm";
+  document.body.appendChild(video);
+
+  const loadedMetadata = once(video, "loadedmetadata");
+  const canplay = once(video, "canplay");
+  const end = once(video, "ended");
+
+  info(`- wait for video loading metadata -`);
+  await loadedMetadata;
+  const originalDuration = video.duration;
+
+  info(`- seek video to the position which is close to end time -`);
+  // video's duration is 2.1 and the last key frame is in 2.0, we want to seek
+  // to that keyframe.
+  video.currentTime = originalDuration - 0.1;
+
+  info(`- play video until it ends -`);
+  await canplay;
+  await video.play();
+  await end;
+
+  ok(video.duration === originalDuration, `Duration shouldn't change`);
+  removeNodeAndSource(video);
+
+  SimpleTest.finish();
+})();
+
+</script>
+</pre>
+</body>
+</html>
--- a/dom/media/tests/mochitest/mochitest.ini
+++ b/dom/media/tests/mochitest/mochitest.ini
@@ -226,18 +226,22 @@ skip-if = toolkit == 'android'
 [test_peerConnection_restartIceNoBundle.html]
 skip-if = toolkit == 'android'
 [test_peerConnection_restartIceNoBundleNoRtcpMux.html]
 skip-if = toolkit == 'android'
 [test_peerConnection_restartIceNoRtcpMux.html]
 skip-if = toolkit == 'android'
 [test_peerConnection_restartIceLocalRollback.html]
 skip-if = toolkit == 'android'
+[test_peerConnection_restartIceLocalRollbackNoSubsequentRestart.html]
+skip-if = toolkit == 'android'
 [test_peerConnection_restartIceLocalAndRemoteRollback.html]
 skip-if = toolkit == 'android'
+[test_peerConnection_restartIceLocalAndRemoteRollbackNoSubsequentRestart.html]
+skip-if = toolkit == 'android'
 [test_peerConnection_restartIceBadAnswer.html]
 skip-if = toolkit == 'android'
 [test_peerConnection_scaleResolution.html]
 skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
 [test_peerConnection_simulcastOffer.html]
 skip-if = android_version # no simulcast support on android
 [test_peerConnection_simulcastAnswer.html]
 skip-if = android_version # no simulcast support on android
--- a/dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html
+++ b/dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html
@@ -59,23 +59,23 @@
           // We haven't negotiated the new stream yet.
           test.pcLocal.expectNegotiationNeeded();
           return test.setLocalDescription(
               test.pcLocal,
               new RTCSessionDescription({ type: "rollback", sdp: ""}),
               STABLE);
         },
 
-        // Rolling back should shut down gathering
+        // Rolling back should shut down gathering for the offerer,
+        // but because the answerer never set a local description, no ICE
+        // gathering has happened yet, so there's no changes to ICE gathering
+        // state
         function PC_LOCAL_WAIT_FOR_END_OF_TRICKLE(test) {
           return test.pcLocal.endOfTrickleIce;
         },
-        function PC_REMOTE_WAIT_FOR_END_OF_TRICKLE(test) {
-          return test.pcRemote.endOfTrickleIce;
-        },
 
         function PC_LOCAL_EXPECT_ICE_CHECKING(test) {
           test.pcLocal.expectIceChecking();
         },
         function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
           test.pcRemote.expectIceChecking();
         }
       ],
copy from dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html
copy to dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollbackNoSubsequentRestart.html
--- a/dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollback.html
+++ b/dom/media/tests/mochitest/test_peerConnection_restartIceLocalAndRemoteRollbackNoSubsequentRestart.html
@@ -3,17 +3,17 @@
 <head>
   <script type="application/javascript" src="pc.js"></script>
 </head>
 <body>
 <pre id="test">
 <script type="application/javascript">
   createHTML({
     bug: "906986",
-    title: "Renegotiation: restart ice, local and remote rollback"
+    title: "Renegotiation: restart ice, local and remote rollback, without a subsequent ICE restart"
   });
 
   var test;
   runNetworkTest(function (options) {
     test = new PeerConnectionTest(options);
 
     addRenegotiation(test.chain,
       [
@@ -38,50 +38,40 @@
           test.pcRemote.setupIceCandidateHandler(test);
           if (test.testOptions.steeplechase) {
             test.pcRemote.endOfTrickleIce.then(() => {
               send_message({"type": "end_of_trickle_ice"});
             });
           }
         },
 
-        function PC_LOCAL_EXPECT_ICE_CONNECTED(test) {
-          test.pcLocal.iceCheckingIceRollbackExpected = true;
-        },
-        function PC_REMOTE_EXPECT_ICE_CONNECTED(test) {
-          test.pcRemote.iceCheckingIceRollbackExpected = true;
-        },
-
         function PC_REMOTE_ROLLBACK(test) {
           return test.setRemoteDescription(test.pcRemote, { type: "rollback" },
                                            STABLE);
         },
 
         function PC_LOCAL_ROLLBACK(test) {
           // We haven't negotiated the new stream yet.
           test.pcLocal.expectNegotiationNeeded();
           return test.setLocalDescription(
               test.pcLocal,
               new RTCSessionDescription({ type: "rollback", sdp: ""}),
               STABLE);
         },
 
-        // Rolling back should shut down gathering
+        // Rolling back should shut down gathering for the offerer,
+        // but because the answerer never set a local description, no ICE
+        // gathering has happened yet, so there's no changes to ICE gathering
+        // state
         function PC_LOCAL_WAIT_FOR_END_OF_TRICKLE(test) {
           return test.pcLocal.endOfTrickleIce;
         },
-        function PC_REMOTE_WAIT_FOR_END_OF_TRICKLE(test) {
-          return test.pcRemote.endOfTrickleIce;
-        },
 
-        function PC_LOCAL_EXPECT_ICE_CHECKING(test) {
-          test.pcLocal.expectIceChecking();
-        },
-        function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
-          test.pcRemote.expectIceChecking();
+        function PC_LOCAL_SET_OFFER_OPTION(test) {
+          test.setOfferOptions({ iceRestart: false });
         }
       ],
       1 // Replaces after second PC_REMOTE_CREATE_ANSWER
     );
     test.chain.append(commandsPeerConnectionOfferAnswer);
 
     // for now, only use one stream, because rollback doesn't seem to
     // like multiple streams.  See bug 1259465.
copy from dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollback.html
copy to dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollbackNoSubsequentRestart.html
--- a/dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollback.html
+++ b/dom/media/tests/mochitest/test_peerConnection_restartIceLocalRollbackNoSubsequentRestart.html
@@ -3,17 +3,17 @@
 <head>
   <script type="application/javascript" src="pc.js"></script>
 </head>
 <body>
 <pre id="test">
 <script type="application/javascript">
   createHTML({
     bug: "906986",
-    title: "Renegotiation: restart ice, local rollback"
+    title: "Renegotiation: restart ice, local rollback, then renegotiation without ICE restart"
   });
 
   var test;
   runNetworkTest(function (options) {
     test = new PeerConnectionTest(options);
 
     addRenegotiation(test.chain,
       [
@@ -33,33 +33,27 @@
         },
         function PC_LOCAL_CREATE_AND_SET_OFFER(test) {
           return test.createOffer(test.pcLocal).then(offer => {
             return test.setLocalDescription(test.pcLocal,
                                             offer,
                                             HAVE_LOCAL_OFFER);
           });
         },
-        function PC_LOCAL_EXPECT_ICE_CONNECTED(test) {
-          test.pcLocal.iceCheckingIceRollbackExpected = true;
-        },
         function PC_LOCAL_ROLLBACK(test) {
           return test.setLocalDescription(test.pcLocal,
                                           { type: "rollback", sdp: ""},
                                           STABLE);
         },
         // Rolling back should shut down gathering
         function PC_LOCAL_WAIT_FOR_END_OF_TRICKLE(test) {
           return test.pcLocal.endOfTrickleIce;
         },
-        function PC_LOCAL_EXPECT_ICE_CHECKING(test) {
-          test.pcLocal.expectIceChecking();
-        },
-        function PC_REMOTE_EXPECT_ICE_CHECKING(test) {
-          test.pcRemote.expectIceChecking();
+        function PC_LOCAL_SET_OFFER_OPTION(test) {
+          test.setOfferOptions({ iceRestart: false });
         }
       ]
     );
 
     // for now, only use one stream, because rollback doesn't seem to
     // like multiple streams.  See bug 1259465.
     test.setMediaConstraints([{audio: true}],
                              [{audio: true}]);
--- a/dom/media/webm/WebMDemuxer.cpp
+++ b/dom/media/webm/WebMDemuxer.cpp
@@ -592,55 +592,51 @@ WebMDemuxer::GetNextPacket(TrackInfo::Tr
   }
   int64_t tstamp = holder->Timestamp();
   int64_t duration = holder->Duration();
 
   // The end time of this frame is the start time of the next frame. Fetch
   // the timestamp of the next packet for this track.  If we've reached the
   // end of the resource, use the file's duration as the end time of this
   // video frame.
+  RefPtr<NesteggPacketHolder> next_holder;
+  rv = NextPacket(aType, next_holder);
+  if (NS_FAILED(rv) && rv != NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
+    return rv;
+  }
+
   int64_t next_tstamp = INT64_MIN;
-  if (aType == TrackInfo::kAudioTrack) {
-    RefPtr<NesteggPacketHolder> next_holder;
-    rv = NextPacket(aType, next_holder);
-    if (NS_FAILED(rv) && rv != NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
-      return rv;
-    }
-    if (next_holder) {
-      next_tstamp = next_holder->Timestamp();
-      PushAudioPacket(next_holder);
-    } else if (duration >= 0) {
-      next_tstamp = tstamp + duration;
-    } else if (!mIsMediaSource ||
-               (mIsMediaSource && mLastAudioFrameTime.isSome())) {
-      next_tstamp = tstamp;
-      next_tstamp += tstamp - mLastAudioFrameTime.refOr(0);
-    } else {
-      PushAudioPacket(holder);
-    }
-    mLastAudioFrameTime = Some(tstamp);
-  } else if (aType == TrackInfo::kVideoTrack) {
-    RefPtr<NesteggPacketHolder> next_holder;
-    rv = NextPacket(aType, next_holder);
-    if (NS_FAILED(rv) && rv != NS_ERROR_DOM_MEDIA_END_OF_STREAM) {
-      return rv;
-    }
-    if (next_holder) {
-      next_tstamp = next_holder->Timestamp();
-      PushVideoPacket(next_holder);
-    } else if (duration >= 0) {
-      next_tstamp = tstamp + duration;
-    } else if (!mIsMediaSource ||
-               (mIsMediaSource && mLastVideoFrameTime.isSome())) {
-      next_tstamp = tstamp;
-      next_tstamp += tstamp - mLastVideoFrameTime.refOr(0);
-    } else {
-      PushVideoPacket(holder);
-    }
-    mLastVideoFrameTime = Some(tstamp);
+  auto calculateNextTimestamp =
+    [&] (auto&& pushPacket, auto&& lastFrameTime, auto&& trackEndTime) {
+      if (next_holder) {
+        next_tstamp = next_holder->Timestamp();
+        (this->*pushPacket)(next_holder);
+      } else if (duration >= 0) {
+        next_tstamp = tstamp + duration;
+      } else if (lastFrameTime.isSome()) {
+        next_tstamp = tstamp + (tstamp - lastFrameTime.ref());
+      } else if (mIsMediaSource) {
+        (this->*pushPacket)(holder);
+      } else {
+        // If we can't get frame's duration, it means either we need to wait for
+        // more data for MSE case or this is the last frame for file resource case.
+        MOZ_ASSERT(trackEndTime >= tstamp);
+        next_tstamp = trackEndTime;
+      }
+      lastFrameTime = Some(tstamp);
+  };
+
+  if (aType == TrackInfo::kAudioTrack)  {
+    calculateNextTimestamp(&WebMDemuxer::PushAudioPacket,
+                           mLastAudioFrameTime,
+                           mInfo.mAudio.mDuration.ToMicroseconds());
+  } else {
+    calculateNextTimestamp(&WebMDemuxer::PushVideoPacket,
+                           mLastVideoFrameTime,
+                           mInfo.mVideo.mDuration.ToMicroseconds());
   }
 
   if (mIsMediaSource && next_tstamp == INT64_MIN) {
     return NS_ERROR_DOM_MEDIA_END_OF_STREAM;
   }
 
   int64_t discardPadding = 0;
   if (aType == TrackInfo::kAudioTrack) {
@@ -1149,17 +1145,17 @@ WebMTrackDemuxer::Seek(const TimeUnit& a
   SetNextKeyFrameTime();
 
   return SeekPromise::CreateAndResolve(seekTime, __func__);
 }
 
 nsresult
 WebMTrackDemuxer::NextSample(RefPtr<MediaRawData>& aData)
 {
-  nsresult rv = NS_ERROR_DOM_MEDIA_END_OF_STREAM;;
+  nsresult rv = NS_ERROR_DOM_MEDIA_END_OF_STREAM;
   while (mSamples.GetSize() < 1 &&
          NS_SUCCEEDED((rv = mParent->GetNextPacket(mType, &mSamples)))) {
   }
   if (mSamples.GetSize()) {
     aData = mSamples.PopFront();
     return NS_OK;
   }
   return rv;
--- a/dom/webauthn/u2f-hid-rs/.travis.yml
+++ b/dom/webauthn/u2f-hid-rs/.travis.yml
@@ -15,20 +15,22 @@ addons:
     packages:
       - build-essential
       - libudev-dev
 
 before_install:
   - pkg-config --list-all
   - pkg-config --libs libudev
   - pkg-config --modversion libudev
-  - cargo install rustfmt || true
+
+install:
+  - rustup install nightly
+  - rustup component add --toolchain nightly rustfmt-preview
 
 script:
 - |
   if [ "$TRAVIS_RUST_VERSION" == "nightly" ] ; then
     export ASAN_OPTIONS="detect_odr_violation=1:leak_check_at_exit=0:detect_leaks=0"
     export RUSTFLAGS="-Z sanitizer=address"
   fi
-- |
-  cargo fmt -- --write-mode=diff &&
-  cargo build &&
-  cargo test
+- cargo +nightly fmt --all -- --check
+- cargo build
+- cargo test
--- a/dom/webauthn/u2f-hid-rs/Cargo.toml
+++ b/dom/webauthn/u2f-hid-rs/Cargo.toml
@@ -1,25 +1,32 @@
 [package]
 name = "u2fhid"
-version = "0.2.0"
+version = "0.2.1"
 authors = ["Kyle Machulis <kyle@nonpolynomial.com>", "J.C. Jones <jc@mozilla.com>", "Tim Taubert <ttaubert@mozilla.com>"]
 
 [target.'cfg(target_os = "linux")'.dependencies]
 libudev = "^0.2"
 
 [target.'cfg(target_os = "freebsd")'.dependencies]
 devd-rs = "0.2.1"
 
 [target.'cfg(target_os = "macos")'.dependencies]
 core-foundation-sys = "0.6.0"
 core-foundation = "0.6.0"
 
-[target.'cfg(target_os = "windows")'.dependencies]
-winapi = "0.2.8"
+[target.'cfg(target_os = "windows")'.dependencies.winapi]
+version = "0.3"
+features = [
+    "handleapi",
+    "hidclass",
+    "hidpi",
+    "hidusage",
+    "setupapi",
+]
 
 [dependencies]
 rand = "0.3"
 log = "0.4"
 libc = "^0.2"
 boxfnonce = "0.0.3"
 runloop = "0.1.0"
 bitflags = "1.0"
--- a/dom/webauthn/u2f-hid-rs/examples/main.rs
+++ b/dom/webauthn/u2f-hid-rs/examples/main.rs
@@ -64,18 +64,17 @@ fn main() {
             flags,
             15_000,
             chall_bytes.clone(),
             app_bytes.clone(),
             vec![],
             move |rv| {
                 tx.send(rv.unwrap()).unwrap();
             },
-        )
-        .unwrap();
+        ).unwrap();
 
     let register_data = try_or!(rx.recv(), |_| {
         panic!("Problem receiving, unable to continue");
     });
     println!("Register result: {}", base64::encode(&register_data));
     println!("Asking a security key to sign now, with the data from the register...");
     let credential = u2f_get_key_handle_from_register_response(&register_data).unwrap();
     let key_handle = KeyHandle {
@@ -90,18 +89,17 @@ fn main() {
             flags,
             15_000,
             chall_bytes,
             vec![app_bytes],
             vec![key_handle],
             move |rv| {
                 tx.send(rv.unwrap()).unwrap();
             },
-        )
-        .unwrap();
+        ).unwrap();
 
     let (_, handle_used, sign_data) = try_or!(rx.recv(), |_| {
         println!("Problem receiving");
     });
     println!("Sign result: {}", base64::encode(&sign_data));
     println!("Key handle used: {}", base64::encode(&handle_used));
     println!("Done.");
 }
--- a/dom/webauthn/u2f-hid-rs/src/freebsd/monitor.rs
+++ b/dom/webauthn/u2f-hid-rs/src/freebsd/monitor.rs
@@ -19,25 +19,27 @@ pub enum Event {
 
 impl Event {
     fn from_devd(event: devd_rs::Event) -> Option<Self> {
         match event {
             devd_rs::Event::Attach {
                 ref dev,
                 parent: _,
                 location: _,
-            } if dev.starts_with("uhid") =>
+            }
+                if dev.starts_with("uhid") =>
             {
                 Some(Event::Add(("/dev/".to_owned() + dev).into()))
             }
             devd_rs::Event::Detach {
                 ref dev,
                 parent: _,
                 location: _,
-            } if dev.starts_with("uhid") =>
+            }
+                if dev.starts_with("uhid") =>
             {
                 Some(Event::Remove(("/dev/".to_owned() + dev).into()))
             }
             _ => None,
         }
     }
 }
 
--- a/dom/webauthn/u2f-hid-rs/src/hidproto.rs
+++ b/dom/webauthn/u2f-hid-rs/src/hidproto.rs
@@ -1,17 +1,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/. */
 
 // Shared code for platforms that use raw HID access (Linux, FreeBSD, etc.)
 
 use std::mem;
 
-use consts::{FIDO_USAGE_U2FHID, FIDO_USAGE_PAGE};
+use consts::{FIDO_USAGE_PAGE, FIDO_USAGE_U2FHID};
 
 // The 4 MSBs (the tag) are set when it's a long item.
 const HID_MASK_LONG_ITEM_TAG: u8 = 0b11110000;
 // The 2 LSBs denote the size of a short item.
 const HID_MASK_SHORT_ITEM_SIZE: u8 = 0b00000011;
 // The 6 MSBs denote the tag (4) and type (2).
 const HID_MASK_ITEM_TAGTYPE: u8 = 0b11111100;
 // tag=0000, type=10 (local)
--- a/dom/webauthn/u2f-hid-rs/src/lib.rs
+++ b/dom/webauthn/u2f-hid-rs/src/lib.rs
@@ -31,21 +31,22 @@ extern crate core_foundation;
 #[cfg(any(target_os = "macos"))]
 #[path = "macos/mod.rs"]
 pub mod platform;
 
 #[cfg(any(target_os = "windows"))]
 #[path = "windows/mod.rs"]
 pub mod platform;
 
-#[cfg(
-    not(
-        any(target_os = "linux", target_os = "freebsd", target_os = "macos", target_os = "windows")
-    )
-)]
+#[cfg(not(any(
+    target_os = "linux",
+    target_os = "freebsd",
+    target_os = "macos",
+    target_os = "windows"
+)))]
 #[path = "stub/mod.rs"]
 pub mod platform;
 
 extern crate boxfnonce;
 extern crate libc;
 #[macro_use]
 extern crate log;
 extern crate rand;
--- a/dom/webauthn/u2f-hid-rs/src/macos/iokit.rs
+++ b/dom/webauthn/u2f-hid-rs/src/macos/iokit.rs
@@ -2,17 +2,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
 
 extern crate core_foundation_sys;
 extern crate libc;
 
-use consts::{FIDO_USAGE_U2FHID, FIDO_USAGE_PAGE};
+use consts::{FIDO_USAGE_PAGE, FIDO_USAGE_U2FHID};
 use core_foundation::dictionary::*;
 use core_foundation::number::*;
 use core_foundation::string::*;
 use core_foundation_sys::base::*;
 use core_foundation_sys::dictionary::*;
 use core_foundation_sys::runloop::*;
 use core_foundation_sys::string::*;
 use std::ops::Deref;
--- a/dom/webauthn/u2f-hid-rs/src/macos/transaction.rs
+++ b/dom/webauthn/u2f-hid-rs/src/macos/transaction.rs
@@ -52,18 +52,17 @@ impl Transaction {
                 // This will block until completion, abortion, or timeout.
                 unsafe { CFRunLoopRunInMode(kCFRunLoopDefaultMode, timeout, 0) };
 
                 // Close the monitor and its devices.
                 monitor.stop();
 
                 // Send an error, if the callback wasn't called already.
                 callback.call(Err(::Error::NotAllowed));
-            })
-            .map_err(|_| ::Error::Unknown)?;
+            }).map_err(|_| ::Error::Unknown)?;
 
         // Block until we enter the CFRunLoop.
         let runloop = rx.recv().map_err(|_| ::Error::Unknown)?;
 
         Ok(Self {
             runloop: Some(runloop),
             thread: Some(thread),
         })
--- a/dom/webauthn/u2f-hid-rs/src/statemachine.rs
+++ b/dom/webauthn/u2f-hid-rs/src/statemachine.rs
@@ -85,19 +85,22 @@ impl StateMachine {
             if !flags.is_empty() {
                 return;
             }
 
             // Iterate the exclude list and see if there are any matches.
             // If so, we'll keep polling the device anyway to test for user
             // consent, to be consistent with CTAP2 device behavior.
             let excluded = key_handles.iter().any(|key_handle| {
-                is_valid_transport(key_handle.transports)
-                    && u2f_is_keyhandle_valid(dev, &challenge, &application, &key_handle.credential)
-                        .unwrap_or(false) /* no match on failure */
+                is_valid_transport(key_handle.transports) && u2f_is_keyhandle_valid(
+                    dev,
+                    &challenge,
+                    &application,
+                    &key_handle.credential,
+                ).unwrap_or(false) /* no match on failure */
             });
 
             while alive() {
                 if excluded {
                     let blank = vec![0u8; PARAMETER_SIZE];
                     if let Ok(_) = u2f_register(dev, &blank, &blank) {
                         callback.call(Err(::Error::InvalidState));
                         break;
--- a/dom/webauthn/u2f-hid-rs/src/u2fprotocol.rs
+++ b/dom/webauthn/u2f-hid-rs/src/u2fprotocol.rs
@@ -210,17 +210,17 @@ where
 // Tests
 ////////////////////////////////////////////////////////////////////////
 
 #[cfg(test)]
 mod tests {
     use rand::{thread_rng, Rng};
 
     use super::{init_device, send_apdu, sendrecv, U2FDevice};
-    use consts::{U2FHID_INIT, U2FHID_MSG, U2FHID_PING, CID_BROADCAST, SW_NO_ERROR};
+    use consts::{CID_BROADCAST, SW_NO_ERROR, U2FHID_INIT, U2FHID_MSG, U2FHID_PING};
 
     mod platform {
         use std::io;
         use std::io::{Read, Write};
 
         use consts::{CID_BROADCAST, HID_RPT_SIZE};
         use u2ftypes::U2FDevice;
 
--- a/dom/webauthn/u2f-hid-rs/src/windows/device.rs
+++ b/dom/webauthn/u2f-hid-rs/src/windows/device.rs
@@ -3,17 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 use std::fs::{File, OpenOptions};
 use std::io;
 use std::io::{Read, Write};
 use std::os::windows::io::AsRawHandle;
 
 use super::winapi::DeviceCapabilities;
-use consts::{FIDO_USAGE_U2FHID, CID_BROADCAST, FIDO_USAGE_PAGE, HID_RPT_SIZE};
+use consts::{CID_BROADCAST, FIDO_USAGE_PAGE, FIDO_USAGE_U2FHID, HID_RPT_SIZE};
 
 use u2ftypes::U2FDevice;
 
 #[derive(Debug)]
 pub struct Device {
     path: String,
     file: File,
     cid: [u8; 4],
--- a/dom/webauthn/u2f-hid-rs/src/windows/winapi.rs
+++ b/dom/webauthn/u2f-hid-rs/src/windows/winapi.rs
@@ -9,131 +9,139 @@ use std::slice;
 
 use std::ffi::OsString;
 use std::os::windows::ffi::OsStringExt;
 
 use util::io_err;
 
 extern crate libc;
 extern crate winapi;
-use self::winapi::*;
+
+use platform::winapi::winapi::shared::{guiddef, minwindef, ntdef, windef};
+use platform::winapi::winapi::shared::{hidclass, hidpi, hidusage};
+use platform::winapi::winapi::um::{handleapi, setupapi};
 
 #[link(name = "setupapi")]
 extern "stdcall" {
     fn SetupDiGetClassDevsW(
-        ClassGuid: *const GUID,
-        Enumerator: PCSTR,
-        hwndParent: HWND,
-        flags: DWORD,
-    ) -> HDEVINFO;
+        ClassGuid: *const guiddef::GUID,
+        Enumerator: ntdef::PCSTR,
+        hwndParent: windef::HWND,
+        flags: minwindef::DWORD,
+    ) -> setupapi::HDEVINFO;
 
-    fn SetupDiDestroyDeviceInfoList(DeviceInfoSet: HDEVINFO) -> BOOL;
+    fn SetupDiDestroyDeviceInfoList(DeviceInfoSet: setupapi::HDEVINFO) -> minwindef::BOOL;
 
     fn SetupDiEnumDeviceInterfaces(
-        DeviceInfoSet: HDEVINFO,
-        DeviceInfoData: PSP_DEVINFO_DATA,
-        InterfaceClassGuid: *const GUID,
-        MemberIndex: DWORD,
-        DeviceInterfaceData: PSP_DEVICE_INTERFACE_DATA,
-    ) -> BOOL;
+        DeviceInfoSet: setupapi::HDEVINFO,
+        DeviceInfoData: setupapi::PSP_DEVINFO_DATA,
+        InterfaceClassGuid: *const guiddef::GUID,
+        MemberIndex: minwindef::DWORD,
+        DeviceInterfaceData: setupapi::PSP_DEVICE_INTERFACE_DATA,
+    ) -> minwindef::BOOL;
 
     fn SetupDiGetDeviceInterfaceDetailW(
-        DeviceInfoSet: HDEVINFO,
-        DeviceInterfaceData: PSP_DEVICE_INTERFACE_DATA,
-        DeviceInterfaceDetailData: PSP_DEVICE_INTERFACE_DETAIL_DATA_W,
-        DeviceInterfaceDetailDataSize: DWORD,
-        RequiredSize: PDWORD,
-        DeviceInfoData: PSP_DEVINFO_DATA,
-    ) -> BOOL;
+        DeviceInfoSet: setupapi::HDEVINFO,
+        DeviceInterfaceData: setupapi::PSP_DEVICE_INTERFACE_DATA,
+        DeviceInterfaceDetailData: setupapi::PSP_DEVICE_INTERFACE_DETAIL_DATA_W,
+        DeviceInterfaceDetailDataSize: minwindef::DWORD,
+        RequiredSize: minwindef::PDWORD,
+        DeviceInfoData: setupapi::PSP_DEVINFO_DATA,
+    ) -> minwindef::BOOL;
 }
 
 #[link(name = "hid")]
 extern "stdcall" {
     fn HidD_GetPreparsedData(
-        HidDeviceObject: HANDLE,
-        PreparsedData: *mut PHIDP_PREPARSED_DATA,
-    ) -> BOOLEAN;
+        HidDeviceObject: ntdef::HANDLE,
+        PreparsedData: *mut hidpi::PHIDP_PREPARSED_DATA,
+    ) -> ntdef::BOOLEAN;
 
-    fn HidD_FreePreparsedData(PreparsedData: PHIDP_PREPARSED_DATA) -> BOOLEAN;
+    fn HidD_FreePreparsedData(PreparsedData: hidpi::PHIDP_PREPARSED_DATA) -> ntdef::BOOLEAN;
 
-    fn HidP_GetCaps(PreparsedData: PHIDP_PREPARSED_DATA, Capabilities: PHIDP_CAPS) -> NTSTATUS;
+    fn HidP_GetCaps(
+        PreparsedData: hidpi::PHIDP_PREPARSED_DATA,
+        Capabilities: hidpi::PHIDP_CAPS,
+    ) -> ntdef::NTSTATUS;
 }
 
 macro_rules! offset_of {
     ($ty:ty, $field:ident) => {
         unsafe { &(*(0 as *const $ty)).$field as *const _ as usize }
     };
 }
 
 fn from_wide_ptr(ptr: *const u16, len: usize) -> String {
     assert!(!ptr.is_null() && len % 2 == 0);
     let slice = unsafe { slice::from_raw_parts(ptr, len / 2) };
     OsString::from_wide(slice).to_string_lossy().into_owned()
 }
 
 pub struct DeviceInfoSet {
-    set: HDEVINFO,
+    set: setupapi::HDEVINFO,
 }
 
 impl DeviceInfoSet {
     pub fn new() -> io::Result<Self> {
-        let flags = DIGCF_PRESENT | DIGCF_DEVICEINTERFACE;
+        let flags = setupapi::DIGCF_PRESENT | setupapi::DIGCF_DEVICEINTERFACE;
         let set = unsafe {
             SetupDiGetClassDevsW(
-                &GUID_DEVINTERFACE_HID,
+                &hidclass::GUID_DEVINTERFACE_HID,
                 ptr::null_mut(),
                 ptr::null_mut(),
                 flags,
             )
         };
-        if set == INVALID_HANDLE_VALUE {
+        if set == handleapi::INVALID_HANDLE_VALUE {
             return Err(io_err("SetupDiGetClassDevsW failed!"));
         }
 
         Ok(Self { set })
     }
 
-    pub fn get(&self) -> HDEVINFO {
+    pub fn get(&self) -> setupapi::HDEVINFO {
         self.set
     }
 
     pub fn devices(&self) -> DeviceInfoSetIter {
         DeviceInfoSetIter::new(self)
     }
 }
 
 impl Drop for DeviceInfoSet {
     fn drop(&mut self) {
         let _ = unsafe { SetupDiDestroyDeviceInfoList(self.set) };
     }
 }
 
 pub struct DeviceInfoSetIter<'a> {
     set: &'a DeviceInfoSet,
-    index: DWORD,
+    index: minwindef::DWORD,
 }
 
 impl<'a> DeviceInfoSetIter<'a> {
     fn new(set: &'a DeviceInfoSet) -> Self {
         Self { set, index: 0 }
     }
 }
 
 impl<'a> Iterator for DeviceInfoSetIter<'a> {
     type Item = String;
 
     fn next(&mut self) -> Option<Self::Item> {
-        let mut device_interface_data = unsafe { mem::uninitialized::<SP_DEVICE_INTERFACE_DATA>() };
-        device_interface_data.cbSize = mem::size_of::<SP_DEVICE_INTERFACE_DATA>() as UINT;
+        let mut device_interface_data =
+            unsafe { mem::uninitialized::<setupapi::SP_DEVICE_INTERFACE_DATA>() };
+        device_interface_data.cbSize =
+            mem::size_of::<setupapi::SP_DEVICE_INTERFACE_DATA>() as minwindef::UINT;
 
         let rv = unsafe {
             SetupDiEnumDeviceInterfaces(
                 self.set.get(),
                 ptr::null_mut(),
-                &GUID_DEVINTERFACE_HID,
+                &hidclass::GUID_DEVINTERFACE_HID,
                 self.index,
                 &mut device_interface_data,
             )
         };
         if rv == 0 {
             return None; // We're past the last device index.
         }
 
@@ -174,90 +182,90 @@ impl<'a> Iterator for DeviceInfoSetIter<
         }
 
         self.index += 1;
         Some(detail.path())
     }
 }
 
 struct DeviceInterfaceDetailData {
-    data: PSP_DEVICE_INTERFACE_DETAIL_DATA_W,
+    data: setupapi::PSP_DEVICE_INTERFACE_DETAIL_DATA_W,
     path_len: usize,
 }
 
 impl DeviceInterfaceDetailData {
     fn new(size: usize) -> Option<Self> {
-        let mut cb_size = mem::size_of::<SP_DEVICE_INTERFACE_DETAIL_DATA_W>();
+        let mut cb_size = mem::size_of::<setupapi::SP_DEVICE_INTERFACE_DETAIL_DATA_W>();
         if cfg!(target_pointer_width = "32") {
             cb_size = 4 + 2; // 4-byte uint + default TCHAR size. size_of is inaccurate.
         }
 
         if size < cb_size {
             warn!("DeviceInterfaceDetailData is too small. {}", size);
             return None;
         }
 
-        let data = unsafe { libc::malloc(size) as PSP_DEVICE_INTERFACE_DETAIL_DATA_W };
+        let data = unsafe { libc::malloc(size) as setupapi::PSP_DEVICE_INTERFACE_DETAIL_DATA_W };
         if data.is_null() {
             return None;
         }
 
         // Set total size of the structure.
-        unsafe { (*data).cbSize = cb_size as UINT };
+        unsafe { (*data).cbSize = cb_size as minwindef::UINT };
 
         // Compute offset of `SP_DEVICE_INTERFACE_DETAIL_DATA_W.DevicePath`.
-        let offset = offset_of!(SP_DEVICE_INTERFACE_DETAIL_DATA_W, DevicePath);
+        let offset = offset_of!(setupapi::SP_DEVICE_INTERFACE_DETAIL_DATA_W, DevicePath);
 
         Some(Self {
             data,
             path_len: size - offset,
         })
     }
 
-    fn get(&self) -> PSP_DEVICE_INTERFACE_DETAIL_DATA_W {
+    fn get(&self) -> setupapi::PSP_DEVICE_INTERFACE_DETAIL_DATA_W {
         self.data
     }
 
     fn path(&self) -> String {
         unsafe { from_wide_ptr((*self.data).DevicePath.as_ptr(), self.path_len - 2) }
     }
 }
 
 impl Drop for DeviceInterfaceDetailData {
     fn drop(&mut self) {
         unsafe { libc::free(self.data as *mut libc::c_void) };
     }
 }
 
 pub struct DeviceCapabilities {
-    caps: HIDP_CAPS,
+    caps: hidpi::HIDP_CAPS,
 }
 
 impl DeviceCapabilities {
-    pub fn new(handle: HANDLE) -> io::Result<Self> {
+    pub fn new(handle: ntdef::HANDLE) -> io::Result<Self> {
         let mut preparsed_data = ptr::null_mut();
         let rv = unsafe { HidD_GetPreparsedData(handle, &mut preparsed_data) };
         if rv == 0 || preparsed_data.is_null() {
             return Err(io_err("HidD_GetPreparsedData failed!"));
         }
 
-        let mut caps: HIDP_CAPS = unsafe { mem::uninitialized() };
+        let mut caps: hidpi::HIDP_CAPS = unsafe { mem::uninitialized() };
 
         unsafe {
             let rv = HidP_GetCaps(preparsed_data, &mut caps);
             HidD_FreePreparsedData(preparsed_data);
 
-            if rv != HIDP_STATUS_SUCCESS {
+            if rv != hidpi::HIDP_STATUS_SUCCESS {
                 return Err(io_err("HidP_GetCaps failed!"));
             }
         }
 
         Ok(Self { caps })
     }
 
-    pub fn usage(&self) -> USAGE {
+    pub fn usage(&self) -> hidusage::USAGE {
         self.caps.Usage
     }
 
-    pub fn usage_page(&self) -> USAGE {
+    pub fn usage_page(&self) -> hidusage::USAGE {
         self.caps.UsagePage
     }
 }
--- a/gfx/layers/wr/WebRenderCommandBuilder.cpp
+++ b/gfx/layers/wr/WebRenderCommandBuilder.cpp
@@ -1180,24 +1180,36 @@ WebRenderCommandBuilder::DoGroupingForDi
   LayerPoint residualOffset = trans - snappedTrans;
 
   GP("Inherrited scale %f %f\n", scale.width, scale.height);
   GP("Bounds: %d %d %d %d vs %d %d %d %d\n", p.x, p.y, p.width, p.height, q.x, q.y, q.width, q.height);
   if (!group.mGroupBounds.IsEqualEdges(groupBounds) ||
       group.mAppUnitsPerDevPixel != appUnitsPerDevPixel ||
       group.mScale != scale ||
       group.mResidualOffset != residualOffset) {
+    GP("Property change. Deleting blob\n");
+
     if (group.mAppUnitsPerDevPixel != appUnitsPerDevPixel) {
-      GP("app unit %d %d\n", group.mAppUnitsPerDevPixel, appUnitsPerDevPixel);
+      GP(" app unit change%d %d\n", group.mAppUnitsPerDevPixel, appUnitsPerDevPixel);
     }
     // The bounds have changed so we need to discard the old image and add all
     // the commands again.
     auto p = group.mGroupBounds;
     auto q = groupBounds;
-    GP("Bounds change: %d %d %d %d vs %d %d %d %d\n", p.x, p.y, p.width, p.height, q.x, q.y, q.width, q.height);
+    if (!group.mGroupBounds.IsEqualEdges(groupBounds)) {
+      GP(" Bounds change: %d %d %d %d vs %d %d %d %d\n", p.x, p.y, p.width, p.height, q.x, q.y, q.width, q.height);
+    }
+
+    if (group.mScale != scale) {
+      GP(" Scale %f %f vs %f %f\n", group.mScale.width, group.mScale.height, scale.width, scale.height);
+    }
+
+    if (group.mResidualOffset != residualOffset) {
+      GP(" Residual Offset %f %f vs %f %f\n", group.mResidualOffset.x, group.mResidualOffset.y, residualOffset.x, residualOffset.y);
+    }
 
     group.ClearItems();
     group.ClearImageKey(mManager);
   }
 
   FrameMetrics::ViewID scrollId = FrameMetrics::NULL_SCROLL_ID;
   if (const ActiveScrolledRoot* asr = aWrappingItem->GetActiveScrolledRoot()) {
     scrollId = asr->GetViewId();
--- a/media/mtransport/common.build
+++ b/media/mtransport/common.build
@@ -5,17 +5,16 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 mtransport_lcppsrcs = [
     'dtlsidentity.cpp',
     'mediapacket.cpp',
     'nr_socket_prsock.cpp',
     'nr_timer.cpp',
     'nricectx.cpp',
-    'nricectxhandler.cpp',
     'nricemediastream.cpp',
     'nriceresolver.cpp',
     'nriceresolverfake.cpp',
     'nricestunaddr.cpp',
     'nrinterfaceprioritizer.cpp',
     'rlogconnector.cpp',
     'simpletokenbucket.cpp',
     'SrtpFlow.cpp',
--- a/media/mtransport/nricectx.cpp
+++ b/media/mtransport/nricectx.cpp
@@ -286,54 +286,106 @@ NrIceCtx::NrIceCtx(const std::string& na
     peer_(nullptr),
     ice_handler_vtbl_(nullptr),
     ice_handler_(nullptr),
     trickle_(true),
     policy_(policy),
     nat_ (nullptr) {
 }
 
+/* static */
+RefPtr<NrIceCtx>
+NrIceCtx::Create(const std::string& name,
+                 bool allow_loopback,
+                 bool tcp_enabled,
+                 bool allow_link_local,
+                 Policy policy)
+{
+  // InitializeGlobals only executes once
+  NrIceCtx::InitializeGlobals(allow_loopback, tcp_enabled, allow_link_local);
+
+  RefPtr<NrIceCtx> ctx = new NrIceCtx(name, policy);
+
+  if (!ctx->Initialize()) {
+    return nullptr;
+  }
+
+  return ctx;
+}
+
+RefPtr<NrIceMediaStream>
+NrIceCtx::CreateStream(const std::string& id,
+                       const std::string& name,
+                       int components)
+{
+  if (streams_.count(id)) {
+    MOZ_ASSERT(false);
+    return nullptr;
+  }
+
+  RefPtr<NrIceMediaStream> stream =
+    new NrIceMediaStream(this, id, name, components);
+  streams_[id] = stream;
+  return stream;
+}
+
+void
+NrIceCtx::DestroyStream(const std::string& id) {
+  auto it = streams_.find(id);
+  if (it != streams_.end()) {
+    auto preexisting_stream = it->second;
+    streams_.erase(it);
+    preexisting_stream->Close();
+  }
+}
+
 // Handler callbacks
 int NrIceCtx::select_pair(void *obj,nr_ice_media_stream *stream,
                    int component_id, nr_ice_cand_pair **potentials,
                    int potential_ct) {
   MOZ_MTLOG(ML_DEBUG, "select pair called: potential_ct = "
             << potential_ct);
+  MOZ_ASSERT(stream->local_stream);
+  MOZ_ASSERT(!stream->local_stream->obsolete);
 
   return 0;
 }
 
 int NrIceCtx::stream_ready(void *obj, nr_ice_media_stream *stream) {
   MOZ_MTLOG(ML_DEBUG, "stream_ready called");
+  MOZ_ASSERT(!stream->local_stream);
+  MOZ_ASSERT(!stream->obsolete);
 
   // Get the ICE ctx.
   NrIceCtx *ctx = static_cast<NrIceCtx *>(obj);
 
   RefPtr<NrIceMediaStream> s = ctx->FindStream(stream);
 
   // Streams which do not exist should never be ready.
   MOZ_ASSERT(s);
 
   s->Ready();
 
   return 0;
 }
 
 int NrIceCtx::stream_failed(void *obj, nr_ice_media_stream *stream) {
   MOZ_MTLOG(ML_DEBUG, "stream_failed called");
+  MOZ_ASSERT(!stream->local_stream);
+  MOZ_ASSERT(!stream->obsolete);
 
   // Get the ICE ctx
   NrIceCtx *ctx = static_cast<NrIceCtx *>(obj);
   RefPtr<NrIceMediaStream> s = ctx->FindStream(stream);
 
   // Streams which do not exist should never fail.
   MOZ_ASSERT(s);
 
   ctx->SetConnectionState(ICE_CTX_FAILED);
-  s -> SignalFailed(s);
+  s -> Failed();
   return 0;
 }
 
 int NrIceCtx::ice_checking(void *obj, nr_ice_peer_ctx *pctx) {
   MOZ_MTLOG(ML_DEBUG, "ice_checking called");
 
   // Get the ICE ctx
   NrIceCtx *ctx = static_cast<NrIceCtx *>(obj);
@@ -382,16 +434,17 @@ int NrIceCtx::msg_recvd(void *obj, nr_ic
 
   return 0;
 }
 
 void NrIceCtx::trickle_cb(void *arg, nr_ice_ctx *ice_ctx,
                           nr_ice_media_stream *stream,
                           int component_id,
                           nr_ice_candidate *candidate) {
+  MOZ_ASSERT(!stream->obsolete);
   // Get the ICE ctx
   NrIceCtx *ctx = static_cast<NrIceCtx *>(arg);
   RefPtr<NrIceMediaStream> s = ctx->FindStream(stream);
 
   if (!s) {
     // This stream has been removed because it is inactive
     return;
   }
@@ -483,50 +536,16 @@ NrIceCtx::InitializeGlobals(bool allow_l
     if (force_net_interface.Length() > 0) {
       // Stupid cast.... but needed
       const nsCString& flat = PromiseFlatCString(static_cast<nsACString&>(force_net_interface));
       NR_reg_set_string((char *)NR_ICE_REG_PREF_FORCE_INTERFACE_NAME, const_cast<char*>(flat.get()));
     }
   }
 }
 
-std::string
-NrIceCtx::GetNewUfrag()
-{
-  char* ufrag;
-  int r;
-
-  if ((r=nr_ice_get_new_ice_ufrag(&ufrag))) {
-    MOZ_CRASH("Unable to get new ice ufrag");
-    return "";
-  }
-
-  std::string ufragStr = ufrag;
-  RFREE(ufrag);
-
-  return ufragStr;
-}
-
-std::string
-NrIceCtx::GetNewPwd()
-{
-  char* pwd;
-  int r;
-
-  if ((r=nr_ice_get_new_ice_pwd(&pwd))) {
-    MOZ_CRASH("Unable to get new ice pwd");
-    return "";
-  }
-
-  std::string pwdStr = pwd;
-  RFREE(pwd);
-
-  return pwdStr;
-}
-
 #define MAXADDRS 100 // mirrors setting in ice_ctx.c
 
 /* static */
 nsTArray<NrIceStunAddr>
 NrIceCtx::GetStunAddrs()
 {
   nsTArray<NrIceStunAddr> addrs;
 
@@ -565,54 +584,32 @@ NrIceCtx::SetStunAddrs(const nsTArray<Nr
   nr_ice_set_local_addresses(ctx_, local_addrs, addrs.Length());
 
   delete[] local_addrs;
 }
 
 bool
 NrIceCtx::Initialize()
 {
-  std::string ufrag = GetNewUfrag();
-  std::string pwd = GetNewPwd();
-
-  return Initialize(ufrag, pwd);
-}
-
-bool
-NrIceCtx::Initialize(const std::string& ufrag,
-                     const std::string& pwd)
-{
-  MOZ_ASSERT(!ufrag.empty());
-  MOZ_ASSERT(!pwd.empty());
-  if (ufrag.empty() || pwd.empty()) {
-    return false;
-  }
-
   // Create the ICE context
   int r;
 
   UINT4 flags = NR_ICE_CTX_FLAGS_AGGRESSIVE_NOMINATION;
   switch (policy_) {
     case ICE_POLICY_RELAY:
       flags |= NR_ICE_CTX_FLAGS_RELAY_ONLY;
       break;
     case ICE_POLICY_NO_HOST:
       flags |= NR_ICE_CTX_FLAGS_HIDE_HOST_CANDIDATES;
       break;
     case ICE_POLICY_ALL:
       break;
   }
 
-  r = nr_ice_ctx_create_with_credentials(const_cast<char *>(name_.c_str()),
-                                         flags,
-                                         const_cast<char *>(ufrag.c_str()),
-                                         const_cast<char *>(pwd.c_str()),
-                                         &ctx_);
-  MOZ_ASSERT(ufrag == ctx_->ufrag);
-  MOZ_ASSERT(pwd == ctx_->pwd);
+  r = nr_ice_ctx_create(const_cast<char *>(name_.c_str()), flags, &ctx_);
 
   if (r) {
     MOZ_MTLOG(ML_ERROR, "Couldn't create ICE ctx for '" << name_ << "'");
     return false;
   }
 
   nr_interface_prioritizer *prioritizer = CreateInterfacePrioritizer();
   if (!prioritizer) {
@@ -787,39 +784,16 @@ NrIceStats NrIceCtx::Destroy() {
 
   return stats;
 }
 
 NrIceCtx::~NrIceCtx() {
   Destroy();
 }
 
-void
-NrIceCtx::SetStream(const std::string& id, NrIceMediaStream* stream) {
-  auto it = streams_.find(id);
-  if (it != streams_.end()) {
-    MOZ_ASSERT(!stream, "Transport ids should be unique, and set only once");
-    auto preexisting_stream = it->second;
-    streams_.erase(it);
-    preexisting_stream->Close();
-  }
-
-  if (stream) {
-    streams_[id] = stream;
-  }
-}
-
-std::string NrIceCtx::ufrag() const {
-  return ctx_->ufrag;
-}
-
-std::string NrIceCtx::pwd() const {
-  return ctx_->pwd;
-}
-
 void NrIceCtx::destroy_peer_ctx() {
   nr_ice_peer_ctx_destroy(&peer_);
 }
 
 nsresult NrIceCtx::SetControlling(Controlling controlling) {
   if (!ice_controlling_set_) {
     peer_->controlling = (controlling == ICE_CONTROLLING)? 1 : 0;
     ice_controlling_set_ = true;
@@ -987,17 +961,17 @@ nsresult NrIceCtx::StartGathering(bool d
         Telemetry::WEBRTC_ICE_NR_ICE_GATHER_TIME, start);
   }
 
   return NS_OK;
 }
 
 RefPtr<NrIceMediaStream> NrIceCtx::FindStream(nr_ice_media_stream *stream) {
   for (auto& idAndStream : streams_) {
-    if (idAndStream.second->stream() == stream) {
+    if (idAndStream.second->HasStream(stream)) {
       return idAndStream.second;
     }
   }
 
   return nullptr;
 }
 
 std::vector<std::string> NrIceCtx::GetGlobalAttributes() {
--- a/media/mtransport/nricectx.h
+++ b/media/mtransport/nricectx.h
@@ -63,16 +63,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 #include "mozilla/UniquePtr.h"
 #include "nsAutoPtr.h"
 #include "nsIEventTarget.h"
 #include "nsITimer.h"
 #include "nsTArray.h"
 
 #include "m_cpp_utils.h"
 #include "nricestunaddr.h"
+#include "nricemediastream.h"
 
 typedef struct nr_ice_ctx_ nr_ice_ctx;
 typedef struct nr_ice_peer_ctx_ nr_ice_peer_ctx;
 typedef struct nr_ice_media_stream_ nr_ice_media_stream;
 typedef struct nr_ice_handler_ nr_ice_handler;
 typedef struct nr_ice_handler_vtbl_ nr_ice_handler_vtbl;
 typedef struct nr_ice_candidate_ nr_ice_candidate;
 typedef struct nr_ice_cand_pair_ nr_ice_cand_pair;
@@ -199,17 +200,16 @@ class NrIceStats {
  public:
   uint16_t stun_retransmits = 0;
   uint16_t turn_401s = 0;
   uint16_t turn_403s = 0;
   uint16_t turn_438s = 0;
 };
 
 class NrIceCtx {
- friend class NrIceCtxHandler;
  public:
   enum ConnectionState { ICE_CTX_INIT,
                          ICE_CTX_CHECKING,
                          ICE_CTX_CONNECTED,
                          ICE_CTX_COMPLETED,
                          ICE_CTX_FAILED,
                          ICE_CTX_DISCONNECTED,
                          ICE_CTX_CLOSED
@@ -224,47 +224,54 @@ class NrIceCtx {
                      ICE_CONTROLLED
   };
 
   enum Policy { ICE_POLICY_RELAY,
                 ICE_POLICY_NO_HOST,
                 ICE_POLICY_ALL
   };
 
+  static RefPtr<NrIceCtx> Create(const std::string& name,
+                                 bool allow_loopback = false,
+                                 bool tcp_enabled = true,
+                                 bool allow_link_local = false,
+                                 NrIceCtx::Policy policy =
+                                   NrIceCtx::ICE_POLICY_ALL);
+
+  RefPtr<NrIceMediaStream> CreateStream(const std::string& id,
+                                        const std::string& name,
+                                        int components);
+  void DestroyStream(const std::string& id);
+
   // initialize ICE globals, crypto, and logging
   static void InitializeGlobals(bool allow_loopback = false,
                                 bool tcp_enabled = true,
                                 bool allow_link_local = false);
-  static std::string GetNewUfrag();
-  static std::string GetNewPwd();
 
   // static GetStunAddrs for use in parent process to support
   // sandboxing restrictions
   static nsTArray<NrIceStunAddr> GetStunAddrs();
   void SetStunAddrs(const nsTArray<NrIceStunAddr>& addrs);
 
   bool Initialize();
-  bool Initialize(const std::string& ufrag, const std::string& pwd);
 
   int SetNat(const RefPtr<TestNat>& aNat);
 
   // Deinitialize all ICE global state. Used only for testing.
   static void internal_DeinitializeGlobal();
 
   // Divide some timers to faster testing. Used only for testing.
   void internal_SetTimerAccelarator(int divider);
 
   nr_ice_ctx *ctx() { return ctx_; }
   nr_ice_peer_ctx *peer() { return peer_; }
 
   // Testing only.
   void destroy_peer_ctx();
 
-  void SetStream(const std::string& id, NrIceMediaStream* stream);
-
   RefPtr<NrIceMediaStream> GetStream(const std::string& id) {
     auto it = streams_.find(id);
     if (it != streams_.end()) {
       return it->second;
     }
     return nullptr;
   }
 
@@ -276,20 +283,16 @@ class NrIceCtx {
     return result;
   }
 
   bool HasStreamsToConnect() const;
 
   // The name of the ctx
   const std::string& name() const { return name_; }
 
-  // Get ufrag and password.
-  std::string ufrag() const;
-  std::string pwd() const;
-
   // Current state
   ConnectionState connection_state() const {
     return connection_state_;
   }
 
   // Current state
   GatheringState gathering_state() const {
     return gathering_state_;
deleted file mode 100644
--- a/media/mtransport/nricectxhandler.cpp
+++ /dev/null
@@ -1,188 +0,0 @@
-#include <sstream>
-
-#include "logging.h"
-
-// nICEr includes
-extern "C" {
-#include "nr_api.h"
-#include "ice_ctx.h"
-}
-
-// Local includes
-#include "nricectxhandler.h"
-#include "nricemediastream.h"
-#include "nriceresolver.h"
-
-namespace mozilla {
-
-MOZ_MTLOG_MODULE("mtransport")
-
-NrIceCtxHandler::NrIceCtxHandler(const std::string& name,
-                                 NrIceCtx::Policy policy)
-  : current_ctx(new NrIceCtx(name, policy)),
-    old_ctx(nullptr),
-    restart_count(0)
-{
-}
-
-RefPtr<NrIceCtxHandler>
-NrIceCtxHandler::Create(const std::string& name,
-                        bool allow_loopback,
-                        bool tcp_enabled,
-                        bool allow_link_local,
-                        NrIceCtx::Policy policy)
-{
-  // InitializeGlobals only executes once
-  NrIceCtx::InitializeGlobals(allow_loopback, tcp_enabled, allow_link_local);
-
-  RefPtr<NrIceCtxHandler> ctx = new NrIceCtxHandler(name, policy);
-
-  if (ctx == nullptr ||
-      ctx->current_ctx == nullptr ||
-      !ctx->current_ctx->Initialize()) {
-    return nullptr;
-  }
-
-  return ctx;
-}
-
-
-RefPtr<NrIceMediaStream>
-NrIceCtxHandler::CreateStream(const std::string& name, int components)
-{
-  // To make tracking NrIceMediaStreams easier during ICE restart
-  // prepend an int to the name that increments with each ICE restart
-  std::ostringstream os;
-  os << restart_count << "-" << name;
-  return NrIceMediaStream::Create(this->current_ctx, os.str(), components);
-}
-
-
-RefPtr<NrIceCtx>
-NrIceCtxHandler::CreateCtx() const
-{
-  return CreateCtx(NrIceCtx::GetNewUfrag(), NrIceCtx::GetNewPwd());
-}
-
-
-RefPtr<NrIceCtx>
-NrIceCtxHandler::CreateCtx(const std::string& ufrag,
-                           const std::string& pwd) const
-{
-  RefPtr<NrIceCtx> new_ctx = new NrIceCtx(this->current_ctx->name(),
-                                          this->current_ctx->policy());
-  if (new_ctx == nullptr) {
-    return nullptr;
-  }
-
-  if (!new_ctx->Initialize(ufrag, pwd)) {
-    return nullptr;
-  }
-
-  // copy the stun, and turn servers from the current context
-  int r = nr_ice_ctx_set_stun_servers(new_ctx->ctx_,
-                                      this->current_ctx->ctx_->stun_servers,
-                                      this->current_ctx->ctx_->stun_server_ct);
-  if (r) {
-    MOZ_MTLOG(ML_ERROR, "Error while setting STUN servers in CreateCtx"
-                        << " (likely ice restart related)");
-    return nullptr;
-  }
-
-  r = nr_ice_ctx_copy_turn_servers(new_ctx->ctx_,
-                                   this->current_ctx->ctx_->turn_servers,
-                                   this->current_ctx->ctx_->turn_server_ct);
-  if (r) {
-    MOZ_MTLOG(ML_ERROR, "Error while copying TURN servers in CreateCtx"
-                        << " (likely ice restart related)");
-    return nullptr;
-  }
-
-  // grab the NrIceResolver stashed in the nr_resolver and allocate another
-  // for the new ctx.  Note: there may not be an nr_resolver.
-  if (this->current_ctx->ctx_->resolver) {
-    NrIceResolver* resolver =
-      static_cast<NrIceResolver*>(this->current_ctx->ctx_->resolver->obj);
-    if (!resolver ||
-        NS_FAILED(new_ctx->SetResolver(resolver->AllocateResolver()))) {
-      MOZ_MTLOG(ML_ERROR, "Error while setting dns resolver in CreateCtx"
-                          << " (likely ice restart related)");
-      return nullptr;
-    }
-  }
-
-  return new_ctx;
-}
-
-
-bool
-NrIceCtxHandler::BeginIceRestart(RefPtr<NrIceCtx> new_ctx)
-{
-  MOZ_ASSERT(!old_ctx, "existing ice restart in progress");
-  if (old_ctx) {
-    MOZ_MTLOG(ML_ERROR, "Existing ice restart in progress");
-    return false; // ice restart already in progress
-  }
-
-  if (new_ctx == nullptr) {
-    return false;
-  }
-
-  ++restart_count;
-  old_ctx = current_ctx;
-  current_ctx = new_ctx;
-  return true;
-}
-
-
-void
-NrIceCtxHandler::FinalizeIceRestart()
-{
-  if (old_ctx) {
-    // Fixup the telemetry by transferring old stats to current ctx.
-    NrIceStats stats = old_ctx->Destroy();
-    current_ctx->AccumulateStats(stats);
-  }
-
-  // no harm calling this even if we're not in the middle of restarting
-  old_ctx = nullptr;
-}
-
-
-void
-NrIceCtxHandler::RollbackIceRestart()
-{
-  if (old_ctx == nullptr) {
-    return;
-  }
-  current_ctx = old_ctx;
-  old_ctx = nullptr;
-}
-
-NrIceStats NrIceCtxHandler::Destroy()
-{
-  NrIceStats stats;
-
-  // designed to be called more than once so if stats are desired, this can be
-  // called just prior to the destructor
-  if (old_ctx && current_ctx) {
-    stats = old_ctx->Destroy();
-    current_ctx->AccumulateStats(stats);
-  }
-
-  if (current_ctx) {
-    stats = current_ctx->Destroy();
-  }
-
-  old_ctx = nullptr;
-  current_ctx = nullptr;
-
-  return stats;
-}
-
-NrIceCtxHandler::~NrIceCtxHandler()
-{
-  Destroy();
-}
-
-} // close namespace
deleted file mode 100644
--- a/media/mtransport/nricectxhandler.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef nricectxhandler_h__
-#define nricectxhandler_h__
-
-#include "nricectx.h"
-
-namespace mozilla {
-
-class NrIceCtxHandler {
-public:
-  // TODO(ekr@rtfm.com): Too many bools here. Bug 1193437.
-  static RefPtr<NrIceCtxHandler> Create(const std::string& name,
-                                        bool allow_loopback = false,
-                                        bool tcp_enabled = true,
-                                        bool allow_link_local = false,
-                                        NrIceCtx::Policy policy =
-                                          NrIceCtx::ICE_POLICY_ALL);
-
-  RefPtr<NrIceMediaStream> CreateStream(const std::string& name,
-                                        int components);
-  // CreateCtx is necessary so we can create and initialize the context
-  // on main thread, but begin the ice restart mechanics on STS thread
-  RefPtr<NrIceCtx> CreateCtx() const; // for test
-  RefPtr<NrIceCtx> CreateCtx(const std::string& ufrag,
-                             const std::string& pwd) const;
-
-  RefPtr<NrIceCtx> ctx() { return current_ctx; }
-
-  bool BeginIceRestart(RefPtr<NrIceCtx> new_ctx);
-  bool IsRestarting() const { return (old_ctx != nullptr); }
-  void FinalizeIceRestart();
-  void RollbackIceRestart();
-
-  NrIceStats Destroy();
-
-  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(NrIceCtxHandler)
-
-private:
-  NrIceCtxHandler(const std::string& name, NrIceCtx::Policy policy);
-  NrIceCtxHandler() = delete;
-  ~NrIceCtxHandler();
-  DISALLOW_COPY_ASSIGN(NrIceCtxHandler);
-
-  RefPtr<NrIceCtx> current_ctx;
-  RefPtr<NrIceCtx> old_ctx; // for while restart is in progress
-  int restart_count; // used to differentiate streams between restarted ctx
-};
-
-} // close namespace
-
-#endif // nricectxhandler_h__
--- a/media/mtransport/nricemediastream.cpp
+++ b/media/mtransport/nricemediastream.cpp
@@ -178,84 +178,120 @@ static UniquePtr<NrIceCandidate> MakeNrI
   UniquePtr<NrIceCandidate> out(new NrIceCandidate());
 
   if (!ToNrIceCandidate(candc, out.get())) {
     return nullptr;
   }
   return out;
 }
 
-// NrIceMediaStream
-RefPtr<NrIceMediaStream>
-NrIceMediaStream::Create(NrIceCtx *ctx,
-                         const std::string& name,
-                         int components) {
-  RefPtr<NrIceMediaStream> stream =
-    new NrIceMediaStream(ctx, name, components);
-  MOZ_ASSERT(stream->ctx_ == ctx->ctx());
-
-  int r = nr_ice_add_media_stream(ctx->ctx(),
-                                  const_cast<char *>(name.c_str()),
-                                  components, &stream->stream_);
-  if (r) {
-    MOZ_MTLOG(ML_ERROR, "Couldn't create ICE media stream for '"
-              << name << "'");
-    return nullptr;
-  }
-
-  return stream;
+static bool Matches(const nr_ice_media_stream* stream,
+                    const std::string& ufrag,
+                    const std::string& pwd) {
+  return stream && (stream->ufrag == ufrag) && (stream->pwd == pwd);
 }
 
 NrIceMediaStream::NrIceMediaStream(NrIceCtx *ctx,
+                                   const std::string& id,
                                    const std::string& name,
                                    size_t components) :
       state_(ICE_CONNECTING),
       ctx_(ctx->ctx()),
       ctx_peer_(ctx->peer()),
       name_(name),
       components_(components),
       stream_(nullptr),
-      has_parsed_attrs_(false)
+      old_stream_(nullptr),
+      id_(id)
 {
 }
 
 NrIceMediaStream::~NrIceMediaStream() {
   // We do not need to destroy anything. All major resources
   // are attached to the ice ctx.
 }
 
-nsresult NrIceMediaStream::ParseAttributes(std::vector<std::string>&
-                                           attributes) {
-  if (!stream_)
-    return NS_ERROR_FAILURE;
+nsresult NrIceMediaStream::ConnectToPeer(
+    const std::string& ufrag,
+    const std::string& pwd,
+    const std::vector<std::string>& attributes) {
+  MOZ_ASSERT(stream_);
 
-  std::vector<char *> attributes_in;
-  attributes_in.reserve(attributes.size());
-  for (auto& attribute : attributes) {
-    attributes_in.push_back(const_cast<char *>(attribute.c_str()));
+  if (Matches(old_stream_, ufrag, pwd)) {
+    // Roll back to old stream, since we apparently aren't using the new one
+    // (We swap before we close so we never have stream_ == nullptr)
+    std::swap(stream_, old_stream_);
+    CloseStream(&old_stream_);
+  } else if (old_stream_) {
+    // Right now we wait for ICE to complete before closing the old stream.
+    // It might be worth it to close it sooner, but we don't want to close it
+    // right away.
+    nr_ice_media_stream_set_obsolete(old_stream_);
   }
 
-  // Still need to call nr_ice_ctx_parse_stream_attributes.
-  int r = nr_ice_peer_ctx_parse_stream_attributes(ctx_peer_,
-                                                  stream_,
-                                                  attributes_in.empty() ?
-                                                  nullptr : &attributes_in[0],
-                                                  attributes_in.size());
+  nr_ice_media_stream* peer_stream;
+  if (nr_ice_peer_ctx_find_pstream(ctx_peer_, stream_, &peer_stream)) {
+    // No peer yet
+    std::vector<char *> attributes_in;
+    attributes_in.reserve(attributes.size());
+    for (auto& attribute : attributes) {
+      MOZ_MTLOG(ML_DEBUG, "Setting " << attribute << " on stream " << name_);
+      attributes_in.push_back(const_cast<char *>(attribute.c_str()));
+    }
+
+    // Still need to call nr_ice_ctx_parse_stream_attributes.
+    int r = nr_ice_peer_ctx_parse_stream_attributes(ctx_peer_,
+                                                    stream_,
+                                                    attributes_in.empty() ?
+                                                    nullptr : &attributes_in[0],
+                                                    attributes_in.size());
+    if (r) {
+      MOZ_MTLOG(ML_ERROR, "Couldn't parse attributes for stream "
+                << name_ << "'");
+      return NS_ERROR_FAILURE;
+    }
+  }
+
+  return NS_OK;
+}
+
+nsresult NrIceMediaStream::SetIceCredentials(const std::string& ufrag,
+                                             const std::string& pwd) {
+  if (Matches(stream_, ufrag, pwd)) {
+    return NS_OK;
+  }
+
+  MOZ_MTLOG(ML_DEBUG, "Setting ICE credentials for " << name_ << " - "
+                      << ufrag << ":" << pwd);
+  CloseStream(&old_stream_);
+  old_stream_ = stream_;
+
+  std::string name(name_ + " - " + ufrag + ":" + pwd);
+
+  int r = nr_ice_add_media_stream(ctx_,
+                                  name.c_str(),
+                                  ufrag.c_str(),
+                                  pwd.c_str(),
+                                  components_, &stream_);
   if (r) {
-    MOZ_MTLOG(ML_ERROR, "Couldn't parse attributes for stream "
-              << name_ << "'");
+    MOZ_MTLOG(ML_ERROR, "Couldn't create ICE media stream for '"
+              << name_ << "': error=" << r);
+    stream_ = old_stream_;
+    old_stream_ = nullptr;
     return NS_ERROR_FAILURE;
   }
 
-  has_parsed_attrs_ = true;
+  state_ = ICE_CONNECTING;
   return NS_OK;
 }
 
 // Parse trickle ICE candidate
 nsresult NrIceMediaStream::ParseTrickleCandidate(const std::string& candidate) {
+  // TODO(bug 1490658): This needs to take ufrag into account. For now, trickle
+  // candidates will land on the most recently-created ICE stream.
   int r;
 
   MOZ_MTLOG(ML_DEBUG, "NrIceCtx(" << ctx_->label << ")/STREAM(" <<
             name() << ") : parsing trickle candidate " << candidate);
 
   r = nr_ice_peer_ctx_parse_trickle_candidate(ctx_peer_,
                                               stream_,
                                               const_cast<char *>(
@@ -458,17 +494,17 @@ nsresult NrIceMediaStream::GetDefaultCan
     MOZ_MTLOG(ML_ERROR, "Failed to convert default ICE candidate for '"
               << name_ << "'");
     return NS_ERROR_FAILURE;
   }
 
   return NS_OK;
 }
 
-std::vector<std::string> NrIceMediaStream::GetCandidates() const {
+std::vector<std::string> NrIceMediaStream::GetAttributes() const {
   char **attrs = nullptr;
   int attrct;
   int r;
   std::vector<std::string> ret;
 
   if (!stream_) {
     return ret;
   }
@@ -582,23 +618,29 @@ nsresult NrIceMediaStream::GetConsentSta
               component_id);
     return NS_ERROR_FAILURE;
   }
   *can_send = !!send;
 
   return NS_OK;
 }
 
+bool NrIceMediaStream::HasStream(nr_ice_media_stream *stream) const {
+  return (stream == stream_) || (stream == old_stream_);
+}
+
 nsresult NrIceMediaStream::SendPacket(int component_id,
                                       const unsigned char *data,
                                       size_t len) {
-  if (!stream_)
+  nr_ice_media_stream* stream = old_stream_ ? old_stream_ : stream_;
+  if (!stream) {
     return NS_ERROR_FAILURE;
+  }
 
-  int r = nr_ice_media_stream_send(ctx_peer_, stream_,
+  int r = nr_ice_media_stream_send(ctx_peer_, stream,
                                    component_id,
                                    const_cast<unsigned char *>(data), len);
   if (r) {
     MOZ_MTLOG(ML_ERROR, "Couldn't send media on '" << name_ << "'");
     if (r == R_WOULDBLOCK) {
       return NS_BASE_STREAM_WOULD_BLOCK;
     }
 
@@ -610,29 +652,48 @@ nsresult NrIceMediaStream::SendPacket(in
 
 
 void NrIceMediaStream::Ready() {
   // This function is called whenever a stream becomes ready, but it
   // gets fired multiple times when a stream gets nominated repeatedly.
   if (state_ != ICE_OPEN) {
     MOZ_MTLOG(ML_DEBUG, "Marking stream ready '" << name_ << "'");
     state_ = ICE_OPEN;
+    CloseStream(&old_stream_);
     SignalReady(this);
   }
   else {
     MOZ_MTLOG(ML_DEBUG, "Stream ready callback fired again for '" << name_ << "'");
   }
 }
 
+void NrIceMediaStream::Failed() {
+  if (state_ != ICE_CLOSED) {
+    MOZ_MTLOG(ML_DEBUG, "Marking stream failed '" << name_ << "'");
+    state_ = ICE_CLOSED;
+    // We don't need the old stream anymore.
+    CloseStream(&old_stream_);
+    SignalFailed(this);
+  }
+}
+
 void NrIceMediaStream::Close() {
   MOZ_MTLOG(ML_DEBUG, "Marking stream closed '" << name_ << "'");
   state_ = ICE_CLOSED;
 
-  if (stream_) {
-    int r = nr_ice_remove_media_stream(ctx_, &stream_);
+  CloseStream(&old_stream_);
+  CloseStream(&stream_);
+}
+
+void
+NrIceMediaStream::CloseStream(nr_ice_media_stream **stream)
+{
+  if (*stream) {
+    int r = nr_ice_remove_media_stream(ctx_, stream);
     if (r) {
       MOZ_ASSERT(false, "Failed to remove stream");
       MOZ_MTLOG(ML_ERROR, "Failed to remove stream, error=" << r);
     }
+    *stream = nullptr;
   }
 }
 
 }  // close namespace
--- a/media/mtransport/nricemediastream.h
+++ b/media/mtransport/nricemediastream.h
@@ -132,42 +132,44 @@ struct NrIceCandidatePair {
   uint64_t bytes_sent;
   uint64_t bytes_recvd;
   uint64_t ms_since_last_send;
   uint64_t ms_since_last_recv;
 };
 
 class NrIceMediaStream {
  public:
-  static RefPtr<NrIceMediaStream> Create(NrIceCtx *ctx,
-                                         const std::string& name,
-                                         int components);
+  NrIceMediaStream(NrIceCtx *ctx,
+                   const std::string& id,
+                   const std::string& name,
+                   size_t components);
+
+  nsresult SetIceCredentials(const std::string& ufrag, const std::string& pwd);
+  nsresult ConnectToPeer(const std::string& ufrag,
+                         const std::string& pwd,
+                         const std::vector<std::string>& peer_attrs);
   enum State { ICE_CONNECTING, ICE_OPEN, ICE_CLOSED};
 
   State state() const { return state_; }
 
   // The name of the stream
   const std::string& name() const { return name_; }
 
-  // Get all the candidates
-  std::vector<std::string> GetCandidates() const;
+  // Get all the ICE attributes; used for testing
+  std::vector<std::string> GetAttributes() const;
 
   nsresult GetLocalCandidates(std::vector<NrIceCandidate>* candidates) const;
   nsresult GetRemoteCandidates(std::vector<NrIceCandidate>* candidates) const;
 
   // Get all candidate pairs, whether in the check list or triggered check
   // queue, in priority order. |out_pairs| is cleared before being filled.
   nsresult GetCandidatePairs(std::vector<NrIceCandidatePair>* out_pairs) const;
 
   nsresult GetDefaultCandidate(int component, NrIceCandidate* candidate) const;
 
-  // Parse remote attributes
-  nsresult ParseAttributes(std::vector<std::string>& candidates);
-  bool HasParsedAttributes() const { return has_parsed_attrs_; }
-
   // Parse trickle ICE candidate
   nsresult ParseTrickleCandidate(const std::string& candidate);
 
   // Disable a component
   nsresult DisableComponent(int component);
 
   // Get the candidate pair currently active. It's the
   // caller's responsibility to free these.
@@ -177,63 +179,59 @@ class NrIceMediaStream {
 
   // Get the current ICE consent send status plus the timeval of the last
   // consent update time.
   nsresult GetConsentStatus(int component, bool *can_send, struct timeval *ts);
 
   // The number of components
   size_t components() const { return components_; }
 
-  // The underlying nICEr stream
-  nr_ice_media_stream *stream() { return stream_; }
+  bool HasStream(nr_ice_media_stream *stream) const;
   // Signals to indicate events. API users can (and should)
   // register for these.
 
   // Send a packet
   nsresult SendPacket(int component_id, const unsigned char *data, size_t len);
 
   // Set your state to ready. Called by the NrIceCtx;
   void Ready();
+  void Failed();
 
   // Close the stream. Called by the NrIceCtx.
   // Different from the destructor because other people
   // might be holding RefPtrs but we want those writes to fail once
   // the context has been destroyed.
   void Close();
 
   // So the receiver of SignalCandidate can determine which transport
   // the candidate belongs to.
-  void SetId(const std::string& id) { id_ = id; }
-
   const std::string& GetId() const { return id_; }
 
   sigslot::signal2<NrIceMediaStream *, const std::string& >
   SignalCandidate;  // A new ICE candidate:
 
   sigslot::signal1<NrIceMediaStream *> SignalReady;  // Candidate pair ready.
   sigslot::signal1<NrIceMediaStream *> SignalFailed;  // Candidate pair failed.
   sigslot::signal4<NrIceMediaStream *, int, const unsigned char *, int>
   SignalPacketReceived;  // Incoming packet
 
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(NrIceMediaStream)
 
  private:
-  NrIceMediaStream(NrIceCtx *ctx,
-                   const std::string& name,
-                   size_t components);
-
   ~NrIceMediaStream();
 
   DISALLOW_COPY_ASSIGN(NrIceMediaStream);
 
+  void CloseStream(nr_ice_media_stream **stream);
+
   State state_;
   nr_ice_ctx *ctx_;
   nr_ice_peer_ctx *ctx_peer_;
   const std::string name_;
   const size_t components_;
   nr_ice_media_stream *stream_;
-  std::string id_;
-  bool has_parsed_attrs_;
+  nr_ice_media_stream *old_stream_;
+  const std::string id_;
 };
 
 
 }  // close namespace
 #endif
--- a/media/mtransport/nriceresolver.h
+++ b/media/mtransport/nriceresolver.h
@@ -46,16 +46,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 
 #include <map>
 #include <string>
 #include "nspr.h"
 #include "prnetdb.h"
 #include "nsIDNSService.h"
 #include "nsIDNSListener.h"
 #include "nsICancelable.h"
+#include "nricectx.h"
 
 typedef struct nr_resolver_ nr_resolver;
 typedef struct nr_resolver_vtbl_ nr_resolver_vtbl;
 typedef struct nr_transport_addr_ nr_transport_addr;
 typedef struct nr_resolver_resource_ nr_resolver_resource;
 
 namespace mozilla {
 
--- a/media/mtransport/test/ice_unittest.cpp
+++ b/media/mtransport/test/ice_unittest.cpp
@@ -18,42 +18,44 @@
 
 #include "logging.h"
 #include "ssl.h"
 
 #include "mozilla/Preferences.h"
 #include "nsThreadUtils.h"
 #include "nsXPCOM.h"
 
-#include "nricectxhandler.h"
+extern "C" {
+#include "r_types.h"
+#include "async_wait.h"
+#include "async_timer.h"
+#include "r_data.h"
+#include "util.h"
+#include "r_time.h"
+}
+
+#include "ice_ctx.h"
+#include "ice_peer_ctx.h"
+#include "ice_media_stream.h"
+
+#include "nricectx.h"
 #include "nricemediastream.h"
 #include "nriceresolverfake.h"
 #include "nriceresolver.h"
 #include "nrinterfaceprioritizer.h"
 #include "gtest_ringbuffer_dumper.h"
 #include "rlogconnector.h"
 #include "runnable_utils.h"
 #include "stunserver.h"
 #include "nr_socket_prsock.h"
 #include "test_nr_socket.h"
 #include "ice_ctx.h"
 #include "stun_socket_filter.h"
 #include "mozilla/net/DNS.h"
 
-#include "ice_ctx.h"
-#include "ice_peer_ctx.h"
-#include "ice_media_stream.h"
-
-extern "C" {
-#include "async_timer.h"
-#include "r_data.h"
-#include "util.h"
-#include "r_time.h"
-}
-
 #define GTEST_HAS_RTTI 0
 #include "gtest/gtest.h"
 #include "gtest_utils.h"
 
 
 using namespace mozilla;
 
 static unsigned int kDefaultTimeout = 7000;
@@ -375,19 +377,19 @@ class IceTestPeer : public sigslot::has_
   // TODO(ekr@rtfm.com): Convert to flags when NrIceCtx::Create() does.
   // Bug 1193437.
   IceTestPeer(const std::string& name, MtransportTestUtils* utils,
               bool offerer,
               bool allow_loopback = false, bool enable_tcp = true,
               bool allow_link_local = false,
               NrIceCtx::Policy ice_policy = NrIceCtx::ICE_POLICY_ALL) :
       name_(name),
-      ice_ctx_(NrIceCtxHandler::Create(name, allow_loopback,
-                                       enable_tcp, allow_link_local,
-                                       ice_policy)),
+      ice_ctx_(NrIceCtx::Create(name, allow_loopback,
+                                enable_tcp, allow_link_local,
+                                ice_policy)),
       offerer_(offerer),
       candidates_(),
       stream_counter_(0),
       shutting_down_(false),
       gathering_complete_(false),
       ready_ct_(0),
       ice_connected_(false),
       ice_failed_(false),
@@ -400,26 +402,26 @@ class IceTestPeer : public sigslot::has_
       candidate_filter_(nullptr),
       expected_local_type_(NrIceCandidate::ICE_HOST),
       expected_local_transport_(kNrIceTransportUdp),
       expected_remote_type_(NrIceCandidate::ICE_HOST),
       trickle_mode_(TRICKLE_NONE),
       simulate_ice_lite_(false),
       nat_(new TestNat),
       test_utils_(utils) {
-    ice_ctx_->ctx()->SignalGatheringStateChange.connect(
+    ice_ctx_->SignalGatheringStateChange.connect(
         this,
         &IceTestPeer::GatheringStateChange);
-    ice_ctx_->ctx()->SignalConnectionStateChange.connect(
+    ice_ctx_->SignalConnectionStateChange.connect(
         this,
         &IceTestPeer::ConnectionStateChange);
 
     consent_timestamp_.tv_sec = 0;
     consent_timestamp_.tv_usec = 0;
-    int r = ice_ctx_->ctx()->SetNat(nat_);
+    int r = ice_ctx_->SetNat(nat_);
     (void)r;
     MOZ_ASSERT(!r);
   }
 
   ~IceTestPeer() {
     test_utils_->sts_target()->Dispatch(WrapRunnable(this,
                                                     &IceTestPeer::Shutdown),
         NS_DISPATCH_SYNC);
@@ -430,49 +432,64 @@ class IceTestPeer : public sigslot::has_
   }
 
   std::string MakeTransportId(size_t index) const {
     char id[100];
     snprintf(id, sizeof(id), "%s:stream%d", name_.c_str(), (int)index);
     return id;
   }
 
+  void SetIceCredentials_s(NrIceMediaStream &stream) {
+    static size_t counter = 0;
+    std::ostringstream prefix;
+    prefix << name_ << "-" << counter++;
+    std::string ufrag = prefix.str() + "-ufrag";
+    std::string pwd = prefix.str() + "-pwd";
+    if (mIceCredentials.count(stream.GetId())) {
+      mOldIceCredentials[stream.GetId()] = mIceCredentials[stream.GetId()];
+    }
+    mIceCredentials[stream.GetId()] = std::make_pair(ufrag, pwd);
+    stream.SetIceCredentials(ufrag, pwd);
+  }
+
   void AddStream_s(int components) {
     std::string id = MakeTransportId(stream_counter_++);
 
-    RefPtr<NrIceMediaStream> stream = ice_ctx_->CreateStream(id, components);
-    ice_ctx_->ctx()->SetStream(id, stream);
+    RefPtr<NrIceMediaStream> stream =
+      ice_ctx_->CreateStream(id, id, components);
 
     ASSERT_TRUE(stream);
+    SetIceCredentials_s(*stream);
+
     stream->SignalCandidate.connect(this, &IceTestPeer::CandidateInitialized);
     stream->SignalReady.connect(this, &IceTestPeer::StreamReady);
     stream->SignalFailed.connect(this, &IceTestPeer::StreamFailed);
     stream->SignalPacketReceived.connect(this, &IceTestPeer::PacketReceived);
   }
 
   void AddStream(int components)
   {
     test_utils_->sts_target()->Dispatch(
         WrapRunnable(this, &IceTestPeer::AddStream_s, components),
         NS_DISPATCH_SYNC);
   }
 
   void RemoveStream_s(size_t index) {
-    ice_ctx_->ctx()->SetStream(MakeTransportId(index), nullptr);
+    ice_ctx_->DestroyStream(MakeTransportId(index));
   }
 
   void RemoveStream(size_t index) {
     test_utils_->sts_target()->Dispatch(
         WrapRunnable(this, &IceTestPeer::RemoveStream_s, index),
         NS_DISPATCH_SYNC);
   }
 
   RefPtr<NrIceMediaStream> GetStream_s(size_t index) {
     std::string id = MakeTransportId(index);
-    return ice_ctx_->ctx()->GetStream(id);
+    return ice_ctx_->GetStream(id);
   }
 
   void SetStunServer(const std::string addr, uint16_t port,
                      const char* transport = kNrIceTransportUdp) {
     if (addr.empty()) {
       // Happens when MOZ_DISABLE_NONLOCAL_CONNECTIONS is set
       return;
     }
@@ -480,17 +497,17 @@ class IceTestPeer : public sigslot::has_
     std::vector<NrIceStunServer> stun_servers;
     UniquePtr<NrIceStunServer> server(NrIceStunServer::Create(
         addr, port, transport));
     stun_servers.push_back(*server);
     SetStunServers(stun_servers);
   }
 
   void SetStunServers(const std::vector<NrIceStunServer> &servers) {
-    ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetStunServers(servers)));
+    ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->SetStunServers(servers)));
   }
 
   void UseTestStunServer() {
     SetStunServer(TestStunServer::GetInstance(AF_INET)->addr(),
                   TestStunServer::GetInstance(AF_INET)->port());
   }
 
   void SetTurnServer(const std::string addr, uint16_t port,
@@ -505,63 +522,63 @@ class IceTestPeer : public sigslot::has_
   void SetTurnServer(const std::string addr, uint16_t port,
                      const std::string username,
                      const std::vector<unsigned char> password,
                      const char* transport) {
     std::vector<NrIceTurnServer> turn_servers;
     UniquePtr<NrIceTurnServer> server(NrIceTurnServer::Create(
         addr, port, username, password, transport));
     turn_servers.push_back(*server);
-    ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetTurnServers(turn_servers)));
+    ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->SetTurnServers(turn_servers)));
   }
 
   void SetTurnServers(const std::vector<NrIceTurnServer> servers) {
-    ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetTurnServers(servers)));
+    ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->SetTurnServers(servers)));
   }
 
   void SetFakeResolver(const std::string& ip,
                        const std::string& fqdn) {
     ASSERT_TRUE(NS_SUCCEEDED(dns_resolver_->Init()));
     if (!ip.empty() && !fqdn.empty()) {
       PRNetAddr addr;
       PRStatus status = PR_StringToNetAddr(ip.c_str(), &addr);
       addr.inet.port = kDefaultStunServerPort;
       ASSERT_EQ(PR_SUCCESS, status);
       fake_resolver_.SetAddr(fqdn, addr);
     }
-    ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetResolver(
+    ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->SetResolver(
         fake_resolver_.AllocateResolver())));
   }
 
   void SetDNSResolver() {
     ASSERT_TRUE(NS_SUCCEEDED(dns_resolver_->Init()));
-    ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetResolver(
+    ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->SetResolver(
         dns_resolver_->AllocateResolver())));
   }
 
   void Gather(bool default_route_only = false) {
     nsresult res;
 
     test_utils_->sts_target()->Dispatch(
         WrapRunnableRet(&res,
-                        ice_ctx_->ctx(),
+                        ice_ctx_,
                         &NrIceCtx::StartGathering,
                         default_route_only,
                         false),
         NS_DISPATCH_SYNC);
 
     ASSERT_TRUE(NS_SUCCEEDED(res));
   }
 
   void UseNat() {
     nat_->enabled_ = true;
   }
 
   void SetTimerDivider(int div) {
-    ice_ctx_->ctx()->internal_SetTimerAccelarator(div);
+    ice_ctx_->internal_SetTimerAccelarator(div);
   }
 
   void SetStunResponseDelay(uint32_t delay) {
     nat_->delay_stun_resp_ms_ = delay;
   }
 
   void SetFilteringType(TestNat::NatBehavior type) {
     MOZ_ASSERT(!nat_->has_port_mappings());
@@ -579,83 +596,87 @@ class IceTestPeer : public sigslot::has_
   }
 
   void SetBlockStun(bool block) {
     nat_->block_stun_ = block;
   }
 
   // Get various pieces of state
   std::vector<std::string> GetGlobalAttributes() {
-    std::vector<std::string> attrs(ice_ctx_->ctx()->GetGlobalAttributes());
+    std::vector<std::string> attrs(ice_ctx_->GetGlobalAttributes());
     if (simulate_ice_lite_) {
       attrs.push_back("ice-lite");
     }
     return attrs;
   }
 
-  std::vector<std::string> GetCandidates(size_t stream) {
+  std::vector<std::string> GetAttributes(size_t stream) {
     std::vector<std::string> v;
 
     RUN_ON_THREAD(
         test_utils_->sts_target(),
-        WrapRunnableRet(&v, this, &IceTestPeer::GetCandidates_s, stream));
+        WrapRunnableRet(&v, this, &IceTestPeer::GetAttributes_s, stream));
 
     return v;
   }
 
   std::string FilterCandidate(const std::string& candidate) {
     if (candidate_filter_) {
       return candidate_filter_(candidate);
     }
     return candidate;
   }
 
-  std::vector<std::string> GetCandidates_s(size_t index) {
-    std::vector<std::string> candidates;
+  std::vector<std::string> GetAttributes_s(size_t index) {
+    std::vector<std::string> attributes;
 
     auto stream = GetStream_s(index);
     if (!stream) {
       EXPECT_TRUE(false) << "No such stream " << index;
-      return candidates;
+      return attributes;
     }
 
-    std::vector<std::string> candidates_in = stream->GetCandidates();
-
-    for (const auto& a_candidate : candidates_in) {
-      std::string candidate(FilterCandidate(a_candidate));
-      if (!candidate.empty()) {
-        std::cerr << name_ << " Returning candidate: "
-                           << candidate << std::endl;
-        candidates.push_back(candidate);
+    std::vector<std::string> attributes_in = stream->GetAttributes();
+
+    for (const auto& attribute : attributes_in) {
+      if (attribute.find("candidate:") != std::string::npos) {
+        std::string candidate(FilterCandidate(attribute));
+        if (!candidate.empty()) {
+          std::cerr << name_ << " Returning candidate: "
+                             << candidate << std::endl;
+          attributes.push_back(candidate);
+        }
+      } else {
+        attributes.push_back(attribute);
       }
     }
 
-    return candidates;
+    return attributes;
   }
 
   void SetExpectedTypes(NrIceCandidate::Type local,
                         NrIceCandidate::Type remote,
                         std::string local_transport = kNrIceTransportUdp) {
     expected_local_type_ = local;
     expected_local_transport_ = local_transport;
     expected_remote_type_ = remote;
   }
 
   void SetExpectedRemoteCandidateAddr(const std::string& addr) {
     expected_remote_addr_ = addr;
   }
 
   int GetCandidatesPrivateIpv4Range(size_t stream) {
-    std::vector<std::string> candidates = GetCandidates(stream);
+    std::vector<std::string> attributes = GetAttributes(stream);
 
     int host_net = 0;
-    for (const auto& c : candidates) {
-      if (c.find("typ host") != std::string::npos) {
+    for (const auto& a : attributes) {
+      if (a.find("typ host") != std::string::npos) {
         nr_transport_addr addr;
-        std::vector<std::string> tokens = split(c, ' ');
+        std::vector<std::string> tokens = split(a, ' ');
         int r = nr_str_port_to_transport_addr(tokens.at(4).c_str(), 0, IPPROTO_UDP, &addr);
         MOZ_ASSERT(!r);
         if (!r && (addr.ip_version == NR_IPV4)) {
           int n = nr_transport_addr_get_private_addr_range(&addr);
           if (n) {
             if (host_net) {
               // TODO: add support for multiple private interfaces
               std::cerr << "This test doesn't support multiple private interfaces";
@@ -692,117 +713,92 @@ class IceTestPeer : public sigslot::has_
   bool ice_reached_checking() { return ice_reached_checking_; }
   size_t received() { return received_; }
   size_t sent() { return sent_; }
 
 
   void RestartIce() {
     test_utils_->sts_target()->Dispatch(
         WrapRunnable(this,
-                     &IceTestPeer::RestartIce_s,
-                     ice_ctx_->CreateCtx()),
+                     &IceTestPeer::RestartIce_s),
         NS_DISPATCH_SYNC);
   }
 
 
-  void RestartIce_s(RefPtr<NrIceCtx> new_ctx) {
-    ice_ctx_->BeginIceRestart(new_ctx);
-
-    // set signals for the newly restarted ctx
-    ice_ctx_->ctx()->SignalGatheringStateChange.connect(
-        this,
-        &IceTestPeer::GatheringStateChange);
-    ice_ctx_->ctx()->SignalConnectionStateChange.connect(
-        this,
-        &IceTestPeer::ConnectionStateChange);
-
+  void RestartIce_s() {
+    for (auto& stream : ice_ctx_->GetStreams()) {
+      SetIceCredentials_s(*stream);
+    }
     // take care of some local bookkeeping
     ready_ct_ = 0;
     gathering_complete_ = false;
     ice_connected_ = false;
     ice_failed_ = false;
     ice_reached_checking_ = false;
     remote_ = nullptr;
-    stream_counter_ = 0;
-  }
-
-
-  void FinalizeIceRestart() {
-    test_utils_->sts_target()->Dispatch(
-        WrapRunnable(this, &IceTestPeer::FinalizeIceRestart_s),
-        NS_DISPATCH_SYNC);
-  }
-
-
-  void FinalizeIceRestart_s() {
-    ice_ctx_->FinalizeIceRestart();
   }
 
 
   void RollbackIceRestart() {
     test_utils_->sts_target()->Dispatch(
         WrapRunnable(this, &IceTestPeer::RollbackIceRestart_s),
         NS_DISPATCH_SYNC);
   }
 
 
   void RollbackIceRestart_s() {
-    ice_ctx_->RollbackIceRestart();
+    for (auto& stream : ice_ctx_->GetStreams()) {
+      mIceCredentials[stream->GetId()] = mOldIceCredentials[stream->GetId()];
+    }
   }
 
 
   // Start connecting to another peer
   void Connect_s(IceTestPeer *remote, TrickleMode trickle_mode,
                  bool start = true) {
     nsresult res;
 
     remote_ = remote;
 
     trickle_mode_ = trickle_mode;
     ice_connected_ = false;
     ice_failed_ = false;
     ice_reached_checking_ = false;
-    res = ice_ctx_->ctx()->ParseGlobalAttributes(remote->GetGlobalAttributes());
+    res = ice_ctx_->ParseGlobalAttributes(remote->GetGlobalAttributes());
     ASSERT_TRUE(NS_SUCCEEDED(res));
 
-    if (trickle_mode == TRICKLE_NONE ||
-        trickle_mode == TRICKLE_REAL) {
-      for (size_t i=0; i<stream_counter_; ++i) {
-        auto aStream = GetStream_s(i);
-        if (!aStream || aStream->HasParsedAttributes()) {
-          continue;
+    for (size_t i=0; i<stream_counter_; ++i) {
+      auto aStream = GetStream_s(i);
+      if (aStream) {
+        std::vector<std::string> attributes = remote->GetAttributes(i);
+
+        for (auto it = attributes.begin(); it != attributes.end();) {
+          if (trickle_mode == TRICKLE_SIMULATE &&
+              it->find("candidate:") != std::string::npos) {
+            std::cerr << name_ << " Deferring remote candidate: " << *it
+                      << std::endl;
+            attributes.erase(it);
+          } else {
+            std::cerr << name_ << " Adding remote attribute: " + *it
+                      << std::endl;
+            ++it;
+          }
         }
-        std::vector<std::string> candidates =
-            remote->GetCandidates(i);
-
-        for (const auto& candidate : candidates) {
-          std::cerr << name_ << " Adding remote candidate: " + candidate << std::endl;
-        }
-        res = aStream->ParseAttributes(candidates);
-        ASSERT_TRUE(NS_SUCCEEDED(res));
-      }
-    } else {
-      // Parse empty attributes and then trickle them out later
-      for (size_t i=0; i<stream_counter_; ++i) {
-        auto aStream = GetStream_s(i);
-        if (!aStream || aStream->HasParsedAttributes()) {
-          continue;
-        }
-        std::vector<std::string> empty_attrs;
-        std::cout << "Calling ParseAttributes on stream " << i << std::endl;
-        res = aStream->ParseAttributes(empty_attrs);
+        auto credentials = mIceCredentials[aStream->GetId()];
+        res = aStream->ConnectToPeer(
+            credentials.first, credentials.second, attributes);
         ASSERT_TRUE(NS_SUCCEEDED(res));
       }
     }
 
     if (start) {
-      ice_ctx_->ctx()->SetControlling(
+      ice_ctx_->SetControlling(
           offerer_ ? NrIceCtx::ICE_CONTROLLING : NrIceCtx::ICE_CONTROLLED);
       // Now start checks
-      res = ice_ctx_->ctx()->StartChecks(offerer_);
+      res = ice_ctx_->StartChecks(offerer_);
       ASSERT_TRUE(NS_SUCCEEDED(res));
     }
   }
 
   void Connect(IceTestPeer *remote, TrickleMode trickle_mode,
                bool start = true) {
     test_utils_->sts_target()->Dispatch(
         WrapRunnable(
@@ -824,23 +820,24 @@ class IceTestPeer : public sigslot::has_
   }
 
   // Allows test case to completely control when/if candidates are trickled
   // (test could also do things like insert extra trickle candidates, or
   // change existing ones, or insert duplicates, really anything is fair game)
   std::vector<SchedulableTrickleCandidate*>& ControlTrickle(size_t stream) {
     std::cerr << "Doing controlled trickle for stream " << stream << std::endl;
 
-    std::vector<std::string> candidates =
-      remote_->GetCandidates(stream);
-
-    for (const auto& candidate : candidates) {
-      controlled_trickle_candidates_[stream].push_back(
-          new SchedulableTrickleCandidate(
-              this, stream, candidate, test_utils_));
+    std::vector<std::string> attributes = remote_->GetAttributes(stream);
+
+    for (const auto& attribute : attributes) {
+      if (attribute.find("candidate:") != std::string::npos) {
+        controlled_trickle_candidates_[stream].push_back(
+            new SchedulableTrickleCandidate(
+                this, stream, attribute, test_utils_));
+      }
     }
 
     return controlled_trickle_candidates_[stream];
   }
 
   nsresult TrickleCandidate_s(const std::string &candidate, size_t index) {
     auto stream = GetStream_s(index);
     if (!stream) {
@@ -914,17 +911,17 @@ class IceTestPeer : public sigslot::has_
               << tcp_type
               << " codeword="
               << cand.codeword
               << std::endl;
   }
 
   void DumpAndCheckActiveCandidates_s() {
     std::cerr << name_ << " Active candidates:" << std::endl;
-    for (const auto& stream : ice_ctx_->ctx()->GetStreams()) {
+    for (const auto& stream : ice_ctx_->GetStreams()) {
       for (size_t j=0; j < stream->components(); ++j) {
         std::cerr << name_ << " Stream " << stream->GetId()
                            << " component " << j+1 << std::endl;
 
         UniquePtr<NrIceCandidate> local;
         UniquePtr<NrIceCandidate> remote;
 
         nsresult res = stream->GetActivePair(j+1, &local, &remote);
@@ -964,17 +961,17 @@ class IceTestPeer : public sigslot::has_
   void DumpAndCheckActiveCandidates() {
     test_utils_->sts_target()->Dispatch(
       WrapRunnable(this, &IceTestPeer::DumpAndCheckActiveCandidates_s),
       NS_DISPATCH_SYNC);
   }
 
   void Close() {
     test_utils_->sts_target()->Dispatch(
-      WrapRunnable(ice_ctx_->ctx(), &NrIceCtx::destroy_peer_ctx),
+      WrapRunnable(ice_ctx_, &NrIceCtx::destroy_peer_ctx),
       NS_DISPATCH_SYNC);
   }
 
   void Shutdown() {
     std::cerr << name_ << " Shutdown" << std::endl;
     shutting_down_ = true;
     for (auto& controlled_trickle_candidate : controlled_trickle_candidates_) {
       for (auto& cand : controlled_trickle_candidate.second) {
@@ -994,23 +991,23 @@ class IceTestPeer : public sigslot::has_
   {
     remote_ = nullptr;
   }
 
   void StartChecks() {
     nsresult res;
 
     test_utils_->sts_target()->Dispatch(
-        WrapRunnableRet(&res, ice_ctx_->ctx(), &NrIceCtx::SetControlling,
+        WrapRunnableRet(&res, ice_ctx_, &NrIceCtx::SetControlling,
                         offerer_ ?
                           NrIceCtx::ICE_CONTROLLING : NrIceCtx::ICE_CONTROLLED),
         NS_DISPATCH_SYNC);
     // Now start checks
     test_utils_->sts_target()->Dispatch(
-        WrapRunnableRet(&res, ice_ctx_->ctx(), &NrIceCtx::StartChecks,
+        WrapRunnableRet(&res, ice_ctx_, &NrIceCtx::StartChecks,
                         offerer_),
         NS_DISPATCH_SYNC);
     ASSERT_TRUE(NS_SUCCEEDED(res));
   }
 
   // Handle events
   void GatheringStateChange(NrIceCtx* ctx,
                             NrIceCtx::GatheringState state) {
@@ -1019,24 +1016,24 @@ class IceTestPeer : public sigslot::has_
     }
     if (state != NrIceCtx::ICE_CTX_GATHER_COMPLETE) {
       return;
     }
 
     std::cerr << name_ << " Gathering complete" << std::endl;
     gathering_complete_ = true;
 
-    std::cerr << name_ << " CANDIDATES:" << std::endl;
-    for (const auto& stream : ice_ctx_->ctx()->GetStreams()) {
+    std::cerr << name_ << " ATTRIBUTES:" << std::endl;
+    for (const auto& stream : ice_ctx_->GetStreams()) {
       std::cerr << "Stream " << stream->GetId() << std::endl;
 
-      std::vector<std::string> candidates = stream->GetCandidates();
-
-      for(const auto& candidate : candidates) {
-        std::cerr << candidate << std::endl;
+      std::vector<std::string> attributes = stream->GetAttributes();
+
+      for(const auto& attribute : attributes) {
+        std::cerr << attribute << std::endl;
       }
     }
     std::cerr << std::endl;
 
   }
 
   void CandidateInitialized(NrIceMediaStream *stream, const std::string &raw_candidate) {
     std::string candidate(FilterCandidate(raw_candidate));
@@ -1111,17 +1108,17 @@ class IceTestPeer : public sigslot::has_
     for (auto& pair : pairs) {
       DumpCandidatePair(pair);
     }
     std::cerr << "]" << std::endl;
   }
 
   void DumpCandidatePairs_s() {
     std::cerr << "Dumping candidate pairs for all streams [" << std::endl;
-    for (const auto& stream : ice_ctx_->ctx()->GetStreams()) {
+    for (const auto& stream : ice_ctx_->GetStreams()) {
       DumpCandidatePairs_s(stream.get());
     }
     std::cerr << "]" << std::endl;
   }
 
   bool CandidatePairsPriorityDescending(const std::vector<NrIceCandidatePair>&
                                         pairs) {
     // Verify that priority is descending
@@ -1276,21 +1273,17 @@ class IceTestPeer : public sigslot::has_
 
   void SetCandidateFilter(CandidateFilter filter) {
     candidate_filter_ = filter;
   }
 
   void ParseCandidate_s(size_t i, const std::string& candidate) {
     auto media_stream = GetStream_s(i);
     ASSERT_TRUE(media_stream.get()) << "No such stream " << i;
-
-    std::vector<std::string> attributes;
-
-    attributes.push_back(candidate);
-    media_stream->ParseAttributes(attributes);
+    media_stream->ParseTrickleCandidate(candidate);
   }
 
   void ParseCandidate(size_t i, const std::string& candidate)
   {
     test_utils_->sts_target()->Dispatch(
         WrapRunnable(this,
                         &IceTestPeer::ParseCandidate_s,
                         i,
@@ -1350,17 +1343,17 @@ class IceTestPeer : public sigslot::has_
                         &IceTestPeer::AssertConsentRefresh_s,
                         0,
                         1,
                         status),
         NS_DISPATCH_SYNC);
   }
 
   void ChangeNetworkState_s(bool online) {
-    ice_ctx_->ctx()->UpdateNetworkState(online);
+    ice_ctx_->UpdateNetworkState(online);
   }
 
   void ChangeNetworkStateToOffline() {
     test_utils_->sts_target()->Dispatch(
         WrapRunnable(this,
                         &IceTestPeer::ChangeNetworkState_s,
                         false),
         NS_DISPATCH_SYNC);
@@ -1372,37 +1365,37 @@ class IceTestPeer : public sigslot::has_
                         &IceTestPeer::ChangeNetworkState_s,
                         true),
         NS_DISPATCH_SYNC);
   }
 
   void SetControlling(NrIceCtx::Controlling controlling) {
     nsresult res;
     test_utils_->sts_target()->Dispatch(
-        WrapRunnableRet(&res, ice_ctx_->ctx(),
+        WrapRunnableRet(&res, ice_ctx_,
                         &NrIceCtx::SetControlling,
                         controlling),
         NS_DISPATCH_SYNC);
     ASSERT_TRUE(NS_SUCCEEDED(res));
   }
 
   NrIceCtx::Controlling GetControlling() {
-    return ice_ctx_->ctx()->GetControlling();
+    return ice_ctx_->GetControlling();
   }
 
   void SetTiebreaker(uint64_t tiebreaker) {
     test_utils_->sts_target()->Dispatch(
         WrapRunnable(this,
                      &IceTestPeer::SetTiebreaker_s,
                      tiebreaker),
         NS_DISPATCH_SYNC);
   }
 
   void SetTiebreaker_s(uint64_t tiebreaker) {
-    ice_ctx_->ctx()->peer()->tiebreaker = tiebreaker;
+    ice_ctx_->peer()->tiebreaker = tiebreaker;
   }
 
   void SimulateIceLite() {
     simulate_ice_lite_ = true;
     SetControlling(NrIceCtx::ICE_CONTROLLED);
   }
 
   nsresult GetDefaultCandidate(unsigned int stream, NrIceCandidate* cand) {
@@ -1418,22 +1411,24 @@ class IceTestPeer : public sigslot::has_
   }
 
   nsresult GetDefaultCandidate_s(unsigned int index, NrIceCandidate* cand) {
     return GetStream_s(index)->GetDefaultCandidate(1, cand);
   }
 
  private:
   std::string name_;
-  RefPtr<NrIceCtxHandler> ice_ctx_;
+  RefPtr<NrIceCtx> ice_ctx_;
   bool offerer_;
   std::map<std::string, std::vector<std::string> > candidates_;
   // Maps from stream id to list of remote trickle candidates
   std::map<size_t, std::vector<SchedulableTrickleCandidate*> >
     controlled_trickle_candidates_;
+  std::map<std::string, std::pair<std::string, std::string>> mIceCredentials;
+  std::map<std::string, std::pair<std::string, std::string>> mOldIceCredentials;
   size_t stream_counter_;
   bool shutting_down_;
   bool gathering_complete_;
   int ready_ct_;
   bool ice_connected_;
   bool ice_failed_;
   bool ice_reached_checking_;
   size_t received_;
@@ -1593,36 +1588,36 @@ class WebRtcIceGatherTest : public StunT
                          TestStunServer::GetInstance(AF_INET)->port());
   }
 
   // NB: Only does substring matching, watch out for stuff like "1.2.3.4"
   // matching "21.2.3.47". " 1.2.3.4 " should not have false positives.
   bool StreamHasMatchingCandidate(unsigned int stream,
                                   const std::string& match,
                                   const std::string& match2 = "") {
-    std::vector<std::string> candidates = peer_->GetCandidates(stream);
-    for (auto& candidate : candidates) {
-      if (std::string::npos != candidate.find(match)) {
+    std::vector<std::string> attributes = peer_->GetAttributes(stream);
+    for (auto& attribute : attributes) {
+      if (std::string::npos != attribute.find(match)) {
         if (!match2.length() ||
-            std::string::npos != candidate.find(match2)) {
+            std::string::npos != attribute.find(match2)) {
           return true;
         }
       }
     }
     return false;
   }
 
-  void DumpCandidates(unsigned int stream) {
-    std::vector<std::string> candidates = peer_->GetCandidates(stream);
-
-    std::cerr << "Candidates for stream " << stream << "->"
-              << candidates.size() << std::endl;
-
-    for (const auto& c : candidates) {
-      std::cerr << "Candidate: " << c << std::endl;
+  void DumpAttributes(unsigned int stream) {
+    std::vector<std::string> attributes = peer_->GetAttributes(stream);
+
+    std::cerr << "Attributes for stream " << stream << "->"
+              << attributes.size() << std::endl;
+
+    for (const auto& a : attributes) {
+      std::cerr << "Attribute: " << a << std::endl;
     }
   }
 
  protected:
   mozilla::UniquePtr<IceTestPeer> peer_;
 };
 
 class WebRtcIceConnectTest : public StunTest {
@@ -1807,41 +1802,44 @@ class WebRtcIceConnectTest : public Stun
       p2_->SetCandidateFilter(filter);
     }
   }
 
   void Connect() {
     ConnectCallerAndCallee(p1_.get(), p2_.get());
   }
 
-  void ConnectCallerAndCallee(IceTestPeer* caller, IceTestPeer* callee) {
+  void ConnectCallerAndCallee(IceTestPeer* caller,
+                              IceTestPeer* callee,
+                              TrickleMode mode = TRICKLE_NONE) {
     ASSERT_TRUE(caller->ready_ct() == 0);
     ASSERT_TRUE(caller->ice_connected() == 0);
     ASSERT_TRUE(caller->ice_reached_checking() == 0);
     ASSERT_TRUE(callee->ready_ct() == 0);
     ASSERT_TRUE(callee->ice_connected() == 0);
     ASSERT_TRUE(callee->ice_reached_checking() == 0);
 
     // IceTestPeer::Connect grabs attributes from the first arg, and
     // gives them to |this|, meaning that callee->Connect(caller, ...)
     // simulates caller sending an offer to callee. Order matters here
     // because it determines which peer is controlling.
-    callee->Connect(caller, TRICKLE_NONE);
-    caller->Connect(callee, TRICKLE_NONE);
-
-    ASSERT_TRUE_WAIT(caller->ready_ct() == 1 && callee->ready_ct() == 1,
-                     kDefaultTimeout);
-    ASSERT_TRUE_WAIT(caller->ice_connected() && callee->ice_connected(),
-                     kDefaultTimeout);
-
-    ASSERT_TRUE(caller->ice_reached_checking());
-    ASSERT_TRUE(callee->ice_reached_checking());
-
-    caller->DumpAndCheckActiveCandidates();
-    callee->DumpAndCheckActiveCandidates();
+    callee->Connect(caller, mode);
+    caller->Connect(callee, mode);
+
+    if (mode != TRICKLE_SIMULATE) {
+      ASSERT_TRUE_WAIT(caller->ready_ct() == 1 && callee->ready_ct() == 1,
+                       kDefaultTimeout);
+      ASSERT_TRUE_WAIT(caller->ice_connected() && callee->ice_connected(),
+                       kDefaultTimeout);
+      ASSERT_TRUE(caller->ice_reached_checking());
+      ASSERT_TRUE(callee->ice_reached_checking());
+
+      caller->DumpAndCheckActiveCandidates();
+      callee->DumpAndCheckActiveCandidates();
+    }
   }
 
   void SetExpectedTypes(NrIceCandidate::Type local, NrIceCandidate::Type remote,
                         std::string transport = kNrIceTransportUdp) {
     p1_->SetExpectedTypes(local, remote, transport);
     p2_->SetExpectedTypes(local, remote, transport);
   }
 
@@ -1936,25 +1934,28 @@ class WebRtcIceConnectTest : public Stun
   }
 
   void SendReceive(IceTestPeer *p1, IceTestPeer *p2,
                    bool expect_tx_failure = false,
                    bool expect_rx_failure = false) {
     size_t previousSent = p1->sent();
     size_t previousReceived = p2->received();
 
-    test_utils_->sts_target()->Dispatch(
-        WrapRunnable(p1,
-                     &IceTestPeer::SendPacket, 0, 1,
-                     reinterpret_cast<const unsigned char *>("TEST"), 4),
-        NS_DISPATCH_SYNC);
 
     if (expect_tx_failure) {
+      test_utils_->sts_target()->Dispatch(
+          WrapRunnable(p1, &IceTestPeer::SendFailure, 0, 1),
+          NS_DISPATCH_SYNC);
       ASSERT_EQ(previousSent, p1->sent());
     } else {
+      test_utils_->sts_target()->Dispatch(
+          WrapRunnable(p1,
+                       &IceTestPeer::SendPacket, 0, 1,
+                       reinterpret_cast<const unsigned char *>("TEST"), 4),
+          NS_DISPATCH_SYNC);
       ASSERT_EQ(previousSent+1, p1->sent());
     }
     if (expect_rx_failure) {
       usleep(1000);
       ASSERT_EQ(previousReceived, p2->received());
     } else {
       ASSERT_TRUE_WAIT(p2->received() == previousReceived+1, 1000);
     }
@@ -2031,17 +2032,17 @@ class WebRtcIcePacketFilterTest : public
  public:
   WebRtcIcePacketFilterTest(): udp_filter_(nullptr),
                                tcp_filter_(nullptr) {}
 
   void SetUp() {
     StunTest::SetUp();
 
     // Set up enough of the ICE ctx to allow the packet filter to work
-    ice_ctx_ = NrIceCtxHandler::Create("test", true);
+    ice_ctx_ = NrIceCtx::Create("test", true);
 
     nsCOMPtr<nsISocketFilterHandler> udp_handler =
       do_GetService(NS_STUN_UDP_SOCKET_FILTER_HANDLER_CONTRACTID);
     ASSERT_TRUE(udp_handler);
     udp_handler->NewFilter(getter_AddRefs(udp_filter_));
 
     nsCOMPtr<nsISocketFilterHandler> tcp_handler =
       do_GetService(NS_STUN_TCP_SOCKET_FILTER_HANDLER_CONTRACTID);
@@ -2143,17 +2144,17 @@ class WebRtcIcePacketFilterTest : public
                    uint8_t last_digit, uint16_t port) {
     net_addr->inet.family = AF_INET;
     net_addr->inet.ip = 192 << 24 | 168 << 16 | 1 << 8 | last_digit;
     net_addr->inet.port = port;
   }
 
   nsCOMPtr<nsISocketFilter> udp_filter_;
   nsCOMPtr<nsISocketFilter> tcp_filter_;
-  RefPtr<NrIceCtxHandler> ice_ctx_;
+  RefPtr<NrIceCtx> ice_ctx_;
 };
 }  // end namespace
 
 TEST_F(WebRtcIceGatherTest, TestGatherFakeStunServerHostnameNoResolver) {
   if (stun_server_hostname_.empty()) {
     return;
   }
 
@@ -2358,22 +2359,23 @@ TEST_F(WebRtcIceGatherTest, TestGatherDi
     return;
   }
 
   EnsurePeer();
   peer_->SetStunServer(stun_server_hostname_, kDefaultStunServerPort);
   peer_->AddStream(2);
   peer_->DisableComponent(1, 2);
   Gather();
-  std::vector<std::string> candidates =
-    peer_->GetCandidates(1);
-
-  for (auto& candidate : candidates) {
-    size_t sp1 = candidate.find(' ');
-    ASSERT_EQ(0, candidate.compare(sp1+1, 1, "1", 1));
+  std::vector<std::string> attributes = peer_->GetAttributes(1);
+
+  for (auto& attribute : attributes) {
+    if (attribute.find("candidate:") != std::string::npos) {
+      size_t sp1 = attribute.find(' ');
+      ASSERT_EQ(0, attribute.compare(sp1+1, 1, "1", 1));
+    }
   }
 }
 
 TEST_F(WebRtcIceGatherTest, TestGatherVerifyNoLoopback) {
   Gather();
   ASSERT_FALSE(StreamHasMatchingCandidate(0, "127.0.0.1"));
 }
 
@@ -2489,34 +2491,34 @@ TEST_F(WebRtcIceGatherTest, TestStunServ
 
 // Test no host with our fake STUN server and apparently NATted.
 TEST_F(WebRtcIceGatherTest, TestFakeStunServerNatedNoHost) {
   peer_ = MakeUnique<IceTestPeer>("P1", test_utils_, true, false, false, false, NrIceCtx::ICE_POLICY_NO_HOST);
   peer_->AddStream(1);
   UseFakeStunUdpServerWithResponse("192.0.2.1", 3333);
   Gather(0);
   WaitForGather();
-  DumpCandidates(0);
+  DumpAttributes(0);
   ASSERT_FALSE(StreamHasMatchingCandidate(0, "host"));
   ASSERT_TRUE(StreamHasMatchingCandidate(0, "srflx"));
   NrIceCandidate default_candidate;
   nsresult rv = peer_->GetDefaultCandidate(0, &default_candidate);
   if (NS_SUCCEEDED(rv)) {
     ASSERT_NE(NrIceCandidate::ICE_HOST, default_candidate.type);
   }
 }
 
 // Test no host with our fake STUN server and apparently non-NATted.
 TEST_F(WebRtcIceGatherTest, TestFakeStunServerNoNatNoHost) {
   peer_ = MakeUnique<IceTestPeer>("P1", test_utils_, true, false, false, false, NrIceCtx::ICE_POLICY_NO_HOST);
   peer_->AddStream(1);
   UseTestStunServer();
   Gather(0);
   WaitForGather();
-  DumpCandidates(0);
+  DumpAttributes(0);
   ASSERT_FALSE(StreamHasMatchingCandidate(0, "host"));
   ASSERT_TRUE(StreamHasMatchingCandidate(0, "srflx"));
 }
 
 TEST_F(WebRtcIceGatherTest, TestStunTcpServerTrickle) {
   UseFakeStunTcpServerWithResponse("192.0.3.1", 3333);
   TestStunTcpServer::GetInstance(AF_INET)->SetDelay(500);
   Gather(0);
@@ -2596,28 +2598,26 @@ TEST_F(WebRtcIceConnectTest, TestConnect
   // verify p1 and p2 streams are still connected after restarting ice on p2
   SendReceive(p1_.get(), p2_.get());
 
   mozilla::UniquePtr<IceTestPeer> p3_;
   p3_ = MakeUnique<IceTestPeer>("P3", test_utils_, true, false, false, false);
   InitPeer(p3_.get());
   p3_->AddStream(1);
 
-  p2_->AddStream(1);
   ASSERT_TRUE(GatherCallerAndCallee(p2_.get(), p3_.get()));
   std::cout << "-------------------------------------------------" << std::endl;
-  ConnectCallerAndCallee(p3_.get(), p2_.get());
-  SendReceive(p1_.get(), p2_.get()); // p1 and p2 still connected
+  ConnectCallerAndCallee(p3_.get(), p2_.get(), TRICKLE_SIMULATE);
+  SendReceive(p1_.get(), p2_.get()); // p1 and p2 are still connected
+  SendReceive(p3_.get(), p2_.get(), true, true); // p3 and p2 not yet connected
+  p2_->SimulateTrickle(0);
+  p3_->SimulateTrickle(0);
+  SendReceive(p1_.get(), p2_.get(), false, true); // p1 and p2 not connected
   SendReceive(p3_.get(), p2_.get()); // p3 and p2 are now connected
 
-  p2_->FinalizeIceRestart();
-  SendReceive(p3_.get(), p2_.get()); // p3 and p2 are still connected
-
-  SendReceive(p1_.get(), p2_.get(), false, true); // p1 and p2 not connected
-
   p3_ = nullptr;
 }
 
 TEST_F(WebRtcIceConnectTest, TestConnectRestartIceThenAbort) {
   AddStream(1);
   ASSERT_TRUE(Gather());
   Connect();
   SendReceive(p1_.get(), p2_.get());
@@ -2628,74 +2628,63 @@ TEST_F(WebRtcIceConnectTest, TestConnect
   // verify p1 and p2 streams are still connected after restarting ice on p2
   SendReceive(p1_.get(), p2_.get());
 
   mozilla::UniquePtr<IceTestPeer> p3_;
   p3_ = MakeUnique<IceTestPeer>("P3", test_utils_, true, false, false, false);
   InitPeer(p3_.get());
   p3_->AddStream(1);
 
-  p2_->AddStream(1);
   ASSERT_TRUE(GatherCallerAndCallee(p2_.get(), p3_.get()));
   std::cout << "-------------------------------------------------" << std::endl;
-  ConnectCallerAndCallee(p3_.get(), p2_.get());
-  SendReceive(p1_.get(), p2_.get()); // p1 and p2 still connected
-  SendReceive(p3_.get(), p2_.get()); // p3 and p2 are now connected
-
   p2_->RollbackIceRestart();
-  SendReceive(p1_.get(), p2_.get()); // p1 and p2 are still connected
-
-  SendReceive(p3_.get(), p2_.get(), false, true); // p3 and p2 not connected
-
+  p2_->Connect(p1_.get(), TRICKLE_NONE);
+  SendReceive(p1_.get(), p2_.get());
   p3_ = nullptr;
 }
 
-TEST_F(WebRtcIceConnectTest, TestConnectSetControllingAfterIceRestart) {
+TEST_F(WebRtcIceConnectTest, TestConnectIceRestartRoleConflict) {
   AddStream(1);
   ASSERT_TRUE(Gather());
   // Just for fun lets do this with switched rolls
   p1_->SetControlling(NrIceCtx::ICE_CONTROLLED);
   p2_->SetControlling(NrIceCtx::ICE_CONTROLLING);
   Connect();
   SendReceive(p1_.get(), p2_.get());
   // Set rolls should not switch by connecting
   ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p1_->GetControlling());
   ASSERT_EQ(NrIceCtx::ICE_CONTROLLING, p2_->GetControlling());
 
   p2_->RestartIce();
   ASSERT_FALSE(p2_->gathering_complete());
-  // ICE restart should allow us to set control role again
   p2_->SetControlling(NrIceCtx::ICE_CONTROLLED);
-  ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p2_->GetControlling());
-  // But still only allowed to set control role once
-  p2_->SetControlling(NrIceCtx::ICE_CONTROLLING);
-  ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p2_->GetControlling());
+  ASSERT_EQ(NrIceCtx::ICE_CONTROLLING, p2_->GetControlling()) <<
+    "ICE restart should not allow role to change, unless ice-lite happens";
 
   mozilla::UniquePtr<IceTestPeer> p3_;
   p3_ = MakeUnique<IceTestPeer>("P3", test_utils_, true, false, false, false);
   InitPeer(p3_.get());
   p3_->AddStream(1);
-  // Set control role for p3 accordingly (w/o role conflict)
+  // Set control role for p3 accordingly (with role conflict)
   p3_->SetControlling(NrIceCtx::ICE_CONTROLLING);
   ASSERT_EQ(NrIceCtx::ICE_CONTROLLING, p3_->GetControlling());
 
-  p2_->AddStream(1);
   ASSERT_TRUE(GatherCallerAndCallee(p2_.get(), p3_.get()));
   std::cout << "-------------------------------------------------" << std::endl;
   ConnectCallerAndCallee(p3_.get(), p2_.get());
-  // Again connecting should not result in role switch
-  ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p2_->GetControlling());
-  ASSERT_EQ(NrIceCtx::ICE_CONTROLLING, p3_->GetControlling());
-
-  p2_->FinalizeIceRestart();
+  auto p2role = p2_->GetControlling();
+  ASSERT_NE(p2role, p3_->GetControlling()) << "Conflict should be resolved";
+  ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p1_->GetControlling())
+    << "P1 should be unaffected by role conflict";
+
   // And again we are not allowed to switch roles at this point any more
-  p2_->SetControlling(NrIceCtx::ICE_CONTROLLING);
-  ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p2_->GetControlling());
-  p3_->SetControlling(NrIceCtx::ICE_CONTROLLED);
-  ASSERT_EQ(NrIceCtx::ICE_CONTROLLING, p3_->GetControlling());
+  p1_->SetControlling(NrIceCtx::ICE_CONTROLLING);
+  ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p1_->GetControlling());
+  p3_->SetControlling(p2role);
+  ASSERT_NE(p2role, p3_->GetControlling());
 
   p3_ = nullptr;
 }
 
 TEST_F(WebRtcIceConnectTest, TestConnectTcp) {
   Init(false, true);
   AddStream(1);
   ASSERT_TRUE(Gather());
--- a/media/mtransport/test/multi_tcp_socket_unittest.cpp
+++ b/media/mtransport/test/multi_tcp_socket_unittest.cpp
@@ -19,17 +19,17 @@ extern "C" {
 #include "ice_ctx.h"
 #include "nr_socket_multi_tcp.h"
 }
 
 #include "nr_socket_prsock.h"
 
 #include "stunserver.h"
 
-#include "nricectxhandler.h"
+#include "nricectx.h"
 #include "nricemediastream.h"
 
 #define GTEST_HAS_RTTI 0
 #include "gtest/gtest.h"
 #include "gtest_utils.h"
 
 using namespace mozilla;
 
@@ -42,17 +42,17 @@ class MultiTcpSocketTest : public Mtrans
      socks(3,nullptr),
      readable(false),
      ice_ctx_()
    {}
 
   void SetUp() {
     MtransportTest::SetUp();
 
-    ice_ctx_ = NrIceCtxHandler::Create("stun", true);
+    ice_ctx_ = NrIceCtx::Create("stun", true);
 
     test_utils_->sts_target()->Dispatch(
         WrapRunnableNM(&TestStunTcpServer::GetInstance, AF_INET),
                        NS_DISPATCH_SYNC);
     test_utils_->sts_target()->Dispatch(
       WrapRunnableNM(&TestStunTcpServer::GetInstance, AF_INET6),
                      NS_DISPATCH_SYNC);
   }
@@ -103,26 +103,26 @@ class MultiTcpSocketTest : public Mtrans
     int r;
 
     if (!stun_server_addr.empty()) {
       std::vector<NrIceStunServer> stun_servers;
       UniquePtr<NrIceStunServer> server(NrIceStunServer::Create(
           stun_server_addr, stun_server_port, kNrIceTransportTcp));
       stun_servers.push_back(*server);
 
-      ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetStunServers(stun_servers)));
+      ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->SetStunServers(stun_servers)));
     }
 
     r = 1;
     for (int tries=10; tries && r; --tries) {
       r = nr_str_port_to_transport_addr(
         (char *)"127.0.0.1", EnsureEphemeral(port_s++), IPPROTO_TCP, &local);
       ASSERT_EQ(0, r);
 
-      r = nr_socket_multi_tcp_create(ice_ctx_->ctx()->ctx(),
+      r = nr_socket_multi_tcp_create(ice_ctx_->ctx(),
           &local, tcp_type, 1, 2048, sock);
     }
 
     ASSERT_EQ(0, r);
     printf("Creating socket on %s\n", local.as_string);
     r = nr_socket_multi_tcp_set_readable_cb(*sock,
         &MultiTcpSocketTest::SockReadable, this);
     ASSERT_EQ(0, r);
@@ -342,17 +342,17 @@ class MultiTcpSocketTest : public Mtrans
   bool IsReadable() const {
     return readable;
   }
   void SetReadable(bool r) {
     readable=r;
   }
   std::vector<nr_socket *> socks;
   Atomic<bool> readable;
-  RefPtr<NrIceCtxHandler> ice_ctx_;
+  RefPtr<NrIceCtx> ice_ctx_;
 };
 }
 
 TEST_F(MultiTcpSocketTest, TestListen) {
   socks[0] = Create(TCP_TYPE_PASSIVE);
   Listen(socks[0]);
 }
 
--- a/media/mtransport/test/test_nr_socket_ice_unittest.cpp
+++ b/media/mtransport/test/test_nr_socket_ice_unittest.cpp
@@ -99,17 +99,20 @@ public:
     ice_handler_->obj = this;
 
     nr_ice_peer_ctx_create(ice_ctx_, ice_handler_,
                            const_cast<char *>(name_.c_str()),
                            &peer_ctx_);
 
     nr_ice_add_media_stream(ice_ctx_,
                             const_cast<char *>(name_.c_str()),
+                            "ufrag",
+                            "pass",
                             2, &ice_media_stream_);
+    EXPECT_EQ(2UL, GetStreamAttributes().size());
 
     nr_ice_media_stream_initialize(ice_ctx_, ice_media_stream_);
   }
 
   virtual ~IcePeer()
   {
     Destroy();
   }
@@ -139,40 +142,56 @@ public:
   }
 
   void Gather_s(bool default_route_only=false)
   {
     int r = nr_ice_gather(ice_ctx_, &IcePeer::gather_cb, this);
     ASSERT_TRUE(r == 0 || r == R_WOULDBLOCK);
   }
 
-  std::vector<std::string> GetLocalCandidates() const {
-    char attr[256];
-    std::vector<std::string> candidates;
-    nr_ice_component* comp = STAILQ_FIRST(&ice_media_stream_->components);
-    while(comp){
-      if (comp->state != NR_ICE_COMPONENT_DISABLED) {
-        nr_ice_candidate *cand = TAILQ_FIRST(&comp->candidates);
-        while(cand){
-          int r = nr_ice_format_candidate_attribute(cand, attr, 255);
-          if (r == 0) {
-            candidates.push_back(attr);
-          }
+  std::vector<std::string> GetStreamAttributes() {
+    std::vector<std::string> attributes;
+    test_utils_->sts_target()->Dispatch(
+        WrapRunnableRet(&attributes,
+                        this,
+                        &IcePeer::GetStreamAttributes_s),
+        NS_DISPATCH_SYNC);
+    return attributes;
+  }
+
+  std::vector<std::string> GetStreamAttributes_s() {
 
-          cand = TAILQ_NEXT(cand, entry_comp);
-        }
-      }
+    char **attrs = nullptr;
+    int attrct;
+    std::vector<std::string> ret;
+
+    int r =
+      nr_ice_media_stream_get_attributes(ice_media_stream_, &attrs, &attrct);
+    EXPECT_EQ(0, r);
 
-      comp = STAILQ_NEXT(comp, entry);
+    for (int i=0; i<attrct; i++) {
+      ret.push_back(std::string(attrs[i]));
+      RFREE(attrs[i]);
     }
+    RFREE(attrs);
 
-    return candidates;
+    return ret;
   }
 
   std::vector<std::string> GetGlobalAttributes() {
+    std::vector<std::string> attributes;
+    test_utils_->sts_target()->Dispatch(
+        WrapRunnableRet(&attributes,
+                        this,
+                        &IcePeer::GetGlobalAttributes_s),
+        NS_DISPATCH_SYNC);
+    return attributes;
+  }
+
+  std::vector<std::string> GetGlobalAttributes_s() {
 
     char **attrs = nullptr;
     int attrct;
     std::vector<std::string> ret;
 
     nr_ice_get_global_attributes(ice_ctx_, &attrs, &attrct);
 
     for (int i=0; i<attrct; i++) {
@@ -198,16 +217,24 @@ public:
     ASSERT_EQ(0, r);
   }
 
   void SetControlling(bool controlling) {
     peer_ctx_->controlling = controlling ? 1 : 0;
   }
 
   void SetRemoteAttributes(std::vector<std::string> attributes) {
+    test_utils_->sts_target()->Dispatch(
+        WrapRunnable(this,
+                     &IcePeer::SetRemoteAttributes_s,
+                     attributes),
+        NS_DISPATCH_SYNC);
+  }
+
+  void SetRemoteAttributes_s(std::vector<std::string> attributes) {
     int r;
 
     std::vector<char*> attrs;
     attrs.reserve(attributes.size());
     for (auto& attr: attributes) {
       attrs.push_back(const_cast<char*>(attr.c_str()));
     }
 
@@ -324,42 +351,42 @@ public:
 };
 
 TEST_F(TestNrSocketIceUnitTest, TestIcePeer) {
   IcePeer peer("IcePeer", nullptr, NR_ICE_CTX_FLAGS_AGGRESSIVE_NOMINATION,
                test_utils_);
   ASSERT_NE(peer.ice_ctx_, nullptr);
   ASSERT_NE(peer.peer_ctx_, nullptr);
   ASSERT_NE(peer.ice_media_stream_, nullptr);
+  ASSERT_EQ(2UL, peer.GetStreamAttributes().size())
+    << "Should have ice-ufrag and ice-pwd";
   peer.Gather();
-  std::vector<std::string> attrs = peer.GetGlobalAttributes();
-  ASSERT_NE(attrs.size(), 0UL);
-  std::vector<std::string> candidates = peer.GetLocalCandidates();
-  ASSERT_NE(candidates.size(), 0UL);
+  ASSERT_LT(2UL, peer.GetStreamAttributes().size())
+    << "Should have ice-ufrag, ice-pwd, and at least one candidate.";
 }
 
 TEST_F(TestNrSocketIceUnitTest, TestIcePeersNoNAT) {
   IcePeer peer("IcePeer", nullptr, NR_ICE_CTX_FLAGS_AGGRESSIVE_NOMINATION,
                test_utils_);
   IcePeer peer2("IcePeer2", nullptr, NR_ICE_CTX_FLAGS_AGGRESSIVE_NOMINATION,
                test_utils2_);
   peer.SetControlling(true);
   peer2.SetControlling(false);
 
   peer.Gather();
   peer2.Gather();
   std::vector<std::string> attrs = peer.GetGlobalAttributes();
   peer2.ParseGlobalAttributes(attrs);
-  std::vector<std::string> candidates = peer.GetLocalCandidates();
-  peer2.SetRemoteAttributes(candidates);
+  std::vector<std::string> attributes = peer.GetStreamAttributes();
+  peer2.SetRemoteAttributes(attributes);
 
   attrs = peer2.GetGlobalAttributes();
   peer.ParseGlobalAttributes(attrs);
-  candidates = peer2.GetLocalCandidates();
-  peer.SetRemoteAttributes(candidates);
+  attributes = peer2.GetStreamAttributes();
+  peer.SetRemoteAttributes(attributes);
   peer2.StartChecks();
   peer.StartChecks();
 
   ASSERT_TRUE_WAIT(peer.ice_connected_, kDefaultTimeout);
   ASSERT_TRUE_WAIT(peer2.ice_connected_, kDefaultTimeout);
 }
 
 TEST_F(TestNrSocketIceUnitTest, TestIcePeersPacketLoss) {
@@ -401,23 +428,23 @@ TEST_F(TestNrSocketIceUnitTest, TestIceP
                test_utils2_);
   peer.SetControlling(true);
   peer2.SetControlling(false);
 
   peer.Gather();
   peer2.Gather();
   std::vector<std::string> attrs = peer.GetGlobalAttributes();
   peer2.ParseGlobalAttributes(attrs);
-  std::vector<std::string> candidates = peer.GetLocalCandidates();
-  peer2.SetRemoteAttributes(candidates);
+  std::vector<std::string> attributes = peer.GetStreamAttributes();
+  peer2.SetRemoteAttributes(attributes);
 
   attrs = peer2.GetGlobalAttributes();
   peer.ParseGlobalAttributes(attrs);
-  candidates = peer2.GetLocalCandidates();
-  peer.SetRemoteAttributes(candidates);
+  attributes = peer2.GetStreamAttributes();
+  peer.SetRemoteAttributes(attributes);
   peer2.StartChecks();
   peer.StartChecks();
 
   ASSERT_TRUE_WAIT(peer.ice_connected_, kDefaultTimeout);
   ASSERT_TRUE_WAIT(peer2.ice_connected_, kDefaultTimeout);
 }
 
 
--- a/media/mtransport/test/transport_unittests.cpp
+++ b/media/mtransport/test/transport_unittests.cpp
@@ -21,17 +21,17 @@
 #include "sslexp.h"
 #include "sslproto.h"
 
 #include "nsThreadUtils.h"
 #include "nsXPCOM.h"
 
 #include "mediapacket.h"
 #include "dtlsidentity.h"
-#include "nricectxhandler.h"
+#include "nricectx.h"
 #include "nricemediastream.h"
 #include "transportflow.h"
 #include "transportlayer.h"
 #include "transportlayerdtls.h"
 #include "transportlayerice.h"
 #include "transportlayerlog.h"
 #include "transportlayerloopback.h"
 
@@ -438,28 +438,28 @@ class TransportTestPeer : public sigslot
   TransportTestPeer(nsCOMPtr<nsIEventTarget> target, std::string name, MtransportTestUtils* utils)
       : name_(name), offerer_(name == "P1"), target_(target),
         received_packets_(0),received_bytes_(0),flow_(new TransportFlow(name)),
         loopback_(new TransportLayerLoopback()),
         logging_(new TransportLayerLogging()),
         lossy_(new TransportLayerLossy()),
         dtls_(new TransportLayerDtls()),
         identity_(DtlsIdentity::Generate()),
-        ice_ctx_(NrIceCtxHandler::Create(name)),
-        streams_(), candidates_(),
+        ice_ctx_(NrIceCtx::Create(name)),
+        streams_(),
         peer_(nullptr),
         gathering_complete_(false),
         enabled_cipersuites_(),
         disabled_cipersuites_(),
         test_utils_(utils) {
     std::vector<NrIceStunServer> stun_servers;
     UniquePtr<NrIceStunServer> server(NrIceStunServer::Create(
         std::string((char *)"stun.services.mozilla.com"), 3478));
     stun_servers.push_back(*server);
-    EXPECT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetStunServers(stun_servers)));
+    EXPECT_TRUE(NS_SUCCEEDED(ice_ctx_->SetStunServers(stun_servers)));
 
     dtls_->SetIdentity(identity_);
     dtls_->SetRole(offerer_ ?
                    TransportLayerDtls::SERVER :
                    TransportLayerDtls::CLIENT);
 
     nsresult res = identity_->ComputeFingerprint("sha-1",
                                              fingerprint_,
@@ -605,29 +605,28 @@ class TransportTestPeer : public sigslot
     flow_->PushLayer(dtls_);
     return NS_OK;
   }
 
   void InitIce() {
     nsresult res;
 
     // Attach our slots
-    ice_ctx_->ctx()->SignalGatheringStateChange.
+    ice_ctx_->SignalGatheringStateChange.
         connect(this, &TransportTestPeer::GatheringStateChange);
 
     char name[100];
     snprintf(name, sizeof(name), "%s:stream%d", name_.c_str(),
              (int)streams_.size());
 
     // Create the media stream
-    RefPtr<NrIceMediaStream> stream =
-        ice_ctx_->CreateStream(static_cast<char *>(name), 1);
+    RefPtr<NrIceMediaStream> stream = ice_ctx_->CreateStream(name, name, 1);
 
     ASSERT_TRUE(stream != nullptr);
-    ice_ctx_->ctx()->SetStream(name, stream);
+    stream->SetIceCredentials("ufrag", "pass");
     streams_.push_back(stream);
 
     // Listen for candidates
     stream->SignalCandidate.
         connect(this, &TransportTestPeer::GotCandidate);
 
     // Create the transport layer
     ice_ = new TransportLayerIce();
@@ -641,17 +640,17 @@ class TransportTestPeer : public sigslot
 
     // Listen for media events
     dtls_->SignalPacketReceived.connect(this, &TransportTestPeer::PacketReceived);
     dtls_->SignalStateChange.connect(this, &TransportTestPeer::StateChanged);
 
     // Start gathering
     test_utils_->sts_target()->Dispatch(
         WrapRunnableRet(&res,
-                        ice_ctx_->ctx(),
+                        ice_ctx_,
                         &NrIceCtx::StartGathering,
                         false,
                         false),
         NS_DISPATCH_SYNC);
     ASSERT_TRUE(NS_SUCCEEDED(res));
   }
 
   void ConnectIce(TransportTestPeer *peer) {
@@ -660,17 +659,16 @@ class TransportTestPeer : public sigslot
     // If gathering is already complete, push the candidates over
     if (gathering_complete_)
       GatheringComplete();
   }
 
   // New candidate
   void GotCandidate(NrIceMediaStream *stream, const std::string &candidate) {
     std::cerr << "Got candidate " << candidate << std::endl;
-    candidates_[stream->name()].push_back(candidate);
   }
 
   void GatheringStateChange(NrIceCtx* ctx,
                             NrIceCtx::GatheringState state) {
     (void)ctx;
     if (state == NrIceCtx::ICE_CTX_GATHER_COMPLETE) {
       GatheringComplete();
     }
@@ -684,33 +682,33 @@ class TransportTestPeer : public sigslot
     // Don't send to the other side
     if (!peer_) {
       gathering_complete_ = true;
       return;
     }
 
     // First send attributes
     test_utils_->sts_target()->Dispatch(
-      WrapRunnableRet(&res, peer_->ice_ctx_->ctx(),
+      WrapRunnableRet(&res, peer_->ice_ctx_,
                       &NrIceCtx::ParseGlobalAttributes,
-                      ice_ctx_->ctx()->GetGlobalAttributes()),
+                      ice_ctx_->GetGlobalAttributes()),
       NS_DISPATCH_SYNC);
     ASSERT_TRUE(NS_SUCCEEDED(res));
 
     for (size_t i=0; i<streams_.size(); ++i) {
       test_utils_->sts_target()->Dispatch(
-        WrapRunnableRet(&res, peer_->streams_[i], &NrIceMediaStream::ParseAttributes,
-                        candidates_[streams_[i]->name()]), NS_DISPATCH_SYNC);
+        WrapRunnableRet(&res, peer_->streams_[i], &NrIceMediaStream::ConnectToPeer,
+                        "ufrag", "pass", streams_[i]->GetAttributes()), NS_DISPATCH_SYNC);
 
       ASSERT_TRUE(NS_SUCCEEDED(res));
     }
 
     // Start checks on the other peer.
     test_utils_->sts_target()->Dispatch(
-      WrapRunnableRet(&res, peer_->ice_ctx_->ctx(), &NrIceCtx::StartChecks,
+      WrapRunnableRet(&res, peer_->ice_ctx_, &NrIceCtx::StartChecks,
                       offerer_),
       NS_DISPATCH_SYNC);
     ASSERT_TRUE(NS_SUCCEEDED(res));
   }
 
   // WrapRunnable/lambda and move semantics (MediaPacket is not copyable) don't
   // get along yet, so we need a wrapper. Gross.
   static TransportResult SendPacketWrapper(TransportLayer* layer,
@@ -826,19 +824,18 @@ class TransportTestPeer : public sigslot
   size_t received_bytes_;
     RefPtr<TransportFlow> flow_;
   TransportLayerLoopback *loopback_;
   TransportLayerLogging *logging_;
   TransportLayerLossy *lossy_;
   TransportLayerDtls *dtls_;
   TransportLayerIce *ice_;
   RefPtr<DtlsIdentity> identity_;
-  RefPtr<NrIceCtxHandler> ice_ctx_;
+  RefPtr<NrIceCtx> ice_ctx_;
   std::vector<RefPtr<NrIceMediaStream> > streams_;
-  std::map<std::string, std::vector<std::string> > candidates_;
   TransportTestPeer *peer_;
   bool gathering_complete_;
   unsigned char fingerprint_[TransportLayerDtls::kMaxDigestLength];
   size_t fingerprint_len_;
   std::vector<uint16_t> enabled_cipersuites_;
   std::vector<uint16_t> disabled_cipersuites_;
   MtransportTestUtils* test_utils_;
   std::function<void(PRFileDesc* fd)> post_setup_ = nullptr;
--- a/media/mtransport/test/turn_unittest.cpp
+++ b/media/mtransport/test/turn_unittest.cpp
@@ -69,18 +69,17 @@ extern "C" {
 #include "nr_socket.h"
 #include "nr_socket_local.h"
 #include "nr_socket_buffered_stun.h"
 #include "stun_client_ctx.h"
 #include "turn_client_ctx.h"
 }
 
 #include "nricemediastream.h"
-#include "nricectxhandler.h"
-
+#include "nricectx.h"
 
 using namespace mozilla;
 
 static std::string kDummyTurnServer("192.0.2.1");  // From RFC 5737
 
 class TurnClient : public MtransportTest {
  public:
   TurnClient()
--- a/media/mtransport/third_party/nICEr/src/ice/ice_candidate.c
+++ b/media/mtransport/third_party/nICEr/src/ice/ice_candidate.c
@@ -301,21 +301,17 @@ int nr_ice_candidate_destroy(nr_ice_cand
   {
     nr_ice_candidate *cand=0;
 
     if(!candp || !*candp)
       return(0);
 
     cand=*candp;
 
-    if (cand->state == NR_ICE_CAND_STATE_INITIALIZING) {
-      /* Make sure the ICE ctx isn't still waiting around for this candidate
-       * to init. */
-      nr_ice_candidate_mark_done(cand, NR_ICE_CAND_STATE_FAILED);
-    }
+    nr_ice_candidate_stop_gathering(cand);
 
     switch(cand->type){
       case HOST:
         break;
 #ifdef USE_TURN
       case RELAYED:
         // record stats back to the ice ctx on destruction
         if (cand->u.relayed.turn) {
@@ -345,29 +341,42 @@ int nr_ice_candidate_destroy(nr_ice_cand
         if (cand->u.srvrflx.relay_candidate)
           cand->u.srvrflx.relay_candidate->u.relayed.srvflx_candidate=0;
         nr_stun_client_ctx_destroy(&cand->u.srvrflx.stun);
         break;
       default:
         break;
     }
 
-    NR_async_timer_cancel(cand->delay_timer);
-    NR_async_timer_cancel(cand->ready_cb_timer);
-    if(cand->resolver_handle){
-      nr_resolver_cancel(cand->ctx->resolver,cand->resolver_handle);
-    }
-
     RFREE(cand->foundation);
     RFREE(cand->label);
     RFREE(cand);
 
     return(0);
   }
 
+void nr_ice_candidate_stop_gathering(nr_ice_candidate *cand)
+  {
+    if (cand->state == NR_ICE_CAND_STATE_INITIALIZING) {
+      /* Make sure the ICE ctx isn't still waiting around for this candidate
+       * to init. */
+      nr_ice_candidate_mark_done(cand, NR_ICE_CAND_STATE_FAILED);
+    }
+
+    NR_async_timer_cancel(cand->delay_timer);
+    cand->delay_timer=0;
+    NR_async_timer_cancel(cand->ready_cb_timer);
+    cand->ready_cb_timer=0;
+
+    if(cand->resolver_handle){
+      nr_resolver_cancel(cand->ctx->resolver,cand->resolver_handle);
+      cand->resolver_handle=0;
+    }
+  }
+
 /* This algorithm is not super-fast, but I don't think we need a hash
    table just yet and it produces a small foundation string */
 static int nr_ice_get_foundation(nr_ice_ctx *ctx,nr_ice_candidate *cand)
   {
     nr_ice_foundation *foundation;
     int i=0;
     char fnd[20];
     int _status;
--- a/media/mtransport/third_party/nICEr/src/ice/ice_candidate.h
+++ b/media/mtransport/third_party/nICEr/src/ice/ice_candidate.h
@@ -105,16 +105,17 @@ extern char *nr_ice_candidate_type_names
 extern char *nr_ice_candidate_tcp_type_names[];
 
 
 int nr_ice_candidate_create(struct nr_ice_ctx_ *ctx,nr_ice_component *component, nr_ice_socket *isock, nr_socket *osock, nr_ice_candidate_type ctype, nr_socket_tcp_type tcp_type, nr_ice_stun_server *stun_server, UCHAR component_id, nr_ice_candidate **candp);
 int nr_ice_candidate_initialize(nr_ice_candidate *cand, NR_async_cb ready_cb, void *cb_arg);
 void nr_ice_candidate_compute_codeword(nr_ice_candidate *cand);
 int nr_ice_candidate_process_stun(nr_ice_candidate *cand, UCHAR *msg, int len, nr_transport_addr *faddr);
 int nr_ice_candidate_destroy(nr_ice_candidate **candp);
+void nr_ice_candidate_stop_gathering(nr_ice_candidate *cand);
 int nr_ice_format_candidate_attribute(nr_ice_candidate *cand, char *attr, int maxlen);
 int nr_ice_peer_candidate_from_attribute(nr_ice_ctx *ctx,char *attr,nr_ice_media_stream *stream,nr_ice_candidate **candp);
 int nr_ice_peer_peer_rflx_candidate_create(nr_ice_ctx *ctx,char *label, nr_ice_component *comp,nr_transport_addr *addr, nr_ice_candidate **candp);
 int nr_ice_candidate_compute_priority(nr_ice_candidate *cand);
 
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
--- a/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.c
+++ b/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.c
@@ -492,31 +492,29 @@ int nr_ice_candidate_pair_do_triggered_c
         ABORT(r);
     }
 
     _status=0;
   abort:
     return(_status);
   }
 
-int nr_ice_candidate_pair_cancel(nr_ice_peer_ctx *pctx,nr_ice_cand_pair *pair, int move_to_wait_state)
+void nr_ice_candidate_pair_cancel(nr_ice_peer_ctx *pctx,nr_ice_cand_pair *pair, int move_to_wait_state)
   {
     if(pair->state != NR_ICE_PAIR_STATE_FAILED){
       /* If it's already running we need to terminate the stun */
       if(pair->state==NR_ICE_PAIR_STATE_IN_PROGRESS){
         if(move_to_wait_state) {
           nr_stun_client_wait(pair->stun_client);
         } else {
           nr_stun_client_cancel(pair->stun_client);
         }
       }
       nr_ice_candidate_pair_set_state(pctx,pair,NR_ICE_PAIR_STATE_CANCELLED);
     }
-
-    return(0);
   }
 
 int nr_ice_candidate_pair_select(nr_ice_cand_pair *pair)
   {
     int r,_status;
 
     if(!pair){
       r_log(LOG_ICE,LOG_ERR,"ICE-PAIR: No pair chosen");
@@ -540,20 +538,18 @@ int nr_ice_candidate_pair_select(nr_ice_
         ABORT(r);
     }
 
     _status=0;
   abort:
     return(_status);
  }
 
-int nr_ice_candidate_pair_set_state(nr_ice_peer_ctx *pctx, nr_ice_cand_pair *pair, int state)
+void nr_ice_candidate_pair_set_state(nr_ice_peer_ctx *pctx, nr_ice_cand_pair *pair, int state)
   {
-    int r,_status;
-
     r_log(LOG_ICE,LOG_INFO,"ICE-PEER(%s)/CAND-PAIR(%s): setting pair to state %s: %s",
       pctx->label,pair->codeword,nr_ice_cand_pair_states[state],pair->as_string);
 
     /* NOTE: This function used to reference pctx->state instead of
        pair->state and the assignment to pair->state was at the top
        of this function. Because pctx->state was never changed, this seems to have
        been a typo. The natural logic is "if the state changed
        decrement the counter" so this implies we should be checking
@@ -575,23 +571,18 @@ int nr_ice_candidate_pair_set_state(nr_i
 
       assert(pctx->waiting_pairs>=0);
     }
     pair->state=state;
 
 
     if(pair->state==NR_ICE_PAIR_STATE_FAILED ||
        pair->state==NR_ICE_PAIR_STATE_CANCELLED){
-      if(r=nr_ice_component_failed_pair(pair->remote->component, pair))
-        ABORT(r);
+      nr_ice_component_failed_pair(pair->remote->component, pair);
     }
-
-    _status=0;
-  abort:
-    return(_status);
   }
 
 int nr_ice_candidate_pair_dump_state(nr_ice_cand_pair *pair, FILE *out)
   {
     /*r_log(LOG_ICE,LOG_DEBUG,"CAND-PAIR(%s): pair %s: state=%s, priority=0x%llx\n",pair->codeword,pair->as_string,nr_ice_cand_pair_states[pair->state],pair->priority);*/
 
     return(0);
   }
--- a/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.h
+++ b/media/mtransport/third_party/nICEr/src/ice/ice_candidate_pair.h
@@ -78,19 +78,19 @@ struct nr_ice_cand_pair_ {
 
   TAILQ_ENTRY(nr_ice_cand_pair_) check_queue_entry;   /* the check list */
   TAILQ_ENTRY(nr_ice_cand_pair_) triggered_check_queue_entry;  /* the trigger check queue */
 };
 
 int nr_ice_candidate_pair_create(nr_ice_peer_ctx *pctx, nr_ice_candidate *lcand,nr_ice_candidate *rcand,nr_ice_cand_pair **pairp);
 int nr_ice_candidate_pair_unfreeze(nr_ice_peer_ctx *pctx, nr_ice_cand_pair *pair);
 int nr_ice_candidate_pair_start(nr_ice_peer_ctx *pctx, nr_ice_cand_pair *pair);
-int nr_ice_candidate_pair_set_state(nr_ice_peer_ctx *pctx, nr_ice_cand_pair *pair, int state);
+void nr_ice_candidate_pair_set_state(nr_ice_peer_ctx *pctx, nr_ice_cand_pair *pair, int state);
 int nr_ice_candidate_pair_dump_state(nr_ice_cand_pair *pair, FILE *out);
-int nr_ice_candidate_pair_cancel(nr_ice_peer_ctx *pctx,nr_ice_cand_pair *pair, int move_to_wait_state);
+void nr_ice_candidate_pair_cancel(nr_ice_peer_ctx *pctx,nr_ice_cand_pair *pair, int move_to_wait_state);
 int nr_ice_candidate_pair_select(nr_ice_cand_pair *pair);
 int nr_ice_candidate_pair_do_triggered_check(nr_ice_peer_ctx *pctx, nr_ice_cand_pair *pair);
 int nr_ice_candidate_pair_insert(nr_ice_cand_pair_head *head,nr_ice_cand_pair *pair);
 int nr_ice_candidate_pair_trigger_check_append(nr_ice_cand_pair_head *head,nr_ice_cand_pair *pair);
 void nr_ice_candidate_pair_restart_stun_nominated_cb(NR_SOCKET s, int how, void *cb_arg);
 int nr_ice_candidate_pair_destroy(nr_ice_cand_pair **pairp);
 void nr_ice_candidate_pair_role_change(nr_ice_cand_pair *pair);
 
--- a/media/mtransport/third_party/nICEr/src/ice/ice_component.c
+++ b/media/mtransport/third_party/nICEr/src/ice/ice_component.c
@@ -652,21 +652,21 @@ int nr_ice_component_initialize(struct n
 
     if(addr_ct==0){
       r_log(LOG_ICE,LOG_ERR,"ICE(%s): no local addresses available",ctx->label);
       ABORT(R_NOT_FOUND);
     }
 
     /* Note: we need to recompute these because
        we have not yet computed the values in the peer media stream.*/
-    lufrag=component->stream->ufrag ? component->stream->ufrag : ctx->ufrag;
+    lufrag=component->stream->ufrag;
     assert(lufrag);
     if (!lufrag)
       ABORT(R_INTERNAL);
-    lpwd=component->stream->pwd ? component->stream->pwd :ctx->pwd;
+    lpwd=component->stream->pwd;
     assert(lpwd);
     if (!lpwd)
       ABORT(R_INTERNAL);
     INIT_DATA(pwd, (UCHAR *)lpwd, strlen(lpwd));
 
     /* Initialize the UDP candidates */
     if (r=nr_ice_component_initialize_udp(ctx, component, addrs, addr_ct, lufrag, &pwd))
       r_log(LOG_ICE,LOG_INFO,"ICE(%s): failed to create UDP candidates with error %d",ctx->label,r);
@@ -694,16 +694,24 @@ int nr_ice_component_initialize(struct n
       }
       cand=TAILQ_NEXT(cand,entry_comp);
     }
     _status=0;
  abort:
     return(_status);
   }
 
+void nr_ice_component_stop_gathering(nr_ice_component *component)
+  {
+    nr_ice_candidate *c1,*c2;
+    TAILQ_FOREACH_SAFE(c1, &component->candidates, entry_comp, c2){
+      nr_ice_candidate_stop_gathering(c1);
+    }
+  }
+
 static int nr_ice_any_peer_paired(nr_ice_candidate* cand) {
   nr_ice_peer_ctx* pctx=STAILQ_FIRST(&cand->ctx->peers);
   while(pctx && pctx->state == NR_ICE_PEER_STATE_UNPAIRED){
     /* Is it worth actually looking through the check lists? Probably not. */
     pctx=STAILQ_NEXT(pctx,entry);
   }
   return pctx != NULL;
 }
@@ -1249,19 +1257,17 @@ static void nr_ice_component_consent_fai
       comp->consent_timeout = 0;
     }
     if (comp->consent_timer) {
       NR_async_timer_cancel(comp->consent_timer);
       comp->consent_timer = 0;
     }
     /* We are turning the consent failure into a ICE component failure to
      * alert the browser via ICE connection state change about this event. */
-    if (nr_ice_media_stream_component_failed(comp->stream, comp))
-      r_log(LOG_ICE,LOG_ERR,"ICE(%s)/STREAM(%s)/COMP(%d): failed to mark component as failed",
-        comp->ctx->label, comp->stream->label, comp->component_id);
+    nr_ice_media_stream_component_failed(comp->stream, comp);
   }
 
 static void nr_ice_component_consent_timeout_cb(NR_SOCKET s, int how, void *cb_arg)
   {
</