merge mozilla-central to mozilla-inbound. r=merge a=merge on a CLOSED TREE
authorSebastian Hengst <archaeopteryx@coole-files.de>
Thu, 09 Nov 2017 00:32:30 +0200
changeset 444102 7d799a93ed72e65fbf277170eafe45535276c671
parent 444101 c7095faa0112874e1804e2efad70699e5021eb53 (current diff)
parent 444082 c10cf7082a9b84839e7c3fdda80bd468e091739a (diff)
child 444103 3acb30b37718b0abc626416b9554acbc880a0078
push id1618
push userCallek@gmail.com
push dateThu, 11 Jan 2018 17:45:48 +0000
treeherdermozilla-release@882ca853e05a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone58.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 mozilla-inbound. r=merge a=merge on a CLOSED TREE
devtools/shim/aboutdevtools/tmp-locale/aboutdevtools.dtd
netwerk/base/RustURL.cpp
netwerk/base/RustURL.h
netwerk/test/unit/test_rusturl.js
python/mozbuild/mozbuild/test/test_testing.py
testing/web-platform/meta/html/browsers/browsing-the-web/unloading-documents/003.html.ini
--- a/browser/app/blocklist.xml
+++ b/browser/app/blocklist.xml
@@ -3926,16 +3926,19 @@
       <serialNumber>AINVG9I4T2jgQgW4N9SNhw==</serialNumber>
     </certItem>
     <certItem issuerName="MD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQQ==">
       <serialNumber>e7wSpVxmgAS5/ioLi2iBIA==</serialNumber>
     </certItem>
     <certItem issuerName="MFoxCzAJBgNVBAYTAklFMRIwEAYDVQQKEwlCYWx0aW1vcmUxEzARBgNVBAsTCkN5YmVyVHJ1c3QxIjAgBgNVBAMTGUJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3Q=">
       <serialNumber>Byemag==</serialNumber>
     </certItem>
+    <certItem issuerName="MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQDExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMw==">
+      <serialNumber>AxPlMqxkByCn3XNuYMhYNMcp</serialNumber>
+    </certItem>
     <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA3IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNA==">
       <serialNumber>cXXMzbWDHMIdCotb3h64yw==</serialNumber>
     </certItem>
     <certItem issuerName="MF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==">
       <serialNumber>E/YGRk12iZqZuMfsIiVaeg==</serialNumber>
     </certItem>
     <certItem issuerName="MFoxCzAJBgNVBAYTAklFMRIwEAYDVQQKEwlCYWx0aW1vcmUxEzARBgNVBAsTCkN5YmVyVHJ1c3QxIjAgBgNVBAMTGUJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3Q=">
       <serialNumber>Bye2Cg==</serialNumber>
@@ -4067,25 +4070,16 @@
       <serialNumber>AQw=</serialNumber>
     </certItem>
     <certItem issuerName="MIGVMQswCQYDVQQGEwJHUjFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTE=">
       <serialNumber>FJl6tXgNpSk=</serialNumber>
     </certItem>
     <certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
       <serialNumber>BAAAAAAA+X/GIyk=</serialNumber>
     </certItem>
-    <certItem issuerName="MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yaw==">
-      <serialNumber>O2Qh+qhbBRuZA11yDhcLGQ==</serialNumber>
-    </certItem>
-    <certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
-      <serialNumber>UU3AP1SMxmyhBFq7MRFZmf0=</serialNumber>
-    </certItem>
-    <certItem issuerName="MF8xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRQwEgYDVQQLEwtQYXJ0bmVycyBDQTEfMB0GA1UEAxMWR2xvYmFsU2lnbiBQYXJ0bmVycyBDQQ==">
-      <serialNumber>BAAAAAABHhw1vwc=</serialNumber>
-    </certItem>
     <certItem issuerName="MD0xCzAJBgNVBAYTAkZSMREwDwYDVQQKEwhDZXJ0cGx1czEbMBkGA1UEAxMSQ2xhc3MgMiBQcmltYXJ5IENB">
       <serialNumber>ESDItX4ruWiLnrlz0rk4/bmz</serialNumber>
     </certItem>
     <certItem issuerName="MEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFIyMRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu">
       <serialNumber>BAAAAAABIg08D3U=</serialNumber>
     </certItem>
     <certItem issuerName="MIGVMQswCQYDVQQGEwJHUjFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTE=">
       <serialNumber>GN2Hrh9LtnI=</serialNumber>
@@ -4799,10 +4793,19 @@
       <serialNumber>BAAAAAABK84yjs8=</serialNumber>
     </certItem>
     <certItem issuerName="MD0xCzAJBgNVBAYTAkZSMREwDwYDVQQKEwhDZXJ0cGx1czEbMBkGA1UEAxMSQ2xhc3MgMiBQcmltYXJ5IENB">
       <serialNumber>ESCC9oPNcRdPOox+SjWm9dTX</serialNumber>
     </certItem>
     <certItem issuerName="MD0xCzAJBgNVBAYTAkZSMREwDwYDVQQKEwhDZXJ0cGx1czEbMBkGA1UEAxMSQ2xhc3MgMiBQcmltYXJ5IENB">
       <serialNumber>DjIvBkX+ECVbB/C3i6w2Gg==</serialNumber>
     </certItem>
+    <certItem issuerName="MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yaw==">
+      <serialNumber>O2Qh+qhbBRuZA11yDhcLGQ==</serialNumber>
+    </certItem>
+    <certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
+      <serialNumber>UU3AP1SMxmyhBFq7MRFZmf0=</serialNumber>
+    </certItem>
+    <certItem issuerName="MF8xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRQwEgYDVQQLEwtQYXJ0bmVycyBDQTEfMB0GA1UEAxMWR2xvYmFsU2lnbiBQYXJ0bmVycyBDQQ==">
+      <serialNumber>BAAAAAABHhw1vwc=</serialNumber>
+    </certItem>
   </certItems>
 </blocklist>
--- a/browser/base/content/browser-thumbnails.js
+++ b/browser/base/content/browser-thumbnails.js
@@ -39,17 +39,16 @@ var gBrowserThumbnails = {
   _topSiteURLsRefreshTimer: null,
 
   /**
    * List of tab events we want to listen for.
    */
   _tabEvents: ["TabClose", "TabSelect"],
 
   init: function Thumbnails_init() {
-    PageThumbs.addExpirationFilter(this);
     gBrowser.addTabsProgressListener(this);
     Services.prefs.addObserver(this.PREF_DISK_CACHE_SSL, this);
     Services.prefs.addObserver(this.PREF_ACTIVITY_STREAM_ENABLED, this);
 
     this._sslDiskCacheEnabled =
       Services.prefs.getBoolPref(this.PREF_DISK_CACHE_SSL);
     this._activityStreamEnabled =
       Services.prefs.getBoolPref(this.PREF_ACTIVITY_STREAM_ENABLED);
@@ -57,17 +56,16 @@ var gBrowserThumbnails = {
     this._tabEvents.forEach(function(aEvent) {
       gBrowser.tabContainer.addEventListener(aEvent, this);
     }, this);
 
     this._timeouts = new WeakMap();
   },
 
   uninit: function Thumbnails_uninit() {
-    PageThumbs.removeExpirationFilter(this);
     gBrowser.removeTabsProgressListener(this);
     Services.prefs.removeObserver(this.PREF_DISK_CACHE_SSL, this);
     Services.prefs.removeObserver(this.PREF_ACTIVITY_STREAM_ENABLED, this);
 
     if (this._topSiteURLsRefreshTimer) {
       this._topSiteURLsRefreshTimer.cancel();
       this._topSiteURLsRefreshTimer = null;
     }
@@ -99,46 +97,36 @@ var gBrowserThumbnails = {
       case this.PREF_DISK_CACHE_SSL:
         this._sslDiskCacheEnabled =
           Services.prefs.getBoolPref(this.PREF_DISK_CACHE_SSL);
         break;
       case this.PREF_ACTIVITY_STREAM_ENABLED:
         this._activityStreamEnabled =
           Services.prefs.getBoolPref(this.PREF_ACTIVITY_STREAM_ENABLED);
         // Get the new top sites
-        XPCOMUtils.defineLazyGetter(this, "_topSiteURLs", getTopSiteURLs);
+        this.clearTopSiteURLCache();
         break;
     }
   },
 
-  /**
-   * clearTopSiteURLCache is only ever called if we've created an nsITimer,
-   * which only happens if we've loaded the tiles top sites. Therefore we only
-   * need to clear the tiles top sites (and not activity stream's top sites)
-   */
   clearTopSiteURLCache: function Thumbnails_clearTopSiteURLCache() {
     if (this._topSiteURLsRefreshTimer) {
       this._topSiteURLsRefreshTimer.cancel();
       this._topSiteURLsRefreshTimer = null;
     }
     // Delete the defined property
     delete this._topSiteURLs;
     XPCOMUtils.defineLazyGetter(this, "_topSiteURLs", getTopSiteURLs);
   },
 
   notify: function Thumbnails_notify(timer) {
     gBrowserThumbnails._topSiteURLsRefreshTimer = null;
     gBrowserThumbnails.clearTopSiteURLCache();
   },
 
-  async filterForThumbnailExpiration(aCallback) {
-    const topSites = await this._topSiteURLs;
-    aCallback(topSites);
-  },
-
   /**
    * State change progress listener for all tabs.
    */
   onStateChange: function Thumbnails_onStateChange(aBrowser, aWebProgress,
                                                    aRequest, aStateFlags, aStatus) {
     if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP &&
         aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK)
       this._delayedCapture(aBrowser);
@@ -207,28 +195,33 @@ var gBrowserThumbnails = {
     } else {
       // idle callback dispatched
       window.cancelIdleCallback(timeoutData.id);
     }
   }
 };
 
 async function getTopSiteURLs() {
+  // The _topSiteURLs getter can be expensive to run, but its return value can
+  // change frequently on new profiles, so as a compromise we cache its return
+  // value as a lazy getter for 1 minute every time it's called.
+  gBrowserThumbnails._topSiteURLsRefreshTimer =
+    Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+  gBrowserThumbnails._topSiteURLsRefreshTimer.initWithCallback(gBrowserThumbnails,
+                                                               60 * 1000,
+                                                               Ci.nsITimer.TYPE_ONE_SHOT);
   let sites = [];
   if (gBrowserThumbnails._activityStreamEnabled) {
-    sites = await NewTabUtils.activityStreamLinks.getTopSites();
+    // Get both the top sites returned by the query, and also any pinned sites
+    // that the user might have added manually that also need a screenshot.
+    // Also include top sites that don't have rich icons
+    let topSites = await NewTabUtils.activityStreamLinks.getTopSites();
+    sites.push(...topSites.filter(link => !(link.faviconSize >= 96)));
+    sites.push(...NewTabUtils.pinnedLinks.links);
   } else {
-    // The _topSiteURLs getter can be expensive to run, but its return value can
-    // change frequently on new profiles, so as a compromise we cache its return
-    // value as a lazy getter for 1 minute every time it's called.
-    gBrowserThumbnails._topSiteURLsRefreshTimer =
-      Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
-    gBrowserThumbnails._topSiteURLsRefreshTimer.initWithCallback(gBrowserThumbnails,
-                                                                 60 * 1000,
-                                                                 Ci.nsITimer.TYPE_ONE_SHOT);
     sites = NewTabUtils.links.getLinks();
   }
   return sites.reduce((urls, link) => {
     if (link) urls.push(link.url);
     return urls;
   }, []);
 }
 
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -255,17 +255,17 @@
 
           if (aTab.hidden)
             this.showTab(aTab);
 
           this.moveTabTo(aTab, this._numPinnedTabs);
           aTab.setAttribute("pinned", "true");
           this.tabContainer._unlockTabSizing();
           this.tabContainer._positionPinnedTabs();
-          this.tabContainer.adjustTabstrip();
+          this.tabContainer._updateCloseButtons();
 
           this.getBrowserForTab(aTab).messageManager.sendAsyncMessage("Browser:AppTab", { isAppTab: true })
 
           if (aTab.selected)
             this._setCloseKeyState(false);
 
           let event = document.createEvent("Events");
           event.initEvent("TabPinned", true, false);
@@ -279,17 +279,17 @@
           if (!aTab.pinned)
             return;
 
           this.moveTabTo(aTab, this._numPinnedTabs - 1);
           aTab.removeAttribute("pinned");
           aTab.style.marginInlineStart = "";
           this.tabContainer._unlockTabSizing();
           this.tabContainer._positionPinnedTabs();
-          this.tabContainer.adjustTabstrip();
+          this.tabContainer._updateCloseButtons();
 
           this.getBrowserForTab(aTab).messageManager.sendAsyncMessage("Browser:AppTab", { isAppTab: false })
 
           if (aTab.selected)
             this._setCloseKeyState(true);
 
           let event = document.createEvent("Events");
           event.initEvent("TabUnpinned", true, false);
@@ -3351,17 +3351,17 @@
               this._windowIsClosing = true;
               while (this._removingTabs.length)
                 this._endRemoveTab(this._removingTabs[0]);
             } else if (!this._windowIsClosing) {
               if (aNewTab)
                 focusAndSelectUrlBar();
 
               // workaround for bug 345399
-              this.tabContainer.mTabstrip._updateScrollButtonsDisabledState();
+              this.tabContainer.arrowScrollbox._updateScrollButtonsDisabledState();
             }
 
             // We're going to remove the tab and the browser now.
             this._tabFilters.delete(aTab);
             this._tabListeners.delete(aTab);
 
             var browser = this.getBrowserForTab(aTab);
 
@@ -3388,17 +3388,17 @@
             for (let i = aTab._tPos; i < this.tabs.length; i++)
               this.tabs[i]._tPos = i;
 
             if (!this._windowIsClosing) {
               if (wasPinned)
                 this.tabContainer._positionPinnedTabs();
 
               // update tab close buttons state
-              this.tabContainer.adjustTabstrip();
+              this.tabContainer._updateCloseButtons();
 
               setTimeout(function(tabs) {
                 tabs._lastTabClosedByMouse = false;
               }, 0, this.tabContainer);
             }
 
             // update tab positional properties and attributes
             this.selectedTab._selected = true;
@@ -3862,17 +3862,17 @@
       <method name="showTab">
         <parameter name="aTab"/>
         <body>
         <![CDATA[
           if (aTab.hidden) {
             aTab.removeAttribute("hidden");
             this._visibleTabs = null; // invalidate cache
 
-            this.tabContainer.adjustTabstrip();
+            this.tabContainer._updateCloseButtons();
 
             this.tabContainer._setPositionalAttributes();
 
             let event = document.createEvent("Events");
             event.initEvent("TabShow", true, false);
             aTab.dispatchEvent(event);
           }
         ]]>
@@ -3883,17 +3883,17 @@
         <parameter name="aTab"/>
         <body>
         <![CDATA[
           if (!aTab.hidden && !aTab.pinned && !aTab.selected &&
               !aTab.closing) {
             aTab.setAttribute("hidden", "true");
             this._visibleTabs = null; // invalidate cache
 
-            this.tabContainer.adjustTabstrip();
+            this.tabContainer._updateCloseButtons();
 
             this.tabContainer._setPositionalAttributes();
 
             let event = document.createEvent("Events");
             event.initEvent("TabHide", true, false);
             aTab.dispatchEvent(event);
           }
         ]]>
@@ -6398,17 +6398,17 @@
         <xul:spacer class="closing-tabs-spacer" anonid="closing-tabs-spacer"
                     style="width: 0;"/>
       </xul:arrowscrollbox>
     </content>
 
     <implementation implements="nsIDOMEventListener, nsIObserver">
       <constructor>
         <![CDATA[
-          this.mTabClipWidth = Services.prefs.getIntPref("browser.tabs.tabClipWidth");
+          this._tabClipWidth = Services.prefs.getIntPref("browser.tabs.tabClipWidth");
 
           let { restoreTabsButton } = this;
           restoreTabsButton.setAttribute("label", gTabBrowserBundle.GetStringFromName("tabs.restoreLastTabs"));
 
           var tab = this.firstChild;
           tab.label = gTabBrowserBundle.GetStringFromName("tabs.emptyTabTitle");
           tab.setAttribute("onerror", "this.removeAttribute('image');");
 
@@ -6435,17 +6435,17 @@
       <field name="tabbox" readonly="true">
         this.tabbrowser.mTabBox;
       </field>
 
       <field name="contextMenu" readonly="true">
         document.getElementById("tabContextMenu");
       </field>
 
-      <field name="mTabstrip">
+      <field name="arrowScrollbox">
         document.getAnonymousElementByAttribute(this, "anonid", "arrowscrollbox");
       </field>
 
       <field name="_firstTab">null</field>
       <field name="_lastTab">null</field>
       <field name="_beforeSelectedTab">null</field>
       <field name="_beforeHoveredTab">null</field>
       <field name="_afterHoveredTab">null</field>
@@ -6474,33 +6474,33 @@
           let {restoreTabsButton, restoreTabsButtonWrapperWidth, windowUtils} = this;
           let restoreTabsButtonWrapper = restoreTabsButton.parentNode;
 
           if (!restoreTabsButtonWrapper.getAttribute("session-exists")) {
             restoreTabsButtonWrapper.removeAttribute("shown");
             return;
           }
 
-          let tabstripWidth = this.mTabstrip.clientWidth;
+          let arrowScrollboxWidth = this.arrowScrollbox.clientWidth;
 
           let newTabButton = document.getAnonymousElementByAttribute(
             this, "anonid", "tabs-newtab-button");
 
           // If there are no pinned tabs it will multiply by 0 and result in 0
           let pinnedTabsWidth = windowUtils.getBoundsWithoutFlushing(this.firstChild).width * this._lastNumPinned;
 
           let numUnpinnedTabs = this.childNodes.length - this._lastNumPinned;
           let unpinnedTabsWidth = windowUtils.getBoundsWithoutFlushing(this.lastChild).width * numUnpinnedTabs;
 
           let tabbarUsedSpace = pinnedTabsWidth + unpinnedTabsWidth
             + windowUtils.getBoundsWithoutFlushing(newTabButton).width;
 
           // Subtract the elements' widths from the available space to ensure
           // that showing the restoreTabsButton won't cause any overflow.
-          if (tabstripWidth - tabbarUsedSpace > restoreTabsButtonWrapperWidth) {
+          if (arrowScrollboxWidth - tabbarUsedSpace > restoreTabsButtonWrapperWidth) {
             restoreTabsButtonWrapper.setAttribute("shown", "true");
           } else {
             restoreTabsButtonWrapper.removeAttribute("shown");
           }
         ]]></body>
       </method>
 
       <method name="observe">
@@ -6666,17 +6666,17 @@
           if (this.childNodes.length - this.tabbrowser._removingTabs.length == 1)
             this.visible = window.toolbar.visible;
           else
             this.visible = true;
         ]]></body>
       </method>
 
       <field name="_closeButtonsUpdatePending">false</field>
-      <method name="adjustTabstrip">
+      <method name="_updateCloseButtons">
         <body><![CDATA[
           // If we're overflowing, tabs are at their minimum widths.
           if (this.getAttribute("overflow") == "true") {
             this.setAttribute("closebuttons", "activetab");
             return;
           }
 
           if (this._closeButtonsUpdatePending) {
@@ -6701,31 +6701,31 @@
               // remove close buttons from background tabs so that people don't
               // accidentally close tabs by selecting them.
               let rect = ele => {
                 return window.QueryInterface(Ci.nsIInterfaceRequestor)
                              .getInterface(Ci.nsIDOMWindowUtils)
                              .getBoundsWithoutFlushing(ele);
               };
               let tab = this.tabbrowser.visibleTabs[this.tabbrowser._numPinnedTabs];
-              if (tab && rect(tab).width <= this.mTabClipWidth) {
+              if (tab && rect(tab).width <= this._tabClipWidth) {
                 this.setAttribute("closebuttons", "activetab");
               } else {
                 this.removeAttribute("closebuttons");
               }
             });
           });
         ]]></body>
       </method>
 
       <method name="_handleTabSelect">
         <parameter name="aInstant"/>
         <body><![CDATA[
           if (this.getAttribute("overflow") == "true")
-            this.mTabstrip.ensureElementIsVisible(this.selectedItem, aInstant);
+            this.arrowScrollbox.ensureElementIsVisible(this.selectedItem, aInstant);
 
           this.selectedItem._notselectedsinceload = false;
         ]]></body>
       </method>
 
       <field name="_closingTabsSpacer">
         document.getAnonymousElementByAttribute(this, "anonid", "closing-tabs-spacer");
       </field>
@@ -6748,17 +6748,17 @@
           if (!this._tabDefaultMaxWidth)
             this._tabDefaultMaxWidth =
               parseFloat(window.getComputedStyle(aTab).maxWidth);
           this._lastTabClosedByMouse = true;
 
           if (this.getAttribute("overflow") == "true") {
             // Don't need to do anything if we're in overflow mode and aren't scrolled
             // all the way to the right, or if we're closing the last tab.
-            if (isEndTab || !this.mTabstrip._scrollButtonDown.disabled)
+            if (isEndTab || !this.arrowScrollbox._scrollButtonDown.disabled)
               return;
 
             // If the tab has an owner that will become the active tab, the owner will
             // be to the left of it, so we actually want the left tab to slide over.
             // This can't be done as easily in non-overflow mode, so we don't bother.
             if (aTab.owner)
               return;
 
@@ -6833,20 +6833,20 @@
           var doPosition = this.getAttribute("overflow") == "true" &&
                            numPinned > 0;
 
           if (doPosition) {
             this.setAttribute("positionpinnedtabs", "true");
 
             let layoutData = this._pinnedTabsLayoutCache;
             if (!layoutData) {
-              let tabstrip = this.mTabstrip;
+              let arrowScrollbox = this.arrowScrollbox;
               layoutData = this._pinnedTabsLayoutCache = {
                 pinnedTabWidth: this.childNodes[0].getBoundingClientRect().width,
-                scrollButtonWidth: tabstrip._scrollButtonDown.getBoundingClientRect().width
+                scrollButtonWidth: arrowScrollbox._scrollButtonDown.getBoundingClientRect().width
               };
             }
 
             let width = 0;
             for (let i = numPinned - 1; i >= 0; i--) {
               let tab = this.childNodes[i];
               width += layoutData.pinnedTabWidth;
               tab.style.marginInlineStart = -(width + layoutData.scrollButtonWidth) + "px";
@@ -6903,17 +6903,17 @@
 
           // Move the dragged tab based on the mouse position.
 
           let leftTab = tabs[0];
           let rightTab = tabs[tabs.length - 1];
           let tabScreenX = draggedTab.boxObject.screenX;
           let translateX = screenX - draggedTab._dragData.screenX;
           if (!pinned)
-            translateX += this.mTabstrip._scrollbox.scrollLeft - draggedTab._dragData.scrollX;
+            translateX += this.arrowScrollbox._scrollbox.scrollLeft - draggedTab._dragData.scrollX;
           let leftBound = leftTab.boxObject.screenX - tabScreenX;
           let rightBound = (rightTab.boxObject.screenX + rightTab.boxObject.width) -
                            (tabScreenX + tabWidth);
           translateX = Math.max(translateX, leftBound);
           translateX = Math.min(translateX, rightBound);
           draggedTab.style.transform = "translateX(" + translateX + "px)";
           draggedTab._dragData.translateX = translateX;
 
@@ -6995,17 +6995,17 @@
               this.updateVisibility();
               TabsInTitlebar.init();
               break;
             case "resize":
               if (aEvent.target != window)
                 break;
 
               TabsInTitlebar.updateAppearance();
-              this.adjustTabstrip();
+              this._updateCloseButtons();
               this._handleTabSelect(true);
               this.updateSessionRestoreVisibility();
               break;
             case "mouseout":
               // If the "related target" (the node to which the pointer went) is not
               // a child of the current document, the mouse just left the window.
               let relatedTarget = aEvent.relatedTarget;
               if (relatedTarget && relatedTarget.ownerDocument == document)
@@ -7014,50 +7014,50 @@
               if (document.getElementById("tabContextMenu").state != "open")
                 this._unlockTabSizing();
               break;
           }
         ]]></body>
       </method>
 
       <field name="_animateElement">
-        this.mTabstrip._scrollButtonDown;
+        this.arrowScrollbox._scrollButtonDown;
       </field>
 
       <method name="_notifyBackgroundTab">
         <parameter name="aTab"/>
         <body><![CDATA[
           if (aTab.pinned || aTab.hidden)
             return;
 
-          var scrollRect = this.mTabstrip.scrollClientRect;
+          var scrollRect = this.arrowScrollbox.scrollClientRect;
           var tab = aTab.getBoundingClientRect();
 
           // DOMRect left/right properties are immutable.
           tab = {left: tab.left, right: tab.right};
 
           // Is the new tab already completely visible?
           if (scrollRect.left <= tab.left && tab.right <= scrollRect.right)
             return;
 
-          if (this.mTabstrip.smoothScroll) {
+          if (this.arrowScrollbox.smoothScroll) {
             let selected = !this.selectedItem.pinned &&
                            this.selectedItem.getBoundingClientRect();
 
             // Can we make both the new tab and the selected tab completely visible?
             if (!selected ||
                 Math.max(tab.right - selected.left, selected.right - tab.left) <=
                   scrollRect.width) {
-              this.mTabstrip.ensureElementIsVisible(aTab);
+              this.arrowScrollbox.ensureElementIsVisible(aTab);
               return;
             }
 
-            this.mTabstrip.scrollByPixels(this.mTabstrip._isRTLScrollbox ?
-                                          selected.right - scrollRect.right :
-                                          selected.left - scrollRect.left);
+            this.arrowScrollbox.scrollByPixels(this.arrowScrollbox._isRTLScrollbox ?
+                                                 selected.right - scrollRect.right :
+                                                 selected.left - scrollRect.left);
           }
 
           if (!this._animateElement.hasAttribute("highlight")) {
             this._animateElement.setAttribute("highlight", "true");
             setTimeout(function(ele) {
               ele.removeAttribute("highlight");
             }, 150, this._animateElement);
           }
@@ -7137,30 +7137,30 @@
       <method name="_handleNewTab">
         <parameter name="tab"/>
         <body><![CDATA[
           if (tab.parentNode != this)
             return;
           tab._fullyOpen = true;
           this.tabbrowser.tabAnimationsInProgress--;
 
-          this.adjustTabstrip();
+          this._updateCloseButtons();
 
           if (tab.getAttribute("selected") == "true") {
             this._handleTabSelect();
           } else if (!tab.hasAttribute("skipbackgroundnotify")) {
             this._notifyBackgroundTab(tab);
           }
 
           // XXXmano: this is a temporary workaround for bug 345399
           // We need to manually update the scroll buttons disabled state
           // if a tab was inserted to the overflow area or removed from it
           // without any scrolling and when the tabbar has already
           // overflowed.
-          this.mTabstrip._updateScrollButtonsDisabledState();
+          this.arrowScrollbox._updateScrollButtonsDisabledState();
 
           // Preload the next about:newtab if there isn't one already.
           this.tabbrowser._createPreloadBrowser();
         ]]></body>
       </method>
 
       <method name="_canAdvanceToTab">
         <parameter name="aTab"/>
@@ -7193,17 +7193,17 @@
       <handler event="transitionend"><![CDATA[
         if (event.propertyName != "max-width")
           return;
 
         var tab = event.target;
 
         if (tab.getAttribute("fadein") == "true") {
           if (tab._fullyOpen)
-            this.adjustTabstrip();
+            this._updateCloseButtons();
           else
             this._handleNewTab(tab);
         } else if (tab.closing) {
           this.tabbrowser._endRemoveTab(tab);
         }
       ]]></handler>
 
       <handler event="dblclick"><![CDATA[
@@ -7443,17 +7443,17 @@
         // relative to the corner of the dragged tab.
         function clientX(ele) {
           return ele.getBoundingClientRect().left;
         }
         let tabOffsetX = clientX(tab) - clientX(this);
         tab._dragData = {
           offsetX: event.screenX - window.screenX - tabOffsetX,
           offsetY: event.screenY - window.screenY,
-          scrollX: this.mTabstrip._scrollbox.scrollLeft,
+          scrollX: this.arrowScrollbox._scrollbox.scrollLeft,
           screenX: event.screenX
         };
 
         event.stopPropagation();
       ]]></handler>
 
       <handler event="dragover"><![CDATA[
         var effects = this._getDropEffectForTabDrag(event);
@@ -7461,35 +7461,35 @@
         var ind = this._tabDropIndicator;
         if (effects == "" || effects == "none") {
           ind.collapsed = true;
           return;
         }
         event.preventDefault();
         event.stopPropagation();
 
-        var tabStrip = this.mTabstrip;
+        var arrowScrollbox = this.arrowScrollbox;
         var ltr = (window.getComputedStyle(this).direction == "ltr");
 
         // autoscroll the tab strip if we drag over the scroll
         // buttons, even if we aren't dragging a tab, but then
         // return to avoid drawing the drop indicator
         var pixelsToScroll = 0;
         if (this.getAttribute("overflow") == "true") {
           var targetAnonid = event.originalTarget.getAttribute("anonid");
           switch (targetAnonid) {
             case "scrollbutton-up":
-              pixelsToScroll = tabStrip.scrollIncrement * -1;
+              pixelsToScroll = arrowScrollbox.scrollIncrement * -1;
               break;
             case "scrollbutton-down":
-              pixelsToScroll = tabStrip.scrollIncrement;
+              pixelsToScroll = arrowScrollbox.scrollIncrement;
               break;
           }
           if (pixelsToScroll)
-            tabStrip.scrollByPixels((ltr ? 1 : -1) * pixelsToScroll, true);
+            arrowScrollbox.scrollByPixels((ltr ? 1 : -1) * pixelsToScroll, true);
         }
 
         if (effects == "move" &&
             this == event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0).parentNode) {
           ind.collapsed = true;
           this._animateTabMove(event);
           return;
         }
@@ -7503,22 +7503,22 @@
               this._dragTime = Date.now();
             if (Date.now() >= this._dragTime + this._dragOverDelay)
               this.selectedItem = tab;
             ind.collapsed = true;
             return;
           }
         }
 
-        var rect = tabStrip.getBoundingClientRect();
+        var rect = arrowScrollbox.getBoundingClientRect();
         var newMargin;
         if (pixelsToScroll) {
           // if we are scrolling, put the drop indicator at the edge
           // so that it doesn't jump while scrolling
-          let scrollRect = tabStrip.scrollClientRect;
+          let scrollRect = arrowScrollbox.scrollClientRect;
           let minMargin = scrollRect.left - rect.left;
           let maxMargin = Math.min(minMargin + scrollRect.width,
                                    scrollRect.right);
           if (!ltr)
             [minMargin, maxMargin] = [this.clientWidth - maxMargin,
                                       this.clientWidth - minMargin];
           newMargin = (pixelsToScroll > 0) ? maxMargin : minMargin;
         } else {
@@ -7666,17 +7666,17 @@
         }
 
         // Disable detach within the browser toolbox
         var eX = event.screenX;
         var eY = event.screenY;
         var wX = window.screenX;
         // check if the drop point is horizontally within the window
         if (eX > wX && eX < (wX + window.outerWidth)) {
-          let bo = this.mTabstrip.boxObject;
+          let bo = this.arrowScrollbox.boxObject;
           // also avoid detaching if the the tab was dropped too close to
           // the tabbar (half a tab)
           let endScreenY = bo.screenY + 1.5 * bo.height;
           if (eY < endScreenY && eY > window.screenY)
             return;
         }
 
         // screen.availLeft et. al. only check the screen that this window is on,
@@ -8245,26 +8245,26 @@
           var tabContainer = gBrowser.tabContainer;
           // We don't want menu item decoration unless there is overflow.
           if (tabContainer.getAttribute("overflow") != "true") {
             return;
           }
 
           let windowUtils = window.QueryInterface(Ci.nsIInterfaceRequestor)
                                   .getInterface(Ci.nsIDOMWindowUtils);
-          let tabstripRect = windowUtils.getBoundsWithoutFlushing(tabContainer.mTabstrip);
+          let arrowScrollboxRect = windowUtils.getBoundsWithoutFlushing(tabContainer.arrowScrollbox);
           for (let menuitem of this.childNodes) {
             let curTab = menuitem.tab;
             if (!curTab) {
               // "Undo close tab", menuseparator, or entries put here by addons.
               continue;
             }
             let curTabRect = windowUtils.getBoundsWithoutFlushing(curTab);
-            if (curTabRect.left >= tabstripRect.left &&
-                curTabRect.right <= tabstripRect.right) {
+            if (curTabRect.left >= arrowScrollboxRect.left &&
+                curTabRect.right <= arrowScrollboxRect.right) {
               menuitem.setAttribute("tabIsVisible", "true");
             } else {
               menuitem.removeAttribute("tabIsVisible");
             }
           }
         ]]></body>
       </method>
 
--- a/browser/base/content/test/performance/browser.ini
+++ b/browser/base/content/test/performance/browser.ini
@@ -14,12 +14,12 @@ skip-if = !e10s
 [browser_tabopen_reflows.js]
 [browser_tabopen_squeeze_reflows.js]
 [browser_tabstrip_overflow_underflow_reflows.js]
 [browser_tabswitch_reflows.js]
 [browser_toolbariconcolor_restyles.js]
 [browser_urlbar_keyed_search_reflows.js]
 skip-if = (os == 'linux') || (os == 'win' && debug) # Disabled on Linux and Windows debug due to perma failures. Bug 1392320.
 [browser_urlbar_search_reflows.js]
-skip-if = (os == 'linux') || (os == 'mac' && !debug) # Disabled on Linux and OS X opt due to frequent failures. Bug 1385932 and Bug 1384582
+skip-if = (os == 'linux') # Disabled on Linux and OS X opt due to frequent failures. Bug 1385932
 [browser_windowclose_reflows.js]
 [browser_windowopen_reflows.js]
 skip-if = os == 'linux' # Disabled due to frequent failures. Bug 1380465.
--- a/browser/base/content/test/performance/browser_tabstrip_overflow_underflow_reflows.js
+++ b/browser/base/content/test/performance/browser_tabstrip_overflow_underflow_reflows.js
@@ -41,17 +41,17 @@ add_task(async function() {
 
   await withReflowObserver(async function(dirtyFrame) {
     let switchDone = BrowserTestUtils.waitForEvent(window, "TabSwitchDone");
     BrowserOpenTab();
     await BrowserTestUtils.waitForEvent(gBrowser.selectedTab, "transitionend",
         false, e => e.propertyName === "max-width");
     await switchDone;
     await BrowserTestUtils.waitForCondition(() => {
-      return gBrowser.tabContainer.mTabstrip.hasAttribute("scrolledtoend");
+      return gBrowser.tabContainer.arrowScrollbox.hasAttribute("scrolledtoend");
     });
   }, EXPECTED_OVERFLOW_REFLOWS, window);
 
   await withReflowObserver(async function() {
     let switchDone = BrowserTestUtils.waitForEvent(window, "TabSwitchDone");
     let transitionPromise =
       BrowserTestUtils.waitForEvent(gBrowser.selectedTab,
                                     "transitionend", false,
--- a/browser/base/content/test/performance/browser_urlbar_search_reflows.js
+++ b/browser/base/content/test/performance/browser_urlbar_search_reflows.js
@@ -109,20 +109,20 @@ const EXPECTED_REFLOWS_SECOND_OPEN = [
       "_openAutocompletePopup@chrome://browser/content/urlbarBindings.xml",
       "openAutocompletePopup@chrome://browser/content/urlbarBindings.xml",
       "openPopup@chrome://global/content/bindings/autocomplete.xml",
       "set_popupOpen@chrome://global/content/bindings/autocomplete.xml",
     ],
   },
 ];
 
-const SEARCH_TERM = "urlbar-reflows";
+const SEARCH_TERM = "urlbar-reflows-" + Date.now();
 
 add_task(async function setup() {
-  await addDummyHistoryEntries();
+  await addDummyHistoryEntries(SEARCH_TERM);
 });
 
 /**
  * This test ensures that there are no unexpected
  * uninterruptible reflows when typing into the URL bar
  * with the default values in Places.
  */
 add_task(async function() {
--- a/browser/base/content/test/performance/head.js
+++ b/browser/base/content/test/performance/head.js
@@ -1,10 +1,12 @@
 "use strict";
 
+XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
+  "resource://gre/modules/PlacesUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PlacesTestUtils",
   "resource://testing-common/PlacesTestUtils.jsm");
 
 /**
  * Async utility function for ensuring that no unexpected uninterruptible
  * reflows occur during some period of time in a window.
  *
  * @param testFn (async function)
@@ -193,17 +195,17 @@ async function ensureNoPreloadedBrowser(
  *         tabstrip without causing it to overflow.
  */
 function computeMaxTabCount() {
   let currentTabCount = gBrowser.tabs.length;
   let newTabButton =
     document.getAnonymousElementByAttribute(gBrowser.tabContainer,
                                             "anonid", "tabs-newtab-button");
   let newTabRect = newTabButton.getBoundingClientRect();
-  let tabStripRect = gBrowser.tabContainer.mTabstrip.getBoundingClientRect();
+  let tabStripRect = gBrowser.tabContainer.arrowScrollbox.getBoundingClientRect();
   let availableTabStripWidth = tabStripRect.width - newTabRect.width;
 
   let tabMinWidth =
     parseInt(getComputedStyle(gBrowser.selectedTab, null).minWidth, 10);
 
   let maxTabCount = Math.floor(availableTabStripWidth / tabMinWidth) - currentTabCount;
   Assert.ok(maxTabCount > 0,
             "Tabstrip needs to be wide enough to accomodate at least 1 more tab " +
@@ -243,27 +245,30 @@ async function removeAllButFirstTab() {
   gBrowser.removeAllTabsBut(gBrowser.tabs[0]);
   await BrowserTestUtils.waitForCondition(() => gBrowser.tabs.length == 1);
   await SpecialPowers.popPrefEnv();
 }
 
 /**
  * Adds some entries to the Places database so that we can
  * do semi-realistic look-ups in the URL bar.
+ *
+ * @param searchStr (string)
+ *        Optional text to add to the search history items.
  */
-async function addDummyHistoryEntries() {
-  await PlacesTestUtils.clearHistory();
+async function addDummyHistoryEntries(searchStr = "") {
+  await PlacesUtils.history.clear();
   const NUM_VISITS = 10;
   let visits = [];
 
   for (let i = 0; i < NUM_VISITS; ++i) {
     visits.push({
       uri: `http://example.com/urlbar-reflows-${i}`,
-      title: `Reflow test for URL bar entry #${i}`,
+      title: `Reflow test for URL bar entry #${i} - ${searchStr}`,
     });
   }
 
   await PlacesTestUtils.addVisits(visits);
 
   registerCleanupFunction(async function() {
-    await PlacesTestUtils.clearHistory();
+    await PlacesUtils.history.clear();
   });
 }
--- a/browser/base/content/test/static/browser_misused_characters_in_strings.js
+++ b/browser/base/content/test/static/browser_misused_characters_in_strings.js
@@ -143,16 +143,20 @@ let gWhitelist = [{
   }, {
     file: "aboutNetworking.dtd",
     key: "aboutNetworking.logTutorial",
     type: "single-quote"
   }, {
     file: "preferences.properties",
     key: "searchResults.needHelp2",
     type: "double-quote"
+  }, {
+    file: "aboutdevtools.dtd",
+    key: "aboutDevtools.newsletter.privacy.label",
+    type: "single-quote"
   }
 ];
 
 /**
  * Check if an error should be ignored due to matching one of the whitelist
  * objects defined in gWhitelist.
  *
  * @param filepath The URI spec of the locale file
--- a/browser/base/content/test/tabs/browser_overflowScroll.js
+++ b/browser/base/content/test/tabs/browser_overflowScroll.js
@@ -2,56 +2,56 @@
 
 requestLongerTimeout(2);
 
 /**
  * Tests that scrolling the tab strip via the scroll buttons scrolls the right
  * amount in non-smoothscroll mode.
  */
 add_task(async function() {
-  let tabstrip = gBrowser.tabContainer.mTabstrip;
-  let scrollbox = tabstrip._scrollbox;
-  let originalSmoothScroll = tabstrip.smoothScroll;
+  let arrowScrollbox = gBrowser.tabContainer.arrowScrollbox;
+  let scrollbox = arrowScrollbox._scrollbox;
+  let originalSmoothScroll = arrowScrollbox.smoothScroll;
   let tabs = gBrowser.tabs;
   let tabMinWidth = parseInt(getComputedStyle(gBrowser.selectedTab, null).minWidth);
 
   let rect = ele => ele.getBoundingClientRect();
   let width = ele => rect(ele).width;
 
-  let tabCountForOverflow = Math.ceil(width(tabstrip) / tabMinWidth * 3);
+  let tabCountForOverflow = Math.ceil(width(arrowScrollbox) / tabMinWidth * 3);
 
   let left = ele => rect(ele).left;
   let right = ele => rect(ele).right;
   let isLeft = (ele, msg) => is(left(ele), left(scrollbox), msg);
   let isRight = (ele, msg) => is(right(ele), right(scrollbox), msg);
-  let elementFromPoint = x => tabstrip._elementFromPoint(x);
+  let elementFromPoint = x => arrowScrollbox._elementFromPoint(x);
   let nextLeftElement = () => elementFromPoint(left(scrollbox) - 1);
   let nextRightElement = () => elementFromPoint(right(scrollbox) + 1);
   let firstScrollable = () => tabs[gBrowser._numPinnedTabs];
 
-  tabstrip.smoothScroll = false;
+  arrowScrollbox.smoothScroll = false;
   registerCleanupFunction(() => {
-    tabstrip.smoothScroll = originalSmoothScroll;
+    arrowScrollbox.smoothScroll = originalSmoothScroll;
   });
 
   while (tabs.length < tabCountForOverflow) {
     BrowserTestUtils.addTab(gBrowser, "about:blank", { skipAnimation: true });
   }
 
   gBrowser.pinTab(tabs[0]);
 
   await BrowserTestUtils.waitForCondition(() => {
     return Array.from(gBrowser.tabs).every(tab => tab._fullyOpen);
   });
 
   ok(!scrollbox.hasAttribute("notoverflowing"),
      "Tab strip should be overflowing");
 
-  let upButton = tabstrip._scrollButtonUp;
-  let downButton = tabstrip._scrollButtonDown;
+  let upButton = arrowScrollbox._scrollButtonUp;
+  let downButton = arrowScrollbox._scrollButtonDown;
   let element;
 
   gBrowser.selectedTab = firstScrollable();
   ok(left(scrollbox) <= left(firstScrollable()), "Selecting the first tab scrolls it into view " +
      "(" + left(scrollbox) + " <= " + left(firstScrollable()) + ")");
 
   element = nextRightElement();
   EventUtils.synthesizeMouseAtCenter(downButton, {});
--- a/browser/components/extensions/ext-sidebarAction.js
+++ b/browser/components/extensions/ext-sidebarAction.js
@@ -136,26 +136,16 @@ this.sidebarAction = class extends Exten
     let install = this.extension.startupReason === "ADDON_INSTALL";
     for (let window of windowTracker.browserWindows()) {
       this.updateWindow(window);
       let {SidebarUI} = window;
       if (install || SidebarUI.lastOpenedId == this.id) {
         SidebarUI.show(this.id);
       }
     }
-
-    if (install && !Services.prefs.prefHasUserValue("extensions.sidebar-button.shown")) {
-      Services.prefs.setBoolPref("extensions.sidebar-button.shown", true);
-      // If the sidebar button has never been moved to the toolbar, move it now
-      // so the user can see/access the sidebars.
-      let widget = CustomizableUI.getWidget("sidebar-button");
-      if (!widget.areaType) {
-        CustomizableUI.addWidgetToArea("sidebar-button", CustomizableUI.AREA_NAVBAR, 0);
-      }
-    }
   }
 
   sidebarUrl(panel) {
     let url = `${sidebarURL}?panel=${encodeURIComponent(panel)}`;
 
     if (this.extension.remote) {
       url += "&remote=1";
     }
--- a/browser/components/extensions/test/browser/browser_ext_sidebarAction.js
+++ b/browser/components/extensions/test/browser/browser_ext_sidebarAction.js
@@ -46,37 +46,29 @@ let extData = {
 
 add_task(async function sidebar_initial_install() {
   ok(document.getElementById("sidebar-box").hidden, "sidebar box is not visible");
   let extension = ExtensionTestUtils.loadExtension(extData);
   await extension.startup();
   // Test sidebar is opened on install
   await extension.awaitMessage("sidebar");
   ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");
-  // Test toolbar button is available
-  ok(document.getElementById("sidebar-button"), "sidebar button is in UI");
 
   await extension.unload();
   // Test that the sidebar was closed on unload.
   ok(document.getElementById("sidebar-box").hidden, "sidebar box is not visible");
-
-  // Move toolbar button back to customization.
-  CustomizableUI.removeWidgetFromArea("sidebar-button", CustomizableUI.AREA_NAVBAR);
-  ok(!document.getElementById("sidebar-button"), "sidebar button is not in UI");
 });
 
 
 add_task(async function sidebar_two_sidebar_addons() {
   let extension2 = ExtensionTestUtils.loadExtension(extData);
   await extension2.startup();
   // Test sidebar is opened on install
   await extension2.awaitMessage("sidebar");
   ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");
-  // Test toolbar button is NOT available after first install
-  ok(!document.getElementById("sidebar-button"), "sidebar button is not in UI");
 
   // Test second sidebar install opens new sidebar
   let extension3 = ExtensionTestUtils.loadExtension(extData);
   await extension3.startup();
   // Test sidebar is opened on install
   await extension3.awaitMessage("sidebar");
   ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible");
   await extension3.unload();
@@ -92,13 +84,8 @@ add_task(async function sidebar_empty_pa
   await extension.startup();
   // Test sidebar is opened on install
   await extension.awaitMessage("sidebar");
   ok(!document.getElementById("sidebar-box").hidden, "sidebar box is visible in first window");
   extension.sendMessage("set-panel");
   await extension.awaitFinish();
   await extension.unload();
 });
-
-add_task(async function cleanup() {
-  // This is set on initial sidebar install.
-  Services.prefs.clearUserPref("extensions.sidebar-button.shown");
-});
--- a/browser/components/migration/MigrationUtils.jsm
+++ b/browser/components/migration/MigrationUtils.jsm
@@ -30,16 +30,18 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 XPCOMUtils.defineLazyModuleGetter(this, "ResponsivenessMonitor",
                                   "resource://gre/modules/ResponsivenessMonitor.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "Sqlite",
                                   "resource://gre/modules/Sqlite.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "TelemetryStopwatch",
                                   "resource://gre/modules/TelemetryStopwatch.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "WindowsRegistry",
                                   "resource://gre/modules/WindowsRegistry.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "setTimeout",
+                                  "resource://gre/modules/Timer.jsm");
 
 var gMigrators = null;
 var gProfileStartup = null;
 var gMigrationBundle = null;
 var gPreviousDefaultBrowserKey = "";
 
 let gKeepUndoData = false;
 let gUndoData = null;
new file mode 100644
--- /dev/null
+++ b/browser/components/migration/tests/unit/test_MigrationUtils_timedRetry.js
@@ -0,0 +1,26 @@
+"use strict";
+
+XPCOMUtils.defineLazyModuleGetter(this, "OS",
+                                  "resource://gre/modules/osfile.jsm");
+
+let tmpFile = FileUtils.getDir("TmpD", [], true);
+let dbConn;
+
+add_task(async function setup() {
+  tmpFile.append("TestDB");
+  dbConn = await Sqlite.openConnection({ path: tmpFile.path });
+
+  do_register_cleanup(() => {
+    dbConn.close();
+    OS.File.remove(tmpFile.path);
+  });
+});
+
+add_task(async function testgetRowsFromDBWithoutLocksRetries() {
+  let promise = MigrationUtils.getRowsFromDBWithoutLocks(tmpFile.path,
+                                                         "Temp DB",
+                                                         "SELECT * FROM moz_temp_table");
+  await new Promise(resolve => do_timeout(50, resolve));
+  dbConn.execute("CREATE TABLE moz_temp_table (id INTEGER PRIMARY KEY)");
+  await promise;
+});
--- a/browser/components/migration/tests/unit/xpcshell.ini
+++ b/browser/components/migration/tests/unit/xpcshell.ini
@@ -18,10 +18,11 @@ skip-if = os != "win"
 skip-if = os != "win"
 [test_fx_telemetry.js]
 [test_IE_bookmarks.js]
 skip-if = !(os == "win" && bits == 64) # bug 1392396
 [test_IE_cookies.js]
 skip-if = os != "win"
 [test_IE7_passwords.js]
 skip-if = os != "win"
+[test_MigrationUtils_timedRetry.js]
 [test_Safari_bookmarks.js]
 skip-if = os != "mac"
--- a/browser/components/places/tests/browser/browser_library_left_pane_middleclick.js
+++ b/browser/components/places/tests/browser/browser_library_left_pane_middleclick.js
@@ -2,190 +2,86 @@
 /* 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/. */
 
  /**
  * Tests middle-clicking items in the Library.
  */
 
-const ENABLE_HISTORY_PREF = "places.history.enabled";
+const URIs = ["about:license", "about:"];
 
 var gLibrary = null;
-var gTests = [];
-var gCurrentTest = null;
 
-// Listener for TabOpen and tabs progress.
-var gTabsListener = {
-  _loadedURIs: [],
-  _openTabsCount: 0,
-
-  handleEvent(aEvent) {
-    if (aEvent.type != "TabOpen")
-      return;
-
-    if (++this._openTabsCount == gCurrentTest.URIs.length) {
-      is(gBrowser.tabs.length, gCurrentTest.URIs.length + 1,
-         "We have opened " + gCurrentTest.URIs.length + " new tab(s)");
-    }
-
-    var tab = aEvent.target;
-    is(tab.ownerGlobal, window,
-       "Tab has been opened in current browser window");
-  },
-
-  onLocationChange(aBrowser, aWebProgress, aRequest, aLocationURI,
-                             aFlags) {
-    var spec = aLocationURI.spec;
-    ok(true, spec);
-    // When a new tab is opened, location is first set to "about:blank", so
-    // we can ignore those calls.
-    // Ignore multiple notifications for the same URI too.
-    if (spec == "about:blank" || this._loadedURIs.includes(spec))
-      return;
-
-    ok(gCurrentTest.URIs.includes(spec),
-       "Opened URI found in list: " + spec);
-
-    if (gCurrentTest.URIs.includes(spec))
-      this._loadedURIs.push(spec);
-
-    if (this._loadedURIs.length == gCurrentTest.URIs.length) {
-      // We have correctly opened all URIs.
-
-      // Reset arrays.
-      this._loadedURIs.length = 0;
-
-      this._openTabsCount = 0;
-
-      executeSoon(function() {
-        // Close all tabs.
-        while (gBrowser.tabs.length > 1)
-          gBrowser.removeCurrentTab();
-
-        // Test finished.  This will move to the next one.
-        waitForFocus(gCurrentTest.finish, gBrowser.ownerGlobal);
-      });
-    }
-  }
-};
-
-// ------------------------------------------------------------------------------
-// Open a folder in tabs.
-
-gTests.push({
-  desc: "Open a folder in tabs.",
-  URIs: ["about:buildconfig", "about:"],
-  _folderId: -1,
-
-  setup() {
-    var bs = PlacesUtils.bookmarks;
-    // Create a new folder.
-    var folderId = bs.createFolder(bs.unfiledBookmarksFolder,
-                                   "Folder",
-                                   bs.DEFAULT_INDEX);
-    this._folderId = folderId;
-
-    // Add bookmarks in folder.
-    this.URIs.forEach(function(aURI) {
-      bs.insertBookmark(folderId,
-                        PlacesUtils._uri(aURI),
-                        bs.DEFAULT_INDEX,
-                        "Title");
-    });
-
-    // Select unsorted bookmarks root in the left pane.
-    gLibrary.PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
-    isnot(gLibrary.PlacesOrganizer._places.selectedNode, null,
-          "We correctly have selection in the Library left pane");
-    // Get our bookmark in the right pane.
-    var folderNode = gLibrary.ContentTree.view.view.nodeForTreeIndex(0);
-    is(folderNode.title, "Folder", "Found folder in the right pane");
-  },
-
-  finish() {
-    setTimeout(runNextTest, 0);
-  },
-
-  cleanup() {
-    PlacesUtils.bookmarks.removeItem(this._folderId);
-  }
-});
-
-// ------------------------------------------------------------------------------
-
-function test() {
-  waitForExplicitFinish();
-
-  // Sanity checks.
-  ok(PlacesUtils, "PlacesUtils in context");
-  ok(PlacesUIUtils, "PlacesUIUtils in context");
-
-  // Add tabs listeners.
-  gBrowser.tabContainer.addEventListener("TabOpen", gTabsListener);
-  gBrowser.addTabsProgressListener(gTabsListener);
-
+add_task(async function test_setup() {
   // Temporary disable history, so we won't record pages navigation.
-  gPrefService.setBoolPref(ENABLE_HISTORY_PREF, false);
+  await SpecialPowers.pushPrefEnv({set: [
+    ["places.history.enabled", false]
+  ]});
 
   // Open Library window.
-  openLibrary(function(library) {
-    gLibrary = library;
-    // Kick off tests.
-    runNextTest();
-  });
-}
-
-function runNextTest() {
-  // Cleanup from previous test.
-  if (gCurrentTest)
-    gCurrentTest.cleanup();
+  gLibrary = await promiseLibrary();
 
-  if (gTests.length > 0) {
-    // Goto next test.
-    gCurrentTest = gTests.shift();
-    info("Start of test: " + gCurrentTest.desc);
-    // Test setup will set Library so that the bookmark to be opened is the
-    // first node in the content (right pane) tree.
-    gCurrentTest.setup();
-
-    gLibrary.focus();
-    waitForFocus(function() {
-      // Open the "Other Bookmarks" folder.
-      gLibrary.PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
-      gLibrary.PlacesOrganizer._places.selectedNode.containerOpen = true;
-      // Now middle-click on the bookmark contained with it.
-      let bookmarkedNode = gLibrary.PlacesOrganizer._places.selectedNode.getChild(0);
-      mouseEventOnCell(gLibrary.PlacesOrganizer._places,
-        gLibrary.PlacesOrganizer._places.view.treeIndexForNode(bookmarkedNode),
-        0,
-        { button: 1 });
-    }, gLibrary);
-  } else {
-    // No more tests.
-
+  registerCleanupFunction(async () => {
     // We must close "Other Bookmarks" ready for other tests.
     gLibrary.PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
     gLibrary.PlacesOrganizer._places.selectedNode.containerOpen = false;
 
+    await PlacesUtils.bookmarks.eraseEverything();
+
     // Close Library window.
-    gLibrary.close();
+    await promiseLibraryClosed(gLibrary);
+  });
+});
 
-    // Remove tabs listeners.
-    gBrowser.tabContainer.removeEventListener("TabOpen", gTabsListener);
-    gBrowser.removeTabsProgressListener(gTabsListener);
+add_task(async function test_open_folder_in_tabs() {
+  let children = URIs.map(url => {
+    return {
+      title: "Title",
+      url
+    }
+  });
+
+  // Create a new folder.
+  await PlacesUtils.bookmarks.insertTree({
+    guid: PlacesUtils.bookmarks.unfiledGuid,
+    children: [{
+      title: "Folder",
+      type: PlacesUtils.bookmarks.TYPE_FOLDER,
+      children,
+    }],
+  });
 
-    // Restore history.
-    try {
-      gPrefService.clearUserPref(ENABLE_HISTORY_PREF);
-    } catch (ex) {}
+  // Select unsorted bookmarks root in the left pane.
+  gLibrary.PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
+  Assert.notEqual(gLibrary.PlacesOrganizer._places.selectedNode, null,
+        "We correctly have selection in the Library left pane");
+
+  // Get our bookmark in the right pane.
+  var folderNode = gLibrary.ContentTree.view.view.nodeForTreeIndex(0);
+  Assert.equal(folderNode.title, "Folder", "Found folder in the right pane");
+
+  gLibrary.PlacesOrganizer._places.selectedNode.containerOpen = true;
 
-    finish();
-  }
-}
+  // Now middle-click on the bookmark contained with it.
+  let promiseLoaded = Promise.all(URIs.map(uri =>
+    BrowserTestUtils.waitForNewTab(gBrowser, uri, false, true)));
+
+  let bookmarkedNode = gLibrary.PlacesOrganizer._places.selectedNode.getChild(0);
+  mouseEventOnCell(gLibrary.PlacesOrganizer._places,
+    gLibrary.PlacesOrganizer._places.view.treeIndexForNode(bookmarkedNode),
+    0,
+    { button: 1 });
+
+  let tabs = await promiseLoaded;
+
+  Assert.ok(true, "Expected tabs were loaded");
+
+  await Promise.all(tabs.map(tab => BrowserTestUtils.removeTab(tab)));
+});
 
 function mouseEventOnCell(aTree, aRowIndex, aColumnIndex, aEventDetails) {
   var selection = aTree.view.selection;
   selection.select(aRowIndex);
   aTree.treeBoxObject.ensureRowIsVisible(aRowIndex);
   var column = aTree.columns[aColumnIndex];
 
   // get cell coordinates
--- a/browser/components/places/tests/browser/browser_library_middleclick.js
+++ b/browser/components/places/tests/browser/browser_library_middleclick.js
@@ -2,272 +2,205 @@
 /* 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/. */
 
  /**
  * Tests middle-clicking items in the Library.
  */
 
-const ENABLE_HISTORY_PREF = "places.history.enabled";
+const URIs = ["about:license", "about:"];
 
 var gLibrary = null;
 var gTests = [];
-var gCurrentTest = null;
 
-// Listener for TabOpen and tabs progress.
-var gTabsListener = {
-  _loadedURIs: [],
-  _openTabsCount: 0,
+add_task(async function test_setup() {
+  // Increase timeout, this test can be quite slow due to waitForFocus calls.
+  requestLongerTimeout(2);
 
-  handleEvent(aEvent) {
-    if (aEvent.type != "TabOpen")
-      return;
+  // Temporary disable history, so we won't record pages navigation.
+  await SpecialPowers.pushPrefEnv({set: [
+    ["places.history.enabled", false]
+  ]});
 
-    if (++this._openTabsCount == gCurrentTest.URIs.length) {
-      is(gBrowser.tabs.length, gCurrentTest.URIs.length + 1,
-         "We have opened " + gCurrentTest.URIs.length + " new tab(s)");
-    }
-
-    var tab = aEvent.target;
-    is(tab.ownerGlobal, window,
-       "Tab has been opened in current browser window");
-  },
+  // Ensure the database is empty.
+  await PlacesUtils.bookmarks.eraseEverything();
 
-  onLocationChange(aBrowser, aWebProgress, aRequest, aLocationURI,
-                             aFlags) {
-    var spec = aLocationURI.spec;
-    ok(true, spec);
-    // When a new tab is opened, location is first set to "about:blank", so
-    // we can ignore those calls.
-    // Ignore multiple notifications for the same URI too.
-    if (spec == "about:blank" || this._loadedURIs.includes(spec))
-      return;
-
-    ok(gCurrentTest.URIs.includes(spec),
-       "Opened URI found in list: " + spec);
-
-    if (gCurrentTest.URIs.includes(spec))
-      this._loadedURIs.push(spec);
-
-    if (this._loadedURIs.length == gCurrentTest.URIs.length) {
-      // We have correctly opened all URIs.
+  // Open Library window.
+  gLibrary = await promiseLibrary();
 
-      // Reset arrays.
-      this._loadedURIs.length = 0;
-
-      this._openTabsCount = 0;
-
-      executeSoon(function() {
-        // Close all tabs.
-        while (gBrowser.tabs.length > 1)
-          gBrowser.removeCurrentTab();
+  registerCleanupFunction(async () => {
+    // We must close "Other Bookmarks" ready for other tests.
+    gLibrary.PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
+    gLibrary.PlacesOrganizer._places.selectedNode.containerOpen = false;
 
-        // Test finished.  This will move to the next one.
-        waitForFocus(gCurrentTest.finish, gBrowser.ownerGlobal);
-      });
-    }
-  }
-};
+    await PlacesUtils.bookmarks.eraseEverything();
 
-// ------------------------------------------------------------------------------
-// Open bookmark in a new tab.
+    // Close Library window.
+    await promiseLibraryClosed(gLibrary);
+  });
+});
 
 gTests.push({
   desc: "Open bookmark in a new tab.",
   URIs: ["about:buildconfig"],
-  _itemId: -1,
+  _bookmark: null,
 
-  setup() {
-    var bs = PlacesUtils.bookmarks;
+  async setup() {
     // Add a new unsorted bookmark.
-    this._itemId = bs.insertBookmark(bs.unfiledBookmarksFolder,
-                                     PlacesUtils._uri(this.URIs[0]),
-                                     bs.DEFAULT_INDEX,
-                                     "Title");
+    this._bookmark = await PlacesUtils.bookmarks.insert({
+      parentGuid: PlacesUtils.bookmarks.unfiledGuid,
+      title: "Title",
+      url: this.URIs[0],
+    });
+
     // Select unsorted bookmarks root in the left pane.
     gLibrary.PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
-    isnot(gLibrary.PlacesOrganizer._places.selectedNode, null,
-          "We correctly have selection in the Library left pane");
+    Assert.notEqual(gLibrary.PlacesOrganizer._places.selectedNode, null,
+      "We correctly have selection in the Library left pane");
+
     // Get our bookmark in the right pane.
     var bookmarkNode = gLibrary.ContentTree.view.view.nodeForTreeIndex(0);
-    is(bookmarkNode.uri, this.URIs[0], "Found bookmark in the right pane");
+    Assert.equal(bookmarkNode.uri, this.URIs[0], "Found bookmark in the right pane");
   },
 
-  finish() {
-    setTimeout(runNextTest, 0);
-  },
-
-  cleanup() {
-    PlacesUtils.bookmarks.removeItem(this._itemId);
+  async cleanup() {
+    await PlacesUtils.bookmarks.remove(this._bookmark);
   }
 });
 
 // ------------------------------------------------------------------------------
 // Open a folder in tabs.
-
+//
 gTests.push({
   desc: "Open a folder in tabs.",
   URIs: ["about:buildconfig", "about:"],
-  _folderId: -1,
+  _bookmarks: null,
 
-  setup() {
-    var bs = PlacesUtils.bookmarks;
+  async setup() {
     // Create a new folder.
-    var folderId = bs.createFolder(bs.unfiledBookmarksFolder,
-                                   "Folder",
-                                   bs.DEFAULT_INDEX);
-    this._folderId = folderId;
+    let children = this.URIs.map(url => {
+      return {
+        title: "Title",
+        url,
+      }
+    });
 
-    // Add bookmarks in folder.
-    this.URIs.forEach(function(aURI) {
-      bs.insertBookmark(folderId,
-                        PlacesUtils._uri(aURI),
-                        bs.DEFAULT_INDEX,
-                        "Title");
+    this._bookmarks = await PlacesUtils.bookmarks.insertTree({
+      guid: PlacesUtils.bookmarks.unfiledGuid,
+      children: [{
+        title: "Folder",
+        type: PlacesUtils.bookmarks.TYPE_FOLDER,
+        children,
+      }],
     });
 
     // Select unsorted bookmarks root in the left pane.
     gLibrary.PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
     isnot(gLibrary.PlacesOrganizer._places.selectedNode, null,
           "We correctly have selection in the Library left pane");
     // Get our bookmark in the right pane.
     var folderNode = gLibrary.ContentTree.view.view.nodeForTreeIndex(0);
     is(folderNode.title, "Folder", "Found folder in the right pane");
   },
 
-  finish() {
-    setTimeout(runNextTest, 0);
-  },
-
-  cleanup() {
-    PlacesUtils.bookmarks.removeItem(this._folderId);
+  async cleanup() {
+    await PlacesUtils.bookmarks.remove(this._bookmarks[0]);
   }
 });
 
 // ------------------------------------------------------------------------------
 // Open a query in tabs.
 
 gTests.push({
   desc: "Open a query in tabs.",
   URIs: ["about:buildconfig", "about:"],
-  _folderId: -1,
-  _queryId: -1,
+  _bookmarks: null,
+  _query: null,
 
-  setup() {
-    var bs = PlacesUtils.bookmarks;
-    // Create a new folder.
-    var folderId = bs.createFolder(bs.unfiledBookmarksFolder,
-                                   "Folder",
-                                   bs.DEFAULT_INDEX);
-    this._folderId = folderId;
+  async setup() {
+    let children = this.URIs.map(url => {
+      return {
+        title: "Title",
+        url,
+      }
+    });
 
-    // Add bookmarks in folder.
-    this.URIs.forEach(function(aURI) {
-      bs.insertBookmark(folderId,
-                        PlacesUtils._uri(aURI),
-                        bs.DEFAULT_INDEX,
-                        "Title");
+    this._bookmarks = await PlacesUtils.bookmarks.insertTree({
+      guid: PlacesUtils.bookmarks.unfiledGuid,
+      children: [{
+        title: "Folder",
+        type: PlacesUtils.bookmarks.TYPE_FOLDER,
+        children,
+      }],
     });
 
     // Create a bookmarks query containing our bookmarks.
     var hs = PlacesUtils.history;
     var options = hs.getNewQueryOptions();
     options.queryType = Ci.nsINavHistoryQueryOptions.QUERY_TYPE_BOOKMARKS;
     var query = hs.getNewQuery();
     // The colon included in the terms selects only about: URIs. If not included
     // we also may get pages like about.html included in the query result.
     query.searchTerms = "about:";
     var queryString = hs.queriesToQueryString([query], 1, options);
-    this._queryId = bs.insertBookmark(bs.unfiledBookmarksFolder,
-                                     PlacesUtils._uri(queryString),
-                                     0, // It must be the first.
-                                     "Query");
+    this._query = await PlacesUtils.bookmarks.insert({
+      index: 0, // it must be the first
+      parentGuid: PlacesUtils.bookmarks.unfiledGuid,
+      title: "Query",
+      url: queryString,
+    });
+
+    gLibrary.PlacesOrganizer.selectLeftPaneQuery("Query");
 
     // Select unsorted bookmarks root in the left pane.
     gLibrary.PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
     isnot(gLibrary.PlacesOrganizer._places.selectedNode, null,
           "We correctly have selection in the Library left pane");
     // Get our bookmark in the right pane.
     var folderNode = gLibrary.ContentTree.view.view.nodeForTreeIndex(0);
     is(folderNode.title, "Query", "Found query in the right pane");
   },
 
-  finish() {
-    setTimeout(runNextTest, 0);
-  },
-
-  cleanup() {
-    PlacesUtils.bookmarks.removeItem(this._folderId);
-    PlacesUtils.bookmarks.removeItem(this._queryId);
+  async cleanup() {
+    await PlacesUtils.bookmarks.remove(this._bookmarks[0]);
+    await PlacesUtils.bookmarks.remove(this._query);
   }
 });
 
-// ------------------------------------------------------------------------------
+async function runTest(test) {
+  info("Start of test: " + test.desc);
+  // Test setup will set Library so that the bookmark to be opened is the
+  // first node in the content (right pane) tree.
+  await test.setup();
 
-function test() {
-  waitForExplicitFinish();
-  // Increase timeout, this test can be quite slow due to waitForFocus calls.
-  requestLongerTimeout(2);
-
-  // Sanity checks.
-  ok(PlacesUtils, "PlacesUtils in context");
-  ok(PlacesUIUtils, "PlacesUIUtils in context");
+  // Middle click on first node in the content tree of the Library.
+  gLibrary.focus();
+  await SimpleTest.promiseFocus(gLibrary);
 
-  // Add tabs listeners.
-  gBrowser.tabContainer.addEventListener("TabOpen", gTabsListener);
-  gBrowser.addTabsProgressListener(gTabsListener);
+  // Now middle-click on the bookmark contained with it.
+  let promiseLoaded = Promise.all(test.URIs.map(uri =>
+    BrowserTestUtils.waitForNewTab(gBrowser, uri, false, true)));
 
-  // Temporary disable history, so we won't record pages navigation.
-  gPrefService.setBoolPref(ENABLE_HISTORY_PREF, false);
+  mouseEventOnCell(gLibrary.ContentTree.view, 0, 0, { button: 1 });
 
-  // Open Library window.
-  openLibrary(function(library) {
-    gLibrary = library;
-    // Kick off tests.
-    runNextTest();
-  });
+  let tabs = await promiseLoaded;
+
+  Assert.ok(true, "Expected tabs were loaded");
+
+  await Promise.all(tabs.map(tab => BrowserTestUtils.removeTab(tab)));
+
+  await test.cleanup();
 }
 
-function runNextTest() {
-  // Cleanup from previous test.
-  if (gCurrentTest)
-    gCurrentTest.cleanup();
-
-  if (gTests.length > 0) {
-    // Goto next test.
-    gCurrentTest = gTests.shift();
-    info("Start of test: " + gCurrentTest.desc);
-    // Test setup will set Library so that the bookmark to be opened is the
-    // first node in the content (right pane) tree.
-    gCurrentTest.setup();
-
-    // Middle click on first node in the content tree of the Library.
-    gLibrary.focus();
-    waitForFocus(function() {
-      mouseEventOnCell(gLibrary.ContentTree.view, 0, 0, { button: 1 });
-    }, gLibrary);
-  } else {
-    // No more tests.
-
-    // Close Library window.
-    gLibrary.close();
-
-    // Remove tabs listeners.
-    gBrowser.tabContainer.removeEventListener("TabOpen", gTabsListener);
-    gBrowser.removeTabsProgressListener(gTabsListener);
-
-    // Restore history.
-    try {
-      gPrefService.clearUserPref(ENABLE_HISTORY_PREF);
-    } catch (ex) {}
-
-    finish();
+add_task(async function test_all() {
+  for (let test of gTests) {
+    await runTest(test);
   }
-}
+});
 
 function mouseEventOnCell(aTree, aRowIndex, aColumnIndex, aEventDetails) {
   var selection = aTree.view.selection;
   selection.select(aRowIndex);
   aTree.treeBoxObject.ensureRowIsVisible(aRowIndex);
   var column = aTree.columns[aColumnIndex];
 
   // get cell coordinates
--- a/browser/components/sessionstore/SessionStore.jsm
+++ b/browser/components/sessionstore/SessionStore.jsm
@@ -3345,19 +3345,19 @@ var SessionStoreInternal = {
       selectTab = Math.min(selectTab, winData.tabs.length);
     }
 
     let tabbrowser = aWindow.gBrowser;
     let newTabCount = winData.tabs.length;
     var tabs = [];
 
     // disable smooth scrolling while adding, moving, removing and selecting tabs
-    let tabstrip = tabbrowser.tabContainer.mTabstrip;
-    let smoothScroll = tabstrip.smoothScroll;
-    tabstrip.smoothScroll = false;
+    let arrowScrollbox = tabbrowser.tabContainer.arrowScrollbox;
+    let smoothScroll = arrowScrollbox.smoothScroll;
+    arrowScrollbox.smoothScroll = false;
 
     // We need to keep track of the initially open tabs so that they
     // can be moved to the end of the restored tabs.
     let initialTabs;
     if (!overwriteTabs && firstWindow) {
       initialTabs = Array.slice(tabbrowser.tabs);
     }
 
@@ -3489,17 +3489,17 @@ var SessionStoreInternal = {
     }
 
     // Restore tabs, if any.
     if (winData.tabs.length) {
       this.restoreTabs(aWindow, tabs, winData.tabs, selectTab);
     }
 
     // set smoothScroll back to the original value
-    tabstrip.smoothScroll = smoothScroll;
+    arrowScrollbox.smoothScroll = smoothScroll;
 
     TelemetryStopwatch.finish("FX_SESSION_RESTORE_RESTORE_WINDOW_MS");
     if (Services.prefs.getIntPref("browser.tabs.restorebutton") != 0 ) {
       Services.telemetry.scalarAdd("browser.session.restore.number_of_tabs", winData.tabs.length);
       Services.telemetry.scalarAdd("browser.session.restore.number_of_win", 1);
     }
 
     this._setWindowStateReady(aWindow);
--- a/browser/config/mozconfigs/win32/mingw32
+++ b/browser/config/mozconfigs/win32/mingw32
@@ -3,20 +3,16 @@
 #    SOCORRO_SYMBOL_UPLOAD_TOKEN_FILE - shouldn't be used?
 #    TOOLTOOL_DIR
 #    MAKECAB - shouldn't be used?
 . "$topsrcdir/build/mozconfig.win-common"
 
 # MinGW does not have (or need) makecab
 unset MAKECAB
 
-# These aren't supported on mingw at this time
-# Bug 1393817
-MOZ_AUTOMATION_L10N_CHECK=0
-
 # Sets:
 #  build/mozconfig.common
 #    AUTOCLOBBER=1
 #    --enable-crashreporter
 #    --enable-release
 #    LLVM_CONFIG
 #    MOZ_ADDON_SIGNING
 #    MOZ_REQUIRE_SIGNING
--- a/browser/confvars.sh
+++ b/browser/confvars.sh
@@ -23,20 +23,16 @@ if test "$OS_ARCH" = "WINNT"; then
             "$MOZ_UPDATE_CHANNEL" = "release"; then
       if ! test "$MOZ_DEBUG"; then
         MOZ_STUB_INSTALLER=1
       fi
     fi
   fi
 fi
 
-if test "$NIGHTLY_BUILD"; then
-  MOZ_RUST_URLPARSE=1
-fi
-
 # Enable building ./signmar and running libmar signature tests
 MOZ_ENABLE_SIGNMAR=1
 
 MOZ_APP_VERSION=$FIREFOX_VERSION
 MOZ_APP_VERSION_DISPLAY=$FIREFOX_VERSION_DISPLAY
 # MOZ_APP_DISPLAYNAME will be set by branding/configure.sh
 # MOZ_BRANDING_DIRECTORY is the default branding directory used when none is
 # specified. It should never point to the "official" branding directory.
--- a/browser/extensions/formautofill/FormAutofillUtils.jsm
+++ b/browser/extensions/formautofill/FormAutofillUtils.jsm
@@ -234,16 +234,64 @@ this.FormAutofillUtils = {
       let dataset = this.getCountryAddressData(country);
       let languages = dataset.languages ? dataset.languages.split("~") : [dataset.lang];
       this._collators[country] = languages.map(lang => new Intl.Collator(lang, {sensitivity: "base", ignorePunctuation: true}));
     }
     return this._collators[country];
   },
 
   /**
+   * Parse a country address format string and outputs an array of fields.
+   * Spaces, commas, and other literals are ignored in this implementation.
+   * For example, format string "%A%n%C, %S" should return:
+   * [
+   *   {fieldId: "street-address", newLine: true},
+   *   {fieldId: "address-level2"},
+   *   {fieldId: "address-level1"},
+   * ]
+   *
+   * @param   {string} fmt Country address format string
+   * @returns {array<object>} List of fields
+   */
+  parseAddressFormat(fmt) {
+    if (!fmt) {
+      throw new Error("fmt string is missing.");
+    }
+    // Based on the list of fields abbreviations in
+    // https://github.com/googlei18n/libaddressinput/wiki/AddressValidationMetadata
+    const fieldsLookup = {
+      N: "name",
+      O: "organization",
+      A: "street-address",
+      S: "address-level1",
+      C: "address-level2",
+      Z: "postal-code",
+      n: "newLine",
+    };
+
+    return fmt.match(/%[^%]/g).reduce((parsed, part) => {
+      // Take the first letter of each segment and try to identify it
+      let fieldId = fieldsLookup[part[1]];
+      // Early return if cannot identify part.
+      if (!fieldId) {
+        return parsed;
+      }
+      // If a new line is detected, add an attribute to the previous field.
+      if (fieldId == "newLine") {
+        let size = parsed.length;
+        if (size) {
+          parsed[size - 1].newLine = true;
+        }
+        return parsed;
+      }
+      return parsed.concat({fieldId});
+    }, []);
+  },
+
+  /**
    * Use alternative country name list to identify a country code from a
    * specified country name.
    * @param   {string} countryName A country name to be identified
    * @param   {string} [countrySpecified] A country code indicating that we only
    *                                      search its alternative names if specified.
    * @returns {string} The matching country code.
    */
   identifyCountryCode(countryName, countrySpecified) {
new file mode 100644
--- /dev/null
+++ b/browser/extensions/formautofill/test/unit/test_parseAddressFormat.js
@@ -0,0 +1,47 @@
+"use strict";
+
+Cu.import("resource://formautofill/FormAutofillUtils.jsm");
+
+add_task(async function test_parseAddressFormat() {
+  const TEST_CASES = [
+    {
+      fmt: "%N%n%O%n%A%n%C, %S %Z", // US
+      parsed: [
+        {fieldId: "name", newLine: true},
+        {fieldId: "organization", newLine: true},
+        {fieldId: "street-address", newLine: true},
+        {fieldId: "address-level2"},
+        {fieldId: "address-level1"},
+        {fieldId: "postal-code"},
+      ],
+    },
+    {
+      fmt: "%N%n%O%n%A%n%C %S %Z", // CA
+      parsed: [
+        {fieldId: "name", newLine: true},
+        {fieldId: "organization", newLine: true},
+        {fieldId: "street-address", newLine: true},
+        {fieldId: "address-level2"},
+        {fieldId: "address-level1"},
+        {fieldId: "postal-code"},
+      ],
+    },
+    {
+      fmt: "%N%n%O%n%A%n%Z %C", // DE
+      parsed: [
+        {fieldId: "name", newLine: true},
+        {fieldId: "organization", newLine: true},
+        {fieldId: "street-address", newLine: true},
+        {fieldId: "postal-code"},
+        {fieldId: "address-level2"},
+      ],
+    },
+  ];
+
+  Assert.throws(() => FormAutofillUtils.parseAddressFormat(),
+                /fmt string is missing./,
+                "Should throw if fmt is empty");
+  for (let tc of TEST_CASES) {
+    Assert.deepEqual(FormAutofillUtils.parseAddressFormat(tc.fmt), tc.parsed);
+  }
+});
--- a/browser/extensions/formautofill/test/unit/xpcshell.ini
+++ b/browser/extensions/formautofill/test/unit/xpcshell.ini
@@ -33,16 +33,17 @@ support-files =
 [test_isAvailable.js]
 [test_isCJKName.js]
 [test_isFieldEligibleForAutofill.js]
 [test_markAsAutofillField.js]
 [test_masterPassword.js]
 [test_migrateRecords.js]
 [test_nameUtils.js]
 [test_onFormSubmitted.js]
+[test_parseAddressFormat.js]
 [test_profileAutocompleteResult.js]
 [test_phoneNumber.js]
 [test_reconcile.js]
 [test_savedFieldNames.js]
 [test_toOneLineAddress.js]
 [test_storage_tombstones.js]
 [test_storage_syncfields.js]
 [test_transformFields.js]
--- a/devtools/shim/aboutdevtools/aboutdevtools.js
+++ b/devtools/shim/aboutdevtools/aboutdevtools.js
@@ -4,16 +4,22 @@
 
 "use strict";
 
 const { utils: Cu } = Components;
 const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
 
 const DEVTOOLS_ENABLED_PREF = "devtools.enabled";
 
+const TELEMETRY_OPENED_KEY = "DEVTOOLS_ABOUT_DEVTOOLS_OPENED_KEY";
+const TELEMETRY_OPENED_REASON = "DEVTOOLS_ABOUT_DEVTOOLS_OPENED_REASON";
+const TELEMETRY_OPENED = "devtools.aboutdevtools.opened";
+const TELEMETRY_INSTALLED = "devtools.aboutdevtools.installed";
+const TELEMETRY_NOINSTALL_EXITS = "devtools.aboutdevtools.noinstall_exits";
+
 const MESSAGES = {
   AboutDebugging: "about-debugging-message",
   ContextMenu: "inspect-element-message",
   HamburgerMenu: "menu-message",
   KeyShortcut: "key-shortcut-message",
   SystemMenu: "menu-message",
 };
 
@@ -22,25 +28,35 @@ const aboutDevtoolsBundle = Services.str
 
 const KEY_SHORTCUTS_STRINGS = "chrome://devtools-shim/locale/key-shortcuts.properties";
 const keyShortcutsBundle = Services.strings.createBundle(KEY_SHORTCUTS_STRINGS);
 
 // URL constructor doesn't support about: scheme,
 // we have to use http in order to have working searchParams.
 let url = new URL(window.location.href.replace("about:", "http://"));
 let reason = url.searchParams.get("reason");
+let keyid = url.searchParams.get("keyid");
 let tabid = parseInt(url.searchParams.get("tabid"), 10);
 
+// Keep track of the initial devtools.enabled value to track exits in telemetry.
+let isEnabledOnLoad;
+
 function getToolboxShortcut() {
   const modifier = Services.appinfo.OS == "Darwin" ? "Cmd+Opt+" : "Ctrl+Shift+";
   return modifier + keyShortcutsBundle.GetStringFromName("toggleToolbox.commandkey");
 }
 
 function onInstallButtonClick() {
   Services.prefs.setBoolPref("devtools.enabled", true);
+
+  try {
+    Services.telemetry.scalarAdd(TELEMETRY_INSTALLED, 1);
+  } catch (e) {
+    dump("about:devtools oninstall telemetry failed: " + e + "\n");
+  }
 }
 
 function onCloseButtonClick() {
   window.close();
 }
 
 function updatePage() {
   const installPage = document.getElementById("install-page");
@@ -135,18 +151,21 @@ function createFeatureEl(feature) {
      </p>`;
 
   return li;
 }
 
 window.addEventListener("load", function () {
   const inspectorShortcut = getToolboxShortcut();
   const welcomeMessage = document.getElementById("welcome-message");
-  welcomeMessage.textContent = welcomeMessage.textContent.replace(
-    "##INSPECTOR_SHORTCUT##", inspectorShortcut);
+
+  // Set the welcome message content with the correct keyboard sortcut for the current
+  // platform.
+  welcomeMessage.textContent = aboutDevtoolsBundle.formatStringFromName("welcome.message",
+    [inspectorShortcut], 1);
 
   // Set the appropriate title message.
   if (reason == "ContextMenu") {
     document.getElementById("inspect-title").removeAttribute("hidden");
   } else {
     document.getElementById("common-title").removeAttribute("hidden");
   }
 
@@ -164,16 +183,30 @@ window.addEventListener("load", function
 
   let featuresContainer = document.querySelector(".features-list");
   for (let feature of features) {
     featuresContainer.appendChild(createFeatureEl(feature));
   }
 
   // Update the current page based on the current value of DEVTOOLS_ENABLED_PREF.
   updatePage();
+
+  try {
+    if (reason) {
+      Services.telemetry.getHistogramById(TELEMETRY_OPENED_REASON).add(reason);
+    }
+
+    if (keyid) {
+      Services.telemetry.getHistogramById(TELEMETRY_OPENED_KEY).add(keyid);
+    }
+
+    Services.telemetry.scalarAdd(TELEMETRY_OPENED, 1);
+  } catch (e) {
+    dump("about:devtools onload telemetry failed: " + e + "\n");
+  }
 }, { once: true });
 
 window.addEventListener("beforeunload", function () {
   // Focus the tab that triggered the DevTools onboarding.
   if (document.visibilityState != "visible") {
     // Only try to focus the correct tab if the current tab is the about:devtools page.
     return;
   }
@@ -189,9 +222,18 @@ window.addEventListener("beforeunload", 
     gBrowser.selectedTab = originalTab;
   }
 }, {once: true});
 
 window.addEventListener("unload", function () {
   document.getElementById("install").removeEventListener("click", onInstallButtonClick);
   document.getElementById("close").removeEventListener("click", onCloseButtonClick);
   Services.prefs.removeObserver(DEVTOOLS_ENABLED_PREF, updatePage);
+
+  const isEnabled = Services.prefs.getBoolPref("devtools.enabled");
+  if (!isEnabledOnLoad && !isEnabled) {
+    try {
+      Services.telemetry.scalarAdd(TELEMETRY_NOINSTALL_EXITS, 1);
+    } catch (e) {
+      dump("about:devtools onunload telemetry failed: " + e + "\n");
+    }
+  }
 }, {once: true});
--- a/devtools/shim/aboutdevtools/aboutdevtools.xhtml
+++ b/devtools/shim/aboutdevtools/aboutdevtools.xhtml
@@ -1,16 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 <!DOCTYPE html [
 <!ENTITY % htmlDTD PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> %htmlDTD;
 <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd"> %globalDTD;
-<!ENTITY % aboutdevtoolsDTD SYSTEM "chrome://devtools-shim/content/aboutdevtools/tmp-locale/aboutdevtools.dtd"> %aboutdevtoolsDTD;
+<!ENTITY % aboutdevtoolsDTD SYSTEM "chrome://devtools-shim/locale/aboutdevtools.dtd"> %aboutdevtoolsDTD;
 ]>
 
 <html xmlns="http://www.w3.org/1999/xhtml" dir="&locale.dir;">
 <head>
   <title>&aboutDevtools.headTitle;</title>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>a
   <link rel="stylesheet" href="chrome://global/skin/in-content/common.css" type="text/css"/>
   <link rel="stylesheet" href="chrome://devtools-shim/content/aboutdevtools/aboutdevtools.css"  type="text/css"/>
@@ -31,30 +31,32 @@
         <p id="about-debugging-message" hidden="true">&aboutDevtools.enable.aboutDebuggingMessage;</p>
         <p id="menu-message" hidden="true">&aboutDevtools.enable.menuMessage;</p>
         <p id="key-shortcut-message" hidden="true">&aboutDevtools.enable.keyShortcutMessage;</p>
         <p id="inspect-element-message" hidden="true">&aboutDevtools.enable.inspectElementMessage;</p>
 
         <p>&aboutDevtools.enable.commonMessage;</p>
         <a class="external installpage-link" href="https://developer.mozilla.org/docs/Tools" target="_blank">&aboutDevtools.enable.learnMoreLink;</a>
         <div class="buttons-container">
-          <button class="primary-button" id="install">&aboutDevtools.enable.installButton;</button>
+          <button class="primary-button" id="install">&aboutDevtools.enable.enableButton;</button>
           <button class="default-button" id="close">&aboutDevtools.enable.closeButton;</button>
         </div>
       </div>
     </div>
   </div>
 
   <!-- This page, hidden by default is displayed once the add-on is installed -->
   <div id="welcome-page" class="wrapper" hidden="true">
     <div class="box">
       <div class="left-pane" />
       <div class="right-pane">
         <h1 class="title" >&aboutDevtools.welcome.title;</h1>
-        <p id="welcome-message">&aboutDevtools.welcome.message;</p>
+        <!-- The welcome message is dynamically updated with a keyboard shortcut at
+             runtime and added in aboutdevtools.js -->
+        <p id="welcome-message"></p>
 
         <!-- Form dedicated to the newsletter subscription -->
         <div class="newsletter">
           <h2 class="newsletter-title">&aboutDevtools.newsletter.title;</h2>
           <p>&aboutDevtools.newsletter.message;</p>
 
           <form id="newsletter-form" name="newsletter-form" action="https://www.mozilla.org/en-US/newsletter/" method="post">
             <!-- "H" stands for the HTML format (->fmt). Alternative is T for text. -->
@@ -65,17 +67,17 @@
             <section id="newsletter-email" class="newsletter-form-section">
               <input type="email" id="email" name="email" required="true" placeholder="&aboutDevtools.newsletter.email.placeholder;" />
             </section>
 
             <section id="newsletter-privacy" class="newsletter-form-section">
               <input type="checkbox" id="privacy" name="privacy" required="true" />
               <label for="privacy">&aboutDevtools.newsletter.privacy.label;</label>
             </section>
-            <button type="submit" id="newsletter-submit" class="primary-button">&aboutDevtools.newsletter.subscribe.label;</button>
+            <button type="submit" id="newsletter-submit" class="primary-button">&aboutDevtools.newsletter.subscribeButton;</button>
           </form>
           <div id="newsletter-thanks">
             <h2>&aboutDevtools.newsletter.thanks.title;</h2>
             <p>&aboutDevtools.newsletter.thanks.message;</p>
           </div>
         </div>
       </div>
     </div>
@@ -85,20 +87,19 @@
       </ul>
     </div>
 
     <footer>
       <img class="dev-edition-logo"
            src="chrome://devtools-shim/content/aboutdevtools/images/dev-edition-logo.svg"
            alt="Firefox Developer Edition logo"/>
       <div class="footer-message">
-        <h1 class="footer-message-title">Firefox Developer Edition</h1>
-        <p>
-          Looking for more than just Developer Tools?
-          Check out the Firefox browser that is built specifically for developers and modern workflows.
-        </p>
-        <a class="external footer-link" href="https://www.mozilla.org/en-US/firefox/developer/" target="_blank">Learn more</a>
+        <h1 class="footer-message-title">&aboutDevtools.footer.title;</h1>
+        <p>&aboutDevtools.footer.message;</p>
+        <a class="external footer-link"
+           href="https://www.mozilla.org/firefox/developer/"
+           target="_blank">&aboutDevtools.footer.learnMoreLink;</a>
       </div>
     </footer>
   </div>
 
 </body>
 </html>
--- a/devtools/shim/devtools-startup.js
+++ b/devtools/shim/devtools-startup.js
@@ -460,24 +460,25 @@ DevToolsStartup.prototype = {
     // Appending a <key> element is not always enough. The <keyset> needs
     // to be detached and reattached to make sure the <key> is taken into
     // account (see bug 832984).
     let mainKeyset = doc.getElementById("mainKeyset");
     mainKeyset.parentNode.insertBefore(keyset, mainKeyset);
   },
 
   onKey(window, key) {
-    // Record the timing at which this event started in order to compute later in
-    // gDevTools.showToolbox, the complete time it takes to open the toolbox.
-    // i.e. especially take `initDevTools` into account.
-
-    let startTime = window.performance.now();
-    let require = this.initDevTools("KeyShortcut");
-    if (require) {
-      // require might be null if initDevTools was called while DevTools are disabled.
+    if (!Services.prefs.getBoolPref(DEVTOOLS_ENABLED_PREF)) {
+      let id = key.toolId || key.id;
+      this.openInstallPage("KeyShortcut", id);
+    } else {
+      // Record the timing at which this event started in order to compute later in
+      // gDevTools.showToolbox, the complete time it takes to open the toolbox.
+      // i.e. especially take `initDevTools` into account.
+      let startTime = window.performance.now();
+      let require = this.initDevTools("KeyShortcut");
       let { gDevToolsBrowser } = require("devtools/client/framework/devtools-browser");
       gDevToolsBrowser.onKeyShortcut(window, key, startTime);
     }
   },
 
   // Create a <xul:key> DOM Element
   createKey(doc, { id, toolId, shortcut, modifiers: mod }, oncommand) {
     let k = doc.createElement("key");
@@ -523,17 +524,27 @@ DevToolsStartup.prototype = {
     this.initialized = true;
     let { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
     // Ensure loading main devtools module that hooks up into browser UI
     // and initialize all devtools machinery.
     require("devtools/client/framework/devtools-browser");
     return require;
   },
 
-  openInstallPage: function (reason) {
+  /**
+   * Open about:devtools to start the onboarding flow.
+   *
+   * @param {String} reason
+   *        One of "KeyShortcut", "SystemMenu", "HamburgerMenu", "ContextMenu",
+   *        "CommandLine".
+   * @param {String} keyId
+   *        Optional. If the onboarding flow was triggered by a keyboard shortcut, pass
+   *        the shortcut key id (or toolId) to about:devtools.
+   */
+  openInstallPage: function (reason, keyId) {
     let { gBrowser } = Services.wm.getMostRecentWindow("navigator:browser");
 
     // Focus about:devtools tab if there is already one opened in the current window.
     for (let tab of gBrowser.tabs) {
       let browser = tab.linkedBrowser;
       // browser.documentURI might be undefined if the browser tab is still loading.
       let location = browser.documentURI ? browser.documentURI.spec : "";
       if (location.startsWith("about:devtools") &&
@@ -551,16 +562,20 @@ DevToolsStartup.prototype = {
       params.push("reason=" + encodeURIComponent(reason));
     }
 
     let selectedBrowser = gBrowser.selectedBrowser;
     if (selectedBrowser) {
       params.push("tabid=" + selectedBrowser.outerWindowID);
     }
 
+    if (keyId) {
+      params.push("keyid=" + keyId);
+    }
+
     if (params.length > 0) {
       url += "?" + params.join("&");
     }
 
     // Set relatedToCurrent: true to open the tab next to the current one.
     gBrowser.selectedTab = gBrowser.addTab(url, {relatedToCurrent: true});
   },
 
--- a/devtools/shim/jar.mn
+++ b/devtools/shim/jar.mn
@@ -7,20 +7,16 @@ devtools-shim.jar:
     content/aboutdevtools/aboutdevtools.xhtml  (aboutdevtools/aboutdevtools.xhtml)
     content/aboutdevtools/aboutdevtools.css (aboutdevtools/aboutdevtools.css)
     content/aboutdevtools/aboutdevtools.js (aboutdevtools/aboutdevtools.js)
     content/aboutdevtools/subscribe.css (aboutdevtools/subscribe.css)
     content/aboutdevtools/subscribe.js (aboutdevtools/subscribe.js)
 
     content/aboutdevtools/images/otter.svg (aboutdevtools/images/otter.svg)
 
-    # Temporary localisation file, move back to devtools/shim/locales/en-US when ready for localization
-    # See https://bugzilla.mozilla.org/show_bug.cgi?id=1408369
-    content/aboutdevtools/tmp-locale/aboutdevtools.dtd (aboutdevtools/tmp-locale/aboutdevtools.dtd)
-
     content/aboutdevtools/images/dev-edition-logo.svg (aboutdevtools/images/dev-edition-logo.svg)
     content/aboutdevtools/images/external-link.svg (aboutdevtools/images/external-link.svg)
     content/aboutdevtools/images/feature-inspector.svg (aboutdevtools/images/feature-inspector.svg)
     content/aboutdevtools/images/feature-console.svg (aboutdevtools/images/feature-console.svg)
     content/aboutdevtools/images/feature-debugger.svg (aboutdevtools/images/feature-debugger.svg)
     content/aboutdevtools/images/feature-network.svg (aboutdevtools/images/feature-network.svg)
     content/aboutdevtools/images/feature-memory.svg (aboutdevtools/images/feature-memory.svg)
     content/aboutdevtools/images/feature-visualediting.svg (aboutdevtools/images/feature-visualediting.svg)
rename from devtools/shim/aboutdevtools/tmp-locale/aboutdevtools.dtd
rename to devtools/shim/locales/en-US/aboutdevtools.dtd
--- a/devtools/shim/aboutdevtools/tmp-locale/aboutdevtools.dtd
+++ b/devtools/shim/locales/en-US/aboutdevtools.dtd
@@ -1,35 +1,78 @@
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
+<!-- LOCALIZATION NOTE : This file contains the strings used in aboutdevtools.xhtml,
+  -  displayed when going to about:devtools. UI depends on the value of the preference
+  -  "devtools.enabled".
+  -
+  -  "aboutDevtools.enable.*" and "aboutDevtools.newsletter.*" keys are used when DevTools
+     are disabled
+  -  "aboutDevtools.welcome.*" keys are used when DevTools are enabled
+  - -->
+
+<!-- LOCALIZATION NOTE (aboutDevtools.headTitle): Text of the title tag for about:devtools -->
 <!ENTITY  aboutDevtools.headTitle "About Developer Tools">
+
+<!-- LOCALIZATION NOTE (aboutDevtools.enable.title): Title of the top about:devtools
+  -  section displayed when DevTools are disabled. -->
 <!ENTITY  aboutDevtools.enable.title "Enable Firefox Developer Tools">
+
+<!-- LOCALIZATION NOTE (aboutDevtools.enable.inspectElementTitle): Title of the top
+  -  section displayed when devtools are disabled and the user triggered DevTools by using
+  -  the Inspect Element menu item. -->
 <!ENTITY  aboutDevtools.enable.inspectElementTitle "Enable Firefox Developer Tools to use Inspect Element">
 
+<!-- LOCALIZATION NOTE (aboutDevtools.enable.inspectElementMessage): Message displayed
+  -  when users come from using the Inspect Element menu item. -->
+<!ENTITY  aboutDevtools.enable.inspectElementMessage
+          "Examine and edit HTML and CSS with the Developer Tools’ Inspector.">
+
+<!-- LOCALIZATION NOTE (aboutDevtools.enable.aboutDebuggingMessage): Message displayed
+  -  when users come from about:debugging. -->
 <!ENTITY  aboutDevtools.enable.aboutDebuggingMessage
-          "Develop and debug WebExtensions, web workers, service workers and more with Firefox DevTools.">
-<!ENTITY  aboutDevtools.enable.inspectElementMessage
-          "Examine and edit HTML and CSS with the DevTools Inspector.">
+          "Develop and debug WebExtensions, web workers, service workers and more with Firefox Developer Tools.">
+
+<!-- LOCALIZATION NOTE (aboutDevtools.enable.keyShortcutMessage): Message displayed when
+  -  users pressed a DevTools key shortcut. -->
 <!ENTITY  aboutDevtools.enable.keyShortcutMessage
           "You activated a Developer Tools shortcut. If that was a mistake, you can close this tab.">
+
+<!-- LOCALIZATION NOTE (aboutDevtools.enable.menuMessage): Message displayed when users
+  -  clicked on a "Enable Developer Tools" menu item. -->
 <!ENTITY  aboutDevtools.enable.menuMessage
           "Examine, edit and debug HTML, CSS, and JavaScript with tools like Inspector and Debugger.">
 
+<!-- LOCALIZATION NOTE (aboutDevtools.enable.commonMessage): Generic message displayed for
+  -  all possible entry points (keyshortcut, menu item etc…). -->
 <!ENTITY  aboutDevtools.enable.commonMessage
-          "As of Firefox 58, Developer Tools are disabled by default to give you more control over your browser.">
+          "Firefox Developer Tools are disabled by default to give you more control over your browser.">
 
-<!ENTITY  aboutDevtools.enable.learnMoreLink "Learn more about DevTools">
-<!ENTITY  aboutDevtools.enable.installButton "Enable Developer Tools">
+<!-- LOCALIZATION NOTE (aboutDevtools.enable.learnMoreLink): Text for the link to
+  -  https://developer.mozilla.org/docs/Tools displayed in the top section when DevTools
+  -  are disabled. -->
+<!ENTITY  aboutDevtools.enable.learnMoreLink "Learn more about Developer Tools">
+
+<!ENTITY  aboutDevtools.enable.enableButton "Enable Developer Tools">
 <!ENTITY  aboutDevtools.enable.closeButton "Close this page">
+
 <!ENTITY  aboutDevtools.welcome.title "Welcome to Firefox Developer Tools!">
-<!ENTITY  aboutDevtools.welcome.message "You’ve successfully enabled DevTools! To get started, explore the Web Developer menu or open the tools with ##INSPECTOR_SHORTCUT##.">
 
 <!ENTITY  aboutDevtools.newsletter.title "Mozilla Developer Newsletter">
+<!-- LOCALIZATION NOTE (aboutDevtools.newsletter.message): Subscribe form message.
+  -  The newsletter is only available in english at the moment.
+  -  See Bug 1415273 for support of additional languages.-->
 <!ENTITY  aboutDevtools.newsletter.message "Get developer news, tricks and resources sent straight to your inbox.">
 <!ENTITY  aboutDevtools.newsletter.email.placeholder "Email">
-<!ENTITY  aboutDevtools.newsletter.privacy.label "I’m okay with Mozilla handling my info as explained in this <a class=&#x0022;external&#x0022; href=&#x0022;https://www.mozilla.org/privacy/&#x0022;>Privacy Policy</a>.">
-<!ENTITY  aboutDevtools.newsletter.subscribe.label "Subscribe">
-
+<!ENTITY  aboutDevtools.newsletter.privacy.label "I’m okay with Mozilla handling my info as explained in this <a class='external' href='https://www.mozilla.org/privacy/'>Privacy Policy</a>.">
+<!ENTITY  aboutDevtools.newsletter.subscribeButton "Subscribe">
 <!ENTITY  aboutDevtools.newsletter.thanks.title "Thanks!">
 <!ENTITY  aboutDevtools.newsletter.thanks.message "If you haven’t previously confirmed a subscription to a Mozilla-related newsletter you may have to do so. Please check your inbox or your spam filter for an email from us.">
 
+<!ENTITY  aboutDevtools.footer.title "Firefox Developer Edition">
+<!ENTITY  aboutDevtools.footer.message "Looking for more than just Developer Tools? Check out the Firefox browser that is built specifically for developers and modern workflows.">
+
+<!-- LOCALIZATION NOTE (aboutDevtools.footer.learnMoreLink): Text for the link to
+  -  https://www.mozilla.org/firefox/developer/ displayed in the footer. -->
+<!ENTITY  aboutDevtools.footer.learnMoreLink "Learn more">
+
--- a/devtools/shim/locales/en-US/aboutdevtools.properties
+++ b/devtools/shim/locales/en-US/aboutdevtools.properties
@@ -43,8 +43,12 @@ newsletter.error.common=Subscription req
 
 # LOCALIZATION NOTE (newsletter.error.unknown): error text displayed when the newsletter
 # subscription failed for an unexpected reason.
 newsletter.error.unknown=An unexpected error occurred.
 
 # LOCALIZATION NOTE (newsletter.error.timeout): error text displayed when the newsletter
 # subscription timed out.
 newsletter.error.timeout=Subscription request timed out.
+
+# LOCALIZATION NOTE (welcome.message): Message displayed when devtools are enabled.
+# %S will be replaced with the shortcut to toggle the DevTools toolbox.
+welcome.message=You’ve successfully enabled Developer Tools! To get started, explore the Web Developer menu or open the tools with %S.
--- a/dom/base/Element.cpp
+++ b/dom/base/Element.cpp
@@ -1209,17 +1209,17 @@ Element::CreateShadowRoot(ErrorResult& a
 
 already_AddRefed<ShadowRoot>
 Element::AttachShadowInternal(bool aClosed, ErrorResult& aError)
 {
   /**
    * 3. If context object is a shadow host, then throw
    *    an "InvalidStateError" DOMException.
    */
-  if (GetShadowRoot()) {
+  if (GetShadowRoot() || GetXBLBinding()) {
     aError.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
     return nullptr;
   }
 
   nsAutoScriptBlocker scriptBlocker;
 
   RefPtr<mozilla::dom::NodeInfo> nodeInfo;
   nodeInfo = mNodeInfo->NodeInfoManager()->GetNodeInfo(
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -1593,17 +1593,18 @@ nsIDocument::nsIDocument()
     mInSyncOperationCount(0),
     mBlockDOMContentLoaded(0),
     mUseCounters(0),
     mChildDocumentUseCounters(0),
     mNotifiedPageForUseCounter(0),
     mIncCounters(),
     mUserHasInteracted(false),
     mServoRestyleRootDirtyBits(0),
-    mThrowOnDynamicMarkupInsertionCounter(0)
+    mThrowOnDynamicMarkupInsertionCounter(0),
+    mIgnoreOpensDuringUnloadCounter(0)
 {
   SetIsInDocument();
   for (auto& cnt : mIncCounters) {
     cnt = 0;
   }
 }
 
 nsDocument::nsDocument(const char* aContentType)
--- a/dom/base/nsIDocument.h
+++ b/dom/base/nsIDocument.h
@@ -3221,16 +3221,32 @@ public:
   }
 
   void DecrementThrowOnDynamicMarkupInsertionCounter()
   {
     MOZ_ASSERT(mThrowOnDynamicMarkupInsertionCounter);
     --mThrowOnDynamicMarkupInsertionCounter;
   }
 
+  bool ShouldIgnoreOpens() const
+  {
+    return mIgnoreOpensDuringUnloadCounter;
+  }
+
+  void IncrementIgnoreOpensDuringUnloadCounter()
+  {
+    ++mIgnoreOpensDuringUnloadCounter;
+  }
+
+  void DecrementIgnoreOpensDuringUnloadCounter()
+  {
+    MOZ_ASSERT(mIgnoreOpensDuringUnloadCounter);
+    --mIgnoreOpensDuringUnloadCounter;
+  }
+
   virtual bool AllowPaymentRequest() const = 0;
   virtual void SetAllowPaymentRequest(bool aAllowPaymentRequest) = 0;
 
 protected:
   bool GetUseCounter(mozilla::UseCounter aUseCounter)
   {
     return mUseCounters[aUseCounter];
   }
@@ -3778,16 +3794,19 @@ protected:
   // root corresponds to.
   nsCOMPtr<nsINode> mServoRestyleRoot;
   uint32_t mServoRestyleRootDirtyBits;
 
   // Used in conjunction with the create-an-element-for-the-token algorithm to
   // prevent custom element constructors from being able to use document.open(),
   // document.close(), and document.write() when they are invoked by the parser.
   uint32_t mThrowOnDynamicMarkupInsertionCounter;
+
+  // Count of unload/beforeunload/pagehide operations in progress.
+  uint32_t mIgnoreOpensDuringUnloadCounter;
 };
 
 NS_DEFINE_STATIC_IID_ACCESSOR(nsIDocument, NS_IDOCUMENT_IID)
 
 /**
  * mozAutoSubtreeModified batches DOM mutations so that a DOMSubtreeModified
  * event is dispatched, if necessary, when the outermost mozAutoSubtreeModified
  * object is deleted.
@@ -3851,16 +3870,33 @@ class MOZ_RAII AutoSetThrowOnDynamicMark
     ~AutoSetThrowOnDynamicMarkupInsertionCounter() {
       mDocument->DecrementThrowOnDynamicMarkupInsertionCounter();
     }
 
   private:
     nsIDocument* mDocument;
 };
 
+class MOZ_RAII IgnoreOpensDuringUnload final
+{
+public:
+  explicit IgnoreOpensDuringUnload(nsIDocument* aDoc)
+    : mDoc(aDoc)
+  {
+    mDoc->IncrementIgnoreOpensDuringUnloadCounter();
+  }
+
+  ~IgnoreOpensDuringUnload()
+  {
+    mDoc->DecrementIgnoreOpensDuringUnloadCounter();
+  }
+private:
+  nsIDocument* mDoc;
+};
+
 // XXX These belong somewhere else
 nsresult
 NS_NewHTMLDocument(nsIDocument** aInstancePtrResult, bool aLoadedAsData = false);
 
 nsresult
 NS_NewXMLDocument(nsIDocument** aInstancePtrResult, bool aLoadedAsData = false,
                   bool aIsPlainDocument = false);
 
new file mode 100644
--- /dev/null
+++ b/dom/html/crashtests/1412173.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<head>
+<script>
+let f = document.createElement('frame');
+f.onload = function() {
+  let frameDocument = f.contentDocument;
+  frameDocument.body.onbeforeunload = function () { frameDocument.write('<p>beforeUnload</p>') };
+  frameDocument.write('<p>trigger unload</p>')
+  window.stop();
+  document.documentElement.className = '';
+};
+document.documentElement.appendChild(f);
+</script>
+</head>
+<body>
+</body>
+</html>
--- a/dom/html/crashtests/crashtests.list
+++ b/dom/html/crashtests/crashtests.list
@@ -80,9 +80,10 @@ load 1237633.html
 load 1281972-1.html
 load 1282894.html
 load 1290904.html
 load 1343886-1.html
 load 1343886-2.xml
 load 1343886-3.xml
 load 1350972.html
 load 1386905.html
-asserts(0-4) load 1401726.html
\ No newline at end of file
+asserts(0-4) load 1401726.html
+load 1412173.html
--- a/dom/html/nsHTMLDocument.cpp
+++ b/dom/html/nsHTMLDocument.cpp
@@ -1529,16 +1529,23 @@ nsHTMLDocument::Open(JSContext* cx,
     // invoked."
     // Note that aborting a parser leaves the parser "active" with its
     // insertion point "not undefined". We track this using mParserAborted,
     // because aborting a parser nulls out mParser.
     nsCOMPtr<nsIDocument> ret = this;
     return ret.forget();
   }
 
+  // Implement Step 6 of:
+  // https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#document-open-steps
+  if (ShouldIgnoreOpens()) {
+    nsCOMPtr<nsIDocument> ret = this;
+    return ret.forget();
+  }
+
   // No calling document.open() without a script global object
   if (!mScriptGlobalObject) {
     nsCOMPtr<nsIDocument> ret = this;
     return ret.forget();
   }
 
   nsPIDOMWindowOuter* outer = GetWindow();
   if (!outer || (GetInnerWindow() != outer->GetCurrentInnerWindow())) {
@@ -1942,16 +1949,22 @@ nsHTMLDocument::WriteCommon(JSContext *c
 
   if (mParserAborted) {
     // Hixie says aborting the parser doesn't undefine the insertion point.
     // However, since we null out mParser in that case, we track the
     // theoretically defined insertion point using mParserAborted.
     return NS_OK;
   }
 
+  // Implement Step 4.1 of:
+  // https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#document-write-steps
+  if (ShouldIgnoreOpens()) {
+    return NS_OK;
+  }
+
   nsresult rv = NS_OK;
 
   void *key = GenerateParserKey();
   if (mParser && !mParser->IsInsertionPointDefined()) {
     if (mIgnoreDestructiveWritesCounter) {
       // Instead of implying a call to document.open(), ignore the call.
       nsContentUtils::ReportToConsole(nsIScriptError::warningFlag,
                                       NS_LITERAL_CSTRING("DOM Events"), this,
--- a/extensions/cookie/test/browser.ini
+++ b/extensions/cookie/test/browser.ini
@@ -1,10 +1,13 @@
 [DEFAULT]
 
 [browser_test_favicon.js]
+support-files =
+  damonbowling.jpg
+  damonbowling.jpg^headers^
 [browser_permmgr_sync.js]
 # The browser_permmgr_sync test tests e10s specific behavior, and runs code
 # paths which would hit the debug only assertion in
 # nsPermissionManager::PermissionKey::CreateFromPrincipal. Because of this, it
 # is only run in e10s opt builds.
 skip-if = debug || !e10s
 [browser_permmgr_viewsrc.js]
--- a/extensions/cookie/test/browser_test_favicon.js
+++ b/extensions/cookie/test/browser_test_favicon.js
@@ -1,28 +1,23 @@
 // tests third party cookie blocking using a favicon load directly from chrome.
 // in this case, the docshell of the channel is chrome, not content; thus
 // the cookie should be considered third party.
 
-function test() {
-  waitForExplicitFinish();
-
-  Services.prefs.setIntPref("network.cookie.cookieBehavior", 1);
+add_task(async function() {
+  const iconUrl = "http://example.org/browser/extensions/cookie/test/damonbowling.jpg";
+	await SpecialPowers.pushPrefEnv({"set": [["network.cookie.cookieBehavior", 1]]});
 
-  Services.obs.addObserver(function (theSubject, theTopic, theData) {
-    var uri = theSubject.QueryInterface(Components.interfaces.nsIURI);
-    var domain = uri.host;
-
-    if (domain == "example.org") {
-      ok(true, "foreign favicon cookie was blocked");
+  let promise = TestUtils.topicObserved("cookie-rejected", subject => {
+    let uri = subject.QueryInterface(Components.interfaces.nsIURI);
+    return uri.spec == iconUrl;
+  });
 
-      Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
-
-      Services.obs.removeObserver(arguments.callee, "cookie-rejected");
+  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "http://example.com/");
+  registerCleanupFunction(async function() {
+    await BrowserTestUtils.removeTab(tab);
+  });
 
-      finish();
-    }
-  }, "cookie-rejected");
-
-  // kick off a favicon load
-  gBrowser.setIcon(gBrowser.selectedTab, "http://example.org/tests/extensions/cookie/test/damonbowling.jpg",
-                   Services.scriptSecurityManager.getSystemPrincipal());
-}
+  // Kick off a favicon load.
+  gBrowser.setIcon(tab, iconUrl);
+  await promise;
+  ok(true, "foreign favicon cookie was blocked");
+});
--- a/extensions/cookie/test/mochitest.ini
+++ b/extensions/cookie/test/mochitest.ini
@@ -1,14 +1,12 @@
 [DEFAULT]
 support-files =
   beltzner.jpg
   beltzner.jpg^headers^
-  damonbowling.jpg
-  damonbowling.jpg^headers^
   file_chromecommon.js
   file_domain_hierarchy_inner.html
   file_domain_hierarchy_inner_inner.html
   file_domain_hierarchy_inner_inner_inner.html
   file_domain_inner.html
   file_domain_inner_inner.html
   file_image_inner.html
   file_image_inner_inner.html
--- a/gfx/src/nsFont.cpp
+++ b/gfx/src/nsFont.cpp
@@ -37,42 +37,52 @@ nsFont::nsFont()
 }
 
 nsFont::~nsFont()
 {
 }
 
 bool nsFont::Equals(const nsFont& aOther) const
 {
-  if ((style == aOther.style) &&
-      (systemFont == aOther.systemFont) &&
-      (weight == aOther.weight) &&
-      (stretch == aOther.stretch) &&
-      (size == aOther.size) &&
-      (sizeAdjust == aOther.sizeAdjust) &&
-      (fontlist == aOther.fontlist) &&
-      (kerning == aOther.kerning) &&
-      (synthesis == aOther.synthesis) &&
-      (fontFeatureSettings == aOther.fontFeatureSettings) &&
-      (fontVariationSettings == aOther.fontVariationSettings) &&
-      (languageOverride == aOther.languageOverride) &&
-      (variantAlternates == aOther.variantAlternates) &&
-      (variantCaps == aOther.variantCaps) &&
-      (variantEastAsian == aOther.variantEastAsian) &&
-      (variantLigatures == aOther.variantLigatures) &&
-      (variantNumeric == aOther.variantNumeric) &&
-      (variantPosition == aOther.variantPosition) &&
-      (variantWidth == aOther.variantWidth) &&
-      (alternateValues == aOther.alternateValues) &&
-      (featureValueLookup == aOther.featureValueLookup) &&
-      (smoothing == aOther.smoothing) &&
-      (fontSmoothingBackgroundColor == aOther.fontSmoothingBackgroundColor)) {
-    return true;
+  return CalcDifference(aOther) == MaxDifference::eNone;
+}
+
+nsFont::MaxDifference
+nsFont::CalcDifference(const nsFont& aOther) const
+{
+  if ((style != aOther.style) ||
+      (systemFont != aOther.systemFont) ||
+      (weight != aOther.weight) ||
+      (stretch != aOther.stretch) ||
+      (size != aOther.size) ||
+      (sizeAdjust != aOther.sizeAdjust) ||
+      (fontlist != aOther.fontlist) ||
+      (kerning != aOther.kerning) ||
+      (synthesis != aOther.synthesis) ||
+      (fontFeatureSettings != aOther.fontFeatureSettings) ||
+      (fontVariationSettings != aOther.fontVariationSettings) ||
+      (languageOverride != aOther.languageOverride) ||
+      (variantAlternates != aOther.variantAlternates) ||
+      (variantCaps != aOther.variantCaps) ||
+      (variantEastAsian != aOther.variantEastAsian) ||
+      (variantLigatures != aOther.variantLigatures) ||
+      (variantNumeric != aOther.variantNumeric) ||
+      (variantPosition != aOther.variantPosition) ||
+      (variantWidth != aOther.variantWidth) ||
+      (alternateValues != aOther.alternateValues) ||
+      (featureValueLookup != aOther.featureValueLookup)) {
+    return MaxDifference::eLayoutAffecting;
   }
-  return false;
+
+  if ((smoothing != aOther.smoothing) ||
+      (fontSmoothingBackgroundColor != aOther.fontSmoothingBackgroundColor)) {
+    return MaxDifference::eVisual;
+  }
+
+  return MaxDifference::eNone;
 }
 
 nsFont& nsFont::operator=(const nsFont& aOther) = default;
 
 void
 nsFont::CopyAlternates(const nsFont& aOther)
 {
   variantAlternates = aOther.variantAlternates;
--- a/gfx/src/nsFont.h
+++ b/gfx/src/nsFont.h
@@ -138,16 +138,24 @@ struct nsFont {
   bool operator!=(const nsFont& aOther) const {
     return !Equals(aOther);
   }
 
   bool Equals(const nsFont& aOther) const;
 
   nsFont& operator=(const nsFont& aOther);
 
+  enum class MaxDifference : uint8_t {
+    eNone,
+    eVisual,
+    eLayoutAffecting
+  };
+
+  MaxDifference CalcDifference(const nsFont& aOther) const;
+
   void CopyAlternates(const nsFont& aOther);
 
   // Add featureSettings into style
   void AddFontFeaturesToStyle(gfxFontStyle *aStyle,
                               bool aVertical) const;
 
   void AddFontVariationsToStyle(gfxFontStyle *aStyle) const;
 };
--- a/gfx/tests/gtest/TestRect.cpp
+++ b/gfx/tests/gtest/TestRect.cpp
@@ -4,16 +4,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/. */
 #include <limits>
 
 #include "gtest/gtest.h"
 
 #include "nsRect.h"
 #include "gfxRect.h"
+#include "mozilla/WritingModes.h"
 #ifdef XP_WIN
 #include <windows.h>
 #endif
 
 template <class RectType>
 static bool
 TestConstructors()
 {
@@ -440,17 +441,65 @@ TestSwap()
 {
   RectType  rect(1, 2, 3, 4);
   EXPECT_TRUE(rect.X() == 1 && rect.Y() == 2 && rect.Width() == 3 && rect.Height() == 4);
   rect.Swap();
   EXPECT_TRUE(rect.X() == 2 && rect.Y() == 1 && rect.Width() == 4 && rect.Height() == 3);
   return true;
 }
 
+static void
+TestIntersectionLogicalHelper(nscoord x1, nscoord y1, nscoord w1, nscoord h1,
+                              nscoord x2, nscoord y2, nscoord w2, nscoord h2,
+                              nscoord xR, nscoord yR, nscoord wR, nscoord hR,
+                              bool isNonEmpty)
+{
+  nsRect rect1(x1, y1, w1, h1);
+  nsRect rect2(x2, y2, w2, h2);
+  nsRect rectDebug;
+  EXPECT_TRUE(isNonEmpty == rectDebug.IntersectRect(rect1, rect2));
+  EXPECT_TRUE(rectDebug.IsEqualEdges(nsRect(xR, yR, wR, hR)));
 
+  mozilla::LogicalRect r1(mozilla::WritingMode(), rect1.X(), rect1.Y(), rect1.Width(), rect1.Height());
+  mozilla::LogicalRect r2(mozilla::WritingMode(), rect2.X(), rect2.Y(), rect2.Width(), rect2.Height());
+  EXPECT_TRUE(isNonEmpty == r1.IntersectRect(r1, r2));
+  EXPECT_TRUE(rectDebug.IsEqualEdges(nsRect(r1.IStart(WritingMode()), r1.BStart(WritingMode()),
+                                            r1.ISize(WritingMode()), r1.BSize(WritingMode()))));
+
+  mozilla::LogicalRect r3(mozilla::WritingMode(), rect1.X(), rect1.Y(), rect1.Width(), rect1.Height());
+  mozilla::LogicalRect r4(mozilla::WritingMode(), rect2.X(), rect2.Y(), rect2.Width(), rect2.Height());
+  EXPECT_TRUE(isNonEmpty == r4.IntersectRect(r3, r4));
+  EXPECT_TRUE(rectDebug.IsEqualEdges(nsRect(r4.IStart(WritingMode()), r4.BStart(WritingMode()),
+                                            r4.ISize(WritingMode()), r4.BSize(WritingMode()))));
+
+  mozilla::LogicalRect r5(mozilla::WritingMode(), rect1.X(), rect1.Y(), rect1.Width(), rect1.Height());
+  mozilla::LogicalRect r6(mozilla::WritingMode(), rect2.X(), rect2.Y(), rect2.Width(), rect2.Height());
+  mozilla::LogicalRect r7(mozilla::WritingMode(), 0, 0, 1, 1);
+  EXPECT_TRUE(isNonEmpty == r7.IntersectRect(r5, r6));
+  EXPECT_TRUE(rectDebug.IsEqualEdges(nsRect(r7.IStart(WritingMode()), r7.BStart(WritingMode()),
+                                            r7.ISize(WritingMode()), r7.BSize(WritingMode()))));
+}
+
+static void
+TestIntersectionLogical(nscoord x1, nscoord y1, nscoord w1, nscoord h1,
+                        nscoord x2, nscoord y2, nscoord w2, nscoord h2,
+                        nscoord xR, nscoord yR, nscoord wR, nscoord hR,
+                        bool isNonEmpty)
+{
+  TestIntersectionLogicalHelper(x1, y1, w1, h1, x2, y2, w2, h2, xR, yR, wR, hR, isNonEmpty);
+  TestIntersectionLogicalHelper(x2, y2, w2, h2, x1, y1, w1, h1, xR, yR, wR, hR, isNonEmpty);
+}
+
+TEST(Gfx, Logical)
+{
+  TestIntersectionLogical(578, 0, 2650, 1152, 1036, 0, 2312, 1, 1036, 0, 2192, 1, true);
+  TestIntersectionLogical(0, 0, 1000, 1000, 500, 500, 1000, 1000, 500, 500, 500, 500, true);
+  TestIntersectionLogical(100, 200, 300, 400, 50, 250, 100, 100, 100, 250, 50, 100, true);
+  TestIntersectionLogical(0, 100, 200, 300, 300, 100, 100, 300, 300, 100, 0, 0, false);
+}
 
 TEST(Gfx, nsRect) {
   TestConstructors<nsRect>();
   TestEqualityOperator<nsRect>();
   TestContainment<nsRect>();
   TestIntersects<nsRect>();
   TestIntersection<nsRect>();
   TestUnion<nsRect>();
@@ -478,8 +527,9 @@ TEST(Gfx, gfxRect) {
   TestIntersects<gfxRect>();
   TestIntersection<gfxRect>();
   TestUnion<gfxRect>();
   TestBug1135677<gfxRect>();
   TestFiniteGfx();
   TestSetWH<gfxRect>();
   TestSwap<gfxRect>();
 }
+
--- a/gfx/thebes/gfxFontFamilyList.h
+++ b/gfx/thebes/gfxFontFamilyList.h
@@ -441,11 +441,16 @@ protected:
     FontFamilyType             mDefaultFontType; // none, serif or sans-serif
 };
 
 inline bool
 operator==(const FontFamilyList& a, const FontFamilyList& b) {
     return a.Equals(b);
 }
 
+inline bool
+operator!=(const FontFamilyList& a, const FontFamilyList& b) {
+    return !a.Equals(b);
+}
+
 } // namespace mozilla
 
 #endif /* GFX_FONT_FAMILY_LIST_H */
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -7473,40 +7473,21 @@ nsCSSFrameConstructor::GetRangeInsertion
   // real parent frame; if not, then the frame hasn't been built yet
   // and we just bail.
   InsertionPoint insertionPoint = GetInsertionPoint(aContainer, nullptr);
   if (!insertionPoint.mParentFrame && !insertionPoint.mMultiple) {
     return insertionPoint; // Don't build the frames.
   }
 
   if (insertionPoint.mMultiple || aStartChild->GetXBLInsertionPoint()) {
-    // We have an insertion point.  There are some additional tests we need to do
-    // in order to ensure that an append is a safe operation.
-    uint32_t childCount = 0;
-
-    if (!insertionPoint.mMultiple) {
-      // We may need to make multiple ContentInserted calls instead.  A
-      // reasonable heuristic to employ (in order to maintain good performance)
-      // is to find out if the insertion point's content node contains any
-      // explicit children.  If it does not, then it is highly likely that
-      // an append is occurring.  (Note it is not definite, and there are insane
-      // cases we will not deal with by employing this heuristic, but it beats
-      // always falling back to multiple ContentInserted calls).
-      //
-      // In the multiple insertion point case, we know we're going to need to do
-      // multiple ContentInserted calls anyway.
-      // XXXndeakin This test doesn't work in the new world. Or rather, it works, but
-      // it's slow
-      childCount = insertionPoint.mParentFrame->GetContent()->GetChildCount();
-    }
-
     // If we have multiple insertion points or if we have an insertion point
     // and the operation is not a true append or if the insertion point already
     // has explicit children, then we must fall back.
-    if (insertionPoint.mMultiple || aEndChild != nullptr || childCount > 0) {
+    if (insertionPoint.mMultiple || aEndChild ||
+        insertionPoint.mParentFrame->GetContent()->HasChildren()) {
       // Now comes the fun part.  For each inserted child, make a
       // ContentInserted call as if it had just gotten inserted and
       // let ContentInserted handle the mess.
       IssueSingleInsertNofications(aContainer, aStartChild, aEndChild,
                                    aInsertionKind);
       insertionPoint.mParentFrame = nullptr;
     }
   }
@@ -7850,29 +7831,24 @@ nsCSSFrameConstructor::ContentAppended(n
     // because processing a single caption can add a whole bunch of things to
     // the frame items due to pseudoframe processing.  So we'd have to pull
     // captions from a list anyway; might as well do that here.
     // XXXbz this is no longer true; we could pull captions directly out of the
     // FrameConstructionItemList now.
     PullOutCaptionFrames(frameItems, captionItems);
   }
 
-  bool dealtWithFirstLine = false;
   if (haveFirstLineStyle && parentFrame == containingBlock) {
     // It's possible that some of the new frames go into a
     // first-line frame. Look at them and see...
     AppendFirstLineFrames(state, containingBlock->GetContent(),
                           containingBlock, frameItems);
     // That moved things into line frames as needed, reparenting their
     // styles.  Nothing else needs to be done.
-    dealtWithFirstLine = true;
-  }
-
-  if (!dealtWithFirstLine &&
-      parentFrame->StyleContext()->HasPseudoElementData()) {
+  } else if (parentFrame->StyleContext()->HasPseudoElementData()) {
     // parentFrame might be inside a ::first-line frame.  Check whether it is,
     // and if so fix up our styles.
     CheckForFirstLineInsertion(parentFrame, frameItems);
     CheckForFirstLineInsertion(parentFrame, captionItems);
   }
 
   // Notify the parent frame passing it the list of new frames
   // Append the flowed frames to the principal child list; captions
@@ -8431,42 +8407,22 @@ nsCSSFrameConstructor::ContentRangeInser
     nsIFrame* appendAfterFrame;
     insertion.mParentFrame =
       ::AdjustAppendParentForAfterContent(this, container,
                                           frameItems.FirstChild()->GetParent(),
                                           aStartChild, &appendAfterFrame);
     prevSibling = ::FindAppendPrevSibling(insertion.mParentFrame, appendAfterFrame);
   }
 
-  bool dealtWithFirstLine = false;
-  if (haveFirstLineStyle && insertion.mParentFrame == containingBlock) {
+  if (haveFirstLineStyle && insertion.mParentFrame == containingBlock && isAppend) {
     // It's possible that the new frame goes into a first-line
     // frame. Look at it and see...
-    if (isAppend) {
-      // Use append logic when appending
-      AppendFirstLineFrames(state, containingBlock->GetContent(),
-                            containingBlock, frameItems);
-      // That moved things into line frames as needed, reparenting their
-      // styles.  Nothing else needs to be done to handle ::first-line.
-      dealtWithFirstLine = true;
-    }
-    else {
-      // Use more complicated insert logic when inserting
-      // XXXbz this method is a no-op, so it's easy for the args being passed
-      // here to make no sense without anyone noticing...  If it ever stops
-      // being a no-op, vet them carefully!
-      // XXXbz Can this code even get hit?  I'd think/hope not, since any
-      // insert would go into an existing lineframe if we have them..
-      InsertFirstLineFrames(state, container, containingBlock, &insertion.mParentFrame,
-                            prevSibling, frameItems);
-    }
-  }
-
-  if (!dealtWithFirstLine &&
-      insertion.mParentFrame->StyleContext()->HasPseudoElementData()) {
+    AppendFirstLineFrames(state, containingBlock->GetContent(),
+                          containingBlock, frameItems);
+  } else if (insertion.mParentFrame->StyleContext()->HasPseudoElementData()) {
     CheckForFirstLineInsertion(insertion.mParentFrame, frameItems);
     CheckForFirstLineInsertion(insertion.mParentFrame, captionItems);
   }
 
   // We might have captions; put them into the caption list of the
   // table wrapper frame.
   if (captionItems.NotEmpty()) {
     NS_ASSERTION(LayoutFrameType::Table == frameType ||
@@ -8541,18 +8497,17 @@ nsCSSFrameConstructor::ContentRangeInser
 #ifdef DEBUG
   if (gReallyNoisyContentUpdates && insertion.mParentFrame) {
     printf("nsCSSFrameConstructor::ContentRangeInserted: resulting frame model:\n");
     insertion.mParentFrame->List(stdout, 0);
   }
 #endif
 
 #ifdef ACCESSIBILITY
-  nsAccessibilityService* accService = nsIPresShell::AccService();
-  if (accService) {
+  if (nsAccessibilityService* accService = nsIPresShell::AccService()) {
     accService->ContentRangeInserted(mPresShell, aContainer,
                                      aStartChild, aEndChild);
   }
 #endif
 }
 
 bool
 nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer,
@@ -11486,159 +11441,16 @@ nsCSSFrameConstructor::AppendFirstLineFr
     return;
   }
 
   nsFirstLineFrame* lineFrame = static_cast<nsFirstLineFrame*>(lastBlockKid);
   WrapFramesInFirstLineFrame(aState, aBlockContent, aBlockFrame,
                              lineFrame, aFrameItems);
 }
 
-// Special routine to handle inserting a new frame into a block
-// frame's child list. Takes care of placing the new frame into the
-// right place when first-line style is present.
-void
-nsCSSFrameConstructor::InsertFirstLineFrames(
-  nsFrameConstructorState& aState,
-  nsIContent*              aContent,
-  nsIFrame*                aBlockFrame,
-  nsContainerFrame**       aParentFrame,
-  nsIFrame*                aPrevSibling,
-  nsFrameItems&            aFrameItems)
-{
-  // XXXbz If you make this method actually do something, check to
-  // make sure that the caller is passing what you expect.  In
-  // particular, which content is aContent?  And audit the rest of
-  // this code too; it makes bogus assumptions and may not build.
-#if 0
-  nsIFrame* parentFrame = *aParentFrame;
-  nsIFrame* newFrame = aFrameItems.childList;
-  bool isInline = IsInlineOutside(newFrame);
-
-  if (!aPrevSibling) {
-    // Insertion will become the first frame. Two cases: we either
-    // already have a first-line frame or we don't.
-    nsIFrame* firstBlockKid = aBlockFrame->PrincipalChildList().FirstChild();
-    if (firstBlockKid->IsLineFrame()) {
-      // We already have a first-line frame
-      nsIFrame* lineFrame = firstBlockKid;
-
-      if (isInline) {
-        // Easy case: the new inline frame will go into the lineFrame.
-        ReparentFrame(this, lineFrame, newFrame);
-        InsertFrames(lineFrame, kPrincipalList, nullptr, newFrame);
-
-        // Since the frame is going into the lineFrame, don't let it
-        // go into the block too.
-        aFrameItems.childList = nullptr;
-        aFrameItems.lastChild = nullptr;
-      }
-      else {
-        // Harder case: We are about to insert a block level element
-        // before the first-line frame.
-        // XXX need a method to steal away frames from the line-frame
-      }
-    }
-    else {
-      // We do not have a first-line frame
-      if (isInline) {
-        // We now need a first-line frame to contain the inline frame.
-        nsIFrame* lineFrame = NS_NewFirstLineFrame(firstLineStyle);
-
-        if (NS_SUCCEEDED(rv)) {
-          // Lookup first-line style context
-          nsStyleContext* parentStyle =
-            nsFrame::CorrectStyleParentFrame(aBlockFrame,
-                                             nsCSSPseudoElements::firstLine)->
-              StyleContext();
-          RefPtr<nsStyleContext> firstLineStyle =
-            GetFirstLineStyle(aContent, parentStyle);
-
-          // Initialize the line frame
-          InitAndRestoreFrame(aState, aContent, aBlockFrame, lineFrame);
-
-          // Make sure the caller inserts the lineFrame into the
-          // blocks list of children.
-          aFrameItems.childList = lineFrame;
-          aFrameItems.lastChild = lineFrame;
-
-          // Give the inline frames to the lineFrame <b>after</b>
-          // reparenting them
-          NS_ASSERTION(lineFrame->StyleContext() == firstLineStyle,
-                       "Bogus style context on line frame");
-          ReparentFrame(aPresContext, lineFrame, newFrame);
-          lineFrame->SetInitialChildList(kPrincipalList, newFrame);
-        }
-      }
-      else {
-        // Easy case: the regular insertion logic can insert the new
-        // frame because it's a block frame.
-      }
-    }
-  }
-  else {
-    // Insertion will not be the first frame.
-    nsIFrame* prevSiblingParent = aPrevSibling->GetParent();
-    if (prevSiblingParent == aBlockFrame) {
-      // Easy case: The prev-siblings parent is the block
-      // frame. Therefore the prev-sibling is not currently in a
-      // line-frame. Therefore the new frame which is going after it,
-      // regardless of type, is not going into a line-frame.
-    }
-    else {
-      // If the prevSiblingParent is not the block-frame then it must
-      // be a line-frame (if it were a letter-frame, that logic would
-      // already have adjusted the prev-sibling to be the
-      // letter-frame).
-      if (isInline) {
-        // Easy case: the insertion can go where the caller thinks it
-        // should go (which is into prevSiblingParent).
-      }
-      else {
-        // Block elements don't end up in line-frames, therefore
-        // change the insertion point to aBlockFrame. However, there
-        // might be more inline elements following aPrevSibling that
-        // need to be pulled out of the line-frame and become children
-        // of the block.
-        nsIFrame* nextSibling = aPrevSibling->GetNextSibling();
-        nsIFrame* nextLineFrame = prevSiblingParent->GetNextInFlow();
-        if (nextSibling || nextLineFrame) {
-          // Oy. We have work to do. Create a list of the new frames
-          // that are going into the block by stripping them away from
-          // the line-frame(s).
-          if (nextSibling) {
-            nsLineFrame* lineFrame = (nsLineFrame*) prevSiblingParent;
-            nsFrameList tail = lineFrame->StealFramesAfter(aPrevSibling);
-            // XXX do something with 'tail'
-          }
-
-          nsLineFrame* nextLineFrame = (nsLineFrame*) lineFrame;
-          for (;;) {
-            nextLineFrame = nextLineFrame->GetNextInFlow();
-            if (!nextLineFrame) {
-              break;
-            }
-            nsIFrame* kids = nextLineFrame->PrincipalChildList().FirstChild();
-          }
-        }
-        else {
-          // We got lucky: aPrevSibling was the last inline frame in
-          // the line-frame.
-          ReparentFrame(this, aBlockFrame, newFrame);
-          InsertFrames(aBlockFrame, kPrincipalList,
-                       prevSiblingParent, newFrame);
-          aFrameItems.childList = nullptr;
-          aFrameItems.lastChild = nullptr;
-        }
-      }
-    }
-  }
-
-#endif
-}
-
 void
 nsCSSFrameConstructor::CheckForFirstLineInsertion(nsIFrame* aParentFrame,
                                                   nsFrameItems& aFrameItems)
 {
   MOZ_ASSERT(aParentFrame->StyleContext()->HasPseudoElementData(),
              "Why were we called?");
 
   if (aFrameItems.IsEmpty()) {
--- a/layout/base/nsCSSFrameConstructor.h
+++ b/layout/base/nsCSSFrameConstructor.h
@@ -2096,23 +2096,16 @@ private:
 
   // Handle the case when a block with first-line style is appended to (by
   // possibly calling WrapFramesInFirstLineFrame as needed).
   void AppendFirstLineFrames(nsFrameConstructorState& aState,
                              nsIContent*              aContent,
                              nsContainerFrame*        aBlockFrame,
                              nsFrameItems&            aFrameItems);
 
-  void InsertFirstLineFrames(nsFrameConstructorState& aState,
-                             nsIContent*              aContent,
-                             nsIFrame*                aBlockFrame,
-                             nsContainerFrame**       aParentFrame,
-                             nsIFrame*                aPrevSibling,
-                             nsFrameItems&            aFrameItems);
-
   /**
    * When aFrameItems is being inserted into aParentFrame, and aParentFrame has
    * pseudo-element-affected styles, it's possible that we're inserting under a
    * ::first-line frame.  In that case, with servo's style system, the styles we
    * resolved for aFrameItems are wrong (they don't take ::first-line into
    * account), and we should fix them up, which is what this method does.
    *
    * This method does not mutate aFrameItems.
--- a/layout/base/nsDocumentViewer.cpp
+++ b/layout/base/nsDocumentViewer.cpp
@@ -1184,16 +1184,23 @@ nsDocumentViewer::PermitUnloadInternal(b
   if (!window) {
     // This is odd, but not fatal
     NS_WARNING("window not set for document!");
     return NS_OK;
   }
 
   NS_ASSERTION(nsContentUtils::IsSafeToRunScript(), "This is unsafe");
 
+  // https://html.spec.whatwg.org/multipage/browsing-the-web.html#prompt-to-unload-a-document
+  // Create an RAII object on mDocument that will increment the
+  // should-ignore-opens-during-unload counter on initialization
+  // and decrement it again when it goes out of score (regardless
+  // of how we exit this function).
+  IgnoreOpensDuringUnload ignoreOpens(mDocument);
+
   // Now, fire an BeforeUnload event to the document and see if it's ok
   // to unload...
   nsIPresShell* shell = mDocument->GetShell();
   nsPresContext* presContext = nullptr;
   if (shell) {
     presContext = shell->GetPresContext();
   }
   RefPtr<BeforeUnloadEvent> event =
@@ -1392,16 +1399,22 @@ nsDocumentViewer::PageHide(bool aIsUnloa
     nsPIDOMWindowOuter* window = mDocument->GetWindow();
 
     if (!window) {
       // Fail if no window is available...
       NS_WARNING("window not set for document!");
       return NS_ERROR_NULL_POINTER;
     }
 
+    // https://html.spec.whatwg.org/multipage/browsing-the-web.html#unload-a-document
+    // Create an RAII object on mDocument that will increment the
+    // should-ignore-opens-during-unload counter on initialization
+    // and decrement it again when it goes out of scope.
+    IgnoreOpensDuringUnload ignoreOpens(mDocument);
+
     // Now, fire an Unload event to the document...
     nsEventStatus status = nsEventStatus_eIgnore;
     WidgetEvent event(true, eUnload);
     event.mFlags.mBubbles = false;
     // XXX Dispatching to |window|, but using |document| as the target.
     event.mTarget = mDocument;
 
     // Never permit popups from the unload handler, no matter how we get
--- a/layout/generic/WritingModes.h
+++ b/layout/generic/WritingModes.h
@@ -1484,123 +1484,132 @@ private:
  */
 class LogicalRect {
 public:
   explicit LogicalRect(WritingMode aWritingMode)
     :
 #ifdef DEBUG
       mWritingMode(aWritingMode),
 #endif
-      mRect(0, 0, 0, 0)
+      mIStart(0),
+      mBStart(0),
+      mISize(0),
+      mBSize(0)
   { }
 
   LogicalRect(WritingMode aWritingMode,
               nscoord aIStart, nscoord aBStart,
               nscoord aISize, nscoord aBSize)
     :
 #ifdef DEBUG
       mWritingMode(aWritingMode),
 #endif
-      mRect(aIStart, aBStart, aISize, aBSize)
+      mIStart(aIStart),
+      mBStart(aBStart),
+      mISize(aISize),
+      mBSize(aBSize)
   { }
 
   LogicalRect(WritingMode aWritingMode,
               const LogicalPoint& aOrigin,
               const LogicalSize& aSize)
     :
 #ifdef DEBUG
       mWritingMode(aWritingMode),
 #endif
-      mRect(aOrigin.mPoint, aSize.mSize)
+      mIStart(aOrigin.mPoint.x),
+      mBStart(aOrigin.mPoint.y),
+      mISize(aSize.mSize.width),
+      mBSize(aSize.mSize.height)
   {
     CHECK_WRITING_MODE(aOrigin.GetWritingMode());
     CHECK_WRITING_MODE(aSize.GetWritingMode());
   }
 
   LogicalRect(WritingMode aWritingMode,
               const nsRect& aRect,
               const nsSize& aContainerSize)
 #ifdef DEBUG
     : mWritingMode(aWritingMode)
 #endif
   {
     if (aWritingMode.IsVertical()) {
-      mRect.y = aWritingMode.IsVerticalLR()
-                ? aRect.x : aContainerSize.width - aRect.XMost();
-      mRect.x = aWritingMode.IsInlineReversed()
-                ? aContainerSize.height - aRect.YMost() : aRect.y;
-      mRect.height = aRect.width;
-      mRect.width = aRect.height;
+      mBStart = aWritingMode.IsVerticalLR()
+               ? aRect.X() : aContainerSize.width - aRect.XMost();
+      mIStart = aWritingMode.IsInlineReversed()
+               ? aContainerSize.height - aRect.YMost() : aRect.Y();
+      mBSize = aRect.Width();
+      mISize = aRect.Height();
     } else {
-      mRect.x = aWritingMode.IsInlineReversed()
-                ? aContainerSize.width - aRect.XMost() : aRect.x;
-      mRect.y = aRect.y;
-      mRect.width = aRect.width;
-      mRect.height = aRect.height;
+      mIStart = aWritingMode.IsInlineReversed()
+               ? aContainerSize.width - aRect.XMost() : aRect.X();
+      mBStart = aRect.Y();
+      mISize = aRect.Width();
+      mBSize = aRect.Height();
     }
   }
 
   /**
    * Inline- and block-dimension geometry.
    */
   nscoord IStart(WritingMode aWritingMode) const // inline-start edge
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return mRect.X();
+    return mIStart;
   }
   nscoord IEnd(WritingMode aWritingMode) const // inline-end edge
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return mRect.XMost();
+    return mIStart + mISize;
   }
   nscoord ISize(WritingMode aWritingMode) const // inline-size
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return mRect.Width();
+    return mISize;
   }
 
   nscoord BStart(WritingMode aWritingMode) const // block-start edge
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return mRect.Y();
+    return mBStart;
   }
   nscoord BEnd(WritingMode aWritingMode) const // block-end edge
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return mRect.YMost();
+    return mBStart + mBSize;
   }
   nscoord BSize(WritingMode aWritingMode) const // block-size
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return mRect.Height();
+    return mBSize;
   }
 
   /**
    * Writable (reference) accessors are only available for the basic logical
    * fields (Start and Size), not derivatives like End.
    */
   nscoord& IStart(WritingMode aWritingMode) // inline-start edge
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return mRect.x;
+    return mIStart;
   }
   nscoord& ISize(WritingMode aWritingMode) // inline-size
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return mRect.width;
+    return mISize;
   }
   nscoord& BStart(WritingMode aWritingMode) // block-start edge
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return mRect.y;
+    return mBStart;
   }
   nscoord& BSize(WritingMode aWritingMode) // block-size
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return mRect.height;
+    return mBSize;
   }
 
   /**
    * Accessors for line-relative coordinates
    */
   nscoord LineLeft(WritingMode aWritingMode,
                    const nsSize& aContainerSize) const
   {
@@ -1627,91 +1636,98 @@ public:
   /**
    * Physical coordinates of the rect.
    */
   nscoord X(WritingMode aWritingMode, nscoord aContainerWidth) const
   {
     CHECK_WRITING_MODE(aWritingMode);
     if (aWritingMode.IsVertical()) {
       return aWritingMode.IsVerticalLR() ?
-             mRect.Y() : aContainerWidth - mRect.YMost();
+             mBStart : aContainerWidth - BEnd();
     } else {
       return aWritingMode.IsInlineReversed() ?
-             aContainerWidth - mRect.XMost() : mRect.X();
+             aContainerWidth - IEnd() : mIStart;
     }
   }
 
   nscoord Y(WritingMode aWritingMode, nscoord aContainerHeight) const
   {
     CHECK_WRITING_MODE(aWritingMode);
     if (aWritingMode.IsVertical()) {
-      return aWritingMode.IsInlineReversed() ? aContainerHeight - mRect.XMost()
-                                             : mRect.X();
+      return aWritingMode.IsInlineReversed() ? aContainerHeight - IEnd()
+                                             : mIStart;
     } else {
-      return mRect.Y();
+      return mBStart;
     }
   }
 
   nscoord Width(WritingMode aWritingMode) const
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return aWritingMode.IsVertical() ? mRect.Height() : mRect.Width();
+    return aWritingMode.IsVertical() ? mBSize : mISize;
   }
 
   nscoord Height(WritingMode aWritingMode) const
   {
     CHECK_WRITING_MODE(aWritingMode);
-    return aWritingMode.IsVertical() ? mRect.Width() : mRect.Height();
+    return aWritingMode.IsVertical() ? mISize : mBSize;
   }
 
   nscoord XMost(WritingMode aWritingMode, nscoord aContainerWidth) const
   {
     CHECK_WRITING_MODE(aWritingMode);
     if (aWritingMode.IsVertical()) {
       return aWritingMode.IsVerticalLR() ?
-             mRect.YMost() : aContainerWidth - mRect.Y();
+             BEnd() : aContainerWidth - mBStart;
     } else {
       return aWritingMode.IsInlineReversed() ?
-             aContainerWidth - mRect.X() : mRect.XMost();
+             aContainerWidth - mIStart : IEnd();
     }
   }
 
   nscoord YMost(WritingMode aWritingMode, nscoord aContainerHeight) const
   {
     CHECK_WRITING_MODE(aWritingMode);
     if (aWritingMode.IsVertical()) {
-      return aWritingMode.IsInlineReversed() ? aContainerHeight - mRect.x
-                                             : mRect.XMost();
+      return aWritingMode.IsInlineReversed() ? aContainerHeight - mIStart
+                                             : IEnd();
     } else {
-      return mRect.YMost();
+      return mBStart;
     }
   }
 
   bool IsEmpty() const
   {
-    return mRect.IsEmpty();
+    return mISize <= 0 || mBSize << 0;
   }
 
   bool IsAllZero() const
   {
-    return (mRect.x == 0 && mRect.y == 0 &&
-            mRect.width == 0 && mRect.height == 0);
+    return (mIStart == 0 && mBStart == 0 &&
+            mISize == 0 && mBSize == 0);
   }
 
   bool IsZeroSize() const
   {
-    return (mRect.width == 0 && mRect.height == 0);
+    return (mISize == 0 && mBSize == 0);
   }
 
-  void SetEmpty() { mRect.SetEmpty(); }
+  void SetEmpty() { mISize = mBSize = 0; }
 
   bool IsEqualEdges(const LogicalRect aOther) const
   {
     CHECK_WRITING_MODE(aOther.GetWritingMode());
-    return mRect.IsEqualEdges(aOther.mRect);
+    bool result = mIStart == aOther.mIStart && mBStart == aOther.mBStart &&
+                  mISize == aOther.mISize && mBSize == aOther.mBSize;
+
+    // We want the same result as nsRect, so assert we get it.
+    MOZ_ASSERT(result == nsRect(mIStart, mBStart, mISize, mBSize).
+                           IsEqualEdges(nsRect(aOther.mIStart, aOther.mBStart,
+                                               aOther.mISize, aOther.mBSize)));
+    return result;
   }
 
   LogicalPoint Origin(WritingMode aWritingMode) const
   {
     CHECK_WRITING_MODE(aWritingMode);
     return LogicalPoint(aWritingMode, IStart(), BStart());
   }
   void SetOrigin(WritingMode aWritingMode, const LogicalPoint& aPoint)
@@ -1732,59 +1748,127 @@ public:
     return LogicalRect(GetWritingMode(),
                        IStart() + aPoint.I(), BStart() + aPoint.B(),
                        ISize(), BSize());
   }
 
   LogicalRect& operator+=(const LogicalPoint& aPoint)
   {
     CHECK_WRITING_MODE(aPoint.GetWritingMode());
-    mRect += aPoint.mPoint;
+    mIStart += aPoint.mPoint.x;
+    mBStart += aPoint.mPoint.y;
     return *this;
   }
 
   LogicalRect operator-(const LogicalPoint& aPoint) const
   {
     CHECK_WRITING_MODE(aPoint.GetWritingMode());
     return LogicalRect(GetWritingMode(),
                        IStart() - aPoint.I(), BStart() - aPoint.B(),
                        ISize(), BSize());
   }
 
   LogicalRect& operator-=(const LogicalPoint& aPoint)
   {
     CHECK_WRITING_MODE(aPoint.GetWritingMode());
-    mRect -= aPoint.mPoint;
+    mIStart -= aPoint.mPoint.x;
+    mBStart -= aPoint.mPoint.y;
     return *this;
   }
 
   void MoveBy(WritingMode aWritingMode, const LogicalPoint& aDelta)
   {
     CHECK_WRITING_MODE(aWritingMode);
     CHECK_WRITING_MODE(aDelta.GetWritingMode());
     IStart() += aDelta.I();
     BStart() += aDelta.B();
   }
 
-  void Inflate(nscoord aD) { mRect.Inflate(aD); }
-  void Inflate(nscoord aDI, nscoord aDB) { mRect.Inflate(aDI, aDB); }
+  void Inflate(nscoord aD)
+  {
+#ifdef DEBUG
+    // Compute using nsRect and assert the results match
+    nsRect rectDebug(mIStart, mBStart, mISize, mBSize);
+    rectDebug.Inflate(aD);
+#endif
+    mIStart -= aD;
+    mBStart -= aD;
+    mISize += 2 * aD;
+    mBSize += 2 * aD;
+    MOZ_ASSERT(rectDebug.IsEqualEdges(nsRect(mIStart, mBStart, mISize, mBSize)));
+  }
+  void Inflate(nscoord aDI, nscoord aDB)
+  {
+#ifdef DEBUG
+    // Compute using nsRect and assert the results match
+    nsRect rectDebug(mIStart, mBStart, mISize, mBSize);
+    rectDebug.Inflate(aDI, aDB);
+#endif
+    mIStart -= aDI;
+    mBStart -= aDB;
+    mISize += 2 * aDI;
+    mBSize += 2 * aDB;
+    MOZ_ASSERT(rectDebug.IsEqualEdges(nsRect(mIStart, mBStart, mISize, mBSize)));
+  }
   void Inflate(WritingMode aWritingMode, const LogicalMargin& aMargin)
   {
     CHECK_WRITING_MODE(aWritingMode);
     CHECK_WRITING_MODE(aMargin.GetWritingMode());
-    mRect.Inflate(aMargin.mMargin);
+#ifdef DEBUG
+    // Compute using nsRect and assert the results match
+    nsRect rectDebug(mIStart, mBStart, mISize, mBSize);
+    rectDebug.Inflate(aMargin.mMargin);
+#endif
+    mIStart -= aMargin.mMargin.left;
+    mBStart -= aMargin.mMargin.top;
+    mISize += aMargin.mMargin.LeftRight();
+    mBSize += aMargin.mMargin.TopBottom();
+    MOZ_ASSERT(rectDebug.IsEqualEdges(nsRect(mIStart, mBStart, mISize, mBSize)));
   }
 
-  void Deflate(nscoord aD) { mRect.Deflate(aD); }
-  void Deflate(nscoord aDI, nscoord aDB) { mRect.Deflate(aDI, aDB); }
+  void Deflate(nscoord aD)
+  {
+#ifdef DEBUG
+    // Compute using nsRect and assert the results match
+    nsRect rectDebug(mIStart, mBStart, mISize, mBSize);
+    rectDebug.Deflate(aD);
+#endif
+    mIStart += aD;
+    mBStart += aD;
+    mISize = std::max(0, mISize - 2 * aD);
+    mBSize = std::max(0, mBSize - 2 * aD);
+    MOZ_ASSERT(rectDebug.IsEqualEdges(nsRect(mIStart, mBStart, mISize, mBSize)));
+  }
+  void Deflate(nscoord aDI, nscoord aDB)
+  {
+#ifdef DEBUG
+    // Compute using nsRect and assert the results match
+    nsRect rectDebug(mIStart, mBStart, mISize, mBSize);
+    rectDebug.Deflate(aDI, aDB);
+#endif
+    mIStart += aDI;
+    mBStart += aDB;
+    mISize = std::max(0, mISize - 2 * aDI);
+    mBSize = std::max(0, mBSize - 2 * aDB);
+    MOZ_ASSERT(rectDebug.IsEqualEdges(nsRect(mIStart, mBStart, mISize, mBSize)));
+  }
   void Deflate(WritingMode aWritingMode, const LogicalMargin& aMargin)
   {
     CHECK_WRITING_MODE(aWritingMode);
     CHECK_WRITING_MODE(aMargin.GetWritingMode());
-    mRect.Deflate(aMargin.mMargin);
+#ifdef DEBUG
+    // Compute using nsRect and assert the results match
+    nsRect rectDebug(mIStart, mBStart, mISize, mBSize);
+    rectDebug.Deflate(aMargin.mMargin);
+#endif
+    mIStart += aMargin.mMargin.left;
+    mBStart += aMargin.mMargin.top;
+    mISize = std::max(0, mISize - aMargin.mMargin.LeftRight());
+    mBSize = std::max(0, mBSize - aMargin.mMargin.TopBottom());
+    MOZ_ASSERT(rectDebug.IsEqualEdges(nsRect(mIStart, mBStart, mISize, mBSize)));
   }
 
   /**
    * Return an nsRect containing our physical coordinates within the given
    * container size.
    */
   nsRect GetPhysicalRect(WritingMode aWritingMode,
                          const nsSize& aContainerSize) const
@@ -1818,75 +1902,102 @@ public:
   /**
    * Set *this to be the rectangle containing the intersection of aRect1
    * and aRect2, return whether the intersection is non-empty.
    */
   bool IntersectRect(const LogicalRect& aRect1, const LogicalRect& aRect2)
   {
     CHECK_WRITING_MODE(aRect1.mWritingMode);
     CHECK_WRITING_MODE(aRect2.mWritingMode);
-    return mRect.IntersectRect(aRect1.mRect, aRect2.mRect);
+#ifdef DEBUG
+    // Compute using nsRect and assert the results match
+    nsRect rectDebug;
+    rectDebug.IntersectRect(nsRect(aRect1.mIStart, aRect1.mBStart,
+                                   aRect1.mISize, aRect1.mBSize),
+                            nsRect(aRect2.mIStart, aRect2.mBStart,
+                                   aRect2.mISize, aRect2.mBSize));
+#endif
+
+    nscoord iEnd = std::min(aRect1.IEnd(), aRect2.IEnd());
+    mIStart = std::max(aRect1.mIStart, aRect2.mIStart);
+    mISize = iEnd - mIStart;
+
+    nscoord bEnd = std::min(aRect1.BEnd(), aRect2.BEnd());
+    mBStart = std::max(aRect1.mBStart, aRect2.mBStart);
+    mBSize = bEnd - mBStart;
+
+    if (mISize < 0 || mBSize < 0) {
+      mISize = 0;
+      mBSize = 0;
+    }
+
+    MOZ_ASSERT(rectDebug.IsEqualEdges(nsRect(mIStart, mBStart, mISize, mBSize)));
+    return mISize > 0 && mBSize > 0;
   }
 
 private:
   LogicalRect() = delete;
 
 #ifdef DEBUG
   WritingMode GetWritingMode() const { return mWritingMode; }
 #else
   WritingMode GetWritingMode() const { return WritingMode::Unknown(); }
 #endif
 
   nscoord IStart() const // inline-start edge
   {
-    return mRect.X();
+    return mIStart;
   }
   nscoord IEnd() const // inline-end edge
   {
-    return mRect.XMost();
+    return mIStart + mISize;
   }
   nscoord ISize() const // inline-size
   {
-    return mRect.Width();
+    return mISize;
   }
 
   nscoord BStart() const // block-start edge
   {
-    return mRect.Y();
+    return mBStart;
   }
   nscoord BEnd() const // block-end edge
   {
-    return mRect.YMost();
+    return mBStart + mBSize;
   }
   nscoord BSize() const // block-size
   {
-    return mRect.Height();
+    return mBSize;
   }
 
   nscoord& IStart() // inline-start edge
   {
-    return mRect.x;
+    return mIStart;
   }
   nscoord& ISize() // inline-size
   {
-    return mRect.width;
+    return mISize;
   }
   nscoord& BStart() // block-start edge
   {
-    return mRect.y;
+    return mBStart;
   }
   nscoord& BSize() // block-size
   {
-    return mRect.height;
+    return mBSize;
   }
 
 #ifdef DEBUG
   WritingMode mWritingMode;
 #endif
-  nsRect      mRect;
+  // Inline- and block-geometry dimension
+  nscoord     mIStart; // inline-start edge
+  nscoord     mBStart; // block-start edge
+  nscoord     mISize; // inline-size
+  nscoord     mBSize; // block-size
 };
 
 } // namespace mozilla
 
 // Definitions of inline methods for nsStyleSides, declared in nsStyleCoord.h
 // but not defined there because they need WritingMode.
 inline nsStyleUnit nsStyleSides::GetUnit(mozilla::WritingMode aWM,
                                          mozilla::LogicalSide aSide) const
new file mode 100644
--- /dev/null
+++ b/layout/style/crashtests/1415353.html
@@ -0,0 +1,8 @@
+<!doctype html>
+<textarea id="htmlvar00003" maxlength="0">
+  <!-- Text nodes around me are important -->
+</textarea>
+<script>
+document.body.offsetTop;
+document.querySelector('textarea').createShadowRoot();
+</script>
--- a/layout/style/crashtests/crashtests.list
+++ b/layout/style/crashtests/crashtests.list
@@ -107,17 +107,17 @@ load 894245-1.html
 load 915440.html
 load 927734-1.html
 load 930270-1.html
 load 930270-2.html
 load 945048-1.html
 load 972199-1.html
 load 989965-1.html
 load 992333-1.html
-pref(dom.webcomponents.enabled,true) load 1017798-1.html # bug 1409086
+pref(dom.webcomponents.enabled,true) load 1017798-1.html
 load 1028514-1.html
 load 1066089-1.html
 load 1074651-1.html
 load 1135534.html
 pref(dom.webcomponents.enabled,true) load 1089463-1.html
 pref(layout.css.expensive-style-struct-assertions.enabled,true) load 1136010-1.html
 pref(layout.css.expensive-style-struct-assertions.enabled,true) load 1146101-1.html
 load 1153693-1.html
@@ -255,8 +255,9 @@ load 1404057.html
 load 1409502.html
 load 1409931.html
 load 1410226-1.html
 load 1410226-2.html
 load 1411143.html
 load 1411478.html
 load 1413288.html
 load 1413361.html
+pref(dom.webcomponents.enabled,true) load 1415353.html
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -194,28 +194,35 @@ nsStyleFont::EnableZoom(nsPresContext* a
 }
 
 nsChangeHint
 nsStyleFont::CalcDifference(const nsStyleFont& aNewData) const
 {
   MOZ_ASSERT(mAllowZoom == aNewData.mAllowZoom,
              "expected mAllowZoom to be the same on both nsStyleFonts");
   if (mSize != aNewData.mSize ||
-      mFont != aNewData.mFont ||
       mLanguage != aNewData.mLanguage ||
       mExplicitLanguage != aNewData.mExplicitLanguage ||
       mMathVariant != aNewData.mMathVariant ||
       mMathDisplay != aNewData.mMathDisplay ||
       mMinFontSizeRatio != aNewData.mMinFontSizeRatio) {
-    // If only mFont.fontSmoothingBackgroundColor changes, we really only need
-    // a repaint hint rather than a reflow+repaint hint, but it's not worth
-    // worth optimizing.
     return NS_STYLE_HINT_REFLOW;
   }
 
+  switch (mFont.CalcDifference(aNewData.mFont)) {
+    case nsFont::MaxDifference::eLayoutAffecting:
+      return NS_STYLE_HINT_REFLOW;
+
+    case nsFont::MaxDifference::eVisual:
+      return NS_STYLE_HINT_VISUAL;
+
+    case nsFont::MaxDifference::eNone:
+      break;
+  }
+
   // XXX Should any of these cause a non-nsChangeHint_NeutralChange change?
   if (mGenericID != aNewData.mGenericID ||
       mScriptLevel != aNewData.mScriptLevel ||
       mScriptUnconstrainedSize != aNewData.mScriptUnconstrainedSize ||
       mScriptMinSize != aNewData.mScriptMinSize ||
       mScriptSizeMultiplier != aNewData.mScriptSizeMultiplier) {
     return nsChangeHint_NeutralChange;
   }
--- a/layout/tables/nsTableCellFrame.cpp
+++ b/layout/tables/nsTableCellFrame.cpp
@@ -440,17 +440,19 @@ nsDisplayTableCellBackground::GetBounds(
   // revert from nsDisplayTableItem's implementation ... cell backgrounds
   // don't overflow the cell
   return nsDisplayItem::GetBounds(aBuilder, aSnap);
 }
 
 void nsTableCellFrame::InvalidateFrame(uint32_t aDisplayItemKey)
 {
   nsIFrame::InvalidateFrame(aDisplayItemKey);
-  GetParent()->InvalidateFrameWithRect(GetVisualOverflowRect() + GetPosition(), aDisplayItemKey);
+  if (GetTableFrame()->IsBorderCollapse() && StyleBorder()->HasBorder()) {
+    GetParent()->InvalidateFrameWithRect(GetVisualOverflowRect() + GetPosition(), aDisplayItemKey);
+  }
 }
 
 void nsTableCellFrame::InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey)
 {
   nsIFrame::InvalidateFrameWithRect(aRect, aDisplayItemKey);
   // If we have filters applied that would affects our bounds, then
   // we get an inactive layer created and this is computed
   // within FrameLayerBuilder
--- a/layout/tables/nsTableColFrame.cpp
+++ b/layout/tables/nsTableColFrame.cpp
@@ -207,17 +207,19 @@ nsTableColFrame::GetSplittableType() con
 {
   return NS_FRAME_NOT_SPLITTABLE;
 }
 
 void
 nsTableColFrame::InvalidateFrame(uint32_t aDisplayItemKey)
 {
   nsIFrame::InvalidateFrame(aDisplayItemKey);
-  GetParent()->InvalidateFrameWithRect(GetVisualOverflowRect() + GetPosition(), aDisplayItemKey);
+  if (GetTableFrame()->IsBorderCollapse() && StyleBorder()->HasBorder()) {
+    GetParent()->InvalidateFrameWithRect(GetVisualOverflowRect() + GetPosition(), aDisplayItemKey);
+  }
 }
 
 void
 nsTableColFrame::InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey)
 {
   nsIFrame::InvalidateFrameWithRect(aRect, aDisplayItemKey);
 
   // If we have filters applied that would affects our bounds, then
--- a/layout/tables/nsTableColGroupFrame.cpp
+++ b/layout/tables/nsTableColGroupFrame.cpp
@@ -463,17 +463,19 @@ NS_NewTableColGroupFrame(nsIPresShell* a
 }
 
 NS_IMPL_FRAMEARENA_HELPERS(nsTableColGroupFrame)
 
 void
 nsTableColGroupFrame::InvalidateFrame(uint32_t aDisplayItemKey)
 {
   nsIFrame::InvalidateFrame(aDisplayItemKey);
-  GetParent()->InvalidateFrameWithRect(GetVisualOverflowRect() + GetPosition(), aDisplayItemKey);
+  if (GetTableFrame()->IsBorderCollapse() && StyleBorder()->HasBorder()) {
+    GetParent()->InvalidateFrameWithRect(GetVisualOverflowRect() + GetPosition(), aDisplayItemKey);
+  }
 }
 
 void
 nsTableColGroupFrame::InvalidateFrameWithRect(const nsRect& aRect,
                                               uint32_t aDisplayItemKey)
 {
   nsIFrame::InvalidateFrameWithRect(aRect, aDisplayItemKey);
   // If we have filters applied that would affects our bounds, then
--- a/layout/tables/nsTableRowFrame.cpp
+++ b/layout/tables/nsTableRowFrame.cpp
@@ -1439,17 +1439,19 @@ void nsTableRowFrame::InitHasCellWithSty
   }
   RemoveStateBits(NS_ROW_HAS_CELL_WITH_STYLE_BSIZE);
 }
 
 void
 nsTableRowFrame::InvalidateFrame(uint32_t aDisplayItemKey)
 {
   nsIFrame::InvalidateFrame(aDisplayItemKey);
-  GetParent()->InvalidateFrameWithRect(GetVisualOverflowRect() + GetPosition(), aDisplayItemKey);
+  if (GetTableFrame()->IsBorderCollapse() && StyleBorder()->HasBorder()) {
+    GetParent()->InvalidateFrameWithRect(GetVisualOverflowRect() + GetPosition(), aDisplayItemKey);
+  }
 }
 
 void
 nsTableRowFrame::InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey)
 {
   nsIFrame::InvalidateFrameWithRect(aRect, aDisplayItemKey);
   // If we have filters applied that would affects our bounds, then
   // we get an inactive layer created and this is computed
--- a/layout/tables/nsTableRowGroupFrame.cpp
+++ b/layout/tables/nsTableRowGroupFrame.cpp
@@ -1990,17 +1990,19 @@ nsTableRowGroupFrame::FrameCursorData::A
   mOverflowBelow = std::max(mOverflowBelow, overflowBelow);
   return mFrames.AppendElement(aFrame) != nullptr;
 }
 
 void
 nsTableRowGroupFrame::InvalidateFrame(uint32_t aDisplayItemKey)
 {
   nsIFrame::InvalidateFrame(aDisplayItemKey);
-  GetParent()->InvalidateFrameWithRect(GetVisualOverflowRect() + GetPosition(), aDisplayItemKey);
+  if (GetTableFrame()->IsBorderCollapse() && StyleBorder()->HasBorder()) {
+    GetParent()->InvalidateFrameWithRect(GetVisualOverflowRect() + GetPosition(), aDisplayItemKey);
+  }
 }
 
 void
 nsTableRowGroupFrame::InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey)
 {
   nsIFrame::InvalidateFrameWithRect(aRect, aDisplayItemKey);
   // If we have filters applied that would affects our bounds, then
   // we get an inactive layer created and this is computed
new file mode 100644
--- /dev/null
+++ b/media/libyuv/clang_x86_asm.patch
@@ -0,0 +1,211 @@
+From 01e994d74e4e3937ee1a3efdc048320a1e51f818 Mon Sep 17 00:00:00 2001
+From: Frank Barchard <fbarchard@chromium.org>
+Date: Tue, 7 Nov 2017 18:17:33 -0800
+Subject: [PATCH] Enable SSE2 code without -msse
+
+Bug: libyuv:754
+Test: CC=clang CXX=clang++ CFLAGS="-m32" CXXFLAGS="-m32 -mno-sse -O2" make -f linux.mk
+Change-Id: I74bf8d032013694e65ea7637bc38d3253db53ff2
+Reviewed-on: https://chromium-review.googlesource.com/758043
+Reviewed-by: Frank Barchard <fbarchard@google.com>
+---
+ include/libyuv/compare_row.h      | 2 +-
+ include/libyuv/planar_functions.h | 2 +-
+ include/libyuv/rotate_row.h       | 2 +-
+ include/libyuv/row.h              | 2 +-
+ include/libyuv/scale_row.h        | 2 +-
+ linux.mk                          | 2 +-
+ source/row_gcc.cc                 | 6 +++---
+ 7 files changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/include/libyuv/compare_row.h b/include/libyuv/compare_row.h
+index 9b7013a2..a34f9ad4 100644
+--- a/include/libyuv/compare_row.h
++++ b/include/libyuv/compare_row.h
+@@ -14,17 +14,17 @@
+ #include "libyuv/basic_types.h"
+ 
+ #ifdef __cplusplus
+ namespace libyuv {
+ extern "C" {
+ #endif
+ 
+ #if defined(__pnacl__) || defined(__CLR_VER) || \
+-    (defined(__i386__) && !defined(__SSE2__))
++    (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
+ #define LIBYUV_DISABLE_X86
+ #endif
+ // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
+ #if defined(__has_feature)
+ #if __has_feature(memory_sanitizer)
+ #define LIBYUV_DISABLE_X86
+ #endif
+ #endif
+diff --git a/include/libyuv/planar_functions.h b/include/libyuv/planar_functions.h
+index d97965cb..c91501a9 100644
+--- a/include/libyuv/planar_functions.h
++++ b/include/libyuv/planar_functions.h
+@@ -715,17 +715,17 @@ int I420Interpolate(const uint8* src0_y,
+                     int dst_stride_u,
+                     uint8* dst_v,
+                     int dst_stride_v,
+                     int width,
+                     int height,
+                     int interpolation);
+ 
+ #if defined(__pnacl__) || defined(__CLR_VER) || \
+-    (defined(__i386__) && !defined(__SSE2__))
++    (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
+ #define LIBYUV_DISABLE_X86
+ #endif
+ // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
+ #if defined(__has_feature)
+ #if __has_feature(memory_sanitizer)
+ #define LIBYUV_DISABLE_X86
+ #endif
+ #endif
+diff --git a/include/libyuv/rotate_row.h b/include/libyuv/rotate_row.h
+index 60ac55ef..973fc152 100644
+--- a/include/libyuv/rotate_row.h
++++ b/include/libyuv/rotate_row.h
+@@ -14,17 +14,17 @@
+ #include "libyuv/basic_types.h"
+ 
+ #ifdef __cplusplus
+ namespace libyuv {
+ extern "C" {
+ #endif
+ 
+ #if defined(__pnacl__) || defined(__CLR_VER) || \
+-    (defined(__i386__) && !defined(__SSE2__))
++    (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
+ #define LIBYUV_DISABLE_X86
+ #endif
+ // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
+ #if defined(__has_feature)
+ #if __has_feature(memory_sanitizer)
+ #define LIBYUV_DISABLE_X86
+ #endif
+ #endif
+diff --git a/include/libyuv/row.h b/include/libyuv/row.h
+index 5ccf94d9..6f0cd500 100644
+--- a/include/libyuv/row.h
++++ b/include/libyuv/row.h
+@@ -26,17 +26,17 @@ extern "C" {
+   uint8* var##_mem = (uint8*)(malloc((size) + 63));         /* NOLINT */ \
+   uint8* var = (uint8*)(((intptr_t)(var##_mem) + 63) & ~63) /* NOLINT */
+ 
+ #define free_aligned_buffer_64(var) \
+   free(var##_mem);                  \
+   var = 0
+ 
+ #if defined(__pnacl__) || defined(__CLR_VER) || \
+-    (defined(__i386__) && !defined(__SSE2__))
++    (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
+ #define LIBYUV_DISABLE_X86
+ #endif
+ // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
+ #if defined(__has_feature)
+ #if __has_feature(memory_sanitizer)
+ #define LIBYUV_DISABLE_X86
+ #endif
+ #endif
+diff --git a/include/libyuv/scale_row.h b/include/libyuv/scale_row.h
+index ebafac4f..b97f3e78 100644
+--- a/include/libyuv/scale_row.h
++++ b/include/libyuv/scale_row.h
+@@ -15,17 +15,17 @@
+ #include "libyuv/scale.h"
+ 
+ #ifdef __cplusplus
+ namespace libyuv {
+ extern "C" {
+ #endif
+ 
+ #if defined(__pnacl__) || defined(__CLR_VER) || \
+-    (defined(__i386__) && !defined(__SSE2__))
++    (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
+ #define LIBYUV_DISABLE_X86
+ #endif
+ // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
+ #if defined(__has_feature)
+ #if __has_feature(memory_sanitizer)
+ #define LIBYUV_DISABLE_X86
+ #endif
+ #endif
+diff --git a/linux.mk b/linux.mk
+index 1dd527c7..7e9aa5e4 100644
+--- a/linux.mk
++++ b/linux.mk
+@@ -75,9 +75,9 @@ psnr: util/psnr.cc
+ 
+ # A C test utility that uses libyuv conversion from C.
+ # gcc 4.4 and older require -fno-exceptions to avoid link error on __gxx_personality_v0
+ # CC=gcc-4.4 CXXFLAGS=-fno-exceptions CXX=g++-4.4 make -f linux.mk
+ cpuid: util/cpuid.c libyuv.a
+ 	$(CC) $(CFLAGS) -o $@ util/cpuid.c libyuv.a
+ 
+ clean:
+-	/bin/rm -f source/*.o *.ii *.s libyuv.a convert cpuid psnr
++	/bin/rm -f source/*.o *.ii *.s libyuv.a yuvconvert cpuid psnr
+diff --git a/source/row_gcc.cc b/source/row_gcc.cc
+index 3af32045..93399f0b 100644
+--- a/source/row_gcc.cc
++++ b/source/row_gcc.cc
+@@ -5474,17 +5474,17 @@ void HalfFloatRow_SSE2(const uint16* src, uint16* dst, float scale, int width) {
+     "psrld       $0xd,%%xmm3                   \n"
+     "packssdw    %%xmm3,%%xmm2                 \n"
+     MEMOPMEM(movdqu,xmm2,-0x10,0,1,1)
+     "sub         $0x8,%2                       \n"
+     "jg          1b                            \n"
+   : "+r"(src),    // %0
+     "+r"(dst),    // %1
+     "+r"(width)   // %2
+-  : "x"(scale * kScaleBias)   // %3
++  : "mx"(scale * kScaleBias)   // %3
+   : "memory", "cc",
+     "xmm2", "xmm3", "xmm4", "xmm5"
+   );
+ }
+ #endif  // HAS_HALFFLOATROW_SSE2
+ 
+ #ifdef HAS_HALFFLOATROW_AVX2
+ void HalfFloatRow_AVX2(const uint16* src, uint16* dst, float scale, int width) {
+@@ -5510,17 +5510,17 @@ void HalfFloatRow_AVX2(const uint16* src, uint16* dst, float scale, int width) {
+     MEMOPMEM(vmovdqu,ymm2,-0x20,0,1,1)
+     "sub        $0x10,%2                       \n"
+     "jg         1b                             \n"
+ 
+     "vzeroupper                                \n"
+   : "+r"(src),    // %0
+     "+r"(dst),    // %1
+     "+r"(width)   // %2
+-  : "x"(scale * kScaleBias)   // %3
++  : "mx"(scale * kScaleBias)   // %3
+   : "memory", "cc",
+     "xmm2", "xmm3", "xmm4", "xmm5"
+   );
+ }
+ #endif  // HAS_HALFFLOATROW_AVX2
+ 
+ #ifdef HAS_HALFFLOATROW_F16C
+ void HalfFloatRow_F16C(const uint16* src, uint16* dst, float scale, int width) {
+@@ -5543,17 +5543,17 @@ void HalfFloatRow_F16C(const uint16* src, uint16* dst, float scale, int width) {
+     MEMOPMEM(vmovdqu,xmm3,0x10,0,1,1)
+     "add         $0x20,%0                      \n"
+     "sub         $0x10,%2                      \n"
+     "jg          1b                            \n"
+     "vzeroupper                                \n"
+   : "+r"(src),   // %0
+     "+r"(dst),   // %1
+     "+r"(width)  // %2
+-  : "x"(scale)   // %3
++  : "mx"(scale)  // %3
+   : "memory", "cc",
+     "xmm2", "xmm3", "xmm4"
+   );
+ }
+ #endif  // HAS_HALFFLOATROW_F16C
+ 
+ #ifdef HAS_HALFFLOATROW_F16C
+ void HalfFloat1Row_F16C(const uint16* src, uint16* dst, float, int width) {
--- a/media/libyuv/libyuv/include/libyuv/compare_row.h
+++ b/media/libyuv/libyuv/include/libyuv/compare_row.h
@@ -14,17 +14,17 @@
 #include "libyuv/basic_types.h"
 
 #ifdef __cplusplus
 namespace libyuv {
 extern "C" {
 #endif
 
 #if defined(__pnacl__) || defined(__CLR_VER) || \
-    (defined(__i386__) && !defined(__SSE2__))
+    (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
 #define LIBYUV_DISABLE_X86
 #endif
 // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
 #if defined(__has_feature)
 #if __has_feature(memory_sanitizer)
 #define LIBYUV_DISABLE_X86
 #endif
 #endif
--- a/media/libyuv/libyuv/include/libyuv/planar_functions.h
+++ b/media/libyuv/libyuv/include/libyuv/planar_functions.h
@@ -715,17 +715,17 @@ int I420Interpolate(const uint8* src0_y,
                     int dst_stride_u,
                     uint8* dst_v,
                     int dst_stride_v,
                     int width,
                     int height,
                     int interpolation);
 
 #if defined(__pnacl__) || defined(__CLR_VER) || \
-    (defined(__i386__) && !defined(__SSE2__))
+    (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
 #define LIBYUV_DISABLE_X86
 #endif
 // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
 #if defined(__has_feature)
 #if __has_feature(memory_sanitizer)
 #define LIBYUV_DISABLE_X86
 #endif
 #endif
--- a/media/libyuv/libyuv/include/libyuv/rotate_row.h
+++ b/media/libyuv/libyuv/include/libyuv/rotate_row.h
@@ -14,17 +14,17 @@
 #include "libyuv/basic_types.h"
 
 #ifdef __cplusplus
 namespace libyuv {
 extern "C" {
 #endif
 
 #if defined(__pnacl__) || defined(__CLR_VER) || \
-    (defined(__i386__) && !defined(__SSE2__))
+    (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
 #define LIBYUV_DISABLE_X86
 #endif
 // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
 #if defined(__has_feature)
 #if __has_feature(memory_sanitizer)
 #define LIBYUV_DISABLE_X86
 #endif
 #endif
--- a/media/libyuv/libyuv/include/libyuv/row.h
+++ b/media/libyuv/libyuv/include/libyuv/row.h
@@ -26,17 +26,17 @@ extern "C" {
   uint8* var##_mem = (uint8*)(malloc((size) + 63));         /* NOLINT */ \
   uint8* var = (uint8*)(((intptr_t)(var##_mem) + 63) & ~63) /* NOLINT */
 
 #define free_aligned_buffer_64(var) \
   free(var##_mem);                  \
   var = 0
 
 #if defined(__pnacl__) || defined(__CLR_VER) || \
-    (defined(__i386__) && !defined(__SSE2__))
+    (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
 #define LIBYUV_DISABLE_X86
 #endif
 // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
 #if defined(__has_feature)
 #if __has_feature(memory_sanitizer)
 #define LIBYUV_DISABLE_X86
 #endif
 #endif
--- a/media/libyuv/libyuv/include/libyuv/scale_row.h
+++ b/media/libyuv/libyuv/include/libyuv/scale_row.h
@@ -15,17 +15,17 @@
 #include "libyuv/scale.h"
 
 #ifdef __cplusplus
 namespace libyuv {
 extern "C" {
 #endif
 
 #if defined(__pnacl__) || defined(__CLR_VER) || \
-    (defined(__i386__) && !defined(__SSE2__))
+    (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
 #define LIBYUV_DISABLE_X86
 #endif
 // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
 #if defined(__has_feature)
 #if __has_feature(memory_sanitizer)
 #define LIBYUV_DISABLE_X86
 #endif
 #endif
--- a/media/libyuv/libyuv/linux.mk
+++ b/media/libyuv/libyuv/linux.mk
@@ -75,9 +75,9 @@ psnr: util/psnr.cc
 
 # A C test utility that uses libyuv conversion from C.
 # gcc 4.4 and older require -fno-exceptions to avoid link error on __gxx_personality_v0
 # CC=gcc-4.4 CXXFLAGS=-fno-exceptions CXX=g++-4.4 make -f linux.mk
 cpuid: util/cpuid.c libyuv.a
 	$(CC) $(CFLAGS) -o $@ util/cpuid.c libyuv.a
 
 clean:
-	/bin/rm -f source/*.o *.ii *.s libyuv.a convert cpuid psnr
+	/bin/rm -f source/*.o *.ii *.s libyuv.a yuvconvert cpuid psnr
--- a/media/libyuv/libyuv/source/row_gcc.cc
+++ b/media/libyuv/libyuv/source/row_gcc.cc
@@ -5474,17 +5474,17 @@ void HalfFloatRow_SSE2(const uint16* src
     "psrld       $0xd,%%xmm3                   \n"
     "packssdw    %%xmm3,%%xmm2                 \n"
     MEMOPMEM(movdqu,xmm2,-0x10,0,1,1)
     "sub         $0x8,%2                       \n"
     "jg          1b                            \n"
   : "+r"(src),    // %0
     "+r"(dst),    // %1
     "+r"(width)   // %2
-  : "x"(scale * kScaleBias)   // %3
+  : "mx"(scale * kScaleBias)   // %3
   : "memory", "cc",
     "xmm2", "xmm3", "xmm4", "xmm5"
   );
 }
 #endif  // HAS_HALFFLOATROW_SSE2
 
 #ifdef HAS_HALFFLOATROW_AVX2
 void HalfFloatRow_AVX2(const uint16* src, uint16* dst, float scale, int width) {
@@ -5510,17 +5510,17 @@ void HalfFloatRow_AVX2(const uint16* src
     MEMOPMEM(vmovdqu,ymm2,-0x20,0,1,1)
     "sub        $0x10,%2                       \n"
     "jg         1b                             \n"
 
     "vzeroupper                                \n"
   : "+r"(src),    // %0
     "+r"(dst),    // %1
     "+r"(width)   // %2
-  : "x"(scale * kScaleBias)   // %3
+  : "mx"(scale * kScaleBias)   // %3
   : "memory", "cc",
     "xmm2", "xmm3", "xmm4", "xmm5"
   );
 }
 #endif  // HAS_HALFFLOATROW_AVX2
 
 #ifdef HAS_HALFFLOATROW_F16C
 void HalfFloatRow_F16C(const uint16* src, uint16* dst, float scale, int width) {
@@ -5543,17 +5543,17 @@ void HalfFloatRow_F16C(const uint16* src
     MEMOPMEM(vmovdqu,xmm3,0x10,0,1,1)
     "add         $0x20,%0                      \n"
     "sub         $0x10,%2                      \n"
     "jg          1b                            \n"
     "vzeroupper                                \n"
   : "+r"(src),   // %0
     "+r"(dst),   // %1
     "+r"(width)  // %2
-  : "x"(scale)   // %3
+  : "mx"(scale)  // %3
   : "memory", "cc",
     "xmm2", "xmm3", "xmm4"
   );
 }
 #endif  // HAS_HALFFLOATROW_F16C
 
 #ifdef HAS_HALFFLOATROW_F16C
 void HalfFloat1Row_F16C(const uint16* src, uint16* dst, float, int width) {
--- a/media/libyuv/update.py
+++ b/media/libyuv/update.py
@@ -47,16 +47,18 @@ def apply_patches():
     # Patch to add H444ToARGB() variant
     os.system("patch -p3 < add_H444ToARGB.patch")
     # Patch for bug 1342730
     os.system("patch -p3 < cpu_id.patch")
     # Patch for bug 1342730
     os.system("patch -p3 < cpu_id.patch")
     # Patch for bug 1342732
     os.system("patch -p3 < row_any.patch")
+    # Patch for bug 1414440
+    os.system("patch -p1 -d libyuv < clang_x86_asm.patch")
 
 def update_readme(commit, commitdate):
     with open('README_MOZILLA') as f:
         readme = f.read()
 
     if 'The git commit ID last used to import was ' in readme:
         new_readme = re.sub('The git commit ID last used to import was [v\.a-f0-9]+ \(.+\)',
             'The git commit ID last used to import was %s (%s)' % (commit, commitdate), readme)
--- a/mobile/android/locales/all-locales
+++ b/mobile/android/locales/all-locales
@@ -1,18 +1,20 @@
+ach
 an
 ar
 as
 ast
 az
 be
 bg
 bn-BD
 bn-IN
 br
+bs
 ca
 cak
 cs
 cy
 da
 de
 dsb
 el
@@ -36,37 +38,40 @@ gl
 gn
 gu-IN
 he
 hi-IN
 hr
 hsb
 hu
 hy-AM
+ia
 id
 is
 it
 ja
 ka
 kab
 kk
 kn
 ko
 lo
 lt
+ltg
 lv
 mai
 ml
 mr
 ms
 my
 nb-NO
 ne-NP
 nl
 nn-NO
+oc
 or
 pa-IN
 pl
 pt-BR
 pt-PT
 rm
 ro
 ru
--- a/mobile/android/locales/l10n.toml
+++ b/mobile/android/locales/l10n.toml
@@ -1,25 +1,27 @@
 # 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/.
 
 basepath = "../../.."
 
 locales = [
+    "ach",
     "an",
     "ar",
     "as",
     "ast",
     "az",
     "be",
     "bg",
     "bn-BD",
     "bn-IN",
     "br",
+    "bs",
     "ca",
     "cak",
     "cs",
     "cy",
     "da",
     "de",
     "dsb",
     "el",
@@ -43,37 +45,40 @@ locales = [
     "gn",
     "gu-IN",
     "he",
     "hi-IN",
     "hr",
     "hsb",
     "hu",
     "hy-AM",
+    "ia",
     "id",
     "is",
     "it",
     "ja",
     "ka",
     "kab",
     "kk",
     "kn",
     "ko",
     "lo",
     "lt",
+    "ltg",
     "lv",
     "mai",
     "ml",
     "mr",
     "ms",
     "my",
     "nb-NO",
     "ne-NP",
     "nl",
     "nn-NO",
+    "oc",
     "or",
     "pa-IN",
     "pl",
     "pt-BR",
     "pt-PT",
     "rm",
     "ro",
     "ru",
--- a/mobile/locales/search/list.json
+++ b/mobile/locales/search/list.json
@@ -364,16 +364,23 @@
     },
     "hy-AM": {
       "default": {
         "visibleDefaultEngines": [
           "google", "yahoo", "bing", "amazondotcom", "list-am", "wikipedia-hy-AM"
         ]
       }
     },
+    "ia": {
+      "default": {
+        "visibleDefaultEngines": [
+          "google", "yahoo", "bing", "amazondotcom", "duckduckgo", "twitter", "wikipedia-ia"
+        ]
+      }
+    },
     "id": {
       "default": {
         "visibleDefaultEngines": [
           "google", "yahoo-id", "bing", "twitter", "wikipedia-id"
         ]
       }
     },
     "is": {
@@ -532,16 +539,23 @@
     },
     "nn-NO": {
       "default": {
         "visibleDefaultEngines": [
           "google", "duckduckgo", "gulesider-mobile-NO", "twitter", "wikipedia-NN"
         ]
       }
     },
+    "oc": {
+      "default": {
+        "visibleDefaultEngines": [
+          "google", "yahoo-france", "bing", "wikipedia-oc", "wiktionary-oc"
+        ]
+      }
+    },
     "or": {
       "default": {
         "visibleDefaultEngines": [
           "google", "yahoo-in", "bing", "amazon-in", "wikipedia-or", "wiktionary-or"
         ]
       }
     },
     "pa-IN": {
new file mode 100644
--- /dev/null
+++ b/mobile/locales/searchplugins/wikipedia-ia.xml
@@ -0,0 +1,23 @@
+<!-- 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/. -->
+
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
+<ShortName>Wikipedia (ia)</ShortName>
+<InputEncoding>UTF-8</InputEncoding>
+<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAA51BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////7+/vl5eWxsbH9/f3Ly8tzc3P39/fe3t5cXFzz8/Pt7e3i4uI3NzcaGhoHBwcFBQX5+fnIyMhTU1MXFxcMDAzx8fHX19fFxcXCwsK7u7u1tbWenp6WlpZ8fHxXV1ctLS319fXn5+fV1dWsrKySkpJnZ2cgICDv7+/p6eng4ODQ0NC9vb24uLikpKSPj4+JiYmCgoJiYmJCQkI7OzsyMjIpKSkQEBCoqKigoKCdnZ14eHhubm5PT09LS0tERETk5OTb29unp6c0NDQkJCQOGD7BAAAAB3RSTlMA8si8ZBhlc+JuAAAAAw1JREFUaN7tmtluIjEQRYEhUxd6YYew7xAggRAgCQmB7Ov8//eM3Zg2nXkJvUjz4POAVEbyQXaVy0gOMaKRMAVAOBINcY5+UWD8OmKCIOaXhlDoNwVKNBShQImEwhQo4RAFjBIogRIogRIogRIoQWCCYXqaHJVaWrtl1IfpYp3GiczFqLHQ5kY9m0l0qVM8Txrs+8ZomkhSKpbOzlraolSP15o/EtxoU9gk2iZVujM7HnVe6eUhKaL4aYrWXWMXfd7+dIlScWxpbsjibQiLPm255sH5jYjKOoCEecge5LcTxqokuItZv5F2DID0iR21ALwctslfunNCurKEBRJkgBTZdIDOoVl0CU7FjgsZHpsi+gNoJGlisDlUkC+C8SQHejzOiqCLgXRTNYazw+vg8tsaHZ+DMd7ZlyR5Qix/uOAEgGOhlzy+EPLMMUmyOHVTyQ0wDBlXB2Dw1FzreCZJGfhyIyiDs/qWSEkiarNPxxaX3J1FWcCRLJXidtFW7MO5lmV3AhMMPS8HHsH4oBJmtEcHF+ROUEgD2E/AiVXO98AtSaoJmC4F1AUjXZAD97Bo0R491ApuBRNdVq/FGhz9hPaI48p9w1mI6rVpi1qQ9FmRuRe8iTPaJgfOi6NaTr20zDoYJUfOM2aOHM15EYwBOKbQwHm14wcY5FYgTzi5CHewMPZytO9aIHuj3MY53sF5s3M0S94EFV5bdiLeshQdgdGwc9T0IJC1VROHs4EHSgHY1XKflaFXQQ6y2MpIVIiSYDStgRLOvN/sDDCSImmv7cxaWVuu5z0LxJKU+Y1M9LE4GHOrsWnkXUDx3a5mRR8zRXFsisj5IeiBc0cmPkRxZMBY0BIGeRLIYmJ8smnLDmVuiL5ngWxksUd5JhVqYEzxTv4I1tiSc9Y38OSTgOZwnki0GYhe55Pg1VqjCUnORLf2SWAVb5fIeYPRJ/4JnoFa1THSATTyT3BcQ++f+8DKRwGN299Hltr/+zdWCZRACZRACZSAlEAJDifwRwPBP3uIUqBEg356EvzjmcCf//wFVbAkwfl+5CMAAAAASUVORK5CYII=</Image>
+<Url type="application/x-suggestions+json" method="GET" template="https://ia.wikipedia.org/w/api.php">
+  <Param name="action" value="opensearch"/>
+  <Param name="search" value="{searchTerms}"/>
+</Url>
+<Url type="text/html" method="GET" template="https://ia.wikipedia.org/wiki/Special:Recerca">
+  <Param name="search" value="{searchTerms}"/>
+  <Param name="sourceid" value="Mozilla-search"/>
+</Url>
+<!-- Search activity -->
+<Url type="text/html" method="GET" rel="mobile" template="https://ia.wikipedia.org/wiki/Special:Recerca">
+  <Param name="search" value="{searchTerms}"/>
+  <Param name="sourceid" value="Mozilla-search"/>
+</Url>
+<SearchForm>https://ia.wikipedia.org/wiki/Special:Recerca</SearchForm>
+</SearchPlugin>
new file mode 100644
--- /dev/null
+++ b/mobile/locales/searchplugins/wikipedia-oc.xml
@@ -0,0 +1,23 @@
+<!-- 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/. -->
+
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
+<ShortName>Wikipèdia (oc)</ShortName>
+<InputEncoding>UTF-8</InputEncoding>
+<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAA51BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////7+/vl5eWxsbH9/f3Ly8tzc3P39/fe3t5cXFzz8/Pt7e3i4uI3NzcaGhoHBwcFBQX5+fnIyMhTU1MXFxcMDAzx8fHX19fFxcXCwsK7u7u1tbWenp6WlpZ8fHxXV1ctLS319fXn5+fV1dWsrKySkpJnZ2cgICDv7+/p6eng4ODQ0NC9vb24uLikpKSPj4+JiYmCgoJiYmJCQkI7OzsyMjIpKSkQEBCoqKigoKCdnZ14eHhubm5PT09LS0tERETk5OTb29unp6c0NDQkJCQOGD7BAAAAB3RSTlMA8si8ZBhlc+JuAAAAAw1JREFUaN7tmtluIjEQRYEhUxd6YYew7xAggRAgCQmB7Ov8//eM3Zg2nXkJvUjz4POAVEbyQXaVy0gOMaKRMAVAOBINcY5+UWD8OmKCIOaXhlDoNwVKNBShQImEwhQo4RAFjBIogRIogRIogRIoQWCCYXqaHJVaWrtl1IfpYp3GiczFqLHQ5kY9m0l0qVM8Txrs+8ZomkhSKpbOzlraolSP15o/EtxoU9gk2iZVujM7HnVe6eUhKaL4aYrWXWMXfd7+dIlScWxpbsjibQiLPm255sH5jYjKOoCEecge5LcTxqokuItZv5F2DID0iR21ALwctslfunNCurKEBRJkgBTZdIDOoVl0CU7FjgsZHpsi+gNoJGlisDlUkC+C8SQHejzOiqCLgXRTNYazw+vg8tsaHZ+DMd7ZlyR5Qix/uOAEgGOhlzy+EPLMMUmyOHVTyQ0wDBlXB2Dw1FzreCZJGfhyIyiDs/qWSEkiarNPxxaX3J1FWcCRLJXidtFW7MO5lmV3AhMMPS8HHsH4oBJmtEcHF+ROUEgD2E/AiVXO98AtSaoJmC4F1AUjXZAD97Bo0R491ApuBRNdVq/FGhz9hPaI48p9w1mI6rVpi1qQ9FmRuRe8iTPaJgfOi6NaTr20zDoYJUfOM2aOHM15EYwBOKbQwHm14wcY5FYgTzi5CHewMPZytO9aIHuj3MY53sF5s3M0S94EFV5bdiLeshQdgdGwc9T0IJC1VROHs4EHSgHY1XKflaFXQQ6y2MpIVIiSYDStgRLOvN/sDDCSImmv7cxaWVuu5z0LxJKU+Y1M9LE4GHOrsWnkXUDx3a5mRR8zRXFsisj5IeiBc0cmPkRxZMBY0BIGeRLIYmJ8smnLDmVuiL5ngWxksUd5JhVqYEzxTv4I1tiSc9Y38OSTgOZwnki0GYhe55Pg1VqjCUnORLf2SWAVb5fIeYPRJ/4JnoFa1THSATTyT3BcQ++f+8DKRwGN299Hltr/+zdWCZRACZRACZSAlEAJDifwRwPBP3uIUqBEg356EvzjmcCf//wFVbAkwfl+5CMAAAAASUVORK5CYII=</Image>
+<Url type="application/x-suggestions+json" method="GET" template="https://oc.wikipedia.org/w/api.php">
+  <Param name="action" value="opensearch"/>
+  <Param name="search" value="{searchTerms}"/>
+</Url>
+<Url type="text/html" method="GET" template="https://oc.wikipedia.org/wiki/Especial:Recèrca">
+  <Param name="search" value="{searchTerms}"/>
+  <Param name="sourceid" value="Mozilla-search"/>
+</Url>
+<!-- Search activity -->
+<Url type="text/html" method="GET" rel="mobile" template="https://oc.wikipedia.org/wiki/Especial:Recèrca">
+  <Param name="search" value="{searchTerms}"/>
+  <Param name="sourceid" value="Mozilla-search"/>
+</Url>
+<SearchForm>https://oc.wikipedia.org/wiki/Especial:Recèrca</SearchForm>
+</SearchPlugin>
new file mode 100644
--- /dev/null
+++ b/mobile/locales/searchplugins/wiktionary-oc.xml
@@ -0,0 +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/. -->
+
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
+<ShortName>Wikiccionari (oc)</ShortName>
+<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAA21BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAD////Z2dnm5uYSEhJCQkJjY2PJycn6+vq4uLhOTk79/f0GBgbg4OBra2tbW1sEBAQeHh729va/v7/u7u4pKSkPDw/d3d2BgYFQUFAjIyMYGBjq6uq0tLSrq6umpqadnZ2Xl5eSkpKNjY1wcHBWVlZGRkY7Ozs1NTUwMDAKCgrDw8OxsbGIiIh6enpoaGhLS0tAQEA3NzcsLCwrKysICAjw8PDW1tbS0tJ0dHTo6Ojj4+PPz898fHxiYmLx8fG6urqhoaFlZWXTVXa3AAAABnRSTlMA8si8ZBgxEvPEAAACy0lEQVRo3u2aa1fiMBCGAXUiiLW2tFguAsr9orBcFBDwsrf//4t2kqbN0d2DS5Pshz15P0BmQvtMMsmclpMU6jiTBg1KZ45TVCdHoE1HJwjQeH8k4PyAVh2nMqBVmVQatCqdAs0yAAMwAAMwAAP414B8pCIzh/m8DYfpMc81+COARKoxc0LI9kBAh3Bl9wPCwC8IOT8Q0CNcp5+MICmg+ymg5Nm2XWskBaxqtr142wfIOsJMAAgzvReQkwecGYAB/AYoLsurOgitV6vyMgdCjSXaEoCpZVmlovDPLVQbhAK0hwkAASGvrKoSlCf8t9SurmO7buF1lQSAB89jceVusENEnCtRwOW9GBGaPxLk4H3Ip05k2YSp8K57IAXoi4hFzW/GKX7CGpmTAtxfYk+fG85pCHDH3OGh8QUkAPyet9y4Q1pQwiHdcUcLO7/KAaCNPc+8Z4btxTl+7EK7kiXkqigJGBDUMF68WacjpmWBzQAkAcUr7JrGzSYS46VPWX1ZAExIVJc8NuN1ShyxulElxCpLA65JNNEtbGBhokmYUXvE0NKAh6haVF4ImfDnkwtWqLBxLQMQS4W0OemNp/YGf+tv6YKVB0CTV4spv1+DFqSzcA9ufAWAeVgt/NeoKgV0asJd0QMFgLJFVyP76sRpD8LldaYC4G/Z1irgpx2nvVShu8IdqwBAl3aOm2FqUZVnuhM8lnslgBpbqK4onLc0CS06IlmAqPpkgymYc8cObfeGjkgNAALCdFUXZZupCYoAM0IlysLYDR2eKsBjGLEoCy1mf2soAYiIR7HjJ7MvQAVAROyuxd5jgII6wMCtVl96wva/o2NTVwcAx/edDw7HB0mA+qfrDyEpfwl82hVQRUioUR+v7v7ViziX6hdxLjspoKcZIEbg/qd/SDEZgAEYAIABGIABaJD2QwPajz1oP7ih++iJ/sMz2o///ALGfwB3vnCGuQAAAABJRU5ErkJggg==</Image>
+<Url type="application/x-suggestions+json" method="GET" template="https://oc.wiktionary.org/w/api.php">
+  <Param name="action" value="opensearch"/>
+  <Param name="search" value="{searchTerms}"/>
+  <Param name="namespace" value="0"/>
+</Url>
+<Url type="text/html" method="get" template="https://oc.wiktionary.org/wiki/Especial:Recèrca">
+  <Param name="search" value="{searchTerms}"/>
+</Url>
+<SearchForm>https://oc.wiktionary.org/wiki/Especial:Recèrca</SearchForm>
+</SearchPlugin>
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -2094,20 +2094,16 @@ pref("network.dns.localDomains", "");
 pref("network.dns.forceResolve", "");
 
 // Contols whether or not "localhost" should resolve when offline
 pref("network.dns.offline-localhost", true);
 
 // The maximum allowed length for a URL - 1MB default
 pref("network.standard-url.max-length", 1048576);
 
-// The preference controls if the rust URL parser is run in parallel with the
-// C++ implementation. Requires restart for changes to take effect.
-pref("network.standard-url.enable-rust", false);
-
 // Whether nsIURI.host/.hostname/.spec should return a punycode string
 // If set to false we will revert to previous behaviour and return a unicode string.
 pref("network.standard-url.punycode-host", true);
 
 // Idle timeout for ftp control connections - 5 minute default
 pref("network.ftp.idleConnectionTimeout", 300);
 
 // directory listing format
deleted file mode 100644
--- a/netwerk/base/RustURL.cpp
+++ /dev/null
@@ -1,759 +0,0 @@
-#include "RustURL.h"
-#include "nsCOMPtr.h"
-#include "nsURLHelper.h"
-
-#ifndef MOZ_RUST_URLPARSE
-  #error "Should be defined"
-#endif
-
-using namespace mozilla::ipc;
-
-namespace mozilla {
-namespace net {
-
-NS_IMPL_ADDREF(RustURL)
-NS_IMPL_RELEASE(RustURL)
-
-NS_INTERFACE_MAP_BEGIN(RustURL)
-  NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIStandardURL)
-  NS_INTERFACE_MAP_ENTRY(nsIURI)
-  NS_INTERFACE_MAP_ENTRY(nsIURL)
-  // NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIFileURL, mSupportsFileURL)
-  NS_INTERFACE_MAP_ENTRY(nsIStandardURL)
-  // NS_INTERFACE_MAP_ENTRY(nsISerializable)
-  NS_INTERFACE_MAP_ENTRY(nsIClassInfo)
-  NS_INTERFACE_MAP_ENTRY(nsIMutable)
-  // NS_INTERFACE_MAP_ENTRY(nsIIPCSerializableURI)
-  // NS_INTERFACE_MAP_ENTRY(nsISensitiveInfoHiddenURI)
-  NS_INTERFACE_MAP_ENTRY(nsISizeOf)
-NS_INTERFACE_MAP_END
-
-#define ENSURE_MUTABLE() \
-  PR_BEGIN_MACRO \
-    if (!mMutable) { \
-      NS_WARNING("attempt to modify an immutable RustURL"); \
-      return NS_ERROR_ABORT; \
-    } \
-  PR_END_MACRO
-
-RustURL::RustURL()
-  : mMutable(true)
-{
-
-}
-
-RustURL::~RustURL()
-{
-
-}
-
-NS_IMETHODIMP
-RustURL::GetSpec(nsACString & aSpec)
-{
-  return rusturl_get_spec(mURL.get(), &aSpec);
-}
-
-NS_IMETHODIMP
-RustURL::SetSpec(const nsACString & aSpec)
-{
-  ENSURE_MUTABLE();
-
-  rusturl* ptr = rusturl_new(&aSpec, nullptr);
-  if (!ptr) {
-    return NS_ERROR_FAILURE;
-  }
-  mURL.reset(ptr);
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::GetPrePath(nsACString & aPrePath)
-{
-  // TODO: use slicing API to get actual prepath
-  aPrePath.Truncate();
-  nsAutoCString rustResult;
-  nsAutoCString part;
-
-  nsresult rv = GetScheme(part);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  rustResult.Append(part);
-  rustResult += "://";
-
-  rv = GetUserPass(part);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  if (!part.IsEmpty()) {
-    rustResult += part;
-    rustResult += "@";
-  }
-
-  rv = GetHostPort(part);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-
-  rustResult += part;
-  aPrePath.Assign(rustResult);
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::GetScheme(nsACString & aScheme)
-{
-  return rusturl_get_scheme(mURL.get(), &aScheme);
-}
-
-NS_IMETHODIMP
-RustURL::SetScheme(const nsACString & aScheme)
-{
-  ENSURE_MUTABLE();
-
-  return rusturl_set_scheme(mURL.get(), &aScheme);
-}
-
-NS_IMETHODIMP
-RustURL::GetUserPass(nsACString & aUserPass)
-{
-  nsresult rv = GetUsername(aUserPass);
-  if (NS_FAILED(rv)) {
-    aUserPass.Truncate();
-    return rv;
-  }
-
-  nsAutoCString password;
-  rv = GetPassword(password);
-  if (NS_FAILED(rv)) {
-    aUserPass.Truncate();
-    return rv;
-  }
-
-  if (password.Length()) {
-    aUserPass.Append(':');
-    aUserPass.Append(password);
-  }
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::SetUserPass(const nsACString & aUserPass)
-{
-  ENSURE_MUTABLE();
-
-  int32_t colonPos = aUserPass.FindChar(':');
-  nsAutoCString user;
-  nsAutoCString pass;
-  if (colonPos == kNotFound) {
-    user = aUserPass;
-  } else {
-    user = Substring(aUserPass, 0, colonPos);
-    pass = Substring(aUserPass, colonPos + 1, aUserPass.Length());
-  }
-
-  nsresult rv = rusturl_set_username(mURL.get(), &user);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-
-  return rusturl_set_password(mURL.get(), &pass);
-}
-
-NS_IMETHODIMP
-RustURL::GetUsername(nsACString & aUsername)
-{
-  return rusturl_get_username(mURL.get(), &aUsername);
-}
-
-NS_IMETHODIMP
-RustURL::SetUsername(const nsACString & aUsername)
-{
-  ENSURE_MUTABLE();
-  return rusturl_set_username(mURL.get(), &aUsername);
-}
-
-NS_IMETHODIMP
-RustURL::GetPassword(nsACString & aPassword)
-{
-  return rusturl_get_password(mURL.get(), &aPassword);
-}
-
-NS_IMETHODIMP
-RustURL::SetPassword(const nsACString & aPassword)
-{
-  ENSURE_MUTABLE();
-  return rusturl_set_password(mURL.get(), &aPassword);
-}
-
-NS_IMETHODIMP
-RustURL::GetHostPort(nsACString & aHostPort)
-{
-  nsresult rv = rusturl_get_host(mURL.get(), &aHostPort);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-
-  int32_t port;
-  rv = GetPort(&port);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  if (port >= 0) {
-    aHostPort.Append(':');
-    aHostPort.AppendInt(port);
-  }
-
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::SetHostPort(const nsACString & aHostPort)
-{
-  ENSURE_MUTABLE();
-  return rusturl_set_host_port(mURL.get(), &aHostPort);
-}
-
-NS_IMETHODIMP
-RustURL::SetHostAndPort(const nsACString & hostport)
-{
-  ENSURE_MUTABLE();
-  return rusturl_set_host_and_port(mURL.get(), &hostport);
-}
-
-NS_IMETHODIMP
-RustURL::GetHost(nsACString & aHost)
-{
-  nsAutoCString host;
-  nsresult rv = rusturl_get_host(mURL.get(), &host);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-
-  if (host.Length() > 0 && host.First() == '[' && host.Last() == ']') {
-    aHost = Substring(host, 1, host.Length() - 2);
-    return NS_OK;
-  }
-
-  aHost = host;
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::SetHost(const nsACString & aHost)
-{
-  ENSURE_MUTABLE();
-  return rusturl_set_host(mURL.get(), &aHost);
-}
-
-NS_IMETHODIMP
-RustURL::GetPort(int32_t *aPort)
-{
-  if (!mURL) {
-    return NS_ERROR_FAILURE;
-  }
-  *aPort = 0;
-  return rusturl_get_port(mURL.get(), aPort);
-}
-
-NS_IMETHODIMP
-RustURL::SetPort(int32_t aPort)
-{
-  ENSURE_MUTABLE();
-  return rusturl_set_port_no(mURL.get(), aPort);
-}
-
-NS_IMETHODIMP
-RustURL::GetPathQueryRef(nsACString & aPath)
-{
-  return rusturl_get_path(mURL.get(), &aPath);
-}
-
-NS_IMETHODIMP
-RustURL::SetPathQueryRef(const nsACString & aPath)
-{
-  ENSURE_MUTABLE();
-
-  nsAutoCString path;
-  nsresult rv = GetPrePath(path);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-
-  if (aPath.Length() > 0 && aPath.First() != '/') {
-    path.Append('/');
-  }
-  path.Append(aPath);
-
-  return SetSpec(path);
-}
-
-NS_IMETHODIMP
-RustURL::Equals(nsIURI *other, bool *aRetVal)
-{
-  *aRetVal = false;
-  nsAutoCString spec;
-  nsresult rv = other->GetSpec(spec);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  nsAutoCString rustSpec;
-  rv = GetSpec(rustSpec);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  if (rustSpec == spec) {
-    *aRetVal = true;
-  }
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::SchemeIs(const char * aScheme, bool *aRetVal)
-{
-  *aRetVal = false;
-  nsAutoCString scheme;
-  nsresult rv = GetScheme(scheme);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  if (scheme.Equals(aScheme, nsCaseInsensitiveCStringComparator())) {
-    *aRetVal = true;
-  }
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::Clone(nsIURI * *aRetVal)
-{
-  RefPtr<RustURL> url = new RustURL();
-  nsAutoCString spec;
-  nsresult rv = GetSpec(spec);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  rv = url->SetSpec(spec);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  url.forget(aRetVal);
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::Resolve(const nsACString & relativePath, nsACString & aRetVal)
-{
-  return rusturl_resolve(mURL.get(), &relativePath, &aRetVal);
-}
-
-NS_IMETHODIMP
-RustURL::GetAsciiSpec(nsACString & aAsciiSpec)
-{
-  return GetSpec(aAsciiSpec);
-}
-
-NS_IMETHODIMP
-RustURL::GetAsciiHostPort(nsACString & aAsciiHostPort)
-{
-  return GetHostPort(aAsciiHostPort);
-}
-
-NS_IMETHODIMP
-RustURL::GetAsciiHost(nsACString & aAsciiHost)
-{
-  return GetHost(aAsciiHost);
-}
-
-NS_IMETHODIMP
-RustURL::GetRef(nsACString & aRef)
-{
-  return rusturl_get_fragment(mURL.get(), &aRef);
-}
-
-NS_IMETHODIMP
-RustURL::SetRef(const nsACString & aRef)
-{
-  ENSURE_MUTABLE();
-  return rusturl_set_fragment(mURL.get(), &aRef);
-}
-
-NS_IMETHODIMP
-RustURL::EqualsExceptRef(nsIURI *other, bool *_retval)
-{
-  *_retval = false;
-  nsAutoCString otherSpec;
-  nsresult rv = other->GetSpecIgnoringRef(otherSpec);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  nsAutoCString thisSpec;
-  rv = GetSpecIgnoringRef(thisSpec);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  if (thisSpec == otherSpec) {
-    *_retval = true;
-  }
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::CloneIgnoringRef(nsIURI * *_retval)
-{
-  return CloneWithNewRef(NS_LITERAL_CSTRING(""), _retval);
-}
-
-NS_IMETHODIMP
-RustURL::CloneWithNewRef(const nsACString & newRef, nsIURI * *_retval)
-{
-  nsCOMPtr<nsIURI> uri;
-  nsresult rv = Clone(getter_AddRefs(uri));
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  rv = uri->SetRef(newRef);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  uri.forget(_retval);
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::GetSpecIgnoringRef(nsACString & aSpecIgnoringRef)
-{
-  nsresult rv = GetSpec(aSpecIgnoringRef);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  int32_t pos = aSpecIgnoringRef.FindChar('#');
-  if (pos == kNotFound) {
-    return NS_OK;
-  }
-
-  aSpecIgnoringRef.Truncate(pos);
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::GetDisplaySpec(nsACString &aUnicodeSpec)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::GetDisplayHostPort(nsACString &aUnicodeHostPort)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::GetDisplayHost(nsACString &aUnicodeHost)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::GetDisplayPrePath(nsACString & aPrePath)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::GetHasRef(bool *aHasRef)
-{
-  *aHasRef = false;
-  return rusturl_has_fragment(mURL.get(), aHasRef);
-}
-
-/// nsIURL
-
-NS_IMETHODIMP
-RustURL::GetFilePath(nsACString & aFilePath)
-{
-  return rusturl_get_path(mURL.get(), &aFilePath);
-}
-
-NS_IMETHODIMP
-RustURL::SetFilePath(const nsACString & aFilePath)
-{
-  ENSURE_MUTABLE();
-  return rusturl_set_path(mURL.get(), &aFilePath);
-}
-
-NS_IMETHODIMP
-RustURL::GetQuery(nsACString & aQuery)
-{
-  return rusturl_get_query(mURL.get(), &aQuery);
-}
-
-NS_IMETHODIMP
-RustURL::SetQuery(const nsACString & aQuery)
-{
-  ENSURE_MUTABLE();
-  return rusturl_set_query(mURL.get(), &aQuery);
-}
-
-NS_IMETHODIMP
-RustURL::SetQueryWithEncoding(const nsACString& aQuery,
-                              const Encoding* aEncoding)
-{
-  ENSURE_MUTABLE();
-  //XXX rust-url-capi should support the concept of "encoding override"
-  return rusturl_set_query(mURL.get(), &aQuery);
-}
-
-NS_IMETHODIMP
-RustURL::GetDirectory(nsACString & aDirectory)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::SetDirectory(const nsACString & aDirectory)
-{
-  ENSURE_MUTABLE();
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::GetFileName(nsACString & aFileName)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::SetFileName(const nsACString & aFileName)
-{
-  ENSURE_MUTABLE();
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::GetFileBaseName(nsACString & aFileBaseName)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::SetFileBaseName(const nsACString & aFileBaseName)
-{
-  ENSURE_MUTABLE();
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::GetFileExtension(nsACString & aFileExtension)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::SetFileExtension(const nsACString & aFileExtension)
-{
-  ENSURE_MUTABLE();
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::GetCommonBaseSpec(nsIURI *aURIToCompare, nsACString & _retval)
-{
-  RefPtr<RustURL> url = new RustURL();
-  nsAutoCString spec;
-  nsresult rv = aURIToCompare->GetSpec(spec);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  rv = url->SetSpec(spec);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  return rusturl_common_base_spec(mURL.get(), url->mURL.get(), &_retval);
-}
-
-NS_IMETHODIMP
-RustURL::GetRelativeSpec(nsIURI *aURIToCompare, nsACString & _retval)
-{
-  RefPtr<RustURL> url = new RustURL();
-  nsAutoCString spec;
-  nsresult rv = aURIToCompare->GetSpec(spec);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-  rv = url->SetSpec(spec);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-
-  return rusturl_relative_spec(mURL.get(), url->mURL.get(), &_retval);
-}
-
-// nsIFileURL
-
-
-NS_IMETHODIMP
-RustURL::GetFile(nsIFile * *aFile)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::SetFile(nsIFile *aFile)
-{
-  ENSURE_MUTABLE();
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-// nsIStandardURL
-
-NS_IMETHODIMP
-RustURL::Init(uint32_t aUrlType, int32_t aDefaultPort, const nsACString & aSpec,
-              const char * aOriginCharset, nsIURI *aBaseURI)
-{
-  ENSURE_MUTABLE();
-
-  if (aBaseURI && net_IsAbsoluteURL(aSpec)) {
-    aBaseURI = nullptr;
-  }
-
-  if (!aBaseURI) {
-    return SetSpec(aSpec);
-  }
-
-  nsAutoCString buf;
-  nsresult rv = aBaseURI->Resolve(aSpec, buf);
-  if (NS_FAILED(rv)) {
-    return rv;
-  }
-
-  return SetSpec(buf);
-}
-
-NS_IMETHODIMP
-RustURL::SetDefaultPort(int32_t aNewDefaultPort)
-{
-  ENSURE_MUTABLE();
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-// nsISerializable
-
-NS_IMETHODIMP
-RustURL::Read(nsIObjectInputStream *aInputStream)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::Write(nsIObjectOutputStream *aOutputStream)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-void
-RustURL::Serialize(URIParams& aParams)
-{
-  // TODO
-}
-
-bool
-RustURL::Deserialize(const URIParams& aParams)
-{
-  // TODO
-  return false;
-}
-
-// nsIClassInfo
-
-NS_IMETHODIMP
-RustURL::GetInterfaces(uint32_t *count, nsIID ***array)
-{
-  *count = 0;
-  *array = nullptr;
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::GetScriptableHelper(nsIXPCScriptable * *_retval)
-{
-  *_retval = nullptr;
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::GetContractID(nsACString& aContractID)
-{
-  aContractID.SetIsVoid(true);
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::GetClassDescription(nsACString& aClassDescription)
-{
-  aClassDescription.SetIsVoid(true);
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::GetClassID(nsCID **aClassID)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-NS_IMETHODIMP
-RustURL::GetFlags(uint32_t *aFlags)
-{
-  *aFlags = nsIClassInfo::MAIN_THREAD_ONLY;
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/// nsIMutable
-
-NS_IMETHODIMP
-RustURL::GetMutable(bool *aValue)
-{
-  *aValue = mMutable;
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-RustURL::SetMutable(bool aValue)
-{
-  if (mMutable || !aValue) {
-    return NS_ERROR_FAILURE;
-  }
-  mMutable = aValue;
-  return NS_OK;
-}
-
-// nsISensitiveInfoHiddenURI
-
-NS_IMETHODIMP
-RustURL::GetSensitiveInfoHiddenSpec(nsACString & _retval)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-// nsISizeOf
-
-size_t
-RustURL::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
-{
-  return mURL.get() ? sizeof_rusturl() : 0;
-}
-
-size_t
-RustURL::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
-{
-  return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
-}
-
-} // namespace net
-} // namespace mozilla
-
deleted file mode 100644
--- a/netwerk/base/RustURL.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/* 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/. */
-
-#ifndef RustURL_h__
-#define RustURL_h__
-
-#include "nsISerializable.h"
-#include "nsIFileURL.h"
-#include "nsIStandardURL.h"
-#include "nsIClassInfo.h"
-#include "nsISizeOf.h"
-#include "nsIIPCSerializableURI.h"
-#include "nsISensitiveInfoHiddenURI.h"
-
-#include "rust-url-capi/src/rust-url-capi.h"
-#include "mozilla/UniquePtr.h"
-
-namespace mozilla {
-namespace net {
-
-class RustURL final
-  : public nsIFileURL
-  , public nsIStandardURL
-  , public nsISerializable
-  , public nsIClassInfo
-  , public nsISizeOf
-  , public nsIIPCSerializableURI
-  , public nsISensitiveInfoHiddenURI
-{
-  NS_DECL_ISUPPORTS
-  NS_DECL_NSIURI
-  NS_DECL_NSIURL
-  NS_DECL_NSIFILEURL
-  NS_DECL_NSISTANDARDURL
-  NS_DECL_NSISERIALIZABLE
-  NS_DECL_NSICLASSINFO
-  NS_DECL_NSIMUTABLE
-  NS_DECL_NSIIPCSERIALIZABLEURI
-  NS_DECL_NSISENSITIVEINFOHIDDENURI
-
-  RustURL();
-  // nsISizeOf
-  virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
-  virtual size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
-private:
-  virtual ~RustURL();
-
-  struct FreeRustURL { void operator()(rusturl* aPtr) { rusturl_free(aPtr); } };
-  mutable mozilla::UniquePtr<rusturl, FreeRustURL> mURL;
-
-  bool mMutable;
-};
-
-} // namespace net
-} // namespace mozilla
-
-#endif // RustURL_h__
--- a/netwerk/base/moz.build
+++ b/netwerk/base/moz.build
@@ -252,20 +252,16 @@ UNIFIED_SOURCES += [
     'SimpleChannel.cpp',
     'SimpleChannelParent.cpp',
     'TCPFastOpenLayer.cpp',
     'ThrottleQueue.cpp',
     'Tickler.cpp',
     'TLSServerSocket.cpp',
 ]
 
-if CONFIG['MOZ_RUST_URLPARSE']:
-    EXPORTS.mozilla.net += [ 'RustURL.h' ]
-    UNIFIED_SOURCES += [ 'RustURL.cpp' ]
-
 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
     SOURCES += [
         'nsURLHelperWin.cpp',
         'ShutdownLayer.cpp',
     ]
 elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
     SOURCES += [
         'nsURLHelperOSX.cpp',
--- a/netwerk/base/nsStandardURL.cpp
+++ b/netwerk/base/nsStandardURL.cpp
@@ -22,121 +22,30 @@
 #include "nsNetCID.h"
 #include "mozilla/MemoryReporting.h"
 #include "mozilla/ipc/URIUtils.h"
 #include <algorithm>
 #include "mozilla/SyncRunnable.h"
 #include "nsContentUtils.h"
 #include "prprf.h"
 #include "nsReadableUtils.h"
+#include "rust-url-capi/src/rust-url-capi.h"
 
 
 //
 // setenv MOZ_LOG nsStandardURL:5
 //
 static LazyLogModule gStandardURLLog("nsStandardURL");
 
 // The Chromium code defines its own LOG macro which we don't want
 #undef LOG
 #define LOG(args)     MOZ_LOG(gStandardURLLog, LogLevel::Debug, args)
 #undef LOG_ENABLED
 #define LOG_ENABLED() MOZ_LOG_TEST(gStandardURLLog, LogLevel::Debug)
 
-#ifdef MOZ_RUST_URLPARSE
-
-#include "RustURL.h"
-
-// Modified on the main thread, read on both main thread and worker threads.
-Atomic<bool> nsStandardURL::gRustEnabled(false);
-
-// Fall back to CPP-parsed URLs if the Rust one doesn't match.
-#define MOZ_RUST_URLPARSE_FALLBACK
-
-#ifdef MOZ_RUST_URLPARSE_FALLBACK
-#define MOZ_RUST_URLPARSE_FALLBACK_MACRO(expr) expr
-#else
-#define MOZ_RUST_URLPARSE_FALLBACK_MACRO(expr)
-#endif
-
-#define CALL_RUST_SETTER(func, ...)  \
-do {                                 \
-    if (!mRustURL) break;            \
-    mRustURL->func(__VA_ARGS__);     \
-    nsAutoCString rustSpec;          \
-    mRustURL->GetSpec(rustSpec);     \
-    if (mSpec != rustSpec) {         \
-        LOG(("Spec diff detected after setter (%s): rust: %s standard-url: %s\n", \
-             #func, rustSpec.get(), mSpec.get())); \
-    }                                \
-} while (0)
-
-#define CALL_RUST_GETTER_STR(result, func, ...)  \
-do {                                             \
-    if (!mRustURL) break;                        \
-    nsAutoCString backup(result);                \
-    mRustURL->func(__VA_ARGS__);                 \
-    if (backup != result) {                      \
-        LOG(("Diff detected calling getter (%s): rust: %s standard-url: %s\n", \
-             #func, result.BeginReading() , backup.BeginReading())); \
-        MOZ_RUST_URLPARSE_FALLBACK_MACRO(result = backup);          \
-    }                                            \
-} while (0)
-
-#define CALL_RUST_GETTER_INT(result, func, ...)  \
-do {                                             \
-    if (!mRustURL) break;                        \
-    int32_t backup = *result;                    \
-    mRustURL->func(__VA_ARGS__);                 \
-    if (backup != *result) {                     \
-        LOG(("Diff detected calling getter (%s): rust: %d standard-url: %d\n", \
-             #func, *result , backup)); \
-        MOZ_RUST_URLPARSE_FALLBACK_MACRO(*result = backup);         \
-    }                                            \
-} while (0)
-
-#define COPY_RUST_MEMBER                \
-do {                                    \
-  if (!gRustEnabled) break;             \
-  RefPtr<RustURL> url = new RustURL();  \
-  nsAutoCString spec;                   \
-  GetSpec(spec);                        \
-  url->SetSpec(spec);                   \
-  mRustURL = url;                       \
-} while (0)
-
-#define CALL_RUST_SYNC                  \
-do {                                    \
-    if (!mRustURL) break;               \
-    mRustURL->SetSpec(mSpec);           \
-} while (0)
-
-#define CALL_SET_MUTABLE                \
-do {                                    \
-    if (!mRustURL) break;               \
-    mRustURL->SetMutable(value);        \
-} while (0)
-
-#define CALL_RUST_INIT                  \
-do {                                    \
-    if (!mRustURL) break;               \
-    mRustURL->Init(urlType, defaultPort, spec, charset, baseURI); \
-} while (0)
-
-#else
-
-#define CALL_RUST_SETTER(func, ...)
-#define CALL_RUST_GETTER_STR(expected, func, ...)
-#define CALL_RUST_GETTER_INT(expected, func, ...)
-#define CALL_RUST_INIT
-#define CALL_RUST_SYNC
-#define CALL_SET_MUTABLE
-#define COPY_RUST_MEMBER
-
-#endif // MOZ_RUST_URLPARSE
-
 using namespace mozilla::ipc;
 
 namespace mozilla {
 namespace net {
 
 static NS_DEFINE_CID(kThisImplCID, NS_THIS_STANDARDURL_IMPL_CID);
 static NS_DEFINE_CID(kStandardURLCID, NS_STANDARDURL_CID);
 
@@ -180,18 +89,16 @@ constexpr ASCIIMaskArray sInvalidHostCha
         return NS_ERROR_ABORT; \
     } \
   PR_END_MACRO
 
 //----------------------------------------------------------------------------
 // nsStandardURL::nsPrefObserver
 //----------------------------------------------------------------------------
 
-#define NS_NET_PREF_ENABLE_RUST        "network.standard-url.enable-rust"
-
 NS_IMPL_ISUPPORTS(nsStandardURL::nsPrefObserver, nsIObserver)
 
 NS_IMETHODIMP nsStandardURL::
 nsPrefObserver::Observe(nsISupports *subject,
                         const char *topic,
                         const char16_t *data)
 {
     MOZ_ASSERT(NS_IsMainThread());
@@ -317,21 +224,16 @@ nsStandardURL::nsStandardURL(bool aSuppo
 #ifdef DEBUG_DUMP_URLS_AT_SHUTDOWN
     if (NS_IsMainThread()) {
         if (aTrackURL) {
             gAllURLs.insertBack(this);
         }
     }
 #endif
 
-#ifdef MOZ_RUST_URLPARSE
-    if (gRustEnabled) {
-        mRustURL = new RustURL();
-    }
-#endif
 }
 
 nsStandardURL::~nsStandardURL()
 {
     LOG(("Destroying nsStandardURL @%p\n", this));
 }
 
 #ifdef DEBUG_DUMP_URLS_AT_SHUTDOWN
@@ -369,19 +271,16 @@ nsStandardURL::InitGlobalObjects()
     }
 
     MOZ_ASSERT(NS_IsMainThread());
     gInitialized = true;
 
     nsCOMPtr<nsIPrefBranch> prefBranch( do_GetService(NS_PREFSERVICE_CONTRACTID) );
     if (prefBranch) {
         nsCOMPtr<nsIObserver> obs( new nsPrefObserver() );
-#ifdef MOZ_RUST_URLPARSE
-        prefBranch->AddObserver(NS_NET_PREF_ENABLE_RUST, obs.get(), false);
-#endif
         PrefsChanged(prefBranch, nullptr);
     }
 
     Preferences::AddBoolVarCache(&gPunycodeHost, "network.standard-url.punycode-host", true);
     nsCOMPtr<nsIIDNService> serv(do_GetService(NS_IDNSERVICE_CONTRACTID));
     if (serv) {
         NS_ADDREF(gIDN = serv.get());
         MOZ_ASSERT(gIDN);
@@ -1278,26 +1177,16 @@ nsStandardURL::PrefsChanged(nsIPrefBranc
 {
     MOZ_ASSERT(NS_IsMainThread());
 
     LOG(("nsStandardURL::PrefsChanged [pref=%s]\n", pref));
 
 #define PREF_CHANGED(p) ((pref == nullptr) || !strcmp(pref, p))
 #define GOT_PREF(p, b) (NS_SUCCEEDED(prefs->GetBoolPref(p, &b)))
 
-#ifdef MOZ_RUST_URLPARSE
-    bool val;
-    if (PREF_CHANGED(NS_NET_PREF_ENABLE_RUST)) {
-        if (GOT_PREF(NS_NET_PREF_ENABLE_RUST, val)) {
-            gRustEnabled = val;
-        }
-        LOG(("Rust parser %s\n", gRustEnabled ? "enabled" : "disabled"));
-    }
-#endif // MOZ_RUST_URLPARSE
-
 #undef PREF_CHANGED
 #undef GOT_PREF
 }
 
 #define SHIFT_FROM(name, what)                    \
 void                                              \
 nsStandardURL::name(int32_t diff)                 \
 {                                                 \
@@ -1366,32 +1255,30 @@ nsStandardURL::GetSpec(nsACString &resul
     MOZ_ASSERT(mSpec.Length() <= (uint32_t) net_GetURLMaxLength(),
                "The spec should never be this long, we missed a check.");
     nsresult rv = NS_OK;
     if (gPunycodeHost) {
         result = mSpec;
     } else { // XXX: This code path may be slow
         rv = GetDisplaySpec(result);
     }
-    CALL_RUST_GETTER_STR(result, GetSpec, result);
     return rv;
 }
 
 // result may contain unescaped UTF-8 characters
 NS_IMETHODIMP
 nsStandardURL::GetSensitiveInfoHiddenSpec(nsACString &result)
 {
     nsresult rv = GetSpec(result);
     if (NS_FAILED(rv)) {
         return rv;
     }
     if (mPassword.mLen >= 0) {
       result.ReplaceLiteral(mPassword.mPos, mPassword.mLen, "****");
     }
-    CALL_RUST_GETTER_STR(result, GetSensitiveInfoHiddenSpec, result);
     return NS_OK;
 }
 
 // result may contain unescaped UTF-8 characters
 NS_IMETHODIMP
 nsStandardURL::GetSpecIgnoringRef(nsACString &result)
 {
     // URI without ref is 0 to one char before ref
@@ -1403,17 +1290,16 @@ nsStandardURL::GetSpecIgnoringRef(nsACSt
     result = Segment(noRef);
 
     CheckIfHostIsAscii();
     MOZ_ASSERT(mCheckedIfHostA);
     if (!gPunycodeHost && !mDisplayHost.IsEmpty()) {
         result.Replace(mHost.mPos, mHost.mLen, mDisplayHost);
     }
 
-    CALL_RUST_GETTER_STR(result, GetSpecIgnoringRef, result);
     return NS_OK;
 }
 
 nsresult
 nsStandardURL::CheckIfHostIsAscii()
 {
     nsresult rv;
     if (mCheckedIfHostA) {
@@ -1499,17 +1385,16 @@ NS_IMETHODIMP
 nsStandardURL::GetPrePath(nsACString &result)
 {
     result = Prepath();
     CheckIfHostIsAscii();
     MOZ_ASSERT(mCheckedIfHostA);
     if (!gPunycodeHost && !mDisplayHost.IsEmpty()) {
         result.Replace(mHost.mPos, mHost.mLen, mDisplayHost);
     }
-    CALL_RUST_GETTER_STR(result, GetPrePath, result);
     return NS_OK;
 }
 
 // result may contain unescaped UTF-8 characters
 NS_IMETHODIMP
 nsStandardURL::GetDisplayPrePath(nsACString &result)
 {
     result = Prepath();
@@ -1521,106 +1406,97 @@ nsStandardURL::GetDisplayPrePath(nsACStr
     return NS_OK;
 }
 
 // result is strictly US-ASCII
 NS_IMETHODIMP
 nsStandardURL::GetScheme(nsACString &result)
 {
     result = Scheme();
-    CALL_RUST_GETTER_STR(result, GetScheme, result);
     return NS_OK;
 }
 
 // result may contain unescaped UTF-8 characters
 NS_IMETHODIMP
 nsStandardURL::GetUserPass(nsACString &result)
 {
     result = Userpass();
-    CALL_RUST_GETTER_STR(result, GetUserPass, result);
     return NS_OK;
 }
 
 // result may contain unescaped UTF-8 characters
 NS_IMETHODIMP
 nsStandardURL::GetUsername(nsACString &result)
 {
     result = Username();
-    CALL_RUST_GETTER_STR(result, GetUsername, result);
     return NS_OK;
 }
 
 // result may contain unescaped UTF-8 characters
 NS_IMETHODIMP
 nsStandardURL::GetPassword(nsACString &result)
 {
     result = Password();
-    CALL_RUST_GETTER_STR(result, GetPassword, result);
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsStandardURL::GetHostPort(nsACString &result)
 {
     nsresult rv;
     if (gPunycodeHost) {
         rv = GetAsciiHostPort(result);
     } else {
         rv = GetDisplayHostPort(result);
     }
-    CALL_RUST_GETTER_STR(result, GetHostPort, result);
     return rv;
 }
 
 NS_IMETHODIMP
 nsStandardURL::GetHost(nsACString &result)
 {
     nsresult rv;
     if (gPunycodeHost) {
         rv = GetAsciiHost(result);
     } else {
         rv = GetDisplayHost(result);
     }
-    CALL_RUST_GETTER_STR(result, GetHost, result);
     return rv;
 }
 
 NS_IMETHODIMP
 nsStandardURL::GetPort(int32_t *result)
 {
     // should never be more than 16 bit
     MOZ_ASSERT(mPort <= std::numeric_limits<uint16_t>::max());
     *result = mPort;
-    CALL_RUST_GETTER_INT(result, GetPort, result);
     return NS_OK;
 }
 
 // result may contain unescaped UTF-8 characters
 NS_IMETHODIMP
 nsStandardURL::GetPathQueryRef(nsACString &result)
 {
     result = Path();
-    CALL_RUST_GETTER_STR(result, GetPathQueryRef, result);
     return NS_OK;
 }
 
 // result is ASCII
 NS_IMETHODIMP
 nsStandardURL::GetAsciiSpec(nsACString &result)
 {
     if (mSpecEncoding == eEncoding_Unknown) {
         if (IsASCII(mSpec))
             mSpecEncoding = eEncoding_ASCII;
         else
             mSpecEncoding = eEncoding_UTF8;
     }
 
     if (mSpecEncoding == eEncoding_ASCII) {
         result = mSpec;
-        CALL_RUST_GETTER_STR(result, GetAsciiSpec, result);
         return NS_OK;
     }
 
     // try to guess the capacity required for result...
     result.SetCapacity(mSpec.Length() + std::min<uint32_t>(32, mSpec.Length()/10));
 
     result = Substring(mSpec, 0, mScheme.mLen + 3);
 
@@ -1631,35 +1507,32 @@ nsStandardURL::GetAsciiSpec(nsACString &
     // get the hostport
     nsAutoCString hostport;
     MOZ_ALWAYS_SUCCEEDS(GetAsciiHostPort(hostport));
     result += hostport;
 
     // This is left infallible as this entire function is expected to be
     // infallible.
     NS_EscapeURL(Path(), esc_OnlyNonASCII | esc_AlwaysCopy, result);
-    CALL_RUST_GETTER_STR(result, GetAsciiSpec, result);
     return NS_OK;
 }
 
 // result is ASCII
 NS_IMETHODIMP
 nsStandardURL::GetAsciiHostPort(nsACString &result)
 {
     result = Hostport();
-    CALL_RUST_GETTER_STR(result, GetAsciiHostPort, result);
     return NS_OK;
 }
 
 // result is ASCII
 NS_IMETHODIMP
 nsStandardURL::GetAsciiHost(nsACString &result)
 {
     result = Host();
-    CALL_RUST_GETTER_STR(result, GetAsciiHost, result);
     return NS_OK;
 }
 
 static bool
 IsSpecialProtocol(const nsACString &input)
 {
     nsACString::const_iterator start, end;
     input.BeginReading(start);
@@ -1767,17 +1640,16 @@ nsStandardURL::SetSpecWithEncoding(const
         LOG((" filepath  = (%u,%d)\n", mFilepath.mPos,  mFilepath.mLen));
         LOG((" directory = (%u,%d)\n", mDirectory.mPos, mDirectory.mLen));
         LOG((" basename  = (%u,%d)\n", mBasename.mPos,  mBasename.mLen));
         LOG((" extension = (%u,%d)\n", mExtension.mPos, mExtension.mLen));
         LOG((" query     = (%u,%d)\n", mQuery.mPos,     mQuery.mLen));
         LOG((" ref       = (%u,%d)\n", mRef.mPos,       mRef.mLen));
     }
 
-    CALL_RUST_SETTER(SetSpec, input);
     return rv;
 }
 
 NS_IMETHODIMP
 nsStandardURL::SetScheme(const nsACString &input)
 {
     ENSURE_MUTABLE();
 
@@ -1812,17 +1684,16 @@ nsStandardURL::SetScheme(const nsACStrin
         ShiftFromAuthority(shift);
     }
 
     // ensure new scheme is lowercase
     //
     // XXX the string code unfortunately doesn't provide a ToLowerCase
     //     that operates on a substring.
     net_ToLowerCase((char *) mSpec.get(), mScheme.mLen);
-    CALL_RUST_SETTER(SetScheme, input);
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsStandardURL::SetUserPass(const nsACString &input)
 {
     ENSURE_MUTABLE();
 
@@ -1855,17 +1726,16 @@ nsStandardURL::SetUserPass(const nsACStr
             mUsername.mLen++;
             mSpec.Cut(mUsername.mPos, mUsername.mLen);
             mAuthority.mLen -= mUsername.mLen;
             ShiftFromHost(-mUsername.mLen);
             mUsername.mLen = -1;
             mPassword.mLen = -1;
         }
 
-        CALL_RUST_SETTER(SetUserPass, input);
         return NS_OK;
     }
 
     NS_ASSERTION(mHost.mLen >= 0, "uninitialized");
 
     nsresult rv;
     uint32_t usernamePos, passwordPos;
     int32_t usernameLen, passwordLen;
@@ -1924,17 +1794,16 @@ nsStandardURL::SetUserPass(const nsACStr
     }
     // update positions and lengths
     mUsername.mLen = usernameLen;
     mPassword.mLen = passwordLen;
     if (passwordLen > 0) {
         mPassword.mPos = mUsername.mPos + mUsername.mLen + 1;
     }
 
-    CALL_RUST_SETTER(SetUserPass, input);
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsStandardURL::SetUsername(const nsACString &input)
 {
     ENSURE_MUTABLE();
 
@@ -1975,17 +1844,16 @@ nsStandardURL::SetUsername(const nsACStr
         shift = ReplaceSegment(mUsername.mPos, mUsername.mLen, escUsername);
 
     if (shift) {
         mUsername.mLen = escUsername.Length();
         mAuthority.mLen += shift;
         ShiftFromPassword(shift);
     }
 
-    CALL_RUST_SETTER(SetUsername, input);
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsStandardURL::SetPassword(const nsACString &input)
 {
     ENSURE_MUTABLE();
 
@@ -2013,17 +1881,16 @@ nsStandardURL::SetPassword(const nsACStr
     if (password.IsEmpty()) {
         if (mPassword.mLen >= 0) {
             // cut(":password")
             mSpec.Cut(mPassword.mPos - 1, mPassword.mLen + 1);
             ShiftFromHost(-(mPassword.mLen + 1));
             mAuthority.mLen -= (mPassword.mLen + 1);
             mPassword.mLen = -1;
         }
-        CALL_RUST_SETTER(SetPassword, input);
         return NS_OK;
     }
 
     // escape password if necessary
     nsAutoCString buf;
     nsSegmentEncoder encoder;
     const nsACString &escPassword =
         encoder.EncodeSegment(password, esc_Password, buf);
@@ -2038,17 +1905,16 @@ nsStandardURL::SetPassword(const nsACStr
     else
         shift = ReplaceSegment(mPassword.mPos, mPassword.mLen, escPassword);
 
     if (shift) {
         mPassword.mLen = escPassword.Length();
         mAuthority.mLen += shift;
         ShiftFromHost(shift);
     }
-    CALL_RUST_SETTER(SetPassword, input);
     return NS_OK;
 }
 
 void
 nsStandardURL::FindHostLimit(nsACString::const_iterator& aStart,
                              nsACString::const_iterator& aEnd)
 {
   for (int32_t i = 0; gHostLimitDigits[i]; ++i) {
@@ -2122,30 +1988,28 @@ nsStandardURL::SetHostPort(const nsACStr
                 // Failure parsing port number
                 return NS_ERROR_MALFORMED_URI;
             }
         } else {
             // port number is missing
             return NS_ERROR_MALFORMED_URI;
         }
     }
-    CALL_RUST_SETTER(SetHostPort, aValue);
     return NS_OK;
 }
 
 // This function is different than SetHostPort in that the port number will be
 // reset as well if aValue parameter does not contain a port port number.
 NS_IMETHODIMP
 nsStandardURL::SetHostAndPort(const nsACString &aValue)
 {
   // Reset the port and than call SetHostPort. SetHostPort does not reset
   // the port number.
   nsresult rv = SetPort(-1);
   NS_ENSURE_SUCCESS(rv, rv);
-  CALL_RUST_SETTER(SetHostAndPort, aValue);
   return SetHostPort(aValue);
 }
 
 NS_IMETHODIMP
 nsStandardURL::SetHost(const nsACString &input)
 {
     ENSURE_MUTABLE();
 
@@ -2245,17 +2109,16 @@ nsStandardURL::SetHost(const nsACString 
     if (shift) {
         mHost.mLen = len;
         mAuthority.mLen += shift;
         ShiftFromPath(shift);
     }
 
     // Now canonicalize the host to lowercase
     net_ToLowerCase(mSpec.BeginWriting() + mHost.mPos, mHost.mLen);
-    CALL_RUST_SETTER(SetHost, input);
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsStandardURL::SetPort(int32_t port)
 {
     ENSURE_MUTABLE();
 
@@ -2277,17 +2140,16 @@ nsStandardURL::SetPort(int32_t port)
     InvalidateCache();
     if (port == mDefaultPort) {
       port = -1;
     }
 
     ReplacePortInSpec(port);
 
     mPort = port;
-    CALL_RUST_SETTER(SetPort, port);
     return NS_OK;
 }
 
 /**
  * Replaces the existing port in mSpec with aNewPort.
  *
  * The caller is responsible for:
  *  - Calling InvalidateCache (since our mSpec is changing).
@@ -2356,17 +2218,16 @@ nsStandardURL::SetPathQueryRef(const nsA
         mDirectory.mLen = 1;
         mFilepath.mLen = 1;
         // these are no longer defined
         mBasename.mLen = -1;
         mExtension.mLen = -1;
         mQuery.mLen = -1;
         mRef.mLen = -1;
     }
-    CALL_RUST_SETTER(SetPathQueryRef, input);
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsStandardURL::Equals(nsIURI *unknownOther, bool *result)
 {
     return EqualsInternal(unknownOther, eHonorRef, result);
 }
@@ -2540,17 +2401,16 @@ nsresult nsStandardURL::CopyMembers(nsSt
     mExtension = source->mExtension;
     mQuery = source->mQuery;
     mRef = source->mRef;
     mURLType = source->mURLType;
     mParser = source->mParser;
     mMutable = true;
     mSupportsFileURL = source->mSupportsFileURL;
 
-    COPY_RUST_MEMBER;
     if (copyCached) {
         mFile = source->mFile;
         mCheckedIfHostA = source->mCheckedIfHostA;
         mDisplayHost = source->mDisplayHost;
         mSpecEncoding = source->mSpecEncoding;
     } else {
         InvalidateCache(true);
     }
@@ -3080,17 +2940,16 @@ nsStandardURL::SetQueryWithEncoding(cons
         if (mQuery.mLen >= 0) {
             // remove query and leading '?'
             mSpec.Cut(mQuery.mPos - 1, mQuery.mLen + 1);
             ShiftFromRef(-(mQuery.mLen + 1));
             mPath.mLen -= (mQuery.mLen + 1);
             mQuery.mPos = 0;
             mQuery.mLen = -1;
         }
-        CALL_RUST_SETTER(SetQuery, input);
         return NS_OK;
     }
 
     int32_t queryLen = flat.Length();
     if (query[0] == '?') {
         query++;
         queryLen--;
     }
@@ -3121,17 +2980,16 @@ nsStandardURL::SetQueryWithEncoding(cons
 
     int32_t shift = ReplaceSegment(mQuery.mPos, mQuery.mLen, query, queryLen);
 
     if (shift) {
         mQuery.mLen = queryLen;
         mPath.mLen += shift;
         ShiftFromRef(shift);
     }
-    CALL_RUST_SETTER(SetQuery, input);
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsStandardURL::SetRef(const nsACString &input)
 {
     ENSURE_MUTABLE();
 
@@ -3153,17 +3011,16 @@ nsStandardURL::SetRef(const nsACString &
         // remove existing ref
         if (mRef.mLen >= 0) {
             // remove ref and leading '#'
             mSpec.Cut(mRef.mPos - 1, mRef.mLen + 1);
             mPath.mLen -= (mRef.mLen + 1);
             mRef.mPos = 0;
             mRef.mLen = -1;
         }
-        CALL_RUST_SETTER(SetRef, input);
         return NS_OK;
     }
 
     int32_t refLen = flat.Length();
     if (ref[0] == '#') {
         ref++;
         refLen--;
     }
@@ -3186,17 +3043,16 @@ nsStandardURL::SetRef(const nsACString &
     if (encoded) {
         ref = buf.get();
         refLen = buf.Length();
     }
 
     int32_t shift = ReplaceSegment(mRef.mPos, mRef.mLen, ref, refLen);
     mPath.mLen += shift;
     mRef.mLen = refLen;
-    CALL_RUST_SETTER(SetRef, input);
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsStandardURL::SetDirectory(const nsACString &input)
 {
     NS_NOTYETIMPLEMENTED("");
     return NS_ERROR_NOT_IMPLEMENTED;
@@ -3467,18 +3323,16 @@ nsStandardURL::Init(uint32_t urlType,
     if (IsUTFEncoding(encoding)) {
         encoding = nullptr;
     }
 
     if (baseURI && net_IsAbsoluteURL(spec)) {
         baseURI = nullptr;
     }
 
-    CALL_RUST_INIT;
-
     if (!baseURI)
         return SetSpecWithEncoding(spec, encoding);
 
     nsAutoCString buf;
     nsresult rv = baseURI->Resolve(spec, buf);
     if (NS_FAILED(rv)) return rv;
 
     return SetSpecWithEncoding(buf, encoding);
@@ -3516,17 +3370,16 @@ nsStandardURL::GetMutable(bool *value)
 }
 
 NS_IMETHODIMP
 nsStandardURL::SetMutable(bool value)
 {
     NS_ENSURE_ARG(mMutable || !value);
 
     mMutable = value;
-    CALL_SET_MUTABLE;
     return NS_OK;
 }
 
 //----------------------------------------------------------------------------
 // nsStandardURL::nsISerializable
 //----------------------------------------------------------------------------
 
 NS_IMETHODIMP
@@ -3628,17 +3481,16 @@ nsStandardURL::Read(nsIObjectInputStream
         // query and ref already.  Bump the mFilePath and
         // directory/basename/extension components to include this.
         mFilepath.Merge(mSpec,  ';', old_param);
         mDirectory.Merge(mSpec, ';', old_param);
         mBasename.Merge(mSpec,  ';', old_param);
         mExtension.Merge(mSpec, ';', old_param);
     }
 
-    CALL_RUST_SYNC;
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsStandardURL::Write(nsIObjectOutputStream *stream)
 {
     MOZ_ASSERT(mSpec.Length() <= (uint32_t) net_GetURLMaxLength(),
                "The spec should never be this long, we missed a check.");
@@ -3807,18 +3659,16 @@ nsStandardURL::Deserialize(const URIPara
     mDirectory = FromIPCSegment(params.directory());
     mBasename = FromIPCSegment(params.baseName());
     mExtension = FromIPCSegment(params.extension());
     mQuery = FromIPCSegment(params.query());
     mRef = FromIPCSegment(params.ref());
     mMutable = params.isMutable();
     mSupportsFileURL = params.supportsFileURL();
 
-    CALL_RUST_SYNC;
-
     // mSpecEncoding and mDisplayHost are just caches that can be recovered as needed.
     return true;
 }
 
 //----------------------------------------------------------------------------
 // nsStandardURL::nsIClassInfo
 //----------------------------------------------------------------------------
 
@@ -3893,14 +3743,14 @@ nsStandardURL::SizeOfExcludingThis(Mallo
 size_t
 nsStandardURL::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const {
   return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
 }
 
 } // namespace net
 } // namespace mozilla
 
-// For unit tests.  Including nsStandardURL.h seems to cause problems via RustURL.h
+// For unit tests.  Including nsStandardURL.h seems to cause problems
 nsresult
 Test_NormalizeIPv4(const nsACString& host, nsCString& result)
 {
     return nsStandardURL::NormalizeIPv4(host, result);
 }
--- a/netwerk/base/nsStandardURL.h
+++ b/netwerk/base/nsStandardURL.h
@@ -16,17 +16,16 @@
 #include "nsURLHelper.h"
 #include "nsIClassInfo.h"
 #include "nsISizeOf.h"
 #include "mozilla/Attributes.h"
 #include "mozilla/LinkedList.h"
 #include "mozilla/MemoryReporting.h"
 #include "nsIIPCSerializableURI.h"
 #include "nsISensitiveInfoHiddenURI.h"
-#include "RustURL.h"
 
 #ifdef NS_BUILD_REFCNT_LOGGING
 #define DEBUG_DUMP_URLS_AT_SHUTDOWN
 #endif
 
 class nsIBinaryInputStream;
 class nsIBinaryOutputStream;
 class nsIIDNService;
@@ -306,21 +305,16 @@ private:
     static const char                   gHostLimitDigits[];
     static bool                         gInitialized;
     static bool                         gPunycodeHost;
 
 public:
 #ifdef DEBUG_DUMP_URLS_AT_SHUTDOWN
     void PrintSpec() const { printf("  %s\n", mSpec.get()); }
 #endif
-
-#ifdef MOZ_RUST_URLPARSE
-    static Atomic<bool>                gRustEnabled;
-    RefPtr<RustURL>                    mRustURL;
-#endif
 };
 
 #define NS_THIS_STANDARDURL_IMPL_CID                 \
 { /* b8e3e97b-1ccd-4b45-af5a-79596770f5d7 */         \
     0xb8e3e97b,                                      \
     0x1ccd,                                          \
     0x4b45,                                          \
     {0xaf, 0x5a, 0x79, 0x59, 0x67, 0x70, 0xf5, 0xd7} \
--- a/netwerk/build/nsNetCID.h
+++ b/netwerk/build/nsNetCID.h
@@ -108,28 +108,16 @@
 #define NS_STANDARDURL_CID                           \
 { /* de9472d0-8034-11d3-9399-00104ba0fd40 */         \
     0xde9472d0,                                      \
     0x8034,                                          \
     0x11d3,                                          \
     {0x93, 0x99, 0x00, 0x10, 0x4b, 0xa0, 0xfd, 0x40} \
 }
 
-// compoenent implementing nsIStandardURL, nsIURI, nsIURL
-// future replacement for nsStandardURL
-#define NS_RUSTURL_CONTRACTID \
-    "@mozilla.org/network/rust-url;1"
-#define NS_RUSTURL_CID                               \
-{ /* fd2d9f76-b34a-459e-b80e-447b03a1283a */         \
-    0xfd2d9f76,                                      \
-    0xb34a,                                          \
-    0x459e,                                          \
-    {0xb8, 0x0e, 0x44, 0x7b, 0x03, 0xa1, 0x28, 0x3a} \
-}
-
 // service implementing nsIURLParser that assumes the URL will NOT contain an
 // authority section.
 #define NS_NOAUTHURLPARSER_CONTRACTID \
     "@mozilla.org/network/url-parser;1?auth=no"
 #define NS_NOAUTHURLPARSER_CID                       \
 { /* 78804a84-8173-42b6-bb94-789f0816a810 */         \
     0x78804a84,                                      \
     0x8173,                                          \
--- a/netwerk/build/nsNetModule.cpp
+++ b/netwerk/build/nsNetModule.cpp
@@ -367,22 +367,16 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsAuthURL
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsStdURLParser)
 
 #include "nsStandardURL.h"
 typedef mozilla::net::nsStandardURL nsStandardURL;
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsStandardURL)
 typedef mozilla::net::nsSimpleURI nsSimpleURI;
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsSimpleURI)
 
-#ifdef MOZ_RUST_URLPARSE
-#include "mozilla/net/RustURL.h"
-typedef mozilla::net::RustURL RustURL;
-NS_GENERIC_FACTORY_CONSTRUCTOR(RustURL)
-#endif // MOZ_RUST_URLPARSE
-
 typedef mozilla::net::nsSimpleNestedURI nsSimpleNestedURI;
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsSimpleNestedURI)
 
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "nsIDNService.h"
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsIDNService, Init)
 
@@ -720,19 +714,16 @@ NS_DEFINE_NAMED_CID(NS_LOCALFILEOUTPUTST
 NS_DEFINE_NAMED_CID(NS_ATOMICLOCALFILEOUTPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_SAFELOCALFILEOUTPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_LOCALFILESTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_INCREMENTALDOWNLOAD_CID);
 NS_DEFINE_NAMED_CID(NS_STDURLPARSER_CID);
 NS_DEFINE_NAMED_CID(NS_NOAUTHURLPARSER_CID);
 NS_DEFINE_NAMED_CID(NS_AUTHURLPARSER_CID);
 NS_DEFINE_NAMED_CID(NS_STANDARDURL_CID);
-#ifdef MOZ_RUST_URLPARSE
-NS_DEFINE_NAMED_CID(NS_RUSTURL_CID);
-#endif
 NS_DEFINE_NAMED_CID(NS_ARRAYBUFFERINPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_BUFFEREDINPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_BUFFEREDOUTPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_MIMEINPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_PROTOCOLPROXYSERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_STREAMCONVERTERSERVICE_CID);
 #if defined(XP_WIN)
 NS_DEFINE_NAMED_CID(NS_NAMEDPIPESERVICE_CID);
@@ -846,19 +837,16 @@ static const mozilla::Module::CIDEntry k
     { &kNS_ATOMICLOCALFILEOUTPUTSTREAM_CID, false, nullptr, nsAtomicFileOutputStreamConstructor },
     { &kNS_SAFELOCALFILEOUTPUTSTREAM_CID, false, nullptr, nsSafeFileOutputStreamConstructor },
     { &kNS_LOCALFILESTREAM_CID, false, nullptr, nsFileStreamConstructor },
     { &kNS_INCREMENTALDOWNLOAD_CID, false, nullptr, net_NewIncrementalDownload },
     { &kNS_STDURLPARSER_CID, false, nullptr, nsStdURLParserConstructor },
     { &kNS_NOAUTHURLPARSER_CID, false, nullptr, nsNoAuthURLParserConstructor },
     { &kNS_AUTHURLPARSER_CID, false, nullptr, nsAuthURLParserConstructor },
     { &kNS_STANDARDURL_CID, false, nullptr, nsStandardURLConstructor },
-#ifdef MOZ_RUST_URLPARSE
-    { &kNS_RUSTURL_CID, false, nullptr, RustURLConstructor },
-#endif
     { &kNS_ARRAYBUFFERINPUTSTREAM_CID, false, nullptr, ArrayBufferInputStreamConstructor },
     { &kNS_BUFFEREDINPUTSTREAM_CID, false, nullptr, nsBufferedInputStream::Create },
     { &kNS_BUFFEREDOUTPUTSTREAM_CID, false, nullptr, nsBufferedOutputStream::Create },
     { &kNS_MIMEINPUTSTREAM_CID, false, nullptr, nsMIMEInputStreamConstructor },
     { &kNS_PROTOCOLPROXYSERVICE_CID, true, nullptr, nsProtocolProxyServiceConstructor },
     { &kNS_STREAMCONVERTERSERVICE_CID, false, nullptr, CreateNewStreamConvServiceFactory },
 #if defined (XP_WIN)
     { &kNS_NAMEDPIPESERVICE_CID, false, NULL, mozilla::net::NamedPipeServiceConstructor },
@@ -974,19 +962,16 @@ static const mozilla::Module::ContractID
     { NS_ATOMICLOCALFILEOUTPUTSTREAM_CONTRACTID, &kNS_ATOMICLOCALFILEOUTPUTSTREAM_CID },
     { NS_SAFELOCALFILEOUTPUTSTREAM_CONTRACTID, &kNS_SAFELOCALFILEOUTPUTSTREAM_CID },
     { NS_LOCALFILESTREAM_CONTRACTID, &kNS_LOCALFILESTREAM_CID },
     { NS_INCREMENTALDOWNLOAD_CONTRACTID, &kNS_INCREMENTALDOWNLOAD_CID },
     { NS_STDURLPARSER_CONTRACTID, &kNS_STDURLPARSER_CID },
     { NS_NOAUTHURLPARSER_CONTRACTID, &kNS_NOAUTHURLPARSER_CID },
     { NS_AUTHURLPARSER_CONTRACTID, &kNS_AUTHURLPARSER_CID },
     { NS_STANDARDURL_CONTRACTID, &kNS_STANDARDURL_CID },
-#ifdef MOZ_RUST_URLPARSE
-    { NS_RUSTURL_CONTRACTID, &kNS_RUSTURL_CID },
-#endif
     { NS_ARRAYBUFFERINPUTSTREAM_CONTRACTID, &kNS_ARRAYBUFFERINPUTSTREAM_CID },
     { NS_BUFFEREDINPUTSTREAM_CONTRACTID, &kNS_BUFFEREDINPUTSTREAM_CID },
     { NS_BUFFEREDOUTPUTSTREAM_CONTRACTID, &kNS_BUFFEREDOUTPUTSTREAM_CID },
     { NS_MIMEINPUTSTREAM_CONTRACTID, &kNS_MIMEINPUTSTREAM_CID },
     { NS_PROTOCOLPROXYSERVICE_CONTRACTID, &kNS_PROTOCOLPROXYSERVICE_CID },
     { NS_STREAMCONVERTERSERVICE_CONTRACTID, &kNS_STREAMCONVERTERSERVICE_CID },
 #if defined(XP_WIN)
     { NS_NAMEDPIPESERVICE_CONTRACTID, &kNS_NAMEDPIPESERVICE_CID },
deleted file mode 100644
--- a/netwerk/test/unit/test_rusturl.js
+++ /dev/null
@@ -1,475 +0,0 @@
-const nsIStandardURL = Components.interfaces.nsIStandardURL;
-
-let rustIsMissing = false;
-let RustURL;
-try {
-  RustURL = Components.Constructor("@mozilla.org/network/rust-url;1",
-                                         "nsIStandardURL",
-                                         "init");
-} catch (e) {
-  rustIsMissing = true;
-}
-
-function symmetricEquality(expect, a, b)
-{
-  /* Use if/else instead of |do_check_eq(expect, a.spec == b.spec)| so
-     that we get the specs output on the console if the check fails.
-   */
-  if (expect) {
-    /* Check all the sub-pieces too, since that can help with
-       debugging cases when equals() returns something unexpected */
-    /* We don't check port in the loop, because it can be defaulted in
-       some cases. */
-    ["spec", "prePath", "scheme", "userPass", "username", "password",
-     "hostPort", "host", "pathQueryRef", "filePath", "param", "query",
-     "ref",
-     // TODO: implement these
-     //"directory", "fileName", "fileBaseName", "fileExtension"
-     ]
-      .map(function(prop) {
-	dump("Testing '"+ prop + "'\n");
-	do_check_eq(a[prop], b[prop]);
-      });
-  } else {
-    do_check_neq(a.spec, b.spec);
-  }
-  do_check_eq(expect, a.equals(b));
-  do_check_eq(expect, b.equals(a));
-}
-
-function stringToURL(str) {
-  return (new RustURL(nsIStandardURL.URLTYPE_AUTHORITY, 80,
-			 str, "UTF-8", null))
-         .QueryInterface(Components.interfaces.nsIURL);
-}
-
-function pairToURLs(pair) {
-  do_check_eq(pair.length, 2);
-  return pair.map(stringToURL);
-}
-
-add_test({ skip_if: () => rustIsMissing }, function test_setEmptyPath()
-{
-  var pairs =
-    [
-     ["http://example.com", "http://example.com/tests/dom/tests"],
-     ["http://example.com:80", "http://example.com/tests/dom/tests"],
-     ["http://example.com:80/", "http://example.com/tests/dom/test"],
-     ["http://example.com/", "http://example.com/tests/dom/tests"],
-     ["http://example.com/a", "http://example.com/tests/dom/tests"],
-     ["http://example.com:80/a", "http://example.com/tests/dom/tests"],
-    ].map(pairToURLs);
-
-  for (var [provided, target] of pairs)
-  {
-    symmetricEquality(false, target, provided);
-
-    dump(provided.scheme);
-    dump(provided.host);
-    dump(provided.port);
-    dump(provided.userPass);
-    dump(provided.hostPort);
-
-    provided.pathQueryRef = "";
-    target.pathQueryRef = "";
-
-    do_check_eq(provided.spec, target.spec);
-    symmetricEquality(true, target, provided);
-  }
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_setQuery()
-{
-  var pairs =
-    [
-     ["http://example.com", "http://example.com/?foo"],
-     ["http://example.com/bar", "http://example.com/bar?foo"],
-     ["http://example.com#bar", "http://example.com/?foo#bar"],
-     ["http://example.com/#bar", "http://example.com/?foo#bar"],
-     ["http://example.com/?longerthanfoo#bar", "http://example.com/?foo#bar"],
-     ["http://example.com/?longerthanfoo", "http://example.com/?foo"],
-     /* And one that's nonempty but shorter than "foo" */
-     ["http://example.com/?f#bar", "http://example.com/?foo#bar"],
-     ["http://example.com/?f", "http://example.com/?foo"],
-    ].map(pairToURLs);
-
-  for (var [provided, target] of pairs) {
-    symmetricEquality(false, provided, target);
-
-    provided.query = "foo";
-
-    do_check_eq(provided.spec, target.spec);
-    symmetricEquality(true, provided, target);
-  }
-
-  [provided, target] =
-    ["http://example.com/#", "http://example.com/?foo#bar"].map(stringToURL);
-  symmetricEquality(false, provided, target);
-  provided.query = "foo";
-  symmetricEquality(false, provided, target);
-
-  var newProvided = Components.classes["@mozilla.org/network/io-service;1"]
-                              .getService(Components.interfaces.nsIIOService)
-                              .newURI("#bar", null, provided)
-                              .QueryInterface(Components.interfaces.nsIURL);
-
-  do_check_eq(newProvided.spec, target.spec);
-  symmetricEquality(true, newProvided, target);
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_setRef()
-{
-  var tests =
-    [
-     ["http://example.com",      "", "http://example.com/"],
-     ["http://example.com:80",   "", "http://example.com:80/"],
-     ["http://example.com:80/",  "", "http://example.com:80/"],
-     ["http://example.com/",     "", "http://example.com/"],
-     ["http://example.com/a",    "", "http://example.com/a"],
-     ["http://example.com:80/a", "", "http://example.com:80/a"],
-
-     ["http://example.com",      "x", "http://example.com/#x"],
-     ["http://example.com:80",   "x", "http://example.com:80/#x"],
-     ["http://example.com:80/",  "x", "http://example.com:80/#x"],
-     ["http://example.com/",     "x", "http://example.com/#x"],
-     ["http://example.com/a",    "x", "http://example.com/a#x"],
-     ["http://example.com:80/a", "x", "http://example.com:80/a#x"],
-
-     ["http://example.com",      "xx", "http://example.com/#xx"],
-     ["http://example.com:80",   "xx", "http://example.com:80/#xx"],
-     ["http://example.com:80/",  "xx", "http://example.com:80/#xx"],
-     ["http://example.com/",     "xx", "http://example.com/#xx"],
-     ["http://example.com/a",    "xx", "http://example.com/a#xx"],
-     ["http://example.com:80/a", "xx", "http://example.com:80/a#xx"],
-
-     ["http://example.com",      "xxxxxxxxxxxxxx", "http://example.com/#xxxxxxxxxxxxxx"],
-     ["http://example.com:80",   "xxxxxxxxxxxxxx", "http://example.com:80/#xxxxxxxxxxxxxx"],
-     ["http://example.com:80/",  "xxxxxxxxxxxxxx", "http://example.com:80/#xxxxxxxxxxxxxx"],
-     ["http://example.com/",     "xxxxxxxxxxxxxx", "http://example.com/#xxxxxxxxxxxxxx"],
-     ["http://example.com/a",    "xxxxxxxxxxxxxx", "http://example.com/a#xxxxxxxxxxxxxx"],
-     ["http://example.com:80/a", "xxxxxxxxxxxxxx", "http://example.com:80/a#xxxxxxxxxxxxxx"],
-    ];
-
-  for (var [before, ref, result] of tests)
-  {
-    /* Test1: starting with empty ref */
-    var a = stringToURL(before);
-    a.ref = ref;
-    var b = stringToURL(result);
-
-    do_check_eq(a.spec, b.spec);
-    do_check_eq(ref, b.ref);
-    symmetricEquality(true, a, b);
-
-    /* Test2: starting with non-empty */
-    a.ref = "yyyy";
-    var c = stringToURL(before);
-    c.ref = "yyyy";
-    symmetricEquality(true, a, c);
-
-    /* Test3: reset the ref */
-    a.ref = "";
-    symmetricEquality(true, a, stringToURL(before));
-
-    /* Test4: verify again after reset */
-    a.ref = ref;
-    symmetricEquality(true, a, b);
-  }
-  run_next_test();
-});
-
-// Bug 960014 - Make nsStandardURL::SetHost less magical around IPv6
-add_test({ skip_if: () => rustIsMissing }, function test_ipv6()
-{
-  var url = stringToURL("http://example.com");
-  url.host = "[2001::1]";
-  do_check_eq(url.host, "2001::1");
-
-  url = stringToURL("http://example.com");
-  url.hostPort = "[2001::1]:30";
-  do_check_eq(url.host, "2001::1");
-  do_check_eq(url.port, 30);
-  do_check_eq(url.hostPort, "[2001::1]:30");
-
-  url = stringToURL("http://example.com");
-  url.hostPort = "2001:1";
-  do_check_eq(url.host, "0.0.7.209");
-  do_check_eq(url.port, 1);
-  do_check_eq(url.hostPort, "0.0.7.209:1");
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_ipv6_fail()
-{
-  var url = stringToURL("http://example.com");
-
-  // TODO: check that the commented behaviours are correct.
-  // TODO: add tests checking for the proper result
-
-  // Assert.throws(() => { url.host = "2001::1"; }, "missing brackets");
-  // Assert.throws(() => { url.host = "[2001::1]:20"; }, "url.host with port");
-  Assert.throws(() => { url.host = "[2001::1"; }, "missing last bracket");
-  // Assert.throws(() => { url.host = "2001::1]"; }, "missing first bracket");
-  Assert.throws(() => { url.host = "2001[::1]"; }, "bad bracket position");
-  Assert.throws(() => { url.host = "[]"; }, "empty IPv6 address");
-  Assert.throws(() => { url.host = "[hello]"; }, "bad IPv6 address");
-  Assert.throws(() => { url.host = "[192.168.1.1]"; }, "bad IPv6 address");
-  // Assert.throws(() => { url.hostPort = "2001::1"; }, "missing brackets");
-  Assert.throws(() => { url.hostPort = "[2001::1]30"; }, "missing : after IP");
-  Assert.throws(() => { url.hostPort = "[2001:1]"; }, "bad IPv6 address");
-  Assert.throws(() => { url.hostPort = "[2001:1]10"; }, "bad IPv6 address");
-  Assert.throws(() => { url.hostPort = "[2001:1]10:20"; }, "bad IPv6 address");
-  Assert.throws(() => { url.hostPort = "[2001:1]:10:20"; }, "bad IPv6 address");
-  Assert.throws(() => { url.hostPort = "[2001:1"; }, "bad IPv6 address");
-  Assert.throws(() => { url.hostPort = "2001]:1"; }, "bad IPv6 address");
-  // Assert.throws(() => { url.hostPort = "2001:1]"; }, "bad IPv6 address");
-  Assert.throws(() => { url.hostPort = ""; }, "Empty hostPort should fail");
-  // Assert.throws(() => { url.hostPort = "[2001::1]:"; }, "missing port number");
-  // Assert.throws(() => { url.hostPort = "[2001::1]:bad"; }, "bad port number");
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_clearedSpec()
-{
-  let url = stringToURL("http://example.com:1234");
-  url.hostPort = "hostname"
-  do_check_eq(url.spec, "http://hostname:1234/");
-  url.setHostAndPort("other");
-  do_check_eq(url.spec, "http://other/");
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_hostPort()
-{
-  var url = stringToURL("http://example.com/path");
-  Assert.throws(() => { url.spec = "http: example"; }, "set bad spec");
-  Assert.throws(() => { url.spec = ""; }, "set empty spec");
-  do_check_eq(url.spec, "http://example.com/path");
-  url.host = "allizom.org";
-
-  var ref = stringToURL("http://allizom.org/path");
-  symmetricEquality(true, url, ref);
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_escapeBrackets()
-{
-  // Query
-  var url = stringToURL("http://example.com/?a[x]=1");
-  do_check_eq(url.spec, "http://example.com/?a[x]=1");
-
-  url = stringToURL("http://example.com/?a%5Bx%5D=1");
-  do_check_eq(url.spec, "http://example.com/?a%5Bx%5D=1");
-
-  url = stringToURL("http://[2001::1]/?a[x]=1");
-  do_check_eq(url.spec, "http://[2001::1]/?a[x]=1");
-
-  url = stringToURL("http://[2001::1]/?a%5Bx%5D=1");
-  do_check_eq(url.spec, "http://[2001::1]/?a%5Bx%5D=1");
-
-  // Path
-  url = stringToURL("http://example.com/brackets[x]/test");
-  do_check_eq(url.spec, "http://example.com/brackets[x]/test");
-
-  url = stringToURL("http://example.com/a%5Bx%5D/test");
-  do_check_eq(url.spec, "http://example.com/a%5Bx%5D/test");
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_apostropheEncoding()
-{
-  // For now, single quote is escaped everywhere _except_ the path.
-  // This policy is controlled by the bitmask in nsEscape.cpp::EscapeChars[]
-  var url = stringToURL("http://example.com/dir'/file'.ext'");
-  do_check_eq(url.spec, "http://example.com/dir'/file'.ext'");
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_accentEncoding()
-{
-  var url = stringToURL("http://example.com/?hello=`");
-  do_check_eq(url.spec, "http://example.com/?hello=`");
-  do_check_eq(url.query, "hello=`");
-
-  url = stringToURL("http://example.com/?hello=%2C");
-  do_check_eq(url.spec, "http://example.com/?hello=%2C");
-  do_check_eq(url.query, "hello=%2C");
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_percentDecoding()
-{
-  var url = stringToURL("http://%70%61%73%74%65%62%69%6E.com");
-  do_check_eq(url.spec, "http://pastebin.com/");
-
-  // We shouldn't unescape characters that are not allowed in the hostname.
-
-  // TODO: rust-url's behaviour is correct here. Check that it throws!
-  // url = stringToURL("http://example.com%0a%23.google.com/");
-  // do_check_eq(url.spec, "http://example.com%0a%23.google.com/");
-  run_next_test();
-});
-
-// TODO: rust-url does not enforce a maximum length for the URL at the moment
-add_test({ skip_if: () => true }, function test_hugeStringThrows()
-{
-  let prefs = Cc["@mozilla.org/preferences-service;1"]
-                .getService(Ci.nsIPrefService);
-  let maxLen = prefs.getIntPref("network.standard-url.max-length");
-  let url = stringToURL("http://test:test@example.com");
-
-  let hugeString = new Array(maxLen + 1).fill("a").join("");
-  let properties = ["spec", "scheme", "userPass", "username",
-                    "password", "hostPort", "host", "pathQueryRef", "ref",
-                    "query", "fileName", "filePath", "fileBaseName", "fileExtension"];
-  for (let prop of properties) {
-    Assert.throws(() => url[prop] = hugeString,
-                  /NS_ERROR_MALFORMED_URI/,
-                  `Passing a huge string to "${prop}" should throw`);
-  }
-
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_filterWhitespace()
-{
-  var url = stringToURL(" \r\n\th\nt\rt\tp://ex\r\n\tample.com/path\r\n\t/\r\n\tto the/fil\r\n\te.e\r\n\txt?que\r\n\try#ha\r\n\tsh \r\n\t ");
-  do_check_eq(url.spec, "http://example.com/path/to%20the/file.ext?query#hash");
-
-  // These setters should escape \r\n\t, not filter them.
-  var url = stringToURL("http://test.com/path?query#hash");
-  url.filePath = "pa\r\n\tth"; // TODO: strips from path
-  // do_check_eq(url.spec, "http://test.com/pa%0D%0A%09th?query#hash");
-  url.query = "qu\r\n\tery"; // TODO: strips from query
-  // do_check_eq(url.spec, "http://test.com/pa%0D%0A%09th?qu%0D%0A%09ery#hash");
-  url.ref = "ha\r\n\tsh"; // TODO: strips from hash
-  // do_check_eq(url.spec, "http://test.com/pa%0D%0A%09th?qu%0D%0A%09ery#ha%0D%0A%09sh");
-  // url.fileName = "fi\r\n\tle.name"; // TODO: filename not implemented
-  // do_check_eq(url.spec, "http://test.com/fi%0D%0A%09le.name?qu%0D%0A%09ery#ha%0D%0A%09sh");
-
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_backslashReplacement()
-{
-  var url = stringToURL("http:\\\\test.com\\path/to\\file?query\\backslash#hash\\");
-  do_check_eq(url.spec, "http://test.com/path/to/file?query\\backslash#hash\\");
-
-  url = stringToURL("http:\\\\test.com\\example.org/path\\to/file");
-  do_check_eq(url.spec, "http://test.com/example.org/path/to/file");
-  do_check_eq(url.host, "test.com");
-  do_check_eq(url.pathQueryRef, "/example.org/path/to/file");
-
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_trim_C0_and_space()
-{
-  var url = stringToURL("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f http://example.com/ \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f ");
-  do_check_eq(url.spec, "http://example.com/");
-  url.spec = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f http://test.com/ \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f ";
-  do_check_eq(url.spec, "http://test.com/");
-  Assert.throws(() => { url.spec = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19 "; }, "set empty spec");
-  run_next_test();
-});
-
-// This tests that C0-and-space characters in the path, query and ref are
-// percent encoded.
-add_test({ skip_if: () => rustIsMissing }, function test_encode_C0_and_space()
-{
-  function toHex(d) {
-    var hex = d.toString(16);
-    if (hex.length == 1)
-      hex = "0"+hex;
-    return hex.toUpperCase();
-  }
-
-  for (var i=0x0; i<=0x20; i++) {
-    // These characters get filtered - they are not encoded.
-    if (String.fromCharCode(i) == '\r' ||
-        String.fromCharCode(i) == '\n' ||
-        String.fromCharCode(i) == '\t') {
-      continue;
-    }
-    var url = stringToURL("http://example.com/pa" + String.fromCharCode(i) + "th?qu" + String.fromCharCode(i) +"ery#ha" + String.fromCharCode(i) + "sh");
-    // TODO: "http://example.com/pa%00th?qu%00ery#hash" == "http://example.com/pa%00th?qu%00ery#ha%00sh"
-    // TODO: "http://example.com/pa%01th?qu%01ery#ha\\u0001sh" == "http://example.com/pa%01th?qu%01ery#ha%01sh"
-    // do_check_eq(url.spec, "http://example.com/pa%" + toHex(i) + "th?qu%" + toHex(i) + "ery#ha%" + toHex(i) + "sh");
-  }
-
-  // Additionally, we need to check the setters.
-  var url = stringToURL("http://example.com/path?query#hash");
-  url.filePath = "pa\0th";
-  do_check_eq(url.spec, "http://example.com/pa%00th?query#hash");
-  url.query = "qu\0ery";
-  do_check_eq(url.spec, "http://example.com/pa%00th?qu%00ery#hash");
-  url.ref = "ha\0sh"; // TODO: \0 is stripped
-  // do_check_eq(url.spec, "http://example.com/pa%00th?qu%00ery#ha%00sh");
-  // url.fileName = "fi\0le.name"; // TODO: not implemented
-  // do_check_eq(url.spec, "http://example.com/fi%00le.name?qu%00ery#ha%00sh");
-
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_ipv4Normalize()
-{
-  var localIPv4s =
-    ["http://127.0.0.1",
-     "http://127.0.1",
-     "http://127.1",
-     "http://2130706433",
-     "http://0177.00.00.01",
-     "http://0177.00.01",
-     "http://0177.01",
-     "http://00000000000000000000000000177.0000000.0000000.0001",
-     "http://000000177.0000001",
-     "http://017700000001",
-     "http://0x7f.0x00.0x00.0x01",
-     "http://0x7f.0x01",
-     "http://0x7f000001",
-     "http://0x007f.0x0000.0x0000.0x0001",
-     "http://000177.0.00000.0x0001",
-     "http://127.0.0.1.",
-    ].map(stringToURL);
-  var url;
-  for (url of localIPv4s) {
-    do_check_eq(url.spec, "http://127.0.0.1/");
-  }
-
-  // These should treated as a domain instead of an IPv4.
-  var nonIPv4s =
-    ["http://0xfffffffff/",
-     "http://0x100000000/",
-     "http://4294967296/",
-     // "http://1.2.0x10000/", // TODO: fails to parse
-     // "http://1.0x1000000/", // TODO: fails to parse
-     // "http://256.0.0.1/", // TODO: fails to parse
-     // "http://1.256.1/", // TODO: fails to parse
-     // "http://-1.0.0.0/", // TODO: fails to parse
-     "http://1.2.3.4.5/",
-     "http://010000000000000000/",
-     // "http://2+3/", // TODO: fails to parse
-     // "http://0.0.0.-1/", // TODO: fails to parse
-     "http://1.2.3.4../",
-     "http://1..2/",
-     // "http://.1.2.3.4/", // TODO: parsed as "http://1.2.3.4/"
-    ];
-  var spec;
-  for (spec of nonIPv4s) {
-    url = stringToURL(spec);
-    do_check_eq(url.spec, spec);
-  }
-
-  run_next_test();
-});
-
-add_test({ skip_if: () => rustIsMissing }, function test_schemeIsCaseInsensitive()
-{
-  var url = stringToURL("http://example.com/");
-  do_check_true(url.schemeIs("http"));
-  do_check_true(url.schemeIs("HtTp"));
-
-  run_next_test();
-});
--- a/netwerk/test/unit/xpcshell.ini
+++ b/netwerk/test/unit/xpcshell.ini
@@ -389,17 +389,16 @@ skip-if = os == "android"
 [test_alt-data_stream.js]
 [test_alt-data_overwrite.js]
 [test_cache-control_request.js]
 [test_bug1279246.js]
 [test_throttlequeue.js]
 [test_throttlechannel.js]
 [test_throttling.js]
 [test_separate_connections.js]
-[test_rusturl.js]
 [test_trackingProtection_annotateChannels.js]
 [test_race_cache_with_network.js]
 [test_channel_priority.js]
 [test_bug1312774_http1.js]
 [test_1351443-missing-NewChannel2.js]
 [test_bug1312782_http1.js]
 [test_bug1355539_http1.js]
 [test_bug1378385_http1.js]
--- a/old-configure.in
+++ b/old-configure.in
@@ -2210,22 +2210,16 @@ esac
 if test -n "$MOZ_GRAPHENE"; then
     AC_DEFINE(MOZ_GRAPHENE)
 fi
 
 if test -n "$MOZ_MULET"; then
     AC_DEFINE(MOZ_MULET)
 fi
 
-# Propagate feature switches for code written in rust from confvars.sh
-if test -n "$MOZ_RUST_URLPARSE"; then
-    AC_DEFINE(MOZ_RUST_URLPARSE)
-    AC_SUBST(MOZ_RUST_URLPARSE)
-fi
-
 AC_SUBST(MOZ_PHOENIX)
 AC_SUBST(MOZ_XULRUNNER)
 AC_SUBST(MOZ_MULET)
 
 dnl ========================================================
 dnl Ensure Android SDK and build-tools versions depending on
 dnl mobile target.
 dnl ========================================================
--- a/python/mach_commands.py
+++ b/python/mach_commands.py
@@ -107,17 +107,17 @@ class MachCommands(MachCommandBase):
 
         # Python's unittest, and in particular discover, has problems with
         # clashing namespaces when importing multiple test modules. What follows
         # is a simple way to keep environments separate, at the price of
         # launching Python multiple times. Most tests are run via mozunit,
         # which produces output in the format Mozilla infrastructure expects.
         # Some tests are run via pytest.
         if test_objects is None:
-            from mozbuild.testing import TestResolver
+            from moztest.resolve import TestResolver
             resolver = self._spawn(TestResolver)
             if tests:
                 # If we were given test paths, try to find tests matching them.
                 test_objects = resolver.resolve_tests(paths=tests,
                                                       flavor='python')
             else:
                 # Otherwise just run everything in PYTHON_UNITTEST_MANIFESTS
                 test_objects = resolver.resolve_tests(flavor='python')
--- a/python/mozbuild/mozbuild/action/exe_7z_archive.py
+++ b/python/mozbuild/mozbuild/action/exe_7z_archive.py
@@ -4,26 +4,27 @@
 
 from __future__ import print_function
 
 import os
 import shutil
 import sys
 import subprocess
 import tempfile
+import buildconfig
 import mozpack.path as mozpath
 
 def archive_exe(pkg_dir, tagfile, sfx_package, package):
     tmpdir = tempfile.mkdtemp(prefix='tmp')
     try:
         if pkg_dir:
             shutil.move(pkg_dir, 'core')
         subprocess.check_call(['upx', '--best', '-o', mozpath.join(tmpdir, '7zSD.sfx'), sfx_package])
 
-        subprocess.check_call(['7z', 'a', '-r', '-t7z', mozpath.join(tmpdir, 'app.7z'), '-mx', '-m0=BCJ2', '-m1=LZMA:d25', '-m2=LZMA:d19', '-m3=LZMA:d19', '-mb0:1', '-mb0s1:2', '-mb0s2:3'])
+        subprocess.check_call([buildconfig.substs['7Z'], 'a', '-r', '-t7z', mozpath.join(tmpdir, 'app.7z'), '-mx', '-m0=BCJ2', '-m1=LZMA:d25', '-m2=LZMA:d19', '-m3=LZMA:d19', '-mb0:1', '-mb0s1:2', '-mb0s2:3'])
 
         with open(package, 'wb') as o:
             for i in [mozpath.join(tmpdir, '7zSD.sfx'), tagfile, mozpath.join(tmpdir, 'app.7z')]:
                 shutil.copyfileobj(open(i, 'rb'), o)
         os.chmod(package, 0o0755)
     finally:
         if pkg_dir:
             shutil.move('core', pkg_dir)
--- a/python/mozbuild/mozbuild/test/python.ini
+++ b/python/mozbuild/mozbuild/test/python.ini
@@ -35,10 +35,9 @@
 [test_expression.py]
 [test_jarmaker.py]
 [test_line_endings.py]
 [test_makeutil.py]
 [test_mozconfig.py]
 [test_mozinfo.py]
 [test_preprocessor.py]
 [test_pythonutil.py]
-[test_testing.py]
 [test_util.py]
--- a/python/mozbuild/mozbuild/testing.py
+++ b/python/mozbuild/mozbuild/testing.py
@@ -8,261 +8,18 @@ import cPickle as pickle
 import os
 import sys
 
 import mozpack.path as mozpath
 
 from mozpack.copier import FileCopier
 from mozpack.manifests import InstallManifest
 
-from .base import MozbuildObject
-from .util import OrderedDefaultDict
-from collections import defaultdict
-
 import manifestparser
 
-def rewrite_test_base(test, new_base, honor_install_to_subdir=False):
-    """Rewrite paths in a test to be under a new base path.
-
-    This is useful for running tests from a separate location from where they
-    were defined.
-
-    honor_install_to_subdir and the underlying install-to-subdir field are a
-    giant hack intended to work around the restriction where the mochitest
-    runner can't handle single test files with multiple configurations. This
-    argument should be removed once the mochitest runner talks manifests
-    (bug 984670).
-    """
-    test['here'] = mozpath.join(new_base, test['dir_relpath'])
-
-    if honor_install_to_subdir and test.get('install-to-subdir'):
-        manifest_relpath = mozpath.relpath(test['path'],
-            mozpath.dirname(test['manifest']))
-        test['path'] = mozpath.join(new_base, test['dir_relpath'],
-            test['install-to-subdir'], manifest_relpath)
-    else:
-        test['path'] = mozpath.join(new_base, test['file_relpath'])
-
-    return test
-
-
-class TestMetadata(object):
-    """Holds information about tests.
-
-    This class provides an API to query tests active in the build
-    configuration.
-    """
-
-    def __init__(self, all_tests, test_defaults=None):
-        self._tests_by_path = OrderedDefaultDict(list)
-        self._tests_by_flavor = defaultdict(set)
-        self._test_dirs = set()
-
-        with open(all_tests, 'rb') as fh:
-            test_data = pickle.load(fh)
-        defaults = None
-        if test_defaults:
-            with open(test_defaults, 'rb') as fh:
-                defaults = pickle.load(fh)
-        for path, tests in test_data.items():
-            for metadata in tests:
-                if defaults:
-                    defaults_manifests = [metadata['manifest']]
-
-                    ancestor_manifest = metadata.get('ancestor-manifest')
-                    if ancestor_manifest:
-                        defaults_manifests.append(ancestor_manifest)
-
-                    for manifest in defaults_manifests:
-                        manifest_defaults = defaults.get(manifest)
-                        if manifest_defaults:
-                            metadata = manifestparser.combine_fields(manifest_defaults,
-                                                                     metadata)
-                self._tests_by_path[path].append(metadata)
-                self._test_dirs.add(os.path.dirname(path))
-                flavor = metadata.get('flavor')
-                self._tests_by_flavor[flavor].add(path)
-
-    def tests_with_flavor(self, flavor):
-        """Obtain all tests having the specified flavor.
-
-        This is a generator of dicts describing each test.
-        """
-
-        for path in sorted(self._tests_by_flavor.get(flavor, [])):
-            yield self._tests_by_path[path]
-
-    def resolve_tests(self, paths=None, flavor=None, subsuite=None, under_path=None,
-                      tags=None):
-        """Resolve tests from an identifier.
-
-        This is a generator of dicts describing each test.
-
-        ``paths`` can be an iterable of values to use to identify tests to run.
-        If an entry is a known test file, tests associated with that file are
-        returned (there may be multiple configurations for a single file). If
-        an entry is a directory, or a prefix of a directory containing tests,
-        all tests in that directory are returned. If the string appears in a
-        known test file, that test file is considered. If the path contains
-        a wildcard pattern, tests matching that pattern are returned.
-
-        If ``under_path`` is a string, it will be used to filter out tests that
-        aren't in the specified path prefix relative to topsrcdir or the
-        test's installed dir.
-
-        If ``flavor`` is a string, it will be used to filter returned tests
-        to only be the flavor specified. A flavor is something like
-        ``xpcshell``.
-
-        If ``subsuite`` is a string, it will be used to filter returned tests
-        to only be in the subsuite specified.
-
-        If ``tags`` are specified, they will be used to filter returned tests
-        to only those with a matching tag.
-        """
-        if tags:
-            tags = set(tags)
-
-        def fltr(tests):
-            for test in tests:
-                if flavor:
-                   if (flavor == 'devtools' and test.get('flavor') != 'browser-chrome') or \
-                      (flavor != 'devtools' and test.get('flavor') != flavor):
-                    continue
-
-                if subsuite and test.get('subsuite') != subsuite:
-                    continue
-
-                if tags and not (tags & set(test.get('tags', '').split())):
-                    continue
-
-                if under_path \
-                    and not test['file_relpath'].startswith(under_path):
-                    continue
-
-                # Make a copy so modifications don't change the source.
-                yield dict(test)
-
-        paths = paths or []
-        paths = [mozpath.normpath(p) for p in paths]
-        if not paths:
-            paths = [None]
-
-        candidate_paths = set()
-
-        for path in sorted(paths):
-            if path is None:
-                candidate_paths |= set(self._tests_by_path.keys())
-                continue
-
-            if '*' in path:
-                candidate_paths |= {p for p in self._tests_by_path
-                                    if mozpath.match(p, path)}
-                continue
-
-            # If the path is a directory, or the path is a prefix of a directory
-            # containing tests, pull in all tests in that directory.
-            if (path in self._test_dirs or
-                any(p.startswith(path) for p in self._tests_by_path)):
-                candidate_paths |= {p for p in self._tests_by_path
-                                    if p.startswith(path)}
-                continue
-
-            # If it's a test file, add just that file.
-            candidate_paths |= {p for p in self._tests_by_path if path in p}
-
-        for p in sorted(candidate_paths):
-            tests = self._tests_by_path[p]
-
-            for test in fltr(tests):
-                yield test
-
-
-class TestResolver(MozbuildObject):
-    """Helper to resolve tests from the current environment to test files."""
-
-    def __init__(self, *args, **kwargs):
-        MozbuildObject.__init__(self, *args, **kwargs)
-
-        # If installing tests is going to result in re-generating the build
-        # backend, we need to do this here, so that the updated contents of
-        # all-tests.pkl make it to the set of tests to run.
-        self._run_make(
-            target='backend.TestManifestBackend', pass_thru=True, print_directory=False,
-            filename=mozpath.join(self.topsrcdir, 'build', 'rebuild-backend.mk'),
-            append_env={
-                b'PYTHON': self.virtualenv_manager.python_path,
-                b'BUILD_BACKEND_FILES': b'backend.TestManifestBackend',
-                b'BACKEND_GENERATION_SCRIPT': mozpath.join(
-                    self.topsrcdir, 'build', 'gen_test_backend.py'),
-            },
-        )
-
-        self._tests = TestMetadata(os.path.join(self.topobjdir,
-                                                'all-tests.pkl'),
-                                   test_defaults=os.path.join(self.topobjdir,
-                                                              'test-defaults.pkl'))
-
-        self._test_rewrites = {
-            'a11y': os.path.join(self.topobjdir, '_tests', 'testing',
-                'mochitest', 'a11y'),
-            'browser-chrome': os.path.join(self.topobjdir, '_tests', 'testing',
-                'mochitest', 'browser'),
-            'chrome': os.path.join(self.topobjdir, '_tests', 'testing',
-                'mochitest', 'chrome'),
-            'mochitest': os.path.join(self.topobjdir, '_tests', 'testing',
-                'mochitest', 'tests'),
-            'web-platform-tests': os.path.join(self.topobjdir, '_tests', 'testing',
-                                               'web-platform'),
-            'xpcshell': os.path.join(self.topobjdir, '_tests', 'xpcshell'),
-        }
-
-    def resolve_tests(self, cwd=None, **kwargs):
-        """Resolve tests in the context of the current environment.
-
-        This is a more intelligent version of TestMetadata.resolve_tests().
-
-        This function provides additional massaging and filtering of low-level
-        results.
-
-        Paths in returned tests are automatically translated to the paths in
-        the _tests directory under the object directory.
-
-        If cwd is defined, we will limit our results to tests under the
-        directory specified. The directory should be defined as an absolute
-        path under topsrcdir or topobjdir for it to work properly.
-        """
-        rewrite_base = None
-
-        if cwd:
-            norm_cwd = mozpath.normpath(cwd)
-            norm_srcdir = mozpath.normpath(self.topsrcdir)
-            norm_objdir = mozpath.normpath(self.topobjdir)
-
-            reldir = None
-
-            if norm_cwd.startswith(norm_objdir):
-                reldir = norm_cwd[len(norm_objdir)+1:]
-            elif norm_cwd.startswith(norm_srcdir):
-                reldir = norm_cwd[len(norm_srcdir)+1:]
-
-            result = self._tests.resolve_tests(under_path=reldir,
-                **kwargs)
-
-        else:
-            result = self._tests.resolve_tests(**kwargs)
-
-        for test in result:
-            rewrite_base = self._test_rewrites.get(test['flavor'], None)
-
-            if rewrite_base:
-                yield rewrite_test_base(test, rewrite_base,
-                    honor_install_to_subdir=True)
-            else:
-                yield test
 
 # These definitions provide a single source of truth for modules attempting
 # to get a view of all tests for a build. Used by the emitter to figure out
 # how to read/install manifests and by test dependency annotations in Files()
 # entries to enumerate test flavors.
 
 # While there are multiple test manifests, the behavior is very similar
 # across them. We enforce this by having common handling of all
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1079,16 +1079,17 @@ static const TransportSecurityPreload kP
   { "rw.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "script.google.com", true, false, false, -1, &kPinset_google_root_pems },
   { "se.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "secure.facebook.com", true, false, false, -1, &kPinset_facebook },
   { "security.google.com", true, false, false, -1, &kPinset_google_root_pems },
   { "services.mozilla.com", true, false, true, 6, &kPinset_mozilla_services },
   { "sg.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
+  { "sirburton.com", true, false, false, -1, &kPinset_ncsccs },
   { "sites.google.com", true, false, false, -1, &kPinset_google_root_pems },
   { "spideroak.com", true, false, false, -1, &kPinset_spideroak },
   { "spreadsheets.google.com", true, false, false, -1, &kPinset_google_root_pems },
   { "static.googleadsserving.cn", true, false, false, -1, &kPinset_google_root_pems },
   { "stats.g.doubleclick.net", true, false, false, -1, &kPinset_google_root_pems },
   { "sv.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "swehack.org", true, true, false, -1, &kPinset_swehackCom },
   { "sync.services.mozilla.com", true, false, true, 13, &kPinset_mozilla_services },
@@ -1149,13 +1150,13 @@ static const TransportSecurityPreload kP
   { "youtu.be", true, false, false, -1, &kPinset_google_root_pems },
   { "youtube-nocookie.com", true, false, false, -1, &kPinset_google_root_pems },
   { "youtube.com", true, false, false, -1, &kPinset_google_root_pems },
   { "ytimg.com", true, false, false, -1, &kPinset_google_root_pems },
   { "za.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "zh.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
 };
 
-// Pinning Preload List Length = 480;
+// Pinning Preload List Length = 481;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1518550779219000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1518637560032000);
--- a/security/manager/ssl/nsSTSPreloadList.errors
+++ b/security/manager/ssl/nsSTSPreloadList.errors
@@ -1,39 +1,37 @@
 06se.com: could not connect to host
 0day.su: could not connect to host
 1000serien.com: could not connect to host
+27728522.com: could not connect to host
 47tech.com: could not connect to host
 4loc.us: could not connect to host
 4x4.lk: could not connect to host
 692b8c32.de: could not connect to host
 8560.be: could not connect to host
 87577.com: could not connect to host
 8887999.com: could not connect to host
 8ack.de: could not connect to host
 8t88.biz: could not connect to host
 91-freedom.com: could not connect to host
 9ss6.com: could not connect to host
 aaronmcguire.me: could not connect to host
-abeontech.com: could not connect to host
 abolition.co: could not connect to host
 accwing.com: could not connect to host
 acrossgw.com: could not connect to host
 adamfontenot.com: could not connect to host
 adamgold.net: could not connect to host
 adquisitio.co.uk: could not connect to host
 adquisitio.es: could not connect to host
 adquisitio.fr: could not connect to host
 adquisitio.it: could not connect to host
 adzie.xyz: could not connect to host
 aevpn.org: could not connect to host
 affily.io: could not connect to host
-agowa.eu: could not connect to host
 agowa338.de: could not connect to host
-ahmedcharles.com: could not connect to host
 akiba-server.info: could not connect to host
 akita-stream.com: could not connect to host
 akoww.de: could not connect to host
 akul.co.in: could not connect to host
 al-f.net: could not connect to host
 alamgir.works: could not connect to host
 alasta.info: could not connect to host
 alauda-home.de: could not connect to host
@@ -46,132 +44,136 @@ altahrim.net: could not connect to host
 ameho.me: could not connect to host
 amua.fr: could not connect to host
 anastasia-shamara.ru: could not connect to host
 andiplusben.com: could not connect to host
 andreaskluge.eu: could not connect to host
 andrei-coman.com: could not connect to host
 andrepicard.de: could not connect to host
 annetaan.fi: could not connect to host
+answers-online.ru: could not connect to host
 anyways.at: could not connect to host
 apkoyunlar.club: could not connect to host
 appdrinks.com: could not connect to host
 arawaza.biz: could not connect to host
 arawaza.info: could not connect to host
 arent.kz: could not connect to host
 arksan.com.tr: could not connect to host
 artisense.de: could not connect to host
 artyland.ru: could not connect to host
+aseith.com: could not connect to host
 askmagicconch.com: could not connect to host
 assdecoeur.org: could not connect to host
 at1.co: could not connect to host
 athi.pl: could not connect to host
 austinsutphin.com: could not connect to host
 australiancattle.dog: could not connect to host
 autostop-occasions.be: could not connect to host
 autozane.com: could not connect to host
 awan.tech: could not connect to host
 awf0.xyz: could not connect to host
 b8a.me: could not connect to host
 bakaweb.fr: could not connect to host
 balonmano.co: could not connect to host
+bandally.net: could not connect to host
 bandarifamily.com: could not connect to host
 bandiga.it: could not connect to host
 barbate.fr: could not connect to host
+bbb1991.me: could not connect to host
 bbdos.ru: could not connect to host
 beasel.biz: could not connect to host
-beelen.fr: could not connect to host
 bellavistaoutdoor.com: could not connect to host
 belua.com: could not connect to host
 benjamin-horvath.com: could not connect to host
 benjamin-suess.de: could not connect to host
 benzou-space.com: could not connect to host
 berduri.com: could not connect to host
 berthelier.me: could not connect to host
 bey.io: could not connect to host
-biboumail.fr: could not connect to host
-bienoubien.org: could not connect to host
 binimo.com: could not connect to host
 bip.gov.sa: could not connect to host
 bitmessage.ch: could not connect to host
 bizeau.ch: could not connect to host
 blackdiam.net: could not connect to host
 blackscytheconsulting.com: could not connect to host
 blinkenlight.co.uk: could not connect to host
 blinkenlight.com.au: could not connect to host
 blog.gparent.org: could not connect to host
+blogtroterzy.pl: could not connect to host
 blumen-garage.de: could not connect to host
 bm-i.ch: could not connect to host
 bodrumfarm.com: could not connect to host
 bolwerk.com.br: could not connect to host
 borisbesemer.com: could not connect to host
 bouncelanduk.co.uk: could not connect to host
 bouncourseplanner.net: could not connect to host
+bouncycastlehiremalvern.co.uk: could not connect to host
 brage.info: could not connect to host
 brettabel.com: could not connect to host
 brfvh24.se: could not connect to host
 brunner.ninja: could not connect to host
+bsktweetup.info: could not connect to host
 bsuess.de: could not connect to host
 buka.jp: could not connect to host
 burlesquemakeup.com: could not connect to host
 businessfurs.info: could not connect to host
 businessmodeler.se: could not connect to host
 buyshoe.org: could not connect to host
 bvexplained.co.uk: could not connect to host
 by1898.com: could not connect to host
 bypass.kr: could not connect to host
 c16t.uk: could not connect to host
 cafesg.net: could not connect to host
 calculatoaresecondhand.xyz: could not connect to host
 callabs.net: could not connect to host
 callsigns.ca: could not connect to host
 calories.org: could not connect to host
 canarymod.net: could not connect to host
+cardse.net: could not connect to host
 carlandfaith.com: could not connect to host
-casa-mea-inteligenta.ro: could not connect to host
+carloshmm.stream: could not connect to host
 casinoreal.com: could not connect to host
-castlecapers.com.au: could not connect to host
 caughtredhanded.co.nz: could not connect to host
 centos.pub: could not connect to host
 challengeskins.com: could not connect to host
 chaoticlaw.com: could not connect to host
 charmyadesara.com: could not connect to host
 charonsecurity.com: could not connect to host
 cheah.xyz: could not connect to host
 cheesefusion.com: could not connect to host
 childrendeservebetter.org: could not connect to host
 china-line.org: could not connect to host
 chloehorler.com: could not connect to host
 chosenplaintext.org: could not connect to host
-chsterz.de: could not connect to host
-chuck.ovh: could not connect to host
+chrisu3050.at: could not connect to host
 chziyue.com: could not connect to host
 cjtkfan.club: could not connect to host
 clearchatsandbox.com: could not connect to host
 clearviewwealthprojector.com.au: could not connect to host
 cloudbleed.info: could not connect to host
 cloudimproved.com: could not connect to host
+cloudimprovedtest.com: could not connect to host
 cnlic.com: could not connect to host
 coco-cool.fr: could not connect to host
 code.fm: could not connect to host
 codenlife.xyz: could not connect to host
-codera.co.uk: could not connect to host
 codercross.com: could not connect to host
 colleencornez.com: could not connect to host
 coloppe.com: could not connect to host
 comprehensiveihc.com: could not connect to host
 conception.sk: could not connect to host
 conniesacademy.com: could not connect to host
 corinnanese.de: could not connect to host
-correiodovale.com.br: could not connect to host
+cosmeticasimple.com: could not connect to host
 cosplayer.com: could not connect to host
 cpaneltips.com: could not connect to host
 crackpfer.de: could not connect to host
 cristianhares.com: could not connect to host
 criticalaim.com: could not connect to host
+crow.tw: could not connect to host
 crystalmachine.net: could not connect to host
 csgo.help: could not connect to host
 csgo77.com: could not connect to host
 cubela.tech: could not connect to host
 customfilmworks.com: could not connect to host
 cyber-computer.club: could not connect to host
 cyberpeace.nl: could not connect to host
 cypherpunk.ws: could not connect to host
@@ -188,31 +190,33 @@ dawnson.is: could not connect to host
 dawnsonb.com: could not connect to host
 days.one: could not connect to host
 dbcom.ru: could not connect to host
 de-servers.de: could not connect to host
 decoyrouting.com: could not connect to host
 deloittequant.com: could not connect to host
 derchris.me: could not connect to host
 derivativeshub.pro: could not connect to host
+dermacarecomplex.com: could not connect to host
 dev-talk.eu: could not connect to host
 devkid.net: could not connect to host
 devops.moe: could not connect to host
 dick.red: could not connect to host
 diguass.us: could not connect to host
 dijks.com: could not connect to host
 dirtycat.ru: could not connect to host
 disadattamentolavorativo.it: could not connect to host
 disco-crazy-world.de: could not connect to host
 djangogolf.com: could not connect to host
 dlyl888.com: could not connect to host
 dojifish.space: could not connect to host
 dolphin-hosting.com: could not connect to host
 domengrad.ru: could not connect to host
 dostavkakurierom.ru: could not connect to host
+drakeluce.com: could not connect to host
 dreaming.solutions: could not connect to host
 drighes.com: could not connect to host
 dronexpertos.com: could not connect to host
 droomhuis-in-zuid-holland-kopen.nl: could not connect to host
 dubrovskiy.net: could not connect to host
 dubrovskiy.pro: could not connect to host
 duch.cloud: could not connect to host
 duelsow.eu: could not connect to host
@@ -225,84 +229,83 @@ eatfitoutlet.com.br: could not connect t
 ebaymotorssucks.com: could not connect to host
 eeb98.com: could not connect to host
 eez.ee: could not connect to host
 egbert.net: could not connect to host
 ehuber.info: could not connect to host
 elisabeth-strunz.de: could not connect to host
 elonbase.com: could not connect to host
 elsword.moe: could not connect to host
+emanuelemazzotta.com: could not connect to host
 endlessdiy.ca: could not connect to host
 endspamwith.us: could not connect to host
 engg.ca: could not connect to host
 enriquepiraces.com: could not connect to host
 er-music.com: could not connect to host
 ericdiao.com: could not connect to host
+erspro.net: could not connect to host
 estan.cn: could not connect to host
-etyd.org: could not connect to host
 eurostrategy.vn.ua: could not connect to host
-eurotime.ua: could not connect to host
-everygayporn.com: could not connect to host
 eveshaiwu.com: could not connect to host
 exceed.global: could not connect to host
 faber.org.ru: could not connect to host
 facilitrak.com: could not connect to host
 faithwatch.org: could not connect to host
 falkus.net: could not connect to host
 farm24.co.uk: could not connect to host
+farsil.eu: could not connect to host
+fashion4ever.pl: could not connect to host
+fed51.com: could not connect to host
 feedstringer.com: could not connect to host
 feirlane.org: could not connect to host
 fernangp.com: could not connect to host
 filhomes.ph: could not connect to host
 findmybottleshop.com.au: could not connect to host
 firebaseio.com: could not connect to host
 firexarxa.de: could not connect to host
 first-time-offender.com: could not connect to host
 fixmyglitch.com: could not connect to host
 flow.su: could not connect to host
 flucky.xyz: could not connect to host
 flygpost.com: could not connect to host
-fognini-depablo.eu: could not connect to host
 foodserve.in: could not connect to host
 forglemmigej.net: could not connect to host
 foshanshequ.com: could not connect to host
 fossewayflowers.co.uk: could not connect to host
 fossewayflowers.com: could not connect to host
 foudufafa.de: could not connect to host
 foxmay.co.uk: could not connect to host
 fr0zenbits.io: could not connect to host
 fragnic.com: could not connect to host
 franckyz.com: could not connect to host
-frank.fyi: could not connect to host
 franksiler.com: could not connect to host
 fransallen.com: could not connect to host
 freaksites.dk: could not connect to host
 fredliang.cn: could not connect to host
 fredtec.ru: could not connect to host
 freelansir.com: could not connect to host
 freesounding.ru: could not connect to host
+frodriguez.xyz: could not connect to host
 fromlemaytoz.com: could not connect to host
 frosty-gaming.xyz: could not connect to host
 fukuko.biz: could not connect to host
 fukuko.xyz: could not connect to host
 funfunmstdn.tokyo: could not connect to host
 funideas.org: could not connect to host
 funksteckdosen24.de: could not connect to host
 futbolvivo.tv: could not connect to host
 g4w.co: could not connect to host
 gabriele-kluge.de: could not connect to host
 gaiserik.com: could not connect to host
-gala.kiev.ua: could not connect to host
 gam3rs.de: could not connect to host
 game-gentle.com: could not connect to host
 gasbarkenora.com: could not connect to host
 gasnews.net: could not connect to host
 gayforgenji.com: could not connect to host
 gaygeeks.de: could not connect to host
-gbl.selfip.net: could not connect to host
 gdevpenze.ru: could not connect to host
 gdhzcgs.com: could not connect to host
 geeks.berlin: could not connect to host
 gehrke.nrw: could not connect to host
 generationnext.pl: could not connect to host
 geneve.guide: could not connect to host
 georgescarryout.com: could not connect to host
 getgeek.dk: could not connect to host
@@ -357,70 +360,63 @@ hg881.com: could not connect to host
 hiraku.me: could not connect to host
 homophoni.com: could not connect to host
 hoodoo.io: could not connect to host
 hoodoo.tech: could not connect to host
 horeizai.net: could not connect to host
 horvathd.eu: could not connect to host
 hudingyuan.cn: could not connect to host
 hukkatavara.com: could not connect to host
-hundter.com: could not connect to host
 ibase.com: could not connect to host
 ictpro.info: could not connect to host
 iec.pe: could not connect to host
-iemb.tk: could not connect to host
 ifxnet.com: could not connect to host
 ikenmeyer.eu: could not connect to host
 ileat.com: could not connect to host
 imperdintechnologies.com: could not connect to host
-impulse-clan.de: could not connect to host
 inexpensivecomputers.net: could not connect to host
 informatik.zone: could not connect to host
 ingalls.run: could not connect to host
 injust.me: could not connect to host
 inscript.pl: could not connect to host
 insouciant.org: could not connect to host
 installgentoo.net: could not connect to host
 investorloanshub.com: could not connect to host
-iris-insa.com: could not connect to host
 isamiok.com: could not connect to host
 issuesofconcern.in: could not connect to host
 itilo.de: could not connect to host
 itpro-mg.de: could not connect to host
 itproject.guru: could not connect to host
-itshka.rv.ua: could not connect to host
 ivanpolchenko.com: could not connect to host
 ixio.cz: could not connect to host
-izodiacsigns.com: could not connect to host
 jaaxypro.com: could not connect to host
 jakincode.army: could not connect to host
 japan4you.org: could not connect to host
 jaredfraser.com: could not connect to host
 javascriptlab.fr: could not connect to host
 jayharris.ca: could not connect to host
 jbrowndesign.me: could not connect to host
 jean-remy.ch: could not connect to host
-jessevictors.com: could not connect to host
+jeremyc.ca: could not connect to host
 jhburton.co.uk: could not connect to host
 jie.dance: could not connect to host
 jobmedic.com: could not connect to host
 joecod.es: could not connect to host
 johand.io: could not connect to host
 jonathansanchez.pro: could not connect to host
 jonpads.com: could not connect to host
 joostbovee.nl: could not connect to host
 jornalalerta.com.br: could not connect to host
 juliawebber.co.za: could not connect to host
 just-pools.co.za: could not connect to host
 justmy.website: could not connect to host
 juventusmania1897.com: could not connect to host
 kabus.org: could not connect to host
 kaika-facilitymanagement.de: could not connect to host
 kamikaichimaru.com: could not connect to host
-kangaroojacks.co.uk: could not connect to host
 kapo.info: could not connect to host
 karanlyons.com: could not connect to host
 karuneshjohri.com: could not connect to host
 katzen.me: could not connect to host
 kawaiiku.com: could not connect to host
 kawaiiku.de: could not connect to host
 kelm.me: could not connect to host
 kenrogers.co: could not connect to host
@@ -452,27 +448,27 @@ lachawoj.de: could not connect to host
 lathamlabs.com: could not connect to host
 lathamlabs.net: could not connect to host
 lathamlabs.org: could not connect to host
 lavapot.com: could not connect to host
 lawformt.com: could not connect to host
 lazulu.com: could not connect to host
 lcti.biz: could not connect to host
 ldcraft.pw: could not connect to host
-le23.fr: could not connect to host
 lebal.se: could not connect to host
 legaltip.eu: could not connect to host
 legitaxi.com: could not connect to host
 leifdreizler.com: could not connect to host
 leiming.co: could not connect to host
 leninalbertop.com.ve: could not connect to host
 leonardcamacho.me: could not connect to host
 leveredge.net: could not connect to host
 lezdomsm.com: could not connect to host
 lheinrich.org: could not connect to host
+libbitcoin.org: could not connect to host
 lifenexto.com: could not connect to host
 likenosis.com: could not connect to host
 lingerieonline.com.br: could not connect to host
 linksanitizer.com: could not connect to host
 linksextremist.at: could not connect to host
 linuxcommand.ru: could not connect to host
 linvx.org: could not connect to host
 lissabon.guide: could not connect to host
@@ -489,43 +485,48 @@ logcat.info: could not connect to host
 logic8.ml: could not connect to host
 lookyman.net: could not connect to host
 loss.no: could not connect to host
 lovelytimes.net: could not connect to host
 luav.org: could not connect to host
 lubomirkazakov.com: could not connect to host
 lukasunger.cz: could not connect to host
 lukasunger.net: could not connect to host
+luxonetwork.com: could not connect to host
+luzat.com: could not connect to host
 m4g.ru: could not connect to host
 maartenterpstra.xyz: could not connect to host
 macedopesca.com.br: could not connect to host
 madrants.net: could not connect to host
 magnacumlaude.co: could not connect to host
 maik-mahlow.de: could not connect to host
 mail4geek.com: could not connect to host
 marketingdesignu.cz: could not connect to host
 martin-mattel.com: could not connect to host
 marvinkeller.de: could not connect to host
 mastodon.my: could not connect to host
 matcha-iga.jp: could not connect to host
 mathijskingma.nl: could not connect to host
 mattwb65.com: could not connect to host
+mazzotta.me: could not connect to host
 mcdanieldevelopmentservices.com: could not connect to host
 mchopkins.net: could not connect to host
+me-dc.com: could not connect to host
 meanevo.com: could not connect to host
 mecanicadom.com: could not connect to host
 mediadandy.com: could not connect to host
 melonstudios.net: could not connect to host
 mentax.net: could not connect to host
+mes10doigts.ovh: could not connect to host
 metachris.com: could not connect to host
 metrobriefs.com: could not connect to host
 mhjuma.com: could not connect to host
-mikes.tk: could not connect to host
 mingy.ddns.net: could not connect to host
 minitruckin.net: could not connect to host
+mirodasilva.be: could not connect to host
 miyugirls.com: could not connect to host
 mkfs.fr: could not connect to host
 mmstick.tk: could not connect to host
 modded-minecraft-server-list.com: could not connect to host
 moe-max.jp: could not connect to host
 moobo.xyz: could not connect to host
 mooselook.de: could not connect to host
 morotech.com.br: could not connect to host
@@ -536,59 +537,60 @@ motomorgen.com: could not connect to hos
 motorbiketourhanoi.com: could not connect to host
 mountainadventureseminars.com: could not connect to host
 mowalls.net: could not connect to host
 mpserver12.org: could not connect to host
 mrliu.me: could not connect to host
 mtn.cc: could not connect to host
 munduch.cz: could not connect to host
 muslimbanter.co.za: could not connect to host
-mvnet.com.br: could not connect to host
 mybeautyjobs.de: could not connect to host
+mycustomwriting.com: could not connect to host
 myfrenchtattoo.fr: could not connect to host
+n0099.cf: could not connect to host
 naphex.rocks: could not connect to host
 narodsovety.ru: could not connect to host
 natanaelys.com: could not connect to host
 nauck.org: could not connect to host
 ncdesigns-studio.com: could not connect to host
 nedcf.org.uk: could not connect to host
 neer.io: could not connect to host
-nesterov.pw: could not connect to host
+netbrief.ml: could not connect to host
 netica.fr: could not connect to host
 netulo.com: could not connect to host
 nevadafiber.net: could not connect to host
+next-log.ru: could not connect to host
 nexuscorporation.in: could not connect to host
 nfluence.org: could not connect to host
 nico.st: could not connect to host
 nienfun.com: could not connect to host
+nikksno.io: could not connect to host
 nikolasbradshaw.com: could not connect to host
 niouininon.eu: could not connect to host
 nirada.info: could not connect to host
 niva.synology.me: could not connect to host
 nkb.in.th: could not connect to host
-nkp-media.de: could not connect to host
-nlegall.fr: could not connect to host
 nolag.host: could not connect to host
 northwoodsfish.com: could not connect to host
 notesforpebble.com: could not connect to host
 novascan.net: could not connect to host
 novelabs.eu: could not connect to host
 nowremindme.com: could not connect to host
 nsdev.cn: could not connect to host
 nup.pw: could not connect to host
 obdolbacca.ru: could not connect to host
 oberhof.co: could not connect to host
 off-the-clock.us: could not connect to host
 office-ruru.com: could not connect to host
 oliverspringer.eu: could not connect to host
 onewebdev.info: could not connect to host
-online-scene.com: could not connect to host
 onstud.com: could not connect to host
 onwie.fr: could not connect to host
 opengg.me: could not connect to host
+openspace.xxx: could not connect to host
 oranges.tokyo: could not connect to host
 oscsdp.cz: could not connect to host
 outetc.com: could not connect to host
 oxygaming.com: could not connect to host
 oxymc.com: could not connect to host
 p4chivtac.com: could not connect to host
 panj.ws: could not connect to host
 pardnoy.com: could not connect to host
@@ -606,64 +608,69 @@ phasme-2016.com: could not connect to ho
 philippa.cool: could not connect to host
 picallo.es: could not connect to host
 picone.com.au: could not connect to host
 pinebaylibrary.org: could not connect to host
 pitfire.io: could not connect to host
 pixelbash.de: could not connect to host
 plaasprodukte.com: could not connect to host
 planbox.info: could not connect to host
+playsoundevents.be: could not connect to host
 plussizereviews.com: could not connect to host
 pnsc.is: could not connect to host
 pointagri.com: could not connect to host
+pokalsocial.de: could not connect to host
 polit.im: could not connect to host
 poolinstallers.co.za: could not connect to host
 pouets.ovh: could not connect to host
 powerentertainment.tv: could not connect to host
 prelogica.com.br: could not connect to host
 privcloud.org: could not connect to host
 projectasterk.com: could not connect to host
+provitacare.com: could not connect to host
 proxydesk.eu: could not connect to host
 proxyweb.us: could not connect to host
 psncardplus.be: could not connect to host
 psncardplus.com: could not connect to host
 psncardplus.dk: could not connect to host
 psncardplus.nl: could not connect to host
 psncardplus.se: could not connect to host
+psu.je: could not connect to host
 publimepa.it: could not connect to host
 puhe.se: could not connect to host
 pypa.io: could not connect to host
 pythia.nz: could not connect to host
 qoqo.us: could not connect to host
 qrforex.com: could not connect to host
 qscloud.de: could not connect to host
 qto.net: could not connect to host
+r0t.co: could not connect to host
 rainbin.com: could not connect to host
 readityourself.net: could not connect to host
 real-compare.com: could not connect to host
 realwoo.com: could not connect to host
 reignsphere.net: could not connect to host
 reismil.ch: could not connect to host
+relsak.cz: could not connect to host
 relvan.com: could not connect to host
 report-to.io: could not connect to host
 report-url.com: could not connect to host
 report-url.io: could not connect to host
 reporturi.com: could not connect to host
 reporturi.io: could not connect to host
 reporturl.com: could not connect to host
 reporturl.io: could not connect to host
 reqognize.com: could not connect to host
 ressl.ch: could not connect to host
+retcor.net: could not connect to host
 reth.ch: could not connect to host
 retube.ga: could not connect to host
 reykjavik.guide: could not connect to host
 richeza.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 119"  data: no]
-robomonkey.org: could not connect to host
 roeldevries.me: could not connect to host
-rofrank.space: could not connect to host
 roguesignal.net: could not connect to host
 rohanbassett.com: could not connect to host
 romainmuller.xyz: could not connect to host
 roolevoi.ru: could not connect to host
 rpgmaker.es: could not connect to host
 rs-devdemo.host: could not connect to host
 rsldb.com: could not connect to host
 rubyist.today: could not connect to host
@@ -697,78 +704,80 @@ shadowplus.net: could not connect to hos
 shadowrocket.net: could not connect to host
 sharevari.com: could not connect to host
 shavingks.com: could not connect to host
 sheratan.web.id: could not connect to host
 sheying.tm: could not connect to host
 shirakaba-cc.com: could not connect to host
 shopifycloud.com: could not connect to host
 shoppingreview.org: could not connect to host
+sickfile.com: could not connect to host
 siliconchip.me: could not connect to host
 simbolo.co.uk: could not connect to host
 simplerses.com: could not connect to host
 siqi.wang: could not connect to host
 skarox.com: could not connect to host
 skarox.net: could not connect to host
 skarox.ru: could not connect to host
 sky-aroma.com: could not connect to host
 skylocker.net: could not connect to host
 skylocker.nl: could not connect to host
-sl0.us: could not connect to host
 slovoice.org: could not connect to host
 smith.is: could not connect to host
 sml.lc: could not connect to host
 socialworkout.com: could not connect to host
 socialworkout.net: could not connect to host
 socialworkout.org: could not connect to host
 socialworkout.tv: could not connect to host
 socketize.com: could not connect to host
 sodiao.cc: could not connect to host
 sojingle.net: could not connect to host
 solos.im: could not connect to host
 soulema.com: could not connect to host
 soundhunter.xyz: could not connect to host
 sowingseasons.com: could not connect to host
-spha.info: could not connect to host
 spicywombat.com: could not connect to host
 spom.net: could not connect to host
 sportsmanadvisor.com: could not connect to host
+sprint.ml: could not connect to host
+squido.ch: could not connect to host
 stadionmanager.com: could not connect to host
 stadtgartenla.com: could not connect to host
 statgram.me: could not connect to host
 static-assets.io: could not connect to host
 stbennett.org: could not connect to host
 stefanovski.io: could not connect to host
 steffi-in-australien.com: could not connect to host
 steven-bennett.com: could not connect to host
 stickswag.cf: could not connect to host
 stilettomoda.com.br: could not connect to host
 stpip.com: could not connect to host
 stressfreehousehold.com: could not connect to host
-studport.rv.ua: could not connect to host
+stuka-art.de: could not connect to host
 stylle.me: could not connect to host
 sulek.eu: could not connect to host
+suneilpatel.com: could not connect to host
 sunjaydhama.com: could not connect to host
-sunn.ie: could not connect to host
 sussexwebdesigns.com: could not connect to host
 sviz.pro: could not connect to host
 t3rror.net: could not connect to host
 takusan.ru: could not connect to host
 talktwincities.com: could not connect to host
 tdelmas.eu: could not connect to host
 tdelmas.ovh: could not connect to host
 tdsb.cf: could not connect to host
 tdsbhack.tk: could not connect to host
 techask.it: could not connect to host
 techpit.us: could not connect to host
 telugu4u.net: could not connect to host
 tenispopular.com: could not connect to host
 teracloud.at: could not connect to host
 terminalvelocity.co.nz: could not connect to host
 terrax.net: could not connect to host
+tetsai.com: could not connect to host
 theprivacysolution.com: could not connect to host
 thesehighsandlows.com: could not connect to host
 thesteins.org: could not connect to host
 thinkcash.nl: could not connect to host
 thinktux.net: could not connect to host
 thynx.io: could not connect to host
 tiliaze.info: could not connect to host
 tiliaze.net: could not connect to host
@@ -776,98 +785,105 @@ timysewyn.be: could not connect to host
 tokaido.com: could not connect to host
 topdetoxcleanse.com: could not connect to host
 topnotchendings.com: could not connect to host
 totallynotaserver.com: could not connect to host
 totch.de: could not connect to host
 totot.net: could not connect to host
 toxicip.com: could not connect to host
 transcendmotor.sg: could not connect to host
+tsaro.io: could not connect to host
 tucidi.net: could not connect to host
 tumelum.de: could not connect to host
 turn-sticks.com: could not connect to host
+twem.ddns.net: could not connect to host
 twiri.net: could not connect to host
 twotube.ie: could not connect to host
 tyil.work: could not connect to host
 tykoon.com: could not connect to host
 u.nu: could not connect to host
 uberboxen.net: could not connect to host
 udo-luetkemeier.de: could not connect to host
+uevan.com: could not connect to host
 umsapi.com: could not connect to host
+unhu.fr: could not connect to host
 unicorn.li: could not connect to host
 unsupervised.ca: could not connect to host
 untoldstory.eu: could not connect to host
 urbackups.com: could not connect to host
+uscp8.com: could not connect to host
 uwesander.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 119"  data: no]
-v-desk.ga: could not connect to host
 vadik.me: could not connect to host
 valshamar.is: could not connect to host
+valtoaho.com: could not connect to host
 vanderstraeten.dynv6.net: could not connect to host
 vapehour.com: could not connect to host
 vapeshopsupply.com: could not connect to host
 varela-electricite.fr: could not connect to host
 venmos.com: could not connect to host
 versfin.net: could not connect to host
 vgatest.nl: could not connect to host
 vinetalk.net: could not connect to host
 visiontree.eu: could not connect to host
 vlogge.com: could not connect to host
-vmgirls.com: could not connect to host
 vmug.pl: could not connect to host
 vrtouring.org: could not connect to host
 vsx.ch: could not connect to host
 vxapps.com: could not connect to host
 w4.no: could not connect to host
 waixingrenfuli.vip: could not connect to host
+wallpapers.pub: could not connect to host
 wanashi.com: could not connect to host
 warlions.info: could not connect to host
 warp-radio.com: could not connect to host
 warp-radio.tv: could not connect to host
 watchweasel.com: could not connect to host
 we.serveftp.net: could not connect to host
 weareincognito.org: could not connect to host
 webart-factory.de: could not connect to host
 webcatechism.com: could not connect to host
 webdesigneauclaire.com: could not connect to host
 webhackspro.com: could not connect to host
 webtech.com.br: could not connect to host
 webthings.com.br: could not connect to host
 wecanvisit.com: could not connect to host
 weed.ren: could not connect to host
+wekibe.de: could not connect to host
 welby.cat: could not connect to host
 welcomehelp.de: could not connect to host
 werhatunsverraten.eu: could not connect to host
-werkinc.de: could not connect to host
 werkkrew.xyz: could not connect to host
 wessner.org: could not connect to host
 wetthost.com: could not connect to host
 whilsttraveling.com: could not connect to host
 winnersports.co: could not connect to host
 wireframesoftware.com: could not connect to host
 wissl.org: could not connect to host
 wolfemg.com: could not connect to host
 wolfenland.net: could not connect to host
 woomu.me: could not connect to host
 wooplagaming.com: could not connect to host
 workemy.com: could not connect to host
 worldfree4.org: could not connect to host
 wp-fastsearch.de: could not connect to host
 wp6.pw: could not connect to host
 wriedts.de: could not connect to host
+wwv-8522.com: could not connect to host
 www-8887999.com: could not connect to host
 www.re: could not connect to host
 www.sb: could not connect to host
 www.simbolo.co.uk: could not connect to host
 xia100.xyz: could not connect to host
 xiaoyu.net: could not connect to host
 xing.ml: could not connect to host
 xn--8mr166hf6s.xn--fiqs8s: could not connect to host
 xn--yj8h0m.ws: could not connect to host
 xqin.net: could not connect to host
 xtremenutrition.com.br: could not connect to host
+xwaretech.info: could not connect to host
 yabrt.cn: could not connect to host
 yaucy.win: could not connect to host
 yffengshi.ml: could not connect to host
 yoga.is-an-engineer.com: could not connect to host
 yux.fr: could not connect to host
 yvesx.com: could not connect to host
 zaoext.com: could not connect to host
 zby.io: could not connect to host
@@ -925,17 +941,17 @@ 12vpnchina.com: could not connect to hos
 1391kj.com: did not receive HSTS header
 1396.cc: did not receive HSTS header
 1396.net: could not connect to host
 1536.cf: could not connect to host
 163pwd.com: could not connect to host
 166166.com: could not connect to host
 16deza.com: did not receive HSTS header
 16packets.com: could not connect to host
-173vpn.cn: did not receive HSTS header
+173vpn.cn: could not connect to host
 173vpns.com: did not receive HSTS header
 188betwarriors.co.uk: could not connect to host
 188trafalgar.ca: did not receive HSTS header
 195gm.com: could not connect to host
 1a-jva.de: could not connect to host
 1atic.com: could not connect to host
 1co-jp.net: did not receive HSTS header
 1cover.com: could not connect to host
@@ -947,46 +963,44 @@ 1three1.net: did not receive HSTS header
 1xcess.com: did not receive HSTS header
 1years.cc: could not connect to host
 206rc.net: max-age too low: 2592000
 20hs.cn: did not receive HSTS header
 21lg.co: could not connect to host
 247quickbooks.com: did not receive HSTS header
 24hourpaint.com: could not connect to host
 24sihu.com: could not connect to host
-256pages.com: did not receive HSTS header
 25daysof.io: could not connect to host
 2859cc.com: could not connect to host
 2acbi-asso.fr: did not receive HSTS header
 2bizi.ru: could not connect to host
 2brokegirls.org: could not connect to host
 2carpros.com: did not receive HSTS header
 2intermediate.co.uk: did not receive HSTS header
 2or3.tk: could not connect to host
 2smart4food.com: did not receive HSTS header
-2ss.jp: did not receive HSTS header
+2ss.jp: could not connect to host
 300651.ru: did not receive HSTS header
 300m.com: did not receive HSTS header
 300mbmovie24.com: did not receive HSTS header
 300mbmovies4u.cc: could not connect to host
 301.website: could not connect to host
 302.nyc: could not connect to host
 314166.com: could not connect to host
 32ph.com: could not connect to host
 33drugstore.com: could not connect to host
-341.mg: did not receive HSTS header
+341.mg: could not connect to host
 3555aa.com: could not connect to host
 35792.de: could not connect to host
 360gradus.com: did not receive HSTS header
 365.or.jp: could not connect to host
 368mibn.com: could not connect to host
 3778xl.com: did not receive HSTS header
 38sihu.com: could not connect to host
 39sihu.com: could not connect to host
-3ags.de: did not receive HSTS header
 3chit.cf: could not connect to host
 3click-loan.com: could not connect to host
 3d-bastler.de: could not connect to host
 3dcart.com: did not receive HSTS header
 3delivered.com: could not connect to host
 3dproteinimaging.com: did not receive HSTS header
 3sreporting.com: did not receive HSTS header
 404.sh: could not connect to host
@@ -1001,17 +1015,16 @@ 4cclothing.com: could not connect to hos
 4elements.com: did not receive HSTS header
 4eyes.ch: did not receive HSTS header
 4miners.net: could not connect to host
 4mybaby.ch: did not receive HSTS header
 4ourty2.org: did not receive HSTS header
 4sqsu.eu: could not connect to host
 4w-performers.link: could not connect to host
 50millionablaze.org: could not connect to host
-513vpn.net: did not receive HSTS header
 517vpn.cn: could not connect to host
 518maicai.com: did not receive HSTS header
 540.co: did not receive HSTS header
 54bf.com: could not connect to host
 56ct.com: could not connect to host
 5piecesofadvice.com: could not connect to host
 5w5.la: could not connect to host
 60ych.net: did not receive HSTS header
@@ -1032,17 +1045,17 @@ 8522cn.com: did not receive HSTS header
 88.to: could not connect to host
 8888av.co: did not receive HSTS header
 888lu.co: could not connect to host
 89955.com: could not connect to host
 899699.com: did not receive HSTS header
 90smthng.com: could not connect to host
 9118b.com: could not connect to host
 911911.pw: could not connect to host
-915ers.com: could not connect to host
+915ers.com: did not receive HSTS header
 922.be: could not connect to host
 960news.ca: could not connect to host
 9651678.ru: could not connect to host
 98laba.com: could not connect to host
 98laba.net: could not connect to host
 99511.fi: could not connect to host
 9iwan.net: did not receive HSTS header
 9point6.com: could not connect to host
@@ -1171,21 +1184,20 @@ aficotroceni.ro: did not receive HSTS he
 afiru.net: could not connect to host
 afmchandler.com: did not receive HSTS header
 afp548.tk: could not connect to host
 after.im: did not receive HSTS header
 afvallendoeje.nu: could not connect to host
 afyou.co.kr: could not connect to host
 afzco.asia: did not receive HSTS header
 agalaxyfarfaraway.co.uk: could not connect to host
-agate.pw: did not receive HSTS header
 agatheetraphael.fr: could not connect to host
 agbremen.de: did not receive HSTS header
 agdalieso.com.ba: could not connect to host
-agentseeker.ca: did not receive HSTS header
+agentseeker.ca: could not connect to host
 agevio.com: could not connect to host
 agonswim.com: could not connect to host
 agrias.com.br: did not receive HSTS header
 agrimap.com: did not receive HSTS header
 agro-id.gov.ua: did not receive HSTS header
 agtv.com.br: did not receive HSTS header
 ahabingo.com: did not receive HSTS header
 ahfazahmed.net: did not receive HSTS header
@@ -1271,17 +1283,16 @@ alphabuild.io: could not connect to host
 alphagamers.net: did not receive HSTS header
 alphalabs.xyz: could not connect to host
 alphasall.com: could not connect to host
 als-hardware.co.za: did not receive HSTS header
 alt33c3.org: could not connect to host
 altailife.ru: did not receive HSTS header
 altamarea.se: could not connect to host
 alteqnia.com: could not connect to host
-alterbaum.net: did not receive HSTS header
 altfire.ca: could not connect to host
 altmv.com: max-age too low: 7776000
 aluminium-scaffolding.co.uk: could not connect to host
 alunjam.es: did not receive HSTS header
 alusta.co: could not connect to host
 alza.at: did not receive HSTS header
 alza.co.uk: did not receive HSTS header
 alza.cz: did not receive HSTS header
@@ -1557,22 +1568,19 @@ av.de: did not receive HSTS header
 avadatravel.com: did not receive HSTS header
 avantmfg.com: did not receive HSTS header
 avec-ou-sans-ordonnance.fr: could not connect to host
 aveling-adventure.co.uk: did not receive HSTS header
 avepol.cz: did not receive HSTS header
 avepol.eu: did not receive HSTS header
 aviacao.pt: did not receive HSTS header
 aviodeals.com: could not connect to host
-avmo.pw: did not receive HSTS header
 avonlearningcampus.com: could not connect to host
 avqueen.cn: could not connect to host
-avso.pw: did not receive HSTS header
 avus-automobile.com: did not receive HSTS header
-avxo.pw: did not receive HSTS header
 awanderlustadventure.com: did not receive HSTS header
 awg-mode.de: did not receive HSTS header
 aww.moe: did not receive HSTS header
 awxg.com: could not connect to host
 axado.com.br: did not receive HSTS header
 axeny.com: did not receive HSTS header
 axg.io: did not receive HSTS header
 ayahuascaadvisor.com: could not connect to host
@@ -1710,17 +1718,16 @@ berlatih.com: did not receive HSTS heade
 berlinleaks.com: could not connect to host
 bernieware.de: could not connect to host
 berrymark.be: max-age too low: 0
 besixdouze.world: could not connect to host
 besola.de: did not receive HSTS header
 bestbeards.ca: could not connect to host
 bestcellular.com: did not receive HSTS header
 besthost.cz: did not receive HSTS header
-bestmodels.su: did not receive HSTS header
 bestof1001.de: did not receive HSTS header
 bestorangeseo.com: could not connect to host
 betaclean.fr: did not receive HSTS header
 betafive.net: could not connect to host
 betakah.net: could not connect to host
 betcafearena.ro: did not receive HSTS header
 bethanyduke.com: max-age too low: 7776000
 bethditto.com: did not receive HSTS header
@@ -1776,16 +1783,17 @@ bimbo.com: did not receive HSTS header
 binaryfigments.com: max-age too low: 86400
 binderapp.net: could not connect to host
 bioespuna.eu: did not receive HSTS header
 biofam.ru: did not receive HSTS header
 bioknowme.com: did not receive HSTS header
 bionicspirit.com: could not connect to host
 biophysik-ssl.de: did not receive HSTS header
 birkman.com: did not receive HSTS header
+biscoint.io: did not receive HSTS header
 bismarck.moe: did not receive HSTS header
 bisterfeldt.com: could not connect to host
 bitbit.org: did not receive HSTS header
 bitchan.it: could not connect to host
 bitcoinprivacy.net: did not receive HSTS header
 bitcoinworld.me: could not connect to host
 bitconcepts.co.uk: could not connect to host
 biteoftech.com: did not receive HSTS header
@@ -1878,17 +1886,16 @@ booth.in.th: could not connect to host
 bootjp.me: did not receive HSTS header
 borderlinegroup.com: could not connect to host
 boringsecurity.net: could not connect to host
 boris.one: did not receive HSTS header
 boris64.net: did not receive HSTS header
 borscheid-wenig.com: did not receive HSTS header
 boschee.net: could not connect to host
 botox.bz: did not receive HSTS header
-boudah.pl: did not receive HSTS header
 bounceboxspc.com: did not receive HSTS header
 bouncecoffee.com: did not receive HSTS header
 bouwbedrijfpurmerend.nl: did not receive HSTS header
 bowlroll.net: max-age too low: 0
 boxcryptor.com: did not receive HSTS header
 boxintense.com: did not receive HSTS header
 boyan.in: did not receive HSTS header
 bp-wahl.at: did not receive HSTS header
@@ -1925,23 +1932,23 @@ brix.ninja: did not receive HSTS header
 brks.xyz: could not connect to host
 broken-oak.com: could not connect to host
 brookechase.com: did not receive HSTS header
 browserid.org: could not connect to host
 brrd.io: did not receive HSTS header
 brunix.net: did not receive HSTS header
 brunohenc.from.hr: did not receive HSTS header
 brunoonline.co.uk: could not connect to host
+bryanquigley.com: did not receive HSTS header
 bryn.xyz: could not connect to host
 bsagan.fr: could not connect to host
 bsdtips.com: could not connect to host
 bsociabl.com: could not connect to host
 btc-e.com: did not receive HSTS header
 btcdlc.com: could not connect to host
-btio.pw: did not receive HSTS header
 buben.tech: did not receive HSTS header
 bubulazi.com: did not receive HSTS header
 bubulazy.com: did not receive HSTS header
 buch-cuber.de: max-age too low: 0
 buchheld.at: did not receive HSTS header
 bucket.tk: could not connect to host
 budgetthostels.nl: did not receive HSTS header
 budskap.eu: could not connect to host
@@ -2036,17 +2043,17 @@ c3b.info: could not connect to host
 cabarave.com: could not connect to host
 cabsites.com: could not connect to host
 cabusar.fr: did not receive HSTS header
 caconnect.org: could not connect to host
 cadao.me: did not receive HSTS header
 caesreon.com: could not connect to host
 cafe-murr.de: could not connect to host
 cafe-scientifique.org.ec: could not connect to host
-cafe-service.ru: could not connect to host
+cafe-service.ru: did not receive HSTS header
 caim.cz: did not receive HSTS header
 caizx.com: did not receive HSTS header
 cajapopcorn.com: did not receive HSTS header
 cake.care: could not connect to host
 calcularpagerank.com.br: could not connect to host
 calendarr.com: did not receive HSTS header
 calgaryconstructionjobs.com: did not receive HSTS header
 calix.com: max-age too low: 0
@@ -2160,17 +2167,17 @@ cgerstner.eu: could not connect to host
 cgsshelper.tk: could not connect to host
 chahub.com: could not connect to host
 chainmonitor.com: could not connect to host
 championsofregnum.com: did not receive HSTS header
 chancat.blog: max-age too low: 2592000
 chandlerredding.com: did not receive HSTS header
 changetip.com: did not receive HSTS header
 chanshiyu.com: did not receive HSTS header
-chaos.fail: could not connect to host
+chaos.fail: did not receive HSTS header
 chaoswebs.net: did not receive HSTS header
 charityclear.com: did not receive HSTS header
 charitystreet.co.uk: could not connect to host
 charliemcneive.com: could not connect to host
 charlipopkids.com.au: could not connect to host
 charnleyhouse.co.uk: did not receive HSTS header
 charp.eu: could not connect to host
 chartstoffarm.de: max-age too low: 10
@@ -2220,21 +2227,23 @@ chrisopperwall.com: did not receive HSTS
 chrisself.xyz: did not receive HSTS header
 christiaandruif.nl: could not connect to host
 christianbro.gq: could not connect to host
 christina-quast.de: did not receive HSTS header
 christophercolumbusfoundation.gov: could not connect to host
 christophheich.me: could not connect to host
 chrisupjohn.com: could not connect to host
 chrisvicmall.com: did not receive HSTS header
+chriswarrick.com: did not receive HSTS header
 chrome: could not connect to host
 chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless)
 chrome.google.com: did not receive HSTS header (error ignored - included regardless)
 chrst.ph: could not connect to host
 chua.cf: could not connect to host
+chuck.ovh: did not receive HSTS header
 chulado.com: did not receive HSTS header
 churchux.co: did not receive HSTS header
 churrasqueirafacil.com.br: could not connect to host
 cidr.ml: could not connect to host
 cigarblogs.net: could not connect to host
 cigi.site: could not connect to host
 ciicutini.ro: did not receive HSTS header
 cim2b.de: could not connect to host
@@ -2356,18 +2365,20 @@ collectosaurus.com: did not receive HSTS
 collegepulse.org: could not connect to host
 collies.eu: max-age too low: 3
 collins.press: did not receive HSTS header
 collinsartworks.com: did not receive HSTS header
 collision.fyi: could not connect to host
 colmexpro.com: did not receive HSTS header
 colognegaming.net: could not connect to host
 coloradocomputernetworking.net: could not connect to host
+colorectalcompounding.com: did not receive HSTS header
 colorlib.com: did not receive HSTS header
 colorunhas.com.br: could not connect to host
+cometonovascotia.ca: did not receive HSTS header
 comfortdom.ua: did not receive HSTS header
 comfortticket.de: did not receive HSTS header
 comfy.cafe: did not receive HSTS header
 comfy.moe: did not receive HSTS header
 comicspines.com: could not connect to host
 comitesaustria.at: could not connect to host
 comiteshopping.com: could not connect to host
 commercialplanet.eu: could not connect to host
@@ -2599,17 +2610,16 @@ danijobs.com: could not connect to host
 danishenanigans.com: could not connect to host
 dankeblog.com: could not connect to host
 danmark.guide: could not connect to host
 dannycrichton.com: did not receive HSTS header
 danrl.de: could not connect to host
 danwillenberg.com: did not receive HSTS header
 daolerp.xyz: could not connect to host
 daplie.com: did not receive HSTS header
-dareyou.be: did not receive HSTS header
 dargasia.is: could not connect to host
 dario.im: could not connect to host
 dark-x.cf: could not connect to host
 darkanzali.pl: max-age too low: 0
 darkfriday.ddns.net: could not connect to host
 darkhole.cn: did not receive HSTS header
 darkkeepers.dk: could not connect to host
 darknebula.space: could not connect to host
@@ -2682,17 +2692,16 @@ deinserverhost.de: did not receive HSTS 
 dekasan.ru: could not connect to host
 delayrefunds.co.uk: could not connect to host
 deliverance.co.uk: could not connect to host
 deltaconcepts.de: did not receive HSTS header
 delvj.org: could not connect to host
 demdis.org: could not connect to host
 demilitarized.ninja: could not connect to host
 demo-server.us: could not connect to host
-demo.swedbank.se: did not receive HSTS header
 demomanca.com: did not receive HSTS header
 demotops.com: did not receive HSTS header
 denh.am: did not receive HSTS header
 denisjean.fr: could not connect to host
 dentaldomain.org: did not receive HSTS header
 dentaldomain.ph: did not receive HSTS header
 denvercybersecurity.com: did not receive HSTS header
 denverprophit.us: did not receive HSTS header
@@ -2745,16 +2754,17 @@ dhpiggott.net: did not receive HSTS head
 diablotine.rocks: could not connect to host
 diagnosia.com: did not receive HSTS header
 diamondcare.com.br: could not connect to host
 dianlujitao.com: did not receive HSTS header
 dicando.com: max-age too low: 2592000
 dicelab.co.uk: could not connect to host
 dicionariofinanceiro.com: did not receive HSTS header
 dicionariopopular.com: did not receive HSTS header
+dicoding.com: did not receive HSTS header
 dieb.photo: could not connect to host
 dierenkruiden.nl: could not connect to host
 diewebstube.de: could not connect to host
 diezel.com: could not connect to host
 diferenca.com: did not receive HSTS header
 digired.xyz: could not connect to host
 digitalbank.kz: could not connect to host
 digitaldaddy.net: could not connect to host
@@ -2926,16 +2936,17 @@ dubik.su: did not receive HSTS header
 dudesunderwear.com.br: could not connect to host
 duelysthub.com: could not connect to host
 duerls.de: did not receive HSTS header
 dukec.me: could not connect to host
 dullsir.com: did not receive HSTS header
 dungi.org: could not connect to host
 duongpho.com: did not receive HSTS header
 duskopy.top: could not connect to host
+dutchessuganda.com: did not receive HSTS header
 dutchrank.com: did not receive HSTS header
 duuu.ch: could not connect to host
 dycontrol.de: could not connect to host
 dylanscott.com.au: did not receive HSTS header
 dynamic-innovations.net: could not connect to host
 dynamize.solutions: could not connect to host
 dyrkar.com: did not receive HSTS header
 dzimejl.sk: did not receive HSTS header
@@ -2999,17 +3010,16 @@ edelblack.ch: could not connect to host
 edelsteincosmetic.com: did not receive HSTS header
 eden-noel.at: could not connect to host
 edenaya.com: did not receive HSTS header
 edgereinvent.com: did not receive HSTS header
 ediscomp.sk: did not receive HSTS header
 edissecurity.sk: did not receive HSTS header
 edix.ru: could not connect to host
 edk.com.tr: did not receive HSTS header
-edlinus.cn: did not receive HSTS header
 edmodo.com: did not receive HSTS header
 edpubs.gov: did not receive HSTS header
 eduardnikolenko.ru: could not connect to host
 educatio.tech: could not connect to host
 educourse.ga: could not connect to host
 eduvance.in: did not receive HSTS header
 eengezinswoning-in-alphen-aan-den-rijn-kopen.nl: could not connect to host
 eengezinswoning-in-de-friese-meren-kopen.nl: could not connect to host
@@ -3063,33 +3073,33 @@ elenag.ga: could not connect to host
 elenagherta.ga: could not connect to host
 elenoon.ir: did not receive HSTS header
 elgacien.de: could not connect to host
 elimdengelen.com: did not receive HSTS header
 elite-porno.ru: could not connect to host
 elitecovering.fr: did not receive HSTS header
 elitefishtank.com: could not connect to host
 elmar-kraamzorg.nl: did not receive HSTS header
-elna-service.com.ua: did not receive HSTS header
 elnutricionista.es: could not connect to host
 elohna.ch: did not receive HSTS header
 elpay.kz: did not receive HSTS header
 elpo.xyz: could not connect to host
 elsamakhin.com: could not connect to host
 elsemanario.com: did not receive HSTS header
 elsitar.com: could not connect to host
 email.lookout.com: could not connect to host
 email2rss.net: could not connect to host
 emanatepixels.com: could not connect to host
 emanga.su: did not receive HSTS header
 embroidered-stuff.com: could not connect to host
 emeldi-commerce.com: max-age too low: 0
 emesolutions.net: did not receive HSTS header
 emiele.com.br: could not connect to host
 emilyhorsman.com: did not receive HSTS header
+emilyjohnson.ga: did not receive HSTS header
 eminovic.me: could not connect to host
 emjainteractive.com: did not receive HSTS header
 emjimadhu.com: could not connect to host
 emmable.com: could not connect to host
 emmaliddell.com: could not connect to host
 emnitech.com: could not connect to host
 empleosentorreon.mx: could not connect to host
 empleostampico.com: did not receive HSTS header
@@ -3237,17 +3247,17 @@ evowl.com: could not connect to host
 ewallet-optimizer.com: did not receive HSTS header
 ewex.org: could not connect to host
 excelgum.ca: did not receive HSTS header
 exceptionalservers.com: could not connect to host
 exfiles.cz: did not receive HSTS header
 exgravitus.com: could not connect to host
 exno.co: could not connect to host
 exousiakaidunamis.xyz: could not connect to host
-expertmile.com: did not receive HSTS header
+expertmile.com: could not connect to host
 expo-designers.com: did not receive HSTS header
 expressfinance.co.za: did not receive HSTS header
 extrathemeshowcase.net: could not connect to host
 extratorrentlive.xyz: could not connect to host
 extratorrents.tech: could not connect to host
 extreemhost.nl: did not receive HSTS header
 extremenetworking.net: could not connect to host
 exy.pw: could not connect to host
@@ -3265,16 +3275,17 @@ eztv.ch: did not receive HSTS header
 f-rickroll-g.pw: could not connect to host
 f-s-u.co.uk: could not connect to host
 f00.ca: did not receive HSTS header
 f2f.cash: could not connect to host
 faber.io: could not connect to host
 fabhub.io: could not connect to host
 fabianfischer.de: did not receive HSTS header
 fabriko.fr: did not receive HSTS header
+fabrysociety.org: did not receive HSTS header
 factorable.net: did not receive HSTS header
 factorygw.com: did not receive HSTS header
 fadilus.com: did not receive HSTS header
 faesser.com: did not receive HSTS header
 fahmed.de: did not receive HSTS header
 fail4free.de: did not receive HSTS header
 failproof.be: max-age too low: 604800
 fairkey.dk: did not receive HSTS header
@@ -3287,17 +3298,16 @@ falconwiz.com: did not receive HSTS head
 falkhusemann.de: did not receive HSTS header
 falkp.no: did not receive HSTS header
 fallenangelspirits.uk: could not connect to host
 faluninfo.ba: did not receive HSTS header
 fam-weyer.de: did not receive HSTS header
 fame-agency.net: could not connect to host
 familie-sprink.de: could not connect to host
 familie-zimmermann.at: could not connect to host
-familylawhotline.org: did not receive HSTS header
 famio.cn: could not connect to host
 fanflow.com: did not receive HSTS header
 fant.dk: did not receive HSTS header
 fantasticgardenersmelbourne.com.au: did not receive HSTS header
 fantasyescortsbirmingham.co.uk: did not receive HSTS header
 fantasyfootballpundit.com: did not receive HSTS header
 fanyl.cn: could not connect to host
 farces.com: did not receive HSTS header
@@ -3429,17 +3439,16 @@ flushstudios.com: did not receive HSTS h
 flyaces.com: could not connect to host
 fm83.nl: could not connect to host
 fmi.gov: did not receive HSTS header
 fnvsecurity.com: could not connect to host
 fobc-usa.org: did not receive HSTS header
 fojtova.cz: did not receive HSTS header
 fojtovi.cz: did not receive HSTS header
 followback.net: did not receive HSTS header
-foneo.com: did not receive HSTS header
 fonetiq.io: could not connect to host
 foo: could not connect to host
 food4health.guide: could not connect to host
 foodbuddy.ch: could not connect to host
 foodiebox.no: did not receive HSTS header
 foodies.my: did not receive HSTS header
 foodievenues.com: could not connect to host
 foodsafetyworkinggroup.gov: could not connect to host
@@ -3936,16 +3945,17 @@ handinhandfoundation.org.uk: could not c
 handiworker.com: could not connect to host
 handleidingkwijt.com: did not receive HSTS header
 handsandall.com: did not receive HSTS header
 hanfu.la: could not connect to host
 hangar18-modelismo.com.br: could not connect to host
 hanimalis.fr: could not connect to host
 hans-natur.de: did not receive HSTS header
 hao2taiwan.com: max-age too low: 0
+haogoodair.ca: did not receive HSTS header
 haomwei.com: could not connect to host
 haoyugao.com: could not connect to host
 haozi.me: could not connect to host
 happix.nl: did not receive HSTS header
 happyandrelaxeddogs.eu: did not receive HSTS header
 happycoder.net: did not receive HSTS header
 happyfabric.me: did not receive HSTS header
 happygastro.com: could not connect to host
@@ -3960,25 +3970,25 @@ harlentimberproducts.co.uk: did not rece
 harmonycosmetic.com: max-age too low: 300
 harristony.com: could not connect to host
 hartlep.eu: could not connect to host
 hartmancpa.com: did not receive HSTS header
 harvestrenewal.org: did not receive HSTS header
 harz.cloud: could not connect to host
 has.vision: could not connect to host
 hash-list.com: could not connect to host
+hashnode.com: did not receive HSTS header
 hasilocke.de: did not receive HSTS header
 hasinase.de: did not receive HSTS header
 haste.ch: could not connect to host
 hastherebeenamassshooting.today: could not connect to host
 hatoko.net: could not connect to host
 haufschild.de: could not connect to host
 haurumcraft.net: could not connect to host
 hausarzt-stader-str.de: did not receive HSTS header
-havasuinsurance.com: did not receive HSTS header
 haveeruexaminer.com: could not connect to host
 havenmoon.com: could not connect to host
 havenswift-hosting.co.uk: did not receive HSTS header
 hawthornharpist.com: could not connect to host
 haxoff.com: could not connect to host
 haxon.me: could not connect to host
 haxx.hu: did not receive HSTS header
 haydenhill.us: could not connect to host
@@ -4036,16 +4046,17 @@ hex2013.com: did not receive HSTS header
 heyguevara.com: could not connect to host
 heywoodtown.co.uk: did not receive HSTS header
 hibilog.com: could not connect to host
 hicn.gq: could not connect to host
 hiddendepth.ie: max-age too low: 0
 hiddenmail.xyz: could not connect to host
 hiddenrefuge.eu.org: could not connect to host
 hideftv.deals: could not connect to host
+hieu.com.au: did not receive HSTS header
 hiexmerida-mailing.com: did not receive HSTS header
 highgrove.org.uk: could not connect to host
 highseer.com: did not receive HSTS header
 highsurf-miyazaki.com: did not receive HSTS header
 hightower.eu: could not connect to host
 highvelocitydesign.com: could not connect to host
 hiisukun.com: could not connect to host
 hiitcentre.com: did not receive HSTS header
@@ -4195,33 +4206,34 @@ icloud.net: could not connect to host
 icntorrent.download: could not connect to host
 icq-project.net: could not connect to host
 icreative.nl: did not receive HSTS header
 id-co.in: could not connect to host
 id-conf.com: did not receive HSTS header
 ideal-envelopes.co.uk: did not receive HSTS header
 idealmoto.com: did not receive HSTS header
 idealmykonos.com: did not receive HSTS header
-ideaman924.com: did not receive HSTS header
+ideaman924.com: could not connect to host
 ideaplus.me: could not connect to host
 ideasmeetingpoint.com: could not connect to host
 ideation-inc.co.jp: could not connect to host
 idedr.com: could not connect to host
 identitylabs.uk: could not connect to host
 identitysandbox.gov: could not connect to host
 idgsupply.com: did not receive HSTS header
 idisplay.es: did not receive HSTS header
 idlekernel.com: could not connect to host
 idontexist.me: did not receive HSTS header
 ierna.com: did not receive HSTS header
 ies-italia.it: did not receive HSTS header
 ies.id.lv: could not connect to host
 ievgenialehner.com: did not receive HSTS header
 ifad.org: did not receive HSTS header
 ifastuniversity.com: did not receive HSTS header
+ifengge.me: did not receive HSTS header
 ifleurs.com: could not connect to host
 ifx.ee: could not connect to host
 igforums.com: could not connect to host
 igiftcards.nl: did not receive HSTS header
 ignatisd.gr: did not receive HSTS header
 igule.net: could not connect to host
 ihrlotto.de: could not connect to host
 ihrnationalrat.ch: could not connect to host
@@ -4409,16 +4421,17 @@ ishangirdhar.com: could not connect to h
 ishillaryclintoninprisonyet.com: could not connect to host
 isitamor.pm: could not connect to host
 iskaz.rs: did not receive HSTS header
 islandzero.net: did not receive HSTS header
 islief.com: did not receive HSTS header
 ismetroonfiretoday.com: could not connect to host
 isogen5.com: could not connect to host
 isogram.nl: could not connect to host
+isreedyintheuk.com: did not receive HSTS header
 istanbultravelguide.info: could not connect to host
 istaspirtslietas.lv: did not receive HSTS header
 it-cave.com: could not connect to host
 it-go.net: did not receive HSTS header
 it-schwerin.de: could not connect to host
 itechgeek.com: max-age too low: 0
 items.lv: did not receive HSTS header
 itemton.com: could not connect to host
@@ -4621,17 +4634,17 @@ jrgold.me: could not connect to host
 jrmd.io: could not connect to host
 jrvar.com: could not connect to host
 jsanders.us: did not receive HSTS header
 jsbentertainment.nl: did not receive HSTS header
 jsg-technologies.de: did not receive HSTS header
 jualautoclave.com: did not receive HSTS header
 jualssh.com: could not connect to host
 juandesouza.com: did not receive HSTS header
-juka.pp.ua: could not connect to host
+juka.pp.ua: did not receive HSTS header
 juku-wing.jp: could not connect to host
 juliamweber.de: could not connect to host
 julian-kipka.de: did not receive HSTS header
 julian-witusch.de: could not connect to host
 julido.de: did not receive HSTS header
 jumbox.xyz: could not connect to host
 jumbster.com: max-age too low: 2592000
 jumping-duck.com: could not connect to host
@@ -4684,16 +4697,17 @@ kanscooking.org: did not receive HSTS he
 kany.me: did not receive HSTS header
 kanzlei-wirtschaftsrecht.berlin: did not receive HSTS header
 kaohub.com: could not connect to host
 kaplatz.is: could not connect to host
 kapucini.si: max-age too low: 0
 kaputt.com: could not connect to host
 kapverde.guide: could not connect to host
 karaoketonight.com: could not connect to host
+karlis-kavacis.id.lv: did not receive HSTS header
 karloskontana.tk: could not connect to host
 karmaflux.com: did not receive HSTS header
 karting34.com: did not receive HSTS header
 kashdash.ca: could not connect to host
 katiaetdavid.fr: could not connect to host
 katoju.co.jp: could not connect to host
 katproxy.al: did not receive HSTS header
 katproxy.online: could not connect to host
@@ -4791,17 +4805,17 @@ klaxn.org: could not connect to host
 klean-ritekc.com: did not receive HSTS header
 kleertjesvoordelig.nl: could not connect to host
 kleinerarchitekturfuehrer.de: could not connect to host
 kleppe.co: could not connect to host
 kletterkater.com: did not receive HSTS header
 klicktojob.de: could not connect to host
 klunkergarten.org: could not connect to host
 knapen.io: max-age too low: 604800
-knccloud.com: could not connect to host
+knccloud.com: did not receive HSTS header
 kngk-transavto.ru: could not connect to host
 knigadel.com: did not receive HSTS header
 knightsbridgegroup.org: could not connect to host
 knowdebt.org: did not receive HSTS header
 knowledgesnap.com: could not connect to host
 knowledgesnapsites.com: could not connect to host
 koddsson.com: did not receive HSTS header
 kode-it.de: could not connect to host
@@ -4911,17 +4925,16 @@ lagier.xyz: could not connect to host
 lagoza.name: could not connect to host
 lainchan.org: did not receive HSTS header
 laisashop.com.br: could not connect to host
 lamaland.ru: did not receive HSTS header
 lambda-complex.org: could not connect to host
 lambdafive.co.uk: could not connect to host
 lamomebijou.paris: did not receive HSTS header
 lampl.info: did not receive HSTS header
-lana.swedbank.se: did not receive HSTS header
 lanauzedesigns.com: did not receive HSTS header
 lanboll.com: could not connect to host
 lancehoteis.com: did not receive HSTS header
 lancehoteis.com.br: did not receive HSTS header
 land-links.org: did not receive HSTS header
 landgoedverkopen.nl: could not connect to host
 landhuisverkopen.nl: could not connect to host
 landscape.canonical.com: max-age too low: 2592000
@@ -5235,17 +5248,17 @@ mafamane.com: could not connect to host
 mafiareturns.com: max-age too low: 2592000
 magenx.com: did not receive HSTS header
 magia360.com: did not receive HSTS header
 magneticanvil.com: did not receive HSTS header
 mahamed91.pw: could not connect to host
 mahfouzadedimeji.com: did not receive HSTS header
 mail-settings.google.com: did not receive HSTS header (error ignored - included regardless)
 mail.google.com: did not receive HSTS header (error ignored - included regardless)
-mail.yahoo.com: max-age too low: 60
+mail.yahoo.com: max-age too low: 300
 mailchuck.com: could not connect to host
 maildragon.com: could not connect to host
 mailgarant.nl: could not connect to host
 mailhost.it: could not connect to host
 mailing-femprendedores.com: did not receive HSTS header
 mailing-jbgg.com: did not receive HSTS header
 main-street-seo.com: did not receive HSTS header
 mainlywrenches.co: max-age too low: 0
@@ -5292,17 +5305,16 @@ manifestbin.com: did not receive HSTS he
 manitasicily.com: did not receive HSTS header
 manningbrothers.com: did not receive HSTS header
 manshop24.com: could not connect to host
 mansion-note.com: did not receive HSTS header
 manududu.com.br: did not receive HSTS header
 maomaofuli.vip: could not connect to host
 marcelparra.com: could not connect to host
 marchagen.nl: did not receive HSTS header
-marco-polo-reisen.com: did not receive HSTS header
 marco01809.net: could not connect to host
 marcoececilia.it: did not receive HSTS header
 marcofinke.de: could not connect to host
 marcontrol.com: did not receive HSTS header
 marcosteixeira.tk: could not connect to host
 marcschlagenhauf.de: could not connect to host
 marcus-scheffler.com: did not receive HSTS header
 marcush.de: could not connect to host
@@ -5325,17 +5337,17 @@ markrobin.de: did not receive HSTS heade
 marksill.com: could not connect to host
 marktboten.de: did not receive HSTS header
 marktissink.nl: did not receive HSTS header
 markus-dev.com: did not receive HSTS header
 markusweimar.de: did not receive HSTS header
 marleyresort.com: did not receive HSTS header
 marriottvetcareers.com: could not connect to host
 marshut.net: could not connect to host
-martensson.io: could not connect to host
+martensson.io: did not receive HSTS header
 martialc.be: could not connect to host
 martiert.com: could not connect to host
 martijnvhoof.nl: could not connect to host
 martinec.co.uk: could not connect to host
 martinestyle.com: could not connect to host
 martineve.com: did not receive HSTS header
 martinp.no: could not connect to host
 martins.im: could not connect to host
@@ -5521,16 +5533,17 @@ mightydicks.tech: could not connect to h
 mightysounds.cz: max-age too low: 0
 migrator.co: could not connect to host
 miguksaram.com: could not connect to host
 mijcorijneveld.nl: did not receive HSTS header
 mijn-email.org: could not connect to host
 mijnetickets.nl: did not receive HSTS header
 mijnkredietpaspoort.nl: could not connect to host
 mijnsite.ovh: did not receive HSTS header
+mijnstembureau.nl: did not receive HSTS header
 mikadesign.se: did not receive HSTS header
 mikaelemilsson.net: did not receive HSTS header
 mikeburns.com: could not connect to host
 mikeg.de: did not receive HSTS header
 mikeology.org: could not connect to host
 mikepair.net: could not connect to host
 mikeybot.com: could not connect to host
 mikii.club: could not connect to host
@@ -5628,17 +5641,17 @@ modydev.club: could not connect to host
 moe4sale.in: did not receive HSTS header
 moebel-nagel.de: did not receive HSTS header
 moegirl.org: did not receive HSTS header
 moellers.it: could not connect to host
 moelord.org: could not connect to host
 moen.io: did not receive HSTS header
 mogry.net: could not connect to host
 moho.kr: could not connect to host
-mohs.es: did not receive HSTS header
+mohs.es: could not connect to host
 moitur.com: could not connect to host
 mokhtarmial.com: did not receive HSTS header
 mols.me: could not connect to host
 molun.net: did not receive HSTS header
 mommel.com: could not connect to host
 mommelonline.de: could not connect to host
 momoka.moe: could not connect to host
 mon-a-lisa.com: did not receive HSTS header
@@ -5733,16 +5746,17 @@ musicalbim.com.br: did not receive HSTS 
 musikkfondene.no: did not receive HSTS header
 mustardking.me: did not receive HSTS header
 mustika.cf: could not connect to host
 mutamatic.com: could not connect to host
 mutuelle-obligatoire-pme.fr: did not receive HSTS header
 muzgra.in: did not receive HSTS header
 muzykaprzeszladoplay.pl: could not connect to host
 mvanmarketing.nl: did not receive HSTS header
+mvnet.com.br: did not receive HSTS header
 mvsecurity.nl: could not connect to host
 mwohlfarth.de: did not receive HSTS header
 my-owncloud.com: could not connect to host
 my-voice.nl: did not receive HSTS header
 my.alfresco.com: did not receive HSTS header
 my.swedbank.se: did not receive HSTS header
 myairshop.gr: could not connect to host
 myandroid.tools: could not connect to host
@@ -5820,16 +5834,17 @@ nan.zone: could not connect to host
 nandex.org: could not connect to host
 naniki.co.uk: did not receive HSTS header
 nanogeneinc.com: could not connect to host
 nanokamo.com: did not receive HSTS header
 nanrenba.net: could not connect to host
 nansay.cn: could not connect to host
 nanto.eu: could not connect to host
 narodniki.com: did not receive HSTS header
+narviz.com: did not receive HSTS header
 nashira.cz: did not receive HSTS header
 nasralmabrooka.com: did not receive HSTS header
 natalia-fadeeva.ru: could not connect to host
 natalia.io: could not connect to host
 natalieandjoshua.com: could not connect to host
 natalt.org: did not receive HSTS header
 nathanmfarrugia.com: did not receive HSTS header
 nationwidevehiclecontracts.co.uk: did not receive HSTS header
@@ -6069,16 +6084,17 @@ occentus.net: did not receive HSTS heade
 ochaken.cf: could not connect to host
 ocrami.us: did not receive HSTS header
 octocat.ninja: could not connect to host
 oddmouse.com: could not connect to host
 odin.xxx: could not connect to host
 odinoffice.no: did not receive HSTS header
 odysseyandco.com: could not connect to host
 oe8.bet: could not connect to host
+oestepaulista.net: did not receive HSTS header
 ofcourselanguages.com: could not connect to host
 offenedialoge.de: max-age too low: 2592000
 officeclub.com.mx: did not receive HSTS header
 offshore-firma.org: could not connect to host
 offshore-unternehmen.com: could not connect to host
 offshorefirma-gruenden.com: could not connect to host
 offshoremarineparts.com: did not receive HSTS header
 oficinadocelular.com.br: could not connect to host
@@ -6128,25 +6144,24 @@ onespiritinc.com: did not receive HSTS h
 onet.space: could not connect to host
 onetwentyseven001.com: did not receive HSTS header
 onewpst.com: did not receive HSTS header
 oniichan.us: did not receive HSTS header
 onioncloud.org: could not connect to host
 onionsburg.com: could not connect to host
 online-casino.eu: did not receive HSTS header
 online-wetten.de: did not receive HSTS header
-online.swedbank.se: did not receive HSTS header
 onlinebiller.com: did not receive HSTS header
 onlinecompliance.org: did not receive HSTS header
 onlinedemo.hu: could not connect to host
 onlinedeposit.us: could not connect to host
 onlinekasino.de: did not receive HSTS header
 onlinepollsph.com: could not connect to host
 onlineschadestaat.nl: did not receive HSTS header
-onlinespielothek.com: did not receive HSTS header
+onlinespielothek.com: could not connect to host
 onlinewetten.de: could not connect to host
 only-roses.co.uk: did not receive HSTS header
 only-roses.com: did not receive HSTS header
 onlyshopstation.com: did not receive HSTS header
 onlyzero.net: could not connect to host
 onmuvo.com: did not receive HSTS header
 onovlena.dn.ua: could not connect to host
 onpatient.com: did not receive HSTS header
@@ -6328,17 +6343,16 @@ paulbunyanmls.com: did not receive HSTS 
 paulproell.at: could not connect to host
 paulyang.cn: did not receive HSTS header
 pavelfojt.cz: did not receive HSTS header
 paxdei.com.br: could not connect to host
 paxwinkel.nl: did not receive HSTS header
 pay.gigahost.dk: did not receive HSTS header
 paybro.eu: did not receive HSTS header
 payfreez.com: could not connect to host
-payloc.io: did not receive HSTS header
 payments-reference.org: could not connect to host
 payments.google.com: did not receive HSTS header (error ignored - included regardless)
 payroll.ch: could not connect to host
 paytwopay.com: could not connect to host
 pbapp.net: did not receive HSTS header
 pbbr.com: did not receive HSTS header
 pbprint.ru: did not receive HSTS header
 pc-nf.de: did not receive HSTS header
@@ -6388,17 +6402,16 @@ personalcommunicationsecurity.com: could
 personaldatabasen.no: could not connect to host
 personalinjurylist.com: did not receive HSTS header
 personalizedtouch.co: could not connect to host
 perthdevicelab.com: did not receive HSTS header
 pestalozzishop.com.br: could not connect to host
 pet-nsk.ru: could not connect to host
 petchart.net: could not connect to host
 peterkshultz.com: did not receive HSTS header
-peterlew.is: did not receive HSTS header
 petersmark.com: did not receive HSTS header
 pethub.com: did not receive HSTS header
 petit.site: could not connect to host
 petplum.com: could not connect to host
 petravdbos.nl: did not receive HSTS header
 petrkrapek.cz: did not receive HSTS header
 petrolplus.ru: max-age too low: 7776000
 petrovsky.pro: could not connect to host
@@ -6440,17 +6453,16 @@ pidatacenters.com: did not receive HSTS 
 pidomex.com: did not receive HSTS header
 pieterjangeeroms.me: could not connect to host
 piggott.me.uk: did not receive HSTS header
 pilgermaske.org: did not receive HSTS header
 piligrimname.com: could not connect to host
 pillowandpepper.com: did not receive HSTS header
 pimpmymac.ru: did not receive HSTS header
 pims.global: did not receive HSTS header
-pin.net.au: did not receive HSTS header
 pinkyf.com: could not connect to host
 pinpayments.com: did not receive HSTS header
 pippen.io: could not connect to host
 pirata.ga: could not connect to host
 piratebit.tech: could not connect to host
 piratedb.com: could not connect to host
 piratedot.com: could not connect to host
 piratelist.online: could not connect to host
@@ -6889,17 +6901,17 @@ res-rheingau.de: did not receive HSTS he
 res42.com: could not connect to host
 reserve-online.net: did not receive HSTS header
 residentsinsurance.co.uk: did not receive HSTS header
 resl20.servehttp.com: could not connect to host
 respice.xyz: could not connect to host
 respostas.com.br: did not receive HSTS header
 restaurace-klokocka.cz: did not receive HSTS header
 restchart.com: did not receive HSTS header
-restioson.me: did not receive HSTS header
+restioson.me: could not connect to host
 restrealitaet.de: did not receive HSTS header
 returnofwar.com: could not connect to host
 revapost.ch: could not connect to host
 revealdata.com: did not receive HSTS header
 revelaciones.tv: could not connect to host
 revello.org: did not receive HSTS header
 reverie.pw: could not connect to host
 review.info: did not receive HSTS header
@@ -6995,32 +7007,34 @@ rough.nu: could not connect to host
 roundtheme.com: did not receive HSTS header
 rous.se: could not connect to host
 rouvray.org: could not connect to host
 royal-forest.org: max-age too low: 0
 royalhop.co: could not connect to host
 royalpub.net: did not receive HSTS header
 royalsignaturecruise.com: could not connect to host
 roychan.org: max-age too low: 0
+rozalynne-dawn.ga: did not receive HSTS header
 rozeapp.nl: could not connect to host
 rr.in.th: could not connect to host
 rrke.cc: did not receive HSTS header
 rsajeey.info: could not connect to host
 rsampaio.info: did not receive HSTS header
 rsblake.net: could not connect to host
 rsf.io: could not connect to host
 rsmaps.org: could not connect to host
 rubbereggs.ca: could not connect to host
 rubecodeberg.com: could not connect to host
 rubenschulz.nl: could not connect to host
 rubi-ka.net: max-age too low: 0
 ruborr.se: did not receive HSTS header
 rubysecurity.org: did not receive HSTS header
 rubyshop.nl: max-age too low: 604800
 rudeotter.com: did not receive HSTS header
+rue-de-la-vieille.fr: max-age too low: 0
 rugirlfriend.com: could not connect to host
 rugs.ca: did not receive HSTS header
 ruig.jp: could not connect to host
 ruiming.me: did not receive HSTS header
 ruitershoponline.nl: did not receive HSTS header
 rumoterra.com.br: could not connect to host
 runawebinar.nl: could not connect to host
 runhardt.eu: did not receive HSTS header
@@ -7051,16 +7065,17 @@ safematix.com: could not connect to host
 safemovescheme.co.uk: could not connect to host
 safersurfing.eu: did not receive HSTS header
 safewings-nh.nl: could not connect to host
 sagarhandicraft.com: could not connect to host
 sageth.com: max-age too low: 0
 sah3.net: could not connect to host
 saharalondon.com: max-age too low: 0
 saharmassachi.com: could not connect to host
+saifoundation.in: did not receive HSTS header
 sail-nyc.com: did not receive HSTS header
 saint-astier-triathlon.com: did not receive HSTS header
 saintjohnlutheran.church: did not receive HSTS header
 sairai.bid: did not receive HSTS header
 sakaki.anime.my: max-age too low: 5184000
 sakaserver.com: did not receive HSTS header
 sakib.ninja: did not receive HSTS header
 sakurabuff.com: could not connect to host
@@ -7366,16 +7381,17 @@ silentcircle.com: did not receive HSTS h
 silentcircle.org: could not connect to host
 silentlink.io: could not connect to host
 silentundo.org: did not receive HSTS header
 silicagelpackets.ca: did not receive HSTS header
 silver-drachenkrieger.de: did not receive HSTS header
 silverhome.ninja: could not connect to host
 silverpvp.com: could not connect to host
 simbast.com: could not connect to host
+simbeton.nl: did not receive HSTS header
 simbihaiti.com: did not receive HSTS header
 simccorp.com: did not receive HSTS header
 simeon.us: max-age too low: 2592000
 simfri.com: did not receive HSTS header
 simnovo.net: did not receive HSTS header
 simobilklub.si: could not connect to host
 simod.org: could not connect to host
 simon-pokorny.com: did not receive HSTS header
@@ -7443,29 +7459,28 @@ slightfuture.com: did not receive HSTS h
 slix.io: could not connect to host
 slope.haus: could not connect to host
 slovakiana.sk: did not receive HSTS header
 sluplift.com: did not receive HSTS header
 slycurity.de: did not receive HSTS header
 smablo.com: did not receive HSTS header
 smallcdn.rocks: could not connect to host
 smallshopit.com: did not receive HSTS header
-smares.de: could not connect to host
+smares.de: did not receive HSTS header
 smart-mirror.de: did not receive HSTS header
 smart-ov.nl: could not connect to host
 smartbuyelectric.com: could not connect to host
 smartcleaningcenter.nl: did not receive HSTS header
 smartcoin.com.br: could not connect to host
 smarterskies.gov: did not receive HSTS header
 smartfon4you.ru: max-age too low: 0
 smarthomedna.com: did not receive HSTS header
 smartofficesandsmarthomes.com: did not receive HSTS header
 smartphone.continental.com: could not connect to host
 smartrak.co.nz: did not receive HSTS header
-smartwurk.nl: did not receive HSTS header
 smdev.fr: could not connect to host
 smet.us: could not connect to host
 smexpt.com: did not receive HSTS header
 smimea.com: could not connect to host
 smirkingwhorefromhighgarden.pro: could not connect to host
 smittix.co.uk: did not receive HSTS header
 smkn1lengkong.sch.id: did not receive HSTS header
 smksi2.com: could not connect to host
@@ -7529,17 +7544,17 @@ soucorneteiro.com.br: could not connect 
 soulfulglamour.uk: could not connect to host
 soundforsound.co.uk: did not receive HSTS header
 sourcelair.com: did not receive HSTS header
 southcoastswords.com: did not receive HSTS header
 southernjamusa.com: did not receive HSTS header
 southgale.condos: could not connect to host
 southside-crew.club: could not connect to host
 southworcestershiregpservices.co.uk: could not connect to host
-souvik.me: could not connect to host
+souvik.me: did not receive HSTS header
 souyar.de: could not connect to host
 souyar.net: could not connect to host
 souyar.us: could not connect to host
 sovereignshare.com: could not connect to host
 sown.dyndns.org: could not connect to host
 spacedust.xyz: could not connect to host
 spacefish.biz: could not connect to host
 spacehq.org: could not connect to host
@@ -7624,16 +7639,17 @@ standardssuck.org: did not receive HSTS 
 standingmist.com: did not receive HSTS header
 stannahtrapliften.nl: did not receive HSTS header
 starandshield.com: did not receive HSTS header
 starapple.nl: did not receive HSTS header
 starfeeling.net: could not connect to host
 stargatepartners.com: did not receive HSTS header
 starmusic.ga: did not receive HSTS header
 startuponcloud.com: max-age too low: 2678400
+startuppeople.co.uk: did not receive HSTS header
 stash.ai: did not receive HSTS header
 state-sponsored-actors.net: could not connect to host
 statementinsertsforless.com: did not receive HSTS header
 stateofexception.io: could not connect to host
 static.or.at: did not receive HSTS header
 staticanime.net: could not connect to host
 stationaryjourney.com: did not receive HSTS header
 stationcharlie.com: did not receive HSTS header
@@ -7668,16 +7684,17 @@ stn.me.uk: did not receive HSTS header
 stockseyeserum.com: could not connect to host
 stocktrade.de: could not connect to host
 stoffe-monster.de: did not receive HSTS header
 stoick.me: could not connect to host
 stole-my.bike: could not connect to host
 stole-my.tv: could not connect to host
 stolkschepen.nl: did not receive HSTS header
 stonecutterscommunity.com: could not connect to host
+stopbreakupnow.org: did not receive HSTS header
 stopwoodfin.org: could not connect to host
 storbritannien.guide: could not connect to host
 storecove.com: did not receive HSTS header
 storeden.com: did not receive HSTS header
 storefrontify.com: did not receive HSTS header
 storiesofhealth.org: could not connect to host
 storillo.com: did not receive HSTS header
 stormhub.org: could not connect to host
@@ -7711,16 +7728,17 @@ stugb.de: did not receive HSTS header
 sturbock.me: did not receive HSTS header
 sturdio.com.br: could not connect to host
 stylenda.com: could not connect to host
 stytt.com: could not connect to host
 subbing.work: could not connect to host
 subdimension.org: could not connect to host
 subeesu.com: could not connect to host
 subhacker.net: did not receive HSTS header
+sublevel.net: did not receive HSTS header
 subsys.no: did not receive HSTS header
 subtitle.rip: could not connect to host
 subwayz.de: did not receive HSTS header
 sudo.li: did not receive HSTS header
 sudokian.io: did not receive HSTS header
 sugarcitycon.com: could not connect to host
 sugarsweetorsour.com: did not receive HSTS header
 suian.or.jp: max-age too low: 86400
@@ -7836,17 +7854,17 @@ tandarts-haarlem.nl: did not receive HST
 tangel.me: could not connect to host
 tangibilizing.com: could not connect to host
 taniesianie.pl: did not receive HSTS header
 tankfreunde.de: did not receive HSTS header
 tante-bugil.net: could not connect to host
 tantotiempo.de: did not receive HSTS header
 tanze-jetzt.de: could not connect to host
 taotuba.net: did not receive HSTS header
-taozj.org: did not receive HSTS header
+taozj.org: could not connect to host
 tapfinder.ca: could not connect to host
 tapka.cz: did not receive HSTS header
 tappublisher.com: did not receive HSTS header
 taravancil.com: did not receive HSTS header
 targaryen.house: could not connect to host
 tarhauskielto.fi: did not receive HSTS header
 tartaros.fi: could not connect to host
 taskstats.com: could not connect to host
@@ -8070,17 +8088,17 @@ thorncreek.net: did not receive HSTS hea
 thriveapproach.co.uk: did not receive HSTS header
 thrivewellnesshub.co.za: did not receive HSTS header
 throughthelookingglasslens.co.uk: could not connect to host
 thumbtack.com: did not receive HSTS header
 thundercampaign.com: could not connect to host
 ti.blog.br: could not connect to host
 tianxing.pro: did not receive HSTS header
 tianxingvpn.pro: could not connect to host
-tibbitshall.ca: did not receive HSTS header
+tibbitshall.ca: could not connect to host
 tickopa.co.uk: could not connect to host
 tickreport.com: did not receive HSTS header
 ticktock.today: did not receive HSTS header
 tictactux.de: could not connect to host
 tidmore.us: could not connect to host
 tiendschuurstraat.nl: could not connect to host
 tiensnet.com: could not connect to host
 tierrarp.com: could not connect to host
@@ -8107,16 +8125,18 @@ timeserver3.de: could not connect to hos
 timestamp.io: did not receive HSTS header
 timhjalpen.se: could not connect to host
 timnash.co.uk: did not receive HSTS header
 timotrans.de: did not receive HSTS header
 timotrans.eu: did not receive HSTS header
 timowi.de: could not connect to host
 timowi.net: could not connect to host
 timschubert.net: max-age too low: 172800
+timtj.ca: did not receive HSTS header
+timweb.ca: did not receive HSTS header
 timwittenberg.com: could not connect to host
 tinchbear.xyz: could not connect to host
 tindewen.net: could not connect to host
 tipsyk.ru: could not connect to host
 tiredofeating.com: could not connect to host
 tiremoni.ch: did not receive HSTS header
 tirex.media: did not receive HSTS header
 titanlab.de: could not connect to host
@@ -8203,17 +8223,17 @@ totalworkout.fitness: did not receive HS
 totem-eshop.cz: could not connect to host
 toucedo.de: could not connect to host
 touchbasemail.com: did not receive HSTS header
 touchpointidg.us: could not connect to host
 touchscreen-handy.de: did not receive HSTS header
 touchstonefms.co.uk: did not receive HSTS header
 touchtable.nl: did not receive HSTS header
 tourpeer.com: did not receive HSTS header
-toutenmusic.fr: did not receive HSTS header
+townofbridgewater.ca: did not receive HSTS header
 toxme.se: could not connect to host
 toyotamotala.se: could not connect to host
 tpbcdn.com: could not connect to host
 tpe-edu.com: could not connect to host
 tpms4u.at: did not receive HSTS header
 tracker-gps.ch: could not connect to host
 tracktivity.com.au: did not receive HSTS header
 trade-smart.ru: could not connect to host
@@ -8314,23 +8334,22 @@ twee-onder-een-kap-woning-in-leeuwarden-
 twee-onder-een-kap-woning-in-pekela-kopen.nl: could not connect to host
 twee-onder-een-kap-woning-in-rijnwaarden-kopen.nl: could not connect to host
 twee-onder-een-kap-woning-in-sudwest-fryslan-kopen.nl: could not connect to host
 twee-onder-een-kap-woning-in-veendam-kopen.nl: could not connect to host
 twee-onder-een-kap-woning-in-zuidplas-kopen.nl: could not connect to host
 twee-onder-een-kap-woning-in-zwartewaterland-kopen.nl: could not connect to host
 tweeondereenkapverkopen.nl: could not connect to host
 tweeondereenkapwoningverkopen.nl: could not connect to host
-tweetfreq.net: did not receive HSTS header
 tweetify.io: could not connect to host
 twillionmas.com: could not connect to host
 twinkseason.ca: could not connect to host
 twinkseason.co: could not connect to host
 twinkseason.co.uk: could not connect to host
-twinkseason.com: could not connect to host
+twinkseason.com: did not receive HSTS header
 twinkseason.net: could not connect to host
 twinkseason.org: could not connect to host
 twinkseason.xyz: could not connect to host
 twist.party: could not connect to host
 twogo.com: did not receive HSTS header
 twolinepassbrewing.com: could not connect to host
 twolivelife.com: could not connect to host
 tx041cap.org: did not receive HSTS header
@@ -8477,16 +8496,17 @@ utumno.ch: did not receive HSTS header
 utvbloggen.se: did not receive HSTS header
 uvarov.pw: did not receive HSTS header
 uwstartups.com: could not connect to host
 uxux.pl: could not connect to host
 uyym.com: could not connect to host
 uzmandroid.com: did not receive HSTS header
 uzmandroid.net: could not connect to host
 uzmandroid.top: could not connect to host
+v-desk.ga: did not receive HSTS header
 v0rtex.xyz: could not connect to host
 v0tti.com: could not connect to host
 v2.pw: did not receive HSTS header
 v2ex.us: did not receive HSTS header
 v4s.ro: did not receive HSTS header
 v4veedu.com: could not connect to host
 v7.cl: could not connect to host
 v789xl.com: did not receive HSTS header
@@ -8515,17 +8535,16 @@ vanderkley.it: could not connect to host
 vanestack.com: could not connect to host
 vanetv.com: could not connect to host
 vanitas.xyz: could not connect to host
 vanitynailworkz.com: could not connect to host
 vansieleghem.com: could not connect to host
 vapordepot.jp: did not receive HSTS header
 vasa-webstranka.sk: did not receive HSTS header
 vasanth.org: could not connect to host
-vasports.com.au: did not receive HSTS header
 vbest.net: could not connect to host
 vbhelp.org: could not connect to host
 vbulletin-russia.com: could not connect to host
 vbulletinrussia.com: could not connect to host
 vcdove.com: could not connect to host
 vcr.re: could not connect to host
 vdhco.be: did not receive HSTS header
 veblen.com: did not receive HSTS header
@@ -8643,16 +8662,17 @@ vpip.net: could not connect to host
 vpl.me: did not receive HSTS header
 vpn-byen.dk: did not receive HSTS header
 vpn.black: could not connect to host
 vpn.pics: did not receive HSTS header
 vpnhot.com: could not connect to host
 vps-szerver-berles.hu: could not connect to host
 vpsmojo.com: could not connect to host
 vratny.space: could not connect to host
+vriendenvoordeel.com: did not receive HSTS header
 vrijstaandhuis-in-alphen-aan-den-rijn-kopen.nl: could not connect to host
 vrijstaandhuis-in-brielle-kopen.nl: could not connect to host
 vrijstaandhuis-in-delfzijl-kopen.nl: could not connect to host
 vrijstaandhuis-in-friesland-kopen.nl: could not connect to host
 vrijstaandhuis-in-laren-kopen.nl: could not connect to host
 vrijstaandhuis-in-leeuwarden-kopen.nl: could not connect to host
 vrijstaandhuis-in-veendam-kopen.nl: could not connect to host
 vrijstaandhuis-in-zeeland-kopen.nl: could not connect to host
@@ -8704,18 +8724,19 @@ warped.com: did not receive HSTS header
 warrencreative.com: did not receive HSTS header
 warsentech.com: could not connect to host
 warsh.moe: did not receive HSTS header
 watchium.com: did not receive HSTS header
 waterforlife.net.au: did not receive HSTS header
 waterpoint.com.br: could not connect to host
 watersportmarkt.net: did not receive HSTS header
 watsonhall.uk: could not connect to host
+wattechweb.com: did not receive HSTS header
 wave.is: could not connect to host
-wavefloatrooms.com: could not connect to host
+wavefloatrooms.com: did not receive HSTS header
 wavefrontsystemstech.com: could not connect to host
 we-bb.com: could not connect to host
 wear2work.nl: did not receive HSTS header
 wearesouthafricans.com: did not receive HSTS header
 weaverhairextensions.nl: could not connect to host
 web-industry.fr: could not connect to host
 web-insider.net: could not connect to host
 web-redacteuren.nl: max-age too low: 0
@@ -8789,17 +8810,17 @@ wettbuero.de: did not receive HSTS heade
 wetten.eu: did not receive HSTS header
 wettertoertchen.com: could not connect to host
 wetttipps.com: could not connect to host
 wetttipps.de: could not connect to host
 wevahoo.com: could not connect to host
 wevolver.com: did not receive HSTS header
 wewillgo.com: did not receive HSTS header
 wewillgo.org: did not receive HSTS header
-wewlad.me: did not receive HSTS header
+wewlad.me: could not connect to host
 wftda.com: did not receive HSTS header
 wg3k.us: did not receive HSTS header
 whatnext.limited: did not receive HSTS header
 whats.io: could not connect to host
 whatsstalk.me: could not connect to host
 whatsyouroffer.co.uk: did not receive HSTS header
 wheresben.today: could not connect to host
 whisker.network: could not connect to host
--- a/security/manager/ssl/nsSTSPreloadList.inc
+++ b/security/manager/ssl/nsSTSPreloadList.inc
@@ -3,17 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 /*****************************************************************************/
 /* This is an automatically generated file. If you're not                    */
 /* nsSiteSecurityService.cpp, you shouldn't be #including it.     */
 /*****************************************************************************/
 
 #include <stdint.h>
-const PRTime gPreloadListExpirationTime = INT64_C(1520969963113000);
+const PRTime gPreloadListExpirationTime = INT64_C(1521056747051000);
 %%
 0-1.party, 1
 0.me.uk, 1
 00001.am, 1
 00002.am, 1
 0005pay.com, 1
 0010100.net, 1
 00220022.net, 1
@@ -214,16 +214,17 @@ 247healthshop.com, 1
 247medplan.com, 1
 2488.ch, 1
 24hrs.shopping, 1
 24ip.com, 1
 24ip.de, 1
 24ip.fr, 1
 24kbet.com, 1
 256k.me, 1
+256pages.com, 1
 25reinyan25.net, 1
 2600edinburgh.org, 1
 2600hq.com, 1
 263.info, 1
 27728522.com, 1
 281180.de, 1
 28spots.net, 1
 29227.com, 1
@@ -276,16 +277,17 @@ 365healthworld.com, 1
 365maya.com, 1
 365skulls.com, 1
 3778vip.com, 1
 379700.com, 1
 38888msc.com, 1
 38blog.com, 1
 393335.ml, 1
 398.info, 1
+3ags.de, 1
 3bakayottu.com, 1
 3bigking.com, 1
 3c-d.de, 1
 3chat.org, 1
 3circlefunding.ch, 1
 3countiescastlehire.co.uk, 1
 3cs.ch, 1
 3dm.audio, 1
@@ -361,16 +363,17 @@ 4winds.pt, 1
 4x.fi, 1
 4x4.lk, 1
 4xlabs.co, 1
 500k.nl, 1
 500p.xyz, 1
 50lakeshore.com, 1
 50north.de, 1
 50plusnet.nl, 1
+513vpn.net, 1
 525.info, 1
 52neptune.com, 1
 5432.cc, 1
 54below.com, 1
 5533445.com, 1
 555fl.com, 1
 555xl.com, 1
 55scc.com, 1
@@ -931,16 +934,17 @@ afrodigital.uk, 1
 after.digital, 1
 afterhate.fr, 1
 afterstack.net, 1
 afuh.de, 1
 afva.net, 1
 ag-websolutions.de, 1
 agalliasis.ch, 1
 agamsecurity.ch, 1
+agate.pw, 1
 ageg.ca, 1
 agenciadeempregosdourados.com.br, 1
 agenciafiscal.pe, 1
 agencymanager.be, 1
 agenda-loto.net, 0
 agenda21senden.de, 1
 agent-grow.com, 1
 agent6.com.au, 1
@@ -1343,16 +1347,17 @@ alspolska.pl, 1
 alstroemeria.org, 1
 alt-three.com, 1
 alt.org, 1
 altahrim.net, 1
 altaide.com, 1
 altbinaries.com, 1
 altedirect.com, 1
 alter-news.fr, 1
+alterbaum.net, 1
 altercpa.ru, 1
 alternador.com.br, 1
 alternative.bike, 1
 alternativebit.fr, 1
 alternativedev.ca, 1
 alternativet.party, 1
 alterspalter.de, 1
 altesses.eu, 1
@@ -2425,28 +2430,31 @@ averam.net, 1
 averen.co.uk, 1
 avg.club, 1
 avi9526.pp.ua, 1
 aviationstrategy.aero, 1
 avid.blue, 1
 avidcruiser.com, 1
 aviv.nyc, 1
 avmemo.com, 1
+avmo.pw, 1
 avmoo.com, 1
 avnet.ws, 1
 avotoma.com, 1
 avpres.net, 1
+avso.pw, 1
 avsox.com, 1
 avspot.net, 1
 avticket.ru, 1
 avtoforex.ru, 1
 avtogara-isperih.com, 1
 avtosept.by, 1
 avtovokzaly.ru, 1
 avvcorda.com, 1
+avxo.pw, 1
 awan.tech, 1
 awaremi-tai.com, 1
 awaro.net, 1
 awbouncycastlehire.com, 1
 awccanadianpharmacy.com, 1
 awei.pub, 1
 awen.me, 1
 awesomebouncycastles.co.uk, 1
@@ -3089,16 +3097,17 @@ bestessaycheap.com, 1
 bestessayhelp.com, 1
 bestfitnesswatchreview.info, 1
 bestgiftever.ca, 1
 bestgifts4you.com, 1
 besthotsales.com, 1
 bestlashesandbrows.com, 1
 bestlashesandbrows.hu, 1
 bestleftwild.com, 1
+bestmodels.su, 1
 bestmotherfucking.website, 1
 bestoliveoils.com, 1
 bestpartyhire.com, 1
 bestperfumebrands.com, 1
 bestschools.top, 1
 bestseries.tv, 1
 bestwarezone.com, 1
 bestwebsite.gallery, 1
@@ -3353,17 +3362,16 @@ birdymanbestreviews.com, 1
 birgit-rydlewski.de, 1
 birkengarten.ch, 1
 birkhoff.me, 1
 birminghamcastlehire.co.uk, 1
 birminghamsunset.com, 1
 birthdaytip.com, 1
 birthmatters.us, 1
 birzan.org, 1
-biscoint.io, 1
 biscuits-rec.com, 1
 biscuits-shop.com, 1
 bismarck-tb.de, 1
 bison.co, 1
 bissalama.org, 1
 bistrocean.com, 1
 biswas.me, 1
 bit-cloud.de, 1
@@ -3827,16 +3835,17 @@ botserver.de, 1
 bottaerisposta.net, 1
 bottineauneighborhood.org, 1
 bottke.berlin, 1
 bou.lt, 1
 bouah.net, 1
 bouchard-mathieux.com, 1
 bouchonville-knifemaker.com, 1
 bouckaert-usedcars.be, 1
+boudah.pl, 1
 boueki.jp, 1
 boueki.org, 1
 bougeret.fr, 1
 boukoubengo.com, 1
 bounce-a-mania.co.uk, 1
 bounce-a-roo.co.uk, 1
 bounce-abouts.com, 1
 bounce-n-go.co.uk, 1
@@ -4200,17 +4209,16 @@ bruckner.li, 1
 bruna-cdn.nl, 1
 brunn.email, 1
 brunner.ninja, 1
 brunoramos.com, 1
 brunoramos.org, 1
 brunosouza.org, 1
 bruun.co, 1
 bryankaplan.com, 1
-bryanquigley.com, 1
 bs-network.net, 1
 bs-security.com, 1
 bs.sb, 1
 bs.to, 1
 bs12v.ru, 1
 bsalyzer.com, 1
 bsc-rietz.at, 1
 bsc01.dyndns.org, 1
@@ -4232,16 +4240,17 @@ bsw-solution.de, 1
 bt123.xyz, 1
 bta.lv, 0
 btcarmory.com, 1
 btcgo.nl, 1
 btcontract.com, 1
 btcpop.co, 1
 btcpot.ltd, 1
 btcycle.org, 1
+btio.pw, 1
 btku.org, 1
 btnissanparts.com, 1
 btorrent.xyz, 1
 btrb.ml, 1
 btserv.de, 1
 btsoft.eu, 1
 btsow.com, 1
 btth.pl, 1
@@ -4517,17 +4526,17 @@ caferagazzi.de, 1
 cafesg.net, 1
 caffeinatedcode.com, 1
 cainhosting.com, 0
 caipai.fm, 1
 cairnterrier.com.br, 1
 cais.de, 1
 caitcs.com, 1
 caja-pdf.es, 1
-cajio.ru, 0
+cajio.ru, 1
 cajunuk.co.uk, 1
 cake-time.co.uk, 1
 cakestart.net, 1
 caketoindia.com, 1
 cakingandbaking.com, 1
 cal.goip.de, 1
 calaad.net, 1
 calabasaselectrical.com, 1
@@ -5349,17 +5358,16 @@ christopherburg.com, 1
 christopherl.com, 1
 christopherpritchard.co.uk, 1
 christophersole.com, 1
 christophertruncer.com, 1
 christophkreileder.com, 1
 christophsackl.de, 1
 chrisu3050.at, 1
 chrisupjohn.xyz, 1
-chriswarrick.com, 1
 chriswbarry.com, 1
 chriswells.io, 1
 chromaryu.net, 0
 chromaxa.com, 1
 chrome-devtools-frontend.appspot.com, 1
 chrome.com, 0
 chrome.google.com, 1
 chromebookchart.com, 1
@@ -5373,17 +5381,16 @@ chronology.no, 1
 chronoproject.com, 1
 chronoshop.cz, 1
 chrpaul.de, 1
 chrstn.eu, 1
 chsh.moe, 1
 chsterz.de, 1
 chua.family, 1
 chuchote-moi.fr, 1
-chuck.ovh, 1
 chuckame.fr, 1
 chun.pro, 1
 chunche.net, 1
 chunk.science, 1
 chupadelfrasco.com, 1
 churchlinkpro.com, 1
 churchthemes.com, 1
 churchwebcanada.ca, 1
@@ -5872,17 +5879,16 @@ colo-tech.com, 1
 colombian.dating, 1
 coloppe.com, 1
 coloradolottery.com, 1
 coloraid.net, 1
 colorblindprogramming.com, 1
 colorbrush.ru, 1
 colorcentertoner.com.br, 1
 colorcodedlyrics.com, 1
-colorectalcompounding.com, 1
 coloringnotebook.com, 1
 coloristcafe.com, 1
 colorsbycarin.com, 1
 colossal-events.co.uk, 1
 colourfulcastles.co.uk, 1
 colson-occasions.be, 1
 columbuswines.com, 1
 colyakootees.com, 1
@@ -5898,17 +5904,16 @@ comdurav.com, 1
 comefollowme2016.com, 1
 comeoncolleen.com, 1
 comercialtrading.eu, 1
 comerford.net, 1
 comeseetv.com, 1
 comestoarra.com, 1
 cometbot.cf, 1
 cometcache.com, 1
-cometonovascotia.ca, 1
 comff.net, 1
 comfintouch.com, 1
 comflores.com.br, 1
 comfypc.com, 1
 comhack.com, 1
 comico.info, 1
 comicrelief.com, 1
 comicspornos.com, 1
@@ -6833,16 +6838,17 @@ daoro.net, 1
 daphne.informatik.uni-freiburg.de, 1
 daracokorilo.com, 1
 darbi.org, 1
 darbtech.net, 1
 darc-mak.de, 1
 darchoods.net, 0
 darcymarshall.com, 1
 daren.com.br, 1
+dareyou.be, 1
 darinkotter.com, 1
 darioackermann.ch, 1
 dariosirangelo.me, 1
 darioturchetti.me, 1
 darisni.me, 1
 dark-infection.de, 1
 dark-vision.cz, 1
 darkag.ovh, 1
@@ -7209,16 +7215,17 @@ deltasmart.ch, 1
 deltava.org, 1
 demarle.ch, 1
 dementiapraecox.de, 1
 demeyere-usedcars.be, 1
 demfloro.ru, 1
 demijn.nl, 1
 demilletech.net, 1
 demo.sb, 1
+demo.swedbank.se, 1
 demo9.ovh, 1
 democracy.io, 1
 democracychronicles.com, 1
 democracyineurope.eu, 1
 democraticdifference.com, 1
 democraziaineuropa.eu, 1
 demoniak.ch, 1
 demonwav.com, 1
@@ -7481,17 +7488,16 @@ dicionario.org, 1
 dicionariodegirias.com.br, 1
 dicionariodelatim.com.br, 1
 dicionariodenomesproprios.com.br, 1
 dicionariodesimbolos.com.br, 1
 dicionarioetimologico.com.br, 1
 dick.red, 1
 dickieslife.com, 1
 dickpics.ru, 1
-dicoding.com, 1
 didacte.com, 1
 didche.net, 1
 diddens.de, 1
 didierlaumen.be, 1
 didikhari.web.id, 1
 die-besten-weisheiten.de, 1
 die-blahuts.de, 1
 die-borts.ch, 1
@@ -7649,17 +7655,17 @@ discha.net, 1
 disciples.io, 1
 discipul.nl, 1
 disclosure.io, 1
 disco-crazy-world.de, 1
 discofitta.com, 1
 disconformity.net, 1
 discord-chan.net, 1
 discordapp.com, 1
-discotek.club, 1
+discotek.club, 0
 discount24.de, 1
 discountmania.eu, 1
 discountmetaux.fr, 1
 discountplush.com, 1
 discover-mercure.com, 1
 discoverhealthage.com, 0
 discoveringdocker.com, 1
 discoverrsv.com, 1
@@ -8239,17 +8245,16 @@ duriaux-dentiste.ch, 1
 durys.be, 1
 dusmomente.com, 1
 dustri.org, 1
 dustycloth.com, 1
 dustygroove.com, 1
 dustyspokesbnb.ca, 1
 dutch.desi, 1
 dutch1.nl, 1
-dutchessuganda.com, 1
 dutchrank.nl, 1
 dutchwanderers.nl, 1
 dutchweballiance.nl, 1
 dutyfreeonboard.com, 1
 duyao.de, 0
 dv189.com, 1
 dvbris.co.uk, 1
 dvbris.com, 1
@@ -8494,16 +8499,17 @@ edicct.com, 1
 edisonchee.com, 1
 edisonlee55.com, 1
 edisonnissanparts.com, 1
 edit.yahoo.com, 0
 edited.de, 1
 edition-bambou.com, 1
 edition-sonblom.de, 1
 editoraacademiacrista.com.br, 1
+edlinus.cn, 1
 edmundcelis.com, 1
 edoss.co.za, 1
 edp-collaborative.com, 1
 edsm.net, 1
 edstep.com, 1
 edtech-hub.com, 1
 edtechwebb.com, 1
 edu6.cloud, 1
@@ -8751,16 +8757,17 @@ elliff.net, 1
 elliot.cat, 1
 elliotgluck.com, 1
 elliquiy.com, 1
 elliriehl.at, 1
 ellisamusements.co.uk, 1
 ellisleisure.co.uk, 1
 ellsinger.me, 1
 elmermx.ch, 1
+elna-service.com.ua, 1
 elnan.do, 1
 elodieclerc.ch, 1
 eloge.se, 1
 elonbase.com, 1
 elosrah.com, 1
 elosuite.com, 1
 eloxt.com, 1
 elpado.de, 1
@@ -8811,17 +8818,16 @@ emergenzalavoro.com, 1
 emero.de, 1
 emi-air-comprime.com, 1
 emi.im, 1
 emielraaijmakers.nl, 1
 emil.click, 1
 emilong.com, 1
 emilstahl.dk, 1
 emilvarga.com, 1
-emilyjohnson.ga, 1
 emilyshepherd.me, 1
 eminhuseynov.com, 1
 emirabiz.com, 0
 emirichardson.com, 1
 emivauthey.com, 1
 emkanrecords.com, 1
 emkei.cz, 1
 emma-o.com, 1
@@ -9007,17 +9013,17 @@ epicwalnutcreek.com, 1
 epilis.gr, 1
 epiphyte.network, 1
 epistas.com, 1
 epistas.de, 1
 epitesz.co, 1
 epizentrum.work, 1
 epizentrum.works, 1
 epmcentroitalia.it, 1
-epoch.com, 1
+epoch.com, 0
 epolitiker.com, 1
 epos-distributor.co.uk, 1
 eposbirmingham.co.uk, 1
 eposbrighton.co.uk, 1
 eposbristol.co.uk, 1
 eposcardiff.co.uk, 1
 eposcloud.net, 1
 eposkent.co.uk, 1
@@ -9559,17 +9565,16 @@ fabianackle.ch, 1
 fabianasantiago.com, 1
 fabianfranke.de, 1
 fabienbaker.com, 1
 fabienne-roux.org, 1
 fabled.com, 1
 fableforge.nl, 1
 fabriceleroux.com, 1
 fabriziorocca.it, 1
-fabrysociety.org, 1
 fabse.net, 1
 fabulouslyyouthfulskin.com, 1
 fabulouslyyouthfulskineyeserum.com, 1
 facanabota.com, 1
 facanabota.com.br, 1
 facciadastile.it, 1
 facealacrise.fr, 1
 facebattle.com, 1
@@ -9650,16 +9655,17 @@ familie-leu.ch, 1
 familie-monka.de, 1
 familie-remke.de, 1
 familie-sander.rocks, 1
 familiegrottendieck.de, 1
 familieholme.de, 1
 familjenfrodlund.se, 1
 familjenm.se, 1
 familletouret.fr, 1
+familylawhotline.org, 1
 familyparties.co.uk, 1
 familyreal.ru, 1
 famososnaweb.com, 1
 famousbirthdays.com, 1
 famoushostels.com, 1
 famvangelder.nl, 1
 famvsomeren.nl, 1
 fanboi.ch, 1
@@ -10272,16 +10278,17 @@ followerrocket.com, 1
 followersya.com, 1
 followthatpage.com, 1
 folv.es, 1
 fondanastasia.ru, 1
 fondationwiggli.ch, 1
 fondy.eu, 1
 fondy.ru, 1
 fondy.ua, 1
+foneo.com, 1
 fonga.ch, 1
 fonolo.com, 1
 fonseguin.ca, 1
 font-converter.net, 1
 fontawesome.com, 1
 fonte-trading.com, 1
 fontein.de, 1
 fontlibrary.org, 1
@@ -11348,17 +11355,17 @@ givingnexus.org, 0
 gix.net.pl, 1
 gixtools.co.uk, 1
 gixtools.com, 1
 gixtools.net, 1
 gixtools.uk, 1
 gizmo.ovh, 1
 gj-bochum.de, 1
 gjcampbell.co.uk, 1
-gjengset.com, 1
+gjengset.com, 0
 gjspunk.de, 0
 gjung.com, 0
 gkralik.eu, 1
 gl.search.yahoo.com, 0
 gladwellentertainments.co.uk, 1
 glahcks.com, 1
 glamguru.co.il, 1
 glamguru.world, 1
@@ -12058,17 +12065,16 @@ hansolrella.com, 1
 hansvaneijsden.com, 1
 hansvaneijsden.nl, 1
 hantse.com, 1
 hanu.la, 1
 hanxv.pw, 1
 hanys.xyz, 1
 hanzubon.jp, 1
 hao-zhang.com, 1
-haogoodair.ca, 1
 haozhang.org, 1
 hapijs.cn, 1
 hapissl.com, 1
 hapivm.com, 1
 happist.com, 0
 happyagain.de, 1
 happyagain.se, 1
 happybounce.co.uk, 1
@@ -12137,17 +12143,16 @@ hashi.dk, 1
 hashiconf.com, 1
 hashiconf.eu, 1
 hashicorp.com, 1
 hashidays.com, 1
 hashimah.ca, 1
 hashinteractive.com, 1
 hashish.net, 1
 hashiura.jp, 1
-hashnode.com, 1
 hashplex.com, 1
 hashru.nl, 1
 hashworks.net, 1
 haskovec.com, 1
 hasselbach-dellwig.de, 1
 hatarisecurity.co.ke, 1
 hatcherlawgroupnm.com, 1
 hatethe.uk, 1
@@ -12156,16 +12161,17 @@ haucke.xyz, 1
 hauntedfishtank.com, 0
 hauntedhouserecords.co.uk, 1
 haus-garten-test.de, 1
 hausundhof.com, 1
 hausverbrauch.de, 1
 hautarztzentrum.ch, 1
 hauteslatitudes.com, 1
 havasuhomepage.com, 1
+havasuinsurance.com, 1
 haveabounce.co.uk, 1
 haveforeningen-enghaven.dk, 1
 havefunbiking.com, 1
 haveibeenpwned.com, 1
 havellab.de, 1
 havelland-obstler.de, 1
 haven-moon.com, 1
 haven-staging.cloud, 1
@@ -12492,17 +12498,16 @@ hicoria.com, 1
 hidbo.de, 1
 hiddenhillselectrical.com, 1
 hiddenmalta.net, 1
 hiddenprocess.com, 1
 hideallip.com, 1
 hidedd.com, 1
 hideouswebsite.com, 1
 hidroshop.com.br, 1
-hieu.com.au, 1
 higgstools.org, 1
 higherpress.org, 1
 highland-webcams.com, 1
 highlandparkcog.org, 1
 highlatitudestravel.com, 1
 highlegshop.com, 1
 highlevelwoodlands.com, 1
 highlnk.com, 1
@@ -13206,17 +13211,16 @@ iewar.com, 1
 iexpert9.com, 1
 ifamily.top, 1
 ifan.ch, 1
 ifasec.de, 0
 ifcfg.me, 1
 ifconfig.co, 1
 ifelse.io, 1
 ifengge.cn, 1
-ifengge.me, 1
 ifightsurveillance.com, 1
 ifightsurveillance.net, 1
 ifightsurveillance.org, 1
 ifixe.ch, 1
 iflare.de, 1
 iformbuilder.com, 0
 ifort.fr, 1
 ifosep.fr, 1
@@ -13941,17 +13945,16 @@ isoroc-nidzica.pl, 1
 isowosi.com, 1
 ispo.com.tw, 1
 ispringcloud.ru, 1
 ispsoft.pro, 1
 ispweb.es, 1
 isqrl.de, 1
 israelbizreg.com, 1
 israkurort.com, 1
-isreedyintheuk.com, 1
 issasfrissa.se, 1
 issforum.org, 1
 issio.net, 1
 isslshop.com, 1
 issue.watch, 1
 issuesofconcern.in, 1
 ist-intim.de, 1
 istanbul.systems, 1
@@ -14565,17 +14568,17 @@ joelcoustrain.com, 1
 joeldrapper.com, 1
 joelfries.com, 1
 joelj.org, 1
 joelle.me, 1
 joelleandpeter.co.uk, 1
 joellimberg.com, 1
 joelmunch.com, 1
 joepitt.co.uk, 0
-joerg-wellpott.de, 0
+joerg-wellpott.de, 1
 joerss.at, 1
 joespaintingpgh.com, 1
 joestead.codes, 1
 joetyson.io, 1
 joetyson.me, 1
 joeysmith.com, 1
 jogi-server.de, 1
 jogorama.com.br, 0
@@ -15030,17 +15033,16 @@ karenledger.ca, 1
 karguine.in, 1
 karhm.com, 1
 karhukamera.com, 1
 karina.gd, 1
 karit.nz, 1
 karjala-ski.ru, 1
 karlbowden.com, 1
 karlic.net, 1
-karlis-kavacis.id.lv, 1
 karlsmithmn.org, 1
 karlstabo.se, 1
 karlzotter.com, 1
 karmaassurance.ca, 1
 karmabaker.com, 1
 karmainsurance.ca, 1
 karmaplatform.com, 1
 karmaspa.se, 1
@@ -15983,16 +15985,17 @@ lamboo.be, 1
 lamiaposta.email, 1
 laminine.info, 1
 lampegiganten.dk, 1
 lampegiganten.no, 1
 lampen24.be, 1
 lampenwelt.at, 1
 lampenwelt.ch, 1
 lan2k.org, 1
+lana.swedbank.se, 1
 lanbroa.eu, 1
 lanbyte.se, 1
 lancejames.com, 1
 lancelafontaine.com, 1
 lanceyip.com, 1
 lancork.net, 1
 lancyvbc.ch, 1
 land.nrw, 0
@@ -17263,21 +17266,21 @@ magazinedotreino.com.br, 1
 magdic.eu, 1
 magebankin.com, 1
 magenbrot.net, 0
 magenda.sk, 1
 magentaize.net, 1
 magentapinkinteriors.co.uk, 1
 magi.systems, 1
 magicball.co, 1
-magicbroccoli.de, 0
+magicbroccoli.de, 1
 magicdaysomagh.co.uk, 1
 magickmoments.co.uk, 1
 magiclen.org, 1
-magicspaceninjapirates.de, 0
+magicspaceninjapirates.de, 1
 magictable.com, 1
 magilio.com, 1
 magnacumlaude.co, 1
 magnatronic.com.br, 1
 magneticattraction.com.au, 1
 magnets.jp, 1
 magnettracker.com, 1
 magnoliadoulas.com, 1
@@ -17484,16 +17487,17 @@ marcelmarnitz.com, 1
 marcelpreuss.de, 1
 marcelsiegert.com, 1
 marcgoertz.de, 1
 marche-contre-monsanto.ch, 1
 marche-nordic-jorat.ch, 1
 marciaimportados.com.br, 1
 marcianoandtopazio.com, 1
 marco-kretz.de, 1
+marco-polo-reisen.com, 1
 marcocasoni.com, 1
 marcohager.de, 1
 marcoherten.com, 1
 marcoslater.com, 1
 marcuskoh.com, 1
 marcusstafford.com, 1
 mardelcupon.com, 1
 mare92.cz, 1
@@ -18276,17 +18280,16 @@ migueldominguez.ch, 1
 miguelgfierro.com, 1
 miguelmartinez.ch, 1
 miguelmenendez.pro, 1
 miguelmoura.com, 1
 miguia.tv, 1
 mihnea.net, 1
 mijnkerstkaarten.be, 1
 mijnreisoverzicht.nl, 1
-mijnstembureau.nl, 1
 mijntransacties.nl, 1
 mika.cat, 1
 mika.moe, 1
 mikadoe.nl, 1
 mikaela.info, 1
 mikakalevi.com, 1
 mikalikes.men, 1
 mike-bland.com, 1
@@ -19094,17 +19097,16 @@ mutuelle.fr, 1
 muusika.fun, 1
 muusikoiden.net, 1
 muwatenraqamy.org, 1
 muzeumkomiksu.eu, 1
 muzi.cz, 1
 mv-wohnen.de, 1
 mvandek.nl, 1
 mvbits.com, 1
-mvnet.com.br, 1
 mvno.io, 1
 mvp-stars.com, 1
 mw.search.yahoo.com, 0
 mwainc.org, 1
 mware-staging.azurewebsites.net, 1
 mwavuli.co.ke, 1
 mwba.org, 1
 mwe.st, 1
@@ -19442,17 +19444,16 @@ nargileh.nl, 1
 narindal.ch, 1
 narko.space, 1
 narmos.ch, 1
 naro.se, 1
 narodsovety.ru, 1
 naroska.name, 1
 narrativasdigitais.pt, 1
 narthollis.net, 1
-narviz.com, 1
 nasarawanewsonline.com, 1
 nasbnation.com, 1
 nascher.org, 0
 nasmocopati.com, 1
 nasrsolar.com, 1
 nassi.me, 1
 nastoletni.pl, 1
 nastysclaw.com, 1
@@ -20452,17 +20453,16 @@ odzyskaniedomeny.pl, 1
 oec-music.com, 1
 oeh.ac.at, 1
 oeko-bundesfreiwilligendienst-sh.de, 1
 oeko-bundesfreiwilligendienst.de, 1
 oeko-jahr-jubilaeum.de, 1
 oeko-jahr.de, 1
 oelsner.net, 1
 oemwolf.com, 1
-oestepaulista.net, 1
 ofcampuslausanne.ch, 1
 ofcss.com, 1
 ofda.gov, 1
 off-the-clock.us, 1
 offenekommune.de, 1
 offersgame.com, 1
 offgames.io, 1
 offgames.pro, 1
@@ -20646,16 +20646,17 @@ onlfait.ch, 1
 online-bouwmaterialen.nl, 1
 online-consulting-corp.com, 1
 online-consulting-corp.fr, 1
 online-eikaiwa-guide.com, 1
 online-pr.at, 1
 online-results.dk, 1
 online-scene.com, 1
 online.marketing, 1
+online.swedbank.se, 1
 online24.pt, 1
 onlinebillingform.com, 1
 onlinebizdirect.com, 0
 onlinecasino.vlaanderen, 1
 onlinecasinobluebook.com, 1
 onlinecensorship.org, 1
 onlinecollegeessay.com, 1
 onlinefashion.it, 1
@@ -21341,16 +21342,17 @@ pawsomebox.co.uk, 1
 pawsr.us, 1
 pay.ubuntu.com, 1
 pay8522.com, 1
 payboy.rocks, 1
 payclixpayments.com, 1
 payfazz.com, 1
 paylike.io, 1
 payload.tech, 1
+payloc.io, 1
 payme.uz, 1
 payment-network.com, 1
 paymentaccuracy.gov, 1
 payments.google.com, 1
 paymerang.com, 1
 paymill.com, 1
 paymill.de, 1
 paymon.tj, 1
@@ -21550,16 +21552,17 @@ petelew.is, 1
 peter.org.ua, 1
 peterandjoelle.co.uk, 1
 peterboers.info, 1
 peterdavehello.org, 1
 peterfolta.net, 1
 peterhuetz.at, 1
 peterhuetz.com, 1
 peterjohnson.io, 1
+peterlew.is, 1
 peternagy.ie, 1
 petersontoscano.com, 1
 pethelpers.org, 1
 petite-maison.ch, 1
 petitsfrenchies.com, 1
 petja.me, 0
 petko.me, 1
 petlife.od.ua, 1
@@ -21767,16 +21770,17 @@ pilani.ch, 1
 pileofgarbage.net, 1
 piliszek.net, 1
 pill.id, 1
 pilotcrowd.nl, 1
 pimhaarsma.nl, 1
 pimhaarsmamedia.nl, 1
 pimpmyperf.fr, 1
 pimspage.nl, 1
+pin.net.au, 1
 pinceaux.org, 1
 pincha.com.tw, 0
 pincodeit.com, 1
 pindanutjes.be, 0
 pinebaylibrary.org, 1
 pinemountainnursery.com.au, 1
 pinemountbaptistchurch.org, 1
 pinesandneedles.com, 1
@@ -23923,17 +23927,16 @@ royalcitytaxi.com, 1
 royalmarinesassociation.org.uk, 1
 royalnissanparts.com, 1
 royalpalacenogent.fr, 1
 royalrangers.fi, 1
 royalty-market.com, 1
 royalvisiongroup.com, 1
 royzez.com, 1
 rozalisbengal.ro, 1
-rozalynne-dawn.ga, 1
 rozhodce.cz, 1
 rpadovani.com, 1
 rpasafrica.com, 1
 rpgmaker.es, 1
 rpherbig.com, 1
 rpine.net, 1
 rpy.xyz, 1
 rq-labo.jp, 1
@@ -24007,17 +24010,16 @@ rucnerobene.eu, 1
 ruconsole.com, 1
 rud.is, 1
 rudd-o.com, 1
 rudelune.fr, 1
 ruderverein-gelsenkirchen.de, 1
 rudloff.pro, 0
 rudolph.life, 1
 rudrastyh.com, 1
-rue-de-la-vieille.fr, 1
 ruedirrenggli.ch, 1
 ruerte.net, 1
 rufabula-com.appspot.com, 1
 ruffbeatz.com, 1
 rugby.video, 1
 rugk.dedyn.io, 1
 rugstorene.co.uk, 1
 ruh-veit.de, 1
@@ -24177,17 +24179,16 @@ sagemontchurch.org, 1
 sagerus.com, 1
 sagsmarseille.com, 1
 sahar.io, 1
 sahb.dk, 1
 sahkotyot.eu, 1
 said.id, 1
 said.my.id, 1
 saier.me, 1
-saifoundation.in, 1
 saigonflowers.com, 1
 saigonstar.de, 1
 saikarra.com, 1
 saikou.moe, 1
 saikouji.tokushima.jp, 1
 sailormoonevents.org, 0
 saimoe.moe, 1
 saimoe.org, 1
@@ -25401,17 +25402,16 @@ silverstartup.sk, 1
 silverwind.io, 1
 silviamacallister.com, 1
 silvine.xyz, 1
 silvistefi.com, 1
 sim-karten.net, 1
 sim-sim.appspot.com, 1
 sim4seed.org, 1
 simam.de, 1
-simbeton.nl, 1
 simbolo.co.uk, 0
 simeonoff.ninja, 1
 simetal.ch, 1
 simfed.org, 1
 simlau.net, 1
 simmis.fr, 1
 simoesgoulart.com.br, 1
 simon-hofmann.org, 1
@@ -25500,16 +25500,17 @@ sint-joris.nl, 1
 sinterama.biz, 1
 sintesysglobal.com, 1
 sinuelovirtual.com.br, 1
 sion.moe, 1
 siqi.wang, 1
 siraweb.org, 1
 sirbouncealotcastles.co.uk, 1
 sirbouncelot.co.uk, 1
+sirburton.com, 1
 sirena.co.jp, 1
 sirenslove.com, 1
 siriuspup.com, 1
 siro.gq, 1
 siroop.ch, 1
 sirtaptap.com, 1
 sirtuins.com, 1
 sistel.es, 1
@@ -25745,16 +25746,17 @@ smartrade.tech, 1
 smartshiftme.com, 1
 smartship.co.jp, 1
 smartshoppers.es, 1
 smartsparrow.com, 1
 smartvideo.io, 1
 smartviewing.com, 1
 smartwelve.com, 1
 smartwritingservice.com, 1
+smartwurk.nl, 1
 smash-gg.club, 1
 smatch.com, 1
 smb445.com, 1
 smdavis.us, 1
 smdcn.net, 1
 sme-gmbh.net, 1
 smeetsengraas.com, 1
 smeso.it, 1
@@ -26402,17 +26404,16 @@ startaninflatablebusiness.com, 1
 startlab.sk, 1
 startpage.com, 1
 startpage.info, 1
 startrek.in, 1
 starttraffic.com, 1
 starttraffic.uk, 1
 startup.melbourne, 1
 startuplevel.com, 1
-startuppeople.co.uk, 1
 startupsort.com, 1
 startupum.ru, 1
 starwatches.eu, 1
 starwins.co.uk, 1
 stassi.ch, 1
 stastka.ch, 1
 stat.ink, 1
 state-of-body-and-mind.com, 1
@@ -26600,17 +26601,16 @@ stomt.com, 1
 stonedworms.de, 1
 stonefusion.org.uk, 1
 stonehammerhead.org, 1
 stonemain.eu, 1
 stonemanbrasil.com.br, 1
 stony.com, 1
 stonystratford.org, 1
 stopakwardhandshakes.org, 1
-stopbreakupnow.org, 1
 stopbullying.gov, 1
 stopfraud.gov, 1
 stopthethyroidmadness.com, 1
 stordbatlag.no, 1
 store-host.com, 1
 store10.de, 1
 storedsafe.com, 1
 storgom.ua, 0
@@ -26745,17 +26745,16 @@ styloeart.com, 1
 stypr.com, 1
 su1ph3r.io, 1
 suareforma.com, 1
 suave.io, 1
 sub-net.at, 1
 sub.media, 1
 subastasdecarros.net, 1
 subdev.org, 1
-sublevel.net, 0
 sublimebits.com, 1
 submedia.tv, 1
 submelon.tech, 1
 subohm.com, 1
 suborbital.io, 1
 subrain.com, 1
 subrosa.io, 0
 subseq.net, 0
@@ -28049,20 +28048,18 @@ timmersgems.com, 1
 timmy.im, 1
 timmy.ws, 1
 timmyrs.de, 1
 timoxbrow.com, 1
 timroes.de, 1
 timstoffel.net, 0
 timtaubert.de, 1
 timtelfer.com, 1
-timtj.ca, 1
 timvandekamp.nl, 1
 timvivian.ca, 1
-timweb.ca, 1
 timysewyn.be, 1
 tinastahlschmidt.de, 1
 tinf15b4.de, 1
 tinfoilsecurity.com, 0
 tinfoleak.com, 1
 tink.network, 1
 tinker.career, 1
 tinkerboard.org, 1
@@ -28432,25 +28429,25 @@ toursandtransfers.it, 1
 tourtransferitaly.it, 1
 tous-travaux.ch, 1
 toushi-exe.com, 1
 toushi-return.xyz, 1
 touslesdrivers.com, 1
 tousproducteurs.fr, 1
 tout-art.ch, 1
 toutart.ch, 1
+toutenmusic.fr, 1
 toutmonexam.fr, 1
 tovare.com, 1
 toverland-tickets.nl, 1
 towandalibrary.org, 1
 towaway.ru, 1
 townandcountryus.com, 1
 townhousedevelopments.com.au, 1
 townhouseregister.com.au, 1
-townofbridgewater.ca, 1
 towywebdesigns.uk, 1
 tox.im, 1
 toxicip.com, 1
 toymania.de, 1
 toysperiod.com, 1
 tp-iryuubun.com, 1
 tp-kabushiki.com, 1
 tp-kyouyufudousan.com, 1
@@ -29311,17 +29308,16 @@ uwesander.de, 1
 uwfreelanceopticien.nl, 1
 uwimonacs.org.jm, 1
 uxtechnologist.com, 1
 uy.search.yahoo.com, 0
 uygindir.ml, 1
 uz.search.yahoo.com, 0
 uzaymedya.com.tr, 1
 v-d-p.net, 1
-v-desk.ga, 1
 v-tek.fi, 1
 v-u-z.ru, 1
 v12.co.uk, 1
 v1sit0r.ru, 1
 v2bv.net, 1
 v2bv.win, 1
 v2ex.com, 1
 va-reitartikel.com, 1
@@ -29439,16 +29435,17 @@ varshathacker.com, 1
 varta.io, 1
 varunagw.com, 0
 varunpriolkar.com, 1
 varvy.com, 1
 vascomm.co.id, 1
 vashel.us, 1
 vasileruscior.ro, 1
 vaskulitis-info.de, 1
+vasports.com.au, 1
 vastgoedcultuurfonds.nl, 1
 vasyharan.com, 1
 vat-eu.com, 1
 vatelecom.dk, 1
 vattulainen.fi, 1
 vaud-fleurs.ch, 1
 vault21.net, 1
 vaultproject.io, 1
@@ -29867,17 +29864,17 @@ vop.li, 1
 vorderklier.de, 1
 vorkbaard.nl, 1
 vorlicek.de, 1
 vorlif.org, 1
 vorm2.com, 1
 vorodevops.com, 1
 vos-fleurs.ch, 1
 vos-fleurs.com, 1
-voshod.org, 1
+voshod.org, 0
 vosky.fr, 1
 vostronet.com, 1
 voter-info.uk, 1
 votercircle.com, 1
 voterstartingpoint.uk, 1
 votocek.cz, 1
 votockova.cz, 1
 votoot.com, 1
@@ -29901,17 +29898,16 @@ vpls.net, 1
 vplssolutions.com, 1
 vpn.ht, 1
 vpnservice.nl, 1
 vpnzoom.com, 1
 vpsboard.com, 1
 vpsdream.dk, 1
 vrandopulo.ru, 1
 vranjske.co.rs, 1
-vriendenvoordeel.com, 1
 vriesdonkow.be, 1
 vrijgezellen-feest.com, 1
 vrlaid.com, 0
 vroedvrouwella.be, 1
 vrsystem.com.br, 1
 vrtak-cz.net, 1
 vrtouring.org, 1
 vrzl.pro, 1
@@ -30079,17 +30075,16 @@ watchparts-and-tools-okayama.co.jp, 1
 watchstyle.com, 1
 watchtv-online.pw, 1
 watchweasel.com, 1
 waterfedpole.com, 1
 watermonitor.gov, 1
 watersb.org, 1
 watertrails.io, 1
 watsonwork.me, 1
-wattechweb.com, 1
 wave-ola.es, 1
 wavesboardshop.com, 1
 wavesoftime.com, 1
 wawak.pl, 1
 waxdramatic.com, 1
 waylaydesign.com, 1
 wayne.cloud, 0
 wayohoo.com, 1
--- a/servo/Cargo.lock
+++ b/servo/Cargo.lock
@@ -3471,17 +3471,17 @@ dependencies = [
  "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "uuid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "webdriver 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "webrender"
 version = "0.53.1"
-source = "git+https://github.com/servo/webrender#71c1f3dca3173a977610e5f7a818deb155cc8cf4"
+source = "git+https://github.com/servo/webrender#24b3fa46ec628e2e07f754d87791114378a842f8"
 dependencies = [
  "app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-text 7.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3498,17 +3498,17 @@ dependencies = [
  "thread_profiler 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender_api 0.53.1 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "webrender_api"
 version = "0.53.1"
-source = "git+https://github.com/servo/webrender#71c1f3dca3173a977610e5f7a818deb155cc8cf4"
+source = "git+https://github.com/servo/webrende