Merge mozilla-central to inbound
authorarthur.iakab <aiakab@mozilla.com>
Wed, 24 Oct 2018 07:17:50 +0300
changeset 491048 c1f0dc8791b7d774225f3fdb7502bcd7d07fb4be
parent 490988 52d8c77e0718743635379b1354ed44e1fb055394 (current diff)
parent 491047 079c7a062b23950449e9ce1ef809ff43026cc259 (diff)
child 491049 915d77bbcf8b9eafb9a51af01e06c146175f1dfc
push id247
push userfmarier@mozilla.com
push dateSat, 27 Oct 2018 01:06:44 +0000
milestone65.0a1
Merge mozilla-central to inbound
js/src/jit-test/tests/debug/Frame-onPop-star-generators-03.js
testing/mozharness/configs/builds/releng_sub_linux_configs/32_devedition.py
testing/mozharness/configs/builds/releng_sub_linux_configs/64_devedition.py
testing/mozharness/configs/builds/releng_sub_linux_configs/64_plain_debug.py
testing/mozharness/configs/builds/releng_sub_linux_configs/64_plain_opt.py
testing/mozharness/configs/builds/releng_sub_mac_configs/64_devedition.py
testing/mozharness/configs/builds/releng_sub_windows_configs/32_devedition.py
testing/mozharness/configs/builds/releng_sub_windows_configs/32_mingwclang_debug.py
testing/mozharness/configs/builds/releng_sub_windows_configs/64_devedition.py
testing/mozharness/configs/builds/releng_sub_windows_configs/64_mingwclang_debug.py
testing/mozharness/configs/builds/taskcluster_sub_win32/addondevel.py
testing/mozharness/configs/builds/taskcluster_sub_win32/opt.py
testing/mozharness/configs/builds/taskcluster_sub_win32/rusttests_opt.py
testing/mozharness/configs/builds/taskcluster_sub_win64/addondevel.py
testing/mozharness/configs/builds/taskcluster_sub_win64/asan_opt.py
testing/mozharness/configs/builds/taskcluster_sub_win64/opt.py
testing/mozharness/configs/builds/taskcluster_sub_win64/plain_debug.py
testing/talos/talos/tests/cpstartup/bootstrap.js
testing/talos/talos/tests/cpstartup/chrome.manifest
testing/talos/talos/tests/cpstartup/content/cpstartup.html
testing/talos/talos/tests/cpstartup/content/target.html
testing/talos/talos/tests/cpstartup/install.rdf
testing/talos/talos/tests/tabpaint/bootstrap.js
testing/talos/talos/tests/tabpaint/chrome.manifest
testing/talos/talos/tests/tabpaint/content/tabpaint.html
testing/talos/talos/tests/tabpaint/content/target.html
testing/talos/talos/tests/tabpaint/install.rdf
toolkit/mozapps/update/updater/win_dirent.cpp
--- a/accessible/windows/msaa/AccessibleWrap.cpp
+++ b/accessible/windows/msaa/AccessibleWrap.cpp
@@ -63,17 +63,17 @@ const uint32_t USE_ROLE_STRING = 0;
 
 #ifdef DEBUG_LEAKS
 static gAccessibles = 0;
 #endif
 
 MsaaIdGenerator AccessibleWrap::sIDGen;
 StaticAutoPtr<nsTArray<AccessibleWrap::HandlerControllerData>> AccessibleWrap::sHandlerControllers;
 
-static const VARIANT kVarChildIdSelf = {VT_I4};
+static const VARIANT kVarChildIdSelf = {{{VT_I4}}};
 
 static const int32_t kIEnumVariantDisconnected = -1;
 
 ////////////////////////////////////////////////////////////////////////////////
 // AccessibleWrap
 ////////////////////////////////////////////////////////////////////////////////
 AccessibleWrap::AccessibleWrap(nsIContent* aContent, DocAccessible* aDoc) :
   Accessible(aContent, aDoc)
@@ -1421,17 +1421,17 @@ GetProxiedAccessibleInSubtree(const DocA
   // their COM proxy.
   if (aDoc->IsTopLevel()) {
     wrapper->GetNativeInterface(getter_AddRefs(comProxy));
   } else {
     auto tab = static_cast<dom::TabParent*>(aDoc->Manager());
     MOZ_ASSERT(tab);
     DocAccessibleParent* topLevelDoc = tab->GetTopLevelDocAccessible();
     MOZ_ASSERT(topLevelDoc && topLevelDoc->IsTopLevel());
-    VARIANT docId = {VT_I4};
+    VARIANT docId = {{{VT_I4}}};
     docId.lVal = docWrapperChildId;
     RefPtr<IDispatch> disp = GetProxiedAccessibleInSubtree(topLevelDoc, docId);
     if (!disp) {
       return nullptr;
     }
 
     DebugOnly<HRESULT> hr = disp->QueryInterface(IID_IAccessible,
                                                  getter_AddRefs(comProxy));
--- a/accessible/windows/msaa/CompatibilityUIA.cpp
+++ b/accessible/windows/msaa/CompatibilityUIA.cpp
@@ -163,19 +163,18 @@ ShouldBlockUIAClient(nsIFile* aClientExe
 namespace mozilla {
 namespace a11y {
 
 Maybe<DWORD> Compatibility::sUiaRemotePid;
 
 Maybe<bool>
 Compatibility::OnUIAMessage(WPARAM aWParam, LPARAM aLParam)
 {
-  Maybe<DWORD>& remotePid = sUiaRemotePid;
-  auto clearUiaRemotePid = MakeScopeExit([&remotePid]() {
-    remotePid = Nothing();
+  auto clearUiaRemotePid = MakeScopeExit([]() {
+    sUiaRemotePid = Nothing();
   });
 
   Telemetry::AutoTimer<Telemetry::A11Y_UIA_DETECTION_TIMING_MS> timer;
 
   // UIA creates a section containing the substring "HOOK_SHMEM_"
   NS_NAMED_LITERAL_STRING(kStrHookShmem, "HOOK_SHMEM_");
 
   // The section name always ends with this suffix, which is derived from the
@@ -296,17 +295,17 @@ Compatibility::OnUIAMessage(WPARAM aWPar
     }
 
     // At this point we know that curHandle references a Section object.
     // Now we can do some actual tests on it.
 
     if (ourPid != curHandle.mPid) {
       if (kernelObject && kernelObject.value() == curHandle.mObject) {
         // The kernel objects match -- we have found the remote pid!
-        remotePid = Some(curHandle.mPid);
+        sUiaRemotePid = Some(curHandle.mPid);
         break;
       }
 
       // An object that is not ours. Since we do not yet know which kernel
       // object we're interested in, we'll save the current object for later.
       objMap.Put(curHandle.mObject, curHandle.mPid);
     } else if (handle == section.get()) {
       // This is the file mapping that we opened above. We save this mObject
@@ -314,30 +313,30 @@ Compatibility::OnUIAMessage(WPARAM aWPar
       kernelObject = Some(curHandle.mObject);
     }
   }
 
   if (!kernelObject) {
     return Nothing();
   }
 
-  if (!remotePid) {
+  if (!sUiaRemotePid) {
     // We found kernelObject *after* we saw the remote process's copy. Now we
     // must look it up in objMap.
     DWORD pid;
     if (objMap.Get(kernelObject.value(), &pid)) {
-      remotePid = Some(pid);
+      sUiaRemotePid = Some(pid);
     }
   }
 
-  if (!remotePid) {
+  if (!sUiaRemotePid) {
     return Nothing();
   }
 
-  a11y::SetInstantiator(remotePid.value());
+  a11y::SetInstantiator(sUiaRemotePid.value());
 
   // Block if necessary
   nsCOMPtr<nsIFile> instantiator;
   if (a11y::GetInstantiator(getter_AddRefs(instantiator)) &&
       ShouldBlockUIAClient(instantiator)) {
     return Some(false);
   }
 
--- a/accessible/windows/msaa/IUnknownImpl.h
+++ b/accessible/windows/msaa/IUnknownImpl.h
@@ -15,17 +15,17 @@
 // Avoid warning C4509 like "nonstandard extension used:
 // 'AccessibleWrap::[acc_getName]' uses SEH and 'name' has destructor.
 // At this point we're catching a crash which is of much greater
 // importance than the missing dereference for the nsCOMPtr<>
 #ifdef _MSC_VER
 #pragma warning( disable : 4509 )
 #endif
 
-#ifdef __GNUC__
+#if defined(__GNUC__) || defined(__clang__)
 #define ATTRIBUTE_UNUSED __attribute__((unused))
 #else
 #define ATTRIBUTE_UNUSED
 #endif
 
 namespace mozilla {
 namespace a11y {
 
--- a/browser/base/content/test/performance/browser_startup_content.js
+++ b/browser/base/content/test/performance/browser_startup_content.js
@@ -106,24 +106,24 @@ add_task(async function() {
   // Load a custom frame script to avoid using ContentTask which loads Task.jsm
   mm.loadFrameScript("data:text/javascript,(" + function() {
     /* eslint-env mozilla/frame-script */
     const Cm = Components.manager;
     Cm.QueryInterface(Ci.nsIServiceManager);
     ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
     let collectStacks = AppConstants.NIGHTLY_BUILD || AppConstants.DEBUG;
     let components = {};
-    for (let component of Cu.loadedComponents()) {
+    for (let component of Cu.loadedComponents) {
       /* Keep only the file name for components, as the path is an absolute file
          URL rather than a resource:// URL like for modules. */
       components[component.replace(/.*\//, "")] =
         collectStacks ? Cu.getComponentLoadStack(component) : "";
     }
     let modules = {};
-    for (let module of Cu.loadedModules()) {
+    for (let module of Cu.loadedModules) {
       modules[module] = collectStacks ? Cu.getModuleImportStack(module) : "";
     }
     let services = {};
     for (let contractID of Object.keys(Cc)) {
       try {
         if (Cm.isServiceInstantiatedByContractID(contractID, Ci.nsISupports)) {
           services[contractID] = "";
         }
--- a/browser/components/enterprisepolicies/content/aboutPolicies.js
+++ b/browser/components/enterprisepolicies/content/aboutPolicies.js
@@ -261,16 +261,21 @@ function generateDocumentation() {
     sec_tbody.classList.add("content");
     sec_tbody.classList.add("content-style");
     let schema_row = document.createElement("tr");
     if (schema.properties[policyName].properties) {
       let column = col(JSON.stringify(schema.properties[policyName].properties, null, 1), "schema");
       column.colSpan = "2";
       schema_row.appendChild(column);
       sec_tbody.appendChild(schema_row);
+    } else if (schema.properties[policyName].items) {
+      let column = col(JSON.stringify(schema.properties[policyName], null, 1), "schema");
+      column.colSpan = "2";
+      schema_row.appendChild(column);
+      sec_tbody.appendChild(schema_row);
     } else {
       let column = col("type: " + schema.properties[policyName].type, "schema");
       column.colSpan = "2";
       schema_row.appendChild(column);
       sec_tbody.appendChild(schema_row);
       if (schema.properties[policyName].enum) {
         let enum_row = document.createElement("tr");
         column = col("enum: " + JSON.stringify(schema.properties[policyName].enum, null, 1), "schema");
--- a/browser/components/tests/startupRecorder.js
+++ b/browser/components/tests/startupRecorder.js
@@ -58,18 +58,18 @@ startupRecorder.prototype = {
 
   QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver]),
 
   record(name) {
     if (!Services.prefs.getBoolPref("browser.startup.record", false))
       return;
 
     this.data.code[name] = {
-      components: Cu.loadedComponents(),
-      modules: Cu.loadedModules(),
+      components: Cu.loadedComponents,
+      modules: Cu.loadedModules,
       services: Object.keys(Cc).filter(c => {
         try {
           return Cm.isServiceInstantiatedByContractID(c, Ci.nsISupports);
         } catch (e) {
           return false;
         }
       }),
     };
--- a/browser/installer/windows/nsis/installer.nsi
+++ b/browser/installer/windows/nsis/installer.nsi
@@ -347,16 +347,22 @@ Section "-Application" APP_IDX
     ${EndIf}
   ${EndIf}
 
   ; Default for creating Desktop shortcut (1 = create, 0 = don't create)
   ${If} $AddDesktopSC == ""
     StrCpy $AddDesktopSC "1"
   ${EndIf}
 
+  ${CreateUpdateDir} "Mozilla"
+  ${If} ${Errors}
+    Pop $0
+    ${LogMsg} "** ERROR Failed to create update directory: $0"
+  ${EndIf}
+
   ${LogHeader} "Adding Registry Entries"
   SetShellVarContext current  ; Set SHCTX to HKCU
   ${RegCleanMain} "Software\Mozilla"
   ${RegCleanUninstall}
   ${UpdateProtocolHandlers}
 
   ClearErrors
   WriteRegStr HKLM "Software\Mozilla" "${BrandShortName}InstallerTest" "Write Test"
--- a/build/clang-plugin/mozsearch-plugin/MozsearchIndexer.cpp
+++ b/build/clang-plugin/mozsearch-plugin/MozsearchIndexer.cpp
@@ -393,17 +393,17 @@ private:
       return std::string("NS_") + mangleQualifiedName(getQualifiedName(Decl));
     } else if (const ObjCIvarDecl *D2 = dyn_cast<ObjCIvarDecl>(Decl)) {
       const ObjCInterfaceDecl *Iface = D2->getContainingInterface();
       return std::string("F_<") + getMangledName(Ctx, Iface) + ">_" +
              D2->getNameAsString();
     } else if (const FieldDecl *D2 = dyn_cast<FieldDecl>(Decl)) {
       const RecordDecl *Record = D2->getParent();
       return std::string("F_<") + getMangledName(Ctx, Record) + ">_" +
-             toString(D2->getFieldIndex());
+             D2->getNameAsString();
     } else if (const EnumConstantDecl *D2 = dyn_cast<EnumConstantDecl>(Decl)) {
       const DeclContext *DC = Decl->getDeclContext();
       if (const NamedDecl *Named = dyn_cast<NamedDecl>(DC)) {
         return std::string("E_<") + getMangledName(Ctx, Named) + ">_" +
                D2->getNameAsString();
       }
     }
 
--- a/build/win32/crashinject.cpp
+++ b/build/win32/crashinject.cpp
@@ -38,17 +38,17 @@ int main(int argc, char** argv)
   slash++;
   wcscpy(slash, L"crashinjectdll.dll");
 
   // now find our target process
   HANDLE targetProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION,
                                   FALSE,
                                   pid);
   if (targetProc == nullptr) {
-    fprintf(stderr, "Error %d opening target process\n", GetLastError());
+    fprintf(stderr, "Error %lu opening target process\n", GetLastError());
     return 1;
   }
 
   /*
    * This is sort of insane, but we're implementing a technique described here:
    * http://www.codeproject.com/KB/threads/winspy.aspx#section_2
    *
    * The gist is to use CreateRemoteThread to create a thread in the other
@@ -57,36 +57,36 @@ int main(int argc, char** argv)
    * is the path to the library we want to load. The library we're loading
    * will then do its dirty work inside the other process.
    */
   HMODULE hKernel32 = GetModuleHandleW(L"Kernel32");
   // allocate some memory to hold the path in the remote process
   void*   pLibRemote = VirtualAllocEx(targetProc, nullptr, sizeof(filename),
                                       MEM_COMMIT, PAGE_READWRITE);
   if (pLibRemote == nullptr) {
-    fprintf(stderr, "Error %d in VirtualAllocEx\n", GetLastError());
+    fprintf(stderr, "Error %lu in VirtualAllocEx\n", GetLastError());
     CloseHandle(targetProc);
     return 1;
   }
 
   if (!WriteProcessMemory(targetProc, pLibRemote, (void*)filename,
                           sizeof(filename), nullptr)) {
-    fprintf(stderr, "Error %d in WriteProcessMemory\n", GetLastError());
+    fprintf(stderr, "Error %lu in WriteProcessMemory\n", GetLastError());
     VirtualFreeEx(targetProc, pLibRemote, sizeof(filename), MEM_RELEASE);
     CloseHandle(targetProc);
     return 1;
   }
   // Now create a thread in the target process that will load our DLL
   HANDLE hThread = CreateRemoteThread(
                      targetProc, nullptr, 0,
                      (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32,
                                                             "LoadLibraryW"),
                      pLibRemote, 0, nullptr);
   if (hThread == nullptr) {
-    fprintf(stderr, "Error %d in CreateRemoteThread\n", GetLastError());
+    fprintf(stderr, "Error %lu in CreateRemoteThread\n", GetLastError());
     VirtualFreeEx(targetProc, pLibRemote, sizeof(filename), MEM_RELEASE);
     CloseHandle(targetProc);
     return 1;
   }
   WaitForSingleObject(hThread, INFINITE);
   // Cleanup, not that it's going to matter at this point
   CloseHandle(hThread);
   VirtualFreeEx(targetProc, pLibRemote, sizeof(filename), MEM_RELEASE);
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -277,16 +277,17 @@
 #include "nsIURIMutator.h"
 #include "mozilla/DocumentStyleRootIterator.h"
 #include "mozilla/PendingFullscreenEvent.h"
 #include "mozilla/RestyleManager.h"
 #include "mozilla/ClearOnShutdown.h"
 #include "nsHTMLTags.h"
 #include "NodeUbiReporting.h"
 #include "nsICookieService.h"
+#include "mozilla/net/RequestContextService.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 typedef nsTArray<Link*> LinkArray;
 
 static LazyLogModule gDocumentLeakPRLog("DocumentLeak");
 static LazyLogModule gCspPRLog("CSP");
@@ -2335,17 +2336,17 @@ nsIDocument::ResetToURI(nsIURI* aURI,
 
     // XXXbz what does "just fine" mean exactly?  And given that there
     // is no nsDocShell::SetDocument, what is this talking about?
 
     if (IsContentDocument()) {
       // Inform the associated request context about this load start so
       // any of its internal load progress flags gets reset.
       nsCOMPtr<nsIRequestContextService> rcsvc =
-        do_GetService("@mozilla.org/network/request-context-service;1");
+        mozilla::net::RequestContextService::GetOrCreate();
       if (rcsvc) {
         nsCOMPtr<nsIRequestContext> rc;
         rcsvc->GetRequestContextFromLoadGroup(aLoadGroup, getter_AddRefs(rc));
         if (rc) {
           rc->BeginLoad();
         }
       }
     }
--- a/dom/cache/test/mochitest/test_cache_worker_gc.html
+++ b/dom/cache/test/mochitest/test_cache_worker_gc.html
@@ -32,16 +32,17 @@ function gc() {
 SimpleTest.waitForExplicitFinish();
 
 async function test() {
   let w = await startWorker();
   let weakWorker = SpecialPowers.Cu.getWeakReference(w);
   ok(weakWorker, 'worker supports weak reference');
   w = null;
   await gc();
+  await gc();
   ok(!weakWorker.get(), 'worker weak reference should be garbage collected');
   SimpleTest.finish();
 }
 
 test();
 </script>
 </body>
 </html>
--- a/dom/media/fake-cdm/cdm-test-output-protection.h
+++ b/dom/media/fake-cdm/cdm-test-output-protection.h
@@ -39,17 +39,17 @@ static BOOL CALLBACK EnumDisplayMonitors
   IOPMVideoOutput** opmVideoOutputArray = nullptr;
   HRESULT hr = sOPMGetVideoOutputsFromHMONITORProc(hMonitor,
                                                    OPM_VOS_OPM_SEMANTICS,
                                                    &numVideoOutputs,
                                                    &opmVideoOutputArray);
   if (S_OK != hr) {
     if ((HRESULT)0x8007001f != hr && (HRESULT)0x80070032 != hr && (HRESULT)0xc02625e5 != hr) {
       char msg[100];
-      sprintf(msg, "FAIL OPMGetVideoOutputsFromHMONITOR call failed: HRESULT=0x%08x", hr);
+      sprintf(msg, "FAIL OPMGetVideoOutputsFromHMONITOR call failed: HRESULT=0x%08lx", hr);
       failureMsgs->push_back(msg);
     }
     return true;
   }
 
   DISPLAY_DEVICEA dd;
   ZeroMemory(&dd, sizeof(dd));
   dd.cb = sizeof(dd);
@@ -61,17 +61,17 @@ static BOOL CALLBACK EnumDisplayMonitors
     OPM_RANDOM_NUMBER opmRandomNumber;
     BYTE* certificate = nullptr;
     ULONG certificateLength = 0;
     hr = opmVideoOutputArray[i]->StartInitialization(&opmRandomNumber,
                                                      &certificate,
                                                      &certificateLength);
     if (S_OK != hr) {
       char msg[100];
-      sprintf(msg, "FAIL StartInitialization call failed: HRESULT=0x%08x", hr);
+      sprintf(msg, "FAIL StartInitialization call failed: HRESULT=0x%08lx", hr);
       failureMsgs->push_back(msg);
     }
 
     if (certificate) {
       CoTaskMemFree(certificate);
     }
 
     opmVideoOutputArray[i]->Release();
--- a/dom/workers/MessageEventRunnable.cpp
+++ b/dom/workers/MessageEventRunnable.cpp
@@ -14,17 +14,17 @@
 #include "WorkerPrivate.h"
 #include "WorkerScope.h"
 
 namespace mozilla {
 namespace dom {
 
 MessageEventRunnable::MessageEventRunnable(WorkerPrivate* aWorkerPrivate,
                                            TargetAndBusyBehavior aBehavior)
-  : WorkerRunnable(aWorkerPrivate, aBehavior)
+  : WorkerDebuggeeRunnable(aWorkerPrivate, aBehavior)
   , StructuredCloneHolder(CloningSupported, TransferringSupported,
                           StructuredCloneScope::SameProcessDifferentThread)
 {
 }
 
 bool
 MessageEventRunnable::DispatchDOMEvent(JSContext* aCx,
                                        WorkerPrivate* aWorkerPrivate,
--- a/dom/workers/MessageEventRunnable.h
+++ b/dom/workers/MessageEventRunnable.h
@@ -12,17 +12,17 @@
 #include "mozilla/dom/StructuredCloneHolder.h"
 
 namespace mozilla {
 
 class DOMEventTargetHelper;
 
 namespace dom {
 
-class MessageEventRunnable final : public WorkerRunnable
+class MessageEventRunnable final : public WorkerDebuggeeRunnable
                                  , public StructuredCloneHolder
 {
 public:
   MessageEventRunnable(WorkerPrivate* aWorkerPrivate,
                        TargetAndBusyBehavior aBehavior);
 
   bool
   DispatchDOMEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate,
--- a/dom/workers/WorkerError.cpp
+++ b/dom/workers/WorkerError.cpp
@@ -21,17 +21,17 @@
 #include "WorkerPrivate.h"
 #include "WorkerScope.h"
 
 namespace mozilla {
 namespace dom {
 
 namespace {
 
-class ReportErrorRunnable final : public WorkerRunnable
+class ReportErrorRunnable final : public WorkerDebuggeeRunnable
 {
   WorkerErrorReport mReport;
 
 public:
   // aWorkerPrivate is the worker thread we're on (or the main thread, if null)
   // aTarget is the worker object that we are going to fire an error at
   // (if any).
   static void
@@ -154,17 +154,17 @@ public:
     }
 
     // Otherwise log an error to the error console.
     WorkerErrorReport::LogErrorToConsole(aReport, aInnerWindowId);
   }
 
   ReportErrorRunnable(WorkerPrivate* aWorkerPrivate,
                       const WorkerErrorReport& aReport)
-  : WorkerRunnable(aWorkerPrivate, ParentThreadUnchangedBusyCount),
+  : WorkerDebuggeeRunnable(aWorkerPrivate),
     mReport(aReport)
   { }
 
 private:
   virtual void
   PostDispatch(WorkerPrivate* aWorkerPrivate, bool aDispatchResult) override
   {
     aWorkerPrivate->AssertIsOnWorkerThread();
@@ -235,33 +235,33 @@ private:
 
     ReportError(aCx, parent, fireAtScope,
                 aWorkerPrivate->ParentEventTargetRef(),
                 mReport, innerWindowId);
     return true;
   }
 };
 
-class ReportGenericErrorRunnable final : public WorkerRunnable
+class ReportGenericErrorRunnable final : public WorkerDebuggeeRunnable
 {
 public:
   static void
   CreateAndDispatch(WorkerPrivate* aWorkerPrivate)
   {
     MOZ_ASSERT(aWorkerPrivate);
     aWorkerPrivate->AssertIsOnWorkerThread();
 
     RefPtr<ReportGenericErrorRunnable> runnable =
       new ReportGenericErrorRunnable(aWorkerPrivate);
     runnable->Dispatch();
   }
 
 private:
   explicit ReportGenericErrorRunnable(WorkerPrivate* aWorkerPrivate)
-    : WorkerRunnable(aWorkerPrivate, ParentThreadUnchangedBusyCount)
+    : WorkerDebuggeeRunnable(aWorkerPrivate)
   {
     aWorkerPrivate->AssertIsOnWorkerThread();
   }
 
   void
   PostDispatch(WorkerPrivate* aWorkerPrivate, bool aDispatchResult) override
   {
     aWorkerPrivate->AssertIsOnWorkerThread();
--- a/dom/workers/WorkerPrivate.cpp
+++ b/dom/workers/WorkerPrivate.cpp
@@ -928,23 +928,23 @@ PRThreadFromThread(nsIThread* aThread)
   MOZ_ALWAYS_SUCCEEDS(aThread->GetPRThread(&result));
   MOZ_ASSERT(result);
 
   return result;
 }
 
 // A runnable to cancel the worker from the parent thread when self.close() is
 // called. This runnable is executed on the parent process in order to cancel
-// the current runnable. It uses a normal WorkerRunnable in order to be sure
-// that all the pending WorkerRunnables are executed before this.
-class CancelingOnParentRunnable final : public WorkerRunnable
+// the current runnable. It uses a normal WorkerDebuggeeRunnable in order to be sure
+// that all the pending WorkerDebuggeeRunnables are executed before this.
+class CancelingOnParentRunnable final : public WorkerDebuggeeRunnable
 {
 public:
   explicit CancelingOnParentRunnable(WorkerPrivate* aWorkerPrivate)
-    : WorkerRunnable(aWorkerPrivate, ParentThreadUnchangedBusyCount)
+    : WorkerDebuggeeRunnable(aWorkerPrivate, ParentThreadUnchangedBusyCount)
   {}
 
   bool
   WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override
   {
     aWorkerPrivate->Cancel();
     return true;
   }
--- a/dom/workers/WorkerRunnable.h
+++ b/dom/workers/WorkerRunnable.h
@@ -83,16 +83,31 @@ public:
 
   // See above note about Cancel().
   virtual bool
   IsCanceled() const
   {
     return mCanceled != 0;
   }
 
+  // True if this runnable is handled by running JavaScript in some global that
+  // could possibly be a debuggee, and thus needs to be deferred when the target
+  // is paused in the debugger, until the JavaScript invocation in progress has
+  // run to completion. Examples are MessageEventRunnable and
+  // ReportErrorRunnable. These runnables are segregated into separate
+  // ThrottledEventQueues, which the debugger pauses.
+  //
+  // Note that debugger runnables do not fall in this category, since we don't
+  // support debugging the debugger server at the moment.
+  virtual bool
+  IsDebuggeeRunnable() const
+  {
+    return false;
+  }
+
   static WorkerRunnable*
   FromRunnable(nsIRunnable* aRunnable);
 
 protected:
   WorkerRunnable(WorkerPrivate* aWorkerPrivate,
                  TargetAndBusyBehavior aBehavior = WorkerThreadModifyBusyCount)
 #ifdef DEBUG
   ;
@@ -493,12 +508,50 @@ private:
 
   virtual bool
   WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override;
 
   bool
   DispatchInternal() final;
 };
 
+// Runnables handled by content JavaScript (MessageEventRunnable, JavaScript
+// error reports, and so on) must not be delivered while that content is in the
+// midst of being debugged; the debuggee must be allowed to complete its current
+// JavaScript invocation and return to its own event loop. Only then is it
+// prepared for messages sent from the worker.
+//
+// Runnables that need to be deferred in this way should inherit from this
+// class. They will be routed to mMainThreadDebuggeeEventTarget, which is paused
+// while the window is suspended, as it is whenever the debugger spins its
+// nested event loop. When the debugger leaves its nested event loop, it resumes
+// the window, so that mMainThreadDebuggeeEventTarget will resume delivering
+// runnables from the worker when control returns to the main event loop.
+//
+// When a page enters the bfcache, it freezes all its workers. Since a frozen
+// worker processes only control runnables, it doesn't take any special
+// consideration to prevent WorkerDebuggeeRunnables sent from child to parent
+// workers from running; they'll never run anyway. But WorkerDebuggeeRunnables
+// from a top-level frozen worker to its parent window must not be delivered
+// either, even as the main thread event loop continues to spin. Thus, freezing
+// a top-level worker also pauses mMainThreadDebuggeeEventTarget.
+class WorkerDebuggeeRunnable : public WorkerRunnable
+{
+ protected:
+  WorkerDebuggeeRunnable(WorkerPrivate* aWorkerPrivate,
+                         TargetAndBusyBehavior aBehavior = ParentThreadUnchangedBusyCount)
+    : WorkerRunnable(aWorkerPrivate, aBehavior)
+  { }
+
+ private:
+  // This override is deliberately private: it doesn't make sense to call it if
+  // we know statically that we are a WorkerDebuggeeRunnable.
+  bool
+  IsDebuggeeRunnable() const override
+  {
+    return true;
+  }
+};
+
 } // dom namespace
 } // mozilla namespace
 
 #endif // mozilla_dom_workers_workerrunnable_h__
--- a/gfx/webrender/src/device/gl.rs
+++ b/gfx/webrender/src/device/gl.rs
@@ -740,18 +740,18 @@ pub struct Device {
     gl: Rc<gl::Gl>,
     // device state
     bound_textures: [gl::GLuint; 16],
     bound_program: gl::GLuint,
     bound_vao: gl::GLuint,
     bound_read_fbo: FBOId,
     bound_draw_fbo: FBOId,
     program_mode_id: UniformLocation,
-    default_read_fbo: gl::GLuint,
-    default_draw_fbo: gl::GLuint,
+    default_read_fbo: FBOId,
+    default_draw_fbo: FBOId,
 
     device_pixel_ratio: f32,
     upload_method: UploadMethod,
 
     // HW or API capabilities
     #[cfg(feature = "debug_renderer")]
     capabilities: Capabilities,
 
@@ -783,41 +783,71 @@ pub struct Device {
     /// otherwise are on some drivers, particularly ANGLE), If it's not
     /// supported, we fall back to glTexImage*.
     supports_texture_storage: bool,
 
     // GL extensions
     extensions: Vec<String>,
 }
 
-/// Contains the parameters necessary to bind a texture-backed draw target.
+/// Contains the parameters necessary to bind a draw target.
 #[derive(Clone, Copy)]
-pub struct TextureDrawTarget<'a> {
-    /// The target texture.
-    pub texture: &'a Texture,
-    /// The slice within the texture array to draw to.
-    pub layer: LayerIndex,
-    /// Whether to draw with the texture's associated depth target.
-    pub with_depth: bool,
+pub enum DrawTarget<'a> {
+    /// Use the device's default draw target, with the provided dimensions,
+    /// which are used to set the viewport.
+    Default(DeviceUintSize),
+    /// Use the provided texture.
+    Texture {
+        /// The target texture.
+        texture: &'a Texture,
+        /// The slice within the texture array to draw to.
+        layer: LayerIndex,
+        /// Whether to draw with the texture's associated depth target.
+        with_depth: bool,
+    },
+}
+
+impl<'a> DrawTarget<'a> {
+    /// Returns true if this draw target corresponds to the default framebuffer.
+    pub fn is_default(&self) -> bool {
+        match *self {
+            DrawTarget::Default(..) => true,
+            _ => false,
+        }
+    }
+
+    /// Returns the dimensions of this draw-target.
+    pub fn dimensions(&self) -> DeviceUintSize {
+        match *self {
+            DrawTarget::Default(d) => d,
+            DrawTarget::Texture { texture, .. } => texture.get_dimensions(),
+        }
+    }
 }
 
 /// Contains the parameters necessary to bind a texture-backed read target.
 #[derive(Clone, Copy)]
-pub struct TextureReadTarget<'a> {
-    /// The source texture.
-    pub texture: &'a Texture,
-    /// The slice within the texture array to read from.
-    pub layer: LayerIndex,
+pub enum ReadTarget<'a> {
+    /// Use the device's default draw target.
+    Default,
+    /// Use the provided texture,
+    Texture {
+        /// The source texture.
+        texture: &'a Texture,
+        /// The slice within the texture array to read from.
+        layer: LayerIndex,
+    }
 }
 
-impl<'a> From<TextureDrawTarget<'a>> for TextureReadTarget<'a> {
-    fn from(t: TextureDrawTarget<'a>) -> Self {
-        TextureReadTarget {
-            texture: t.texture,
-            layer: t.layer,
+impl<'a> From<DrawTarget<'a>> for ReadTarget<'a> {
+    fn from(t: DrawTarget<'a>) -> Self {
+        match t {
+            DrawTarget::Default(..) => ReadTarget::Default,
+            DrawTarget::Texture { texture, layer, .. } =>
+                ReadTarget::Texture { texture, layer },
         }
     }
 }
 
 impl Device {
     pub fn new(
         gl: Rc<gl::Gl>,
         resource_override_path: Option<PathBuf>,
@@ -890,18 +920,18 @@ impl Device {
             depth_targets: FastHashMap::default(),
 
             bound_textures: [0; 16],
             bound_program: 0,
             bound_vao: 0,
             bound_read_fbo: FBOId(0),
             bound_draw_fbo: FBOId(0),
             program_mode_id: UniformLocation::INVALID,
-            default_read_fbo: 0,
-            default_draw_fbo: 0,
+            default_read_fbo: FBOId(0),
+            default_draw_fbo: FBOId(0),
 
             max_texture_size,
             renderer_name,
             cached_programs,
             frame_id: FrameId(0),
             extensions,
             supports_texture_storage,
         }
@@ -990,22 +1020,22 @@ impl Device {
         debug_assert!(!self.inside_frame);
         self.inside_frame = true;
 
         // Retrieve the currently set FBO.
         let mut default_read_fbo = [0];
         unsafe {
             self.gl.get_integer_v(gl::READ_FRAMEBUFFER_BINDING, &mut default_read_fbo);
         }
-        self.default_read_fbo = default_read_fbo[0] as gl::GLuint;
+        self.default_read_fbo = FBOId(default_read_fbo[0] as gl::GLuint);
         let mut default_draw_fbo = [0];
         unsafe {
             self.gl.get_integer_v(gl::DRAW_FRAMEBUFFER_BINDING, &mut default_draw_fbo);
         }
-        self.default_draw_fbo = default_draw_fbo[0] as gl::GLuint;
+        self.default_draw_fbo = FBOId(default_draw_fbo[0] as gl::GLuint);
 
         // Texture state
         for i in 0 .. self.bound_textures.len() {
             self.bound_textures[i] = 0;
             self.gl.active_texture(gl::TEXTURE0 + i as gl::GLuint);
             self.gl.bind_texture(gl::TEXTURE_2D, 0);
         }
 
@@ -1014,18 +1044,18 @@ impl Device {
         self.program_mode_id = UniformLocation::INVALID;
         self.gl.use_program(0);
 
         // Vertex state
         self.bound_vao = 0;
         self.gl.bind_vertex_array(0);
 
         // FBO state
-        self.bound_read_fbo = FBOId(self.default_read_fbo);
-        self.bound_draw_fbo = FBOId(self.default_draw_fbo);
+        self.bound_read_fbo = self.default_read_fbo;
+        self.bound_draw_fbo = self.default_draw_fbo;
 
         // Pixel op state
         self.gl.pixel_store_i(gl::UNPACK_ALIGNMENT, 1);
         self.gl.bind_buffer(gl::PIXEL_UNPACK_BUFFER, 0);
 
         // Default is sampler 0, always
         self.gl.active_texture(gl::TEXTURE0);
 
@@ -1061,56 +1091,68 @@ impl Device {
         debug_assert!(self.inside_frame);
 
         if self.bound_read_fbo != fbo_id {
             self.bound_read_fbo = fbo_id;
             fbo_id.bind(self.gl(), FBOTarget::Read);
         }
     }
 
-    pub fn bind_read_target(&mut self, texture_target: Option<TextureReadTarget>) {
-        let fbo_id = texture_target.map_or(FBOId(self.default_read_fbo), |target| {
-            target.texture.fbos[target.layer]
-        });
+    pub fn bind_read_target(&mut self, target: ReadTarget) {
+        let fbo_id = match target {
+            ReadTarget::Default => self.default_read_fbo,
+            ReadTarget::Texture { texture, layer } => texture.fbos[layer],
+        };
 
         self.bind_read_target_impl(fbo_id)
     }
 
     fn bind_draw_target_impl(&mut self, fbo_id: FBOId) {
         debug_assert!(self.inside_frame);
 
         if self.bound_draw_fbo != fbo_id {
             self.bound_draw_fbo = fbo_id;
             fbo_id.bind(self.gl(), FBOTarget::Draw);
         }
     }
 
+    pub fn reset_read_target(&mut self) {
+        let fbo = self.default_read_fbo;
+        self.bind_read_target_impl(fbo);
+    }
+
+
+    pub fn reset_draw_target(&mut self) {
+        let fbo = self.default_draw_fbo;
+        self.bind_draw_target_impl(fbo);
+    }
+
     pub fn bind_draw_target(
         &mut self,
-        texture_target: Option<TextureDrawTarget>,
-        dimensions: Option<DeviceUintSize>,
+        target: DrawTarget,
     ) {
-        let fbo_id = texture_target.map_or(FBOId(self.default_draw_fbo), |target| {
-            if target.with_depth {
-                target.texture.fbos_with_depth[target.layer]
-            } else {
-                target.texture.fbos[target.layer]
+        let (fbo_id, dimensions) = match target {
+            DrawTarget::Default(d) => (self.default_draw_fbo, d),
+            DrawTarget::Texture { texture, layer, with_depth } => {
+                let dim = texture.get_dimensions();
+                if with_depth {
+                    (texture.fbos_with_depth[layer], dim)
+                } else {
+                    (texture.fbos[layer], dim)
+                }
             }
-        });
+        };
 
         self.bind_draw_target_impl(fbo_id);
-
-        if let Some(dimensions) = dimensions {
-            self.gl.viewport(
-                0,
-                0,
-                dimensions.width as _,
-                dimensions.height as _,
-            );
-        }
+        self.gl.viewport(
+            0,
+            0,
+            dimensions.width as _,
+            dimensions.height as _,
+        );
     }
 
     pub fn create_fbo_for_external_texture(&mut self, texture_id: u32) -> FBOId {
         let fbo = FBOId(self.gl.gen_framebuffers(1)[0]);
         fbo.bind(self.gl(), FBOTarget::Draw);
         self.gl.framebuffer_texture_2d(
             gl::DRAW_FRAMEBUFFER,
             gl::COLOR_ATTACHMENT0,
@@ -1415,17 +1457,17 @@ impl Device {
         debug_assert!(dst.height >= src.height);
 
         let rect = DeviceIntRect::new(DeviceIntPoint::zero(), src.get_dimensions().to_i32());
         for (read_fbo, draw_fbo) in src.fbos.iter().zip(&dst.fbos) {
             self.bind_read_target_impl(*read_fbo);
             self.bind_draw_target_impl(*draw_fbo);
             self.blit_render_target(rect, rect);
         }
-        self.bind_read_target(None);
+        self.reset_read_target();
     }
 
     /// Notifies the device that the contents of a render target are no longer
     /// needed.
     ///
     /// FIXME(bholley): We could/should invalidate the depth targets earlier
     /// than the color targets, i.e. immediately after each pass.
     pub fn invalidate_render_target(&mut self, texture: &Texture) {
@@ -2156,18 +2198,18 @@ impl Device {
             index_count,
             gl::UNSIGNED_SHORT,
             0,
             instance_count,
         );
     }
 
     pub fn end_frame(&mut self) {
-        self.bind_draw_target(None, None);
-        self.bind_read_target(None);
+        self.reset_draw_target();
+        self.reset_read_target();
 
         debug_assert!(self.inside_frame);
         self.inside_frame = false;
 
         self.gl.bind_texture(gl::TEXTURE_2D, 0);
         self.gl.use_program(0);
 
         for i in 0 .. self.bound_textures.len() {
--- a/gfx/webrender/src/gpu_glyph_renderer.rs
+++ b/gfx/webrender/src/gpu_glyph_renderer.rs
@@ -2,17 +2,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 //! GPU glyph rasterization using Pathfinder.
 
 use api::{DeviceIntPoint, DeviceIntRect, DeviceUintSize, FontRenderMode};
 use api::{ImageFormat, TextureTarget};
 use debug_colors;
-use device::{Device, Texture, TextureDrawTarget, TextureFilter, VAO};
+use device::{DrawTarget, Device, Texture, TextureFilter, VAO};
 use euclid::{Point2D, Size2D, Transform3D, TypedVector2D, Vector2D};
 use internal_types::RenderTargetInfo;
 use pathfinder_gfx_utils::ShelfBinPacker;
 use profiler::GpuProfileTag;
 use renderer::{self, ImageBufferKind, Renderer, RendererError, RendererStats};
 use renderer::{TextureSampler, VertexArrayKind, ShaderPrecacheFlags};
 use shade::{LazilyCompiledShader, ShaderKind};
 use tiling::GlyphJob;
@@ -189,21 +189,21 @@ impl Renderer {
             1,
         );
         self.device.upload_texture_immediate(&path_info_texture, &path_info_texels);
 
         self.gpu_glyph_renderer.vector_stencil.bind(&mut self.device,
                                                     projection,
                                                     &mut self.renderer_errors);
 
-        self.device.bind_draw_target(Some(TextureDrawTarget {
+        self.device.bind_draw_target(DrawTarget::Texture {
             texture: &current_page.texture,
             layer: 0,
             with_depth: false,
-        }), Some(*target_size));
+        });
         self.device.clear_target(Some([0.0, 0.0, 0.0, 0.0]), None, None);
 
         self.device.set_blend(true);
         self.device.set_blend_mode_subpixel_pass1();
 
         let mut instance_data = vec![];
         for (path_id, &glyph_id) in glyph_indices.iter().enumerate() {
             let glyph = &glyphs[glyph_id];
--- a/gfx/webrender/src/renderer.rs
+++ b/gfx/webrender/src/renderer.rs
@@ -31,17 +31,17 @@ use api::{RenderApiSender, RenderNotifie
 use api::{channel};
 use api::DebugCommand;
 use api::channel::PayloadReceiverHelperMethods;
 use batch::{BatchKind, BatchTextures, BrushBatchKind};
 #[cfg(any(feature = "capture", feature = "replay"))]
 use capture::{CaptureConfig, ExternalCaptureImage, PlainExternalImage};
 use debug_colors;
 use device::{DepthFunction, Device, FrameId, Program, UploadMethod, Texture, PBO};
-use device::{ExternalTexture, FBOId, TextureDrawTarget, TextureReadTarget, TextureSlot};
+use device::{DrawTarget, ExternalTexture, FBOId, ReadTarget, TextureSlot};
 use device::{ShaderError, TextureFilter,
              VertexUsageHint, VAO, VBO, CustomVAO};
 use device::{ProgramCache, ReadPixelsFormat};
 #[cfg(feature = "debug_renderer")]
 use euclid::rect;
 use euclid::Transform3D;
 use frame_builder::{ChasePrimitive, FrameBuilderConfig};
 use gleam::gl;
@@ -1332,22 +1332,21 @@ impl GpuCacheTexture {
                 rows_dirty
             }
             GpuCacheBus::Scatter { ref program, ref vao, count, .. } => {
                 device.disable_depth();
                 device.set_blend(false);
                 device.bind_program(program);
                 device.bind_custom_vao(vao);
                 device.bind_draw_target(
-                    Some(TextureDrawTarget {
+                    DrawTarget::Texture {
                         texture,
                         layer: 0,
                         with_depth: false,
-                    }),
-                    Some(texture.get_dimensions()),
+                    },
                 );
                 device.draw_nonindexed_points(0, count as _);
                 0
             }
         }
     }
 }
 
@@ -2565,17 +2564,17 @@ impl Renderer {
                     });
 
                 if needs_color_clear || clear_depth_value.is_some() {
                     let clear_color = if needs_color_clear {
                         self.clear_color.map(|color| color.to_array())
                     } else {
                         None
                     };
-                    self.device.bind_draw_target(None, None);
+                    self.device.reset_draw_target();
                     self.device.enable_depth_write();
                     self.device.clear_target(clear_color, clear_depth_value, None);
                     self.device.disable_depth_write();
                 }
             }
 
             #[cfg(feature = "replay")]
             self.texture_resolver.external_images.extend(
@@ -2917,18 +2916,17 @@ impl Renderer {
             }
         }
 
         self.profile_counters.vertices.add(6 * data.len());
     }
 
     fn handle_readback_composite(
         &mut self,
-        render_target: Option<TextureDrawTarget>,
-        framebuffer_size: DeviceUintSize,
+        draw_target: DrawTarget,
         scissor_rect: Option<DeviceIntRect>,
         source: &RenderTask,
         backdrop: &RenderTask,
         readback: &RenderTask,
     ) {
         if scissor_rect.is_some() {
             self.device.disable_scissor();
         }
@@ -2950,43 +2948,44 @@ impl Renderer {
             RenderTaskKind::Picture(ref task_info) => task_info.content_origin,
             _ => panic!("bug: composite on non-picture?"),
         };
 
         // Bind the FBO to blit the backdrop to.
         // Called per-instance in case the layer (and therefore FBO)
         // changes. The device will skip the GL call if the requested
         // target is already bound.
-        let cache_draw_target = TextureDrawTarget {
+        let cache_draw_target = DrawTarget::Texture {
             texture: cache_texture,
             layer: readback_layer.0 as usize,
             with_depth: false,
         };
-        self.device.bind_draw_target(Some(cache_draw_target), None);
+        self.device.bind_draw_target(cache_draw_target);
 
         let mut src = DeviceIntRect::new(
             source_screen_origin + (backdrop_rect.origin - backdrop_screen_origin),
             readback_rect.size,
         );
         let mut dest = readback_rect.to_i32();
 
         // Need to invert the y coordinates and flip the image vertically when
         // reading back from the framebuffer.
-        if render_target.is_none() {
-            src.origin.y = framebuffer_size.height as i32 - src.size.height - src.origin.y;
+        if draw_target.is_default() {
+            src.origin.y = draw_target.dimensions().height as i32 - src.size.height - src.origin.y;
             dest.origin.y += dest.size.height;
             dest.size.height = -dest.size.height;
         }
 
-        self.device.bind_read_target(render_target.map(|r| r.into()));
+        self.device.bind_read_target(draw_target.into());
         self.device.blit_render_target(src, dest);
 
-        // Restore draw target to current pass render target + layer.
-        // Note: leaving the viewport unchanged, it's not a part of FBO state
-        self.device.bind_draw_target(render_target, None);
+        // Restore draw target to current pass render target + layer, and reset
+        // the read target.
+        self.device.bind_draw_target(draw_target);
+        self.device.reset_read_target();
 
         if scissor_rect.is_some() {
             self.device.enable_scissor();
         }
     }
 
     fn handle_blits(
         &mut self,
@@ -3003,29 +3002,29 @@ impl Renderer {
         //           If if ever shows up as an issue, we can easily batch them.
         for blit in blits {
             let source_rect = match blit.source {
                 BlitJobSource::Texture(texture_id, layer, source_rect) => {
                     // A blit from a texture into this target.
                     let texture = self.texture_resolver
                         .resolve(&texture_id)
                         .expect("BUG: invalid source texture");
-                    self.device.bind_read_target(Some(TextureReadTarget { texture, layer: layer as usize }));
+                    self.device.bind_read_target(ReadTarget::Texture { texture, layer: layer as usize });
                     source_rect
                 }
                 BlitJobSource::RenderTask(task_id) => {
                     // A blit from the child render task into this target.
                     // TODO(gw): Support R8 format here once we start
                     //           creating mips for alpha masks.
                     let texture = self.texture_resolver
                         .resolve(&TextureSource::PrevPassColor)
                         .expect("BUG: invalid source texture");
                     let source = &render_tasks[task_id];
                     let (source_rect, layer) = source.get_target_rect();
-                    self.device.bind_read_target(Some(TextureReadTarget { texture, layer: layer.0 }));
+                    self.device.bind_read_target(ReadTarget::Texture { texture, layer: layer.0 });
                     source_rect
                 }
             };
             debug_assert_eq!(source_rect.size, blit.target_rect.size);
             self.device.blit_render_target(
                 source_rect,
                 blit.target_rect,
             );
@@ -3062,75 +3061,78 @@ impl Renderer {
             VertexArrayKind::Scale,
             &BatchTextures::no_texture(),
             stats,
         );
     }
 
     fn draw_color_target(
         &mut self,
-        render_target: Option<TextureDrawTarget>,
+        draw_target: DrawTarget,
         target: &ColorRenderTarget,
         framebuffer_target_rect: DeviceUintRect,
-        target_size: DeviceUintSize,
         depth_is_ready: bool,
         clear_color: Option<[f32; 4]>,
         render_tasks: &RenderTaskTree,
         projection: &Transform3D<f32>,
         frame_id: FrameId,
         stats: &mut RendererStats,
     ) {
         self.profile_counters.color_targets.inc();
         let _gm = self.gpu_profile.start_marker("color target");
 
         // sanity check for the depth buffer
-        if let Some(t) = render_target {
-            assert!(t.texture.supports_depth() >= target.needs_depth());
+        if let DrawTarget::Texture { texture, .. } = draw_target {
+            assert!(texture.supports_depth() >= target.needs_depth());
         }
 
-        let framebuffer_kind = if render_target.is_none() {
+        let framebuffer_kind = if draw_target.is_default() {
             FramebufferKind::Main
         } else {
             FramebufferKind::Other
         };
 
         {
             let _timer = self.gpu_profile.start_timer(GPU_TAG_SETUP_TARGET);
-            self.device
-                .bind_draw_target(render_target, Some(target_size));
+            self.device.bind_draw_target(draw_target);
             self.device.disable_depth();
             self.set_blend(false, framebuffer_kind);
 
             let depth_clear = if !depth_is_ready && target.needs_depth() {
                 self.device.enable_depth_write();
                 Some(1.0)
             } else {
                 None
             };
 
-            let clear_rect = if render_target.is_some() {
+            let clear_rect = if !draw_target.is_default() {
                 if self.enable_clear_scissor {
                     // TODO(gw): Applying a scissor rect and minimal clear here
                     // is a very large performance win on the Intel and nVidia
                     // GPUs that I have tested with. It's possible it may be a
                     // performance penalty on other GPU types - we should test this
                     // and consider different code paths.
+                    //
+                    // Note: The above measurements were taken when render
+                    // target slices were minimum 2048x2048. Now that we size
+                    // them adaptively, this may be less of a win (except perhaps
+                    // on a mostly-unused last slice of a large texture array).
                     Some(target.used_rect())
                 } else {
                     None
                 }
-            } else if framebuffer_target_rect == DeviceUintRect::new(DeviceUintPoint::zero(), target_size) {
+            } else if framebuffer_target_rect == DeviceUintRect::new(DeviceUintPoint::zero(), draw_target.dimensions()) {
                 // whole screen is covered, no need for scissor
                 None
             } else {
                 let mut rect = framebuffer_target_rect.to_i32();
                 // Note: `framebuffer_target_rect` needs a Y-flip before going to GL
                 // Note: at this point, the target rectangle is not guaranteed to be within the main framebuffer bounds
                 // but `clear_target_rect` is totally fine with negative origin, as long as width & height are positive
-                rect.origin.y = target_size.height as i32 - rect.origin.y - rect.size.height;
+                rect.origin.y = draw_target.dimensions().height as i32 - rect.origin.y - rect.size.height;
                 Some(rect)
             };
 
             self.device.clear_target(clear_color, depth_clear, clear_rect);
 
             if depth_clear.is_some() {
                 self.device.disable_depth_write();
             }
@@ -3182,21 +3184,21 @@ impl Renderer {
             //Note: depth equality is needed for split planes
             self.device.set_depth_func(DepthFunction::LessEqual);
             self.device.enable_depth();
             self.device.enable_depth_write();
 
             for alpha_batch_container in &target.alpha_batch_containers {
                 if let Some(target_rect) = alpha_batch_container.target_rect {
                     // Note: `framebuffer_target_rect` needs a Y-flip before going to GL
-                    let rect = if render_target.is_none() {
+                    let rect = if draw_target.is_default() {
                         let mut rect = target_rect
                             .intersection(&framebuffer_target_rect.to_i32())
                             .unwrap_or(DeviceIntRect::zero());
-                        rect.origin.y = target_size.height as i32 - rect.origin.y - rect.size.height;
+                        rect.origin.y = draw_target.dimensions().height as i32 - rect.origin.y - rect.size.height;
                         rect
                     } else {
                         target_rect
                     };
                     self.device.enable_scissor();
                     self.device.set_scissor_rect(rect);
                 }
 
@@ -3235,21 +3237,21 @@ impl Renderer {
         let _gl = self.gpu_profile.start_marker("alpha batches");
         let transparent_sampler = self.gpu_profile.start_sampler(GPU_SAMPLER_TAG_TRANSPARENT);
         self.set_blend(true, framebuffer_kind);
         let mut prev_blend_mode = BlendMode::None;
 
         for alpha_batch_container in &target.alpha_batch_containers {
             if let Some(target_rect) = alpha_batch_container.target_rect {
                 // Note: `framebuffer_target_rect` needs a Y-flip before going to GL
-                let rect = if render_target.is_none() {
+                let rect = if draw_target.is_default() {
                     let mut rect = target_rect
                         .intersection(&framebuffer_target_rect.to_i32())
                         .unwrap_or(DeviceIntRect::zero());
-                    rect.origin.y = target_size.height as i32 - rect.origin.y - rect.size.height;
+                    rect.origin.y = draw_target.dimensions().height as i32 - rect.origin.y - rect.size.height;
                     rect
                 } else {
                     target_rect
                 };
                 self.device.enable_scissor();
                 self.device.set_scissor_rect(rect);
             }
 
@@ -3299,18 +3301,17 @@ impl Renderer {
                 }
 
                 // Handle special case readback for composites.
                 if let BatchKind::Brush(BrushBatchKind::MixBlend { task_id, source_id, backdrop_id }) = batch.key.kind {
                     // composites can't be grouped together because
                     // they may overlap and affect each other.
                     debug_assert_eq!(batch.instances.len(), 1);
                     self.handle_readback_composite(
-                        render_target,
-                        target_size,
+                        draw_target,
                         alpha_batch_container.target_rect,
                         &render_tasks[source_id],
                         &render_tasks[task_id],
                         &render_tasks[backdrop_id],
                     );
                 }
 
                 let _timer = self.gpu_profile.start_timer(batch.key.kind.sampler_tag());
@@ -3375,41 +3376,39 @@ impl Renderer {
                 };
                 let (src_rect, _) = render_tasks[output.task_id].get_target_rect();
                 let mut dest_rect = DeviceIntRect::new(DeviceIntPoint::zero(), output_size);
 
                 // Invert Y coordinates, to correctly convert between coordinate systems.
                 dest_rect.origin.y += dest_rect.size.height;
                 dest_rect.size.height *= -1;
 
-                self.device.bind_read_target(render_target.map(|r| r.into()));
+                self.device.bind_read_target(draw_target.into());
                 self.device.bind_external_draw_target(fbo_id);
                 self.device.blit_render_target(src_rect, dest_rect);
                 handler.unlock(output.pipeline_id);
             }
         }
     }
 
     fn draw_alpha_target(
         &mut self,
-        render_target: TextureDrawTarget,
+        draw_target: DrawTarget,
         target: &AlphaRenderTarget,
-        target_size: DeviceUintSize,
         projection: &Transform3D<f32>,
         render_tasks: &RenderTaskTree,
         stats: &mut RendererStats,
     ) {
         self.profile_counters.alpha_targets.inc();
         let _gm = self.gpu_profile.start_marker("alpha target");
         let alpha_sampler = self.gpu_profile.start_sampler(GPU_SAMPLER_TAG_ALPHA);
 
         {
             let _timer = self.gpu_profile.start_timer(GPU_TAG_SETUP_TARGET);
-            self.device
-                .bind_draw_target(Some(render_target), Some(target_size));
+            self.device.bind_draw_target(draw_target);
             self.device.disable_depth();
             self.device.disable_depth_write();
 
             // TODO(gw): Applying a scissor rect and minimal clear here
             // is a very large performance win on the Intel and nVidia
             // GPUs that I have tested with. It's possible it may be a
             // performance penalty on other GPU types - we should test this
             // and consider different code paths.
@@ -3564,21 +3563,21 @@ impl Renderer {
 
         // Handle any Pathfinder glyphs.
         let stencil_page = self.stencil_glyphs(&target.glyphs, &projection, &target_size, stats);
 
         {
             let texture = self.texture_resolver
                 .resolve(&texture_source)
                 .expect("BUG: invalid target texture");
-            self.device.bind_draw_target(Some(TextureDrawTarget {
+            self.device.bind_draw_target(DrawTarget::Texture {
                 texture,
                 layer,
                 with_depth: false,
-            }), Some(target_size));
+            });
         }
 
         self.device.disable_depth();
         self.device.disable_depth_write();
         self.set_blend(false, FramebufferKind::Other);
 
         for rect in &target.clears {
             self.device.clear_target(Some([0.0, 0.0, 0.0, 0.0]), None, Some(*rect));
@@ -3796,27 +3795,40 @@ impl Renderer {
     /// been used in the last 30 frames, since we could otherwise end up
     /// keeping an enormous target alive indefinitely by constantly using it
     /// in situations where a much smaller target would suffice.
     fn allocate_target_texture<T: RenderTarget>(
         &mut self,
         list: &mut RenderTargetList<T>,
         counters: &mut FrameProfileCounters,
     ) -> Option<ActiveTexture> {
-        debug_assert_ne!(list.max_size, DeviceUintSize::zero());
         if list.targets.is_empty() {
             return None
         }
 
+        // Get a bounding rect of all the layers, and round it up to a multiple
+        // of 256. This improves render target reuse when resizing the window,
+        // since we don't need to create a new render target for each slightly-
+        // larger frame.
+        let mut bounding_rect = DeviceIntRect::zero();
+        for t in list.targets.iter() {
+            bounding_rect = t.used_rect().union(&bounding_rect);
+        }
+        debug_assert_eq!(bounding_rect.origin, DeviceIntPoint::zero());
+        let dimensions = DeviceUintSize::new(
+            (bounding_rect.size.width as u32 + 255) & !255,
+            (bounding_rect.size.height as u32 + 255) & !255,
+        );
+
         counters.targets_used.inc();
 
         // Try finding a match in the existing pool. If there's no match, we'll
         // create a new texture.
         let selector = TargetSelector {
-            size: list.max_size,
+            size: dimensions,
             num_layers: list.targets.len(),
             format: list.format,
         };
         let index = self.texture_resolver.render_target_pool
             .iter()
             .position(|texture| {
                 selector == TargetSelector {
                     size: texture.get_dimensions(),
@@ -3830,18 +3842,18 @@ impl Renderer {
             let mut t = self.texture_resolver.render_target_pool.swap_remove(idx);
             self.device.reuse_render_target::<u8>(&mut t, rt_info);
             t
         } else {
             counters.targets_created.inc();
             self.device.create_texture(
                 TextureTarget::Array,
                 list.format,
-                list.max_size.width,
-                list.max_size.height,
+                dimensions.width,
+                dimensions.height,
                 TextureFilter::Linear,
                 Some(rt_info),
                 list.targets.len() as _,
             )
         };
 
         list.check_ready(&texture);
         Some(ActiveTexture {
@@ -3939,20 +3951,19 @@ impl Renderer {
                             framebuffer_size.width as f32,
                             framebuffer_size.height as f32,
                             0.0,
                             ORTHO_NEAR_PLANE,
                             ORTHO_FAR_PLANE,
                         );
 
                         self.draw_color_target(
-                            None,
+                            DrawTarget::Default(framebuffer_size),
                             target,
                             frame.inner_rect,
-                            framebuffer_size,
                             framebuffer_depth_is_ready,
                             clear_color,
                             &frame.render_tasks,
                             &projection,
                             frame_id,
                             stats,
                         );
                     }
@@ -3975,61 +3986,61 @@ impl Renderer {
                                 &frame.render_tasks,
                                 stats,
                             );
                         }
                     }
 
                     for (target_index, target) in alpha.targets.iter().enumerate() {
                         stats.alpha_target_count += 1;
+                        let draw_target = DrawTarget::Texture {
+                            texture: &alpha_tex.as_ref().unwrap().texture,
+                            layer: target_index,
+                            with_depth: false,
+                        };
 
                         let projection = Transform3D::ortho(
                             0.0,
-                            alpha.max_size.width as f32,
+                            draw_target.dimensions().width as f32,
                             0.0,
-                            alpha.max_size.height as f32,
+                            draw_target.dimensions().height as f32,
                             ORTHO_NEAR_PLANE,
                             ORTHO_FAR_PLANE,
                         );
 
                         self.draw_alpha_target(
-                            TextureDrawTarget {
-                                texture: &alpha_tex.as_ref().unwrap().texture,
-                                layer: target_index,
-                                with_depth: false,
-                            },
+                            draw_target,
                             target,
-                            alpha.max_size,
                             &projection,
                             &frame.render_tasks,
                             stats,
                         );
                     }
 
                     for (target_index, target) in color.targets.iter().enumerate() {
                         stats.color_target_count += 1;
+                        let draw_target = DrawTarget::Texture {
+                            texture: &color_tex.as_ref().unwrap().texture,
+                            layer: target_index,
+                            with_depth: target.needs_depth(),
+                        };
 
                         let projection = Transform3D::ortho(
                             0.0,
-                            color.max_size.width as f32,
+                            draw_target.dimensions().width as f32,
                             0.0,
-                            color.max_size.height as f32,
+                            draw_target.dimensions().height as f32,
                             ORTHO_NEAR_PLANE,
                             ORTHO_FAR_PLANE,
                         );
 
                         self.draw_color_target(
-                            Some(TextureDrawTarget {
-                                texture: &color_tex.as_ref().unwrap().texture,
-                                layer: target_index,
-                                with_depth: target.needs_depth(),
-                            }),
+                            draw_target,
                             target,
                             frame.inner_rect,
-                            color.max_size,
                             false,
                             Some([0.0, 0.0, 0.0, 0.0]),
                             &frame.render_tasks,
                             &projection,
                             frame_id,
                             stats,
                         );
                     }
@@ -4136,17 +4147,17 @@ impl Renderer {
 
         let mut target_index = 0;
         for texture in &self.texture_resolver.render_target_pool {
             let dimensions = texture.get_dimensions();
             let src_rect = DeviceIntRect::new(DeviceIntPoint::zero(), dimensions.to_i32());
 
             let layer_count = texture.get_layer_count() as usize;
             for layer in 0 .. layer_count {
-                self.device.bind_read_target(Some(TextureReadTarget { texture, layer }));
+                self.device.bind_read_target(ReadTarget::Texture { texture, layer });
                 let x = fb_width - (spacing + size) * (target_index + 1);
                 let y = spacing;
 
                 let dest_rect = rect(x, y, size, size);
                 self.device.blit_render_target(src_rect, dest_rect);
                 target_index += 1;
             }
         }
@@ -4183,17 +4194,17 @@ impl Renderer {
             let dimensions = texture.get_dimensions();
             let src_rect = DeviceIntRect::new(
                 DeviceIntPoint::zero(),
                 DeviceIntSize::new(dimensions.width as i32, dimensions.height as i32),
             );
 
             let layer_count = texture.get_layer_count() as usize;
             for layer in 0 .. layer_count {
-                self.device.bind_read_target(Some(TextureReadTarget { texture, layer}));
+                self.device.bind_read_target(ReadTarget::Texture { texture, layer});
 
                 let x = fb_width - (spacing + size) * (i as i32 + 1);
 
                 // If we have more targets than fit on one row in screen, just early exit.
                 if x > fb_width {
                     return;
                 }
 
@@ -4290,23 +4301,23 @@ impl Renderer {
         pixels
     }
 
     pub fn read_gpu_cache(&mut self) -> (DeviceUintSize, Vec<u8>) {
         let texture = self.gpu_cache_texture.texture.as_ref().unwrap();
         let size = texture.get_dimensions();
         let mut texels = vec![0; (size.width * size.height * 16) as usize];
         self.device.begin_frame();
-        self.device.bind_read_target(Some(TextureReadTarget { texture, layer: 0 }));
+        self.device.bind_read_target(ReadTarget::Texture { texture, layer: 0 });
         self.device.read_pixels_into(
             DeviceUintRect::new(DeviceUintPoint::zero(), size),
             ReadPixelsFormat::Standard(ImageFormat::RGBAF32),
             &mut texels,
         );
-        self.device.bind_read_target(None);
+        self.device.reset_read_target();
         self.device.end_frame();
         (size, texels)
     }
 
     // De-initialize the Renderer safely, assuming the GL is still alive and active.
     pub fn deinit(mut self) {
         //Note: this is a fake frame, only needed because texture deletion is require to happen inside a frame
         self.device.begin_frame();
@@ -4903,17 +4914,17 @@ impl Renderer {
                 info!("\t{}", file_name);
                 let plain = Self::save_texture(texture, &file_name, &config.root, &mut self.device);
                 plain_self.textures.insert(*id, plain);
             }
 
             config.serialize(&plain_self, "renderer");
         }
 
-        self.device.bind_read_target(None);
+        self.device.reset_read_target();
         self.device.end_frame();
         info!("done.");
     }
 
     #[cfg(feature = "replay")]
     fn load_capture(
         &mut self, root: PathBuf, plain_externals: Vec<PlainExternalImage>
     ) {
--- a/gfx/webrender/src/tiling.rs
+++ b/gfx/webrender/src/tiling.rs
@@ -23,20 +23,25 @@ use render_backend::FrameResources;
 use render_task::{BlitSource, RenderTaskAddress, RenderTaskId, RenderTaskKind};
 use render_task::{BlurTask, ClearMode, GlyphTask, RenderTaskLocation, RenderTaskTree, ScalingTask};
 use resource_cache::ResourceCache;
 use std::{cmp, usize, f32, i32, mem};
 use texture_allocator::GuillotineAllocator;
 #[cfg(feature = "pathfinder")]
 use webrender_api::{DevicePixel, FontRenderMode};
 
-const MIN_TARGET_SIZE: u32 = 2048;
 const STYLE_SOLID: i32 = ((BorderStyle::Solid as i32) << 8) | ((BorderStyle::Solid as i32) << 16);
 const STYLE_MASK: i32 = 0x00FF_FF00;
 
+/// According to apitrace, textures larger than 2048 break fast clear
+/// optimizations on some intel drivers. We sometimes need to go larger, but
+/// we try to avoid it. This can go away when proper tiling support lands,
+/// since we can then split large primitives across multiple textures.
+const IDEAL_MAX_TEXTURE_DIMENSION: u32 = 2048;
+
 /// Identifies a given `RenderTarget` in a `RenderTargetList`.
 #[derive(Debug, Copy, Clone)]
 #[cfg_attr(feature = "capture", derive(Serialize))]
 #[cfg_attr(feature = "replay", derive(Deserialize))]
 pub struct RenderTargetIndex(pub usize);
 
 pub struct RenderTargetContext<'a, 'rc> {
     pub device_pixel_scale: DevicePixelScale,
@@ -185,30 +190,36 @@ pub enum RenderTargetKind {
 ///
 /// Note that in some cases (like drop-shadows), we can depend on the output of
 /// a pass earlier than the immediately-preceding pass. See `SavedTargetIndex`.
 #[cfg_attr(feature = "capture", derive(Serialize))]
 #[cfg_attr(feature = "replay", derive(Deserialize))]
 pub struct RenderTargetList<T> {
     screen_size: DeviceIntSize,
     pub format: ImageFormat,
+    /// The maximum width and height of any single primitive we've encountered.
+    ///
+    /// We initially create our per-slice allocators with a width and height of
+    /// IDEAL_MAX_TEXTURE_DIMENSION. If we encounter a larger primitive, the
+    /// allocation will fail, but we'll bump max_size, which will cause the
+    /// allocator for the next slice to be just large enough to accomodate it.
     pub max_size: DeviceUintSize,
     pub targets: Vec<T>,
     pub saved_index: Option<SavedTargetIndex>,
 }
 
 impl<T: RenderTarget> RenderTargetList<T> {
     fn new(
         screen_size: DeviceIntSize,
         format: ImageFormat,
     ) -> Self {
         RenderTargetList {
             screen_size,
             format,
-            max_size: DeviceUintSize::new(MIN_TARGET_SIZE, MIN_TARGET_SIZE),
+            max_size: DeviceUintSize::new(0, 0),
             targets: Vec::new(),
             saved_index: None,
         }
     }
 
     fn build(
         &mut self,
         ctx: &mut RenderTargetContext,
@@ -263,17 +274,24 @@ impl<T: RenderTarget> RenderTargetList<T
     ) -> (DeviceUintPoint, RenderTargetIndex) {
         let existing_origin = self.targets
             .last_mut()
             .and_then(|target| target.allocate(alloc_size));
 
         let origin = match existing_origin {
             Some(origin) => origin,
             None => {
-                let mut new_target = T::new(Some(self.max_size), self.screen_size);
+                // Have the allocator restrict slice sizes to our max ideal
+                // dimensions, unless we've already gone bigger on a previous
+                // slice.
+                let allocator_dimensions = DeviceUintSize::new(
+                    cmp::max(IDEAL_MAX_TEXTURE_DIMENSION, self.max_size.width),
+                    cmp::max(IDEAL_MAX_TEXTURE_DIMENSION, self.max_size.height),
+                );
+                let mut new_target = T::new(Some(allocator_dimensions), self.screen_size);
                 let origin = new_target.allocate(alloc_size).expect(&format!(
                     "Each render task must allocate <= size of one target! ({})",
                     alloc_size
                 ));
                 self.targets.push(new_target);
                 origin
             }
         };
@@ -281,17 +299,19 @@ impl<T: RenderTarget> RenderTargetList<T
         (origin, RenderTargetIndex(self.targets.len() - 1))
     }
 
     pub fn needs_depth(&self) -> bool {
         self.targets.iter().any(|target| target.needs_depth())
     }
 
     pub fn check_ready(&self, t: &Texture) {
-        assert_eq!(t.get_dimensions(), self.max_size);
+        let dimensions = t.get_dimensions();
+        assert!(dimensions.width >= self.max_size.width);
+        assert!(dimensions.height >= self.max_size.height);
         assert_eq!(t.get_format(), self.format);
         assert_eq!(t.get_layer_count() as usize, self.targets.len());
         assert!(t.supports_depth() >= self.needs_depth());
     }
 }
 
 /// Frame output information for a given pipeline ID.
 /// Storing the task ID allows the renderer to find
--- a/gfx/webrender_bindings/revision.txt
+++ b/gfx/webrender_bindings/revision.txt
@@ -1,1 +1,1 @@
-a7052abfe8e41bcc8904cb5b3add99735fedcd1f
+e7d340b0f39bbd0046e983a75245bdde54013cdb
--- a/intl/hyphenation/hyphen/hyphen.c
+++ b/intl/hyphenation/hyphen/hyphen.c
@@ -441,17 +441,17 @@ for (k = 0; k < 2; k++) {
     while (fgets(buf, sizeof(buf), f) != NULL) {
       
       /* discard lines that don't fit in buffer */
       if (!feof(f) && strchr(buf, '\n') == NULL) {
         int c;
         while ((c = fgetc(f)) != '\n' && c != EOF);
         /* issue warning if not a comment */
         if (buf[0] != '%') {
-          fprintf(stderr, "Warning: skipping too long pattern (more than %lu chars)\n", sizeof(buf));
+          fprintf(stderr, "Warning: skipping too long pattern (more than %zu chars)\n", sizeof(buf));
         }
         continue;
       }
       
       if (strncmp(buf, "NEXTLEVEL", 9) == 0) {
         nextlevel = 1;
         break;
       } else if (buf[0] != '%') {
--- a/ipc/mscom/MainThreadRuntime.cpp
+++ b/ipc/mscom/MainThreadRuntime.cpp
@@ -20,28 +20,16 @@
 #include "nsWindowsHelpers.h"
 #include "nsXULAppAPI.h"
 
 #include <accctrl.h>
 #include <aclapi.h>
 #include <objbase.h>
 #include <objidl.h>
 
-namespace {
-
-struct LocalFreeDeleter
-{
-  void operator()(void* aPtr)
-  {
-    ::LocalFree(aPtr);
-  }
-};
-
-} // anonymous namespace
-
 // This API from oleaut32.dll is not declared in Windows SDK headers
 extern "C" void __cdecl SetOaNoCache(void);
 
 namespace mozilla {
 namespace mscom {
 
 MainThreadRuntime* MainThreadRuntime::sInstance = nullptr;
 
--- a/js/public/Stream.h
+++ b/js/public/Stream.h
@@ -215,17 +215,17 @@ NewReadableExternalSourceStreamObject(JS
  * when creating the given stream.
  *
  * Asserts that |stream| is a ReadableStream object or an unwrappable wrapper
  * for one.
  *
  * Asserts that the given stream has an embedding-provided underlying source.
  */
 extern JS_PUBLIC_API(bool)
-ReadableStreamGetEmbeddingFlags(JSContext* cx, const JSObject* stream, uint8_t* flags);
+ReadableStreamGetEmbeddingFlags(JSContext* cx, HandleObject stream, uint8_t* flags);
 
 /**
  * Returns the embedding-provided underlying source of the given |stream|.
  *
  * Can be used to optimize operations if both the underlying source and the
  * intended sink are embedding-provided. In that case it might be
  * preferrable to pipe data directly from source to sink without interacting
  * with the stream at all.
@@ -257,17 +257,17 @@ ReadableStreamGetExternalUnderlyingSourc
  * ReadableStreamGetExternalUnderlyingSource.
  *
  * Asserts that |stream| is a ReadableStream object or an unwrappable wrapper
  * for one.
  *
  * Asserts that the stream has an embedding-provided underlying source.
  */
 extern JS_PUBLIC_API(bool)
-ReadableStreamReleaseExternalUnderlyingSource(JSContext* cx, JSObject* stream);
+ReadableStreamReleaseExternalUnderlyingSource(JSContext* cx, HandleObject stream);
 
 /**
  * Update the amount of data available at the underlying source of the given
  * |stream|.
  *
  * Can only be used for streams with an embedding-provided underlying source.
  * The JS engine will use the given value to satisfy read requests for the
  * stream by invoking the JS::WriteIntoReadRequestBuffer callback.
@@ -279,80 +279,80 @@ extern JS_PUBLIC_API(bool)
 ReadableStreamUpdateDataAvailableFromSource(JSContext* cx, HandleObject stream,
                                             uint32_t availableData);
 
 /**
  * Returns true if the given object is a ReadableStream object or an
  * unwrappable wrapper for one, false otherwise.
  */
 extern JS_PUBLIC_API(bool)
-IsReadableStream(const JSObject* obj);
+IsReadableStream(JSObject* obj);
 
 /**
  * Returns true if the given object is a ReadableStreamDefaultReader or
  * ReadableStreamBYOBReader object or an unwrappable wrapper for one, false
  * otherwise.
  */
 extern JS_PUBLIC_API(bool)
-IsReadableStreamReader(const JSObject* obj);
+IsReadableStreamReader(JSObject* obj);
 
 /**
  * Returns true if the given object is a ReadableStreamDefaultReader object
  * or an unwrappable wrapper for one, false otherwise.
  */
 extern JS_PUBLIC_API(bool)
-IsReadableStreamDefaultReader(const JSObject* obj);
+IsReadableStreamDefaultReader(JSObject* obj);
 
 enum class ReadableStreamMode {
     Default,
     Byte,
     ExternalSource
 };
 
 /**
  * Returns the stream's ReadableStreamMode. If the mode is |Byte| or
  * |ExternalSource|, it's possible to acquire a BYOB reader for more optimized
  * operations.
  *
  * Asserts that |stream| is a ReadableStream object or an unwrappable wrapper
  * for one.
  */
 extern JS_PUBLIC_API(bool)
-ReadableStreamGetMode(JSContext* cx, const JSObject* stream, ReadableStreamMode* mode);
+ReadableStreamGetMode(JSContext* cx, HandleObject stream, ReadableStreamMode* mode);
 
 enum class ReadableStreamReaderMode {
     Default
 };
 
 /**
  * Returns true if the given ReadableStream is readable, false if not.
  *
  * Asserts that |stream| is a ReadableStream object or an unwrappable wrapper
  * for one.
  */
 extern JS_PUBLIC_API(bool)
-ReadableStreamIsReadable(JSContext* cx, const JSObject* stream, bool* result);
+ReadableStreamIsReadable(JSContext* cx, HandleObject stream, bool* result);
 
 /**
  * Returns true if the given ReadableStream is locked, false if not.
  *
  * Asserts that |stream| is a ReadableStream object or an unwrappable wrapper
  * for one.
  */
 extern JS_PUBLIC_API(bool)
-ReadableStreamIsLocked(JSContext* cx, const JSObject* stream, bool* result);
+ReadableStreamIsLocked(JSContext* cx, HandleObject stream, bool* result);
 
 /**
  * Returns true if the given ReadableStream is disturbed, false if not.
  *
  * Asserts that |stream| is a ReadableStream object or an unwrappable wrapper
  * for one.
  */
 extern JS_PUBLIC_API(bool)
-ReadableStreamIsDisturbed(JSContext* cx, const JSObject* stream, bool* result);
+ReadableStreamIsDisturbed(JSContext* cx, HandleObject stream, bool* result);
 
 /**
  * Cancels the given ReadableStream with the given reason and returns a
  * Promise resolved according to the result.
  *
  * Asserts that |stream| is a ReadableStream object or an unwrappable wrapper
  * for one.
  */
@@ -417,17 +417,17 @@ ReadableStreamClose(JSContext* cx, Handl
 
 /**
  * Returns true if the given ReadableStream reader is locked, false otherwise.
  *
  * Asserts that |reader| is a ReadableStreamDefaultReader or
  * ReadableStreamBYOBReader object or an unwrappable wrapper for one.
  */
 extern JS_PUBLIC_API(bool)
-ReadableStreamReaderIsClosed(JSContext* cx, const JSObject* reader, bool* result);
+ReadableStreamReaderIsClosed(JSContext* cx, HandleObject reader, bool* result);
 
 /**
  * Enqueues the given chunk in the given ReadableStream.
  *
  * Throws a TypeError and returns false if the enqueing operation fails.
  *
  * Note: This is semantically equivalent to the |enqueue| method on
  * the stream controller's prototype in JS. We expose it with the stream
--- a/js/src/doc/Debugger/Debugger.Frame.md
+++ b/js/src/doc/Debugger/Debugger.Frame.md
@@ -88,16 +88,85 @@ 4. When the debuggee code completes, whe
    debugger.
 
 When a debugger calls an invocation function to run debuggee code, that
 code's continuation is the debugger, not the next debuggee code frame.
 Pushing a `"debugger"` frame makes this continuation explicit, and makes it
 easier to find the extent of the stack created for the invocation.
 
 
+## <span id='suspended'>Suspended</span> Frames
+
+Some frames can be *suspended*.
+
+When a generator `yield`s a value, or when an async function `await`s a
+value, the current frame is suspended and removed from the stack, and
+other JS code has a chance to run. Later (if the `await`ed promise
+becomes resolved, for example), SpiderMonkey will *resume* the frame. It
+will be put back onto the stack, and execution will continue where it
+left off. Only generator and async function call frames can be suspended
+and resumed.
+
+Currently, a frame's `live` property is `false` while it's suspended
+([bug 1448880](https://bugzilla.mozilla.org/show_bug.cgi?id=1448880)).
+
+SpiderMonkey uses the same `Debugger.Frame` object each time a generator
+or async function call is put back onto the stack. This means that the
+`onStep` handler can be used to step over `yield` and `await`.
+
+The `frame.onPop` handler is called each time a frame is suspended, and
+the `Debugger.onEnterFrame` handler is called each time a frame is
+resumed. (This means these events can fire multiple times for the same
+`Frame` object, which is odd, but accurately conveys what's happening.)
+
+
+## Stepping Into Generators: The "Initial Yield"
+
+When a debuggee generator is called, something weird happens. The
+`.onEnterFrame` hook fires, as though we're stepping into the generator.
+But the code inside the generator doesn't run. Instead it immediately
+returns. Then we sometimes get *another* `.onEnterFrame` event for the
+same generator. What's going on?
+
+To explain this, we first have to describe how generator calls work,
+according to the ECMAScript language specification. Note that except for
+step 3, it's exactly like a regular function call.
+
+1.  An "execution context" (what we call a `Frame`) is pushed to the stack.
+2.  An environment is created (for arguments and local variables).
+    Argument-default-value-expressions, if any, are evaluated.
+3.  A generator object is created, initially suspended at the start of the generator body.
+4.  The stack frame is popped, and the generator object is returned to the caller.
+
+The JavaScript engine actually carries out these steps, in this order.
+So when a debuggee generator is called, here's what you'll observe:
+
+1.  The `debugger.onEnterFrame` hook fires.
+2.  The debugger can step through the argument-default-value code, if any.
+3.  The body of the generator does not run yet. Instead, a generator object
+    is created and suspended (which does not fire any debugger events).
+4.  The `frame.onPop` hook fires, with a completion value of
+    `{return:` *(the new generator object)* `}`.
+
+In SpiderMonkey, this process of suspending and returning a new
+generator object is called the "initial yield".
+
+If the caller then uses the generator's `.next()` method, which may or
+may not happen right away depending on the debuggee code, the suspended
+generator will be resumed, firing `.onEnterFrame` again.
+
+**Stepping into async functions** — SpiderMonkey also performs an
+initial yield for async functions. This is not so easy to defend by
+citing the spec; we're just exposing internal SpiderMonkey
+implementation details. When the initial yield happens, you'll observe
+an extra `.onPop` returning a generator object that SpiderMonkey will
+use internally, followed immediately by a second `.onEnterFrame` event
+for the same frame.
+
+
 ## Accessor Properties of the Debugger.Frame Prototype Object
 
 A `Debugger.Frame` instance inherits the following accessor properties from
 its prototype:
 
 `type`
 :   A string describing what sort of frame this is:
 
@@ -259,16 +328,21 @@ the compartment to which the handler met
     handlers set, their handlers are run in an unspecified order. The
     resumption value each handler returns establishes the completion value
     reported to the next handler.
 
     This handler is not called on `"debugger"` frames. It is also not called
     when unwinding a frame due to an over-recursion or out-of-memory
     exception.
 
+    The `onPop` handler is typically called only once for a given frame,
+    after which the frame becomes inactive. However, in the case of
+    [generators and async functions](suspended), `onPop` fires each time
+    the frame is suspended.
+
 
 ## Function Properties of the Debugger.Frame Prototype Object
 
 The functions described below may only be called with a `this` value
 referring to a `Debugger.Frame` instance; they may not be used as
 methods of other kinds of objects.
 
 <code id="eval">eval(<i>code</i>, [<i>options</i>])</code>
--- a/js/src/frontend/ParseNode.cpp
+++ b/js/src/frontend/ParseNode.cpp
@@ -99,18 +99,24 @@ ParseNode::appendOrCreateList(ParseNodeK
     }
 
     list->append(right);
     return list;
 }
 
 #ifdef DEBUG
 
+const ParseNodeArity js::frontend::ParseNodeKindArity[] = {
+#define ARITY(_name, arity) arity,
+    FOR_EACH_PARSE_NODE_KIND(ARITY)
+#undef ARITY
+};
+
 static const char * const parseNodeNames[] = {
-#define STRINGIFY(name) #name,
+#define STRINGIFY(name, _arity) #name,
     FOR_EACH_PARSE_NODE_KIND(STRINGIFY)
 #undef STRINGIFY
 };
 
 void
 frontend::DumpParseTree(ParseNode* pn, GenericPrinter& out, int indent)
 {
     if (pn == nullptr) {
--- a/js/src/frontend/ParseNode.h
+++ b/js/src/frontend/ParseNode.h
@@ -39,177 +39,177 @@ namespace js {
 namespace frontend {
 
 class ParseContext;
 class FullParseHandler;
 class FunctionBox;
 class ObjectBox;
 
 #define FOR_EACH_PARSE_NODE_KIND(F) \
-    F(EmptyStatement) \
-    F(ExpressionStatement) \
-    F(Comma) \
-    F(Conditional) \
-    F(Colon) \
-    F(Shorthand) \
-    F(Pos) \
-    F(Neg) \
-    F(PreIncrement) \
-    F(PostIncrement) \
-    F(PreDecrement) \
-    F(PostDecrement) \
-    F(PropertyName) \
-    F(Dot) \
-    F(Elem) \
-    F(Array) \
-    F(Elision) \
-    F(StatementList) \
-    F(Label) \
-    F(Object) \
-    F(Call) \
-    F(Arguments) \
-    F(Name) \
-    F(ObjectPropertyName) \
-    F(ComputedName) \
-    F(Number) \
-    F(String) \
-    F(TemplateStringList) \
-    F(TemplateString) \
-    F(TaggedTemplate) \
-    F(CallSiteObj) \
-    F(RegExp) \
-    F(True) \
-    F(False) \
-    F(Null) \
-    F(RawUndefined) \
-    F(This) \
-    F(Function) \
-    F(Module) \
-    F(If) \
-    F(Switch) \
-    F(Case) \
-    F(While) \
-    F(DoWhile) \
-    F(For) \
-    F(Break) \
-    F(Continue) \
-    F(Var) \
-    F(Const) \
-    F(With) \
-    F(Return) \
-    F(New) \
+    F(EmptyStatement, PN_NULLARY) \
+    F(ExpressionStatement, PN_UNARY) \
+    F(Comma, PN_LIST) \
+    F(Conditional, PN_TERNARY) \
+    F(Colon, PN_BINARY) \
+    F(Shorthand, PN_BINARY) \
+    F(Pos, PN_UNARY) \
+    F(Neg, PN_UNARY) \
+    F(PreIncrement, PN_UNARY) \
+    F(PostIncrement, PN_UNARY) \
+    F(PreDecrement, PN_UNARY) \
+    F(PostDecrement, PN_UNARY) \
+    F(PropertyName, PN_NAME) \
+    F(Dot, PN_BINARY) \
+    F(Elem, PN_BINARY) \
+    F(Array, PN_LIST) \
+    F(Elision, PN_NULLARY) \
+    F(StatementList, PN_LIST) \
+    F(Label, PN_NAME) \
+    F(Object, PN_LIST) \
+    F(Call, PN_BINARY) \
+    F(Arguments, PN_LIST) \
+    F(Name, PN_NAME) \
+    F(ObjectPropertyName, PN_NAME) \
+    F(ComputedName, PN_UNARY) \
+    F(Number, PN_NUMBER) \
+    F(String, PN_NAME) \
+    F(TemplateStringList, PN_LIST) \
+    F(TemplateString, PN_NAME) \
+    F(TaggedTemplate, PN_BINARY) \
+    F(CallSiteObj, PN_LIST) \
+    F(RegExp, PN_REGEXP) \
+    F(True, PN_NULLARY) \
+    F(False, PN_NULLARY) \
+    F(Null, PN_NULLARY) \
+    F(RawUndefined, PN_NULLARY) \
+    F(This, PN_UNARY) \
+    F(Function, PN_CODE) \
+    F(Module, PN_CODE) \
+    F(If, PN_TERNARY) \
+    F(Switch, PN_BINARY) \
+    F(Case, PN_BINARY) \
+    F(While, PN_BINARY) \
+    F(DoWhile, PN_BINARY) \
+    F(For, PN_BINARY) \
+    F(Break, PN_LOOP) \
+    F(Continue, PN_LOOP) \
+    F(Var, PN_LIST) \
+    F(Const, PN_LIST) \
+    F(With, PN_BINARY) \
+    F(Return, PN_UNARY) \
+    F(New, PN_BINARY) \
     /* Delete operations.  These must be sequential. */ \
-    F(DeleteName) \
-    F(DeleteProp) \
-    F(DeleteElem) \
-    F(DeleteExpr) \
-    F(Try) \
-    F(Catch) \
-    F(Throw) \
-    F(Debugger) \
-    F(Generator) \
-    F(InitialYield) \
-    F(Yield) \
-    F(YieldStar) \
-    F(LexicalScope) \
-    F(Let) \
-    F(Import) \
-    F(ImportSpecList) \
-    F(ImportSpec) \
-    F(Export) \
-    F(ExportFrom) \
-    F(ExportDefault) \
-    F(ExportSpecList) \
-    F(ExportSpec) \
-    F(ExportBatchSpec) \
-    F(ForIn) \
-    F(ForOf) \
-    F(ForHead) \
-    F(ParamsBody) \
-    F(Spread) \
-    F(MutateProto) \
-    F(Class) \
-    F(ClassMethod) \
-    F(ClassMethodList) \
-    F(ClassNames) \
-    F(NewTarget) \
-    F(PosHolder) \
-    F(SuperBase) \
-    F(SuperCall) \
-    F(SetThis) \
-    F(ImportMeta) \
-    F(CallImport) \
+    F(DeleteName, PN_UNARY) \
+    F(DeleteProp, PN_UNARY) \
+    F(DeleteElem, PN_UNARY) \
+    F(DeleteExpr, PN_UNARY) \
+    F(Try, PN_TERNARY) \
+    F(Catch, PN_BINARY) \
+    F(Throw, PN_UNARY) \
+    F(Debugger, PN_NULLARY) \
+    F(Generator, PN_NULLARY) \
+    F(InitialYield, PN_UNARY) \
+    F(Yield, PN_UNARY) \
+    F(YieldStar, PN_UNARY) \
+    F(LexicalScope, PN_SCOPE) \
+    F(Let, PN_LIST) \
+    F(Import, PN_BINARY) \
+    F(ImportSpecList, PN_LIST) \
+    F(ImportSpec, PN_BINARY) \
+    F(Export, PN_UNARY) \
+    F(ExportFrom, PN_BINARY) \
+    F(ExportDefault, PN_BINARY) \
+    F(ExportSpecList, PN_LIST) \
+    F(ExportSpec, PN_BINARY) \
+    F(ExportBatchSpec, PN_NULLARY) \
+    F(ForIn, PN_TERNARY) \
+    F(ForOf, PN_TERNARY) \
+    F(ForHead, PN_TERNARY) \
+    F(ParamsBody, PN_LIST) \
+    F(Spread, PN_UNARY) \
+    F(MutateProto, PN_UNARY) \
+    F(Class, PN_TERNARY) \
+    F(ClassMethod, PN_BINARY) \
+    F(ClassMethodList, PN_LIST) \
+    F(ClassNames, PN_BINARY) \
+    F(NewTarget, PN_BINARY) \
+    F(PosHolder, PN_NULLARY) \
+    F(SuperBase, PN_UNARY) \
+    F(SuperCall, PN_BINARY) \
+    F(SetThis, PN_BINARY) \
+    F(ImportMeta, PN_BINARY) \
+    F(CallImport, PN_BINARY) \
     \
     /* Unary operators. */ \
-    F(TypeOfName) \
-    F(TypeOfExpr) \
-    F(Void) \
-    F(Not) \
-    F(BitNot) \
-    F(Await) \
+    F(TypeOfName, PN_UNARY) \
+    F(TypeOfExpr, PN_UNARY) \
+    F(Void, PN_UNARY) \
+    F(Not, PN_UNARY) \
+    F(BitNot, PN_UNARY) \
+    F(Await, PN_UNARY) \
     \
     /* \
      * Binary operators. \
      * These must be in the same order as TOK_OR and friends in TokenStream.h. \
      */ \
-    F(Pipeline) \
-    F(Or) \
-    F(And) \
-    F(BitOr) \
-    F(BitXor) \
-    F(BitAnd) \
-    F(StrictEq) \
-    F(Eq) \
-    F(StrictNe) \
-    F(Ne) \
-    F(Lt) \
-    F(Le) \
-    F(Gt) \
-    F(Ge) \
-    F(InstanceOf) \
-    F(In) \
-    F(Lsh) \
-    F(Rsh) \
-    F(Ursh) \
-    F(Add) \
-    F(Sub) \
-    F(Star) \
-    F(Div) \
-    F(Mod) \
-    F(Pow) \
+    F(Pipeline, PN_LIST) \
+    F(Or, PN_LIST) \
+    F(And, PN_LIST) \
+    F(BitOr, PN_LIST) \
+    F(BitXor, PN_LIST) \
+    F(BitAnd, PN_LIST) \
+    F(StrictEq, PN_LIST) \
+    F(Eq, PN_LIST) \
+    F(StrictNe, PN_LIST) \
+    F(Ne, PN_LIST) \
+    F(Lt, PN_LIST) \
+    F(Le, PN_LIST) \
+    F(Gt, PN_LIST) \
+    F(Ge, PN_LIST) \
+    F(InstanceOf, PN_LIST) \
+    F(In, PN_LIST) \
+    F(Lsh, PN_LIST) \
+    F(Rsh, PN_LIST) \
+    F(Ursh, PN_LIST) \
+    F(Add, PN_LIST) \
+    F(Sub, PN_LIST) \
+    F(Star, PN_LIST) \
+    F(Div, PN_LIST) \
+    F(Mod, PN_LIST) \
+    F(Pow, PN_LIST) \
     \
     /* Assignment operators (= += -= etc.). */ \
     /* ParseNode::isAssignment assumes all these are consecutive. */ \
-    F(Assign) \
-    F(AddAssign) \
-    F(SubAssign) \
-    F(BitOrAssign) \
-    F(BitXorAssign) \
-    F(BitAndAssign) \
-    F(LshAssign) \
-    F(RshAssign) \
-    F(UrshAssign) \
-    F(MulAssign) \
-    F(DivAssign) \
-    F(ModAssign) \
-    F(PowAssign)
+    F(Assign, PN_BINARY) \
+    F(AddAssign, PN_BINARY) \
+    F(SubAssign, PN_BINARY) \
+    F(BitOrAssign, PN_BINARY) \
+    F(BitXorAssign, PN_BINARY) \
+    F(BitAndAssign, PN_BINARY) \
+    F(LshAssign, PN_BINARY) \
+    F(RshAssign, PN_BINARY) \
+    F(UrshAssign, PN_BINARY) \
+    F(MulAssign, PN_BINARY) \
+    F(DivAssign, PN_BINARY) \
+    F(ModAssign, PN_BINARY) \
+    F(PowAssign, PN_BINARY)
 
 /*
  * Parsing builds a tree of nodes that directs code generation.  This tree is
  * not a concrete syntax tree in all respects (for example, || and && are left
  * associative, but (A && B && C) translates into the right-associated tree
  * <A && <B && C>> so that code generation can emit a left-associative branch
  * around <B && C> when A is false).  Nodes are labeled by kind, with a
  * secondary JSOp label when needed.
  *
  * The long comment after this enum block describes the kinds in detail.
  */
 enum class ParseNodeKind : uint16_t
 {
-#define EMIT_ENUM(name) name,
+#define EMIT_ENUM(name, _arity) name,
     FOR_EACH_PARSE_NODE_KIND(EMIT_ENUM)
 #undef EMIT_ENUM
     Limit, /* domain size */
     BinOpFirst = ParseNodeKind::Pipeline,
     BinOpLast = ParseNodeKind::Pow,
     AssignmentStart = ParseNodeKind::Assign,
     AssignmentLast = ParseNodeKind::PowAssign
 };
@@ -570,16 +570,21 @@ enum ParseNodeArity
     macro(UnaryNode, UnaryNodeType, asUnary) \
     macro(ThisLiteral, ThisLiteralType, asThisLiteral)
 
 #define DECLARE_CLASS(typeName, longTypeName, asMethodName) \
 class typeName;
 FOR_EACH_PARSENODE_SUBCLASS(DECLARE_CLASS)
 #undef DECLARE_CLASS
 
+#ifdef DEBUG
+// ParseNodeKindArity[size_t(pnk)] is the arity of a ParseNode of kind pnk.
+extern const ParseNodeArity ParseNodeKindArity[];
+#endif
+
 class ParseNode
 {
     ParseNodeKind pn_type;   /* ParseNodeKind::PNK_* type */
     // pn_op and pn_arity are not declared as the correct enum types
     // due to difficulties with MS bitfield layout rules and a GCC
     // bug.  See https://bugzilla.mozilla.org/show_bug.cgi?id=1383157#c4 for
     // details.
     uint8_t pn_op;      /* see JSOp enum and jsopcode.tbl */
@@ -598,49 +603,55 @@ class ParseNode
         pn_op(op),
         pn_arity(arity),
         pn_parens(false),
         pn_rhs_anon_fun(false),
         pn_pos(0, 0),
         pn_next(nullptr)
     {
         MOZ_ASSERT(kind < ParseNodeKind::Limit);
+        MOZ_ASSERT(hasExpectedArity());
         memset(&pn_u, 0, sizeof pn_u);
     }
 
     ParseNode(ParseNodeKind kind, JSOp op, ParseNodeArity arity, const TokenPos& pos)
       : pn_type(kind),
         pn_op(op),
         pn_arity(arity),
         pn_parens(false),
         pn_rhs_anon_fun(false),
         pn_pos(pos),
         pn_next(nullptr)
     {
         MOZ_ASSERT(kind < ParseNodeKind::Limit);
+        MOZ_ASSERT(hasExpectedArity());
         memset(&pn_u, 0, sizeof pn_u);
     }
 
     JSOp getOp() const                     { return JSOp(pn_op); }
     void setOp(JSOp op)                    { pn_op = op; }
     bool isOp(JSOp op) const               { return getOp() == op; }
 
     ParseNodeKind getKind() const {
         MOZ_ASSERT(pn_type < ParseNodeKind::Limit);
+        MOZ_ASSERT(hasExpectedArity());
         return pn_type;
     }
     void setKind(ParseNodeKind kind) {
         MOZ_ASSERT(kind < ParseNodeKind::Limit);
         pn_type = kind;
     }
     bool isKind(ParseNodeKind kind) const  { return getKind() == kind; }
 
     ParseNodeArity getArity() const        { return ParseNodeArity(pn_arity); }
+#ifdef DEBUG
+    bool hasExpectedArity() const          { return isArity(ParseNodeKindArity[size_t(pn_type)]); }
+#endif
     bool isArity(ParseNodeArity a) const   { return getArity() == a; }
-    void setArity(ParseNodeArity a)        { pn_arity = a; }
+    void setArity(ParseNodeArity a)        { pn_arity = a; MOZ_ASSERT(hasExpectedArity()); }
 
     bool isBinaryOperation() const {
         ParseNodeKind kind = getKind();
         return ParseNodeKind::BinOpFirst <= kind && kind <= ParseNodeKind::BinOpLast;
     }
     inline bool isName(PropertyName* name) const;
 
     /* Boolean attributes. */
--- a/js/src/frontend/TokenKind.h
+++ b/js/src/frontend/TokenKind.h
@@ -151,17 +151,17 @@
     range(StrictReservedKeywordLast, Public) \
     \
     /* \
      * The following token types occupy contiguous ranges to enable easy \
      * range-testing. \
      */ \
     /* \
      * Binary operators tokens, Or thru Pow. These must be in the same \
-     * order as F(OR) and friends in FOR_EACH_PARSE_NODE_KIND in ParseNode.h. \
+     * order as F(Or) and friends in FOR_EACH_PARSE_NODE_KIND in ParseNode.h. \
      */ \
     macro(Pipeline,     "'|>'") \
     range(BinOpFirst,   Pipeline) \
     macro(Or,           "'||'")   /* logical or */ \
     macro(And,          "'&&'")   /* logical and */ \
     macro(BitOr,        "'|'")    /* bitwise-or */ \
     macro(BitXor,       "'^'")    /* bitwise-xor */ \
     macro(BitAnd,       "'&'")    /* bitwise-and */ \
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Debugger-getNewestFrame-generators-01.js
@@ -0,0 +1,49 @@
+// Generator/async frames can be created and revived by calling Debugger.getNewestFrame().
+//
+// Modified copy of Frame-older-generators-01.js.
+
+let g = newGlobal();
+g.eval(`
+    function* gen() {
+        f();
+        yield 1;
+        f();
+    }
+    function* genDefaults(x=f()) {
+        f();
+    }
+    async function af() {
+        f();
+        await 1;
+        f();
+    }
+    async function afDefaults(x=f()) {
+        await 1;
+        f();
+    }
+`);
+
+function test(expected, code) {
+    let dbg = Debugger(g);
+    let hits = 0;
+    let genFrame = null;
+    g.f = () => {
+        hits++;
+        let frame = dbg.getNewestFrame();
+        if (genFrame === null) {
+            genFrame = frame;
+        } else {
+            assertEq(frame, genFrame);
+        }
+        assertEq(genFrame.callee.name, expected);
+    }
+
+    g.eval(code);
+    assertEq(hits, 2);
+    dbg.removeDebuggee(g);
+}
+
+test("gen", "for (var x of gen()) {}");
+test("genDefaults", "for (var x of genDefaults()) {}");
+test("af", "af(); drainJobQueue();");
+test("afDefaults", "afDefaults(); drainJobQueue();")
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-identity-05.js
@@ -0,0 +1,20 @@
+// Suspended generators keep their associated Debugger.Frames gc-alive.
+
+var g = newGlobal();
+g.eval("function* f() { debugger; yield 1; debugger; }");
+var dbg = new Debugger(g);
+var hits = 0;
+dbg.onDebuggerStatement = function (frame) {
+    if (hits === 0)
+        frame.seen = true;
+    else
+        assertEq(frame.seen, true);
+    gc();
+    hits++;
+};
+var it = g.f();
+gc();
+assertEq(it.next().value, 1);
+gc();
+assertEq(it.next().done, true);
+assertEq(hits, 2);
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-identity-06.js
@@ -0,0 +1,45 @@
+// Debugger.Frames for async functions are not GC'd while they're suspended.
+// The awaited promise keeps the generator alive, via its reaction lists.
+
+var g = newGlobal();
+g.eval(`
+    // Create a few promises.
+    var promises = [], resolvers = [];
+    for (let i = 0; i < 3; i++)
+        promises.push(new Promise(r => { resolvers.push(r); }));
+
+    async function f() {
+        debugger;
+        for (let p of promises) {
+            await p;
+            debugger;
+        }
+    }
+`);
+var dbg = new Debugger(g);
+var hits = 0;
+dbg.onDebuggerStatement = function (frame) {
+    if (hits === 0)
+        frame.seen = true;
+    else
+        assertEq(frame.seen, true);
+    hits++;
+};
+
+let done = false;
+g.f().then(_ => { done = true; });
+gc();
+drainJobQueue();
+gc();
+
+// Resolve the promises one by one.
+for (let [i, resolve] of g.resolvers.entries()) {
+    assertEq(hits, 1 + i);
+    assertEq(done, false);
+    resolve("x");
+    gc();
+    drainJobQueue();
+    gc();
+}
+assertEq(hits, 1 + g.resolvers.length);
+assertEq(done, true);
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-identity-07.js
@@ -0,0 +1,52 @@
+// Distinct generator calls result in distinct Debugger.Frames.
+
+let g = newGlobal();
+g.eval(`
+    function* count(n) {
+        if (n > 0) {
+            for (let x of count(n - 1))
+                yield x;
+            yield n;
+        }
+    }
+`);
+
+let log = "";
+let dbg = Debugger(g);
+let nextId = 0;
+function mark(frame) {
+    if (frame.id === undefined)
+        frame.id = nextId++;
+}
+dbg.onEnterFrame = frame => {
+    mark(frame);
+    log += frame.id + "[";
+    frame.onPop = completion => {
+        mark(frame);
+        log += "]" + frame.id;
+    };
+};
+
+
+let j = 0;
+for (let k of g.count(5)) {
+    assertEq(k, ++j);
+    log += " ";
+}
+
+assertEq(log,
+         // Calling a generator function just returns a generator object
+         // without running the body at all; hence "0[]0". However, this call
+         // does evaluate default argument values, if any, so we do report an
+         // onEnterFrame / onPop for it.
+         "0[]0" +
+         // Demanding the first value from the top generator forces
+         // SpiderMonkey to create all five generator objects (the empty "n[]n"
+         // pairs) and then demand a value from them (the longer "n[...]n"
+         // substrings).
+         "0[1[]11[2[]22[3[]33[4[]44[5[]55[]5]4]3]2]1]0 " +
+         "0[1[2[3[4[]4]3]2]1]0 " +
+         "0[1[2[3[]3]2]1]0 " +
+         "0[1[2[]2]1]0 " +
+         "0[1[]1]0 " +
+         "0[]0");
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-older-generators-01.js
@@ -0,0 +1,53 @@
+// Generator/async frames can be created by following .older.
+//
+// The goal here is to get some test coverage creating generator Frame objects
+// at some time other than when firing onEnterFrame. Here they're created after
+// the initial yield.
+
+let g = newGlobal();
+g.eval(`
+    function f() {
+        debugger;
+    }
+    function* gen() {
+        f();
+        yield 1;
+        f();
+    }
+    function* genDefaults(x=f()) {
+        f();
+    }
+    async function af() {
+        f();
+        await 1;
+        f();
+    }
+    async function afDefaults(x=f()) {
+        await 1;
+        f();
+    }
+`);
+
+function test(expected, code) {
+    let dbg = Debugger(g);
+    let hits = 0;
+    let genFrame = null;
+    dbg.onDebuggerStatement = frame => {
+        hits++;
+        assertEq(frame.callee.name, "f");
+        if (genFrame === null) {
+            genFrame = frame.older;
+        } else {
+            assertEq(frame.older, genFrame);
+        }
+        assertEq(genFrame.callee.name, expected);
+    };
+    g.eval(code);
+    assertEq(hits, 2);
+    dbg.removeDebuggee(g);
+}
+
+test("gen", "for (var x of gen()) {}");
+test("genDefaults", "for (var x of genDefaults()) {}");
+test("af", "af(); drainJobQueue();");
+test("afDefaults", "afDefaults(); drainJobQueue();")
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-older-generators-02.js
@@ -0,0 +1,50 @@
+// Like Frame-older-generators-01.js, but attach the debugger on the fly.
+//
+// (That is, check that it works even if the debugger never received
+// onNewGenerator for the generator, because it wasn't attached at the time.)
+
+let g = newGlobal();
+g.eval(`
+    function f() {
+        attach();
+        debugger;
+    }
+    function* gen() {
+        f();
+        yield 1;
+        f();
+    }
+    async function af() {
+        f();
+        await 1;
+        f();
+    }
+`);
+
+function test(expected, code) {
+    let dbg;
+    let hits = 0;
+    let genFrame = null;
+
+    g.attach = () => {
+        if (dbg === undefined) {
+            dbg = Debugger(g);
+            dbg.onDebuggerStatement = frame => {
+                hits++;
+                assertEq(frame.callee.name, "f");
+                if (genFrame === null) {
+                    genFrame = frame.older;
+                } else {
+                    assertEq(frame.older, genFrame);
+                }
+                assertEq(genFrame.callee.name, expected);
+            };
+        }
+    };
+    g.eval(code);
+    assertEq(hits, 2);
+    dbg.removeDebuggee(g);
+}
+
+test("gen", "for (var x of gen()) {}");
+test("af", "af(); drainJobQueue();");
--- a/js/src/jit-test/tests/debug/Frame-onPop-06.js
+++ b/js/src/jit-test/tests/debug/Frame-onPop-06.js
@@ -1,9 +1,10 @@
 // dbg.getNewestFrame in an onPop handler returns the frame being popped.
+
 var g = newGlobal();
 g.eval("function f() { debugger; }");
 g.eval("function g() { f(); }");
 g.eval("function h() { g(); }");
 g.eval("function i() { h(); }");
 
 var dbg = new Debugger(g);
 var log;
--- a/js/src/jit-test/tests/debug/Frame-onPop-15.js
+++ b/js/src/jit-test/tests/debug/Frame-onPop-15.js
@@ -1,32 +1,31 @@
-// Each resumption of a generator gets a fresh frame, whose onPop handler
-// fires the next time the generator yields.
-// This is not the behavior the spec requests, but it's what we do for the
-// moment, and it's good to check that at least we don't crash.
+// Each resumption of a generator gets the same Frame; its onPop handler
+// fires each time the generator yields.
+
 var g = newGlobal();
 var dbg = new Debugger(g);
 var log;
 
-var debuggerFrames = [];
-var poppedFrames = [];
+var seenFrame = null;
 dbg.onDebuggerStatement = function handleDebugger(frame) {
     log += 'd';
     assertEq(frame.type, "call");
 
-    assertEq(debuggerFrames.indexOf(frame), -1);
-    assertEq(poppedFrames.indexOf(frame), -1);
-    debuggerFrames.push(frame);
+    if (seenFrame === null) {
+        seenFrame = frame;
+    } else {
+        assertEq(seenFrame, frame);
+    }
 
-    if (frame.eval('i').return % 3 == 0) {
+    let i = frame.eval('i').return;
+    if (i % 3 == 0) {
         frame.onPop = function handlePop(c) {
-            log += ')' + c.return.unsafeDereference().value;
-            assertEq(debuggerFrames.indexOf(this) != -1, true);
-            assertEq(poppedFrames.indexOf(this), -1);
-            poppedFrames.push(this);
+            assertEq(this, seenFrame);
+            log += ')' + i;
         };
     }
 };
 
 g.eval("function* g() { for (var i = 0; i < 10; i++) { debugger; yield i; } }");
 log ='';
 assertEq(g.eval("var t = 0; for (j of g()) t += j; t;"), 45);
-assertEq(log, "d)0ddd)3ddd)6ddd)9");
+assertEq(log, "d)0d)0d)0d)3d)3d)3d)6d)6d)6d)9");
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-onPop-generators-05.js
@@ -0,0 +1,29 @@
+// In .onPop for the "initial yield" of a generator, while the generator frame
+// is on the stack, the generator object's .next() method throws.
+
+let g = newGlobal();
+g.eval(`
+    function* f() {
+        return "ok";
+    }
+`);
+
+let hits = 0;
+let dbg = new Debugger;
+let gw = dbg.addDebuggee(g);
+dbg.onEnterFrame = frame => {
+    dbg.onEnterFrame = undefined;  // Trigger only once.
+    frame.onPop = completion => {
+        // Initial yield.
+        let genObj = completion.return;
+        assertEq(genObj.class, "Generator");
+        let result = frame.evalWithBindings("genObj.next()", {genObj});
+        assertEq(result.throw.class, "Error");
+        assertEq(result.throw.getProperty("message").return,
+                 "already executing generator");
+        hits++;
+    };
+};
+
+g.f();
+assertEq(hits, 1);
deleted file mode 100644
--- a/js/src/jit-test/tests/debug/Frame-onPop-star-generators-03.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// Each resumption of an ES6 generator gets a fresh frame, whose onPop
-// handler fires the next time the generator yields.  This is not the
-// behavior the spec requests, but it's what we do for the moment, and
-// it's good to check that at least we don't crash.
-
-load(libdir + 'iteration.js');
-
-var g = newGlobal();
-var dbg = new Debugger(g);
-var log;
-
-var debuggerFrames = [];
-var poppedFrames = [];
-dbg.onDebuggerStatement = function handleDebugger(frame) {
-    log += 'd';
-    assertEq(frame.type, "call");
-
-    assertEq(debuggerFrames.indexOf(frame), -1);
-    assertEq(poppedFrames.indexOf(frame), -1);
-    debuggerFrames.push(frame);
-
-    if (frame.eval('i').return % 3 == 0) {
-        frame.onPop = function handlePop(c) {
-            log += ')' + c.return.value;
-            assertEq(debuggerFrames.indexOf(this) != -1, true);
-            assertEq(poppedFrames.indexOf(this), -1);
-            poppedFrames.push(this);
-        };
-    }
-};
-
-g.eval("function* g() { for (var i = 0; i < 10; i++) { debugger; yield i; } }");
-log ='';
-g.eval("var t = 0, iter = g();");
-for (var j = 0; j < 10; j++)
-    g.eval("t += iter.next().value;");
-assertIteratorResult(g.eval("iter.next()"), undefined, true);
-assertEq(g.eval("t"), 45);
-
-// FIXME: Should equal this, but see bug 917809.
-// assertEq(log, "d)0ddd)3ddd)6ddd)9");
-assertEq(log, "d)undefinedddd)undefinedddd)undefinedddd)undefined");
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-onStep-async-01.js
@@ -0,0 +1,35 @@
+// Stepping works across `await` in async functions.
+
+// Set up debuggee.
+var g = newGlobal();
+g.log = "";
+g.eval(`                              // line 1
+async function aloop() {              // 2
+    for (let i = 0; i < 3; i++) {     // 3
+        await i;                      // 4
+        log += " ";                   // 5
+    }                                 // 6
+    log += "^";                       // 7
+}
+`);
+
+// Set up debugger.
+let previousLine = -1;
+let dbg = new Debugger(g);
+dbg.onEnterFrame = frame => {
+    frame.onStep = function () {
+        assertEq(this, frame);
+        let line = frame.script.getOffsetLocation(frame.offset).lineNumber;
+        if (previousLine != line) {
+            g.log += line; // We stepped to a new line.
+            previousLine = line;
+        }
+    };
+    dbg.onEnterFrame = undefined;
+};
+
+// Run.
+g.aloop();
+drainJobQueue();
+
+assertEq(g.log, "2345 345 345 37^");
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-onStep-async-02.js
@@ -0,0 +1,85 @@
+// With enough hackery, stepping in and out of async functions can be made to
+// work as users expect.
+//
+// This test exercises the common case when we have syntactically `await
+// $ASYNC_FN($ARGS)` so that the calls nest as if they were synchronous
+// calls. It works, but there's a problem.
+//
+// onStep fires in extra places that end users would find very confusing--see
+// the comment marked (!) below. As a result, Debugger API consumers must do
+// some extra work to skip pausing there. This test is a proof of concept that
+// shows what sort of effort is needed. It maintains a single `asyncStack` and
+// skips the onStep hook if we're not running the function at top of the async
+// stack. Real debuggers would have to maintain multiple async stacks.
+
+// Set up debuggee.
+var g = newGlobal();
+g.eval(`\
+async function outer() {                                // line 1
+    return (await inner()) + (await inner()) + "!";     // 2
+}                                                       // 3
+async function inner() {                                // 4
+    return (await leaf()) + (await leaf());             // 5
+}                                                       // 6
+async function leaf() {                                 // 7
+    return (await Promise.resolve("m"));                // 8
+}                                                       // 9
+`);
+
+// Set up debugger.
+let previousLine = -1;
+let dbg = new Debugger(g);
+let log = "";
+let asyncStack = [];
+
+dbg.onEnterFrame = frame => {
+    assertEq(frame.type, "call");
+
+    // If we're entering this frame for the first time, push it to the async
+    // stack.
+    if (!frame.seen) {
+        frame.seen = true;
+        asyncStack.push(frame);
+        log += "(";
+    }
+
+    frame.onStep = () => {
+        // When stepping, we sometimes pause at opcodes in older frames (!)
+        // where all that's happening is async function administrivia.
+        //
+        // For example, the first time `leaf()` yields, `inner()` and
+        // `outer()` are still on the stack; they haven't awaited yet because
+        // control has not returned from `leaf()` to them yet. So stepping will
+        // hop from line 8 to line 5 to line 2 as we unwind the stack, then
+        // resume on line 8.
+        //
+        // Anyway: skip that noise.
+        if (frame !== asyncStack[asyncStack.length - 1])
+            return;
+
+        let line = frame.script.getOffsetLocation(frame.offset).lineNumber;
+        if (previousLine != line) {
+            log += line; // We stepped to a new line.
+            previousLine = line;
+        }
+    };
+
+    frame.onPop = completion => {
+        // Popping the frame. But async function frames are popped multiple
+        // times: for the "initial suspend", at each await, and on return. The
+        // debugger offers no easy way to distinguish them (bug 1470558).
+        if (typeof completion.return === "string") {
+            // Returning (not awaiting or at initial suspend).
+            assertEq(asyncStack.pop(), frame);
+            log += ")";
+        }
+    };
+};
+
+// Run.
+let result;
+g.outer().then(v => { result = v; });
+drainJobQueue();
+
+assertEq(result, "mmmm!");
+assertEq(log, "(12(45(789)5(789)56)2(45(789)5(789)56)23)");
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-onStep-async-gc-01.js
@@ -0,0 +1,28 @@
+// An onStep handler on a suspended async function frame keeps a Debugger alive.
+
+let g = newGlobal();
+g.eval(`
+  async function f() {
+    debugger;
+    await Promise.resolve(0);
+    return 'ok';
+  }
+`);
+
+let dbg = Debugger(g);
+let hit = false;
+dbg.onDebuggerStatement = frame => {
+    frame.onPop = completion => {
+        frame.onStep = () => { hit = true; };
+        frame.onPop = undefined;
+    };
+    dbg.onDebuggerStatement = undefined;
+    dbg = null;
+};
+
+g.f();
+assertEq(dbg, null);
+gc();
+assertEq(hit, false);
+drainJobQueue();
+assertEq(hit, true);
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-onStep-generator-resumption-01.js
@@ -0,0 +1,42 @@
+// The debugger can force an early return from any instruction before the initial yield.
+
+let g = newGlobal();
+g.eval(`
+  function* f() {
+    yield 1;
+  }
+`);
+
+function test(ttl) {
+    let dbg = new Debugger(g);
+    let exiting = false;  // we ran out of time-to-live and have forced return
+    let done = false;  // we reached the initial yield without forced return
+    dbg.onEnterFrame = frame => {
+        assertEq(frame.callee.name, "f");
+        frame.onEnterFrame = undefined;
+        frame.onStep = () => {
+            if (ttl == 0) {
+                exiting = true;
+                // Forced return here causes the generator object, if any, not
+                // to be exposed.
+                return {return: "ponies"};
+            }
+            ttl--;
+        };
+        frame.onPop = completion => {
+            if (!exiting)
+                done = true;
+        };
+    };
+
+    let result = g.f();
+    if (done)
+        assertEq(result instanceof g.f, true);
+    else
+        assertEq(result, "ponies");
+
+    dbg.enabled = false;
+    return done;
+}
+
+for (let ttl = 0; !test(ttl); ttl++) {}
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-onStep-generators-04.js
@@ -0,0 +1,36 @@
+// Stepping works across `yield` in generators.
+
+// Set up debuggee.
+var g = newGlobal();
+g.log = "";
+g.eval(`
+function* range(stop) {               // line 2
+    for (let i = 0; i < stop; i++) {  // 3
+        yield i;                      // 4
+        log += " ";                   // 5
+    }                                 // 6
+    log += "^";                       // 7
+}
+`);
+
+// Set up debugger.
+let previousLine = -1;
+let dbg = new Debugger(g);
+dbg.onEnterFrame = frame => {
+    frame.onStep = function () {
+        assertEq(this, frame);
+        let line = frame.script.getOffsetLocation(frame.offset).lineNumber;
+        if (previousLine != line) {
+            g.log += line; // We stepped to a new line.
+            previousLine = line;
+        }
+    };
+    dbg.onEnterFrame = undefined;
+};
+
+// Run.
+for (let value of g.range(3)) {
+    g.log += "*";
+}
+
+assertEq(g.log, "234*5 34*5 34*5 37^");
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/Frame-onStep-generators-gc-01.js
@@ -0,0 +1,84 @@
+// onStep hooks on suspended Frames can keep Debuggers alive, even chaining them.
+
+// The path through the heap we're building and testing here is:
+//     gen0 (generator object) -> frame1 (suspended Frame with .onStep) -> dbg1 (Debugger object)
+//       -> gen1 -> frame2 -> dbg2
+// where everything after `gen1` is otherwise unreachable, and the edges
+// `frame1 -> dbg1` and `frames2 -> dbg2` are due to the .onStep handlers, not
+// strong refrences.
+//
+// There is no easy way to thread an event through this whole path; when we
+// call gen0.next(), it will fire frame1.onStep(), but from there, making sure
+// gen1.next() is called requires some minor heroics (see the WeakMap below).
+
+var gen0;
+
+var hits2 = 0;
+var resuming2 = false;
+
+function onStep2() {
+    if (resuming2) {
+        hits2++;
+        resuming2 = false;
+    }
+}
+
+function setup() {
+    let g1 = newGlobal();
+    g1.eval(`
+        function* gf1() {
+             debugger;
+             yield 1;
+             return 'done';
+        }
+    `);
+    gen0 = g1.gf1();
+
+    let g2 = newGlobal();
+    g2.eval(`
+        function* gf2() { debugger; yield 1; return 'done'; }
+
+        var resuming1 = false;
+
+        function makeOnStepHook1(dbg1) {
+            // We use this WeakMap as a weak reference from frame1.onStep to dbg1.
+            var weak = new WeakMap();
+            weak.set(dbg1, {});
+            return () => {
+                if (resuming1) {
+                    var dbg1Arr = nondeterministicGetWeakMapKeys(weak);
+                    assertEq(dbg1Arr.length, 1);
+                    dbg1Arr[0].gen1.next();
+                    resuming1 = false;
+                }
+            };
+        }
+
+        function test(g1, gen0) {
+            let dbg1 = Debugger(g1);
+            dbg1.onDebuggerStatement = frame1 => {
+                frame1.onStep = makeOnStepHook1(dbg1);
+                dbg1.onDebuggerStatement = undefined;
+            };
+            gen0.next();  // run to yield point, creating frame1 and setting its onStep hook
+            resuming1 = true;
+            dbg1.gen1 = gf2();
+            return dbg1.gen1;
+        }
+    `);
+
+    let dbg2 = Debugger(g2);
+    dbg2.onDebuggerStatement = frame2 => {
+        frame2.onStep = onStep2;
+        dbg2.onDebuggerStatement = undefined;
+    };
+    var gen1 = g2.test(g1, gen0);
+    gen1.next();  // run to yield point, creating frame2 and setting its onStep hook
+    resuming2 = true;
+}
+
+setup();
+gc();
+assertEq(hits2, 0);
+gen0.next();  // fires frame1.onStep, which calls gen1.next(), which fires frame2.onStep
+assertEq(hits2, 1);
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/onEnterFrame-async-01.js
@@ -0,0 +1,33 @@
+// async functions fire onEnterFrame each time they resume, like generators
+
+let g = newGlobal();
+g.eval(`
+    async function timeout(n) {
+        for (let i = 0; i < n; i++) {
+            await Promise.resolve(i);
+        }
+    }
+    async function job() {
+        let racer = timeout(5);
+        await timeout(3);
+        await racer;
+    }
+`);
+
+let dbg = Debugger(g);
+let log = "";
+let nicknames = ["job", "t5", "t3"];
+dbg.onEnterFrame = frame => {
+    if (!("nickname" in frame))
+        frame.nickname = nicknames.shift() || "FAIL";
+    log += "(" + frame.nickname;
+    frame.onPop = completion => { log += ")"; };
+};
+
+g.job();
+drainJobQueue();
+assertEq(log,
+         "(job)(job(t5)(t5)(t3)(t3))" +
+         "(t5)(t3)".repeat(3) + "(job)" +
+         "(t5)(t5)(job)");
+
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/onEnterFrame-async-resumption-04.js
@@ -0,0 +1,36 @@
+// Returning {throw:} from onEnterFrame when resuming inside a try block in an
+// async function causes control to jump to the catch block.
+
+let g = newGlobal();
+g.eval(`
+    async function af() {
+        try {
+            return await Promise.resolve("fail");
+        } catch (exc) {
+            assertEq(exc, "fit");
+            return "ok";
+        }
+    }
+`)
+
+let dbg = new Debugger(g);
+dbg.onEnterFrame = frame => {
+    if (!("hits" in frame)) {
+        frame.hits = 1;
+    } else if (++frame.hits == 3) {
+        // First two hits happen when g.af() is called;
+        // third hit is resuming at the `await` inside the try block.
+        return {throw: "fit"};
+    }
+};
+
+let p = g.af();
+let hits = 0;
+p.then(value => {
+    result = value;
+    hits++;
+});
+drainJobQueue();
+assertEq(hits, 1);
+assertEq(result, "ok");
+
--- a/js/src/jit-test/tests/debug/onEnterFrame-generator-01.js
+++ b/js/src/jit-test/tests/debug/onEnterFrame-generator-01.js
@@ -19,19 +19,21 @@ let savedOffsets = new Set;
 
 function check(frame) {
     assertEq(frame.type, "call");
     assertEq(frame.constructing, false);
     assertEq(frame.callee, gw.makeDebuggeeValue(g.gen));
 
     // `arguments` elements don't work in resumed generator frames,
     // because generators don't keep the arguments around.
-    // The first onEnterFrame and onPop events can see them.
-    assertEq(frame.arguments.length, hits < 2 ? args.length : 0);
-    for (var i = 0; i < frame.arguments.length; i++) {
+    // However, some of this is initialized when the frame.arguments object is
+    // created, so if they are created during the first onEnterFrame or onPop
+    // event, the properties exist, and those events can also see the values.
+    assertEq(frame.arguments.length, args.length);
+    for (var i = 0; i < args.length; i++) {
         assertEq(frame.arguments.hasOwnProperty(i), true);
 
         if (hits < 2)
             assertEq(frame.arguments[i], gw.makeDebuggeeValue(args[i]), `arguments[${i}]`);
         else
             assertEq(frame.arguments[i], undefined);
     }
 
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/onEnterFrame-generator-04.js
@@ -0,0 +1,44 @@
+// When a generator frame is resumed, the onEnterFrame fires again.
+// The same Frame object is passed.
+
+let g = newGlobal();
+g.eval(`
+    function* easyMode() {}
+
+    function* f() { yield* "XYZ"; }
+    function* hardMode() {
+        for (let c1 of "AB")
+            for (let c2 of f())
+                yield c1 + c2;
+    }
+`);
+
+function test(mode, expected) {
+    let dbg = new Debugger(g);
+    let nextid = 1;
+    dbg.onEnterFrame = frame => {
+        if (frame.type == "call") {
+            if (!("id" in frame))
+                frame.id = nextid++;
+            g.log += frame.id + "(";
+
+            frame.onPop = rv => {
+                g.log += ")";
+            };
+        }
+    };
+
+    g.log = "";
+    g.eval(`
+        for (let x of ${mode}())
+            log += x;
+    `);
+    assertEq(g.log, expected);
+    dbg.enabled = false;
+}
+
+// We fire onEnterFrame for the initial activation when a generator is first
+// called, even though the initial yield happens before any body code. This is
+// weird but at least it's consistent.
+test("easyMode", "1()1()");
+test("hardMode", "1()1(2()2())AX1(2())AY1(2())AZ1(2()3()3())BX1(3())BY1(3())BZ1(3())");
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/onEnterFrame-generator-05.js
@@ -0,0 +1,32 @@
+// When resuming a generator triggers one Debugger's onEnterFrame handler,
+// all Debuggers' Debugger.Frames become usable at once.
+
+let g = newGlobal();
+g.eval(`
+    function* f() {
+       yield 1;
+    }
+`);
+let dbg1 = new Debugger(g);
+let dbg2 = new Debugger(g);
+
+let hits = 0;
+let savedFrame1;
+let savedFrame2;
+dbg1.onEnterFrame = frame => {
+    if (savedFrame1 === undefined) {
+        savedFrame1 = frame;
+        savedFrame2 = dbg2.getNewestFrame();
+    } else {
+        hits++;
+        assertEq(savedFrame1, frame);
+        for (let f of [savedFrame2, savedFrame1]) {
+            assertEq(f.type, "call");
+            assertEq(f.callee.name, "f");
+        }
+    }
+};
+
+let values = [...g.f()];
+assertEq(hits, 2);
+assertEq(values.toSource(), "[1]");
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/onEnterFrame-generator-resumption-04.js
@@ -0,0 +1,34 @@
+// Returning {throw:} from onEnterFrame when resuming inside a try block in a
+// generator causes control to jump to the finally block.
+
+let g = newGlobal();
+g.eval(`
+    function* gen() {
+        try {
+            yield 0;
+            return "fail";
+        } finally {
+            return "ok"; // preempts exception unwinding
+        }
+    }
+`)
+
+let dbg = new Debugger(g);
+dbg.onEnterFrame = frame => {
+    if (!("hits" in frame)) {
+        frame.hits = 1;
+    } else if (++frame.hits == 3) {
+        // First hit is when calling gen();
+        // second hit is resuming at the implicit initial yield;
+        // third hit is resuming inside the try block.
+        return {throw: "fit"};
+    }
+};
+
+let it = g.gen();
+let result = it.next();
+assertEq(result.done, false);
+assertEq(result.value, 0);
+result = it.next();
+assertEq(result.done, true);
+assertEq(result.value, "ok");
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/debug/onExceptionUnwind-generators-01.js
@@ -0,0 +1,39 @@
+// Generator/async frames can be created and revived by the onExceptionUnwind hook.
+//
+// Modified copy of Frame-older-generators-01.js.
+
+let g = newGlobal();
+g.eval(`
+    function* gen() {
+        try { throw new Error("bad"); } catch { }
+        yield 1;
+        try { throw new Error("bad"); } catch { }
+    }
+    async function af() {
+        try { throw new Error("bad"); } catch { }
+        await 1;
+        try { throw new Error("bad"); } catch { }
+    }
+`);
+
+function test(expected, code) {
+    let dbg = Debugger(g);
+    let hits = 0;
+    let genFrame = null;
+    dbg.onExceptionUnwind = frame => {
+        hits++;
+        if (genFrame === null) {
+            genFrame = frame;
+        } else {
+            assertEq(frame, genFrame);
+        }
+        assertEq(genFrame.callee.name, expected);
+    }
+
+    g.eval(code);
+    assertEq(hits, 2);
+    dbg.removeDebuggee(g);
+}
+
+test("gen", "for (var x of gen()) {}");
+test("af", "af(); drainJobQueue();");
--- a/js/src/jit/VMFunctions.cpp
+++ b/js/src/jit/VMFunctions.cpp
@@ -814,22 +814,22 @@ WrapObjectPure(JSContext* cx, JSObject* 
         // Ensure the wrapper is still exposed.
         JS::ExposeObjectToActiveJS(wrapped);
         return wrapped;
     }
 
     return nullptr;
 }
 
-bool
-DebugPrologue(JSContext* cx, BaselineFrame* frame, jsbytecode* pc, bool* mustReturn)
+static bool
+HandlePrologueResumeMode(JSContext* cx, BaselineFrame* frame, jsbytecode* pc, bool* mustReturn,
+                         ResumeMode resumeMode)
 {
     *mustReturn = false;
-
-    switch (Debugger::onEnterFrame(cx, frame)) {
+    switch (resumeMode) {
       case ResumeMode::Continue:
         return true;
 
       case ResumeMode::Return:
         // The script is going to return immediately, so we have to call the
         // debug epilogue handler as well.
         MOZ_ASSERT(frame->hasReturnValue());
         *mustReturn = true;
@@ -840,16 +840,23 @@ DebugPrologue(JSContext* cx, BaselineFra
         return false;
 
       default:
         MOZ_CRASH("bad Debugger::onEnterFrame resume mode");
     }
 }
 
 bool
+DebugPrologue(JSContext* cx, BaselineFrame* frame, jsbytecode* pc, bool* mustReturn)
+{
+    ResumeMode resumeMode = Debugger::onEnterFrame(cx, frame);
+    return HandlePrologueResumeMode(cx, frame, pc, mustReturn, resumeMode);
+}
+
+bool
 DebugEpilogueOnBaselineReturn(JSContext* cx, BaselineFrame* frame, jsbytecode* pc)
 {
     if (!DebugEpilogue(cx, frame, pc, true)) {
         // DebugEpilogue popped the frame by updating packedExitFP, so run the
         // stop event here before we enter the exception handler.
         TraceLoggerThread* logger = TraceLoggerForCurrentThread(cx);
         TraceLogStopEvent(logger, TraceLogger_Baseline);
         TraceLogStopEvent(logger, TraceLogger_Scripts);
@@ -953,27 +960,28 @@ InterpretResume(JSContext* cx, HandleObj
 
     return CallSelfHostedFunction(cx, cx->names().InterpretGeneratorResume, UndefinedHandleValue,
                                   args, rval);
 }
 
 bool
 DebugAfterYield(JSContext* cx, BaselineFrame* frame, jsbytecode* pc, bool* mustReturn)
 {
-    *mustReturn = false;
-
     // The BaselineFrame has just been constructed by JSOP_RESUME in the
     // caller. We need to set its debuggee flag as necessary.
     //
     // If a breakpoint is set on JSOP_DEBUGAFTERYIELD, or stepping is enabled,
     // we may already have done this work. Don't fire onEnterFrame again.
     if (frame->script()->isDebuggee() && !frame->isDebuggee()) {
         frame->setIsDebuggee();
-        return DebugPrologue(cx, frame, pc, mustReturn);
+        ResumeMode resumeMode = Debugger::onResumeFrame(cx, frame);
+        return HandlePrologueResumeMode(cx, frame, pc, mustReturn, resumeMode);
     }
+
+    *mustReturn = false;
     return true;
 }
 
 bool
 GeneratorThrowOrReturn(JSContext* cx, BaselineFrame* frame, Handle<GeneratorObject*> genObj,
                        HandleValue arg, uint32_t resumeKind)
 {
     // Set the frame's pc to the current resume pc, so that frame iterators
--- a/js/src/jit/arm64/Trampoline-arm64.cpp
+++ b/js/src/jit/arm64/Trampoline-arm64.cpp
@@ -131,21 +131,21 @@ JitRuntime::generateEnterJIT(JSContext* 
             masm.bind(&loopHead);
 
             // Load an argument from argv, then increment argv by 8.
             masm.Ldr(x24, MemOperand(ARMRegister(reg_argv, 64), Operand(8), vixl::PostIndex));
 
             // Store the argument to tmp_sp, then increment tmp_sp by 8.
             masm.Str(x24, MemOperand(tmp_sp, Operand(8), vixl::PostIndex));
 
-            // Set the condition codes for |cmp tmp_argc, 2| (using the old value).
+            // Decrement tmp_argc and set the condition codes for the new value.
             masm.Subs(tmp_argc, tmp_argc, Operand(1));
 
             // Branch if arguments remain.
-            masm.B(&loopHead, vixl::Condition::ge);
+            masm.B(&loopHead, vixl::Condition::NonZero);
         }
 
         masm.bind(&noArguments);
     }
     masm.checkStackAlignment();
 
     // Push the number of actual arguments and the calleeToken.
     // The result address is used to store the actual number of arguments
--- a/js/src/jsapi.cpp
+++ b/js/src/jsapi.cpp
@@ -4712,36 +4712,39 @@ JS::NewReadableExternalSourceStreamObjec
     MOZ_ASSERT(rt->readableStreamErroredCallback);
     MOZ_ASSERT(rt->readableStreamFinalizeCallback);
 #endif // DEBUG
 
     return ReadableStream::createExternalSourceStream(cx, underlyingSource, flags, proto);
 }
 
 JS_PUBLIC_API(bool)
-JS::IsReadableStream(const JSObject* obj)
-{
-    if (IsWrapper(const_cast<JSObject*>(obj)))
-        obj = CheckedUnwrap(const_cast<JSObject*>(obj));
+JS::IsReadableStream(JSObject* obj)
+{
+    if (IsWrapper(obj)) {
+        obj = CheckedUnwrap(obj);
+    }
     return obj && obj->is<ReadableStream>();
 }
 
 JS_PUBLIC_API(bool)
-JS::IsReadableStreamReader(const JSObject* obj)
-{
-    if (IsWrapper(const_cast<JSObject*>(obj)))
-        obj = CheckedUnwrap(const_cast<JSObject*>(obj));
+JS::IsReadableStreamReader(JSObject* obj)
+{
+    if (IsWrapper(obj)) {
+        obj = CheckedUnwrap(obj);
+    }
     return obj && obj->is<ReadableStreamDefaultReader>();
 }
 
 JS_PUBLIC_API(bool)
-JS::IsReadableStreamDefaultReader(const JSObject* obj)
-{
-    if (IsWrapper(const_cast<JSObject*>(obj)))
-        obj = CheckedUnwrap(const_cast<JSObject*>(obj));
+JS::IsReadableStreamDefaultReader(JSObject* obj)
+{
+    if (IsWrapper(obj)) {
+        obj = CheckedUnwrap(obj);
+    }
     return obj && obj->is<ReadableStreamDefaultReader>();
 }
 
 template<class T>
 static MOZ_MUST_USE T*
 ToUnwrapped(JSContext* cx, JSObject* obj)
 {
     cx->check(obj);
@@ -4751,52 +4754,52 @@ ToUnwrapped(JSContext* cx, JSObject* obj
             ReportAccessDenied(cx);
             return nullptr;
         }
     }
     return &obj->as<T>();
 }
 
 JS_PUBLIC_API(bool)
-JS::ReadableStreamIsReadable(JSContext* cx, const JSObject* streamObj, bool* result)
-{
-    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, const_cast<JSObject*>(streamObj));
+JS::ReadableStreamIsReadable(JSContext* cx, HandleObject streamObj, bool* result)
+{
+    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
     if (!stream)
         return false;
 
     *result = stream->readable();
     return true;
 }
 
 JS_PUBLIC_API(bool)
-JS::ReadableStreamIsLocked(JSContext* cx, const JSObject* streamObj, bool* result)
-{
-    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, const_cast<JSObject*>(streamObj));
+JS::ReadableStreamIsLocked(JSContext* cx, HandleObject streamObj, bool* result)
+{
+    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
     if (!stream)
         return false;
 
     *result = stream->locked();
     return true;
 }
 
 JS_PUBLIC_API(bool)
-JS::ReadableStreamIsDisturbed(JSContext* cx, const JSObject* streamObj, bool* result)
-{
-    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, const_cast<JSObject*>(streamObj));
+JS::ReadableStreamIsDisturbed(JSContext* cx, HandleObject streamObj, bool* result)
+{
+    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
     if (!stream)
         return false;
 
     *result = stream->disturbed();
     return true;
 }
 
 JS_PUBLIC_API(bool)
-JS::ReadableStreamGetEmbeddingFlags(JSContext* cx, const JSObject* streamObj, uint8_t* flags)
-{
-    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, const_cast<JSObject*>(streamObj));
+JS::ReadableStreamGetEmbeddingFlags(JSContext* cx, HandleObject streamObj, uint8_t* flags)
+{
+    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
     if (!stream)
         return false;
 
     *flags = stream->embeddingFlags();
     return true;
 }
 
 JS_PUBLIC_API(JSObject*)
@@ -4809,19 +4812,19 @@ JS::ReadableStreamCancel(JSContext* cx, 
     Rooted<ReadableStream*> stream(cx, ToUnwrapped<ReadableStream>(cx, streamObj));
     if (!stream)
         return nullptr;
 
     return ReadableStream::cancel(cx, stream, reason);
 }
 
 JS_PUBLIC_API(bool)
-JS::ReadableStreamGetMode(JSContext* cx, const JSObject* streamObj, JS::ReadableStreamMode* mode)
-{
-    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, const_cast<JSObject*>(streamObj));
+JS::ReadableStreamGetMode(JSContext* cx, HandleObject streamObj, JS::ReadableStreamMode* mode)
+{
+    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
     if (!stream)
         return false;
 
     *mode = stream->mode();
     return true;
 }
 
 JS_PUBLIC_API(JSObject*)
@@ -4848,19 +4851,19 @@ JS::ReadableStreamGetExternalUnderlyingS
     Rooted<ReadableStream*> stream(cx, ToUnwrapped<ReadableStream>(cx, streamObj));
     if (!stream)
         return false;
 
     return ReadableStream::getExternalSource(cx, stream, source);
 }
 
 JS_PUBLIC_API(bool)
-JS::ReadableStreamReleaseExternalUnderlyingSource(JSContext* cx, JSObject* streamObj)
-{
-    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, const_cast<JSObject*>(streamObj));
+JS::ReadableStreamReleaseExternalUnderlyingSource(JSContext* cx, HandleObject streamObj)
+{
+    ReadableStream* stream = ToUnwrapped<ReadableStream>(cx, streamObj);
     if (!stream)
         return false;
 
     stream->releaseExternalSource();
     return true;
 }
 
 JS_PUBLIC_API(bool)
@@ -4955,19 +4958,19 @@ JS::ReadableStreamError(JSContext* cx, H
     Rooted<ReadableStream*> stream(cx, ToUnwrapped<ReadableStream>(cx, streamObj));
     if (!stream)
         return false;
 
     return js::ReadableStream::error(cx, stream, error);
 }
 
 JS_PUBLIC_API(bool)
-JS::ReadableStreamReaderIsClosed(JSContext* cx, const JSObject* reader, bool* result)
-{
-    reader = ToUnwrapped<NativeObject>(cx, const_cast<JSObject*>(reader));
+JS::ReadableStreamReaderIsClosed(JSContext* cx, HandleObject readerObj, bool* result)
+{
+    RootedObject reader(cx, ToUnwrapped<NativeObject>(cx, readerObj));
     if (!reader)
         return false;
 
     *result = js::ReadableStreamReaderIsClosed(reader);
     return true;
 }
 
 JS_PUBLIC_API(bool)
--- a/js/src/vm/Debugger-inl.h
+++ b/js/src/vm/Debugger-inl.h
@@ -23,16 +23,26 @@ js::Debugger::onLeaveFrame(JSContext* cx
     MOZ_ASSERT_IF(evalTraps, frame.isDebuggee());
     if (frame.isDebuggee()) {
         ok = slowPathOnLeaveFrame(cx, frame, pc, ok);
     }
     MOZ_ASSERT(!inFrameMaps(frame));
     return ok;
 }
 
+/* static */ inline bool
+js::Debugger::onNewGenerator(JSContext* cx, AbstractFramePtr frame,
+                             Handle<GeneratorObject*> genObj)
+{
+    if (frame.isDebuggee()) {
+        return slowPathOnNewGenerator(cx, frame, genObj);
+    }
+    return true;
+}
+
 /* static */ inline js::Debugger*
 js::Debugger::fromJSObject(const JSObject* obj)
 {
     MOZ_ASSERT(obj->getClass() == &class_);
     return (Debugger*) obj->as<NativeObject>().getPrivate();
 }
 
 /* static */ inline bool
@@ -50,16 +60,26 @@ js::Debugger::onEnterFrame(JSContext* cx
     MOZ_ASSERT_IF(frame.hasScript() && frame.script()->isDebuggee(), frame.isDebuggee());
     if (!frame.isDebuggee()) {
         return ResumeMode::Continue;
     }
     return slowPathOnEnterFrame(cx, frame);
 }
 
 /* static */ js::ResumeMode
+js::Debugger::onResumeFrame(JSContext* cx, AbstractFramePtr frame)
+{
+    MOZ_ASSERT_IF(frame.hasScript() && frame.script()->isDebuggee(), frame.isDebuggee());
+    if (!frame.isDebuggee()) {
+        return ResumeMode::Continue;
+    }
+    return slowPathOnResumeFrame(cx, frame);
+}
+
+/* static */ js::ResumeMode
 js::Debugger::onDebuggerStatement(JSContext* cx, AbstractFramePtr frame)
 {
     if (!cx->realm()->isDebuggee()) {
         return ResumeMode::Continue;
     }
     return slowPathOnDebuggerStatement(cx, frame);
 }
 
--- a/js/src/vm/Debugger.cpp
+++ b/js/src/vm/Debugger.cpp
@@ -697,16 +697,17 @@ Debugger::Debugger(JSContext* cx, Native
     collectCoverageInfo(false),
     observedGCs(cx->zone()),
     allocationsLog(cx),
     trackingAllocationSites(false),
     allocationSamplingProbability(1.0),
     maxAllocationsLogLength(DEFAULT_MAX_LOG_LENGTH),
     allocationsLogOverflowed(false),
     frames(cx->zone()),
+    generatorFrames(cx),
     scripts(cx),
     lazyScripts(cx),
     sources(cx),
     objects(cx),
     environments(cx),
     wasmInstanceScripts(cx),
     wasmInstanceSources(cx),
 #ifdef NIGHTLY_BUILD
@@ -796,39 +797,105 @@ Debugger::getFrame(JSContext* cx, const 
     MOZ_ASSERT_IF(referent.hasScript(), !referent.script()->selfHosted());
 
     if (referent.hasScript() && !referent.script()->ensureHasAnalyzedArgsUsage(cx)) {
         return false;
     }
 
     FrameMap::AddPtr p = frames.lookupForAdd(referent);
     if (!p) {
-        // Create and populate the Debugger.Frame object.
-        RootedObject proto(cx, &object->getReservedSlot(JSSLOT_DEBUG_FRAME_PROTO).toObject());
-        RootedNativeObject debugger(cx, object);
-
-        RootedDebuggerFrame frame(cx, DebuggerFrame::create(cx, proto, iter, debugger));
+        RootedDebuggerFrame frame(cx);
+
+        // If this is a generator frame, there may be an existing
+        // Debugger.Frame object that isn't in `frames` because the generator
+        // was suspended, popping the stack frame, and later resumed (and we
+        // were not stepping, so did not pass through slowPathOnResumeFrame).
+        Rooted<GeneratorObject*> genObj(cx);
+        GeneratorWeakMap::AddPtr gp;
+        if (referent.isGeneratorFrame()) {
+            {
+                AutoRealm ar(cx, referent.callee());
+                genObj = GetGeneratorObjectForFrame(cx, referent);
+            }
+            if (genObj) {
+                gp = generatorFrames.lookupForAdd(genObj);
+                if (gp) {
+                    frame = &gp->value()->as<DebuggerFrame>();
+
+                    // We have found an existing Debugger.Frame object. But
+                    // since it was previously popped (see comment above), it
+                    // is not currently "live". We must revive it.
+                    if (!frame->resume(iter)) {
+                        return false;
+                    }
+                    if (!ensureExecutionObservabilityOfFrame(cx, referent)) {
+                        return false;
+                    }
+                }
+            }
+
+            // If no GeneratorObject exists yet, we create a Debugger.Frame
+            // below anyway, and Debugger::onNewGenerator() will associate it
+            // with the GeneratorObject later when we hit JSOP_GENERATOR.
+        }
+
         if (!frame) {
-            return false;
-        }
-
-        if (!ensureExecutionObservabilityOfFrame(cx, referent)) {
-            return false;
+            // Create and populate the Debugger.Frame object.
+            RootedObject proto(cx, &object->getReservedSlot(JSSLOT_DEBUG_FRAME_PROTO).toObject());
+            RootedNativeObject debugger(cx, object);
+
+            frame = DebuggerFrame::create(cx, proto, iter, debugger);
+            if (!frame) {
+                return false;
+            }
+
+            if (!ensureExecutionObservabilityOfFrame(cx, referent)) {
+                return false;
+            }
+
+            if (genObj) {
+                DebuggerFrame* frameObj = frame;
+                if (!generatorFrames.relookupOrAdd(gp, genObj, frameObj)) {
+                    ReportOutOfMemory(cx);
+                    return false;
+                }
+            }
         }
 
         if (!frames.add(p, referent, frame)) {
+            NukeDebuggerWrapper(frame);
+            if (genObj) {
+                generatorFrames.remove(genObj);
+            }
             ReportOutOfMemory(cx);
             return false;
         }
     }
 
     result.set(&p->value()->as<DebuggerFrame>());
     return true;
 }
 
+bool
+Debugger::addGeneratorFrame(JSContext* cx,
+                            Handle<GeneratorObject*> genObj,
+                            HandleDebuggerFrame frameObj)
+{
+    GeneratorWeakMap::AddPtr p = generatorFrames.lookupForAdd(genObj);
+    if (p) {
+        MOZ_ASSERT(p->value() == frameObj);
+    } else {
+        if (!generatorFrames.relookupOrAdd(p, genObj, frameObj)) {
+            ReportOutOfMemory(cx);
+            return false;
+        }
+    }
+    return true;
+}
+
 /* static */ bool
 Debugger::hasLiveHook(GlobalObject* global, Hook which)
 {
     if (GlobalObject::DebuggerVector* debuggers = global->getDebuggers()) {
         for (auto p = debuggers->begin(); p != debuggers->end(); p++) {
             Debugger* dbg = *p;
             if (dbg->enabled && dbg->getHook(which)) {
                 return true;
@@ -875,21 +942,31 @@ Debugger::hasAnyLiveHooks(JSRuntime* rt)
           case BreakpointSite::Type::Wasm:
             if (IsMarkedUnbarriered(rt, &bp->asWasm()->wasmInstance)) {
                 return true;
             }
             break;
         }
     }
 
+    // Check for hooks in live stack frames.
     for (FrameMap::Range r = frames.all(); !r.empty(); r.popFront()) {
-        NativeObject* frameObj = r.front().value();
-        if (!frameObj->getReservedSlot(JSSLOT_DEBUGFRAME_ONSTEP_HANDLER).isUndefined() ||
-            !frameObj->getReservedSlot(JSSLOT_DEBUGFRAME_ONPOP_HANDLER).isUndefined())
+        DebuggerFrame& frameObj = r.front().value()->as<DebuggerFrame>();
+        if (frameObj.hasAnyLiveHooks()) {
             return true;
+        }
+    }
+
+    // Check for hooks set on suspended generator frames.
+    for (GeneratorWeakMap::Range r = generatorFrames.all(); !r.empty(); r.popFront()) {
+        JSObject* key = r.front().key();
+        DebuggerFrame& frameObj = r.front().value()->as<DebuggerFrame>();
+        if (IsMarkedUnbarriered(rt, &key) && frameObj.hasAnyLiveHooks()) {
+            return true;
+        }
     }
 
     return false;
 }
 
 /* static */ ResumeMode
 Debugger::slowPathOnEnterFrame(JSContext* cx, AbstractFramePtr frame)
 {
@@ -921,16 +998,56 @@ Debugger::slowPathOnEnterFrame(JSContext
 
       default:
         MOZ_CRASH("bad Debugger::onEnterFrame resume mode");
     }
 
     return resumeMode;
 }
 
+/* static */ ResumeMode
+Debugger::slowPathOnResumeFrame(JSContext* cx, AbstractFramePtr frame)
+{
+    // Don't count on this method to be called every time a generator is
+    // resumed! This is called only if the frame's debuggee bit is set,
+    // i.e. the script has breakpoints or the frame is stepping.
+    MOZ_ASSERT(frame.isGeneratorFrame());
+    MOZ_ASSERT(frame.isDebuggee());
+
+    Rooted<GeneratorObject*> genObj(cx, GetGeneratorObjectForFrame(cx, frame));
+    MOZ_ASSERT(genObj);
+
+    // For each debugger, if there is an existing Debugger.Frame object for the
+    // resumed `frame`, update it with the new frame pointer and make sure the
+    // frame is observable.
+    if (GlobalObject::DebuggerVector* debuggers = frame.global()->getDebuggers()) {
+        for (Debugger* dbg : *debuggers) {
+            if (GeneratorWeakMap::Ptr entry = dbg->generatorFrames.lookup(genObj)) {
+                DebuggerFrame* frameObj = &entry->value()->as<DebuggerFrame>();
+                if (!dbg->frames.putNew(frame, frameObj)) {
+                    ReportOutOfMemory(cx);
+                    return ResumeMode::Throw;
+                }
+
+                FrameIter iter(cx);
+                MOZ_ASSERT(iter.abstractFramePtr() == frame);
+                if (!frameObj->resume(iter)) {
+                    return ResumeMode::Throw;
+                }
+                if (!ensureExecutionObservabilityOfFrame(cx, frame)) {
+                    return ResumeMode::Throw;
+                }
+            }
+        }
+    }
+
+    return slowPathOnEnterFrame(cx, frame);
+}
+
+
 static void
 DebuggerFrame_maybeDecrementFrameScriptStepModeCount(FreeOp* fop, AbstractFramePtr frame,
                                                      NativeObject* frameobj);
 
 /*
  * RAII class to mark a generator as "running" temporarily while running
  * debugger code.
  *
@@ -945,23 +1062,24 @@ class MOZ_RAII AutoSetGeneratorRunning
     Rooted<GeneratorObject*> genObj_;
 
   public:
     AutoSetGeneratorRunning(JSContext* cx, Handle<GeneratorObject*> genObj)
       : yieldAwaitIndex_(0),
         genObj_(cx, genObj)
     {
         if (genObj) {
-            if (!genObj->isBeforeInitialYield() && !genObj->isClosed() && genObj->isSuspended()) {
+            if (!genObj->isClosed() && genObj->isSuspended()) {
+                // Yielding or awaiting.
                 yieldAwaitIndex_ =
                     genObj->getFixedSlot(GeneratorObject::YIELD_AND_AWAIT_INDEX_SLOT).toInt32();
                 genObj->setRunning();
             } else {
-                // We're returning or throwing, not yielding or awaiting. The
-                // generator is already closed, if it was ever exposed at all.
+                // Returning or throwing. The generator is already closed, if
+                // it was ever exposed at all.
                 genObj_ = nullptr;
             }
         }
     }
 
     ~AutoSetGeneratorRunning() {
         if (genObj_) {
             MOZ_ASSERT(genObj_->isRunning());
@@ -976,19 +1094,36 @@ class MOZ_RAII AutoSetGeneratorRunning
  * the frame is exiting normally or abruptly. Set |cx|'s exception and/or
  * |cx->fp()|'s return value, and return a new success value.
  */
 /* static */ bool
 Debugger::slowPathOnLeaveFrame(JSContext* cx, AbstractFramePtr frame, jsbytecode* pc, bool frameOk)
 {
     mozilla::DebugOnly<Handle<GlobalObject*>> debuggeeGlobal = cx->global();
 
+    // Determine if we are suspending this frame or popping it forever.
+    bool suspending = false;
+    Rooted<GeneratorObject*> genObj(cx);
+    if (frame.isGeneratorFrame()) {
+        // If we're leaving successfully at a yield opcode, we're probably
+        // suspending; the `isClosed()` check detects a debugger forced return
+        // from an `onStep` handler, which looks almost the same.
+        genObj = GetGeneratorObjectForFrame(cx, frame);
+        suspending =
+            frameOk &&
+            pc && (*pc == JSOP_INITIALYIELD || *pc == JSOP_YIELD || *pc == JSOP_AWAIT) &&
+            !genObj->isClosed();
+    }
+
+    bool success = false;
     auto frameMapsGuard = MakeScopeExit([&] {
-        // Clean up all Debugger.Frame instances.
-        removeFromFrameMapsAndClearBreakpointsIn(cx, frame);
+        // Clean up all Debugger.Frame instances on exit. On suspending, pass
+        // the flag that says to leave those frames `.live`. Note that if
+        // suspending && !success, the generator is closed, not suspended.
+        removeFromFrameMapsAndClearBreakpointsIn(cx, frame, suspending && success);
     });
 
     // The onPop handler and associated clean up logic should not run multiple
     // times on the same frame. If slowPathOnLeaveFrame has already been
     // called, the frame will not be present in the Debugger frame maps.
     Rooted<DebuggerFrameVector> frames(cx, DebuggerFrameVector(cx));
     if (!getDebuggerFrames(frame, &frames)) {
         return false;
@@ -997,23 +1132,16 @@ Debugger::slowPathOnLeaveFrame(JSContext
         return frameOk;
     }
 
     // Save the frame's completion value.
     ResumeMode resumeMode;
     RootedValue value(cx);
     Debugger::resultToCompletion(cx, frameOk, frame.returnValue(), &resumeMode, &value);
 
-    // If we are yielding or awaiting, we'll need to mark the generator as
-    // "running" temporarily.
-    Rooted<GeneratorObject*> genObj(cx);
-    if (frame.isFunctionFrame() && (frame.callee()->isGenerator() || frame.callee()->isAsync())) {
-        genObj = GetGeneratorObjectForFrame(cx, frame);
-    }
-
     // This path can be hit via unwinding the stack due to over-recursion or
     // OOM. In those cases, don't fire the frames' onPop handlers, because
     // invoking JS will only trigger the same condition. See
     // slowPathOnExceptionUnwind.
     if (!cx->isThrowingOverRecursed() && !cx->isThrowingOutOfMemory()) {
         // For each Debugger.Frame, fire its onPop handler, if any.
         for (size_t i = 0; i < frames.length(); i++) {
             HandleDebuggerFrame frameobj = frames[i];
@@ -1057,31 +1185,61 @@ Debugger::slowPathOnLeaveFrame(JSContext
             }
         }
     }
 
     // Establish (resumeMode, value) as our resumption value.
     switch (resumeMode) {
       case ResumeMode::Return:
         frame.setReturnValue(value);
+        success = true;
         return true;
 
       case ResumeMode::Throw:
         cx->setPendingException(value);
         return false;
 
       case ResumeMode::Terminate:
         MOZ_ASSERT(!cx->isExceptionPending());
         return false;
 
       default:
         MOZ_CRASH("bad final onLeaveFrame resume mode");
     }
 }
 
+/* static */ bool
+Debugger::slowPathOnNewGenerator(JSContext* cx, AbstractFramePtr frame,
+                                 Handle<GeneratorObject*> genObj)
+{
+    // This is called from JSOP_GENERATOR, after default parameter expressions
+    // are evaluated and well after onEnterFrame, so Debugger.Frame objects for
+    // `frame` may already have been exposed to debugger code. The
+    // GeneratorObject for this generator call, though, has just been
+    // created. It must be associated with any existing Debugger.Frames.
+    bool ok = true;
+    forEachDebuggerFrame(frame, [&] (DebuggerFrame* frameObjPtr) {
+        if (!ok) {
+            return;
+        }
+
+        RootedDebuggerFrame frameObj(cx, frameObjPtr);
+        Debugger* dbg = Debugger::fromChildJSObject(frameObj);
+        if (!dbg->addGeneratorFrame(cx, genObj, frameObj)) {
+            ReportOutOfMemory(cx);
+
+            // This leaves `genObj` and `frameObj` unassociated. It's OK
+            // because we won't pause again with this generator on the stack:
+            // the caller will immediately discard `genObj` and unwind `frame`.
+            ok = false;
+        }
+    });
+    return ok;
+}
+
 /* static */ ResumeMode
 Debugger::slowPathOnDebuggerStatement(JSContext* cx, AbstractFramePtr frame)
 {
     RootedValue rval(cx);
     ResumeMode resumeMode = dispatchHook(
         cx,
         [](Debugger* dbg) -> bool { return dbg->getHook(OnDebuggerStatement); },
         [&](Debugger* dbg) -> ResumeMode {
@@ -1538,28 +1696,30 @@ AdjustGeneratorResumptionValue(JSContext
     {
         // Treat `{return: <value>}` like a `return` statement. For generators,
         // that means doing the work below. It's only what the debuggee would
         // do for an ordinary `return` statement--using a few bytecode
         // instructions--and it's simpler to do the work manually than to count
         // on that bytecode sequence existing in the debuggee, somehow jump to
         // it, and then avoid re-entering the debugger from it.
         Rooted<GeneratorObject*> genObj(cx, GetGeneratorObjectForFrame(cx, frame));
-        if (genObj && !genObj->isBeforeInitialYield()) {
+        if (genObj) {
             // 1.  `return <value>` creates and returns a new object,
             //     `{value: <value>, done: true}`.
-            JSObject *pair = CreateIterResultObject(cx, vp, true);
-            if (!pair) {
-                // Out of memory in debuggee code. Arrange for this to propagate.
-                MOZ_ALWAYS_TRUE(cx->getPendingException(vp));
-                cx->clearPendingException();
-                resumeMode = ResumeMode::Throw;
-                return;
-            }
-            vp.setObject(*pair);
+            if (!genObj->isBeforeInitialYield()) {
+                JSObject *pair = CreateIterResultObject(cx, vp, true);
+                if (!pair) {
+                    // Out of memory in debuggee code. Arrange for this to propagate.
+                    MOZ_ALWAYS_TRUE(cx->getPendingException(vp));
+                    cx->clearPendingException();
+                    resumeMode = ResumeMode::Throw;
+                    return;
+                }
+                vp.setObject(*pair);
+            }
 
             // 2.  The generator must be closed.
             genObj->setClosed();
         } else {
             // We're before the initial yield. Carry on with the forced return.
             // The debuggee will see a call to a generator returning the
             // non-generator value *vp.
         }
@@ -3150,16 +3310,17 @@ Debugger::removeAllocationsTrackingForAl
 
 
 
 /*** Debugger JSObjects **************************************************************************/
 
 void
 Debugger::traceCrossCompartmentEdges(JSTracer* trc)
 {
+    generatorFrames.traceCrossCompartmentEdges<DebuggerFrame_trace>(trc);
     objects.traceCrossCompartmentEdges<DebuggerObject_trace>(trc);
     environments.traceCrossCompartmentEdges<DebuggerEnv_trace>(trc);
     scripts.traceCrossCompartmentEdges<DebuggerScript_trace>(trc);
     lazyScripts.traceCrossCompartmentEdges<DebuggerScript_trace>(trc);
     sources.traceCrossCompartmentEdges<DebuggerSource_trace>(trc);
     wasmInstanceScripts.traceCrossCompartmentEdges<DebuggerScript_trace>(trc);
     wasmInstanceSources.traceCrossCompartmentEdges<DebuggerSource_trace>(trc);
 }
@@ -3336,46 +3497,33 @@ Debugger::trace(JSTracer* trc)
 {
     TraceEdge(trc, &object, "Debugger Object");
 
     TraceNullableEdge(trc, &uncaughtExceptionHook, "hooks");
 
     // Mark Debugger.Frame objects. These are all reachable from JS, because the
     // corresponding JS frames are still on the stack.
     //
-    // (Once we support generator frames properly, we will need
-    // weakly-referenced Debugger.Frame objects as well, for suspended generator
-    // frames.)
+    // (We have weakly-referenced Debugger.Frame objects as well, for suspended
+    // generator frames; these are traced via generatorFrames just below.)
     for (FrameMap::Range r = frames.all(); !r.empty(); r.popFront()) {
         HeapPtr<DebuggerFrame*>& frameobj = r.front().value();
         TraceEdge(trc, &frameobj, "live Debugger.Frame");
         MOZ_ASSERT(frameobj->getPrivate(frameobj->numFixedSlotsMaybeForwarded()));
     }
 
     allocationsLog.trace(trc);
 
-    // Trace the weak map from JSScript instances to Debugger.Script objects.
+    generatorFrames.trace(trc);
     scripts.trace(trc);
-
-    // Trace the weak map from LazyScript instances to Debugger.Script objects.
     lazyScripts.trace(trc);
-
-    // Trace the referent -> Debugger.Source weak map
     sources.trace(trc);
-
-    // Trace the referent -> Debugger.Object weak map.
     objects.trace(trc);
-
-    // Trace the referent -> Debugger.Environment weak map.
     environments.trace(trc);
-
-    // Trace the WasmInstanceObject -> synthesized Debugger.Script weak map.
     wasmInstanceScripts.trace(trc);
-
-    // Trace the WasmInstanceObject -> synthesized Debugger.Source weak map.
     wasmInstanceSources.trace(trc);
 }
 
 /* static */ void
 Debugger::sweepAll(FreeOp* fop)
 {
     JSRuntime* rt = fop->runtime();
 
@@ -3432,16 +3580,17 @@ Debugger::findZoneEdges(Zone* zone, js::
                 }
             }
         } else {
             // For debugger cross compartment wrappers, add edges in the
             // opposite direction to those already added by
             // Compartment::findOutgoingEdges and above. This ensure that
             // debuggers and their debuggees are finalized in the same group.
             if (dbg->debuggeeZones.has(zone) ||
+                dbg->generatorFrames.hasKeyInZone(zone) ||
                 dbg->scripts.hasKeyInZone(zone) ||
                 dbg->lazyScripts.hasKeyInZone(zone) ||
                 dbg->sources.hasKeyInZone(zone) ||
                 dbg->objects.hasKeyInZone(zone) ||
                 dbg->environments.hasKeyInZone(zone) ||
                 dbg->wasmInstanceScripts.hasKeyInZone(zone) ||
                 dbg->wasmInstanceSources.hasKeyInZone(zone))
             {
@@ -4346,16 +4495,31 @@ Debugger::removeDebuggeeGlobal(FreeOp* f
         DebuggerFrame* frameobj = e.front().value();
         if (frame.global() == global) {
             frameobj->freeFrameIterData(fop);
             DebuggerFrame_maybeDecrementFrameScriptStepModeCount(fop, frame, frameobj);
             e.removeFront();
         }
     }
 
+    // Clear this global's generators from generatorFrames as well.
+    //
+    // This method can be called either from script (dbg.removeDebuggee) or
+    // from an awkward time during GC sweeping. In the latter case, skip this
+    // loop to avoid touching dead objects. It's correct because, when we're
+    // called from GC, all `global`'s generators are guaranteed to be dying:
+    // live generators would keep the global alive and we wouldn't be here. GC
+    // will sweep dead keys from the weakmap.
+    if (!global->zone()->isGCSweeping()) {
+        generatorFrames.removeIf([global](JSObject* key) {
+            GeneratorObject& genObj = key->as<GeneratorObject>();
+            return genObj.isClosed() || &genObj.callee().global() == global;
+        });
+    }
+
     auto *globalDebuggersVector = global->getDebuggers();
     auto *zoneDebuggersVector = global->zone()->getDebuggers();
 
     // The relation must be removed from up to three places:
     // globalDebuggersVector and debuggees for sure, and possibly the
     // compartment's debuggee set.
     //
     // The debuggee zone set is recomputed on demand. This avoids refcounting
@@ -7160,26 +7324,36 @@ Debugger::replaceFrameGuts(JSContext* cx
 Debugger::inFrameMaps(AbstractFramePtr frame)
 {
     bool foundAny = false;
     forEachDebuggerFrame(frame, [&](DebuggerFrame* frameobj) { foundAny = true; });
     return foundAny;
 }
 
 /* static */ void
-Debugger::removeFromFrameMapsAndClearBreakpointsIn(JSContext* cx, AbstractFramePtr frame)
+Debugger::removeFromFrameMapsAndClearBreakpointsIn(JSContext* cx, AbstractFramePtr frame,
+                                                   bool suspending)
 {
     forEachDebuggerFrame(frame, [&](DebuggerFrame* frameobj) {
-        Debugger* dbg = Debugger::fromChildJSObject(frameobj);
-
         FreeOp* fop = cx->runtime()->defaultFreeOp();
         frameobj->freeFrameIterData(fop);
-        DebuggerFrame_maybeDecrementFrameScriptStepModeCount(fop, frame, frameobj);
-
+        if (!suspending) {
+            DebuggerFrame_maybeDecrementFrameScriptStepModeCount(fop, frame, frameobj);
+        }
+
+        Debugger* dbg = Debugger::fromChildJSObject(frameobj);
         dbg->frames.remove(frame);
+
+        if (!suspending && frame.isGeneratorFrame()) {
+            // Terminally exiting a generator.
+            GeneratorObject* genObj = GetGeneratorObjectForFrame(cx, frame);
+            if (GeneratorWeakMap::Ptr p = dbg->generatorFrames.lookup(genObj)) {
+                dbg->generatorFrames.remove(p);
+            }
+        }
     });
 
     // If this is an eval frame, then from the debugger's perspective the
     // script is about to be destroyed. Remove any breakpoints in it.
     if (frame.isEvalFrame()) {
         RootedScript script(cx, frame.script());
         script->clearBreakpointsIn(cx->runtime()->defaultFreeOp(), nullptr, nullptr);
     }
@@ -8315,16 +8489,34 @@ ScriptedOnPopHandler::onPop(JSContext* c
     RootedValue rval(cx);
     if (!js::Call(cx, fval, frame, completion, &rval)) {
         return false;
     }
 
     return ParseResumptionValue(cx, rval, resumeMode, vp);
 };
 
+bool
+DebuggerFrame::resume(const FrameIter& iter)
+{
+    FrameIter::Data* data = iter.copyData();
+    if (!data) {
+        return false;
+    }
+    setPrivate(data);
+    return true;
+}
+
+bool
+DebuggerFrame::hasAnyLiveHooks() const
+{
+    return !getReservedSlot(JSSLOT_DEBUGFRAME_ONSTEP_HANDLER).isUndefined() ||
+           !getReservedSlot(JSSLOT_DEBUGFRAME_ONPOP_HANDLER).isUndefined();
+}
+
 /* static */ NativeObject*
 DebuggerFrame::initClass(JSContext* cx, HandleObject dbgCtor, Handle<GlobalObject*> global)
 {
     RootedObject objProto(cx, GlobalObject::getOrCreateObjectPrototype(cx, global));
 
     return InitClass(cx, dbgCtor, objProto, &class_, construct, 0, properties_,
                      methods_, nullptr, nullptr);
 }
--- a/js/src/vm/Debugger.h
+++ b/js/src/vm/Debugger.h
@@ -18,16 +18,17 @@
 #include "ds/TraceableFifo.h"
 #include "gc/Barrier.h"
 #include "gc/WeakMap.h"
 #include "js/Debug.h"
 #include "js/GCVariant.h"
 #include "js/HashTable.h"
 #include "js/Utility.h"
 #include "js/Wrapper.h"
+#include "vm/GeneratorObject.h"
 #include "vm/GlobalObject.h"
 #include "vm/JSContext.h"
 #include "vm/Realm.h"
 #include "vm/SavedStacks.h"
 #include "vm/Stack.h"
 #include "wasm/WasmJS.h"
 
 namespace js {
@@ -115,19 +116,21 @@ CheckDebuggeeThing(JSObject* obj, bool i
  * and compartments may be unnecessarily grouped, however it results in a
  * simpler and faster implementation.
  *
  * If InvisibleKeysOk is true, then the map can have keys in invisible-to-
  * debugger compartments. If it is false, we assert that such entries are never
  * created.
  *
  * Also note that keys in these weakmaps can be in any compartment, debuggee or
- * not, because they cannot be deleted when a compartment is no longer a
+ * not, because they are not deleted when a compartment is no longer a
  * debuggee: the values need to maintain object identity across add/remove/add
- * transitions.
+ * transitions. (Frames are an exception to the rule. Existing Debugger.Frame
+ * objects are killed when debugging is disabled for their compartment, and if
+ * it's re-enabled later, new Frame objects are created.)
  */
 template <class UnbarrieredKey, bool InvisibleKeysOk=false>
 class DebuggerWeakMap : private WeakMap<HeapPtr<UnbarrieredKey>, HeapPtr<JSObject*>>
 {
   private:
     typedef HeapPtr<UnbarrieredKey> Key;
     typedef HeapPtr<JSObject*> Value;
 
@@ -155,17 +158,19 @@ class DebuggerWeakMap : private WeakMap<
     typedef typename Base::Ptr Ptr;
     typedef typename Base::AddPtr AddPtr;
     typedef typename Base::Range Range;
     typedef typename Base::Enum Enum;
     typedef typename Base::Lookup Lookup;
 
     /* Expose WeakMap public interface */
 
+    using Base::lookup;
     using Base::lookupForAdd;
+    using Base::remove;
     using Base::all;
     using Base::trace;
 
     template<typename KeyInput, typename ValueInput>
     bool relookupOrAdd(AddPtr& p, const KeyInput& k, const ValueInput& v) {
         MOZ_ASSERT(v->compartment() == this->compartment);
 #ifdef DEBUG
         CheckDebuggeeThing(k, InvisibleKeysOk);
@@ -176,22 +181,39 @@ class DebuggerWeakMap : private WeakMap<
         }
         bool ok = Base::relookupOrAdd(p, k, v);
         if (!ok) {
             decZoneCount(k->zone());
         }
         return ok;
     }
 
+    template <typename KeyInput>
+    bool has(const KeyInput& k) const {
+        return !!this->lookup(k);
+    }
+
     void remove(const Lookup& l) {
         MOZ_ASSERT(Base::has(l));
         Base::remove(l);
         decZoneCount(l->zone());
     }
 
+    // Remove entries whose keys satisfy the given predicate.
+    template <typename Predicate>
+    void removeIf(Predicate test) {
+        for (Enum e(*static_cast<Base*>(this)); !e.empty(); e.popFront()) {
+            JSObject* key = e.front().key();
+            if (test(key)) {
+                decZoneCount(key->zoneFromAnyThread());
+                e.removeFront();
+            }
+        }
+    }
+
   public:
     template <void (traceValueEdges)(JSTracer*, JSObject*)>
     void traceCrossCompartmentEdges(JSTracer* tracer) {
         for (Enum e(*static_cast<Base*>(this)); !e.empty(); e.popFront()) {
             traceValueEdges(tracer, e.front().value());
             Key key = e.front().key();
             TraceEdge(tracer, &key, "Debugger WeakMap key");
             if (key != e.front().key()) {
@@ -528,16 +550,39 @@ class Debugger : private mozilla::Linked
      * has to be different.
      */
     typedef HashMap<AbstractFramePtr,
                     HeapPtr<DebuggerFrame*>,
                     DefaultHasher<AbstractFramePtr>,
                     ZoneAllocPolicy> FrameMap;
     FrameMap frames;
 
+    /*
+     * Map from generator objects to their Debugger.Frame instances.
+     *
+     * When a Debugger.Frame is created for a generator frame, it is added to
+     * this map and remains there for the lifetime of the generator, whether
+     * that frame is on the stack at the moment or not.  This is in addition to
+     * the entry in `frames` that exists as long as the generator frame is on
+     * the stack.
+     *
+     * We need to keep the Debugger.Frame object alive to deliver it to the
+     * onEnterFrame handler on resume, and to retain onStep and onPop hooks.
+     *
+     * An entry is present in this table when:
+     * -   both the debuggee generator object and the Debugger.Frame object exist
+     * -   the Debugger.Frame's owner is still an enabled debugger of
+     *     the debuggee compartment
+     * regardless of whether the frame is currently suspended. (This list is
+     * meant to explain why we update the table in the particular places where
+     * we do so.)
+     */
+    typedef DebuggerWeakMap<JSObject*> GeneratorWeakMap;
+    GeneratorWeakMap generatorFrames;
+
     /* An ephemeral map from JSScript* to Debugger.Script instances. */
     typedef DebuggerWeakMap<JSScript*> ScriptWeakMap;
     ScriptWeakMap scripts;
 
     using LazyScriptWeakMap = DebuggerWeakMap<LazyScript*>;
     LazyScriptWeakMap lazyScripts;
 
     using LazyScriptVector = JS::GCVector<LazyScript*>;
@@ -740,17 +785,18 @@ class Debugger : private mozilla::Linked
     static bool drainTraceLogger(JSContext* cx, unsigned argc, Value* vp);
 #endif
     static bool adoptDebuggeeValue(JSContext* cx, unsigned argc, Value* vp);
     static bool construct(JSContext* cx, unsigned argc, Value* vp);
     static const JSPropertySpec properties[];
     static const JSFunctionSpec methods[];
     static const JSFunctionSpec static_methods[];
 
-    static void removeFromFrameMapsAndClearBreakpointsIn(JSContext* cx, AbstractFramePtr frame);
+    static void removeFromFrameMapsAndClearBreakpointsIn(JSContext* cx, AbstractFramePtr frame,
+                                                         bool suspending = false);
     static bool updateExecutionObservabilityOfFrames(JSContext* cx, const ExecutionObservableSet& obs,
                                                      IsObserving observing);
     static bool updateExecutionObservabilityOfScripts(JSContext* cx, const ExecutionObservableSet& obs,
                                                       IsObserving observing);
     static bool updateExecutionObservability(JSContext* cx, ExecutionObservableSet& obs,
                                              IsObserving observing);
 
     template <typename FrameFn /* void (DebuggerFrame*) */>
@@ -799,18 +845,21 @@ class Debugger : private mozilla::Linked
     void updateObservesAsmJSOnDebuggees(IsObserving observing);
     void updateObservesBinarySourceDebuggees(IsObserving observing);
 
     JSObject* getHook(Hook hook) const;
     bool hasAnyLiveHooks(JSRuntime* rt) const;
 
     static MOZ_MUST_USE bool slowPathCheckNoExecute(JSContext* cx, HandleScript script);
     static ResumeMode slowPathOnEnterFrame(JSContext* cx, AbstractFramePtr frame);
+    static ResumeMode slowPathOnResumeFrame(JSContext* cx, AbstractFramePtr frame);
     static MOZ_MUST_USE bool slowPathOnLeaveFrame(JSContext* cx, AbstractFramePtr frame,
                                                   jsbytecode* pc, bool ok);
+    static MOZ_MUST_USE bool slowPathOnNewGenerator(JSContext* cx, AbstractFramePtr frame,
+                                                    Handle<GeneratorObject*> genObj);
     static ResumeMode slowPathOnDebuggerStatement(JSContext* cx, AbstractFramePtr frame);
     static ResumeMode slowPathOnExceptionUnwind(JSContext* cx, AbstractFramePtr frame);
     static void slowPathOnNewScript(JSContext* cx, HandleScript script);
     static void slowPathOnNewWasmInstance(JSContext* cx, Handle<WasmInstanceObject*> wasmInstance);
     static void slowPathOnNewGlobalObject(JSContext* cx, Handle<GlobalObject*> global);
     static MOZ_MUST_USE bool slowPathOnLogAllocationSite(JSContext* cx, HandleObject obj,
                                                          HandleSavedFrame frame,
                                                          mozilla::TimeStamp when,
@@ -929,16 +978,33 @@ class Debugger : private mozilla::Linked
     /*
      * Announce to the debugger that the context has entered a new JavaScript
      * frame, |frame|. Call whatever hooks have been registered to observe new
      * frames.
      */
     static inline ResumeMode onEnterFrame(JSContext* cx, AbstractFramePtr frame);
 
     /*
+     * Like onEnterFrame, but for resuming execution of a generator or async
+     * function. `frame` is a new baseline or interpreter frame, but abstractly
+     * it can be identified with a particular generator frame that was
+     * suspended earlier.
+     *
+     * There is no separate user-visible Debugger.onResumeFrame hook; this
+     * fires .onEnterFrame (again, since we're re-entering the frame).
+     *
+     * Unfortunately, the interpreter and the baseline JIT arrange for this to
+     * be called in different ways. The interpreter calls it from JSOP_RESUME,
+     * immediately after pushing the resumed frame; the JIT calls it from
+     * JSOP_DEBUGAFTERYIELD, just after the generator resumes. The difference
+     * should not be user-visible.
+     */
+    static inline ResumeMode onResumeFrame(JSContext* cx, AbstractFramePtr frame);
+
+    /*
      * Announce to the debugger a |debugger;| statement on has been
      * encountered on the youngest JS frame on |cx|. Call whatever hooks have
      * been registered to observe this.
      *
      * Note that this method is called for all |debugger;| statements,
      * regardless of the frame's debuggee-ness.
      */
     static inline ResumeMode onDebuggerStatement(JSContext* cx, AbstractFramePtr frame);
@@ -961,16 +1027,25 @@ class Debugger : private mozilla::Linked
      * first call has any effect. (Permitting double calls simplifies some
      * cases where an onPop handler's resumption value changes a return to a
      * throw, or vice versa: we can redirect to a complete copy of the
      * alternative path, containing its own call to onLeaveFrame.)
      */
     static inline MOZ_MUST_USE bool onLeaveFrame(JSContext* cx, AbstractFramePtr frame,
                                                  jsbytecode* pc, bool ok);
 
+    /*
+     * Announce to the debugger that a generator object has been created,
+     * via JSOP_GENERATOR.
+     *
+     * This does not fire user hooks, but it's needed for debugger bookkeeping.
+     */
+    static inline MOZ_MUST_USE bool onNewGenerator(JSContext* cx, AbstractFramePtr frame,
+                                                   Handle<GeneratorObject*> genObj);
+
     static inline void onNewScript(JSContext* cx, HandleScript script);
     static inline void onNewWasmInstance(JSContext* cx, Handle<WasmInstanceObject*> wasmInstance);
     static inline void onNewGlobalObject(JSContext* cx, Handle<GlobalObject*> global);
     static inline MOZ_MUST_USE bool onLogAllocationSite(JSContext* cx, JSObject* obj,
                                                         HandleSavedFrame frame, mozilla::TimeStamp when);
     static ResumeMode onTrap(JSContext* cx, MutableHandleValue vp);
     static ResumeMode onSingleStep(JSContext* cx, MutableHandleValue vp);
     static MOZ_MUST_USE bool handleBaselineOsr(JSContext* cx, InterpreterFrame* from,
@@ -1145,16 +1220,33 @@ class Debugger : private mozilla::Linked
     /*
      * Return the Debugger.Source object for |wasmInstance| (the entire module),
      * synthesizing a new one if needed. The context |cx| must be in the
      * debugger compartment; |wasmInstance| must be a WasmInstanceObject in the
      * debuggee realm.
      */
     JSObject* wrapWasmSource(JSContext* cx, Handle<WasmInstanceObject*> wasmInstance);
 
+    /*
+     * Add a link between the given generator object and a Debugger.Frame
+     * object.  This link is used to make sure the same Debugger.Frame stays
+     * associated with a given generator object (or async function activation),
+     * even while it is suspended and removed from the stack.
+     *
+     * The context `cx` and `frameObj` must be in the debugger realm, and
+     * `genObj` must be in a debuggee realm.
+     *
+     * `frameObj` must be this `Debugger`'s debug wrapper for the generator or
+     * async function call associated with `genObj`. This activation may
+     * or may not actually be on the stack right now.
+     */
+    MOZ_MUST_USE bool addGeneratorFrame(JSContext* cx,
+                                        Handle<GeneratorObject*> genObj,
+                                        HandleDebuggerFrame frameObj);
+
   private:
     Debugger(const Debugger&) = delete;
     Debugger & operator=(const Debugger&) = delete;
 };
 
 enum class DebuggerEnvironmentType {
     Declarative,
     With,
@@ -1392,16 +1484,24 @@ class DebuggerFrame : public NativeObjec
                                   const EvalOptions& options, ResumeMode& resumeMode,
                                   MutableHandleValue value);
 
     bool isLive() const;
     OnStepHandler* onStepHandler() const;
     OnPopHandler* onPopHandler() const;
     void setOnPopHandler(OnPopHandler* handler);
 
+    /*
+     * Called after a generator/async frame is resumed, before exposing this
+     * Debugger.Frame object to any hooks.
+     */
+    bool resume(const FrameIter& iter);
+
+    bool hasAnyLiveHooks() const;
+
   private:
     static const ClassOps classOps_;
 
     static const JSPropertySpec properties_[];
     static const JSFunctionSpec methods_[];
 
     static AbstractFramePtr getReferent(HandleDebuggerFrame frame);
     static MOZ_MUST_USE bool getFrameIter(JSContext* cx, HandleDebuggerFrame frame,
--- a/js/src/vm/GeneratorObject.cpp
+++ b/js/src/vm/GeneratorObject.cpp
@@ -4,27 +4,28 @@
  * 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 "vm/GeneratorObject.h"
 
 #include "vm/JSObject.h"
 
 #include "vm/ArrayObject-inl.h"
+#include "vm/Debugger-inl.h"
 #include "vm/JSAtom-inl.h"
 #include "vm/JSScript-inl.h"
 #include "vm/NativeObject-inl.h"
 #include "vm/Stack-inl.h"
 
 using namespace js;
 
 JSObject*
 GeneratorObject::create(JSContext* cx, AbstractFramePtr frame)
 {
-    MOZ_ASSERT(frame.script()->isGenerator() || frame.script()->isAsync());
+    MOZ_ASSERT(frame.isGeneratorFrame());
     MOZ_ASSERT(frame.script()->nfixed() == 0);
     MOZ_ASSERT(!frame.isConstructing());
 
     Rooted<GlobalObject*> global(cx, cx->global());
 
     RootedValue pval(cx);
     RootedObject fun(cx, frame.callee());
     // FIXME: This would be faster if we could avoid doing a lookup to get
@@ -46,16 +47,20 @@ GeneratorObject::create(JSContext* cx, A
 
     genObj->setCallee(*frame.callee());
     genObj->setEnvironmentChain(*frame.environmentChain());
     if (frame.script()->needsArgsObj()) {
         genObj->setArgsObj(frame.argsObj());
     }
     genObj->clearExpressionStack();
 
+    if (!Debugger::onNewGenerator(cx, frame, genObj)) {
+        return nullptr;
+    }
+
     return genObj;
 }
 
 bool
 GeneratorObject::suspend(JSContext* cx, HandleObject obj, AbstractFramePtr frame, jsbytecode* pc,
                          Value* vp, unsigned nvalues)
 {
     MOZ_ASSERT(*pc == JSOP_INITIALYIELD || *pc == JSOP_YIELD || *pc == JSOP_AWAIT);
@@ -105,18 +110,17 @@ GeneratorObject::finalSuspend(HandleObje
     MOZ_ASSERT(genObj->isRunning() || genObj->isClosing());
     genObj->setClosed();
 }
 
 GeneratorObject*
 js::GetGeneratorObjectForFrame(JSContext* cx, AbstractFramePtr frame)
 {
     cx->check(frame);
-    MOZ_ASSERT(frame.isFunctionFrame() &&
-               (frame.callee()->isGenerator() || frame.callee()->isAsync()));
+    MOZ_ASSERT(frame.isGeneratorFrame());
 
     // The ".generator" binding is always present and always "aliased".
     CallObject& callObj = frame.callObj();
     Shape* shape = callObj.lookup(cx, cx->names().dotGenerator);
     Value genValue = callObj.getSlot(shape->slot());
 
     // If the `generator; setaliasedvar ".generator"; initialyield` bytecode
     // sequence has not run yet, genValue is undefined.
--- a/js/src/vm/Interpreter.cpp
+++ b/js/src/vm/Interpreter.cpp
@@ -4571,17 +4571,17 @@ CASE(JSOP_RESUME)
         }
         SET_SCRIPT(generatorScript);
 
         TraceLoggerThread* logger = TraceLoggerForCurrentThread(cx);
         TraceLoggerEvent scriptEvent(TraceLogger_Scripts, script);
         TraceLogStartEvent(logger, scriptEvent);
         TraceLogStartEvent(logger, TraceLogger_Interpreter);
 
-        switch (Debugger::onEnterFrame(cx, REGS.fp())) {
+        switch (Debugger::onResumeFrame(cx, REGS.fp())) {
           case ResumeMode::Continue:
             break;
           case ResumeMode::Throw:
           case ResumeMode::Terminate:
             goto error;
           case ResumeMode::Return:
             MOZ_ASSERT_IF(REGS.fp()->callee().isGenerator(),  // as opposed to an async function
                           gen->isClosed());
--- a/js/src/vm/Stack-inl.h
+++ b/js/src/vm/Stack-inl.h
@@ -782,16 +782,26 @@ AbstractFramePtr::isFunctionFrame() cons
     }
     if (isWasmDebugFrame()) {
         return false;
     }
     return asRematerializedFrame()->isFunctionFrame();
 }
 
 inline bool
+AbstractFramePtr::isGeneratorFrame() const
+{
+    if (!isFunctionFrame()) {
+        return false;
+    }
+    JSScript* s = script();
+    return s->isGenerator() || s->isAsync();
+}
+
+inline bool
 AbstractFramePtr::isNonStrictDirectEvalFrame() const
 {
     if (isInterpreterFrame()) {
         return asInterpreterFrame()->isNonStrictDirectEvalFrame();
     }
     if (isBaselineFrame()) {
         return asBaselineFrame()->isNonStrictDirectEvalFrame();
     }
--- a/js/src/vm/Stack.h
+++ b/js/src/vm/Stack.h
@@ -242,16 +242,17 @@ class AbstractFramePtr
     inline Value& thisArgument() const;
 
     inline bool isConstructing() const;
     inline Value newTarget() const;
 
     inline bool debuggerNeedsCheckPrimitiveReturn() const;
 
     inline bool isFunctionFrame() const;
+    inline bool isGeneratorFrame() const;
     inline bool isNonStrictDirectEvalFrame() const;
     inline bool isStrictEvalFrame() const;
 
     inline unsigned numActualArgs() const;
     inline unsigned numFormalArgs() const;
 
     inline Value* argv() const;
 
--- a/js/xpconnect/idl/xpccomponents.idl
+++ b/js/xpconnect/idl/xpccomponents.idl
@@ -734,23 +734,20 @@ interface nsIXPCComponents_Utils : nsISu
     nsILoadContext createLoadContext();
 
     /* Create a private loadcontext object. */
     nsILoadContext createPrivateLoadContext();
 
     /* Create a persistent property object. */
     nsIPersistentProperties createPersistentProperties();
 
-    // These functions are for startup testing purposes. They are not expected
+    // These attributes are for startup testing purposes. They are not expected
     // to be used for production code.
-    void loadedModules([optional] out unsigned long length,
-                       [retval, array, size_is(length)] out string aModules);
-
-    void loadedComponents([optional] out unsigned long length,
-                          [retval, array, size_is(length)] out string aComponents);
+    readonly attribute Array<ACString> loadedModules;
+    readonly attribute Array<ACString> loadedComponents;
 
     // These 2 functions will only return useful values if the
     // "browser.startup.record" preference was true at the time the JS file
     // was loaded.
     ACString getModuleImportStack(in AUTF8String aLocation);
     ACString getComponentLoadStack(in AUTF8String aLocation);
 };
 
--- a/js/xpconnect/loader/mozJSComponentLoader.cpp
+++ b/js/xpconnect/loader/mozJSComponentLoader.cpp
@@ -1058,40 +1058,30 @@ mozJSComponentLoader::IsModuleLoaded(con
     rv = info.EnsureKey();
     NS_ENSURE_SUCCESS(rv, rv);
 
     *retval = !!mImports.Get(info.Key());
     return NS_OK;
 }
 
 void
-mozJSComponentLoader::LoadedModules(uint32_t* length,
-                                    char*** aModules)
+mozJSComponentLoader::GetLoadedModules(nsTArray<nsCString>& aLoadedModules)
 {
-    char** modules = new char*[mImports.Count()];
-    *length = mImports.Count();
-    *aModules = modules;
-
+    aLoadedModules.SetCapacity(mImports.Count());
     for (auto iter = mImports.Iter(); !iter.Done(); iter.Next()) {
-        *modules = NS_xstrdup(iter.Data()->location);
-        modules++;
+        aLoadedModules.AppendElement(iter.Data()->location);
     }
 }
 
 void
-mozJSComponentLoader::LoadedComponents(uint32_t* length,
-                                       char*** aComponents)
+mozJSComponentLoader::GetLoadedComponents(nsTArray<nsCString>& aLoadedComponents)
 {
-    char** comp = new char*[mModules.Count()];
-    *length = mModules.Count();
-    *aComponents = comp;
-
+    aLoadedComponents.SetCapacity(mModules.Count());
     for (auto iter = mModules.Iter(); !iter.Done(); iter.Next()) {
-        *comp = NS_xstrdup(iter.Data()->location);
-        comp++;
+        aLoadedComponents.AppendElement(iter.Data()->location);
     }
 }
 
 nsresult
 mozJSComponentLoader::GetModuleImportStack(const nsACString& aLocation,
                                            nsACString& retval)
 {
 #ifdef STARTUP_RECORDER_ENABLED
--- a/js/xpconnect/loader/mozJSComponentLoader.h
+++ b/js/xpconnect/loader/mozJSComponentLoader.h
@@ -44,18 +44,18 @@ namespace mozilla {
 class mozJSComponentLoader final : public nsIObserver
 {
  public:
     NS_DECL_ISUPPORTS
     NS_DECL_NSIOBSERVER
 
     mozJSComponentLoader();
 
-    void LoadedModules(uint32_t* aLength, char*** aModules);
-    void LoadedComponents(uint32_t* aLength, char*** aComponents);
+    void GetLoadedModules(nsTArray<nsCString>& aLoadedModules);
+    void GetLoadedComponents(nsTArray<nsCString>& aLoadedComponents);
     nsresult GetModuleImportStack(const nsACString& aLocation, nsACString& aRetval);
     nsresult GetComponentLoadStack(const nsACString& aLocation, nsACString& aRetval);
 
     const mozilla::Module* LoadModule(mozilla::FileLocation& aFile);
 
     void FindTargetObject(JSContext* aCx,
                           JS::MutableHandleObject aTargetObject);
 
--- a/js/xpconnect/src/XPCComponents.cpp
+++ b/js/xpconnect/src/XPCComponents.cpp
@@ -3266,28 +3266,26 @@ nsXPCComponents_Utils::CreatePersistentP
 {
     NS_ENSURE_ARG_POINTER(aPersistentProperties);
     nsCOMPtr<nsIPersistentProperties> props = new nsPersistentProperties();
     props.forget(aPersistentProperties);
     return NS_OK;
 }
 
 NS_IMETHODIMP
-nsXPCComponents_Utils::LoadedModules(uint32_t* aLength,
-                                     char*** aModules)
+nsXPCComponents_Utils::GetLoadedModules(nsTArray<nsCString>& aLoadedModules)
 {
-    mozJSComponentLoader::Get()->LoadedModules(aLength, aModules);
+    mozJSComponentLoader::Get()->GetLoadedModules(aLoadedModules);
     return NS_OK;
 }
 
 NS_IMETHODIMP
-nsXPCComponents_Utils::LoadedComponents(uint32_t* aLength,
-                                        char*** aComponents)
+nsXPCComponents_Utils::GetLoadedComponents(nsTArray<nsCString>& aLoadedComponents)
 {
-    mozJSComponentLoader::Get()->LoadedComponents(aLength, aComponents);
+    mozJSComponentLoader::Get()->GetLoadedComponents(aLoadedComponents);
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsXPCComponents_Utils::GetModuleImportStack(const nsACString& aLocation,
                                             nsACString& aRetval)
 {
     return mozJSComponentLoader::Get()->GetModuleImportStack(aLocation, aRetval);
--- a/layout/reftests/svg/svg-integration/clip-path/reftest.list
+++ b/layout/reftests/svg/svg-integration/clip-path/reftest.list
@@ -9,17 +9,17 @@
 == clip-path-polygon-005.html clip-path-rectangle-border-ref.html
 == clip-path-polygon-006.html clip-path-square-001-ref.html
 == clip-path-polygon-007.html clip-path-stripes-001-ref.html
 == clip-path-polygon-008.html clip-path-stripes-002-ref.html
 == clip-path-polygon-009.html clip-path-square-002-ref.html
 == clip-path-polygon-010.html clip-path-stripes-001-ref.html
 == clip-path-polygon-011.html clip-path-stripes-001-ref.html
 == clip-path-polygon-012.html clip-path-stripes-001-ref.html
-fuzzy-if(skiaContent,0-1,0-20) fails-if(webrender&&!gtkWidget) == clip-path-polygon-013.html clip-path-stripes-003-ref.html
+fuzzy-if(skiaContent,0-1,0-20) fuzzy-if(webrender&&gtkWidget,8-8,20-20) fails-if(webrender&&!gtkWidget) == clip-path-polygon-013.html clip-path-stripes-003-ref.html
 
 fuzzy-if(webrender,35-35,703-703) == clip-path-circle-001.html clip-path-circle-001-ref.html
 fuzzy-if(webrender,35-35,703-703) == clip-path-circle-002.html clip-path-circle-001-ref.html
 fuzzy-if(webrender,35-35,703-703) == clip-path-circle-003.html clip-path-circle-001-ref.html
 fuzzy-if(webrender,35-35,703-703) == clip-path-circle-004.html clip-path-circle-001-ref.html
 fuzzy-if(webrender,35-35,703-703) == clip-path-circle-005.html clip-path-circle-002-ref.html
 fuzzy-if(webrender,35-35,703-703) == clip-path-circle-006.html clip-path-circle-001-ref.html
 fuzzy-if(webrender,35-35,703-703) == clip-path-circle-007.html clip-path-circle-002-ref.html
--- a/layout/reftests/transform-3d/reftest.list
+++ b/layout/reftests/transform-3d/reftest.list
@@ -77,18 +77,18 @@ fuzzy-if(cocoaWidget,0-128,0-9) random-i
 == 1245450-1.html green-rect.html
 fuzzy(0-1,0-2000) == opacity-preserve3d-1.html opacity-preserve3d-1-ref.html
 fuzzy(0-1,0-15000) == opacity-preserve3d-2.html opacity-preserve3d-2-ref.html
 fuzzy(0-1,0-10000) == opacity-preserve3d-3.html opacity-preserve3d-3-ref.html
 fuzzy(0-1,0-10000) == opacity-preserve3d-4.html opacity-preserve3d-4-ref.html
 == opacity-preserve3d-5.html opacity-preserve3d-5-ref.html
 == snap-perspective-1.html snap-perspective-1-ref.html
 == mask-layer-1.html mask-layer-ref.html
-== mask-layer-2.html mask-layer-ref.html
-fuzzy-if(webrender,0-1,0-16) == mask-layer-3.html mask-layer-ref.html
+fuzzy-if(webrender&&gtkWidget,16-16,100-100) == mask-layer-2.html mask-layer-ref.html
+fuzzy-if(webrender,0-16,0-100) == mask-layer-3.html mask-layer-ref.html
 == split-intersect1.html split-intersect1-ref.html
 fuzzy(0-255,0-150) == split-intersect2.html split-intersect2-ref.html
 fuzzy(0-255,0-100) == split-non-ortho1.html split-non-ortho1-ref.html
 fuzzy-if(winWidget,0-150,0-120) == component-alpha-1.html component-alpha-1-ref.html
 == nested-transform-1.html nested-transform-1-ref.html
 == transform-geometry-1.html transform-geometry-1-ref.html
 == intermediate-1.html intermediate-1-ref.html
 == preserves3d-nested-filter-1.html preserves3d-nested-filter-1-ref.html
--- a/mobile/android/config/mozconfigs/android-api-16-gradle-dependencies/nightly
+++ b/mobile/android/config/mozconfigs/android-api-16-gradle-dependencies/nightly
@@ -9,17 +9,17 @@ MOZ_AUTOMATION_PACKAGE_GENERATED_SOURCES
 NO_CACHE=1
 NO_NDK=1
 
 . "$topsrcdir/mobile/android/config/mozconfigs/common"
 
 # We want to download Gradle.
 ac_add_options --with-gradle
 # We want to use (and populate!) the local Nexus repositories.
-export GRADLE_MAVEN_REPOSITORIES="http://localhost:8081/nexus/content/repositories/jcenter/","http://localhost:8081/nexus/content/repositories/google/"
+export GRADLE_MAVEN_REPOSITORIES="http://localhost:8081/nexus/content/repositories/google/","http://localhost:8081/nexus/content/repositories/jcenter/"
 
 # From here on, just like ../android-api-16-frontend/nightly.
 
 . "$topsrcdir/build/mozconfig.no-compile"
 
 ac_add_options --disable-tests
 
 # Android
--- a/mobile/android/config/mozconfigs/common
+++ b/mobile/android/config/mozconfigs/common
@@ -16,17 +16,17 @@ MOZ_AUTOMATION_L10N_CHECK=0
 HOST_CC="$topsrcdir/clang/bin/clang"
 HOST_CXX="$topsrcdir/clang/bin/clang++"
 
 # Build Fennec
 ac_add_options --enable-application=mobile/android
 ac_add_options --with-android-sdk="$topsrcdir/android-sdk-linux"
 
 ac_add_options --with-gradle="$topsrcdir/android-gradle-dependencies/gradle-dist/bin/gradle"
-export GRADLE_MAVEN_REPOSITORIES="file://$topsrcdir/android-gradle-dependencies/jcenter","file://$topsrcdir/android-gradle-dependencies/google"
+export GRADLE_MAVEN_REPOSITORIES="file://$topsrcdir/android-gradle-dependencies/google","file://$topsrcdir/android-gradle-dependencies/jcenter"
 
 if [ -z "$NO_NDK" ]; then
     # We use our own clang instead of the NDK's clang.
     CC="$topsrcdir/clang/bin/clang"
     CXX="$topsrcdir/clang/bin/clang++"
     ac_add_options --with-android-ndk="$topsrcdir/android-ndk"
 fi
 
--- a/mobile/android/gradle.configure
+++ b/mobile/android/gradle.configure
@@ -289,18 +289,18 @@ def gradle_flags(value):
     return value[0] if value else ''
 
 set_config('GRADLE_FLAGS', gradle_flags)
 
 # Automation will set this to (file:///path/to/local, ...) via the mozconfig.
 # Local developer default is (jcenter, maven.google.com).
 option(env='GRADLE_MAVEN_REPOSITORIES',
        nargs='+',
-       default=('https://jcenter.bintray.com/',
-                'https://maven.google.com/',
+       default=('https://maven.google.com/',
+                'https://jcenter.bintray.com/',
        ),
        help='Comma-separated URLs of Maven repositories containing Gradle dependencies.')
 
 @depends('GRADLE_MAVEN_REPOSITORIES')
 @imports(_from='os.path', _import='isdir')
 def gradle_maven_repositories(values):
     if not values:
         die('GRADLE_MAVEN_REPOSITORIES must not be empty')
--- a/modules/libmar/sign/nss_secutil.h
+++ b/modules/libmar/sign/nss_secutil.h
@@ -8,17 +8,17 @@
 #ifndef NSS_SECUTIL_H_
 #define NSS_SECUTIL_H_
 
 #include "nss.h"
 #include "pk11pub.h"
 #include "cryptohi.h"
 #include "hasht.h"
 #include "cert.h"
-#include "key.h"
+#include "keyhi.h"
 #include <stdint.h>
 
 typedef struct {
   enum {
     PW_NONE = 0,
     PW_FROMFILE = 1,
     PW_PLAINTEXT = 2,
     PW_EXTERNAL = 3
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -5496,18 +5496,23 @@ pref("urlclassifier.phishTable", "googpu
 
 // Tables for application reputation
 pref("urlclassifier.downloadAllowTable", "goog-downloadwhite-proto");
 pref("urlclassifier.downloadBlockTable", "goog-badbinurl-proto");
 
 // Tables for login reputation
 pref("urlclassifier.passwordAllowTable", "goog-passwordwhite-proto");
 
-// Tables for tracking protection
+// Tables for anti-tracking features
+#ifdef NIGHTLY_BUILD
+// Use the strict list for the default cookie restrictions in Nightly
+pref("urlclassifier.trackingAnnotationTable", "test-track-simple,base-track-digest256,content-track-digest256");
+#else
 pref("urlclassifier.trackingAnnotationTable", "test-track-simple,base-track-digest256");
+#endif
 pref("urlclassifier.trackingAnnotationWhitelistTable", "test-trackwhite-simple,mozstd-trackwhite-digest256");
 pref("urlclassifier.trackingTable", "test-track-simple,base-track-digest256");
 pref("urlclassifier.trackingWhitelistTable", "test-trackwhite-simple,mozstd-trackwhite-digest256");
 
 // These tables will never trigger a gethash call.
 pref("urlclassifier.disallow_completions", "test-malware-simple,test-harmful-simple,test-phish-simple,test-unwanted-simple,test-track-simple,test-trackwhite-simple,test-block-simple,goog-downloadwhite-digest256,base-track-digest256,mozstd-trackwhite-digest256,content-track-digest256,mozplugin-block-digest256,mozplugin2-block-digest256,block-flash-digest256,except-flash-digest256,allow-flashallow-digest256,except-flashallow-digest256,block-flashsubdoc-digest256,except-flashsubdoc-digest256,except-flashinfobar-digest256,goog-passwordwhite-proto,ads-track-digest256,social-track-digest256,analytics-track-digest256,fastblock1-track-digest256,fastblock1-trackwhite-digest256,fastblock2-track-digest256,fastblock2-trackwhite-digest256,fastblock3-track-digest256");
 
 // Number of random entries to send with a gethash request
--- a/netwerk/base/RequestContextService.cpp
+++ b/netwerk/base/RequestContextService.cpp
@@ -10,33 +10,37 @@
 #include "nsIDocumentLoader.h"
 #include "nsIObserverService.h"
 #include "nsIXULRuntime.h"
 #include "nsServiceManagerUtils.h"
 #include "nsThreadUtils.h"
 #include "RequestContextService.h"
 
 #include "mozilla/Atomics.h"
+#include "mozilla/ClearOnShutdown.h"
 #include "mozilla/Logging.h"
 #include "mozilla/Services.h"
+#include "mozilla/StaticPtr.h"
 #include "mozilla/TimeStamp.h"
 
 #include "mozilla/net/NeckoChild.h"
 #include "mozilla/net/NeckoCommon.h"
 #include "mozilla/net/PSpdyPush.h"
 
 #include "../protocol/http/nsHttpHandler.h"
 
 namespace mozilla {
 namespace net {
 
 LazyLogModule gRequestContextLog("RequestContext");
 #undef LOG
 #define LOG(args) MOZ_LOG(gRequestContextLog, LogLevel::Info, args)
 
+static StaticRefPtr<RequestContextService> gSingleton;
+
 // This is used to prevent adding tail pending requests after shutdown
 static bool sShutdown = false;
 
 // nsIRequestContext
 class RequestContext final : public nsIRequestContext
                            , public nsITimerCallback
 {
 public:
@@ -513,29 +517,33 @@ RequestContextService::Shutdown()
   // shutdown.
   for (auto iter = mTable.Iter(); !iter.Done(); iter.Next()) {
     iter.Data()->CancelTailPendingRequests(NS_ERROR_ABORT);
   }
   mTable.Clear();
   sShutdown = true;
 }
 
-/* static */ nsresult
-RequestContextService::Create(nsISupports *aOuter, const nsIID& aIID, void **aResult)
+/* static */ already_AddRefed<nsIRequestContextService>
+RequestContextService::GetOrCreate()
 {
   MOZ_ASSERT(NS_IsMainThread());
-  if (aOuter != nullptr) {
-    return NS_ERROR_NO_AGGREGATION;
+
+  RefPtr<RequestContextService> svc;
+  if (gSingleton) {
+    svc = gSingleton;
+  } else {
+    svc = new RequestContextService();
+    nsresult rv = svc->Init();
+    NS_ENSURE_SUCCESS(rv, nullptr);
+    gSingleton = svc;
+    ClearOnShutdown(&gSingleton);
   }
 
-  RefPtr<RequestContextService> svc = new RequestContextService();
-  nsresult rv = svc->Init();
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  return svc->QueryInterface(aIID, aResult);
+  return svc.forget();
 }
 
 NS_IMETHODIMP
 RequestContextService::GetRequestContext(const uint64_t rcID, nsIRequestContext **rc)
 {
   MOZ_ASSERT(NS_IsMainThread());
   NS_ENSURE_ARG_POINTER(rc);
   *rc = nullptr;
--- a/netwerk/base/RequestContextService.h
+++ b/netwerk/base/RequestContextService.h
@@ -19,24 +19,24 @@ class RequestContextService final
   : public nsIRequestContextService
   , public nsIObserver
 {
 public:
   NS_DECL_ISUPPORTS
   NS_DECL_NSIREQUESTCONTEXTSERVICE
   NS_DECL_NSIOBSERVER
 
+  static already_AddRefed<nsIRequestContextService> GetOrCreate();
+
+private:
   RequestContextService();
+  virtual ~RequestContextService();
 
   nsresult Init();
   void Shutdown();
-  static nsresult Create(nsISupports *outer, const nsIID& iid, void **result);
-
-private:
-  virtual ~RequestContextService();
 
   static RequestContextService *sSelf;
 
   nsInterfaceHashtable<nsUint64HashKey, nsIRequestContext> mTable;
   uint32_t mRCIDNamespace;
   uint32_t mNextRCID;
 };
 
--- a/netwerk/base/moz.build
+++ b/netwerk/base/moz.build
@@ -172,16 +172,17 @@ EXPORTS.mozilla.net += [
     'Dashboard.h',
     'DashboardTypes.h',
     'IOActivityMonitor.h',
     'MemoryDownloader.h',
     'PartiallySeekableInputStream.h',
     'Predictor.h',
     'RedirectChannelRegistrar.h',
     'ReferrerPolicy.h',
+    'RequestContextService.h',
     'SimpleChannelParent.h',
     'TCPFastOpen.h',
 ]
 
 UNIFIED_SOURCES += [
     'ArrayBufferInputStream.cpp',
     'BackgroundFileSaver.cpp',
     'CaptivePortalService.cpp',
--- a/netwerk/base/nsLoadGroup.cpp
+++ b/netwerk/base/nsLoadGroup.cpp
@@ -16,16 +16,17 @@
 #include "nsTArray.h"
 #include "mozilla/Telemetry.h"
 #include "nsITimedChannel.h"
 #include "nsIInterfaceRequestor.h"
 #include "nsIRequestObserver.h"
 #include "nsIRequestContext.h"
 #include "CacheObserver.h"
 #include "MainThreadUtils.h"
+#include "RequestContextService.h"
 #include "mozilla/Unused.h"
 
 namespace mozilla {
 namespace net {
 
 //
 // Log module for nsILoadGroup logging...
 //
@@ -1051,17 +1052,17 @@ nsresult nsLoadGroup::MergeDefaultLoadFl
         rv = aRequest->SetLoadFlags(flags);
     }
     outFlags = flags;
     return rv;
 }
 
 nsresult nsLoadGroup::Init()
 {
-    mRequestContextService = do_GetService("@mozilla.org/network/request-context-service;1");
+    mRequestContextService = RequestContextService::GetOrCreate();
     if (mRequestContextService) {
         Unused << mRequestContextService->NewRequestContext(getter_AddRefs(mRequestContext));
     }
 
     return NS_OK;
 }
 
 } // namespace net
--- a/netwerk/base/nsNetUtil.cpp
+++ b/netwerk/base/nsNetUtil.cpp
@@ -44,28 +44,28 @@
 #include "nsINode.h"
 #include "nsIObjectLoadingContent.h"
 #include "nsIOfflineCacheUpdate.h"
 #include "nsPersistentProperties.h"
 #include "nsIPrivateBrowsingChannel.h"
 #include "nsIPropertyBag2.h"
 #include "nsIProtocolProxyService.h"
 #include "mozilla/net/RedirectChannelRegistrar.h"
-#include "nsIRequestObserverProxy.h"
+#include "nsRequestObserverProxy.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsISensitiveInfoHiddenURI.h"
 #include "nsISimpleStreamListener.h"
 #include "nsISocketProvider.h"
 #include "nsISocketProviderService.h"
 #include "nsIStandardURL.h"
 #include "nsIStreamLoader.h"
 #include "nsIIncrementalStreamLoader.h"
 #include "nsIStreamTransportService.h"
 #include "nsStringStream.h"
-#include "nsISyncStreamListener.h"
+#include "nsSyncStreamListener.h"
 #include "nsITransport.h"
 #include "nsIURIWithSpecialOrigin.h"
 #include "nsIURLParser.h"
 #include "nsIUUIDGenerator.h"
 #include "nsIViewSourceChannel.h"
 #include "nsInterfaceRequestorAgg.h"
 #include "plstr.h"
 #include "nsINestedURI.h"
@@ -1181,26 +1181,25 @@ NS_NewStreamLoader(nsIStreamLoader      
                                     aLoadFlags,
                                     aReferrer);
 }
 
 nsresult
 NS_NewSyncStreamListener(nsIStreamListener **result,
                          nsIInputStream    **stream)
 {
-    nsresult rv;
-    nsCOMPtr<nsISyncStreamListener> listener =
-        do_CreateInstance(NS_SYNCSTREAMLISTENER_CONTRACTID, &rv);
-    if (NS_SUCCEEDED(rv)) {
-        rv = listener->GetInputStream(stream);
+    nsCOMPtr<nsISyncStreamListener> listener = nsSyncStreamListener::Create();
+    if (listener) {
+        nsresult rv = listener->GetInputStream(stream);
         if (NS_SUCCEEDED(rv)) {
             listener.forget(result);
         }
+        return rv;
     }
-    return rv;
+    return NS_ERROR_FAILURE;
 }
 
 nsresult
 NS_ImplementChannelOpen(nsIChannel      *channel,
                         nsIInputStream **result)
 {
     nsCOMPtr<nsIStreamListener> listener;
     nsCOMPtr<nsIInputStream> stream;
@@ -1222,24 +1221,20 @@ NS_ImplementChannelOpen(nsIChannel      
     return NS_OK;
  }
 
 nsresult
 NS_NewRequestObserverProxy(nsIRequestObserver **result,
                            nsIRequestObserver  *observer,
                            nsISupports         *context)
 {
-    nsresult rv;
-    nsCOMPtr<nsIRequestObserverProxy> proxy =
-        do_CreateInstance(NS_REQUESTOBSERVERPROXY_CONTRACTID, &rv);
+    nsCOMPtr<nsIRequestObserverProxy> proxy = new nsRequestObserverProxy();
+    nsresult rv = proxy->Init(observer, context);
     if (NS_SUCCEEDED(rv)) {
-        rv = proxy->Init(observer, context);
-        if (NS_SUCCEEDED(rv)) {
-            proxy.forget(result);
-        }
+        proxy.forget(result);
     }
     return rv;
 }
 
 nsresult
 NS_NewSimpleStreamListener(nsIStreamListener **result,
                            nsIOutputStream    *sink,
                            nsIRequestObserver *observer /* = nullptr */)
--- a/netwerk/base/nsSocketTransport2.cpp
+++ b/netwerk/base/nsSocketTransport2.cpp
@@ -20,17 +20,17 @@
 #include "nsCOMPtr.h"
 #include "plstr.h"
 #include "prerr.h"
 #include "IOActivityMonitor.h"
 #include "NSSErrorsService.h"
 #include "mozilla/dom/ToJSValue.h"
 #include "mozilla/net/NeckoChild.h"
 #include "nsThreadUtils.h"
-#include "nsISocketProviderService.h"
+#include "nsSocketProviderService.h"
 #include "nsISocketProvider.h"
 #include "nsISSLSocketControl.h"
 #include "nsIPipe.h"
 #include "nsIClassInfoImpl.h"
 #include "nsURLHelper.h"
 #include "nsIDNSService.h"
 #include "nsIDNSRecord.h"
 #include "nsIDNSByTypeRecord.h"
@@ -58,17 +58,16 @@
 
 #define SUCCESSFUL_CONNECTING_TO_IPV4_ADDRESS 0
 #define UNSUCCESSFUL_CONNECTING_TO_IPV4_ADDRESS 1
 #define SUCCESSFUL_CONNECTING_TO_IPV6_ADDRESS 2
 #define UNSUCCESSFUL_CONNECTING_TO_IPV6_ADDRESS 3
 
 //-----------------------------------------------------------------------------
 
-static NS_DEFINE_CID(kSocketProviderServiceCID, NS_SOCKETPROVIDERSERVICE_CID);
 static NS_DEFINE_CID(kDNSServiceCID, NS_DNSSERVICE_CID);
 
 //-----------------------------------------------------------------------------
 
 namespace mozilla {
 namespace net {
 
 class nsSocketEvent : public Runnable
@@ -881,18 +880,17 @@ nsSocketTransport::Init(const char **typ
     mTypeCount = typeCount + (proxyType != nullptr);
     if (!mTypeCount)
         return NS_OK;
 
     // if we have socket types, then the socket provider service had
     // better exist!
     nsresult rv;
     nsCOMPtr<nsISocketProviderService> spserv =
-        do_GetService(kSocketProviderServiceCID, &rv);
-    if (NS_FAILED(rv)) return rv;
+        nsSocketProviderService::GetOrCreate();
 
     mTypes = (char **) malloc(mTypeCount * sizeof(char *));
     if (!mTypes)
         return NS_ERROR_OUT_OF_MEMORY;
 
     // now verify that each socket type has a registered socket provider.
     for (uint32_t i = 0, type = 0; i < mTypeCount; ++i) {
         // store socket types
@@ -1206,18 +1204,17 @@ nsSocketTransport::BuildSocket(PRFileDes
 #if defined(XP_UNIX)
         MOZ_ASSERT(!mNetAddrIsSet || mNetAddr.raw.family != AF_LOCAL,
                    "Unix domain sockets can't be used with socket types");
 #endif
 
         fd = nullptr;
 
         nsCOMPtr<nsISocketProviderService> spserv =
-            do_GetService(kSocketProviderServiceCID, &rv);
-        if (NS_FAILED(rv)) return rv;
+            nsSocketProviderService::GetOrCreate();
 
         // by setting host to mOriginHost, instead of mHost we send the
         // SocketProvider (e.g. PSM) the origin hostname but can still do DNS
         // on an explicit alternate service host name
         const char *host       = mOriginHost.get();
         int32_t     port       = (int32_t) mOriginPort;
         nsCOMPtr<nsIProxyInfo> proxyInfo = mProxyInfo;
         uint32_t    controlFlags = 0;
--- a/netwerk/base/nsSyncStreamListener.cpp
+++ b/netwerk/base/nsSyncStreamListener.cpp
@@ -16,16 +16,29 @@ nsSyncStreamListener::Init()
     return NS_NewPipe(getter_AddRefs(mPipeIn),
                       getter_AddRefs(mPipeOut),
                       mozilla::net::nsIOService::gDefaultSegmentSize,
                       UINT32_MAX, // no size limit
                       false,
                       false);
 }
 
+// static
+already_AddRefed<nsISyncStreamListener>
+nsSyncStreamListener::Create()
+{
+  MOZ_ASSERT(NS_IsMainThread());
+
+  RefPtr<nsSyncStreamListener> inst = new nsSyncStreamListener();
+  nsresult rv = inst->Init();
+  NS_ENSURE_SUCCESS(rv, nullptr);
+
+  return inst.forget();
+}
+
 nsresult
 nsSyncStreamListener::WaitForData()
 {
     mKeepWaiting = true;
 
     if (!mozilla::SpinEventLoopUntil([&]() { return !mKeepWaiting; })) {
       return NS_ERROR_FAILURE;
     }
--- a/netwerk/base/nsSyncStreamListener.h
+++ b/netwerk/base/nsSyncStreamListener.h
@@ -18,26 +18,27 @@ class nsSyncStreamListener final : publi
 {
 public:
     NS_DECL_ISUPPORTS
     NS_DECL_NSIREQUESTOBSERVER
     NS_DECL_NSISTREAMLISTENER
     NS_DECL_NSISYNCSTREAMLISTENER
     NS_DECL_NSIINPUTSTREAM
 
+    static already_AddRefed<nsISyncStreamListener> Create();
+
+private:
     nsSyncStreamListener()
         : mStatus(NS_OK)
         , mKeepWaiting(false)
         , mDone(false) {}
+    ~nsSyncStreamListener() = default;
 
     nsresult Init();
 
-private:
-    ~nsSyncStreamListener() = default;
-
     nsresult WaitForData();
 
     nsCOMPtr<nsIInputStream>    mPipeIn;
     nsCOMPtr<nsIOutputStream>   mPipeOut;
     nsresult                    mStatus;
     bool                        mKeepWaiting;
     bool                        mDone;
 };
--- a/netwerk/build/nsNetCID.h
+++ b/netwerk/build/nsNetCID.h
@@ -43,27 +43,16 @@
 #define NS_PROTOCOLPROXYSERVICE_CID                  \
 { /* E9B301C0-E0E4-11d3-A1A8-0050041CAF44 */         \
     0xe9b301c0,                                      \
     0xe0e4,                                          \
     0x11d3,                                          \
     {0xa1, 0xa8, 0x0, 0x50, 0x4, 0x1c, 0xaf, 0x44}   \
 }
 
-// service implementing nsIProxyAutoConfig.
-#define NS_PROXYAUTOCONFIG_CONTRACTID \
-    "@mozilla.org/network/proxy-auto-config;1"
-#define NS_PROXYAUTOCONFIG_CID                       \
-{ /* 63ac8c66-1dd2-11b2-b070-84d00d3eaece */         \
-    0x63ac8c66,                                      \
-    0x1dd2,                                          \
-    0x11b2,                                          \
-    {0xb0, 0x70, 0x84, 0xd0, 0x0d, 0x3e, 0xae, 0xce} \
-}
-
 // component implementing nsILoadGroup.
 #define NS_LOADGROUP_CONTRACTID \
     "@mozilla.org/network/load-group;1"
 #define NS_LOADGROUP_CID                             \
 { /* e1c61582-2a84-11d3-8cce-0060b0fc14a3 */         \
     0xe1c61582,                                      \
     0x2a84,                                          \
     0x11d3,                                          \
@@ -176,27 +165,16 @@
 #define NS_STDURLPARSER_CID                          \
 { /* ff41913b-546a-4bff-9201-dc9b2c032eba */         \
     0xff41913b,                                      \
     0x546a,                                          \
     0x4bff,                                          \
     {0x92, 0x01, 0xdc, 0x9b, 0x2c, 0x03, 0x2e, 0xba} \
 }
 
-// component implementing nsIRequestObserverProxy.
-#define NS_REQUESTOBSERVERPROXY_CONTRACTID \
-    "@mozilla.org/network/request-observer-proxy;1"
-#define NS_REQUESTOBSERVERPROXY_CID                  \
-{ /* 51fa28c7-74c0-4b85-9c46-d03faa7b696b */         \
-    0x51fa28c7,                                      \
-    0x74c0,                                          \
-    0x4b85,                                          \
-    {0x9c, 0x46, 0xd0, 0x3f, 0xaa, 0x7b, 0x69, 0x6b} \
-}
-
 // component implementing nsISimpleStreamListener.
 #define NS_SIMPLESTREAMLISTENER_CONTRACTID \
     "@mozilla.org/network/simple-stream-listener;1"
 #define NS_SIMPLESTREAMLISTENER_CID                  \
 { /* fb8cbf4e-4701-4ba1-b1d6-5388e041fb67 */         \
     0xfb8cbf4e,                                      \
     0x4701,                                          \
     0x4ba1,                                          \
@@ -311,27 +289,16 @@
 #define NS_BACKGROUNDFILESAVERSTREAMLISTENER_CID \
 { /* 208de7fc-a781-4031-bbae-cc0de539f61a */         \
     0x208de7fc,                                      \
     0xa781,                                          \
     0x4031,                                          \
     {0xbb, 0xae, 0xcc, 0x0d, 0xe5, 0x39, 0xf6, 0x1a} \
 }
 
-// component implementing nsISyncStreamListener.
-#define NS_SYNCSTREAMLISTENER_CONTRACTID \
-    "@mozilla.org/network/sync-stream-listener;1"
-#define NS_SYNCSTREAMLISTENER_CID \
-{ /* 439400d3-6f23-43db-8b06-8aafe1869bd8 */         \
-    0x439400d3,                                      \
-    0x6f23,                                          \
-    0x43db,                                          \
-    {0x8b, 0x06, 0x8a, 0xaf, 0xe1, 0x86, 0x9b, 0xd8} \
-}
-
 // component implementing nsIIncrementalDownload.
 #define NS_INCREMENTALDOWNLOAD_CONTRACTID \
     "@mozilla.org/network/incremental-download;1"
 
 // component implementing nsISystemProxySettings.
 #define NS_SYSTEMPROXYSETTINGS_CONTRACTID \
     "@mozilla.org/system-proxy-settings;1"
 
@@ -480,27 +447,16 @@
 #define NS_CAPTIVEPORTAL_CID \
 { /* bdbe0555-fc3d-4f7b-9205-c309ceb2d641 */ \
     0xbdbe0555, \
     0xfc3d, \
     0x4f7b, \
   { 0x92, 0x05, 0xc3, 0x09, 0xce, 0xb2, 0xd6, 0x41 } \
 }
 
-// service implementing nsIRequestContextService
-#define NS_REQUESTCONTEXTSERVICE_CONTRACTID \
-    "@mozilla.org/network/request-context-service;1"
-#define NS_REQUESTCONTEXTSERVICE_CID \
-{ /* d5499fa7-7ba8-49ff-9e30-1858b99ace69 */ \
-    0xd5499fa7, \
-    0x7ba8, \
-    0x49ff, \
-    {0x93, 0x30, 0x18, 0x58, 0xb9, 0x9a, 0xce, 0x69} \
-}
-
 /******************************************************************************
  * netwerk/cache/ classes
  */
 
 // service implementing nsICacheService.
 #define NS_CACHESERVICE_CONTRACTID \
     "@mozilla.org/network/cache-service;1"
 #define NS_CACHESERVICE_CID                          \
@@ -571,28 +527,16 @@
 #define NS_HTTPAUTHMANAGER_CID \
 { /* 36b63ef3-e0fa-4c49-9fd4-e065e85568f4 */         \
     0x36b63ef3,                                      \
     0xe0fa,                                          \
     0x4c49,                                          \
     {0x9f, 0xd4, 0xe0, 0x65, 0xe8, 0x55, 0x68, 0xf4} \
 }
 
-// component implementing nsIHttpPushListener.
-#define NS_HTTPPUSHLISTENER_CONTRACTID \
-    "@mozilla.org/network/push-listener;1"
-#define NS_HTTPPUSHLISTENER_CID                      \
-{                                                    \
-    0x73cf4430,                                      \
-    0x5877,                                          \
-    0x4c6b,                                          \
-    {0xb8, 0x78, 0x3e, 0xde, 0x5b, 0xc8, 0xef, 0xf1} \
-}
-
-
 #define NS_HTTPACTIVITYDISTRIBUTOR_CONTRACTID \
     "@mozilla.org/network/http-activity-distributor;1"
 #define NS_HTTPACTIVITYDISTRIBUTOR_CID \
 { /* 15629ada-a41c-4a09-961f-6553cd60b1a2 */         \
     0x15629ada,                                      \
     0xa41c,                                          \
     0x4a09,                                          \
     {0x96, 0x1f, 0x65, 0x53, 0xcd, 0x60, 0xb1, 0xa2} \
@@ -793,26 +737,16 @@
 
 #define NS_MIMEHEADERPARAM_CONTRACTID "@mozilla.org/network/mime-hdrparam;1"
 
 
 /******************************************************************************
  * netwerk/socket classes
  */
 
-#define NS_SOCKETPROVIDERSERVICE_CONTRACTID \
-    "@mozilla.org/network/socket-provider-service;1"
-#define NS_SOCKETPROVIDERSERVICE_CID                   \
-{ /* ed394ba0-5472-11d3-bbc8-0000861d1237 */           \
-    0xed394ba0,                                        \
-    0x5472,                                            \
-    0x11d3,                                            \
-    { 0xbb, 0xc8, 0x00, 0x00, 0x86, 0x1d, 0x12, 0x37 } \
-}
-
 #define NS_SOCKSSOCKETPROVIDER_CID                     \
 { /* 8dbe7246-1dd2-11b2-9b8f-b9a849e4403a */           \
     0x8dbe7246,                                        \
     0x1dd2,                                            \
     0x11b2,                                            \
     { 0x9b, 0x8f, 0xb9, 0xa8, 0x49, 0xe4, 0x40, 0x3a } \
 }
 
@@ -827,48 +761,26 @@
 #define NS_UDPSOCKETPROVIDER_CID                       \
 { /* 320706D2-2E81-42c6-89C3-8D83B17D3FB4 */           \
     0x320706d2,                                        \
     0x2e81,                                            \
     0x42c6,                                            \
     { 0x89, 0xc3, 0x8d, 0x83, 0xb1, 0x7d, 0x3f, 0xb4 } \
 }
 
-#define NS_SSLSOCKETPROVIDER_CONTRACTID \
-    NS_NETWORK_SOCKET_CONTRACTID_PREFIX "ssl"
-
-/* This code produces a normal socket which can be used to initiate the
- * STARTTLS protocol by calling its nsISSLSocketControl->StartTLS()
- */
-#define NS_STARTTLSSOCKETPROVIDER_CONTRACTID \
-    NS_NETWORK_SOCKET_CONTRACTID_PREFIX "starttls"
-
-
 #define NS_DASHBOARD_CONTRACTID \
     "@mozilla.org/network/dashboard;1"
 #define NS_DASHBOARD_CID                               \
 {   /*c79eb3c6-091a-45a6-8544-5a8d1ab79537 */          \
     0xc79eb3c6,                                        \
     0x091a,                                            \
     0x45a6,                                            \
     { 0x85, 0x44, 0x5a, 0x8d, 0x1a, 0xb7, 0x95, 0x37 } \
 }
 
-#ifdef XP_WIN
-#define NS_NAMEDPIPESERVICE_CONTRACTID \
-    "@mozilla.org/network/named-pipe-service;1"
-#define NS_NAMEDPIPESERVICE_CID                        \
-{                                                      \
-    0xae298cf9,                                        \
-    0x91f4,                                            \
-    0x4337,                                            \
-  { 0x95, 0x69, 0x61, 0x88, 0xb9, 0xd0, 0x21, 0x6e }   \
-}
-#endif
-
 /******************************************************************************
  * netwerk/cookie classes
  */
 
 // service implementing nsICookieManager
 #define NS_COOKIEMANAGER_CONTRACTID \
     "@mozilla.org/cookiemanager;1"
 #define NS_COOKIEMANAGER_CID                           \
--- a/netwerk/build/nsNetModule.cpp
+++ b/netwerk/build/nsNetModule.cpp
@@ -10,17 +10,16 @@
 #include "base/basictypes.h"
 
 #include "nsCOMPtr.h"
 #include "nsIClassInfoImpl.h"
 #include "mozilla/ModuleUtils.h"
 #include "nsIComponentManager.h"
 #include "nsIServiceManager.h"
 #include "nsICategoryManager.h"
-#include "nsSocketProviderService.h"
 #include "nscore.h"
 #include "nsSimpleURI.h"
 #include "nsSimpleNestedURI.h"
 #include "nsLoadGroup.h"
 #include "nsStreamLoader.h"
 #include "nsIncrementalStreamLoader.h"
 #include "nsFileStreams.h"
 #include "nsBufferedStreams.h"
@@ -82,19 +81,16 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsServerS
 #include "TLSServerSocket.h"
 typedef mozilla::net::TLSServerSocket TLSServerSocket;
 NS_GENERIC_FACTORY_CONSTRUCTOR(TLSServerSocket)
 
 #include "nsUDPSocket.h"
 typedef mozilla::net::nsUDPSocket nsUDPSocket;
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsUDPSocket)
 
-#include "nsUDPSocketProvider.h"
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsUDPSocketProvider)
-
 #include "nsAsyncStreamCopier.h"
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsAsyncStreamCopier)
 
 #include "nsInputStreamPump.h"
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsInputStreamPump)
 
 #include "nsInputStreamChannel.h"
 typedef mozilla::net::nsInputStreamChannel nsInputStreamChannel;
@@ -106,19 +102,16 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsDownloa
 #include "BackgroundFileSaver.h"
 namespace mozilla {
 namespace net {
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(BackgroundFileSaverOutputStream, Init)
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(BackgroundFileSaverStreamListener, Init)
 } // namespace net
 } // namespace mozilla
 
-#include "nsSyncStreamListener.h"
-NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsSyncStreamListener, Init)
-
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsAtomicFileOutputStream)
 
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsSafeFileOutputStream)
 
 typedef mozilla::net::nsLoadGroup nsLoadGroup;
 NS_GENERIC_AGGREGATED_CONSTRUCTOR_INIT(nsLoadGroup, Init)
 
 #include "ArrayBufferInputStream.h"
@@ -143,20 +136,16 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(LoadConte
 #include "mozilla/net/CaptivePortalService.h"
 namespace mozilla {
 namespace net {
   NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsICaptivePortalService,
     CaptivePortalService::GetSingleton)
 } // namespace net
 } // namespace mozilla
 
-#include "RequestContextService.h"
-typedef mozilla::net::RequestContextService RequestContextService;
-NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(RequestContextService, Init)
-
 ///////////////////////////////////////////////////////////////////////////////
 
 extern nsresult
 net_NewIncrementalDownload(nsISupports *, const nsIID &, void **);
 
 #define NS_INCREMENTALDOWNLOAD_CID \
 { /* a62af1ba-79b3-4896-8aaf-b148bfce4280 */         \
     0xa62af1ba,                                      \
@@ -167,21 +156,18 @@ net_NewIncrementalDownload(nsISupports *
 
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "nsMIMEHeaderParamImpl.h"
 
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsMIMEHeaderParamImpl)
 ///////////////////////////////////////////////////////////////////////////////
 
-#include "nsRequestObserverProxy.h"
 #include "nsSimpleStreamListener.h"
 
-typedef mozilla::net::nsRequestObserverProxy nsRequestObserverProxy;
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsRequestObserverProxy)
 typedef mozilla::net::nsSimpleStreamListener nsSimpleStreamListener;
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsSimpleStreamListener)
 
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "nsStreamListenerTee.h"
 typedef mozilla::net::nsStreamListenerTee nsStreamListenerTee;
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsStreamListenerTee)
@@ -261,25 +247,16 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(ThrottleQ
 
 #include "mozilla/net/Dashboard.h"
 namespace mozilla {
 namespace net {
   NS_GENERIC_FACTORY_CONSTRUCTOR(Dashboard)
 } // namespace net
 } // namespace mozilla
 
-#ifdef XP_WIN
-#include "../socket/nsNamedPipeService.h"
-namespace mozilla {
-namespace net {
-NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(NamedPipeService, Init)
-} // namespace net
-} // namespace mozilla
-#endif
-
 // resource
 #include "nsResProtocolHandler.h"
 #include "ExtensionProtocolHandler.h"
 #include "SubstitutingProtocolHandler.h"
 typedef mozilla::net::ExtensionProtocolHandler ExtensionProtocolHandler;
 typedef mozilla::net::SubstitutingURL::Mutator SubstitutingURLMutator;
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsResProtocolHandler, Init)
 
@@ -648,34 +625,31 @@ static void nsNetShutdown()
 }
 
 NS_DEFINE_NAMED_CID(NS_IOSERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_STREAMTRANSPORTSERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_SOCKETTRANSPORTSERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_SERVERSOCKET_CID);
 NS_DEFINE_NAMED_CID(NS_TLSSERVERSOCKET_CID);
 NS_DEFINE_NAMED_CID(NS_UDPSOCKET_CID);
-NS_DEFINE_NAMED_CID(NS_SOCKETPROVIDERSERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_DNSSERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_IDNSERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_EFFECTIVETLDSERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_SIMPLEURI_CID);
 NS_DEFINE_NAMED_CID(NS_SIMPLEURIMUTATOR_CID);
 NS_DEFINE_NAMED_CID(NS_SIMPLENESTEDURI_CID);
 NS_DEFINE_NAMED_CID(NS_SIMPLENESTEDURIMUTATOR_CID);
 NS_DEFINE_NAMED_CID(NS_ASYNCSTREAMCOPIER_CID);
 NS_DEFINE_NAMED_CID(NS_INPUTSTREAMPUMP_CID);
 NS_DEFINE_NAMED_CID(NS_INPUTSTREAMCHANNEL_CID);
 NS_DEFINE_NAMED_CID(NS_STREAMLOADER_CID);
 NS_DEFINE_NAMED_CID(NS_INCREMENTALSTREAMLOADER_CID);
 NS_DEFINE_NAMED_CID(NS_DOWNLOADER_CID);
 NS_DEFINE_NAMED_CID(NS_BACKGROUNDFILESAVEROUTPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_BACKGROUNDFILESAVERSTREAMLISTENER_CID);
-NS_DEFINE_NAMED_CID(NS_SYNCSTREAMLISTENER_CID);
-NS_DEFINE_NAMED_CID(NS_REQUESTOBSERVERPROXY_CID);
 NS_DEFINE_NAMED_CID(NS_SIMPLESTREAMLISTENER_CID);
 NS_DEFINE_NAMED_CID(NS_STREAMLISTENERTEE_CID);
 NS_DEFINE_NAMED_CID(NS_LOADGROUP_CID);
 NS_DEFINE_NAMED_CID(NS_LOCALFILEINPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_LOCALFILEOUTPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_ATOMICLOCALFILEOUTPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_SAFELOCALFILEOUTPUTSTREAM_CID);
 NS_DEFINE_NAMED_CID(NS_INCREMENTALDOWNLOAD_CID);
@@ -685,19 +659,16 @@ NS_DEFINE_NAMED_CID(NS_AUTHURLPARSER_CID
 NS_DEFINE_NAMED_CID(NS_STANDARDURL_CID);
 NS_DEFINE_NAMED_CID(NS_STANDARDURLMUTATOR_CID);
 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);
-#endif
 NS_DEFINE_NAMED_CID(NS_DASHBOARD_CID);
 NS_DEFINE_NAMED_CID(NS_FTPDIRLISTINGCONVERTER_CID);
 NS_DEFINE_NAMED_CID(NS_NSINDEXEDTOHTMLCONVERTER_CID);
 NS_DEFINE_NAMED_CID(NS_MULTIMIXEDCONVERTER_CID);
 NS_DEFINE_NAMED_CID(NS_UNKNOWNDECODER_CID);
 NS_DEFINE_NAMED_CID(NS_BINARYDETECTOR_CID);
 NS_DEFINE_NAMED_CID(NS_HTTPCOMPRESSCONVERTER_CID);
 NS_DEFINE_NAMED_CID(MOZITXTTOHTMLCONV_CID);
@@ -718,19 +689,16 @@ NS_DEFINE_NAMED_CID(NS_SUBSTITUTINGURL_C
 NS_DEFINE_NAMED_CID(NS_SUBSTITUTINGURLMUTATOR_CID);
 NS_DEFINE_NAMED_CID(NS_ABOUTPROTOCOLHANDLER_CID);
 NS_DEFINE_NAMED_CID(NS_SAFEABOUTPROTOCOLHANDLER_CID);
 NS_DEFINE_NAMED_CID(NS_ABOUT_BLANK_MODULE_CID);
 NS_DEFINE_NAMED_CID(NS_NESTEDABOUTURI_CID);
 NS_DEFINE_NAMED_CID(NS_NESTEDABOUTURIMUTATOR_CID);
 NS_DEFINE_NAMED_CID(NS_ABOUT_CACHE_MODULE_CID);
 NS_DEFINE_NAMED_CID(NS_ABOUT_CACHE_ENTRY_MODULE_CID);
-NS_DEFINE_NAMED_CID(NS_SOCKSSOCKETPROVIDER_CID);
-NS_DEFINE_NAMED_CID(NS_SOCKS4SOCKETPROVIDER_CID);
-NS_DEFINE_NAMED_CID(NS_UDPSOCKETPROVIDER_CID);
 NS_DEFINE_NAMED_CID(NS_CACHESERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_APPLICATIONCACHESERVICE_CID);
 #ifdef NECKO_COOKIES
 NS_DEFINE_NAMED_CID(NS_COOKIEMANAGER_CID);
 NS_DEFINE_NAMED_CID(NS_COOKIESERVICE_CID);
 #endif
 #ifdef NECKO_WIFI
 NS_DEFINE_NAMED_CID(NS_WIFI_MONITOR_COMPONENT_CID);
@@ -749,30 +717,28 @@ NS_DEFINE_NAMED_CID(NS_NETWORK_LINK_SERV
 #elif defined(XP_LINUX)
 NS_DEFINE_NAMED_CID(NS_NETWORK_LINK_SERVICE_CID);
 #endif
 NS_DEFINE_NAMED_CID(NS_SERIALIZATION_HELPER_CID);
 NS_DEFINE_NAMED_CID(NS_CACHE_STORAGE_SERVICE_CID);
 NS_DEFINE_NAMED_CID(NS_NSILOADCONTEXTINFOFACTORY_CID);
 NS_DEFINE_NAMED_CID(NS_NETWORKPREDICTOR_CID);
 NS_DEFINE_NAMED_CID(NS_CAPTIVEPORTAL_CID);
-NS_DEFINE_NAMED_CID(NS_REQUESTCONTEXTSERVICE_CID);
 #ifdef BUILD_NETWORK_INFO_SERVICE
 NS_DEFINE_NAMED_CID(NETWORKINFOSERVICE_CID);
 #endif // BUILD_NETWORK_INFO_SERVICE
 
 static const mozilla::Module::CIDEntry kNeckoCIDs[] = {
     // clang-format off
     { &kNS_IOSERVICE_CID, false, nullptr, nsIOServiceConstructor },
     { &kNS_STREAMTRANSPORTSERVICE_CID, false, nullptr, nsStreamTransportServiceConstructor },
     { &kNS_SOCKETTRANSPORTSERVICE_CID, false, nullptr, nsSocketTransportServiceConstructor },
     { &kNS_SERVERSOCKET_CID, false, nullptr, nsServerSocketConstructor },
     { &kNS_TLSSERVERSOCKET_CID, false, nullptr, TLSServerSocketConstructor },
     { &kNS_UDPSOCKET_CID, false, nullptr, nsUDPSocketConstructor },
-    { &kNS_SOCKETPROVIDERSERVICE_CID, false, nullptr, nsSocketProviderService::Create },
     { &kNS_DNSSERVICE_CID, false, nullptr, nsIDNSServiceConstructor },
     { &kNS_IDNSERVICE_CID, false, nullptr, nsIDNServiceConstructor },
     { &kNS_EFFECTIVETLDSERVICE_CID, false, nullptr, nsEffectiveTLDServiceConstructor },
     { &kNS_SIMPLEURI_CID, false, nullptr, nsSimpleURIMutatorConstructor }, // do_CreateInstance returns mutator
     { &kNS_SIMPLEURIMUTATOR_CID, false, nullptr, nsSimpleURIMutatorConstructor },
     { &kNS_SIMPLENESTEDURI_CID, false, nullptr, nsSimpleNestedURIMutatorConstructor }, // do_CreateInstance returns mutator
     { &kNS_SIMPLENESTEDURIMUTATOR_CID, false, nullptr, nsSimpleNestedURIMutatorConstructor },
     { &kNS_ASYNCSTREAMCOPIER_CID, false, nullptr, nsAsyncStreamCopierConstructor },
@@ -780,18 +746,16 @@ static const mozilla::Module::CIDEntry k
     { &kNS_INPUTSTREAMCHANNEL_CID, false, nullptr, nsInputStreamChannelConstructor },
     { &kNS_STREAMLOADER_CID, false, nullptr, mozilla::net::nsStreamLoader::Create },
     { &kNS_INCREMENTALSTREAMLOADER_CID, false, nullptr, nsIncrementalStreamLoader::Create },
     { &kNS_DOWNLOADER_CID, false, nullptr, nsDownloaderConstructor },
     { &kNS_BACKGROUNDFILESAVEROUTPUTSTREAM_CID, false, nullptr,
       mozilla::net::BackgroundFileSaverOutputStreamConstructor },
     { &kNS_BACKGROUNDFILESAVERSTREAMLISTENER_CID, false, nullptr,
       mozilla::net::BackgroundFileSaverStreamListenerConstructor },
-    { &kNS_SYNCSTREAMLISTENER_CID, false, nullptr, nsSyncStreamListenerConstructor },
-    { &kNS_REQUESTOBSERVERPROXY_CID, false, nullptr, nsRequestObserverProxyConstructor },
     { &kNS_SIMPLESTREAMLISTENER_CID, false, nullptr, nsSimpleStreamListenerConstructor },
     { &kNS_STREAMLISTENERTEE_CID, false, nullptr, nsStreamListenerTeeConstructor },
     { &kNS_LOADGROUP_CID, false, nullptr, nsLoadGroupConstructor },
     { &kNS_LOCALFILEINPUTSTREAM_CID, false, nullptr, nsFileInputStream::Create },
     { &kNS_LOCALFILEOUTPUTSTREAM_CID, false, nullptr, nsFileOutputStream::Create },
     { &kNS_ATOMICLOCALFILEOUTPUTSTREAM_CID, false, nullptr, nsAtomicFileOutputStreamConstructor },
     { &kNS_SAFELOCALFILEOUTPUTSTREAM_CID, false, nullptr, nsSafeFileOutputStreamConstructor },
     { &kNS_INCREMENTALDOWNLOAD_CID, false, nullptr, net_NewIncrementalDownload },
@@ -801,19 +765,16 @@ static const mozilla::Module::CIDEntry k
     { &kNS_STANDARDURL_CID, false, nullptr, nsStandardURLMutatorConstructor }, // do_CreateInstance returns mutator
     { &kNS_STANDARDURLMUTATOR_CID, false, nullptr, nsStandardURLMutatorConstructor },
     { &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 },
-#endif
     { &kNS_DASHBOARD_CID, false, nullptr, mozilla::net::DashboardConstructor },
     { &kNS_FTPDIRLISTINGCONVERTER_CID, false, nullptr, CreateNewFTPDirListingConv },
     { &kNS_NSINDEXEDTOHTMLCONVERTER_CID, false, nullptr, nsIndexedToHTML::Create },
     { &kNS_MULTIMIXEDCONVERTER_CID, false, nullptr, CreateNewMultiMixedConvFactory },
     { &kNS_UNKNOWNDECODER_CID, false, nullptr, CreateNewUnknownDecoderFactory },
     { &kNS_BINARYDETECTOR_CID, false, nullptr, CreateNewBinaryDetectorFactory },
     { &kNS_HTTPCOMPRESSCONVERTER_CID, false, nullptr, CreateNewHTTPCompressConvFactory },
     { &kMOZITXTTOHTMLCONV_CID, false, nullptr, CreateNewTXTToHTMLConvFactory },
@@ -834,19 +795,16 @@ static const mozilla::Module::CIDEntry k
     { &kNS_SUBSTITUTINGURLMUTATOR_CID, false, nullptr, mozilla::SubstitutingURLMutatorConstructor },
     { &kNS_ABOUTPROTOCOLHANDLER_CID, false, nullptr, nsAboutProtocolHandlerConstructor },
     { &kNS_SAFEABOUTPROTOCOLHANDLER_CID, false, nullptr, nsSafeAboutProtocolHandlerConstructor },
     { &kNS_ABOUT_BLANK_MODULE_CID, false, nullptr, nsAboutBlank::Create },
     { &kNS_NESTEDABOUTURI_CID, false, nullptr, nsNestedAboutURIMutatorConstructor }, // do_CreateInstance returns mutator
     { &kNS_NESTEDABOUTURIMUTATOR_CID, false, nullptr, nsNestedAboutURIMutatorConstructor },
     { &kNS_ABOUT_CACHE_MODULE_CID, false, nullptr, nsAboutCache::Create },
     { &kNS_ABOUT_CACHE_ENTRY_MODULE_CID, false, nullptr, nsAboutCacheEntryConstructor },
-    { &kNS_SOCKSSOCKETPROVIDER_CID, false, nullptr, nsSOCKSSocketProvider::CreateV5 },
-    { &kNS_SOCKS4SOCKETPROVIDER_CID, false, nullptr, nsSOCKSSocketProvider::CreateV4 },
-    { &kNS_UDPSOCKETPROVIDER_CID, false, nullptr, nsUDPSocketProviderConstructor },
     { &kNS_CACHESERVICE_CID, false, nullptr, nsCacheService::Create },
     { &kNS_APPLICATIONCACHESERVICE_CID, false, nullptr, nsApplicationCacheServiceConstructor },
 #ifdef NECKO_COOKIES
     { &kNS_COOKIEMANAGER_CID, false, nullptr, nsICookieServiceConstructor },
     { &kNS_COOKIESERVICE_CID, false, nullptr, nsICookieServiceConstructor },
 #endif
 #ifdef NECKO_WIFI
     { &kNS_WIFI_MONITOR_COMPONENT_CID, false, nullptr, nsWifiMonitorConstructor },
@@ -867,48 +825,44 @@ static const mozilla::Module::CIDEntry k
 #elif defined(XP_LINUX)
     { &kNS_NETWORK_LINK_SERVICE_CID, false, nullptr, nsNotifyAddrListenerConstructor },
 #endif
     { &kNS_SERIALIZATION_HELPER_CID, false, nullptr, nsSerializationHelperConstructor },
     { &kNS_CACHE_STORAGE_SERVICE_CID, false, nullptr, CacheStorageServiceConstructor },
     { &kNS_NSILOADCONTEXTINFOFACTORY_CID, false, nullptr, LoadContextInfoFactoryConstructor },
     { &kNS_NETWORKPREDICTOR_CID, false, nullptr, mozilla::net::Predictor::Create },
     { &kNS_CAPTIVEPORTAL_CID, false, nullptr, mozilla::net::nsICaptivePortalServiceConstructor },
-    { &kNS_REQUESTCONTEXTSERVICE_CID, false, nullptr, RequestContextServiceConstructor },
 #ifdef BUILD_NETWORK_INFO_SERVICE
     { &kNETWORKINFOSERVICE_CID, false, nullptr, nsNetworkInfoServiceConstructor },
 #endif
     { nullptr }
     // clang-format on
 };
 
 static const mozilla::Module::ContractIDEntry kNeckoContracts[] = {
     // clang-format off
     { NS_IOSERVICE_CONTRACTID, &kNS_IOSERVICE_CID },
     { NS_NETUTIL_CONTRACTID, &kNS_IOSERVICE_CID },
     { NS_STREAMTRANSPORTSERVICE_CONTRACTID, &kNS_STREAMTRANSPORTSERVICE_CID },
     { NS_SOCKETTRANSPORTSERVICE_CONTRACTID, &kNS_SOCKETTRANSPORTSERVICE_CID },
     { NS_SERVERSOCKET_CONTRACTID, &kNS_SERVERSOCKET_CID },
     { NS_TLSSERVERSOCKET_CONTRACTID, &kNS_TLSSERVERSOCKET_CID },
     { NS_UDPSOCKET_CONTRACTID, &kNS_UDPSOCKET_CID },
-    { NS_SOCKETPROVIDERSERVICE_CONTRACTID, &kNS_SOCKETPROVIDERSERVICE_CID },
     { NS_DNSSERVICE_CONTRACTID, &kNS_DNSSERVICE_CID },
     { NS_IDNSERVICE_CONTRACTID, &kNS_IDNSERVICE_CID },
     { NS_EFFECTIVETLDSERVICE_CONTRACTID, &kNS_EFFECTIVETLDSERVICE_CID },
     { NS_SIMPLEURIMUTATOR_CONTRACTID, &kNS_SIMPLEURIMUTATOR_CID },
     { NS_ASYNCSTREAMCOPIER_CONTRACTID, &kNS_ASYNCSTREAMCOPIER_CID },
     { NS_INPUTSTREAMPUMP_CONTRACTID, &kNS_INPUTSTREAMPUMP_CID },
     { NS_INPUTSTREAMCHANNEL_CONTRACTID, &kNS_INPUTSTREAMCHANNEL_CID },
     { NS_STREAMLOADER_CONTRACTID, &kNS_STREAMLOADER_CID },
     { NS_INCREMENTALSTREAMLOADER_CONTRACTID, &kNS_INCREMENTALSTREAMLOADER_CID },
     { NS_DOWNLOADER_CONTRACTID, &kNS_DOWNLOADER_CID },
     { NS_BACKGROUNDFILESAVEROUTPUTSTREAM_CONTRACTID, &kNS_BACKGROUNDFILESAVEROUTPUTSTREAM_CID },
     { NS_BACKGROUNDFILESAVERSTREAMLISTENER_CONTRACTID, &kNS_BACKGROUNDFILESAVERSTREAMLISTENER_CID },
-    { NS_SYNCSTREAMLISTENER_CONTRACTID, &kNS_SYNCSTREAMLISTENER_CID },
-    { NS_REQUESTOBSERVERPROXY_CONTRACTID, &kNS_REQUESTOBSERVERPROXY_CID },
     { NS_SIMPLESTREAMLISTENER_CONTRACTID, &kNS_SIMPLESTREAMLISTENER_CID },
     { NS_STREAMLISTENERTEE_CONTRACTID, &kNS_STREAMLISTENERTEE_CID },
     { NS_LOADGROUP_CONTRACTID, &kNS_LOADGROUP_CID },
     { NS_LOCALFILEINPUTSTREAM_CONTRACTID, &kNS_LOCALFILEINPUTSTREAM_CID },
     { NS_LOCALFILEOUTPUTSTREAM_CONTRACTID, &kNS_LOCALFILEOUTPUTSTREAM_CID },
     { NS_ATOMICLOCALFILEOUTPUTSTREAM_CONTRACTID, &kNS_ATOMICLOCALFILEOUTPUTSTREAM_CID },
     { NS_SAFELOCALFILEOUTPUTSTREAM_CONTRACTID, &kNS_SAFELOCALFILEOUTPUTSTREAM_CID },
     { NS_INCREMENTALDOWNLOAD_CONTRACTID, &kNS_INCREMENTALDOWNLOAD_CID },
@@ -917,19 +871,16 @@ static const mozilla::Module::ContractID
     { NS_AUTHURLPARSER_CONTRACTID, &kNS_AUTHURLPARSER_CID },
     { NS_STANDARDURLMUTATOR_CONTRACTID, &kNS_STANDARDURLMUTATOR_CID },
     { 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 },
-#endif
     { NS_DASHBOARD_CONTRACTID, &kNS_DASHBOARD_CID },
     { NS_ISTREAMCONVERTER_KEY FTP_TO_INDEX, &kNS_FTPDIRLISTINGCONVERTER_CID },
     { NS_ISTREAMCONVERTER_KEY INDEX_TO_HTML, &kNS_NSINDEXEDTOHTMLCONVERTER_CID },
     { NS_ISTREAMCONVERTER_KEY MULTI_MIXED_X, &kNS_MULTIMIXEDCONVERTER_CID },
     { NS_ISTREAMCONVERTER_KEY MULTI_BYTERANGES, &kNS_MULTIMIXEDCONVERTER_CID },
     { NS_ISTREAMCONVERTER_KEY MULTI_MIXED, &kNS_MULTIMIXEDCONVERTER_CID },
     { NS_ISTREAMCONVERTER_KEY UNKNOWN_CONTENT, &kNS_UNKNOWNDECODER_CID },
     { NS_BINARYDETECTOR_CONTRACTID, &kNS_BINARYDETECTOR_CID },
@@ -953,19 +904,16 @@ static const mozilla::Module::ContractID
     { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "ftp", &kNS_FTPPROTOCOLHANDLER_CID },
     { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "resource", &kNS_RESPROTOCOLHANDLER_CID },
     { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "moz-extension", &kNS_EXTENSIONPROTOCOLHANDLER_CID },
     { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "about", &kNS_ABOUTPROTOCOLHANDLER_CID },
     { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "moz-safe-about", &kNS_SAFEABOUTPROTOCOLHANDLER_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "blank", &kNS_ABOUT_BLANK_MODULE_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "cache", &kNS_ABOUT_CACHE_MODULE_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "cache-entry", &kNS_ABOUT_CACHE_ENTRY_MODULE_CID },
-    { NS_NETWORK_SOCKET_CONTRACTID_PREFIX "socks", &kNS_SOCKSSOCKETPROVIDER_CID },
-    { NS_NETWORK_SOCKET_CONTRACTID_PREFIX "socks4", &kNS_SOCKS4SOCKETPROVIDER_CID },
-    { NS_NETWORK_SOCKET_CONTRACTID_PREFIX "udp", &kNS_UDPSOCKETPROVIDER_CID },
     { NS_CACHESERVICE_CONTRACTID, &kNS_CACHESERVICE_CID },
     { NS_APPLICATIONCACHESERVICE_CONTRACTID, &kNS_APPLICATIONCACHESERVICE_CID },
 #ifdef NECKO_COOKIES
     { NS_COOKIEMANAGER_CONTRACTID, &kNS_COOKIEMANAGER_CID },
     { NS_COOKIESERVICE_CONTRACTID, &kNS_COOKIESERVICE_CID },
 #endif
 #ifdef NECKO_WIFI
     { NS_WIFI_MONITOR_CONTRACTID, &kNS_WIFI_MONITOR_COMPONENT_CID },
@@ -985,17 +933,16 @@ static const mozilla::Module::ContractID
     { NS_NETWORK_LINK_SERVICE_CONTRACTID, &kNS_NETWORK_LINK_SERVICE_CID },
 #endif
     { NS_SERIALIZATION_HELPER_CONTRACTID, &kNS_SERIALIZATION_HELPER_CID },
     { NS_CACHE_STORAGE_SERVICE_CONTRACTID, &kNS_CACHE_STORAGE_SERVICE_CID },
     { NS_CACHE_STORAGE_SERVICE_CONTRACTID2, &kNS_CACHE_STORAGE_SERVICE_CID },
     { NS_NSILOADCONTEXTINFOFACTORY_CONTRACTID, &kNS_NSILOADCONTEXTINFOFACTORY_CID },
     { NS_NETWORKPREDICTOR_CONTRACTID, &kNS_NETWORKPREDICTOR_CID },
     { NS_CAPTIVEPORTAL_CONTRACTID, &kNS_CAPTIVEPORTAL_CID },
-    { NS_REQUESTCONTEXTSERVICE_CONTRACTID, &kNS_REQUESTCONTEXTSERVICE_CID },
 #ifdef BUILD_NETWORK_INFO_SERVICE
     { NETWORKINFOSERVICE_CONTRACT_ID, &kNETWORKINFOSERVICE_CID },
 #endif
     { nullptr }
     // clang-format on
 };
 
 static const mozilla::Module kNeckoModule = {
--- a/netwerk/dns/TRRService.cpp
+++ b/netwerk/dns/TRRService.cpp
@@ -671,17 +671,17 @@ TRRService::CompleteLookup(nsHostRecord 
     return LOOKUP_OK;
   }
 
   // when called without a host record, this is a domain name check response.
   if (NS_SUCCEEDED(status)) {
     LOG(("TRR verified %s to be fine!\n", newRRSet->mHostName.get()));
   } else {
     LOG(("TRR says %s doesn't resolve as NS!\n", newRRSet->mHostName.get()));
-    TRRBlacklist(newRRSet->mHostName, rec->originSuffix, pb, false);
+    TRRBlacklist(newRRSet->mHostName, nsCString(""), pb, false);
   }
   return LOOKUP_OK;
 }
 
 AHostResolver::LookupStatus
 TRRService::CompleteLookupByType(nsHostRecord *, nsresult,
                                  const nsTArray<nsCString> *aResult,
                                  uint32_t aTtl,
--- a/netwerk/dns/effective_tld_names.dat
+++ b/netwerk/dns/effective_tld_names.dat
@@ -376,18 +376,23 @@ gouv.bj
 // bm : http://www.bermudanic.bm/dnr-text.txt
 bm
 com.bm
 edu.bm
 gov.bm
 net.bm
 org.bm
 
-// bn : https://en.wikipedia.org/wiki/.bn
-*.bn
+// bn : http://www.bnnic.bn/faqs
+bn
+com.bn
+edu.bn
+gov.bn
+net.bn
+org.bn
 
 // bo : https://nic.bo/delegacion2015.php#h-1.10
 bo
 com.bo
 edu.bo
 gob.bo
 int.bo
 org.bo
@@ -541,16 +546,17 @@ mp.br
 mus.br
 natal.br
 net.br
 niteroi.br
 *.nom.br
 not.br
 ntr.br
 odo.br
+ong.br
 org.br
 osasco.br
 palmas.br
 poa.br
 ppg.br
 pro.br
 psc.br
 psi.br
@@ -1109,33 +1115,43 @@ gt
 com.gt
 edu.gt
 gob.gt
 ind.gt
 mil.gt
 net.gt
 org.gt
 
-// gu : http://gadao.gov.gu/registration.txt
-*.gu
+// gu : http://gadao.gov.gu/register.html
+// University of Guam : https://www.uog.edu
+// Submitted by uognoc@triton.uog.edu
+gu
+com.gu
+edu.gu
+gov.gu
+guam.gu
+info.gu
+net.gu
+org.gu
+web.gu
 
 // gw : https://en.wikipedia.org/wiki/.gw
 gw
 
 // gy : https://en.wikipedia.org/wiki/.gy
 // http://registry.gy/
 gy
 co.gy
 com.gy
 edu.gy
 gov.gy
 net.gy
 org.gy
 
-// hk : https://www.hkdnr.hk
+// hk : https://www.hkirc.hk
 // Submitted by registry <hk.tech@hkirc.hk>
 hk
 com.hk
 edu.hk
 gov.hk
 idv.hk
 net.hk
 org.hk
@@ -1224,27 +1240,28 @@ reklam.hu
 sex.hu
 shop.hu
 suli.hu
 szex.hu
 tozsde.hu
 utazas.hu
 video.hu
 
-// id : https://register.pandi.or.id/
+// id : https://pandi.id/en/domain/registration-requirements/
 id
 ac.id
 biz.id
 co.id
 desa.id
 go.id
 mil.id
 my.id
 net.id
 or.id
+ponpes.id
 sch.id
 web.id
 
 // ie : https://en.wikipedia.org/wiki/.ie
 ie
 gov.ie
 
 // il : http://www.isoc.org.il/domains/
@@ -1336,20 +1353,18 @@ edu.is
 gov.is
 org.is
 int.is
 
 // it : https://en.wikipedia.org/wiki/.it
 it
 gov.it
 edu.it
-// Reserved geo-names:
-// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf
-// There is also a list of reserved geo-names corresponding to Italian municipalities
-// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here.
+// Reserved geo-names (regions and provinces):
+// http://www.nic.it/sites/default/files/docs/Regulation_assignation_v7.1.pdf
 // Regions
 abr.it
 abruzzo.it
 aosta-valley.it
 aostavalley.it
 bas.it
 basilicata.it
 cal.it
@@ -1393,51 +1408,74 @@ sar.it
 sardegna.it
 sardinia.it
 sic.it
 sicilia.it
 sicily.it
 taa.it
 tos.it
 toscana.it
+trentin-sud-tirol.it
+trentin-süd-tirol.it
+trentin-sudtirol.it
+trentin-südtirol.it
+trentin-sued-tirol.it
+trentin-suedtirol.it
 trentino-a-adige.it
 trentino-aadige.it
 trentino-alto-adige.it
 trentino-altoadige.it
 trentino-s-tirol.it
 trentino-stirol.it
 trentino-sud-tirol.it
+trentino-süd-tirol.it
 trentino-sudtirol.it
+trentino-südtirol.it
 trentino-sued-tirol.it
 trentino-suedtirol.it
+trentino.it
 trentinoa-adige.it
 trentinoaadige.it
 trentinoalto-adige.it
 trentinoaltoadige.it
 trentinos-tirol.it
 trentinostirol.it
 trentinosud-tirol.it
+trentinosüd-tirol.it
 trentinosudtirol.it
+trentinosüdtirol.it
 trentinosued-tirol.it
 trentinosuedtirol.it
+trentinsud-tirol.it
+trentinsüd-tirol.it
+trentinsudtirol.it
+trentinsüdtirol.it
+trentinsued-tirol.it
+trentinsuedtirol.it
 tuscany.it
 umb.it
 umbria.it
 val-d-aosta.it
 val-daosta.it
 vald-aosta.it
 valdaosta.it
 valle-aosta.it
 valle-d-aosta.it
 valle-daosta.it
 valleaosta.it
 valled-aosta.it
 valledaosta.it
 vallee-aoste.it
+vallée-aoste.it
+vallee-d-aoste.it
+vallée-d-aoste.it
 valleeaoste.it
+valléeaoste.it
+valleedaoste.it
+valléedaoste.it
 vao.it
 vda.it
 ven.it
 veneto.it
 // Provinces
 ag.it
 agrigento.it
 al.it
@@ -1460,37 +1498,48 @@ ar.it
 arezzo.it
 ascoli-piceno.it
 ascolipiceno.it
 asti.it
 at.it
 av.it
 avellino.it
 ba.it
+balsan-sudtirol.it
+balsan-südtirol.it
+balsan-suedtirol.it
 balsan.it
 bari.it
 barletta-trani-andria.it
 barlettatraniandria.it
 belluno.it
 benevento.it
 bergamo.it
 bg.it
 bi.it
 biella.it
 bl.it
 bn.it
 bo.it
 bologna.it
+bolzano-altoadige.it
 bolzano.it
+bozen-sudtirol.it
+bozen-südtirol.it
+bozen-suedtirol.it
 bozen.it
 br.it
 brescia.it
 brindisi.it
 bs.it
 bt.it
+bulsan-sudtirol.it
+bulsan-südtirol.it
+bulsan-suedtirol.it
+bulsan.it
 bz.it
 ca.it
 cagliari.it
 caltanissetta.it
 campidano-medio.it
 campidanomedio.it
 campobasso.it
 carbonia-iglesias.it
@@ -1498,17 +1547,19 @@ carboniaiglesias.it
 carrara-massa.it
 carraramassa.it
 caserta.it
 catania.it
 catanzaro.it
 cb.it
 ce.it
 cesena-forli.it
+cesena-forlì.it
 cesenaforli.it
+cesenaforlì.it
 ch.it
 chieti.it
 ci.it
 cl.it
 cn.it
 co.it
 como.it
 cosenza.it
@@ -1529,17 +1580,19 @@ fermo.it
 ferrara.it
 fg.it
 fi.it
 firenze.it
 florence.it
 fm.it
 foggia.it
 forli-cesena.it
+forlì-cesena.it
 forlicesena.it
+forlìcesena.it
 fr.it
 frosinone.it
 ge.it
 genoa.it
 genova.it
 go.it
 gorizia.it
 gr.it
@@ -1660,16 +1713,17 @@ si.it
 siena.it
 siracusa.it
 so.it
 sondrio.it
 sp.it
 sr.it
 ss.it
 suedtirol.it
+südtirol.it
 sv.it
 ta.it
 taranto.it
 te.it
 tempio-olbia.it
 tempioolbia.it
 teramo.it
 terni.it
@@ -1678,17 +1732,16 @@ to.it
 torino.it
 tp.it
 tr.it
 trani-andria-barletta.it
 trani-barletta-andria.it
 traniandriabarletta.it
 tranibarlettaandria.it
 trapani.it
-trentino.it
 trento.it
 treviso.it
 trieste.it
 ts.it
 turin.it
 tv.it
 ud.it
 udine.it
@@ -3641,18 +3694,26 @@ gyeonggi.kr
 gyeongnam.kr
 incheon.kr
 jeju.kr
 jeonbuk.kr
 jeonnam.kr
 seoul.kr
 ulsan.kr
 
-// kw : https://en.wikipedia.org/wiki/.kw
-*.kw
+// kw : https://www.nic.kw/policies/
+// Confirmed by registry <nic.tech@citra.gov.kw>
+kw
+com.kw
+edu.kw
+emb.kw
+gov.kw
+ind.kw
+net.kw
+org.kw
 
 // ky : http://www.icta.ky/da_ky_reg_dom.php
 // Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17
 ky
 edu.ky
 gov.ky
 com.ky
 org.ky
@@ -6148,19 +6209,16 @@ edu.tr
 kep.tr
 
 // Used by Northern Cyprus
 nc.tr
 
 // Used by government agencies of Northern Cyprus
 gov.nc.tr
 
-// travel : https://en.wikipedia.org/wiki/.travel
-travel
-
 // tt : http://www.nic.tt/
 tt
 co.tt
 com.tt
 org.tt
 net.tt
 biz.tt
 info.tt
@@ -6725,18 +6783,26 @@ yt
 // xn--node ("ge", Georgian Mkhedruli) : GE
 გე
 
 // xn--qxam ("el", Greek) : GR
 // Hellenic Ministry of Infrastructure, Transport, and Networks
 ελ
 
 // xn--j6w193g ("Hong Kong", Chinese) : HK
-// https://www2.hkirc.hk/register/rules.jsp
+// https://www.hkirc.hk
+// Submitted by registry <hk.tech@hkirc.hk>
+// https://www.hkirc.hk/content.jsp?id=30#!/34
 香港
+公司.香港
+教育.香港
+政府.香港
+個人.香港
+網絡.香港
+組織.香港
 
 // xn--2scrj9c ("Bharat", Kannada) : IN
 // India
 ಭಾರತ
 
 // xn--3hcrj9c ("Bharat", Oriya) : IN
 // India
 ଭାରତ
@@ -6980,17 +7046,17 @@ zw
 ac.zw
 co.zw
 gov.zw
 mil.zw
 org.zw
 
 
 // newGTLDs
-// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2018-04-18T19:16:57Z
+// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2018-05-08T19:40:37Z
 // This list is auto-generated, don't edit it manually.
 
 // aaa : 2015-02-26 American Automobile Association, Inc.
 aaa
 
 // aarp : 2015-05-21 AARP
 aarp
 
@@ -7199,17 +7265,17 @@ audible
 audio
 
 // auspost : 2015-08-13 Australian Postal Corporation
 auspost
 
 // author : 2014-12-18 Amazon Registry Services, Inc.
 author
 
-// auto : 2014-11-13 Cars Registry Limited 
+// auto : 2014-11-13 Cars Registry Limited
 auto
 
 // autos : 2014-01-09 DERAutos, LLC
 autos
 
 // avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca
 avianca
 
@@ -7481,17 +7547,17 @@ canon
 capetown
 
 // capital : 2014-03-06 Binky Moon, LLC
 capital
 
 // capitalone : 2015-08-06 Capital One Financial Corporation
 capitalone
 
-// car : 2015-01-22 Cars Registry Limited 
+// car : 2015-01-22 Cars Registry Limited
 car
 
 // caravan : 2013-12-12 Caravan International, Inc.
 caravan
 
 // cards : 2013-12-05 Binky Moon, LLC
 cards
 
@@ -7499,17 +7565,17 @@ cards
 care
 
 // career : 2013-10-09 dotCareer LLC
 career
 
 // careers : 2013-10-02 Binky Moon, LLC
 careers
 
-// cars : 2014-11-13 Cars Registry Limited 
+// cars : 2014-11-13 Cars Registry Limited
 cars
 
 // cartier : 2014-06-23 Richemont DNS Inc.
 cartier
 
 // casa : 2013-11-21 Minds + Machines Group Limited
 casa
 
@@ -7700,17 +7766,17 @@ contractors
 cooking
 
 // cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc.
 cookingchannel
 
 // cool : 2013-11-14 Binky Moon, LLC
 cool
 
-// corsica : 2014-09-25 Collectivité Territoriale de Corse
+// corsica : 2014-09-25 Collectivité de Corse
 corsica
 
 // country : 2013-12-19 DotCountry LLC
 country
 
 // coupon : 2015-02-26 Amazon Registry Services, Inc.
 coupon
 
@@ -8273,19 +8339,16 @@ gold
 goldpoint
 
 // golf : 2014-12-18 Binky Moon, LLC
 golf
 
 // goo : 2014-12-18 NTT Resonant Inc.
 goo
 
-// goodhands : 2015-07-31 Allstate Fire and Casualty Insurance Company
-goodhands
-
 // goodyear : 2015-07-02 The Goodyear Tire & Rubber Company
 goodyear
 
 // goog : 2014-11-20 Charleston Road Registry Inc.
 goog
 
 // google : 2014-07-24 Charleston Road Registry Inc.
 google
@@ -8552,19 +8615,16 @@ istanbul
 itau
 
 // itv : 2015-07-09 ITV Services Limited
 itv
 
 // iveco : 2015-09-03 CNH Industrial N.V.
 iveco
 
-// iwc : 2014-06-23 Richemont DNS Inc.
-iwc
-
 // jaguar : 2014-11-13 Jaguar Land Rover Ltd
 jaguar
 
 // java : 2014-06-19 Oracle Corporation
 java
 
 // jcb : 2014-11-20 JCB Co., Ltd.
 jcb
@@ -8579,19 +8639,16 @@ jeep
 jetzt
 
 // jewelry : 2015-03-05 Binky Moon, LLC
 jewelry
 
 // jio : 2015-04-02 Reliance Industries Limited
 jio
 
-// jlc : 2014-12-04 Richemont DNS Inc.
-jlc
-
 // jll : 2015-04-02 Jones Lang LaSalle Incorporated
 jll
 
 // jmp : 2015-03-26 Matrix IP LLC
 jmp
 
 // jnj : 2015-06-18 Johnson & Johnson Services, Inc.
 jnj
@@ -8933,19 +8990,16 @@ meme
 memorial
 
 // men : 2015-02-26 Exclusive Registry Limited
 men
 
 // menu : 2013-09-11 Wedding TLD2, LLC
 menu
 
-// meo : 2014-11-07 MEO Servicos de Comunicacoes e Multimedia, S.A.
-meo
-
 // merckmsd : 2016-07-14 MSD Registry Holdings, Inc.
 merckmsd
 
 // metlife : 2015-05-07 MetLife Services and Solutions, LLC
 metlife
 
 // miami : 2013-12-19 Minds + Machines Group Limited
 miami
@@ -9068,17 +9122,17 @@ nec
 netbank
 
 // netflix : 2015-06-18 Netflix, Inc.
 netflix
 
 // network : 2013-11-14 Binky Moon, LLC
 network
 
-// neustar : 2013-12-05 NeuStar, Inc.
+// neustar : 2013-12-05 Registry Services, LLC
 neustar
 
 // new : 2014-01-30 Charleston Road Registry Inc.
 new
 
 // newholland : 2015-09-03 CNH Industrial N.V.
 newholland
 
@@ -9227,19 +9281,16 @@ ott
 ovh
 
 // page : 2014-12-04 Charleston Road Registry Inc.
 page
 
 // panasonic : 2015-07-30 Panasonic Corporation
 panasonic
 
-// panerai : 2014-11-07 Richemont DNS Inc.
-panerai
-
 // paris : 2014-01-30 City of Paris
 paris
 
 // pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
 pars
 
 // partners : 2013-12-05 Binky Moon, LLC
 partners
@@ -9578,19 +9629,16 @@ sandvik
 sandvikcoromant
 
 // sanofi : 2014-10-09 Sanofi
 sanofi
 
 // sap : 2014-03-27 SAP AG
 sap
 
-// sapo : 2014-11-07 MEO Servicos de Comunicacoes e Multimedia, S.A.
-sapo
-
 // sarl : 2014-07-03 Binky Moon, LLC
 sarl
 
 // sas : 2015-04-02 Research IP LLC
 sas
 
 // save : 2015-06-25 Amazon Registry Services, Inc.
 save
@@ -9935,19 +9983,16 @@ tdk
 team
 
 // tech : 2015-01-30 Personals TLD Inc.
 tech
 
 // technology : 2013-09-13 Binky Moon, LLC
 technology
 
-// telecity : 2015-02-19 TelecityGroup International Limited
-telecity
-
 // telefonica : 2014-10-16 Telefónica S.A.
 telefonica
 
 // temasek : 2014-08-07 Temasek Holdings (Private) Limited
 temasek
 
 // tennis : 2014-12-04 Binky Moon, LLC
 tennis
@@ -10034,16 +10079,19 @@ toys
 trade
 
 // trading : 2014-12-11 Dottrading Registry Limited
 trading
 
 // training : 2013-11-07 Binky Moon, LLC
 training
 
+// travel :  Dog Beach, LLC
+travel
+
 // travelchannel : 2015-07-02 Lifestyle Domain Holdings, Inc.
 travelchannel
 
 // travelers : 2015-03-26 Travelers TLD, LLC
 travelers
 
 // travelersinsurance : 2015-03-26 Travelers TLD, LLC
 travelersinsurance
@@ -10142,19 +10190,16 @@ vip
 virgin
 
 // visa : 2015-07-30 Visa Worldwide Pte. Limited
 visa
 
 // vision : 2013-12-05 Binky Moon, LLC
 vision
 
-// vista : 2014-09-18 Vistaprint Limited
-vista
-
 // vistaprint : 2014-09-18 Vistaprint Limited
 vistaprint
 
 // viva : 2014-11-07 Saudi Telecom Company
 viva
 
 // vivo : 2015-07-31 Telefonica Brasil S.A.
 vivo
@@ -10583,19 +10628,16 @@ vermögensberatung
 嘉里
 
 // xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd.
 广东
 
 // xn--zfr164b : 2013-11-08 China Organizational Name Administration Center
 政务
 
-// xperia : 2015-05-14 Sony Mobile Communications AB
-xperia
-
 // xyz : 2013-12-05 XYZ.COM LLC
 xyz
 
 // yachts : 2014-01-09 DERYachts, LLC
 yachts
 
 // yahoo : 2015-04-02 Yahoo! Domain Services Inc.
 yahoo
@@ -10678,16 +10720,17 @@ cloudfront.net
 *.compute.amazonaws.com
 *.compute-1.amazonaws.com
 *.compute.amazonaws.com.cn
 us-east-1.amazonaws.com
 
 // Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/
 // Submitted by Luke Wells <psl-maintainers@amazon.com>
 cn-north-1.eb.amazonaws.com.cn
+cn-northwest-1.eb.amazonaws.com.cn
 elasticbeanstalk.com
 ap-northeast-1.elasticbeanstalk.com
 ap-northeast-2.elasticbeanstalk.com
 ap-northeast-3.elasticbeanstalk.com
 ap-south-1.elasticbeanstalk.com
 ap-southeast-1.elasticbeanstalk.com
 ap-southeast-2.elasticbeanstalk.com
 ca-central-1.elasticbeanstalk.com
@@ -10764,16 +10807,20 @@ s3-website.eu-west-2.amazonaws.com
 s3-website.eu-west-3.amazonaws.com
 s3-website.us-east-2.amazonaws.com
 
 // Amune : https://amune.org/
 // Submitted by Team Amune <cert@amune.org>
 t3l3p0rt.net
 tele.amune.org
 
+// Apigee : https://apigee.com/
+// Submitted by Apigee Security Team <security@apigee.com>
+apigee.io
+
 // Aptible : https://www.aptible.com/
 // Submitted by Thomas Orozco <thomas@aptible.com>
 on-aptible.com
 
 // Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/
 // Submitted by Hector Martin <marcan@euskalencounter.org>
 user.party.eus
 
@@ -10804,16 +10851,20 @@ backplaneapp.io
 // BetaInABox
 // Submitted by Adrian <adrian@betainabox.com>
 betainabox.com
 
 // BinaryLane : http://www.binarylane.com
 // Submitted by Nathan O'Sullivan <nathan@mammoth.com.au>
 bnr.la
 
+// Blackbaud, Inc. : https://www.blackbaud.com
+// Submitted by Paul Crowder <paul.crowder@blackbaud.com>
+blackbaudcdn.net
+
 // Boomla : https://boomla.com
 // Submitted by Tibor Halter <thalter@boomla.com>
 boomla.net
 
 // Boxfuse : https://boxfuse.com
 // Submitted by Axel Fontaine <axel@boxfuse.com>
 boxfuse.io
 
@@ -10919,16 +10970,20 @@ cloudaccess.net
 // cloudControl : https://www.cloudcontrol.com/
 // Submitted by Tobias Wilken <tw@cloudcontrol.com>
 cloudcontrolled.com
 cloudcontrolapp.com
 
 // co.ca : http://registry.co.ca/
 co.ca
 
+// Co & Co : https://co-co.nl/
+// Submitted by Govert Versluis <govert@co-co.nl>
+*.otap.co
+
 // i-registry s.r.o. : http://www.i-registry.cz/
 // Submitted by Martin Semrad <semrad@i-registry.cz>
 co.cz
 
 // CDN77.com : http://www.cdn77.com
 // Submitted by Jan Krpes <jan.krpes@cdn77.com>
 c.cdn77.org
 cdn77-ssl.net
@@ -10949,16 +11004,20 @@ cloudns.org
 cloudns.pro
 cloudns.pw
 cloudns.us
 
 // Cloudeity Inc : https://cloudeity.com
 // Submitted by Stefan Dimitrov <contact@cloudeity.com>
 cloudeity.net
 
+// CNPY : https://cnpy.gdn
+// Submitted by Angelo Gladding <angelo@lahacker.net>
+cnpy.gdn
+
 // CoDNS B.V.
 co.nl
 co.no
 
 // Combell.com : https://www.combell.com
 // Submitted by Thomas Wouters <thomas.wouters@combellgroup.com>
 webhosting.be
 hosting-cluster.nl
@@ -10992,16 +11051,25 @@ cupcake.is
 cyon.link
 cyon.site
 
 // Daplie, Inc : https://daplie.com
 // Submitted by AJ ONeal <aj@daplie.com>
 daplie.me
 localhost.daplie.me
 
+// Datto, Inc. : https://www.datto.com/
+// Submitted by Philipp Heckel <ph@datto.com>
+dattolocal.com
+dattorelay.com
+dattoweb.com
+mydatto.com
+dattolocal.net
+mydatto.net
+
 // Dansk.net : http://www.dansk.net/
 // Submitted by Anani Voule <digital@digital.co.dk>
 biz.dk
 co.dk
 firm.dk
 reg.dk
 store.dk
 
@@ -11336,16 +11404,20 @@ dyn.home-webserver.de
 myhome-server.de
 ddnss.org
 
 // Definima : http://www.definima.com/
 // Submitted by Maxence Bitterli <maxence@definima.com>
 definima.net
 definima.io
 
+// dnstrace.pro : https://dnstrace.pro/
+// Submitted by Chris Partridge <chris@partridge.tech>
+bci.dnstrace.pro
+
 // Dynu.com : https://www.dynu.com/
 // Submitted by Sue Ye <sue@dynu.com>
 ddnsfree.com
 ddnsgeek.com
 giize.com
 gleeze.com
 kozow.com
 loseyourip.com
@@ -11547,16 +11619,21 @@ map.fastlylb.net
 freetls.fastly.net
 map.fastly.net
 a.prod.fastly.net
 global.prod.fastly.net
 a.ssl.fastly.net
 b.ssl.fastly.net
 global.ssl.fastly.net
 
+// FASTVPS EESTI OU : https://fastvps.ru/
+// Submitted by Likhachev Vasiliy <lihachev@fastvps.ru>
+fastpanel.direct
+fastvps-server.com
+
 // Featherhead : https://featherhead.xyz/
 // Submitted by Simon Menke <simon@featherhead.xyz>
 fhapp.xyz
 
 // Fedora : https://fedoraproject.org/
 // submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org>
 fedorainfracloud.org
 fedorapeople.org
@@ -11581,19 +11658,25 @@ flynnhosting.net
 // Submitted by Romain Fliedel <rfliedel@freebox.fr>
 freebox-os.com
 freeboxos.com
 fbx-os.fr
 fbxos.fr
 freebox-os.fr
 freeboxos.fr
 
+// freedesktop.org : https://www.freedesktop.org
+// Submitted by Daniel Stone <daniel@fooishbar.org>
+freedesktop.org
+
 // Futureweb OG : http://www.futureweb.at
 // Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at>
 *.futurecms.at
+*.ex.futurecms.at
+*.in.futurecms.at
 futurehosting.at
 futuremailing.at
 *.ex.ortsinfo.at
 *.kunden.ortsinfo.at
 *.statics.cloud
 
 // GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains
 // Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk>
@@ -11709,16 +11792,17 @@ publishproxy.com
 withgoogle.com
 withyoutube.com
 
 // Hashbang : https://hashbang.sh
 hashbang.sh
 
 // Hasura : https://hasura.io
 // Submitted by Shahidh K Muhammed <shahidh@hasura.io>
+hasura.app
 hasura-app.io
 
 // Hepforge : https://www.hepforge.org
 // Submitted by David Grellscheid <admin@hepforge.org>
 hepforge.org
 
 // Heroku : https://www.heroku.com/
 // Submitted by Tom Maher <tmaher@heroku.com>
@@ -11782,16 +11866,21 @@ to.leg.br
 // intermetrics GmbH : https://pixolino.com/
 // Submitted by Wolfgang Schwarz <admin@intermetrics.de>
 pixolino.com
 
 // IPiFony Systems, Inc. : https://www.ipifony.com/
 // Submitted by Matthew Hardeman <mhardeman@ipifony.com>
 ipifony.net
 
+// IServ GmbH : https://iserv.eu
+// Submitted by Kim-Alexander Brodowski <kim.brodowski@iserv.eu>
+mein-iserv.de
+test-iserv.de
+
 // Jino : https://www.jino.ru
 // Submitted by Sergey Ulyashin <ulyashin@jino.ru>
 myjino.ru
 *.hosting.myjino.ru
 *.landing.myjino.ru
 *.spectrum.myjino.ru
 *.vps.myjino.ru
 
@@ -11817,16 +11906,24 @@ co.krd
 edu.krd
 
 // LCube - Professional hosting e.K. : https://www.lcube-webhosting.de
 // Submitted by Lars Laehn <info@lcube.de>
 git-repos.de
 lcube-server.de
 svn-repos.de
 
+// Lightmaker Property Manager, Inc. : https://app.lmpm.com/
+// Submitted by Greg Holland <greg.holland@lmpm.com>
+app.lmpm.com
+
+// Linki Tools UG : https://linki.tools
+// Submitted by Paulo Matos <pmatos@linki.tools>
+linkitools.space
+
 // linkyard ldt: https://www.linkyard.ch/
 // Submitted by Mario Siegenthaler <mario.siegenthaler@linkyard.ch>
 linkyard.cloud
 linkyard-cloud.ch
 
 // LiquidNet Ltd : http://www.liquidnetlimited.com/
 // Submitted by Victor Velchev <admin@liquidnetlimited.com>
 we.bs
@@ -11836,32 +11933,57 @@ we.bs
 uklugs.org
 glug.org.uk
 lug.org.uk
 lugs.org.uk
 
 // Lukanet Ltd : https://lukanet.com
 // Submitted by Anton Avramov <register@lukanet.com>
 barsy.bg
+barsy.co.uk
+barsyonline.co.uk
+barsycenter.com
 barsyonline.com
+barsy.club
 barsy.de
 barsy.eu
 barsy.in
+barsy.info
+barsy.io
+barsy.me
+barsy.menu
+barsy.mobi
 barsy.net
 barsy.online
+barsy.org
+barsy.pro
+barsy.pub
+barsy.shop
+barsy.site
 barsy.support
+barsy.uk
 
 // Magento Commerce
 // Submitted by Damien Tournoud <dtournoud@magento.cloud>
 *.magentosite.cloud
 
+// May First - People Link : https://mayfirst.org/
+// Submitted by Jamie McClelland <info@mayfirst.org>
+mayfirst.info
+mayfirst.org
+
 // Mail.Ru Group : https://hb.cldmail.ru
 // Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru>
 hb.cldmail.ru
 
+// Memset hosting : https://www.memset.com
+// Submitted by Tom Whitwell <domains@memset.com>
+miniserver.com
+memset.net
+
 // MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/
 // Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz>
 cloud.metacentrum.cz
 custom.metacentrum.cz
 
 // MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/
 // Submitted by Radim Janča <janca@cesnet.cz>
 flt.cloud.muni.cz
@@ -11912,16 +12034,44 @@ ngrok.io
 // Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/
 // Submitted by Nicholas Ford <nick@nimbushosting.co.uk>
 nh-serv.co.uk
 
 // NFSN, Inc. : https://www.NearlyFreeSpeech.NET/
 // Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net>
 nfshost.com
 
+// Now-DNS : https://now-dns.com
+// Submitted by Steve Russell <steve@now-dns.com>
+dnsking.ch
+mypi.co
+n4t.co
+001www.com
+ddnslive.com
+myiphost.com
+forumz.info
+16-b.it
+32-b.it
+64-b.it
+soundcast.me
+tcp4.me
+dnsup.net
+hicam.net
+now-dns.net
+ownip.net
+vpndns.net
+dynserv.org
+now-dns.org
+x443.pw
+now-dns.top
+ntdll.top
+freeddns.us
+crafting.xyz
+zapto.xyz
+
 // nsupdate.info : https://www.nsupdate.info/
 // Submitted by Thomas Waldmann <info@nsupdate.info>
 nsupdate.info
 nerdpol.ovh
 
 // No-IP.com : https://noip.com/
 // Submitted by Deven Reza <publicsuffixlist@noip.com>
 blogsyte.com
@@ -12025,57 +12175,71 @@ pcloud.host
 
 // NYC.mn : http://www.information.nyc.mn
 // Submitted by Matthew Brown <mattbrown@nyc.mn>
 nyc.mn
 
 // NymNom : https://nymnom.com/
 // Submitted by Dave McCormack <dave.mccormack@nymnom.com>
 nom.ae
+nom.af
 nom.ai
 nom.al
 nym.by
 nym.bz
 nom.cl
 nom.gd
+nom.ge
 nom.gl
 nym.gr
 nom.gt
+nym.gy
 nom.hn
+nym.ie
 nom.im
+nom.ke
 nym.kz
 nym.la
+nym.lc
 nom.li
 nym.li
 nym.lt
 nym.lu
 nym.me
 nom.mk
+nym.mn
 nym.mx
 nom.nu
 nym.nz
 nym.pe
 nym.pt
 nom.pw
 nom.qa
+nym.ro
 nom.rs
 nom.si
 nym.sk
+nom.st
 nym.su
 nym.sx
+nom.tj
 nym.tw
 nom.ug
 nom.uy
 nom.vc
 nom.vg
 
 // Octopodal Solutions, LLC. : https://ulterius.io/
 // Submitted by Andrew Sampson <andrew@ulterius.io>
 cya.gg
 
+// Omnibond Systems, LLC. : https://www.omnibond.com
+// Submitted by Cole Estep <cole@omnibond.com>
+cloudycluster.net
+
 // One Fold Media : http://www.onefoldmedia.com/
 // Submitted by Eddie Jones <eddie@onefoldmedia.com>
 nid.io
 
 // OpenCraft GmbH : http://opencraft.com/
 // Submitted by Sven Marnach <sven@opencraft.com>
 opencraft.hosting
 
@@ -12275,24 +12439,24 @@ apps.lair.io
 // SpaceKit : https://www.spacekit.io/
 // Submitted by Reza Akhavan <spacekit.io@gmail.com>
 spacekit.io
 
 // SpeedPartner GmbH: https://www.speedpartner.de/
 // Submitted by Stefan Neufeind <info@speedpartner.de>
 customer.speedpartner.de
 
-// Stackspace : https://www.stackspace.io/
-// Submitted by Lina He <info@stackspace.io>
-stackspace.space
-
 // Storj Labs Inc. : https://storj.io/
 // Submitted by Philip Hutchins <hostmaster@storj.io>
 storj.farm
 
+// Studenten Net Twente : http://www.snt.utwente.nl/
+// Submitted by Silke Hofstra <syscom@snt.utwente.nl>
+utwente.io
+
 // Sub 6 Limited: http://www.sub6.com
 // Submitted by Dan Miller <dm@sub6.com>
 temp-dns.com
 
 // Synology, Inc. : https://www.synology.com/
 // Submitted by Rony Weng <ronyweng@synology.com>
 diskstation.me
 dscloud.biz
@@ -12353,17 +12517,17 @@ 2ix.de
 4lima.de
 lima-city.de
 1337.pictures
 clan.rip
 lima-city.rocks
 webspace.rocks
 lima.zone
 
-// TransIP : htts://www.transip.nl
+// TransIP : https://www.transip.nl
 // Submitted by Rory Breuk <rbreuk@transip.nl>
 *.transurl.be
 *.transurl.eu
 *.transurl.nl
 
 // TuxFamily : http://tuxfamily.org
 // Submitted by TuxFamily administrators <adm@staff.tuxfamily.org>
 tuxfamily.org
@@ -12382,24 +12546,30 @@ my-vigor.de
 my-wan.de
 syno-ds.de
 synology-diskstation.de
 synology-ds.de
 
 // Uberspace : https://uberspace.de
 // Submitted by Moritz Werner <mwerner@jonaspasche.com>
 uber.space
+*.uberspace.de
 
 // UDR Limited : http://www.udr.hk.com
 // Submitted by registry <hostmaster@udr.hk.com>
 hk.com
 hk.org
 ltd.hk
 inc.hk
 
+// United Gameserver GmbH : https://united-gameserver.de
+// Submitted by Stefan Schwarz <sysadm@united-gameserver.de>
+virtualuser.de
+virtual-user.de
+
 // .US
 // Submitted by Ed Moore <Ed.Moore@lib.de.us>
 lib.de.us
 
 // VeryPositive SIA : http://very.lv
 // Submitted by Danko Aleksejevs <danko@very.lv>
 2038.io
 
@@ -12420,16 +12590,20 @@ wedeploy.sh
 // Western Digital Technologies, Inc : https://www.wdc.com
 // Submitted by Jung Jin <jungseok.jin@wdc.com>
 remotewd.com
 
 // Wikimedia Labs : https://wikitech.wikimedia.org
 // Submitted by Yuvi Panda <yuvipanda@wikimedia.org>
 wmflabs.org
 
+// XenonCloud GbR: https://xenoncloud.net
+// Submitted by Julian Uphoff <publicsuffixlist@xenoncloud.net>
+half.host
+
 // XnBay Technology : http://www.xnbay.com/
 // Submitted by XnBay Developer <developer.xncloud@gmail.com>
 xnbay.com
 u2.xnbay.com
 u2-local.xnbay.com
 
 // XS4ALL Internet bv : https://www.xs4all.nl/
 // Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net>
@@ -12464,9 +12638,13 @@ noho.st
 // Submitted by registry <hostmaster@nic.za.net>
 za.net
 za.org
 
 // Zeit, Inc. : https://zeit.domains/
 // Submitted by Olli Vanhoja <olli@zeit.co>
 now.sh
 
+// Zone.id : https://zone.id/
+// Submitted by Su Hendro <admin@zone.id>
+zone.id
+
 // ===END PRIVATE DOMAINS===
--- a/netwerk/ipc/NeckoParent.cpp
+++ b/netwerk/ipc/NeckoParent.cpp
@@ -21,16 +21,17 @@
 #include "mozilla/net/DataChannelParent.h"
 #include "mozilla/net/SimpleChannelParent.h"
 #include "mozilla/net/AltDataOutputStreamParent.h"
 #include "mozilla/Unused.h"
 #include "mozilla/net/FileChannelParent.h"
 #include "mozilla/net/DNSRequestParent.h"
 #include "mozilla/net/ChannelDiverterParent.h"
 #include "mozilla/net/IPCTransportProvider.h"
+#include "mozilla/net/RequestContextService.h"
 #include "mozilla/net/TrackingDummyChannelParent.h"
 #ifdef MOZ_WEBRTC
 #include "mozilla/net/StunAddrsRequestParent.h"
 #endif
 #include "mozilla/dom/ChromeUtils.h"
 #include "mozilla/dom/ContentParent.h"
 #include "mozilla/dom/TabContext.h"
 #include "mozilla/dom/TabParent.h"
@@ -893,51 +894,51 @@ NeckoParent::RecvPredReset()
   predictor->Reset();
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 NeckoParent::RecvRequestContextLoadBegin(const uint64_t& rcid)
 {
   nsCOMPtr<nsIRequestContextService> rcsvc =
-    do_GetService("@mozilla.org/network/request-context-service;1");
+    RequestContextService::GetOrCreate();
   if (!rcsvc) {
     return IPC_OK();
   }
   nsCOMPtr<nsIRequestContext> rc;
   rcsvc->GetRequestContext(rcid, getter_AddRefs(rc));
   if (rc) {
     rc->BeginLoad();
   }
 
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 NeckoParent::RecvRequestContextAfterDOMContentLoaded(const uint64_t& rcid)
 {
   nsCOMPtr<nsIRequestContextService> rcsvc =
-    do_GetService("@mozilla.org/network/request-context-service;1");
+    RequestContextService::GetOrCreate();
   if (!rcsvc) {
     return IPC_OK();
   }
   nsCOMPtr<nsIRequestContext> rc;
   rcsvc->GetRequestContext(rcid, getter_AddRefs(rc));
   if (rc) {
     rc->DOMContentLoaded();
   }
 
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 NeckoParent::RecvRemoveRequestContext(const uint64_t& rcid)
 {
   nsCOMPtr<nsIRequestContextService> rcsvc =
-    do_GetService("@mozilla.org/network/request-context-service;1");
+    RequestContextService::GetOrCreate();
   if (!rcsvc) {
     return IPC_OK();
   }
 
   rcsvc->RemoveRequestContext(rcid);
 
   return IPC_OK();
 }
--- a/netwerk/protocol/http/TunnelUtils.cpp
+++ b/netwerk/protocol/http/TunnelUtils.cpp
@@ -8,17 +8,17 @@
 #include "HttpLog.h"
 
 #include "Http2Session.h"
 #include "nsHttp.h"
 #include "nsHttpHandler.h"
 #include "nsHttpRequestHead.h"
 #include "TCPFastOpen.h"
 #include "nsISocketProvider.h"
-#include "nsISocketProviderService.h"
+#include "nsSocketProviderService.h"
 #include "nsISSLSocketControl.h"
 #include "nsISocketTransport.h"
 #include "nsISupportsPriority.h"
 #include "nsNetAddr.h"
 #include "prerror.h"
 #include "prio.h"
 #include "TunnelUtils.h"
 #include "nsNetCID.h"
@@ -48,17 +48,17 @@ TLSFilterTransaction::TLSFilterTransacti
   , mReadSegmentBlocked(false)
   , mNudgeCounter(0)
 {
   MOZ_ASSERT(OnSocketThread(), "not on socket thread");
   LOG(("TLSFilterTransaction ctor %p\n", this));
 
   nsCOMPtr<nsISocketProvider> provider;
   nsCOMPtr<nsISocketProviderService> spserv =
-    do_GetService(NS_SOCKETPROVIDERSERVICE_CONTRACTID);
+    nsSocketProviderService::GetOrCreate();
 
   if (spserv) {
     spserv->GetSocketProvider("ssl", getter_AddRefs(provider));
   }
 
   // Install an NSPR layer to handle getpeername() with a failure. This is kind
   // of silly, but the default one used by the pipe asserts when called and the
   // nss code calls it to see if we are connected to a real socket or not.
--- a/netwerk/protocol/http/nsHttpHandler.cpp
+++ b/netwerk/protocol/http/nsHttpHandler.cpp
@@ -19,17 +19,17 @@
 #include "nsINetworkProperties.h"
 #include "nsIHttpChannel.h"
 #include "nsIStandardURL.h"
 #include "LoadContextInfo.h"
 #include "nsCategoryManagerUtils.h"
 #include "nsIPrefService.h"
 #include "nsIPrefBranch.h"
 #include "nsIPrefLocalizedString.h"
-#include "nsISocketProviderService.h"
+#include "nsSocketProviderService.h"
 #include "nsISocketProvider.h"
 #include "nsPrintfCString.h"
 #include "nsCOMPtr.h"
 #include "nsNetCID.h"
 #include "mozilla/ClearOnShutdown.h"
 #include "mozilla/Printf.h"
 #include "mozilla/Sprintf.h"
 #include "nsAsyncRedirectVerifyHelper.h"
@@ -56,16 +56,17 @@
 #include "nsISupportsPrimitives.h"
 #include "nsIXULRuntime.h"
 #include "nsCharSeparatedTokenizer.h"
 #include "nsRFPService.h"
 #include "rust-helper/src/helper.h"
 
 #include "mozilla/net/NeckoChild.h"
 #include "mozilla/net/NeckoParent.h"
+#include "mozilla/net/RequestContextService.h"
 #include "mozilla/ipc/URIUtils.h"
 #include "mozilla/Telemetry.h"
 #include "mozilla/Unused.h"
 #include "mozilla/BasePrincipal.h"
 
 #include "mozilla/dom/ContentParent.h"
 #include "mozilla/dom/Navigator.h"
 
@@ -505,18 +506,17 @@ nsHttpHandler::Init()
     }
 
     mSessionStartTime = NowInSeconds();
     mHandlerActive = true;
 
     rv = InitConnectionMgr();
     if (NS_FAILED(rv)) return rv;
 
-    mRequestContextService =
-        do_GetService("@mozilla.org/network/request-context-service;1");
+    mRequestContextService = RequestContextService::GetOrCreate();
 
 #if defined(ANDROID)
     mProductSub.AssignLiteral(MOZILLA_UAVERSION);
 #else
     mProductSub.AssignLiteral(LEGACY_UA_GECKO_TRAIL);
 #endif
 
 #if DEBUG
@@ -1438,18 +1438,18 @@ nsHttpHandler::PrefsChanged(const char *
     if (PREF_CHANGED(HTTP_PREF("default-socket-type"))) {
         nsAutoCString sval;
         rv = Preferences::GetCString(HTTP_PREF("default-socket-type"), sval);
         if (NS_SUCCEEDED(rv)) {
             if (sval.IsEmpty())
                 mDefaultSocketType.SetIsVoid(true);
             else {
                 // verify that this socket type is actually valid
-                nsCOMPtr<nsISocketProviderService> sps(
-                        do_GetService(NS_SOCKETPROVIDERSERVICE_CONTRACTID));
+                nsCOMPtr<nsISocketProviderService> sps =
+                  nsSocketProviderService::GetOrCreate();
                 if (sps) {
                     nsCOMPtr<nsISocketProvider> sp;
                     rv = sps->GetSocketProvider(sval.get(), getter_AddRefs(sp));
                     if (NS_SUCCEEDED(rv)) {
                         // OK, this looks like a valid socket provider.
                         mDefaultSocketType.Assign(sval);
                     }
                 }
--- a/netwerk/socket/moz.build
+++ b/netwerk/socket/moz.build
@@ -13,25 +13,32 @@ XPIDL_SOURCES += [
 ]
 
 XPIDL_MODULE = 'necko_socket'
 
 LOCAL_INCLUDES += [
     '/netwerk/base',
 ]
 
+EXPORTS += [
+    'nsSocketProviderService.h',
+]
+
 UNIFIED_SOURCES += [
     'nsSocketProviderService.cpp',
     'nsSOCKSIOLayer.cpp',
     'nsSOCKSSocketProvider.cpp',
     'nsUDPSocketProvider.cpp',
 ]
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
     XPIDL_SOURCES += [
         'nsINamedPipeService.idl',
     ]
+    EXPORTS += [
+        'nsNamedPipeService.h',
+    ]
     UNIFIED_SOURCES += [
         'nsNamedPipeIOLayer.cpp',
         'nsNamedPipeService.cpp'
     ]
 
 FINAL_LIBRARY = 'xul'
--- a/netwerk/socket/nsISocketProvider.idl
+++ b/netwerk/socket/nsISocketProvider.idl
@@ -114,17 +114,8 @@ interface nsISocketProvider : nsISupport
 
     /**
      * If set, do not use newer protocol features that might have interop problems
      * on the Internet. Intended only for use with critical infra like the updater.
      * default is false.
      */
     const unsigned long BE_CONSERVATIVE = 1 << 4;
 };
-
-%{C++
-/**
- * nsISocketProvider implementations should be registered with XPCOM under a
- * contract ID of the form: "@mozilla.org/network/socket;2?type=foo"
- */
-#define NS_NETWORK_SOCKET_CONTRACTID_PREFIX \
-    "@mozilla.org/network/socket;2?type="
-%}
--- a/netwerk/socket/nsNamedPipeIOLayer.cpp
+++ b/netwerk/socket/nsNamedPipeIOLayer.cpp
@@ -7,17 +7,17 @@
 #include <utility>
 #include "mozilla/Atomics.h"
 #include "mozilla/DebugOnly.h"
 #include "mozilla/Logging.h"
 #include "mozilla/Move.h"
 #include "mozilla/net/DNS.h"
 #include "mozilla/RefPtr.h"
 #include "mozilla/Unused.h"
-#include "nsINamedPipeService.h"
+#include "nsNamedPipeService.h"
 #include "nsISupportsImpl.h"
 #include "nsIThread.h"
 #include "nsNamedPipeIOLayer.h"
 #include "nsNetCID.h"
 #include "nspr.h"
 #include "nsServiceManagerUtils.h"
 #include "nsSocketTransportService2.h"
 #include "nsString.h"
@@ -161,17 +161,17 @@ private:
 
   Atomic<DWORD> mErrorCode; // error code from Named Pipe Service.
 };
 
 NS_IMPL_ISUPPORTS(NamedPipeInfo,
                   nsINamedPipeDataObserver)
 
 NamedPipeInfo::NamedPipeInfo()
-  : mNamedPipeService(do_GetService(NS_NAMEDPIPESERVICE_CONTRACTID))
+  : mNamedPipeService(NamedPipeService::GetOrCreate())
   , mPipe(INVALID_HANDLE_VALUE)
   , mReadBegin(0)
   , mReadEnd(0)
   , mHasPendingRead(false)
   , mWriteBegin(0)
   , mWriteEnd(0)
   , mHasPendingWrite(false)
   , mNonblocking(true)
--- a/netwerk/socket/nsNamedPipeService.cpp
+++ b/netwerk/socket/nsNamedPipeService.cpp
@@ -5,26 +5,29 @@
 
 #include "mozilla/Services.h"
 #include "nsCOMPtr.h"
 #include "nsIObserverService.h"
 #include "nsIThread.h"
 #include "nsNamedPipeService.h"
 #include "nsNetCID.h"
 #include "nsThreadUtils.h"
+#include "mozilla/ClearOnShutdown.h"
 
 namespace mozilla {
 namespace net {
 
 static mozilla::LazyLogModule gNamedPipeServiceLog("NamedPipeWin");
 #define LOG_NPS_DEBUG(...) \
   MOZ_LOG(gNamedPipeServiceLog, mozilla::LogLevel::Debug, (__VA_ARGS__))
 #define LOG_NPS_ERROR(...) \
   MOZ_LOG(gNamedPipeServiceLog, mozilla::LogLevel::Error, (__VA_ARGS__))
 
+StaticRefPtr<NamedPipeService> NamedPipeService::gSingleton;
+
 NS_IMPL_ISUPPORTS(NamedPipeService,
                   nsINamedPipeService,
                   nsIObserver,
                   nsIRunnable)
 
 NamedPipeService::NamedPipeService()
   : mIocp(nullptr)
   , mIsShutdown(false)
@@ -78,16 +81,36 @@ NamedPipeService::Init()
   if (NS_WARN_IF(NS_FAILED(rv))) {
     Shutdown();
     return rv;
   }
 
   return NS_OK;
 }
 
+// static
+already_AddRefed<nsINamedPipeService>
+NamedPipeService::GetOrCreate()
+{
+  MOZ_ASSERT(NS_IsMainThread());
+
+  RefPtr<NamedPipeService> inst;
+  if (gSingleton) {
+    inst = gSingleton;
+  } else {
+    inst = new NamedPipeService();
+    nsresult rv = inst->Init();
+    NS_ENSURE_SUCCESS(rv, nullptr);
+    gSingleton = inst;
+    ClearOnShutdown(&gSingleton);
+  }
+
+  return inst.forget();
+}
+
 void
 NamedPipeService::Shutdown()
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   // remove observer
   nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
   if (obs) {
@@ -314,12 +337,10 @@ NamedPipeService::Run()
   {
     MutexAutoLock lock(mLock);
     RemoveRetiredObjects();
   }
 
   return NS_OK;
 }
 
-static NS_DEFINE_CID(kNamedPipeServiceCID, NS_NAMEDPIPESERVICE_CID);
-
 } // namespace net
 } // namespace mozilla
--- a/netwerk/socket/nsNamedPipeService.h
+++ b/netwerk/socket/nsNamedPipeService.h
@@ -7,37 +7,41 @@
 #define mozilla_netwerk_socket_nsNamedPipeService_h
 
 #include <windows.h>
 #include "mozilla/Atomics.h"
 #include "mozilla/Mutex.h"
 #include "nsINamedPipeService.h"
 #include "nsIObserver.h"
 #include "nsIRunnable.h"
+#include "nsIThread.h"
 #include "nsTArray.h"
+#include "mozilla/StaticPtr.h"
 
 namespace mozilla {
 namespace net {
 
 class NamedPipeService final : public nsINamedPipeService
                              , public nsIObserver
                              , public nsIRunnable
 {
 public:
   NS_DECL_THREADSAFE_ISUPPORTS
   NS_DECL_NSINAMEDPIPESERVICE
   NS_DECL_NSIOBSERVER
   NS_DECL_NSIRUNNABLE
 
+  static already_AddRefed<nsINamedPipeService> GetOrCreate();
+
+private:
   explicit NamedPipeService();
+  virtual ~NamedPipeService() = default;
 
   nsresult Init();
 
-private:
-  virtual ~NamedPipeService() = default;
   void Shutdown();
   void RemoveRetiredObjects();
 
   HANDLE mIocp; // native handle to the I/O completion port.
   Atomic<bool> mIsShutdown; // set to true to stop the event loop running by mThread.
   nsCOMPtr<nsIThread> mThread; // worker thread to get I/O events.
 
   /**
@@ -46,14 +50,16 @@ private:
    * the handle and observer into a "retired" list and close/remove them in
    * the worker thread to avoid a race condition that might happen between
    * |CloseHandle()| and |GetQueuedCompletionStatus()|.
    */
   Mutex mLock;
   nsTArray<nsCOMPtr<nsINamedPipeDataObserver>> mObservers; // protected by mLock
   nsTArray<nsCOMPtr<nsINamedPipeDataObserver>> mRetiredObservers; // protected by mLock
   nsTArray<HANDLE> mRetiredHandles; // protected by mLock
+
+  static StaticRefPtr<NamedPipeService> gSingleton;
 };
 
 } // namespace net
 } // namespace mozilla
 
 #endif // mozilla_netwerk_socket_nsNamedPipeService_h
--- a/netwerk/socket/nsSocketProviderService.cpp
+++ b/netwerk/socket/nsSocketProviderService.cpp
@@ -1,45 +1,72 @@
 /* -*- Mode: C++; tab-width: 2; 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/. */
 
 #include "nsString.h"
 #include "nsIServiceManager.h"
 #include "nsISocketProvider.h"
+#include "nsError.h"
+#include "nsNSSComponent.h"
+#include "nsSOCKSSocketProvider.h"
 #include "nsSocketProviderService.h"
-#include "nsError.h"
+#include "nsSSLSocketProvider.h"
+#include "nsTLSSocketProvider.h"
+#include "nsUDPSocketProvider.h"
+#include "mozilla/ClearOnShutdown.h"
+
+mozilla::StaticRefPtr<nsSocketProviderService> nsSocketProviderService::gSingleton;
 
 ////////////////////////////////////////////////////////////////////////////////
 
-nsresult
-nsSocketProviderService::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult)
+already_AddRefed<nsISocketProviderService>
+nsSocketProviderService::GetOrCreate()
 {
-  nsresult rv;
-  nsCOMPtr<nsISocketProviderService> inst = new nsSocketProviderService();
-  if (!inst)
-    rv = NS_ERROR_OUT_OF_MEMORY;
-  else
-    rv = inst->QueryInterface(aIID, aResult);
-  return rv;
+  RefPtr<nsSocketProviderService> inst;
+  if (gSingleton) {
+    inst = gSingleton;
+  } else {
+    inst = new nsSocketProviderService();
+    gSingleton = inst;
+    if (NS_IsMainThread()) {
+      mozilla::ClearOnShutdown(&gSingleton);
+    } else {
+      NS_DispatchToMainThread(NS_NewRunnableFunction(
+        "net::nsSocketProviderService::GetOrCreate",
+        []() -> void { mozilla::ClearOnShutdown(&gSingleton); }));
+    }
+  }
+  return inst.forget();
 }
 
 NS_IMPL_ISUPPORTS(nsSocketProviderService, nsISocketProviderService)
 
 ////////////////////////////////////////////////////////////////////////////////
 
 NS_IMETHODIMP
 nsSocketProviderService::GetSocketProvider(const char         *type,
                                            nsISocketProvider **result)
 {
-  nsresult rv;
-  nsAutoCString contractID(
-          NS_LITERAL_CSTRING(NS_NETWORK_SOCKET_CONTRACTID_PREFIX) +
-          nsDependentCString(type));
-
-  rv = CallGetService(contractID.get(), result);
-  if (NS_FAILED(rv))
-      rv = NS_ERROR_UNKNOWN_SOCKET_TYPE;
-  return rv;
+  nsCOMPtr<nsISocketProvider> inst;
+  if (!nsCRT::strcmp(type, "ssl") &&
+      XRE_IsParentProcess() &&
+      EnsureNSSInitializedChromeOrContent()) {
+    inst = new nsSSLSocketProvider();
+  } else if (!nsCRT::strcmp(type, "starttls") &&
+             XRE_IsParentProcess() &&
+             EnsureNSSInitializedChromeOrContent()) {
+    inst = new nsTLSSocketProvider();
+  } else if (!nsCRT::strcmp(type, "socks")) {
+    inst = new nsSOCKSSocketProvider(NS_SOCKS_VERSION_5);
+  } else if (!nsCRT::strcmp(type, "socks4")) {
+    inst = new nsSOCKSSocketProvider(NS_SOCKS_VERSION_4);
+  } else if (!nsCRT::strcmp(type, "udp")) {
+    inst = new nsUDPSocketProvider();
+  } else {
+    return NS_ERROR_UNKNOWN_SOCKET_TYPE;
+  }
+  inst.forget(result);
+  return NS_OK;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
--- a/netwerk/socket/nsSocketProviderService.h
+++ b/netwerk/socket/nsSocketProviderService.h
@@ -2,23 +2,26 @@
 /* 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 nsSocketProviderService_h__
 #define nsSocketProviderService_h__
 
 #include "nsISocketProviderService.h"
+#include "mozilla/StaticPtr.h"
 
 class nsSocketProviderService : public nsISocketProviderService
 {
+  nsSocketProviderService() = default;
   virtual ~nsSocketProviderService() = default;
 
 public:
   NS_DECL_THREADSAFE_ISUPPORTS
   NS_DECL_NSISOCKETPROVIDERSERVICE
 
-  nsSocketProviderService() = default;
+  static already_AddRefed<nsISocketProviderService> GetOrCreate();
 
-  static nsresult Create(nsISupports *, REFNSIID aIID, void **aResult);
+private:
+  static mozilla::StaticRefPtr<nsSocketProviderService> gSingleton;
 };
 
 #endif /* nsSocketProviderService_h__ */
--- a/netwerk/test/TestNamedPipeService.cpp
+++ b/netwerk/test/TestNamedPipeService.cpp
@@ -5,17 +5,17 @@
 
 #include "TestCommon.h"
 #include "gtest/gtest.h"
 
 #include <windows.h>
 
 #include "mozilla/Atomics.h"
 #include "mozilla/Monitor.h"
-#include "nsINamedPipeService.h"
+#include "nsNamedPipeService.h"
 #include "nsNetCID.h"
 
 #define PIPE_NAME "\\\\.\\pipe\\TestNPS"
 #define TEST_STR "Hello World"
 
 using namespace mozilla;
 
 /**
@@ -281,23 +281,21 @@ CreateNamedPipe(LPHANDLE aServer, LPHAND
 
   WaitForSingleObjectEx(overlapped.hEvent, INFINITE, TRUE);
 
   return NS_OK;
 }
 
 TEST(TestNamedPipeService,Test)
 {
-  nsresult rv;
   nsCOMPtr<nsINamedPipeService> svc =
-    do_GetService(NS_NAMEDPIPESERVICE_CONTRACTID, &rv);
-  ASSERT_TRUE(NS_SUCCEEDED(rv));
+    net::NamedPipeService::GetOrCreate();
 
   HANDLE readPipe, writePipe;
-  rv = CreateNamedPipe(&readPipe, &writePipe);
+  nsresult rv = CreateNamedPipe(&readPipe, &writePipe);
   ASSERT_TRUE(NS_SUCCEEDED(rv));
 
   RefPtr<nsNamedPipeDataObserver> readObserver =
     new nsNamedPipeDataObserver(readPipe);
   RefPtr<nsNamedPipeDataObserver> writeObserver =
     new nsNamedPipeDataObserver(writePipe);
 
   ASSERT_TRUE(NS_SUCCEEDED(svc->AddDataObserver(readPipe, readObserver)));
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1166,9 +1166,9 @@ static const TransportSecurityPreload kP
   { "za.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "zh.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
 };
 
 // Pinning Preload List Length = 488;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1548676986838000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1548773485447000);
--- a/security/manager/ssl/moz.build
+++ b/security/manager/ssl/moz.build
@@ -63,16 +63,18 @@ EXPORTS += [
     'nsClientAuthRemember.h',
     'nsNSSCallbacks.h',
     'nsNSSCertificate.h',
     'nsNSSComponent.h',
     'nsNSSHelper.h',
     'nsRandomGenerator.h',
     'nsSecurityHeaderParser.h',
     'NSSErrorsService.h',
+    'nsSSLSocketProvider.h',
+    'nsTLSSocketProvider.h',
     'RootCertificateTelemetryUtils.h',
     'ScopedNSSTypes.h',
     'SharedCertVerifier.h',
 ]
 
 EXPORTS.mozilla += [
     'DataStorage.h',
     'DataStorageList.h',
--- a/security/manager/ssl/nsNSSModule.cpp
+++ b/security/manager/ssl/nsNSSModule.cpp
@@ -23,20 +23,18 @@
 #include "nsNSSCertificateDB.h"
 #include "nsNSSComponent.h"
 #include "nsNSSVersion.h"
 #include "nsNTLMAuthModule.h"
 #include "nsNetCID.h"
 #include "nsPK11TokenDB.h"
 #include "nsPKCS11Slot.h"
 #include "nsRandomGenerator.h"
-#include "nsSSLSocketProvider.h"
 #include "nsSecureBrowserUIImpl.h"
 #include "nsSiteSecurityService.h"
-#include "nsTLSSocketProvider.h"
 #include "nsXULAppAPI.h"
 #include "OSKeyStore.h"
 #include "OSReauthenticator.h"
 
 #ifdef MOZ_XUL
 #include "nsCertTree.h"
 #endif
 
@@ -128,18 +126,16 @@ NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(PSMC
 
 typedef mozilla::psm::NSSErrorsService NSSErrorsService;
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(NSSErrorsService, Init)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsNSSVersion)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsSecureBrowserUIImpl)
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsNSSComponent, Init)
 
 NS_DEFINE_NAMED_CID(NS_NSSCOMPONENT_CID);
-NS_DEFINE_NAMED_CID(NS_SSLSOCKETPROVIDER_CID);
-NS_DEFINE_NAMED_CID(NS_STARTTLSSOCKETPROVIDER_CID);
 NS_DEFINE_NAMED_CID(NS_SECRETDECODERRING_CID);
 NS_DEFINE_NAMED_CID(NS_PK11TOKENDB_CID);
 NS_DEFINE_NAMED_CID(NS_PKCS11MODULEDB_CID);
 NS_DEFINE_NAMED_CID(NS_PSMCONTENTLISTEN_CID);
 NS_DEFINE_NAMED_CID(NS_X509CERT_CID);
 NS_DEFINE_NAMED_CID(NS_X509CERTDB_CID);
 NS_DEFINE_NAMED_CID(NS_X509CERTLIST_CID);
 NS_DEFINE_NAMED_CID(NS_FORMPROCESSOR_CID);
@@ -164,20 +160,16 @@ NS_DEFINE_NAMED_CID(NS_OSKEYSTORE_CID);
 NS_DEFINE_NAMED_CID(NS_OSREAUTHENTICATOR_CID);
 
 // Components that require main thread initialization could cause a deadlock
 // in necko code (bug 1418752). To prevent it we initialize all such components
 // on main thread in advance in net_EnsurePSMInit(). Update that function when
 // new component with ThreadRestriction::MainThreadOnly is added.
 static const mozilla::Module::CIDEntry kNSSCIDs[] = {
   { &kNS_NSSCOMPONENT_CID, false, nullptr, nsNSSComponentConstructor },
-  { &kNS_SSLSOCKETPROVIDER_CID, false, nullptr,
-    Constructor<nsSSLSocketProvider> },
-  { &kNS_STARTTLSSOCKETPROVIDER_CID, false, nullptr,
-    Constructor<nsTLSSocketProvider> },
   { &kNS_SECRETDECODERRING_CID, false, nullptr,
     Constructor<SecretDecoderRing> },
   { &kNS_PK11TOKENDB_CID, false, nullptr, Constructor<nsPK11TokenDB> },
   { &kNS_PKCS11MODULEDB_CID, false, nullptr, Constructor<PKCS11ModuleDB> },
   { &kNS_PSMCONTENTLISTEN_CID, false, nullptr, PSMContentListenerConstructor },
   { &kNS_X509CERT_CID, false, nullptr,
     Constructor<nsNSSCertificate, nullptr, ProcessRestriction::AnyProcess> },
   { &kNS_X509CERTDB_CID, false, nullptr, Constructor<nsNSSCertificateDB> },
@@ -229,18 +221,16 @@ static const mozilla::Module::CIDEntry k
                 ThreadRestriction::MainThreadOnly> },
   { nullptr }
 };
 
 static const mozilla::Module::ContractIDEntry kNSSContracts[] = {
   { PSM_COMPONENT_CONTRACTID, &kNS_NSSCOMPONENT_CID },
   { NS_NSS_ERRORS_SERVICE_CONTRACTID, &kNS_NSSERRORSSERVICE_CID },
   { NS_NSSVERSION_CONTRACTID, &kNS_NSSVERSION_CID },
-  { NS_SSLSOCKETPROVIDER_CONTRACTID, &kNS_SSLSOCKETPROVIDER_CID },
-  { NS_STARTTLSSOCKETPROVIDER_CONTRACTID, &kNS_STARTTLSSOCKETPROVIDER_CID },
   { NS_SECRETDECODERRING_CONTRACTID, &kNS_SECRETDECODERRING_CID },
   { NS_PK11TOKENDB_CONTRACTID, &kNS_PK11TOKENDB_CID },
   { NS_PKCS11MODULEDB_CONTRACTID, &kNS_PKCS11MODULEDB_CID },
   { NS_PSMCONTENTLISTEN_CONTRACTID, &kNS_PSMCONTENTLISTEN_CID },
   { NS_X509CERTDB_CONTRACTID, &kNS_X509CERTDB_CID },
   { NS_X509CERTLIST_CONTRACTID, &kNS_X509CERTLIST_CID },
   { NS_FORMPROCESSOR_CONTRACTID, &kNS_FORMPROCESSOR_CID },
 #ifdef MOZ_XUL
--- 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(1551096181588000);
+const PRTime gPreloadListExpirationTime = INT64_C(1551192680231000);
 %%
 0-1.party, 1
 00100010.net, 1
 0010100.net, 1
 00120012.net, 1
 00130013.net, 1
 00140014.net, 1
 00150015.net, 1
@@ -127,16 +127,17 @@ 0wx.es, 1
 0wx.eu, 1
 0wx.org, 1
 0x.cx, 1
 0x.sk, 1
 0x0.cloud, 1
 0x0.li, 1
 0x00ff00ff.com, 1
 0x17.de, 1
+0x378.net, 1
 0x48.pw, 1
 0x52.net, 1
 0x52.org, 1
 0x7d.com, 1
 0x7fffffff.net, 1
 0x90.in, 1
 0x90.io, 1
 0xaa55.me, 1
@@ -226,23 +227,25 @@ 123termpapers.com, 1
 123writings.com, 1
 124133.com, 1
 124633.com, 1
 125m125.de, 1
 1288366.com, 1
 1288fc.com, 1
 12photos.eu, 1
 12thmanrising.com, 1
+12train.com, 1
 12vpn.net, 1
 130.ua, 1
 132kv.ch, 1
 13318522.com, 1
 1359826938.rsc.cdn77.org, 1
 135vv.com, 1
 13826145000.com, 1
+1395kj.com, 1
 13th-dover.uk, 1
 143533.com, 1
 143633.com, 1
 143733.com, 1
 143933.com, 1
 1453914078.rsc.cdn77.org, 1
 145433.com, 1
 145733.com, 1
@@ -281,49 +284,53 @@ 1661237.com, 1
 166166.com, 1
 168bet9.com, 1
 168bo9.com, 1
 168bo9.net, 1
 168esb.com, 1
 16book.org, 1
 174343.com, 1
 1750studios.com, 0
+1768calc.com.au, 1
 1811559.com, 1
 1844329061.rsc.cdn77.org, 1
 1876996.com, 1
 18888msc.com, 1
 1888zr.com, 1
 188da.com, 1
 188dv.com, 1
 1895media.com, 1
 189dv.com, 1
 189fc.com, 1
 18celebration.com, 1
 18celebration.org, 1
 18f.gov, 1
 18f.gsa.gov, 0
+1911trust.com, 1
 1912x.com, 1
 19216811.online, 1
 192168ll.repair, 1
 1921958389.rsc.cdn77.org, 1
 192433.com, 1
 1972969867.rsc.cdn77.org, 1
 1981612088.rsc.cdn77.org, 1
+19area.cn, 1
 19hundert84.de, 1
 1a-diamantscheiben.de, 1
 1a-vermessung.at, 1
 1a-werkstattgeraete.de, 1
 1ab-machinery.com, 1
 1b1.pl, 1
 1c-power.ru, 1
 1cover.co.nz, 1
 1cover.com.au, 1
 1day1ac.red, 1
 1e9.nl, 1
 1er-secours.ch, 1
+1europlan.nl, 1
 1f123.net, 1
 1fach-digital.de, 1
 1gsoft.com, 1
 1hourproofreading.com, 1
 1it.click, 1
 1js.de, 1
 1kando.com, 0
 1km.ro, 1
@@ -373,19 +380,19 @@ 2018.wales, 1
 2048-spiel.de, 1
 2048game.co.uk, 1
 20at.com, 1
 20denier.com, 1
 20zq.com, 1
 215dy.net, 1
 21sthammersmith.org.uk, 1
 21stnc.com, 1
+21stnc.us, 1
 21x9.org, 1
 2222yh.com, 1
-22digital.agency, 1
 230beats.com, 1
 2333.press, 1
 23333.link, 1
 2333666.xyz, 1
 2333blog.com, 1
 233abc.com, 1
 233blog.com, 1
 233boy.com, 1
@@ -418,16 +425,17 @@ 24timeravis.dk, 1
 24zpravy.cz, 1
 256k.me, 1
 256pages.com, 0
 25reinyan25.net, 1
 2600edinburgh.org, 1
 2600hq.com, 1
 260887.com, 1
 263.info, 1
+2718282.net, 1
 27728522.com, 1
 28-industries.com, 1
 281180.de, 1
 2858958.com, 1
 28peaks.com, 1
 28spots.net, 1
 291167.xyz, 1
 2912.nl, 1
@@ -619,16 +627,17 @@ 3ank.in, 1
 3bakayottu.com, 1
 3bigking.com, 1
 3c-d.de, 1
 3candy.com, 1
 3chat.org, 1
 3circlefunding.ch, 1
 3countiescastlehire.co.uk, 1
 3cs.ch, 1
+3d-fotoservice.de, 1
 3deeplearner.com, 1
 3djuegos.com, 1
 3dm.audio, 1
 3dmedium.de, 1
 3dmusiclab.nl, 1
 3do3dont.com, 1
 3dprintsondemand.eu, 1
 3drenaline.com, 1
@@ -961,16 +970,17 @@ 6633445.com, 1
 6652566.com, 1
 6660111.ru, 1
 6664553.com, 1
 666668722.com, 1
 6666yh.com, 1
 666omg.com, 1
 6677.us, 1
 668da.com, 1
+66b.com, 1
 66bwf.com, 1
 670422.com, 1
 671422.com, 1
 672422.com, 1
 673422.com, 1
 676422.com, 1
 679422.com, 1
 680422.com, 1
@@ -1091,38 +1101,57 @@ 8722hk.com, 1
 8722ph.com, 1
 8722tw.com, 1
 8722usa.com, 1
 87577.com, 1
 8818k3.com, 1
 8833445.com, 1
 88522am.com, 1
 887.ag, 1
+8876007.com, 1
+8876008.com, 1
+8876009.com, 1
 8876138.com, 1
+8876205.com, 1
+8876278.com, 1
+8876289.com, 1
+8876290.com, 1
+8876353.com, 1
+8876389.com, 1
 8876520.com, 1
 8876578.com, 1
 8876598.com, 1
 8876655.com, 1
 8876660.com, 1
 8876687.com, 1
+8876764.com, 1
 8876770.com, 1
 8876775.com, 1
 8876776.com, 1
 8876779.com, 1
+8876808.com, 1
 8876818.com, 1
 8876822.com, 1
+8876832.com, 1
+8876835.com, 1
 8876838.com, 1
 8876858.com, 1
+8876859.com, 1
 8876866.com, 1
+8876878.com, 1
 8876879.com, 1
 8876881.com, 1
 8876882.com, 1
 8876883.com, 1
 8876898.com, 1
 8876900.com, 1
+8876955.com, 1
+8876979.com, 1
+8876987.com, 1
+8876989.com, 1
 8876991.com, 1
 8876992.com, 1
 8876996.com, 1
 8880013.com, 1
 8880021.com, 1
 8880023.com, 1
 8880025.com, 1
 8880057.com, 1
@@ -1153,16 +1182,18 @@ 8889809.com, 1
 8889819.com, 1
 8889870.com, 1
 8889881.com, 1
 8889890.com, 1
 8889893.com, 1
 8889903.com, 1
 8889910.com, 1
 888bwf.com, 1
+888funcity.com, 1
+888funcity.net, 1
 88bwf.com, 1
 88d.com, 1
 88laohu.cc, 1
 88laohu.com, 1
 8901178.com, 1
 8901178.net, 1
 8910899.com, 1
 8910899.net, 1
@@ -1240,17 +1271,16 @@ 9617818.com, 1
 9617818.net, 1
 9679693.com, 1
 9681909.com, 1
 9696178.com, 1
 9696178.net, 1
 972422.com, 1
 9788876.com, 1
 97bros.com, 1
-9822.am, 1
 9822.bz, 1
 9822am.com, 1
 9822cn.com, 1
 9822hk.com, 1
 9822ph.com, 1
 9822tw.com, 1
 9822usa.com, 1
 98laba.com, 1
@@ -1280,16 +1310,17 @@ 9vx.org, 1
 9won.kr, 1
 9y.at, 1
 9yw.me, 1
 a-1basements.com, 1
 a-1indianawaterproofing.com, 1
 a-allard.be, 1
 a-classinflatables.co.uk, 1
 a-intel.com, 1
+a-invest.de, 1
 a-ix.net, 1
 a-little-linux-box.at, 1
 a-msystems.com, 1
 a-oben.org, 1
 a-starbouncycastles.co.uk, 1
 a-wife.net, 1
 a-ztransmission.com, 1
 a0print.nl, 1
@@ -1481,17 +1512,16 @@ abvent.net, 1
 abvlbasketviganello.ch, 1
 abyssproject.net, 1
 ac-admin.pl, 1
 ac-epmservices.com, 1
 ac-town.com, 1
 ac0g.dyndns.org, 1
 aca-creative.co.uk, 1
 academicexperts.us, 1
-academichealthscience.net, 1
 academie-de-police.ch, 1
 academkin.com, 1
 academytv.com.au, 1
 acaeum.com, 1
 acampar.com.br, 1
 acaonegocios.com.br, 1
 acaptureservices.com, 1
 acara-yoga.de, 1
@@ -1570,16 +1600,17 @@ achwo.de, 1
 acid.ninja, 1
 acidbin.co, 1
 aciety.com, 1
 aciksite.com, 1
 ackermann.ch, 1
 ackis.duckdns.org, 0
 acklandstainless.com.au, 1
 acksoftdemo.fr, 1
+acl.gov, 1
 aclu.org, 0
 acluva.org, 0
 acme.beer, 1
 acmexyz123.info, 1
 acnpacific.com, 1
 acodess.com, 1
 aconnor.xyz, 1
 acordes.online, 1
@@ -1588,16 +1619,17 @@ acorntreecare.com, 1
 acoshift.com, 1
 acoshift.me, 1
 acourse.io, 1
 acousti-tech.com, 1
 acousticalsolutions.com, 1
 acoustics.network, 1
 acoustics.tech, 1
 acoustique-tardy.com, 1
+acpcoils.com, 1
 acperu.ch, 1
 acpinformatique.fr, 1
 acquisition.gov, 1
 acquistareviagragenericoitalia.net, 1
 acraft.org, 1
 acrealux.lu, 1
 acrepairgeorgetown.com, 1
 acrepairhutto.com, 1
@@ -1610,16 +1642,17 @@ across.ml, 1
 acrossgw.com, 1
 acrosstheblvd.com, 1
 acroyoga-nuernberg.de, 1
 acrylbilder-acrylmalerei.de, 1
 acrylicwifi.com, 1
 acs-chantal.com, 1
 acsbbs.org, 1
 acsc.gov.au, 1
+acscbasket.com, 1
 acsemb.org, 1
 acsports.ca, 1
 actc.org.uk, 1
 actc81.fr, 1
 actgruppe.de, 1
 actiefgeld.nl, 1
 actilove.ch, 1
 actioncleaningnd.com, 1
@@ -1696,16 +1729,17 @@ adamstas.com, 1
 adamwallington.co.uk, 1
 adamwilcox.org, 1
 adamyuan.xyz, 1
 adapt-elektronik.com, 1
 adapt.de, 1
 adaptablesecurity.org, 1
 adapti.de, 1
 adaptivemechanics.edu.au, 1
+adarshthapa.in, 1
 adawolfa.cz, 1
 adayinthelifeof.nl, 1
 adblock.ovh, 1
 adblockextreme.com, 1
 adblockextreme.net, 1
 adblockextreme.org, 1
 addeekt.com, 1
 adderall.space, 1
@@ -1970,16 +2004,17 @@ afrodigital.uk, 1
 afs-asso.org, 1
 aftab-alam.de, 1
 after.digital, 1
 afterhate.fr, 1
 afterskool.eu, 1
 afterstack.net, 1
 afuh.de, 1
 afva.net, 1
+afwd.international, 1
 afzco.asia, 1
 ag-websolutions.de, 1
 ag8-game.com, 1
 agalliasis.ch, 1
 agamsecurity.ch, 1
 agatajanik.de, 1
 agate.pw, 1
 agdalieso.com.ba, 1
@@ -2065,16 +2100,17 @@ agroline.by, 1
 agroxxi.ru, 1
 agroyard.com.ua, 1
 agsb.ch, 1
 agscinemas.com, 1
 agscinemasapp.com, 1
 agung-furniture.com, 1
 agwa.name, 1
 agy.cl, 1
+ahawkesrealtors.com, 1
 ahcpr.gov, 0
 ahd.com, 0
 ahelos.tk, 1
 aheng.me, 1
 ahero4all.org, 1
 ahkubiak.ovh, 1
 ahlaejaba.com, 1
 ahlz.sk, 1
@@ -2123,41 +2159,45 @@ aignermunich.de, 1
 aignermunich.jp, 1
 aiicy.org, 1
 aiida.se, 1
 aijsk.com, 1
 aikenorganics.com, 1
 aikenpromotions.com, 1
 aiki.de, 1
 aiki.do, 1
+aiki.tk, 1
 aikido-club-limburg.de, 1
 aikido-kiel.de, 1
 aikido-linz.at, 1
 aikido-wels.at, 1
 ailitonia.com, 1
 ailitonia.xyz, 1
 aimax.com, 1
 aimeeandalec.com, 1
 aimgroup.co.tz, 1
 aimi-salon.com, 1
 aimotive.com, 1
 aimrom.org, 1
 aimstoreglobal.com, 1
 aintevenmad.ch, 1
+ainutrition.co.uk, 1
+ainvest.de, 1
 aioboot.com, 1
 aiois.com, 1
 aipbarcelona.com, 1
 aiphyron.com, 1
 air-craftglass.com, 1
 air-shots.ch, 1
 air-we-go.co.uk, 1
 airbly.com, 1
 airbnb.ae, 1
 airbnb.at, 1
 airbnb.be, 1
+airbnb.biz, 1
 airbnb.ca, 1
 airbnb.cat, 1
 airbnb.ch, 1
 airbnb.cl, 1
 airbnb.cn, 1
 airbnb.co.cr, 1
 airbnb.co.id, 1
 airbnb.co.il, 1
@@ -2217,17 +2257,17 @@ airbnb.ru, 1
 airbnb.se, 1
 airbnb.tools, 1
 airbnbchina.cn, 1
 airbnbopen.com, 1
 airborne-inflatables.co.uk, 1
 airbossofamerica.com, 1
 airclass.com, 1
 aircomms.com, 1
-airconsalberton.co.za, 1
+airconssandton.co.za, 1
 airductclean.com, 0
 airductcleaning-fresno.com, 1
 airductcleaninggrandprairie.com, 1
 airductcleaningirving.com, 1
 airdur.eu, 1
 aireaseleaks.org, 1
 airedaleterrier.com.br, 1
 airetvie.com, 1
@@ -2241,28 +2281,30 @@ airikai.com, 1
 airlibre-parachutisme.com, 1
 airlinesettlement.com, 1
 airmail.cc, 1
 airmaxinflatables.com, 1
 airnow.gov, 1
 airpbx.com, 1
 airplay-inflatable-hire.co.uk, 1
 airplayradio.nl, 1
-airportlimototoronto.com, 1
 airpurifierproductsonline.com, 1
 airrestoration.ch, 1
+airsnore.com, 1
 airsoft.ch, 1
 airswap.io, 1
 airtimerewards.co.uk, 1
+airtoolaccessoryo.com, 1
 airvpn.org, 1
 airvuz.com, 1
 airwaystorage.net, 1
 airweb.top, 1
 airwegobouncycastles.co.uk, 1
 airwolfthemes.com, 1
+airwrenchei.com, 1
 ais.fashion, 1
 aisance-co.com, 1
 aisi316l.net, 1
 aisr.nl, 1
 aistockcharts.com, 1
 aistrope.com, 1
 ait.com.ar, 1
 aiticon.com, 1
@@ -2300,16 +2342,17 @@ akaoma.com, 1
 akasha.world, 1
 akazakov.info, 1
 akdigitalegesellschaft.de, 0
 akdusekbudil.cz, 1
 akelius.de, 0
 akfoundationindia.com, 1
 akhealthconnection.com, 1
 akhilindurti.com, 0
+akhomesforyou.com, 1
 akiba-server.info, 1
 akihito.com, 1
 akijo.de, 1
 akilli-devre.com, 1
 akita-boutique.com, 1
 akita-stream.com, 1
 akiym.com, 1
 akj.io, 1
@@ -2329,16 +2372,17 @@ akritikos.info, 1
 akronet.cz, 0
 akropol.cz, 0
 akropolis-ravensburg.de, 1
 aksehir.bel.tr, 1
 akselinurmio.fi, 0
 akshi.in, 1
 aktan.com.br, 1
 aktin.cz, 1
+aktin.sk, 1
 aktiv-naturheilmittel.at, 1
 aktiv-naturheilmittel.ch, 1
 aktiv-naturheilmittel.de, 1
 aktivace.eu, 1
 aktivierungscenter.de, 1
 aktuelle-uhrzeit.at, 1
 akuislam.com, 1
 akukas.com, 1
@@ -2395,16 +2439,17 @@ albrocar.com, 1
 albuic.tk, 1
 alca31.com, 1
 alcatelonetouch.us, 1
 alcatraz.online, 1
 alchimic.ch, 1
 alcnutrition.com, 1
 alco-united.com, 1
 alcoholapi.com, 1
+alcolecapital.com, 1
 alcorao.org, 1
 aldiabcs.com, 1
 aldien.com.br, 1
 aldo-vandini.de, 1
 aldomedia.com, 1
 aldorr.net, 0
 aldous-huxley.com, 1
 aleax.me, 1
@@ -2451,16 +2496,17 @@ alexei.su, 0
 alexey-shamara.ru, 1
 alexeykopytko.com, 1
 alexgaynor.net, 1
 alexgebhard.com, 1
 alexhd.de, 1
 alexio.ml, 1
 alexisabarca.com, 1
 alexischaussy.xyz, 1
+alexiskoustoulidis.com, 1
 alexismeza.com, 1
 alexismeza.com.mx, 1
 alexismeza.dk, 1
 alexismeza.es, 1
 alexismeza.nl, 1
 alexkott.com, 1
 alexlouden.com, 1
 alexmerkel.com, 1
@@ -2505,16 +2551,17 @@ alibangash.com, 1
 alibiloungelv.com, 1
 alibip.de, 1
 alice-noutore.com, 1
 alice.tw, 1
 alicemaywebdesign.com.au, 1
 alicestudio.it, 1
 alicetone.net, 1
 alicialab.org, 1
+alieke.design, 1
 alienation.biz, 1
 alienflight.com, 1
 alienslab.net, 1
 alienstat.com, 1
 alignrs.com, 1
 aliim.gdn, 1
 alijammusic.com, 1
 alikulov.me, 1
@@ -2548,16 +2595,17 @@ allamericanmuslim.com, 1
 allamericanprotection.net, 1
 allamericatrans.com, 1
 allangirvan.net, 1
 allarmi.roma.it, 1
 allbenjoy.de, 1
 allbounceandplay.co.uk, 1
 allbouncesurrey.co.uk, 1
 allbrandbrand.com, 1
+allbursaries.co.za, 1
 allbusiness.com, 1
 allcapa.org, 1
 allcarecorrectionalpharmacy.com, 1
 allcarepharmacy.com, 1
 allcleanservices.ca, 1
 allcloud.com, 1
 allcovered.nl, 1
 alldewall.de, 1
@@ -2589,16 +2637,17 @@ allinone-ranking150.com, 1
 allis.studio, 1
 allius.de, 1
 alljamin.com, 1
 allladyboys.com, 1
 allmebel.ru, 1
 allmend-ru.de, 1
 allns.fr, 1
 allo-credit.ch, 1
+allo-symo.fr, 1
 allofthestops.com, 1
 allontanamentovolatili.it, 1
 allontanamentovolatili.milano.it, 1
 alloutatl.com, 1
 alloverthehill.com, 1
 alloydevil.nl, 1
 allplayer.tk, 1
 allpointsblog.com, 1
@@ -2676,16 +2725,17 @@ alpharotary.com, 1
 alphassl.de, 1
 alphatrash.de, 1
 alphavote-avex.com, 1
 alphavote.com, 1
 alphera.nl, 1
 alphie.me, 1
 alphipneux.fr, 1
 alpinechaletrental.com, 1
+alpinehighlandrealty.com, 1
 alpineplanet.com, 1
 alpinepubliclibrary.org, 1
 alpinestarmassage.com, 1
 alpinetrek.co.uk, 1
 alpiniste.fr, 1
 alqassam.net, 1
 alquiaga.com, 1
 alrait.com, 1
@@ -2713,17 +2763,16 @@ alterspalter.de, 1
 altes-sportamt.de, 1
 altesses.eu, 1
 altestore.com, 1
 altitudemoversdenver.com, 1
 altkremsmuensterer.at, 1
 altmaestrat.es, 1
 altoa.cz, 1
 altonblom.com, 1
-altoneum.com, 1
 altopartners.com, 1
 altopia.com, 1
 altphotos.com, 1
 altporn.xyz, 1
 alts.li, 1
 altstipendiaten.de, 1
 alttrackr.com, 1
 altunbas.info, 1
@@ -2735,16 +2784,17 @@ alviano.com, 1
 alvicom.hu, 1
 alvis-audio.com, 1
 alvn.ga, 1
 alvosec.com, 1
 alwaysdry.com.au, 1
 alwayslookingyourbest.com, 1
 alwaysmine.fi, 1
 alwaysonssl.com, 1
+alxpresentes.com.br, 1
 alyoung.com, 1
 alza.at, 1
 alza.co.uk, 1
 alza.cz, 1
 alza.de, 1
 alza.hu, 1
 alza.sk, 1
 alzashop.com, 1
@@ -2923,16 +2973,17 @@ ananyoo.com, 1
 anarchistischegroepnijmegen.nl, 0
 anarchyrp.life, 1
 anarka.org, 1
 anassiriphotography.com, 0
 anastasia-shamara.ru, 1
 anaveragehuman.eu.org, 1
 ancestramil.fr, 1
 anchev.net, 1
+anchorit.gov, 1
 anchovy.nz, 0
 ancient-gates.de, 1
 ancientcraft.eu, 1
 ancientnorth.nl, 1
 ancolies-andre.com, 1
 anconaswine.com, 1
 and-stuff.nl, 1
 and.com, 1
@@ -2962,37 +3013,39 @@ andreamcnett.com, 1
 andreas-hecht.com, 1
 andreas-kluge.eu, 1
 andreaseracleous.com, 1
 andreasfeusi.ch, 1
 andreashecht-blog.de, 1
 andreaskluge.eu, 1
 andreaskrasa.com, 1
 andreaslicht.nl, 1
+andreasmuelhaupt.de, 1
 andreasolsson.se, 1
 andreasr.com, 1
 andree.cloud, 1
 andrefaber.nl, 1
 andrehansen.de, 1
 andrei-nakov.org, 1
 andrejbenz.com, 1
+andrejstefanovski.com, 1
+andrelauzier.com, 1
 andreoliveira.io, 1
 andrepicard.de, 1
 andrespaz.com, 1
 andreundnina.de, 1
 andrew.fi, 1
 andrew.london, 1
 andrewbdesign.com, 1
 andrewdaws.co, 1
 andrewdaws.info, 1
 andrewdaws.io, 1
 andrewdaws.me, 1
 andrewdaws.tv, 1
 andrewensley.com, 1
-andrewhowden.com, 1
 andrewimeson.com, 1
 andrewin.ru, 1
 andrewmichaud.com, 1
 andrewmichaud.me, 1
 andrewpeng.net, 1
 andrewprokos.com, 1
 andrewrdaws.com, 1
 andrewrgoss.com, 1
@@ -3036,25 +3089,27 @@ anecuni-club.com, 1
 anecuni-rec.com, 1
 anedot-sandbox.com, 1
 anedot.com, 1
 anedot.space, 1
 anedot.xyz, 1
 aneebahmed.com, 1
 anegabawa.com, 1
 anekdotes.com, 0
+aneslix.com, 1
 anetaben.nl, 1
 anextraordinaryday.net, 1
 ange-de-bonheur444.com, 1
 angehardy.com, 1
 angel-body.com, 1
 angelesydemonios.es, 1
 angelic47.com, 1
 angelicare.co.uk, 1
 angelinahair.com, 1
+angeljmadrid.com, 1
 angeloryndon.com, 1
 angelremigene.com, 1
 angelsgirl.eu.org, 1
 anginf.de, 1
 anglertanke.de, 1
 anglesgirl.eu.org, 1
 anglesya.win, 1
 anglictina-sojcak.cz, 1
@@ -3133,36 +3188,39 @@ annaenemma.nl, 1
 annafiore.com.br, 1
 annangela.moe, 1
 annarokina.com, 1
 annasvapor.se, 1
 annawagner.pl, 1
 annedaniels.co.uk, 1
 annejan.com, 1
 anneliesonline.nl, 1
+annema.biz, 1
 annemakeslovelycandles.co.uk, 1
 annetaan.fi, 1
 annetta.com, 1
 annettewindlin.ch, 1
 annevankesteren.com, 1
 annevankesteren.nl, 1
 annevankesteren.org, 1
 annicascakes.nl, 1
 anniversary-cruise.com, 1
 annmariewaltsphotography.com, 1
 annonasoftware.com, 1
 annotate.software, 1
 annoyingasfuk.com, 1
 annuaire-jcb.com, 1
 annuaire-photographe.fr, 0
+annunciationbvmchurch.org, 1
 anohana.org, 1
 anojan.com, 1
 anon-next.de, 1
 anonboards.com, 1
 anoncom.net, 1
+anoncrypto.org, 1
 anoneko.com, 1
 anongoth.pl, 1
 anonrea.ch, 1
 anons.fr, 1
 anonukradio.org, 1
 anonym-surfen.de, 1
 anonyme-spieler.at, 1
 anorak.tech, 1
@@ -3205,16 +3263,17 @@ antennista.pavia.it, 1
 antennista.roma.it, 1
 antennista.tv, 1
 antennisti.milano.it, 1
 antennisti.roma.it, 1
 anteprima.info, 1
 anthedesign.fr, 1
 anthisis.tv, 1
 anthony-rouanet.com, 1
+anthony.codes, 1
 anthonycarbonaro.com, 1
 anthonyfontanez.com, 1
 anthonygaidot.fr, 1
 anthonyvadala.me, 1
 anthropoid.ca, 1
 anti-bible.com, 1
 anti-radar.org, 1
 antibioticshome.com, 1
@@ -3335,16 +3394,17 @@ apiled.io, 1
 apination.com, 1
 apio.systems, 1
 apis.blue, 1
 apis.google.com, 1
 apis.moe, 1
 apisyouwonthate.com, 1
 apk.li, 1
 apk4fun.com, 1
+apkmod.id, 1
 apkoyunlar.club, 1
 aplikaceproandroid.cz, 1
 aplis-online.de, 0
 aplpackaging.co.uk, 1
 aplu.fr, 1
 aplus-usa.net, 1
 apluswaterservices.com, 1
 apn-dz.org, 1
@@ -3374,16 +3434,17 @@ appapi.link, 1
 apparelfashionwiki.com, 1
 appartement-andrea.at, 1
 appartement-evolene.net, 1
 appartementhaus-badria.de, 1
 appartementmarsum.nl, 1
 appdrinks.com, 1
 appearance-plm.de, 1
 appel-aide.ch, 1
+appelaprojets.fr, 1
 appelboomdefilm.nl, 1
 appengine.google.com, 1
 apperio.com, 1
 appformacpc.com, 1
 appgeek.com.br, 1
 appharbor.com, 1
 appify.org, 1
 appimlab.it, 1
@@ -3421,17 +3482,16 @@ appscloudplus.com, 1
 appseccalifornia.org, 0
 appshuttle.com, 1
 appt.ch, 1
 apptomics.com, 1
 apptoutou.com, 1
 appuals.com, 1
 appui-de-fenetre.fr, 1
 appveyor.com, 1
-appxcrypto.com, 1
 appzoojoo.be, 1
 apratimsaha.com, 1
 aprefix.com, 1
 apretatuercas.es, 1
 aprogend.com.br, 1
 aproposcomputing.com, 1
 aprovpn.com, 1
 aprr.org, 1
@@ -3476,16 +3536,17 @@ arabicxz.com, 1
 arabsexi.info, 1
 arachina.com, 1
 arackiralama.name.tr, 1
 arados.de, 1
 arai21.net, 1
 araleeniken.com, 1
 aramado.com, 1
 aramido.de, 1
+aranchhomes.com, 1
 aranel.me, 1
 aranycsillag.net, 1
 araraexpress.com.br, 1
 araratour.com, 1
 araro.ch, 1
 araseifudousan.com, 1
 arawaza.biz, 1
 arawaza.com, 0
@@ -3502,16 +3563,17 @@ arboworks.com, 1
 arbu.eu, 0
 arcaik.net, 1
 arcbouncycastles.co.uk, 1
 arcenergy.co.uk, 1
 archimedicx.com, 1
 archined.nl, 1
 architectryan.com, 1
 architecture-colleges.com, 1
+architectureandgovernance.com, 1
 archivero.es, 1
 archivesdelavieordinaire.ch, 1
 archlinux.de, 1
 archlinux.org, 1
 archmediamarketing.com, 1
 archoit.org, 0
 archsec.info, 1
 arckr.com, 1
@@ -3539,17 +3601,16 @@ arenlor.com, 1
 arenlor.info, 1
 arenns.com, 1
 arenzanaphotography.com, 1
 areqgaming.com, 1
 ares-trading.de, 1
 arethsu.se, 1
 arfad.ch, 1
 arg.zone, 1
-argama-nature.com, 0
 arganaderm.ch, 1
 argb.de, 1
 argekultur.at, 1
 argh.io, 1
 argonium.com.au, 1
 argot.com, 1
 argovpay.com, 1
 ariadermspa.com, 1
@@ -3570,16 +3631,17 @@ arinde.ee, 1
 arinflatablefun.co.uk, 1
 arise19.com, 1
 arisevendor.net, 1
 aristocrates.co, 1
 aritec-la.com, 1
 arivo.com.br, 1
 arizonaautomobileclub.com, 1
 arizonabondedtitle.com, 1
+arizonahomeownerinsurance.com, 1
 arjandejong.eu, 1
 arjanvaartjes.net, 1
 arjunasdaughter.pub, 1
 arjweb.co.uk, 1
 arkacrao.org, 1
 arkadiyt.com, 1
 arkaic.dyndns.org, 1
 arkbyte.com, 1
@@ -3588,16 +3650,17 @@ arksan.com.tr, 1
 arkulagunak.com, 0
 arlatools.com, 1
 arlen.tv, 1
 arlenarmageddon.com, 1
 arlet.click, 1
 arletalibrary.com, 1
 arlingtonelectric.com, 1
 arlingtonwine.net, 1
+arm.gov, 1
 armadaquadrat.com, 1
 armandsdiscount.com, 1
 armanozak.com, 1
 armansfinejewellery.com, 1
 armansfinejewellery.com.au, 1
 armarinhovirtual.com.br, 1
 armazemdaminiatura.com.br, 1
 armazemgourmetbrasil.com.br, 1
@@ -3657,16 +3720,17 @@ arrow-api.nl, 1
 arrowfastener.com, 1
 arrowgrove.com, 1
 arrowheadaddict.com, 1
 arrowheadflats.com, 1
 arrowwebprojects.nl, 1
 arschkrebs.org, 1
 arsenal.ru, 1
 arsk1.com, 1
+arsplus.ru, 1
 arswb.men, 1
 art-auction.jp, 1
 art-et-culture.ch, 1
 artansoft.com, 1
 artboja.com, 1
 artdeco-photo.com, 1
 arte-soft.co, 1
 artea.ga, 1
@@ -3683,16 +3747,17 @@ arteequipamientos.com.uy, 1
 artefakt.es, 1
 artefeita.com.br, 1
 arteinstudio.it, 1
 artelt.com, 1
 artemis.re, 1
 arterienundvenen.ch, 1
 arteshow.ch, 1
 artetrama.com, 0
+artfabrics.com, 1
 artforum.sk, 1
 artfullyelegant.com, 1
 arthermitage.org, 1
 arthur.cn, 1
 arthurlaw.ca, 1
 arthurmelo.com, 0
 articaexports.com, 1
 artificial.army, 1
@@ -3793,20 +3858,22 @@ asia.dating, 1
 asiaheavens.com, 1
 asialeonding.at, 1
 asian-industry.eu, 1
 asianodor.com, 1
 asianshops.net, 1
 asianspa.co.uk, 1
 asiba.com.au, 1
 asiesvenezuela.com, 1
+asiinc-tex.com, 1
 asile-colis.fr, 1
 asinetasima.com, 1
 asisee.co.il, 1
 asisee.photography, 1
+ask.fi, 1
 ask.stg.fedoraproject.org, 1
 ask1.org, 1
 askcaisse.com, 1
 askcascade.com, 1
 askizzy.org.au, 1
 askkaren.gov, 1
 askmagicconch.com, 0
 askme24.de, 1
@@ -3921,16 +3988,17 @@ atelier-coiffure.ch, 1
 atelier-naruby.cz, 1
 atelier-viennois-cannes.fr, 1
 atelieraphelion.com, 1
 atelierbw.com, 1
 atelierdefrancais.ch, 1
 atelierdeloulou.fr, 1
 atelierdesflammesnoires.fr, 1
 atelierfantazie.sk, 1
+atelierhsn.com, 1
 atelierhupsakee.nl, 1
 ateliernaruby.cz, 1
 ateliers-veronese-nantes.fr, 1
 atelierssud.ch, 1
 atelierssud.swiss, 1
 atencionbimbo.com, 0
 atendimentodelta.com.br, 1
 atg.soy, 1
@@ -3950,31 +4018,33 @@ athlin.de, 1
 atigerseye.com, 1
 atimbertownservices.com, 1
 atishchenko.com, 1
 atisoft.biz, 1
 atisoft.com.tr, 1
 atisoft.net, 1
 atisoft.net.tr, 1
 atisoft.web.tr, 1
+atisystem.com, 1
 atitude.com, 1
 ativapsicologia.com.br, 1
 atk.me, 1
 atl-paas.net, 1
 atlantahairsurgeon.com, 1
 atlantareroof.com, 1
 atlantaspringroll.com, 1
 atlantichomes.com.au, 1
 atlanticpediatricortho.com, 1
 atlantis-kh.noip.me, 1
 atlantischild.hu, 1
 atlantishq.de, 1
 atlantiswaterproofing.com, 1
 atlas-5.site, 1
 atlas-staging.ml, 1
+atlasbrown.com, 1
 atlaschiropractic.org, 1
 atlascultural.com, 1
 atlasdev.nl, 1
 atlasone.us, 1
 atlassian.io, 1
 atlassignsandplaques.com, 1
 atletika.hu, 1
 atmocdn.com, 1
@@ -4009,16 +4079,17 @@ attilavandervelde.nl, 1
 attinderdhillon.com, 1
 attitudes-bureaux.fr, 1
 attogtech.com, 1
 attorney.org.il, 1
 attwood.org, 1
 atulhost.com, 1
 atviras.lt, 0
 atvirtual.at, 1
+atvsafety.gov, 1
 atwar-mod.com, 1
 atwonline.org, 1
 atxchirocoverage.com, 1
 atyourprice.net, 1
 atypicom.es, 1
 atypicom.fr, 1
 atypicom.it, 1
 atypicom.pt, 1
@@ -4032,16 +4103,17 @@ aubio.org, 1
 aubonmanger.fr, 1
 aucielrose.com, 1
 aucklandcastles.co.uk, 1
 aucubin.de, 1
 audialbuquerqueparts.com, 1
 audiblox.co.za, 1
 audiense.com, 0
 audio-detector.com, 1
+audiobookboo.com, 1
 audiobookstudio.com, 1
 audiolibri.org, 1
 audiolot.com, 1
 audion.cc, 1
 audion.hr, 1
 audioonly.stream, 1
 audiophile.ch, 1
 audiophix.com, 1
@@ -4050,16 +4122,17 @@ audiorental.net, 1
 audioschoolonline.com, 1
 audiotechniker.de, 1
 audirsq3.de, 1
 audisto.com, 1
 auditmatrix.com, 1
 auditos.com, 1
 audits.io, 1
 auditsquare.com, 1
+audreyjudson.com, 1
 auerbach-verlag.de, 1
 auf-feindgebiet.de, 1
 aufmerksamkeitsstudie.com, 1
 augen-seite.de, 1
 augenblicke-blog.de, 1
 augiero.it, 1
 augix.net, 1
 augmentable.de, 0
@@ -4071,16 +4144,17 @@ augustiner-kantorei.de, 1
 aukaraoke.su, 1
 aulaschrank.gq, 1
 aulo.in, 0
 aumilieudumonde.gf, 1
 aunali1.com, 1
 auntie-eileens.com.au, 1
 aupasdecourses.com, 1
 auplidespages.fr, 1
+aurelieburn.fr, 1
 aurelienaltarriba.fr, 1
 aureus.pw, 1
 auri.ga, 1
 auricblue.com, 1
 auriko-games.de, 1
 aurora-multimedia.co.uk, 1
 auroraassociationofrealtors.com, 1
 aurorarecordings.com, 1
@@ -4146,16 +4220,17 @@ autod.hu, 1
 autodalmacija.com, 1
 autodidactic.ai, 1
 autodidacticstudios.com, 1
 autodidacticstudios.net, 1
 autodidacticstudios.org, 1
 autoecoledumontblanc.com, 1
 autoentrepreneurinfo.com, 1
 autoepc.ro, 1
+autohaus-snater.de, 1
 autoinsurancehavasu.com, 1
 autokovrik-diskont.ru, 1
 autoledky.sk, 1
 automaan.nl, 1
 automacity.com, 1
 automatethis.com.au, 1
 automatic.com, 1
 automationpro.me, 1
@@ -4183,23 +4258,27 @@ autoskole.hr, 1
 autospurgo.it, 1
 autospurgo.milano.it, 1
 autostock.me, 1
 autostodulky.cz, 1
 autostop-occasions.be, 1
 autotechschool.com, 1
 autoteplo.org, 1
 autoterminus-used.be, 1
+autoto.hr, 1
 autoverzekeringafsluiten.com, 1
 autowerkstatt-puchheim.de, 1
 autozane.com, 1
 autres-talents.fr, 1
+autshir.com, 1
 auux.com, 1
 auvernet.org, 1
 aux-arts-de-la-table.com, 1
+auxiliame.com, 1
+auxille.com, 1
 auxquatrevents.ch, 1
 av-yummy.com, 1
 av01.tv, 1
 av0ndale.de, 1
 av163.cc, 1
 ava-creative.de, 0
 ava-software.at, 1
 avaaz.org, 1
@@ -4262,35 +4341,38 @@ avs-building-services.co.uk, 1
 avso.pw, 1
 avsox.com, 1
 avspot.net, 1
 avticket.ru, 0
 avtoforex.ru, 1
 avtogara-isperih.com, 1
 avtovokzaly.ru, 1
 avv.li, 1
+avvaterra.ch, 1
 avvcorda.com, 1
 avvocato.bologna.it, 1
 avxo.pw, 1
 awan.tech, 1
 awardplatform.com, 1
+awardsplatform.com, 1
 awaremi-tai.com, 1
 awaresec.com, 1
 awaresec.no, 1
 awaro.net, 1
 awbouncycastlehire.com, 1
 awccanadianpharmacy.com, 1
 awecademy.org, 1
 awei.pub, 1
 awen.me, 1
 awesomebouncycastles.co.uk, 1
 awesomesit.es, 1
 awf0.xyz, 1
 awk.tw, 1
 awksolutions.com, 1
+awningcanopyus.com, 1
 awningsaboveus.com, 1
 awningsatlantaga.com, 1
 awomaninherprime.com, 1
 awsmdev.de, 1
 awsome-books.co.uk, 1
 awxg.com, 1
 awxg.eu.org, 1
 awxg.org, 1
@@ -4499,16 +4581,17 @@ b9best.net, 1
 b9king.cc, 1
 b9king.com, 1
 b9king.net, 1
 b9winner.cc, 1
 b9winner.com, 1
 b9winner.net, 1
 baalsworld.de, 1
 baas-becking.biology.utah.edu, 1
+baazee.de, 1
 babacasino.net, 1
 babai.ru, 1
 babarkata.com, 1
 babeleo.com, 1
 babelfisch.eu, 1
 babettelandmesser.de, 1
 babsbibs.com, 1
 babursahvizeofisi.com, 1
@@ -4634,16 +4717,17 @@ balia.de, 1
 balicekzdravi.cz, 1
 balidesignshop.com.br, 1
 balikonos.cz, 1
 balinese.dating, 1
 balist.es, 1
 balivillassanur.com, 1
 baliyano.com, 1
 balkonien.org, 1
+ball-bizarr.de, 1
 ball.holdings, 1
 ball3d.es, 1
 ballarin.cc, 1
 ballbusting-cbt.com, 1
 ballejaune.com, 1
 balletcenterofhouston.com, 1
 ballinarsl.com.au, 1
 ballitolocksmith.com, 1
@@ -4681,19 +4765,21 @@ bandgap.io, 1
 bandiga.it, 1
 bandito.re, 1
 banes.ch, 1
 bangdream.ga, 1
 bangkok-dark-night.com, 1
 bangkok.dating, 1
 bangkokcity.de, 1
 bangorfederal.com, 0
+bangridho.com, 1
 bangumi.co, 1
 banham.co.uk, 1
 banham.com, 1
+banjostringiz.com, 1
 bank, 1
 bank.simple.com, 0
 bankbranchlocator.com, 1
 bankcardoffer.com, 1
 bankcircle.co.in, 1
 bankee.us, 1
 bankerbuch.de, 1
 bankersonline.com, 1
@@ -4725,23 +4811,25 @@ baofengtech.com, 1
 baopublishing.it, 1
 baosuckhoedoisong.net, 1
 baptiste-peugnez.fr, 1
 baptistedeleris.fr, 1
 bar-harcourt.com, 1
 barabrume.fr, 1
 barans2239.com, 1
 baraxolka.ru, 1
+barbarabowersrealty.com, 1
 barbarafabbri.com, 1
 barbarafeldman.com, 1
 barbarians.com, 0
 barbaros.info, 1
 barbate.fr, 1
 barbershop-harmony.org, 1
 barbershop-lasvillas.com, 1
+barbiere.it, 1
 barbosha.ru, 1
 barbu.family, 1
 barburas.com, 1
 barcamp.koeln, 1
 barcel.com.mx, 1
 barclays.net, 1
 barcodeberlin.com, 1
 barcoderealty.com, 1
@@ -4763,16 +4851,17 @@ barnel.com, 1
 barnrats.com, 1
 barpodsosnami.pl, 1
 barprive.com, 1
 barqo.co, 1
 barracuda.blog, 1
 barracuda.com.tr, 1
 barrera.io, 1
 barriofut.com, 1
+barrydenicola.com, 1
 barryswebdesign.co.uk, 1
 bars.kh.ua, 1
 barsashop.com.br, 1
 barsil.de, 1
 barslecht.com, 1
 barslecht.nl, 1
 barss.io, 1
 bart-f.com, 1
@@ -4795,16 +4884,17 @@ baseballsavings.com, 1
 baseballwarehouse.com, 1
 baseconvert.com, 1
 basedonline.nl, 1
 baselang.com, 1
 baseline.ba, 1
 basementdoctor.com, 1
 basementdoctornorthwest.com, 1
 basementfinishingohio.com, 1
+basementwaterproofingdesmoines.com, 1
 basercap.co.ke, 1
 baserverz.ga, 1
 bashc.at, 1
 bashing-battlecats.com, 1
 bashstreetband.co.uk, 1
 basicapparel.de, 1
 basicattentiontoken.org, 1
 basilicaknights.org, 1
@@ -4888,16 +4978,17 @@ bazos.sk, 1
 bazziergraphik.com, 1
 bb37roma.it, 1
 bbalposticino.it, 1
 bbb1991.me, 0
 bbcastles.com, 1
 bbdos.ru, 1
 bbgeschenke.ch, 1
 bbimarketing.com, 1
+bbinsure.com, 1
 bbka.org.uk, 1
 bbkaforum.co.uk, 1
 bbkworldwide.jp, 1
 bbld.de, 1
 bblove.me, 1
 bblsa.ch, 1
 bbnbb.de, 1
 bbnx.net, 1
@@ -4919,16 +5010,17 @@ bcdonadio.com, 1
 bcdonadio.com.br, 1
 bcdonadio.org, 1
 bceventhire.co.uk, 1
 bch7al.ma, 1
 bchep.com, 1
 bck-koethen.de, 1
 bck-lelystad.nl, 1
 bck.me, 1
+bckaccompressoroz.com, 1
 bclogandtimberbuilders.com, 1
 bclrk.us, 1
 bcmainland.ca, 1
 bcmguide.com, 1
 bcmhire.co.uk, 1
 bcmlu.org, 1
 bcnet.com.hk, 1
 bcpc-ccgpfcheminots.com, 1
@@ -4963,34 +5055,38 @@ be9458.info, 1
 be9458.net, 1
 be9458.org, 1
 be958.com, 1
 be958.info, 1
 be958.net, 1
 be958.org, 1
 be9966.com, 1
 beacham.online, 1
+beachcitycastles.com, 1
 beachfutbolclub.com, 1
 beacinsight.com, 1
 beadare.com, 1
 beadare.nl, 1
 beaglesecurity.com, 1
 beagreenbean.co.uk, 1
 bealpha.pl, 1
 beamer-discount.de, 1
 beamitapp.com, 1
 beamstat.com, 1
+beanbagaa.com, 1
 beanbot.party, 1
+beanilla.com, 1
 beanjuice.me, 1
 beans-one.com, 0
 bearcosports.com.br, 1
 bearded.sexy, 1
 beardic.cn, 1
 bearingworks.com, 1
 beasel.biz, 1
+beastiejob.com, 1
 beastowner.li, 1
 beatfeld.de, 1
 beatnikbreaks.com, 1
 beatrizaebischer.ch, 1
 beaute-eternelle.ch, 1
 beauty-hippie-schmuck.de, 1
 beauty-italy.ru, 1
 beauty24.de, 1
@@ -5018,16 +5114,17 @@ bedamedia.com, 1
 bedandbreakfast.dk, 1
 bedandbreakfasteuropa.com, 1
 bedandbreakfasthoekvanholland.com, 1
 bedels.nl, 1
 bedfordnissanparts.com, 1
 bedlingtonterrier.com.br, 1
 bednar.co, 1
 bedouille.com, 1
+bedrijfsfotoreportages.nl, 1
 bedrijfsportaal.nl, 1
 bedrocklinux.org, 1
 bedste10.dk, 1
 bee-creative.nl, 1
 bee-line.org.uk, 1
 bee.clothing, 1
 bee.supply, 1
 bee.tools, 1
@@ -5155,16 +5252,17 @@ benabrams.it, 1
 benary.org, 1
 benbozsa.ca, 1
 benburwell.com, 1
 benc.io, 1
 benceskorka.com, 1
 benchcast.com, 1
 benchling.com, 1
 benchmarkmonument.com, 1
+benchstoolo.com, 1
 bencorby.com, 1
 bendemaree.com, 1
 bendigoland.com.au, 1
 bendingtheending.com, 1
 bendix.co, 1
 bendyworks.com, 1
 beneathvt.com, 1
 benedict-balzer.de, 1
@@ -5239,16 +5337,17 @@ bergfreunde.dk, 1
 bergfreunde.es, 1
 bergfreunde.eu, 1
 bergfreunde.fi, 1
 bergfreunde.it, 1
 bergfreunde.nl, 1
 bergfreunde.no, 1
 bergfreunde.se, 1
 berglust-pur.de, 1
+bergmanbeachproperties.com, 1
 bergstoneware.com, 1
 berichtsheft-vorlage.de, 1
 berikod.ru, 1
 berinhard.pl, 1
 berliancom.com, 1
 berlin-flirt.de, 1
 berlin-kohlefrei.de, 1
 berlin.dating, 1
@@ -5355,16 +5454,17 @@ bestessaycheap.com, 1
 bestessayhelp.com, 1
 bestfitnesswatchreview.info, 1
 bestfriendsequality.org, 1
 bestgiftever.ca, 1
 bestgifts4you.com, 1
 besthotsales.com, 1
 bestiahosting.com, 1
 bestinductioncooktop.us, 1
+bestinshowing.com, 1
 bestinver.es, 1
 bestjumptrampolines.be, 1
 bestkenmoredentists.com, 1
 bestlashesandbrows.com, 1
 bestlashesandbrows.hu, 1
 bestleftwild.com, 1
 bestmotherfucking.website, 1
 bestoffert.club, 1
@@ -5404,16 +5504,17 @@ bethpage.net, 1
 betkoo.com, 1
 betobaccofree.gov, 1
 betonbit.com, 1
 betonmoney.com, 1
 betpamm.com, 1
 betrallyarabia.com, 1
 bets.gg, 1
 betseybuckheit.com, 1
+betsharpangles.com, 1
 betshoot.com, 1
 betsonlinefree.com.au, 1
 betsyshilling.com, 1
 bett1.de, 1
 better-bounce.co.uk, 1
 better.fyi, 1
 betterbabyshop.com.au, 1
 betterconsult.com, 1
@@ -5422,16 +5523,18 @@ betterhelp.com, 1
 betterjapanese.blog, 1
 betterjapanese.com, 1
 betterjapanese.org, 1
 betterjapanese.xyz, 1
 betterna.me, 1
 betterscience.org, 1
 bettertechinterviews.com, 1
 bettertest.it, 1
+bettertime.de, 1
+bettertime.jetzt, 1
 betterweb.fr, 1
 betterworldinternational.org, 1
 bettflaschen.ch, 1
 bettingbusiness.ru, 1
 bettingsider.dk, 1
 bettolinokitchen.com, 1
 bettrlifeapp.com, 1
 betulashop.ch, 1
@@ -5496,18 +5599,20 @@ bgenlisted.com, 1
 bgeo.io, 1
 bgfashion.net, 1
 bgfoto.info, 1
 bghost.xyz, 1
 bgkoleda.bg, 1
 bglsingles.de, 1
 bgp.space, 1
 bgr34.cz, 1
+bgs-game.com, 1
 bgtgames.com, 1
 bgtoyou.com, 1
+bguidinger.com, 1
 bgwfans.com, 1
 bh-oberland.de, 1
 bh.sb, 1
 bharath-g.in, 1
 bhodisoft.com, 1
 bhost.net, 1
 bhtelecom.ba, 1
 bhuntr.com, 1
@@ -5532,16 +5637,17 @@ bibliotekarien.se, 1
 biboumail.fr, 1
 bibuch.com, 1
 bicecontracting.com, 1
 bicha.net, 1
 bichonfrise.com.br, 1
 bichonmaltes.com.br, 1
 bicranial.io, 1
 bicycle-events.com, 1
+bicycleframeiz.com, 1
 biddl.com, 1
 biddle.co, 1
 bidu.com.br, 1
 bie.edu, 0
 biegal.ski, 1
 biegner-technik.de, 1
 biehl.tech, 1
 biehlsoft.info, 1
@@ -5552,39 +5658,43 @@ bienoubien.org, 1
 biensenvue.com, 1
 bienstar.tv, 1
 bierbaumer.net, 1
 biergaizi.info, 1
 bierochs.org, 1
 bieser.ch, 1
 biester.pro, 1
 bieumau.net, 1
+biewen.me, 1
 bifrost.cz, 1
 biftin.net, 1
 big-andy.co.uk, 1
 big-bounce.co.uk, 1
 big-fluglaerm-hamburg.de, 1
 bigbendguide.com, 1
 bigbluedoor.net, 1
 bigbouncebouncycastles.co.uk, 1
 bigbouncetheory.co.uk, 1
 bigbounceuk.com, 1
 bigcakes.dk, 1
 bigclassaction.com, 1
 bigdinosaur.org, 1
 bigerbio.com, 1
 biggreenexchange.com, 1
 bight.ca, 1
+bigideasnetwork.com, 1
 bigio.com.br, 1
 bigjohn.ru, 1
 biglou.com, 0
 bignumworks.com, 1
 bigorbitgallery.org, 1
+bigserp.com, 1
 bigshort.org, 1
 bigsisterchannel.com, 1
+bigskylifestylerealestate.com, 1
 bigskymontanalandforsale.com, 1
 bihub.io, 1
 biilo.com, 1
 bijoux.com.br, 1
 bijouxcherie.com, 1
 bijuteriicualint.ro, 1
 bike-discount.de, 1
 bike-kurse.ch, 1
@@ -5774,16 +5884,17 @@ bitbank.cc, 1
 bitbeans.de, 1
 bitbox.me, 1
 bitbucket.com, 1
 bitbucket.io, 1
 bitbucket.org, 1
 bitburner.de, 1
 bitcalt.eu.org, 1
 bitcalt.ga, 1
+bitchigo.com, 1
 bitcoin-class.com, 1
 bitcoin-daijin.com, 1
 bitcoin-india.net, 1
 bitcoin-india.org, 1
 bitcoin.asia, 1
 bitcoin.ch, 1
 bitcoin.co.nz, 1
 bitcoin.de, 1
@@ -5798,24 +5909,26 @@ bitcoinec.info, 1
 bitcoinindia.com, 1
 bitcoinjpn.com, 1
 bitcoinkarlsruhe.de, 1
 bitcoinrealestate.com.au, 1
 bitcointhefts.com, 1
 bitcoinwalletscript.tk, 1
 bitcoinx.gr, 1
 bitcoinx.ro, 1
+bitcork.io, 1
 bitenose.com, 1
 bitenose.net, 1
 bitenose.org, 1
 bitex.la, 1
 bitfasching.de, 0
 bitfehler.net, 1
 bitfence.io, 1
 bitfinder.nl, 1
+bitfolio.org, 1
 bitfuse.net, 1
 bitgo.com, 1
 bitgrapes.com, 1
 bithap.com, 1
 bithir.co.uk, 1
 bititrain.com, 1
 bitlish.com, 1
 bitlo.com, 1
@@ -5876,27 +5989,29 @@ biznpro.ru, 1
 bizstarter.cz, 1
 biztera.com, 1
 biztok.eu, 1
 biztouch.work, 1
 bizzi.tv, 1
 bjarnerest.de, 1
 bjl5689.com, 1
 bjl5689.net, 1
+bjmgeek.science, 1
 bjmun.cn, 1
 bjornhelmersson.se, 1
 bjornjohansen.no, 1
 bjrn.io, 1
 bjs.gov, 1
 bjsbouncycastles.com, 1
 bjtxl.cn, 1
 bk-wife.com, 1
 bkentertainments.co.uk, 1
 bkhayes.com, 1
 bkhpilates.co.uk, 1
+bkkposn.com, 1
 bklaindia.com, 1
 bkositspartytime.co.uk, 1
 bl00.se, 1
 bl4ckb0x.biz, 1
 bl4ckb0x.com, 1
 bl4ckb0x.de, 1
 bl4ckb0x.eu, 1
 bl4ckb0x.info, 1
@@ -6084,17 +6199,16 @@ bloginbeeld.nl, 1
 bloglines.co.za, 1
 bloglogistics.com, 1
 blogom.at, 1
 blogpentrusuflet.ro, 1
 blogreen.org, 1
 blogsdna.com, 1
 blogthedayaway.com, 1
 blogtroterzy.pl, 1
-blok56.nl, 1
 blokmy.com, 1
 blood4pets.tk, 1
 bloodsports.org, 1
 bloom-avenue.com, 1
 bltc.co.uk, 1
 bltc.com, 1
 bltc.net, 1
 bltc.org, 1
@@ -6115,16 +6229,17 @@ bluecrazii.nl, 1
 blued.moe, 1
 bluedata.ltd, 1
 bluedeck.org, 1
 blueflare.org, 1
 bluefrag.com, 1
 bluefuzz.nl, 1
 bluehelixmusic.com, 1
 blueimp.net, 1
+bluekrypt.com, 1
 blueliquiddesigns.com.au, 1
 bluemeda.web.id, 1
 bluemoonroleplaying.com, 1
 bluemosh.com, 1
 bluemtnrentalmanagement.ca, 1
 bluenote9.com, 1
 blueoakart.com, 1
 bluepearl.tk, 1
@@ -6158,16 +6273,17 @@ blurringexistence.net, 1
 blusens.com, 1
 blusmurf.net, 1
 blyat.science, 1
 blyth.me.uk, 1
 blzrk.com, 1
 bm-i.ch, 1
 bm-immo.ch, 1
 bmhglobal.com.au, 1
+bminton.is-a-geek.net, 1
 bmoattachments.org, 1
 bmone.net, 1
 bmriv.com, 1
 bmros.com.ar, 1
 bmw-motorradclub-seefeld.de, 1
 bmwcolors.com, 1
 bn1digital.co.uk, 1
 bn4t.me, 1
@@ -6175,16 +6291,17 @@ bnb-buddy.nl, 1
 bnboy.cn, 1
 bnbsinflatablehire.co.uk, 1
 bngs.pl, 1
 bngsecure.com, 1
 bnin.org, 1
 bnjscastles.co.uk, 1
 bnstree.com, 1
 bnty.net, 1
+bnzblowermotors.com, 1
 bo1689.com, 1
 bo1689.net, 1
 bo9club.cc, 1
 bo9club.com, 1
 bo9club.net, 1
 bo9fun.com, 1
 bo9fun.net, 1
 bo9game.com, 1
@@ -6223,16 +6340,17 @@ bodrumfarm.com, 1
 bodsch.com, 1
 bodybuilding.events, 1
 bodybuildingworld.com, 1
 bodyconshop.com, 1
 bodygearguide.com, 1
 bodymusclejournal.com, 1
 bodypainter.pl, 1
 bodypainting.waw.pl, 1
+bodyshopnews.net, 1
 bodyweb.com.br, 1
 bodyworkbymichael.com, 1
 bodyworksautorebuild.com, 1
 boeddhashop.nl, 1
 boekenlegger.nl, 1
 boem.gov, 1
 boernecancerfonden.dk, 1
 bogdancornianu.com, 1
@@ -6334,16 +6452,17 @@ booksinthefridge.at, 1
 booktracker-org.appspot.com, 1
 bookwitty.social, 1
 bool.be, 1
 boombv.com, 1
 boomersurf.com, 1
 boomshelf.com, 1
 boomshelf.org, 1
 boonbox.com, 1
+boonehenry.co.uk, 1
 booox.biz, 1
 booox.cc, 1
 booox.info, 1
 booox.net, 1
 booox.org, 1
 booox.pw, 1
 boop.gq, 1
 boop.pro, 1
@@ -6533,16 +6652,17 @@ bournefun.co.uk, 1
 bourqu.in, 1
 bourse-aux-jouets.org, 0
 bourse-aux-vetements.org, 0
 bourse-puericulture.org, 0
 boutiquedecanetas.com.br, 1
 boutiquefutebol.com.br, 1
 boutiqueguenaelleverdin.com, 1
 bouw.live, 1
+bouzouada.com, 1
 bouzouks.net, 1
 bovenwebdesign.nl, 1
 bowdens.me, 1
 bowedwallcrackrepair.com, 1
 boweryandvine.com, 1
 bowlcake.fr, 1
 bowling.com, 1
 bownty.be, 1
@@ -6581,16 +6701,17 @@ bqr.ch, 1
 br.search.yahoo.com, 0
 br3in.nl, 0
 br7.ru, 1
 braams.nl, 1
 bracho.xyz, 1
 brackets-salad.com, 1
 bracoitaliano.com.br, 1
 bradbrockmeyer.com, 1
+bradfergusonrealestate.com, 1
 bradfordhottubhire.co.uk, 1
 bradfordmascots.co.uk, 1
 bradkovach.com, 1
 bradler.net, 1
 bradlinder.org, 1
 bradypatterson.com, 1
 braemer-it-consulting.de, 1
 braeunlich-gmbh.com, 1
@@ -6607,16 +6728,17 @@ brainfork.org, 1
 brainhub.nl, 1
 brainserve.ch, 1
 brainserve.com, 1
 brainserve.swiss, 1
 brainsik.net, 1
 brainster.co, 1
 braintensive.com, 1
 brainvoyagermusic.com, 1
+brainwav.es, 1
 brainwork.space, 1
 brakemanpro.com, 1
 brakpanplumber24-7.co.za, 1
 brakstad.org, 1
 bralnik.com, 1
 brambogaerts.nl, 1
 bramburek.net, 1
 bramhallsamusements.com, 1
@@ -6628,16 +6750,17 @@ bran.land, 1
 bran.soy, 1
 branch-bookkeeper.com, 1
 branchtrack.com, 1
 brandand.co.uk, 1
 brandbil.dk, 1
 brandbuilderwebsites.com, 1
 brandcodeconsulting.com, 1
 brandcodestyle.com, 1
+brandingclic.com, 1
 brando753.xyz, 1
 brandongomez.me, 1
 brandonhubbard.com, 1
 brandonlui.ml, 1
 brandontaylor-black.com, 1
 brandonwalker.me, 1
 brandrocket.dk, 1
 brandstead.com, 1
@@ -6709,18 +6832,18 @@ brendanbatliner.com, 1
 brendanscherer.com, 1
 brenden.net.au, 1
 brentacampbell.com, 1
 brentnewbury.com, 1
 bressier.fr, 1
 bretcarmichael.com, 1
 brettabel.com, 1
 brettelliff.com, 1
+brettlawyer.com, 1
 brettw.xyz, 1
-bretz-hufer.de, 1
 bretzner.fr, 1
 brevboxar.se, 1
 brewsouth.com, 1
 brewtrackr.com, 1
 brfvh24.se, 1
 brgins.com, 1
 brianalaway.com, 1
 brianalawayconsulting.com, 1
@@ -6741,20 +6864,22 @@ brickstreettrio.com, 1
 brickvortex.com, 1
 brickwerks.io, 1
 bricolajeux.ch, 1
 brid.gy, 0
 bridalshoes.com, 1
 brideandgroomdirect.ie, 1
 bridgedirectoutreach.com, 1
 bridgeglobalmarketing.com, 1
+bridgehomeloans.com, 1
 bridgement.com, 1
 bridgeout.com, 1
 bridgevest.com, 1
 bridgingdirectory.com, 1
+bridltaceng.com, 1
 brie.tech, 1
 briefassistant.com, 1
 briefhansa.de, 1
 briefvorlagen-papierformat.de, 1
 briffoud.fr, 1
 briggsleroux.com, 1
 brighouse-leisure.co.uk, 1
 brightday.bz, 1
@@ -6825,16 +6950,17 @@ brossman.it, 1
 brossmanit.com, 1
 brother-printsmart.nl, 1
 brouillard.ch, 1
 brouwerijdeblauweijsbeer.nl, 1
 brovelton.com, 1
 brown-devost.com, 1
 brownfieldstsc.org, 1
 brownihc.com, 1
+browntowncountryclub.com, 1
 browsedns.net, 1
 browsemycity.com, 1
 browserleaks.com, 1
 brring.com, 1
 brrr.fr, 1
 bru6.de, 1
 brucekovner.com, 1
 brucemartin.net, 1
@@ -6927,20 +7053,22 @@ bttorj45.com, 1
 bturboo.com, 1
 bubba.cc, 1
 bubblegumblog.com, 1
 bubblespetspa.com, 1
 bubblin.io, 1
 bubblinghottubs.co.uk, 1
 bubblybouncers.co.uk, 1
 bubhub.io, 1
+bucek.cz, 1
 buch-angucken.de, 1
 buchhandlungkilgus.de, 1
 buchwegweiser.com, 1
 buck.com, 1
+buckelewrealtygroup.com, 1
 buckypaper.com, 1
 budaev-shop.ru, 1
 buddhismus.net, 1
 buddhistische-weisheiten.org, 1
 buddie5.com, 1
 buddlycrafts.com, 1
 buddyworks.net, 1
 budeanu.com, 1
@@ -6973,16 +7101,17 @@ bugcrowd.com, 1
 bugginslab.co.uk, 1
 bugs.chromium.org, 1
 bugsmashed.com, 1
 bugzil.la, 1
 bugzilla.mozilla.org, 1
 build.chromium.org, 1
 buildbox.io, 1
 buildbytes.com, 1
+buildhoscaletraingi.com, 1
 building-cost-estimators.com, 1
 buildingclouds.de, 1
 buildingcostestimators.co.uk, 1
 builditsolutions.net, 1
 buildkite.com, 1
 buildmorebuslanes.com, 1
 buildplease.com, 1
 buildrightbuildingservicesltd.co.uk, 1
@@ -7014,25 +7143,28 @@ bulmastife.com.br, 1
 bulwarkhost.com, 1
 bumarkamoda.com, 1
 bunadarbankinn.is, 1
 bunbun.be, 0
 bund-von-theramore.de, 1
 bundespolizei-forum.de, 1
 bungee.pw, 1
 bungee.systems, 1
+bungeetaco.com, 1
 bunkyo-life.com, 1
 bunny-rabbits.com, 1
+bunnycarenotes.com, 1
 bunnyvishal.com, 1
 bunzy.ca, 1
 bupropion.com, 1
 bupu.ml, 1
 buradangonder.com, 1
 burcevo.info, 1
 burfordbedandbreakfast.co.uk, 1
+burg-hohnstein.com, 1
 burgernet.nl, 1
 burgers.io, 1
 burghardt.pl, 1
 buri.be, 0
 burialinsurancenetwork.com, 1
 buricloud.fr, 1
 burke.services, 1
 burlapsac.ca, 1
@@ -7072,16 +7204,17 @@ businesscentermarin.ch, 1
 businessesdirectory.eu, 1
 businessetmarketing.com, 1
 businessfactors.de, 1
 businessfurs.info, 1
 businesshub.cz, 0
 businessimmigration-eu.com, 1
 businessimmigration-eu.ru, 1
 businessmadeeasypodcast.com, 1
+businessmarketingblog.org, 1
 businessmodeler.se, 1
 businessplanexperts.ca, 1
 businessradar.com.au, 1
 businesswebadmin.com, 1
 busit.be, 1
 busold.ws, 1
 bustabit.com, 1
 bustadice.com, 1
@@ -7117,16 +7250,17 @@ buyhealth.shop, 1
 buyinginvestmentproperty.com, 1
 buyingsellingflorida.com, 1
 buyjewel.shop, 1
 buymindhack.com, 1
 buypapercheap.net, 1
 buyplussize.shop, 1
 buyprofessional.shop, 1
 buyritefairview.com, 1
+buysellinvestproperties.com, 1
 buyseo.store, 1
 buyshoe.org, 1
 buytermpaper.com, 1
 buytheway.co.za, 1
 buywine.shop, 1
 buywood.shop, 1
 buzz.tools, 1
 buzzconf.io, 1
@@ -7146,16 +7280,17 @@ bwf6.com, 1
 bwf66.com, 1
 bwf77.com, 1
 bwf99.com, 1
 bwfc.nl, 1
 bwh1.net, 0
 bwilkinson.co.uk, 1
 bwl-earth.club, 1
 bws16.de, 1
+bwserhoscaletrainaz.com, 1
 bwwb.nu, 1
 bx-n.de, 1
 bxdev.me, 1
 bxp40.at, 1
 by.cx, 1
 by1896.com, 1
 by1898.com, 1
 by1899.com, 1
@@ -7170,21 +7305,23 @@ byji.com, 1
 byken.cn, 1
 bymark.co, 1
 bymike.co, 1
 bynder.com, 1
 bynet.cz, 1
 bynumlaw.net, 1
 bypass.kr, 1
 bypass.sh, 1
+byr.moe, 1
 byrko.cz, 1
 byrko.sk, 1
 byronkg.us, 1
 byrtz.de, 1
 bysb.net, 0
+bytanchan.com, 1
 byte-time.com, 1
 byte128.com, 1
 bytearts.net, 0
 bytebucket.org, 1
 bytecode.no, 1
 bytejail.com, 1
 bytema.cz, 1
 bytema.eu, 1
@@ -7246,30 +7383,34 @@ ca5.de, 1
 caaps.org.au, 1
 caarecord.org, 1
 caasd.org, 1
 cabaladada.org, 1
 cabarave.com, 1
 cabforum.org, 1
 cabineritten.nl, 1
 cabinet-bedin.com, 1
+cabinetfurnituree.com, 1
 cablehighspeed.net, 1
 cablemod.com, 1
 cablesandkits.com, 1
 cabotfinancial.co.uk, 1
 cacao-chocolate.com, 1
 cacao.supply, 1
 cacaolalina.com, 1
 cacaumidade.com.br, 1
 caceis.bank, 1
+cachacacha.com, 1
 cachetagalong.com, 1
 cachethome.com, 1
 cachetur.no, 1
 cackette.com, 1
 cad-noerdlingen.de, 1
+cadacoon.com, 1
+cadafamilia.de, 1
 cadams.io, 1
 cadcreations.co.ke, 1
 cadetsge.ch, 1
 cadmail.nl, 1
 cadman.pw, 1
 cadooz.com, 1
 cadorama.fr, 1
 cadoth.net, 1
@@ -7331,20 +7472,22 @@ calculator.tf, 1
 calcworkshop.com, 1
 caldaro.de, 1
 caldecotevillagehall.co.uk, 1
 caldoletto.com, 1
 caleb.cx, 1
 caleb.host, 1
 calebennett.com, 1
 calebthompson.io, 1
+calehoo.com, 1
 calendar.cf, 1
 calendarr.com, 1
 calendarsnow.com, 1
 calendly.com, 1
+calenfil.com, 1
 caletka.cz, 1
 calgoty.com, 1
 calibreapp.com, 1
 calibso.net, 1
 caliderumba.com, 1
 calidoinvierno.com, 1
 calixte-concept.fr, 1
 call.me, 1
@@ -7436,26 +7579,29 @@ canada-tourisme.ch, 1
 canadabread.com, 0
 canadalife.de, 1
 canadasmotorcycle.ca, 1
 canadian-nurse.com, 1
 canadian.dating, 1
 canadianchristianity.com, 0
 canadianoutdoorequipment.com, 1
 canadiantouristboard.com, 1
+canal-onanismo.org, 1
 canalsidehouse.be, 1
 canalsidehouse.com, 1
 canarymod.net, 1
 cancelmyprofile.com, 1
 cancerdata.nhs.uk, 1
 candaceplayforth.com, 1
 candeo-books.nl, 1
 candex.com, 1
+candguchocolat.com, 1
 candicecity.com, 1
 candidasa.com, 1
+candidaturedunprix.com, 1
 candlcastles.co.uk, 1
 cando.eu, 1
 candylion.rocks, 1
 candyout.com, 1
 canerkorkmaz.com, 1
 cangelloplasticsurgery.com, 1
 cangku.in, 1
 cangku.moe, 0
@@ -7494,31 +7640,34 @@ capacityproject.org, 1
 capekeen.com, 1
 capellidipremoli.com, 1
 caphane.com, 1
 capimlimaoflores.com.br, 1
 capitainebaggy.ch, 1
 capital-match.com, 1
 capitalcap.com, 1
 capitalcollections.org.uk, 1
+capitalfps.com, 1
 capitalibre.com, 1
 capitalism.party, 1
+capitalmediaventures.co.uk, 1
 capitalp.jp, 1
 capitalquadatv.org.nz, 1
 capitolpathways.org, 1
 caplinbouncycastles.co.uk, 1
 capogna.com, 0
 capper.de, 1
 capriccio.to, 1
 caprichosdevicky.com, 1
 caps.is, 1
 capsogusto.com, 1
 capstansecurity.co.uk, 1
 capstansecurity.com, 1
 capstoneinsights.com, 1
+capsulesubs.fr, 1
 captain-dandelion.com, 1
 captainark.net, 1
 captainsinn.com, 1
 captalize.com, 1
 captivationscience.com, 1
 captivationtheory.com, 1
 capturapp.com, 0
 capture-app.com, 1
@@ -7540,16 +7689,17 @@ carauctionsillinois.com, 1
 carbon-designz.com, 1
 carbon-project.org, 1
 carbon12.org, 1
 carbon12.software, 1
 carboneselectricosnettosl.info, 0
 carbonmonoxidelawyer.net, 1
 carbono.uy, 1
 carbontv.com, 1
+carburetorcycleoi.com, 1
 carck.co.uk, 1
 carck.uk, 1
 cardboard.cx, 1
 cardcaptorsakura.jp, 1
 carddreams.be, 1
 carddreams.de, 1
 carddreams.es, 1
 carddreams.nl, 1
@@ -7626,29 +7776,31 @@ carolcestas.com, 1
 caroli.biz, 1
 caroli.com, 1
 caroli.info, 1
 caroli.name, 1
 caroli.net, 1
 carolina.cz, 1
 carolinaclimatecontrolsc.com, 1
 carolynjoyce.com.au, 1
+carpetandhardwoodflooringpros.com, 1
 carpetcleaningtomball.com, 1
 carrando.com, 1
 carrando.de, 1
 carre-lutz.com, 1
 carredejardin.com, 1
 carrentalsathens.com, 1
 carriedin.com, 1
 carrierplatform.com, 1
 carringtonrealtygroup.com, 1
 carroattrezzimilanodaluiso.it, 1
 carrollservicecompany.com, 1
 carrosserie-dubois.com, 1
 carseatchecks.ca, 1
+carson-matthews.co.uk, 1
 carsoug.com, 1
 carspneu.cz, 1
 cartadeviajes.cl, 1
 cartadeviajes.co, 1
 cartadeviajes.com, 1
 cartadeviajes.com.ar, 1
 cartadeviajes.com.ve, 1
 cartadeviajes.de, 1
@@ -7668,71 +7820,79 @@ carthedral.com, 1
 cartierplan.ga, 1
 carto.la, 1
 cartongesso.roma.it, 1
 cartooncastles.ie, 1
 cartoonhd.cc, 1
 cartouche-deal.fr, 1
 cartouche24.eu, 1
 cartucce24.it, 1
+cartwrightrealestate.com, 1
 carun.us, 1
 carusorealestate.com, 1
 caryefurd.com, 1
+casa-app.de, 1
 casa-due-pur.com, 1
 casa-due-pur.de, 1
 casa-due.com, 1
+casa-lunch-break.de, 1
 casa-lunchbreak.de, 1
 casa-mea-inteligenta.ro, 1
 casa-su.casa, 1
 casaanastasia.ro, 1
 casabouquet.com, 1
 casacameo.com, 0
 casacochecurro.com, 1
 casadasportasejanelas.com, 1
 casadoarbitro.com.br, 1
 casadowifi.com.br, 1
 casalindamex.com, 1
+casalunchbreak.de, 1
 casamariposaspi.com, 1
 casapalla.com.br, 1
 casasuara.com, 1
 casasuleletrodomesticos.com.br, 1
 casbia.info, 1
 casbuijs.nl, 1
 casburggraaf.com, 1
 casc.cz, 1
 cascadesjobcorpscca.com, 1
 cascavelle.fr, 1
 cascavelle.nl, 1
 case-vacanza-salento.com, 1
+casecoverkeygi.com, 1
 casecurity.org, 1
 caseplus-daem.de, 1
+caseycapitalpartners.com, 1
 cash-4x4.com, 1
 cashati.com, 1
 cashbook.co.tz, 1
 cashbot.cz, 1
 cashew3d.com, 1
 cashfortulsahouses.com, 1
 cashlink.de, 1
 cashlink.io, 1
 cashlogic.ch, 1
 cashmaxtexas.com, 1
 cashplk.com, 1
 cashsector.ga, 1
 casino-cash-flow.su, 1
 casino-cashflow.ru, 1
+casino-online.info, 1
 casino-trio.com, 1
 casinobonuscodes.online, 1
 casinocashflow.ru, 1
 casinolistings.com, 1
 casinoluck.com, 1
 casinomucho.com, 1
 casinomucho.org, 1
 casinomucho.se, 1
 casinoonlinesicuri.com, 1
 casinoreal.com, 1
+casinovergleich.com, 1
 casio-caisses-enregistreuses.fr, 1
 casjay.cloud, 1
 casjay.info, 1
 casjay.us, 1
 casjaygames.com, 1
 caspar.ai, 1
 casperpanel.com, 1
 caspicards.com, 1
@@ -7756,16 +7916,17 @@ casualdesignsfurniture.com, 1
 casusgrillcaribbean.com, 1
 cat-box.de, 1
 cat.net, 1
 cat73.org, 1
 catalog.beer, 1
 catalogobiblioteca.com, 1
 catalogoreina.com, 1
 catalogosvirtualesonline.com, 1
+catalyconv.com, 1
 catalyst-ecommerce.com, 0
 catalystapp.co, 1
 catbold.space, 1
 catbull.com, 1
 catburton.co.uk, 1
 catchers.cc, 1
 catchersgear.com, 1
 catchfotografie.nl, 1
@@ -7911,28 +8072,32 @@ celebmasta.com, 1
 celebphotos.blog, 1
 celebrityhealthcritic.com, 1
 celebrityscope.net, 1
 celec.gob.ec, 0
 celectro-pro.com, 1
 celiendev.ch, 1
 celine-patisserie.fr, 1
 cellartracker.com, 1
+cellebrite.com, 1
 celltek-server.de, 0
+celltesequ.com, 1
 celluliteorangeskin.com, 1
 celluliteremovaldiet.com, 1
 celtadigital.com, 1
 celti.ie.eu.org, 1
 celti.name, 1
 celuliteonline.com, 1
 cementscience.com, 1
 cemeteriat.com, 1
 ceml.ch, 1
 cenatorium.pl, 1
 cencalvia.org, 1
+cennelley.com, 1
+cennelly.com, 1
 censurfridns.dk, 1
 censurfridns.nu, 1
 censys.io, 1
 centa-am.com, 1
 centaur.de, 1
 centennialradon.com, 1
 centennialseptic.com, 1
 centerpereezd.ru, 0
@@ -8154,29 +8319,31 @@ charlestonfacialplastic.com, 1
 charliedillon.com, 1
 charliegarrod.com, 1
 charliehr.com, 1
 charlierogers.co.uk, 1
 charlierogers.com, 1
 charlotte-touati.ch, 1
 charlotteomnes.com, 1
 charlottesvillegolfcommunities.com, 1
+charlottesvillehorsefarms.com, 1
 charlotteswimmingpoolbuilder.com, 1
 charmander.me, 1
 charmanterelefant.at, 1
 charmingsaul.com, 1
 charmyadesara.com, 1
 charonsecurity.com, 1
 charr.xyz, 1
 chars.ga, 1
 charta-digitale-vernetzung.de, 1
 charteroak.org, 1
 chartkick.com, 1
 chartpen.com, 1
 chartsy.de, 1
+chartwellestate.com, 1
 charuru.moe, 1
 chasafilli.ch, 1
 chascrazycreations.com, 1
 chaseandzoey.de, 1
 chasetrails.co.uk, 1
 chat-libera.org, 1
 chat-senza-registrazione.net, 1
 chat.cz, 1
@@ -8311,24 +8478,27 @@ cherevoiture.com, 1
 cherie-belle.com, 1
 cherrett.digital, 1
 cherry-green.ch, 1
 cherryonit.com, 1
 cherrywoodtech.com, 1
 chertseybouncycastles.co.uk, 1
 cherysunzhang.com, 0
 chesapeakebaychristmas.com, 1
+chess.com, 1
+chessboardao.com, 1
 chesscoders.com, 1
 chesspoint.ch, 1
 chesterlestreetasc.co.uk, 1
 chestnut.cf, 1
 chevy37.com, 1
 chevymotor-occasions.be, 1
 chewey.de, 1
 chewey.org, 1
+chewingucand.com, 1
 chez-janine.de, 1
 chez-oim.org, 1
 chez.moe, 1
 chfr.search.yahoo.com, 0
 chhory.com, 1
 chhy.at, 1
 chiaraiuola.com, 0
 chiaramail.com, 1
@@ -8403,16 +8573,17 @@ chloeallison.co.uk, 1
 chloehorler.com, 1
 chloescastles.co.uk, 1
 chlth.com, 1
 chmielarz.it, 1
 chmsoft.com.ua, 1
 chmsoft.ru, 1
 chmurakotori.ml, 1
 choc-o-lush.co.uk, 1
+chocgu.com, 1
 chocodecor.com.br, 1
 chocolah.com.au, 0
 chocolat-suisse.ch, 1
 chocolate13tilias.com.br, 1
 chocolatesandhealth.com, 1
 chocolatier-tristan.ch, 1
 chocotough.nl, 1
 chocoweb.net, 1
@@ -8451,18 +8622,20 @@ chrisirwin.ca, 1
 chrisjean.com, 1
 chrislane.com, 1
 chrismathys.com, 1
 chrismcclendon.com, 1
 chrismckee.co.uk, 1
 chrismorgan.info, 1
 chrismurrayfilm.com, 1
 chrisnekarda.com, 1
+chrisplankhomes.com, 1
 chrispstreet.com, 1
 chrisshort.net, 0
+chrissx.ga, 1
 christadelphiananswers.org, 1
 christadelphians.eu, 1
 christchurchbouncycastles.co.uk, 1
 christec.net, 1
 christensenplace.us, 1
 christerwaren.fi, 1
 christiaanconover.com, 1
 christian-gredig.de, 1
@@ -8528,48 +8701,54 @@ chronic101.xyz, 1
 chroniclesofgeorge.com, 1
 chronology.no, 1
 chronoshop.cz, 1
 chrpaul.de, 1
 chrstn.eu, 1
 chrysanthos.net, 1
 chs.us, 0
 chsh.moe, 0
+chshouyu.com, 1
 chsterz.de, 1
 chuchote-moi.fr, 1
 chuck.ovh, 1
+chuill.com, 1
 chun.pro, 1
 chunche.net, 1
 chundelac.com, 1
 chunk.science, 1
 chupadelfrasco.com, 1
 chuppa.com.au, 1
 churchlinkpro.com, 1
 churchofsaintrocco.org, 1
+churchofscb.org, 1
 churchthemes.com, 1
 churningtracker.com, 1
 chxdf.net, 1
 chyen.cc, 1
 chytraauta.cz, 1
 chziyue.com, 1
 ci-fo.org, 1
 ci-suite.com, 1
 ci5.me, 1
 ciancode.com, 1
+ciania.pl, 1
 cianmawhinney.me, 1
 cianmawhinney.xyz, 1
 ciansc.com, 1
+ciaracode.com, 1
 ciat.no, 0
 cidbot.com, 1
 ciderclub.com, 1
 cidersus.com.ec, 1
 cie-theatre-montfaucon.ch, 1
 cielbleu.org, 1
 cielly.com, 1
 cifop-numerique.fr, 1
+ciftlikesintisi.com, 1
 cig-dem.com, 1
 cigar-cartel.com, 1
 cigarterminal.com, 0
 cigoteket.se, 1
 ciiex.co, 1
 cilloc.be, 1
 cima-idf.fr, 1
 cimballa.com, 1
@@ -8693,16 +8872,17 @@ ckennely.com, 1
 ckleemann.de, 1
 cklie.de, 1
 ckliemann.com, 1
 ckliemann.net, 1
 ckostecki.de, 1
 ckp.io, 1
 cktennis.com, 1
 cl.search.yahoo.com, 0
+cl0ud.space, 1
 clacetandil.com.ar, 1
 clad.cf, 1
 claibornecountytn.gov, 1
 claimconnect.com, 1
 claimconnect.us, 1
 claimjeidee.be, 1
 claimnote.com, 1
 clairegold.com, 1
@@ -8733,26 +8913,28 @@ classyvaper.de, 1
 claude-leveille.com, 1
 claude.tech, 1
 claudia-urio.com, 1
 claus-bahr.de, 1
 clauseriksen.net, 1
 clawe.de, 1
 clawhammer.dk, 1
 clayandcottonkirkwood.com, 1
+clayprints.com, 1
 claytoncondon.com, 1
 claytonstowing.com.au, 1
 clazzrooms.com, 1
 cldfile.com, 1
 cldly.com, 1
 cleanapproachnw.com, 1
 cleanbrowsing.org, 1
 cleancode.club, 1
 cleandetroit.org, 1
 cleandogsnederland.nl, 1
+cleanfiles.us, 1
 cleanhouse2000.us, 1
 cleaningbyrosie.com, 1
 cleaningservicejulai.com, 1
 cleansewellness.com, 1
 cleanstar.org, 1
 clear.ml, 1
 clearance365.co.uk, 1
 clearblueday.co.uk, 1
@@ -8776,16 +8958,17 @@ clevertarget.ru, 1
 clevisto.com, 1
 cleysense.com, 1
 clic-et-site.com, 1
 clic-music.com, 1
 clicandfioul.com, 1
 clicecompre.com.br, 1
 clicheshishalounge.co.uk, 1
 click-licht.de, 1
+click4web.com, 1
 clickclock.cc, 1
 clickenergy.com.au, 1
 clickphish.com, 1
 clicksaveandprint.com, 1
 clien.net, 1
 client.coach, 1
 clientboss.com, 1
 clientsecure.me, 1
@@ -8804,16 +8987,17 @@ clinicminds.com, 1
 cliniquecomplementaire.com, 1
 cliniquevethuy.be, 1
 clintonbloodworth.com, 1
 clintonlibrary.gov, 1
 clintonplasticsurgery.com, 1
 clip.mx, 0
 clip.ovh, 0
 clipclip.com, 1
+clippings.com, 1
 clive.io, 1
 clmde.de, 1
 clnc.to, 1
 clnnet.ch, 1
 cloaked.ch, 1
 clochix.net, 1
 clockcaster.com, 1
 clockworksms.com, 1
@@ -8841,16 +9025,17 @@ cloud9bouncycastlehire.com, 1
 cloudapps.digital, 1
 cloudberlin.goip.de, 1
 cloudbleed.info, 1
 cloudbolin.es, 1
 cloudbreaker.de, 1
 cloudbrothers.info, 1
 cloudcactuar.com, 0
 cloudcaprice.net, 1
+cloudchart.site, 1
 cloudcite.net, 1
 cloudcloudcloud.cloud, 1
 cloudconsulting.net.za, 1
 cloudconsulting.org.za, 1
 cloudconsulting.web.za, 1
 cloudcrux.net, 1
 cloudey.net, 1
 cloudfiles.at, 1
@@ -8904,16 +9089,17 @@ club-premiere.com, 1
 club-reduc.com, 1
 club-slow.jp, 1
 club-yy.com, 1
 club103.ch, 1
 clubcorsavenezuela.com, 1
 clubdelzapato.com, 1
 clubdeslecteurs.net, 1
 clubedalutashop.com, 1
+clubefiel.com.br, 1
 clubempleos.com, 1
 clubeohara.com, 1
 clubfamily.de, 1
 clubgalaxy.futbol, 1
 clubiconkenosha.com, 1
 clubmate.rocks, 1
 clubmini.jp, 1
 clubnoetig-ink2g.de, 1
@@ -8938,16 +9124,17 @@ cmadeangelis.it, 1
 cmahy.be, 1
 cmcc.network, 1
 cmcressy.ch, 1
 cmdline.org, 1
 cme-colleg.de, 1
 cmf.qc.ca, 1
 cmfaccounting.com, 1
 cmftech.com, 1
+cmgacheatcontrol.com, 1
 cmitao.com, 1
 cmlachapelle.ch, 1
 cmlancy.ch, 1
 cmlignon.ch, 1
 cmn-group.com, 1
 cmn-groupe.com, 1
 cmngroup.com, 1
 cmngroupe.com, 1
@@ -9038,16 +9225,17 @@ code-well.com, 1
 code.facebook.com, 0
 code.fm, 1
 code.google.com, 1
 code.taxi, 1
 code67.com, 1
 codeandpeace.com, 1
 codebrahma.com, 0
 codecommunity.io, 1
+codedelarouteenligne.fr, 1
 codedump.net, 1
 codeeclipse.com, 1
 codeferm.com, 1
 codefordus.de, 1
 codefordus.nrw, 1
 codefoundry.it, 0
 codein.ca, 1
 codeine.co.uk, 1
@@ -9069,16 +9257,17 @@ codepref.com, 1
 codepult.com, 1
 codera.co.uk, 1
 codercross.com, 1
 codercy.com, 1
 codereview.appspot.com, 1
 codereview.chromium.org, 1
 coderhangout.com, 1
 coderme.com, 1
+coderware.co.uk, 1
 codes.pk, 1
 codesplain.in, 1
 codesport.io, 1
 codespromo.be, 1
 codestep.io, 1
 codestudies.net, 1
 codesyncro.com, 1
 codetheworld.com, 1
@@ -9105,17 +9294,19 @@ codingforspeed.com, 1
 codingfromhell.net, 1
 codinginfinity.me, 1
 codingrobots.com, 1
 codxg.org, 1
 codyevanscomputer.com, 1
 codymoniz.com, 1
 codyqx4.com, 1
 codyscafesb.com, 1
+coens.me.uk, 1
 coentropic.com, 1
+cofbev.com, 1
 coffee-mamenoki.jp, 1
 coffeeandteabrothers.com, 1
 coffeetime.fun, 1
 coffeetocode.me, 1
 cogala.eu, 1
 cogent.cc, 1
 cogilog.com, 1
 cogitoltd.com, 1
@@ -9135,16 +9326,17 @@ coinapult.com, 1
 coinbase.com, 1
 coinbit.trade, 1
 coincealed.com, 1
 coinchat.im, 1
 coincoele.com.br, 1
 coincoin.eu.org, 1
 coincolors.co, 1
 coindatabase.net, 1
+coindeal.com, 1
 coinessa.com, 1
 coinf.it, 1
 coinflux.com, 1
 coingate.com, 1
 coinjar-sandbox.com, 1
 coinlist.co, 0
 coinloan.io, 1
 coinmewallet.com, 1
@@ -9161,16 +9353,17 @@ colaborativa.tv, 1
 colapsys.net, 1
 colarelli.ch, 1
 colasjourdain.fr, 1
 coldaddy.com, 1
 coldawn.com, 0
 coldfff.com, 0
 coldhak.ca, 1
 coldstreamcreekfarm.com, 1
+colectivointerconductual.com, 1
 colegiocierp.com.br, 1
 colemak.com, 1
 colengo.com, 1
 colf.online, 1
 colibris.xyz, 1
 colincampbell.me, 1
 colinchartier.com, 1
 colincogle.name, 1
@@ -9198,16 +9391,17 @@ collectiblebeans.com, 1
 collectivesupply.com, 1
 collectorknives.net, 1
 collectorsystems.com, 1
 colleencornez.com, 1
 collegeconnexxions.com.au, 1
 collegenavigator.gov, 1
 collegepaperworld.com, 1
 collegeprospectsofcentralindiana.com, 1
+collegestationhomes.com, 1
 collinel-hossari.com, 1
 collinelhossari.com, 1
 collinklippel.com, 1
 collinmbarrett.com, 1
 collins.kg, 1
 colo-tech.com, 1
 colombian.dating, 1
 coloppe.com, 1
@@ -9222,16 +9416,17 @@ colorhexa.com, 1
 coloringnotebook.com, 1
 coloristcafe.com, 1
 colorsbycarin.com, 1
 colossal-events.co.uk, 1
 colotimes.com, 1
 colourfulcastles.co.uk, 1
 colpacpackaging.com, 1
 colson-occasions.be, 1
+coltellisurvival.com, 1
 coltonrb.com, 1
 columbuswines.com, 1
 colyakootees.com, 1
 com-in.de, 1
 com-news.io, 1
 com.cc, 1
 comalia.com, 1
 comandofilmes.club, 1
@@ -9271,22 +9466,24 @@ comidasperuanas.net, 1
 comiq.io, 1
 comiteaintriathlon.fr, 1
 comm.cx, 1
 commania.co.kr, 1
 commco.nl, 1
 commechezvous.ch, 1
 commerce.gov, 1
 commercial-academy.fr, 1
+commeunamour.com, 1
 commissionagenda.com, 1
 commitsandrebases.com, 1
 common.io, 1
 commoncode.com.au, 1
 commoncode.io, 1
 commoncore4kids.com, 1
+commonspace.la, 1
 communityblog.fedoraproject.org, 1
 communitycodeofconduct.com, 1
 communityflow.info, 1
 communitymanagertorrejon.com, 1
 communote.net, 1
 como-se-escribe.com, 1
 comocurarlagastritis24.online, 1
 comocurarlagastritistratamientonatural.com, 1
@@ -9350,25 +9547,27 @@ comprefitasadere.com.br, 1
 comprehensiveihc.com, 1
 compromised.com, 1
 compservice.in.ua, 1
 comptrollerofthecurrency.gov, 1
 comptu.com, 1
 compubench.com, 1
 compucastell.ch, 1
 compucorner.mx, 1
+compunetwor.com, 1
 compuplast.cz, 1
 compusolve.nl, 1
 computehealth.com, 1
 computer-acquisti.com, 1
 computer-science-schools.com, 1
 computeracademy.co.za, 1
 computerassistance.co.uk, 1
 computerbas.nl, 1
 computerbase.de, 1
+computercamaccgi.com, 1
 computercraft.net, 1
 computeremergency.com.au, 0
 computerhilfe-feucht.de, 1
 computernetwerkwestland.nl, 1
 computerslotopschool.nl, 1
 computersystems.guru, 0
 comunidadmontepinar.es, 1
 comvos.de, 1
@@ -9409,17 +9608,16 @@ conejovalleyexteriorlighting.com, 1
 conejovalleylandscapelighting.com, 1
 conejovalleylighting.com, 1
 conejovalleyoutdoorlighting.com, 1
 conexiontransporte.com, 1
 confiancefoundation.org, 1
 confidential.network, 1
 config.schokokeks.org, 0
 confiwall.de, 1
-conflux.tw, 1
 conformax.com.br, 1
 conformist.jp, 1
 confucio.cl, 1
 congineer.com, 1
 congobunkering.com, 1
 conju.cat, 1
 conjugacao.com.br, 1
 conkret.ch, 1
@@ -9457,32 +9655,34 @@ conrad-kostecki.de, 1
 conrad.am, 1
 conradkostecki.de, 1
 conradsautotransmissionrepair.com, 1
 conrail.blue, 1
 consagracionamariasantisima.org, 1
 consciousbrand.co, 1
 consciouschoices.net, 1
 consec-systems.de, 1
+consegnafioridomicilio.net, 1
 consejosdenutricion.com, 1
 consensoprivacy.it, 1
 conservados.com.br, 1
 conservatoriesincornwall.com, 1
 consideredgifts.com, 1
 consilium-vitae.ch, 1
 consiliumvitae.ch, 1
 consill.com, 1
 console.ninja, 1
 console.rest, 1
 consommateuraverti.com, 1
 consonare.de, 1
 conspiracyservers.com, 1
 constancechen.me, 1
 constant-rough.de, 1
 constares.de, 1
+constitution.website, 1
 constructexpres.ro, 1
 constructieve.nl, 1
 construction-colleges.com, 1
 construction-student.co.uk, 1
 constructionjobs.com, 1
 constructive.men, 1
 consul.io, 1
 consulenza.pro, 1
@@ -9551,32 +9751,35 @@ cookingcrusade.com, 1
 cookinglife.nl, 0
 cookingreporter.com, 1
 cookmedical.com, 0
 cooko.at, 1
 cooksbookscorks.com, 1
 cookwithmanali.com, 1
 cool-parties.co.uk, 1
 cool-wallpapers.jp, 1
+cool.haus, 1
 cool110.tk, 1
 cool110.xyz, 1
 coolattractions.co.uk, 1
 coolbitx.com, 1
 coolcamping.com, 1
 cooldan.com, 1
 coole-fete.de, 1
 coolerssr.space, 1
 coolgifs.de, 1
 cooljs.me, 1
 coolprylar.se, 1
 coolviewthermostat.com, 1
 coolvox.com, 1
 coolwallet.io, 1
 coonawarrawines.com.au, 1
 coopens.com, 1
+cooperativehandmade.com, 1
+cooperativehandmade.pe, 1
 coor.fun, 1
 coore.jp, 1
 coorpacademy.com, 1
 copdfoundation.org, 1
 copinstant.com, 1
 copperandtileroofing.com, 1
 copperhead.co, 1
 copperheados.com, 1
@@ -9584,16 +9787,17 @@ coppermein.co.za, 1
 copplaw.com, 1
 coptkm.cz, 1
 copycaught.co, 1
 copycaught.com, 1
 copycaught.net, 1
 copycaught.org, 1
 copycaught.xyz, 1
 copycrafter.net, 1
+copydz.com, 1
 copypoison.com, 1
 copyright-watch.org, 1
 coquibus.net, 1
 corbi.net.au, 1
 cordejong.nl, 1
 cordep.biz, 1
 corder.tech, 1
 cordeydesign.ch, 1
@@ -9645,16 +9849,17 @@ corporateclash.net, 1
 corporatecomputingsolutions.com, 1
 corporateinfluencers.com, 1
 corporativoarval.info, 1
 corpsepaint.life, 1
 corpulant.coffee, 1
 corpulantcoffee.com, 1
 corpulent.coffee, 1
 corpulentcoffee.com, 1
+corpuschristisouthriver.org, 1
 corpusslayer.com, 1
 corrbee.com, 1
 correctiv.org, 1
 correiodovale.com.br, 1
 corrick.io, 1
 corrupted.io, 1
 corsa-b.uk, 1
 corsectra.com, 1
@@ -9687,34 +9892,39 @@ cosmundi.de, 1
 cosni.co, 1
 cosplayer.com, 1
 cospol.ch, 1
 costa-rica-reisen.ch, 1
 costa-rica-reisen.de, 1
 costablanca.villas, 1
 costablancavoorjou.com, 1
 costcofinance.com, 1
+costcoinsider.com, 1
 costellofc.co.uk, 1
 costinstefan.eu, 1
 costreportdata.com, 0
 costulessdirect.com, 1
 coteries.com, 1
+cotoacc.com, 1
 cotonmusic.ch, 1
 cotta.dk, 1
 cotwe-ge.ch, 1
 cougar.dating, 1
 coumoul.fr, 1
 counselling.network, 1
+counsellingtime.co.uk, 1
+counsellingtime.com, 1
 counstellor.com, 1
 counter-team.ch, 1
 counterglobal.com, 1
 counterhack.nl, 1
 countermail.com, 0
 countermats.net, 1
 countersolutions.co.uk, 1
+countetime.com, 1
 countingto.one, 1
 countryattire.com, 1
 countrybrewer.com.au, 1
 countryfrog.uk, 1
 countryhouseresort.com, 1
 countybankdel.com, 1
 countyjailinmatesearch.com, 1
 coup-dun-soir.ch, 1
@@ -9739,45 +9949,52 @@ covermytrip.com.au, 1
 covershousing.nl, 1
 covery.ai, 1
 covoiturage.fr, 0
 covve.com, 1
 covybrat.cz, 1
 cowbird.org, 1
 cowboyim.com, 1
 coweo.cz, 1
+cowo.group, 1
+coxcapitalmanagement.com, 1
 coxxs.me, 1
 coxxs.moe, 1
 cozmaadrian.ro, 1
 cozo.me, 1
 cozyeggdesigns.com, 1
 cp-st-martin.be, 1
 cpahunt.com, 0
 cpaneltips.com, 1
+cpasperdu.com, 1
 cpbanq.com, 1
 cpbapremiocaduceo.com.ar, 1
 cpcheats.co, 1
 cpd-education.co.uk, 1
 cpe-colleg.de, 1
 cphpvb.net, 1
 cplala.com, 1
 cplus.me, 1
 cplusplus.se, 1
 cppan.org, 1
 cppressinc.com, 1
 cpqcol.gov.co, 1
 cprheartcenter.com, 1
 cprnearme.com, 1
+cpsc.gov, 1
 cptoon.com, 1
 cpu.biz.tr, 1
 cpvmatch.eu, 1
 cpy.pt, 1
 cqn.ch, 1
 cr.search.yahoo.com, 0
 cr0nus.net, 1
+cr9499.com, 1
+cra-bank.com, 1
+cra-search.net, 1
 craazzyman21.at, 1
 crackcat.de, 1
 cracker.in.th, 1
 crackle.io, 1
 crackorsquad.in, 1
 crackpfer.de, 1
 crackslut.eu, 1
 crackstation.net, 1
@@ -9795,41 +10012,47 @@ craftsmany.net, 1
 craftwmcp.xyz, 1
 craftydev.design, 1
 craftyguy.net, 1
 craftyphotons.net, 1
 crag.com.tw, 1
 craigary.net, 1
 craigbates.co.uk, 1
 craigfrancis.co.uk, 1
+craigleclaireteam.com, 1
 craigrouse.com, 1
 craigwfox.com, 1
 cralarm.de, 1
 crandall.io, 1
 cranems.com.ua, 1
 cranforddental.com, 1
+cranshafengin.com, 1
 crapouill.es, 1
+cratss.co.uk, 1
 crawcial.de, 1
 crawford.cloud, 1
 crawfordcountytcc.org, 1
 crawler.ninja, 1
 crawleybouncycastles.co.uk, 1
 crawlspaceandbasementsolutions.com, 1
+crazy-bulks.com, 1
 crazy-cat.net, 1
 crazy-coders.com, 1
 crazycastles.ie, 1
 crazydomains.ae, 1
 crazydomains.co.nz, 1
 crazydomains.co.uk, 1
 crazydomains.com.au, 1
 crazydomains.in, 1
 crazymeeshu.com, 1
 crazynoisybizarre.town, 1
 crazypaul.com, 1
 crbug.com, 1
+crc-bank.com, 1
+crc-search.com, 1
 crdmendoza.net, 1
 crea-etc.net, 1
 crea-shops.ch, 1
 crea.bg, 1
 crea.me, 1
 creadstudy.com, 1
 crealogix-online.com, 1
 creamcastles.co.uk, 1
@@ -9913,16 +10136,17 @@ crinesdanzantes.be, 1
 crip-usk.ba, 1
 criptolog.com, 1
 crisisactual.com, 1
 crisisnextdoor.gov, 1
 crisp.chat, 1
 crisp.email, 1
 crisp.help, 1
 crisp.im, 1
+crisp.watch, 1
 crispinusphotography.com, 1
 cristarta.com, 1
 cristau.org, 1
 cristiandeluxe.com, 0
 cristianhares.com, 1
 critcola.com, 1
 critical.today, 0
 criticalaim.com, 1
@@ -9963,17 +10187,16 @@ crossoverit.com, 1
 crosssellguide.com, 1
 crow.tw, 1
 crowd.supply, 1
 crowdbox.net, 1
 crowdcloud.be, 1
 crowdliminal.com, 1
 crowdsim3d.com, 1
 crowdsupply.com, 1
-crowdwis.com, 1
 crowncastles.co.uk, 1
 crownchessclub.com, 1
 crownmarqueehire.co.uk, 1
 crownpoint.com, 1
 crows.io, 1
 crox.co, 1
 croydonapartments.com.au, 1
 croydonbouncycastles.co.uk, 1
@@ -10036,16 +10259,17 @@ cryptoshot.pw, 1
 cryptoya.io, 1
 cryptract.co, 1
 crys.cloud, 1
 crys.hu, 1
 crystalapp.ca, 1
 crystalchandelierservices.com, 1
 crystalgrid.net, 1
 crystallizedcouture.com, 1
+crystaloscillat.com, 1
 crystone.me, 1
 cryz.ru, 1
 cs-colorscreed-betongulve.dk, 1
 cs2016.ch, 1
 csabg.org, 1
 csbgtribalta.com, 1
 csbs.fr, 1
 csbuilder.io, 1
@@ -10092,31 +10316,33 @@ cswarzone.com, 1
 ct.search.yahoo.com, 0
 ctc-transportation.com, 1
 ctcom-peru.com, 1
 ctcue.com, 1
 ctf.link, 1
 cthomas.work, 1
 cthulhuden.com, 1
 ctj.im, 1
+ctkwwri.org, 1
 ctl.email, 1
 ctliu.com, 1
 ctnguyen.de, 1
 ctnguyen.net, 1
 ctns.de, 1
 ctoforhire.com.au, 1
 ctomp.io, 1
 ctoresms.com, 1
 ctpe.net, 1
 ctrld.me, 1
 cu247secure.ie, 1
 cub-bouncingcastles.co.uk, 1
 cube-cloud.com, 1
 cube.de, 1
 cubebot.io, 1