diff --git a/AUTHORS b/AUTHORS
index 5265a6c..dc45a9a 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -290,6 +290,7 @@
 Jack Bates <jack@nottheoilrig.com>
 Jacob Mandelson <jacob@mandelson.org>
 Jaehun Lim <ljaehun.lim@samsung.com>
+Jaehyun Lee <j-hyun.lee@samsung.com>
 Jaekyeom Kim <btapiz@gmail.com>
 Jaemin Seo <jaemin86.seo@samsung.com>
 Jaeseok Yoon <yjaeseok@gmail.com>
diff --git a/DEPS b/DEPS
index 14d02c933..8c16f4797 100644
--- a/DEPS
+++ b/DEPS
@@ -40,7 +40,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '671e442fccaacf57b6922324e8160173a2919608',
+  'skia_revision': 'edbeb8b842aa86d18388f75a1dbf1e470a565680',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -64,7 +64,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'ce32acfa15071e6cd5bcce73280857014e396dd2',
+  'pdfium_revision': 'a99de0ec3cda8ff5b0d6383a059dd39c8626e504',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -96,7 +96,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '0545e35027803e19c550bad013d86b2d42f02114',
+  'catapult_revision': '4f3d6da8af75d0aa3b0aa535319c13393269512f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
diff --git a/ash/public/interfaces/BUILD.gn b/ash/public/interfaces/BUILD.gn
index b0128049..b84f896b 100644
--- a/ash/public/interfaces/BUILD.gn
+++ b/ash/public/interfaces/BUILD.gn
@@ -7,7 +7,6 @@
 mojom("interfaces") {
   sources = [
     "accelerator_controller.mojom",
-    "ash_window_type.mojom",
     "cast_config.mojom",
     "constants.mojom",
     "locale.mojom",
diff --git a/ash/public/interfaces/ash_window_type.mojom b/ash/public/interfaces/ash_window_type.mojom
deleted file mode 100644
index 61f2c4d..0000000
--- a/ash/public/interfaces/ash_window_type.mojom
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module ash.mojom;
-
-enum AshWindowType {
-  SHELF = 0,
-  STATUS_AREA,
-  COUNT
-};
-
-const string kAshWindowType_Property = "ash:window-type";
diff --git a/base/logging.h b/base/logging.h
index c969f3d..c67b937 100644
--- a/base/logging.h
+++ b/base/logging.h
@@ -289,45 +289,6 @@
 BASE_EXPORT void SetLogMessageHandler(LogMessageHandlerFunction handler);
 BASE_EXPORT LogMessageHandlerFunction GetLogMessageHandler();
 
-// ANALYZER_ASSUME_TRUE(...) generates compiler-specific annotations which
-// prevent the static analyzer from analyzing the code using hypothetical
-// values that are asserted to be impossible.
-// The value of the condition passed to ANALYZER_ASSUME_TRUE() is returned
-// directly.
-#if defined(__clang_analyzer__)
-
-inline void AnalyzerNoReturn() __attribute__((analyzer_noreturn)) {}
-
-// |arg| is a universal reference for compatibility with lvalue and rvalue
-// arguments.
-template <typename TVal>
-inline constexpr TVal&& AnalysisAssumeTrue(TVal&& arg) {
-  if (!arg) {
-    AnalyzerNoReturn();
-  }
-  return std::forward<TVal>(arg);
-}
-
-#define ANALYZER_ASSUME_TRUE(val) ::logging::AnalysisAssumeTrue(val)
-
-#elif defined(_PREFAST_) && defined(OS_WIN)
-
-// |arg| is a universal reference for compatibility with lvalue and rvalue
-// arguments.
-template <typename TVal>
-inline constexpr TVal&& AnalysisAssumeTrue(TVal&& arg) {
-  __analysis_assume(!!arg);
-  return std::forward<TVal>(arg);
-}
-
-#define ANALYZER_ASSUME_TRUE(val) ::logging::AnalysisAssumeTrue(val)
-
-#else  // !_PREFAST_ & !__clang_analyzer__
-
-#define ANALYZER_ASSUME_TRUE(val) (val)
-
-#endif  // !_PREFAST_ & !__clang_analyzer__
-
 typedef int LogSeverity;
 const LogSeverity LOG_VERBOSE = -1;  // This is level 1 verbosity
 // Note: the log severities are used to index into the array of names,
@@ -447,9 +408,8 @@
 
 // TODO(akalin): Add more VLOG variants, e.g. VPLOG.
 
-#define LOG_ASSERT(condition)                     \
-  LOG_IF(FATAL, !ANALYZER_ASSUME_TRUE(condition)) \
-      << "Assert failed: " #condition ". "
+#define LOG_ASSERT(condition) \
+  LOG_IF(FATAL, !(condition)) << "Assert failed: " #condition ". "
 
 #if defined(OS_WIN)
 #define PLOG_STREAM(severity) \
@@ -602,15 +562,37 @@
 
 #else  // !(OFFICIAL_BUILD && NDEBUG)
 
+#if defined(_PREFAST_) && defined(OS_WIN)
+// Use __analysis_assume to tell the VC++ static analysis engine that
+// assert conditions are true, to suppress warnings.  The LAZY_STREAM
+// parameter doesn't reference 'condition' in /analyze builds because
+// this evaluation confuses /analyze. The !! before condition is because
+// __analysis_assume gets confused on some conditions:
+// http://randomascii.wordpress.com/2011/09/13/analyze-for-visual-studio-the-ugly-part-5/
+
+#define CHECK(condition)                    \
+  __analysis_assume(!!(condition)),         \
+      LAZY_STREAM(LOG_STREAM(FATAL), false) \
+          << "Check failed: " #condition ". "
+
+#define PCHECK(condition)                    \
+  __analysis_assume(!!(condition)),          \
+      LAZY_STREAM(PLOG_STREAM(FATAL), false) \
+          << "Check failed: " #condition ". "
+
+#else  // _PREFAST_
+
 // Do as much work as possible out of line to reduce inline code size.
 #define CHECK(condition)                                                      \
   LAZY_STREAM(::logging::LogMessage(__FILE__, __LINE__, #condition).stream(), \
-              !ANALYZER_ASSUME_TRUE(condition))
+              !(condition))
 
-#define PCHECK(condition)                                           \
-  LAZY_STREAM(PLOG_STREAM(FATAL), !ANALYZER_ASSUME_TRUE(condition)) \
+#define PCHECK(condition)                       \
+  LAZY_STREAM(PLOG_STREAM(FATAL), !(condition)) \
       << "Check failed: " #condition ". "
 
+#endif  // _PREFAST_
+
 // Helper macro for binary operators.
 // Don't use this macro directly in your code, use CHECK_EQ et al below.
 // The 'switch' is used to prevent the 'else' from being ambiguous when the
@@ -707,13 +689,13 @@
   template <class t1, class t2>                                              \
   inline std::string* Check##name##Impl(const t1& v1, const t2& v2,          \
                                         const char* names) {                 \
-    if (ANALYZER_ASSUME_TRUE(v1 op v2))                                      \
+    if (v1 op v2)                                                            \
       return NULL;                                                           \
     else                                                                     \
       return ::logging::MakeCheckOpString(v1, v2, names);                    \
   }                                                                          \
   inline std::string* Check##name##Impl(int v1, int v2, const char* names) { \
-    if (ANALYZER_ASSUME_TRUE(v1 op v2))                                      \
+    if (v1 op v2)                                                            \
       return NULL;                                                           \
     else                                                                     \
       return ::logging::MakeCheckOpString(v1, v2, names);                    \
@@ -810,24 +792,58 @@
 // DCHECK_IS_ON() is true. When DCHECK_IS_ON() is false, the macros use
 // EAT_STREAM_PARAMETERS to avoid expressions that would create temporaries.
 
+#if defined(_PREFAST_) && defined(OS_WIN)
+// See comments on the previous use of __analysis_assume.
+
+#define DCHECK(condition)                    \
+  __analysis_assume(!!(condition)),          \
+      LAZY_STREAM(LOG_STREAM(DCHECK), false) \
+          << "Check failed: " #condition ". "
+
+#define DPCHECK(condition)                    \
+  __analysis_assume(!!(condition)),           \
+      LAZY_STREAM(PLOG_STREAM(DCHECK), false) \
+          << "Check failed: " #condition ". "
+
+#elif defined(__clang_analyzer__)
+
+// Keeps the static analyzer from proceeding along the current codepath,
+// otherwise false positive errors may be generated  by null pointer checks.
+inline constexpr bool AnalyzerNoReturn() __attribute__((analyzer_noreturn)) {
+  return false;
+}
+
+#define DCHECK(condition)                                                     \
+  LAZY_STREAM(                                                                \
+      LOG_STREAM(DCHECK),                                                     \
+      DCHECK_IS_ON() ? (logging::AnalyzerNoReturn() || !(condition)) : false) \
+      << "Check failed: " #condition ". "
+
+#define DPCHECK(condition)                                                    \
+  LAZY_STREAM(                                                                \
+      PLOG_STREAM(DCHECK),                                                    \
+      DCHECK_IS_ON() ? (logging::AnalyzerNoReturn() || !(condition)) : false) \
+      << "Check failed: " #condition ". "
+
+#else
+
 #if DCHECK_IS_ON()
 
-#define DCHECK(condition)                                           \
-  LAZY_STREAM(LOG_STREAM(DCHECK), !ANALYZER_ASSUME_TRUE(condition)) \
+#define DCHECK(condition)                       \
+  LAZY_STREAM(LOG_STREAM(DCHECK), !(condition)) \
       << "Check failed: " #condition ". "
-#define DPCHECK(condition)                                           \
-  LAZY_STREAM(PLOG_STREAM(DCHECK), !ANALYZER_ASSUME_TRUE(condition)) \
+#define DPCHECK(condition)                       \
+  LAZY_STREAM(PLOG_STREAM(DCHECK), !(condition)) \
       << "Check failed: " #condition ". "
 
 #else  // DCHECK_IS_ON()
 
-#define DCHECK(condition) \
-  EAT_STREAM_PARAMETERS << !ANALYZER_ASSUME_TRUE(condition)
-#define DPCHECK(condition) \
-  EAT_STREAM_PARAMETERS << !ANALYZER_ASSUME_TRUE(condition)
+#define DCHECK(condition) EAT_STREAM_PARAMETERS << !(condition)
+#define DPCHECK(condition) EAT_STREAM_PARAMETERS << !(condition)
 
 #endif  // DCHECK_IS_ON()
 
+#endif
 
 // Helper macro for binary operators.
 // Don't use this macro directly in your code, use DCHECK_EQ et al below.
@@ -863,7 +879,7 @@
                                 ::logging::g_swallow_stream, val1), \
                             ::logging::MakeCheckOpValueString(      \
                                 ::logging::g_swallow_stream, val2), \
-                            ANALYZER_ASSUME_TRUE((val1)op(val2)))
+                            (val1)op(val2))
 
 #endif  // DCHECK_IS_ON()
 
@@ -1052,7 +1068,7 @@
 
 #define RAW_CHECK(condition)                               \
   do {                                                     \
-    if (!ANALYZER_ASSUME_TRUE(condition))                  \
+    if (!(condition))                                      \
       ::logging::RawLog(::logging::LOG_FATAL,              \
                         "Check failed: " #condition "\n"); \
   } while (0)
diff --git a/cc/layers/layer_impl.h b/cc/layers/layer_impl.h
index d2b5c39..396cda8 100644
--- a/cc/layers/layer_impl.h
+++ b/cc/layers/layer_impl.h
@@ -394,6 +394,10 @@
     return is_drawn_render_surface_layer_list_member_;
   }
 
+  bool IsDrawnScrollbar() {
+    return ToScrollbarLayer() && is_drawn_render_surface_layer_list_member_;
+  }
+
   void set_may_contain_video(bool yes) { may_contain_video_ = yes; }
   bool may_contain_video() const { return may_contain_video_; }
 
diff --git a/cc/tiles/decoded_image_tracker_unittest.cc b/cc/tiles/decoded_image_tracker_unittest.cc
index 54a08ba..6b8b25ab0 100644
--- a/cc/tiles/decoded_image_tracker_unittest.cc
+++ b/cc/tiles/decoded_image_tracker_unittest.cc
@@ -56,9 +56,8 @@
 TEST_F(DecodedImageTrackerTest, QueueImageLocksImages) {
   bool locked = false;
   decoded_image_tracker()->QueueImageDecode(
-      nullptr,
-      base::Bind([](bool* locked, bool success) { *locked = true; },
-                 base::Unretained(&locked)));
+      nullptr, base::Bind([](bool* locked, bool success) { *locked = true; },
+                          base::Unretained(&locked)));
   EXPECT_TRUE(locked);
   EXPECT_EQ(1u, image_controller()->num_locked_images());
 }
@@ -66,9 +65,8 @@
 TEST_F(DecodedImageTrackerTest, NotifyFrameFinishedUnlocksImages) {
   bool locked = false;
   decoded_image_tracker()->QueueImageDecode(
-      nullptr,
-      base::Bind([](bool* locked, bool success) { *locked = true; },
-                 base::Unretained(&locked)));
+      nullptr, base::Bind([](bool* locked, bool success) { *locked = true; },
+                          base::Unretained(&locked)));
   EXPECT_TRUE(locked);
   EXPECT_EQ(1u, image_controller()->num_locked_images());
 
@@ -77,9 +75,8 @@
 
   locked = false;
   decoded_image_tracker()->QueueImageDecode(
-      nullptr,
-      base::Bind([](bool* locked, bool success) { *locked = true; },
-                 base::Unretained(&locked)));
+      nullptr, base::Bind([](bool* locked, bool success) { *locked = true; },
+                          base::Unretained(&locked)));
   EXPECT_TRUE(locked);
   EXPECT_EQ(2u, image_controller()->num_locked_images());
 
diff --git a/cc/tiles/image_controller.cc b/cc/tiles/image_controller.cc
index 2fe901d..ce6968b 100644
--- a/cc/tiles/image_controller.cc
+++ b/cc/tiles/image_controller.cc
@@ -26,6 +26,8 @@
 
 ImageController::~ImageController() {
   StopWorkerTasks();
+  for (auto& request : orphaned_decode_requests_)
+    request.callback.Run(request.id, ImageDecodeResult::FAILURE);
 }
 
 void ImageController::StopWorkerTasks() {
@@ -74,7 +76,6 @@
   // be posted in the run loop, but since we invalidated the weak ptrs, we need
   // to run everything manually.
   for (auto& request_to_complete : requests_needing_completion_) {
-    ImageDecodeRequestId id = request_to_complete.first;
     ImageDecodeRequest& request = request_to_complete.second;
 
     // The task (if one exists) would have run already, we just need to make
@@ -83,17 +84,13 @@
     if (request.task && !request.task->HasCompleted())
       request.task->DidComplete();
 
-    // Issue the callback, and unref the image immediately. This is so that any
-    // code waiting on the callback can proceed, although we're breaking the
-    // promise of having this image decoded. This is unfortunate, but it seems
-    // like the least complexity to process an image decode controller becoming
-    // nullptr.
-    // TODO(vmpstr): We can move these back to |image_decode_queue_| instead
-    // and defer completion until we get a new cache and process the request
-    // again. crbug.com/693692.
-    request.callback.Run(id, ImageDecodeResult::FAILURE);
     if (request.need_unref)
       cache_->UnrefImage(request.draw_image);
+
+    // Orphan the request so that we can still run it when a new cache is set.
+    request.task = nullptr;
+    request.need_unref = false;
+    orphaned_decode_requests_.push_back(std::move(request));
   }
   requests_needing_completion_.clear();
 
@@ -101,7 +98,6 @@
   // similar to the |requests_needing_completion_|, but happens at a different
   // stage in the pipeline.
   for (auto& request_pair : image_decode_queue_) {
-    ImageDecodeRequestId id = request_pair.first;
     ImageDecodeRequest& request = request_pair.second;
 
     if (request.task) {
@@ -114,11 +110,12 @@
       if (!request.task->HasCompleted())
         request.task->DidComplete();
     }
-    // Run the callback and unref the image.
-    // TODO(vmpstr): We can regenerate the tasks for the new cache if we get
-    // one. crbug.com/693692.
-    request.callback.Run(id, ImageDecodeResult::FAILURE);
     cache_->UnrefImage(request.draw_image);
+
+    // Orphan the request so that we can still run it when a new cache is set.
+    request.task = nullptr;
+    request.need_unref = false;
+    orphaned_decode_requests_.push_back(std::move(request));
   }
   image_decode_queue_.clear();
 }
@@ -133,6 +130,9 @@
   }
 
   cache_ = cache;
+
+  if (cache_)
+    GenerateTasksForOrphanedRequests();
 }
 
 void ImageController::GetTasksForImagesAndRef(
@@ -321,6 +321,33 @@
   callback.Run(id, result);
 }
 
+void ImageController::GenerateTasksForOrphanedRequests() {
+  base::AutoLock hold(lock_);
+  DCHECK_EQ(0u, image_decode_queue_.size());
+  DCHECK_EQ(0u, requests_needing_completion_.size());
+  DCHECK(cache_);
+
+  for (auto& request : orphaned_decode_requests_) {
+    DCHECK(!request.task);
+    DCHECK(!request.need_unref);
+    if (request.draw_image.image()->isLazyGenerated()) {
+      // Get the task for this decode.
+      request.need_unref = cache_->GetOutOfRasterDecodeTaskForImageAndRef(
+          request.draw_image, &request.task);
+    }
+    image_decode_queue_[request.id] = std::move(request);
+  }
+
+  orphaned_decode_requests_.clear();
+  if (!image_decode_queue_.empty()) {
+    // Post a worker task.
+    worker_task_runner_->PostTask(
+        FROM_HERE,
+        base::Bind(&ImageController::ProcessNextImageDecodeOnWorkerThread,
+                   base::Unretained(this)));
+  }
+}
+
 ImageController::ImageDecodeRequest::ImageDecodeRequest() = default;
 ImageController::ImageDecodeRequest::ImageDecodeRequest(
     ImageDecodeRequestId id,
diff --git a/cc/tiles/image_controller.h b/cc/tiles/image_controller.h
index 4e8a572..f62638a 100644
--- a/cc/tiles/image_controller.h
+++ b/cc/tiles/image_controller.h
@@ -86,6 +86,7 @@
   void ProcessNextImageDecodeOnWorkerThread();
 
   void ImageDecodeCompleted(ImageDecodeRequestId id);
+  void GenerateTasksForOrphanedRequests();
 
   ImageDecodeCache* cache_ = nullptr;
   std::vector<DrawImage> predecode_locked_images_;
@@ -102,6 +103,12 @@
   std::map<ImageDecodeRequestId, ImageDecodeRequest>
       requests_needing_completion_;
   bool abort_tasks_ = false;
+  // Orphaned requests are requests that were either in queue or needed a
+  // completion callback when we set the decode cache to be nullptr. When a new
+  // decode cache is set, these requests are re-enqueued again with tasks
+  // generated by the new cache. Note that when the cache is set, then aside
+  // from generating new tasks, this vector should be empty.
+  std::vector<ImageDecodeRequest> orphaned_decode_requests_;
 
   base::WeakPtrFactory<ImageController> weak_ptr_factory_;
 
diff --git a/cc/tiles/image_controller_unittest.cc b/cc/tiles/image_controller_unittest.cc
index 89fc160..90b708f 100644
--- a/cc/tiles/image_controller_unittest.cc
+++ b/cc/tiles/image_controller_unittest.cc
@@ -266,6 +266,8 @@
     run_loop->Run();
   }
 
+  void ResetController() { controller_.reset(); }
+
  private:
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
   scoped_refptr<WorkerTaskRunner> worker_task_runner_;
@@ -449,6 +451,7 @@
   task_one->AllowToRun();
   task_two->AllowToRun();
   controller()->SetImageDecodeCache(nullptr);
+  ResetController();
 
   RunOrTimeout(&run_loop);
 
@@ -507,7 +510,7 @@
   EXPECT_EQ(0, cache()->number_of_refs());
 }
 
-TEST_F(ImageControllerTest, DispatchesDecodeCallbacksAfterCacheChanged) {
+TEST_F(ImageControllerTest, DispatchesDecodeCallbacksAfterCacheReset) {
   scoped_refptr<SimpleTask> task(new SimpleTask);
   cache()->SetTaskToUse(task);
 
@@ -529,8 +532,59 @@
   // the compositor thread. Ensure that the completion callbacks for the decode
   // is still run.
   controller()->SetImageDecodeCache(nullptr);
+  ResetController();
+
   RunOrTimeout(&run_loop1);
   RunOrTimeout(&run_loop2);
+
+  EXPECT_EQ(ImageController::ImageDecodeResult::FAILURE,
+            decode_client1.result());
+  EXPECT_EQ(ImageController::ImageDecodeResult::FAILURE,
+            decode_client2.result());
+}
+
+TEST_F(ImageControllerTest, DispatchesDecodeCallbacksAfterCacheChanged) {
+  scoped_refptr<SimpleTask> task(new SimpleTask);
+  cache()->SetTaskToUse(task);
+
+  base::RunLoop run_loop1;
+  DecodeClient decode_client1;
+  base::RunLoop run_loop2;
+  DecodeClient decode_client2;
+
+  controller()->QueueImageDecode(
+      image(),
+      base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client1),
+                 run_loop1.QuitClosure()));
+  controller()->QueueImageDecode(
+      image(),
+      base::Bind(&DecodeClient::Callback, base::Unretained(&decode_client2),
+                 run_loop2.QuitClosure()));
+
+  // Now reset the image cache before decode completed callbacks are posted to
+  // the compositor thread. This should orphan the requests.
+  controller()->SetImageDecodeCache(nullptr);
+
+  EXPECT_EQ(0, cache()->number_of_refs());
+
+  TestableCache other_cache;
+  other_cache.SetTaskToUse(task);
+
+  controller()->SetImageDecodeCache(&other_cache);
+
+  RunOrTimeout(&run_loop1);
+  RunOrTimeout(&run_loop2);
+
+  EXPECT_EQ(2, other_cache.number_of_refs());
+  EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
+            decode_client1.result());
+  EXPECT_EQ(ImageController::ImageDecodeResult::SUCCESS,
+            decode_client2.result());
+
+  // Reset the controller since the order of destruction is wrong in this test
+  // (|other_cache| should outlive the controller. This is normally done via
+  // SetImageDecodeCache(nullptr) or it can be done in the dtor of the cache.)
+  ResetController();
 }
 
 }  // namespace
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 132616e..f99af61 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -162,15 +162,10 @@
     return false;
 
   auto* property_trees = child->layer_tree_impl()->property_trees();
-  auto ancestor_scroll_id =
-      property_trees->layer_id_to_scroll_node_index.find(ancestor->id());
-  if (ancestor_scroll_id == property_trees->layer_id_to_scroll_node_index.end())
-    return false;
-
   ScrollTree& scroll_tree = property_trees->scroll_tree;
   for (ScrollNode* scroll_node = scroll_tree.Node(child->scroll_tree_index());
        scroll_node; scroll_node = scroll_tree.parent(scroll_node)) {
-    if (scroll_node->id == ancestor_scroll_id->second)
+    if (scroll_node->id == ancestor->scroll_tree_index())
       return true;
   }
   return false;
@@ -2629,28 +2624,6 @@
   return active_tree_->LayerById(impl_scroll_node->owning_layer_id);
 }
 
-static bool IsClosestScrollAncestor(LayerImpl* child,
-                                    LayerImpl* scroll_ancestor) {
-  DCHECK(scroll_ancestor);
-  if (!child)
-    return false;
-
-  auto* property_trees = child->layer_tree_impl()->property_trees();
-  auto ancestor_scroll_id =
-      property_trees->layer_id_to_scroll_node_index.find(scroll_ancestor->id());
-  if (ancestor_scroll_id == property_trees->layer_id_to_scroll_node_index.end())
-    return false;
-
-  ScrollTree& scroll_tree = property_trees->scroll_tree;
-  ScrollNode* scroll_node = scroll_tree.Node(child->scroll_tree_index());
-  for (; scroll_tree.parent(scroll_node);
-       scroll_node = scroll_tree.parent(scroll_node)) {
-    if (scroll_node->scrollable)
-      return scroll_node->id == ancestor_scroll_id->second;
-  }
-  return false;
-}
-
 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBeginImpl(
     ScrollState* scroll_state,
     LayerImpl* scrolling_layer_impl,
@@ -2724,11 +2697,7 @@
         active_tree_->FindLayerThatIsHitByPoint(device_viewport_point);
 
     if (layer_impl) {
-      LayerImpl* scroll_layer_impl =
-          active_tree_->FindFirstScrollingLayerOrScrollbarLayerThatIsHitByPoint(
-              device_viewport_point);
-      if (scroll_layer_impl &&
-          !IsClosestScrollAncestor(layer_impl, scroll_layer_impl)) {
+      if (!IsInitialScrollHitTestReliable(layer_impl, device_viewport_point)) {
         scroll_status.thread = SCROLL_UNKNOWN;
         scroll_status.main_thread_scrolling_reasons =
             MainThreadScrollingReason::kFailedHitTest;
@@ -2754,6 +2723,46 @@
   return ScrollBeginImpl(scroll_state, scrolling_layer_impl, type);
 }
 
+// Some initial scroll tests are known to be unreliable and require falling
+// back to main thread scrolling.
+bool LayerTreeHostImpl::IsInitialScrollHitTestReliable(
+    LayerImpl* layer_impl,
+    const gfx::PointF& device_viewport_point) {
+  LayerImpl* first_scrolling_layer_or_drawn_scrollbar =
+      active_tree_->FindFirstScrollingLayerOrDrawnScrollbarThatIsHitByPoint(
+          device_viewport_point);
+  if (!first_scrolling_layer_or_drawn_scrollbar)
+    return true;
+
+  ScrollNode* closest_scroll_node = nullptr;
+  auto& scroll_tree = active_tree_->property_trees()->scroll_tree;
+  ScrollNode* scroll_node = scroll_tree.Node(layer_impl->scroll_tree_index());
+  for (; scroll_tree.parent(scroll_node);
+       scroll_node = scroll_tree.parent(scroll_node)) {
+    if (scroll_node->scrollable) {
+      closest_scroll_node = scroll_node;
+      break;
+    }
+  }
+  if (!closest_scroll_node)
+    return false;
+
+  // If |first_scrolling_layer_or_drawn_scrollbar| is scrollable, it will
+  // create a scroll node. If this scroll node corresponds to first scrollable
+  // ancestor along the scroll tree for |layer_impl|, the hit test has not
+  // escaped to other areas of the scroll tree and is reliable.
+  if (first_scrolling_layer_or_drawn_scrollbar->scrollable()) {
+    return closest_scroll_node->id ==
+           first_scrolling_layer_or_drawn_scrollbar->scroll_tree_index();
+  }
+
+  // If |first_scrolling_layer_or_drawn_scrollbar| is not scrollable, it must
+  // be a drawn scrollbar. These hit tests require falling back to main-thread
+  // scrolling.
+  DCHECK(first_scrolling_layer_or_drawn_scrollbar->IsDrawnScrollbar());
+  return false;
+}
+
 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimatedBegin(
     const gfx::Point& viewport_point) {
   InputHandler::ScrollStatus scroll_status;
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 37f13061..0787f7f4 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -651,6 +651,7 @@
       ScrollState* scroll_state,
       LayerImpl* scrolling_layer_impl,
       InputHandler::ScrollInputType type);
+  bool IsInitialScrollHitTestReliable(LayerImpl* layer, const gfx::PointF&);
   void DistributeScrollDelta(ScrollState* scroll_state);
 
   bool AnimatePageScale(base::TimeTicks monotonic_time);
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index a82de3169..4f9c6ee 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -1018,6 +1018,66 @@
   EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread);
 }
 
+TEST_F(LayerTreeHostImplTest, ScrolledOverlappingDrawnScrollbarLayer) {
+  LayerTreeImpl* layer_tree_impl = host_impl_->active_tree();
+  gfx::Size content_size = gfx::Size(360, 600);
+  gfx::Size scroll_content_size = gfx::Size(345, 3800);
+  gfx::Size scrollbar_size = gfx::Size(15, 600);
+
+  host_impl_->SetViewportSize(content_size);
+  std::unique_ptr<LayerImpl> root = LayerImpl::Create(layer_tree_impl, 1);
+  root->SetBounds(content_size);
+  root->SetPosition(gfx::PointF());
+
+  std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 2);
+  clip->SetBounds(content_size);
+  clip->SetPosition(gfx::PointF());
+
+  std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 3);
+  scroll->SetBounds(scroll_content_size);
+  scroll->SetScrollClipLayer(clip->id());
+  scroll->SetDrawsContent(true);
+
+  std::unique_ptr<SolidColorScrollbarLayerImpl> drawn_scrollbar =
+      SolidColorScrollbarLayerImpl::Create(layer_tree_impl, 4, VERTICAL, 10, 0,
+                                           false, true);
+  drawn_scrollbar->SetBounds(scrollbar_size);
+  drawn_scrollbar->SetPosition(gfx::PointF(345, 0));
+  drawn_scrollbar->SetScrollLayerId(scroll->id());
+  drawn_scrollbar->SetDrawsContent(true);
+  drawn_scrollbar->test_properties()->opacity = 1.f;
+
+  std::unique_ptr<LayerImpl> squash = LayerImpl::Create(layer_tree_impl, 5);
+  squash->SetBounds(gfx::Size(140, 300));
+  squash->SetPosition(gfx::PointF(220, 0));
+  squash->SetDrawsContent(true);
+
+  scroll->test_properties()->AddChild(std::move(drawn_scrollbar));
+  scroll->test_properties()->AddChild(std::move(squash));
+  clip->test_properties()->AddChild(std::move(scroll));
+  root->test_properties()->AddChild(std::move(clip));
+
+  layer_tree_impl->SetRootLayerForTesting(std::move(root));
+  layer_tree_impl->BuildPropertyTreesForTesting();
+  layer_tree_impl->DidBecomeActive();
+
+  // The point hits squash layer and also scrollbar layer, but because the
+  // scrollbar layer is a drawn scrollbar, we cannot scroll on the impl thread.
+  auto status = host_impl_->ScrollBegin(BeginState(gfx::Point(350, 150)).get(),
+                                        InputHandler::WHEEL);
+  EXPECT_EQ(InputHandler::SCROLL_UNKNOWN, status.thread);
+  EXPECT_EQ(MainThreadScrollingReason::kFailedHitTest,
+            status.main_thread_scrolling_reasons);
+
+  // The point hits the drawn scrollbar layer completely and should not scroll
+  // on the impl thread.
+  status = host_impl_->ScrollBegin(BeginState(gfx::Point(350, 500)).get(),
+                                   InputHandler::WHEEL);
+  EXPECT_EQ(InputHandler::SCROLL_UNKNOWN, status.thread);
+  EXPECT_EQ(MainThreadScrollingReason::kFailedHitTest,
+            status.main_thread_scrolling_reasons);
+}
+
 TEST_F(LayerTreeHostImplTest, NonFastScrollableRegionBasic) {
   SetupScrollAndContentsLayers(gfx::Size(200, 200));
   host_impl_->SetViewportSize(gfx::Size(100, 100));
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 5d91fc7..fae5f7c 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -1929,32 +1929,26 @@
   }
 }
 
-static bool IsScrollableOrDrawnScrollbarLayer(LayerImpl* layer) {
-  return layer->scrollable() ||
-         (layer->ToScrollbarLayer() &&
-          layer->is_drawn_render_surface_layer_list_member());
-}
-
-struct FindScrollingLayerOrScrollbarLayerFunctor {
+struct FindScrollingLayerOrDrawnScrollbarFunctor {
   bool operator()(LayerImpl* layer) const {
-    return IsScrollableOrDrawnScrollbarLayer(layer);
+    return layer->scrollable() || layer->IsDrawnScrollbar();
   }
 };
 
 LayerImpl*
-LayerTreeImpl::FindFirstScrollingLayerOrScrollbarLayerThatIsHitByPoint(
+LayerTreeImpl::FindFirstScrollingLayerOrDrawnScrollbarThatIsHitByPoint(
     const gfx::PointF& screen_space_point) {
   FindClosestMatchingLayerState state;
   LayerImpl* root_layer = layer_list_.empty() ? nullptr : layer_list_[0];
   FindClosestMatchingLayer(screen_space_point, root_layer,
-                           FindScrollingLayerOrScrollbarLayerFunctor(), &state);
+                           FindScrollingLayerOrDrawnScrollbarFunctor(), &state);
   return state.closest_match;
 }
 
 struct HitTestVisibleScrollableOrTouchableFunctor {
   bool operator()(LayerImpl* layer) const {
-    return layer->is_drawn_render_surface_layer_list_member() ||
-           IsScrollableOrDrawnScrollbarLayer(layer) ||
+    return layer->scrollable() ||
+           layer->is_drawn_render_surface_layer_list_member() ||
            !layer->touch_event_handler_region().IsEmpty();
   }
 };
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index a12b6b56..df46775 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -392,7 +392,7 @@
   void RemoveSurfaceLayer(LayerImpl* layer);
   const LayerImplList& SurfaceLayers() const { return surface_layers_; }
 
-  LayerImpl* FindFirstScrollingLayerOrScrollbarLayerThatIsHitByPoint(
+  LayerImpl* FindFirstScrollingLayerOrDrawnScrollbarThatIsHitByPoint(
       const gfx::PointF& screen_space_point);
 
   LayerImpl* FindLayerThatIsHitByPoint(const gfx::PointF& screen_space_point);
diff --git a/chrome/android/java/DEPS b/chrome/android/java/DEPS
index c6ec049d..8c434f9 100644
--- a/chrome/android/java/DEPS
+++ b/chrome/android/java/DEPS
@@ -1,5 +1,6 @@
 include_rules = [
   "+components/autofill/android/java/src/org/chromium/components/autofill",
+  "+components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler",
   "+components/bookmarks/common/android/java/src/org/chromium/components/bookmarks",
   "+components/dom_distiller/content/browser/android/java/src/org/chromium/components/dom_distiller/content",
   "+components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java
index 10bb8872..cf8de4f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java
@@ -20,10 +20,6 @@
  */
 @TargetApi(Build.VERSION_CODES.N)
 public class NotificationJobService extends JobService {
-    // We don't need to distinguish between jobs sent to this service, so we can reuse one job id.
-    // But it ought to be distinct from job ids used with other JobService classes in our code.
-    static final int JOB_ID = 21;
-
     static PersistableBundle getJobExtrasFromIntent(Intent intent) {
         PersistableBundle bundle = new PersistableBundle();
         bundle.putString(NotificationConstants.EXTRA_NOTIFICATION_ID,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java
index 15f833e..08ae69a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java
@@ -21,6 +21,7 @@
 import org.chromium.base.library_loader.ProcessInitException;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.webapps.WebappRegistry;
+import org.chromium.components.background_task_scheduler.TaskIds;
 
 /**
  * The Notification service receives intents fired as responses to user actions issued on Android
@@ -48,7 +49,7 @@
                 PersistableBundle extras = NotificationJobService.getJobExtrasFromIntent(intent);
                 JobInfo job =
                         new JobInfo
-                                .Builder(NotificationJobService.JOB_ID,
+                                .Builder(TaskIds.NOTIFICATION_SERVICE_JOB_ID,
                                         new ComponentName(context, NotificationJobService.class))
                                 .setExtras(extras)
                                 .setOverrideDeadline(0)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java
index d1a1660be..54f0ded 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.services.gcm;
 
+import android.content.Context;
+import android.os.Build;
 import android.os.Bundle;
 import android.text.TextUtils;
 
@@ -16,7 +18,11 @@
 import org.chromium.base.library_loader.ProcessInitException;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.init.ProcessInitializationHandler;
+import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory;
+import org.chromium.components.background_task_scheduler.TaskIds;
+import org.chromium.components.background_task_scheduler.TaskInfo;
 import org.chromium.components.gcm_driver.GCMDriver;
+import org.chromium.components.gcm_driver.GCMMessage;
 
 /**
  * Receives Downstream messages and status of upstream messages from GCM.
@@ -31,7 +37,7 @@
     }
 
     @Override
-    public void onMessageReceived(String from, Bundle data) {
+    public void onMessageReceived(final String from, final Bundle data) {
         boolean hasCollapseKey = !TextUtils.isEmpty(data.getString("collapse_key"));
         GcmUma.recordDataMessageReceived(getApplicationContext(), hasCollapseKey);
 
@@ -40,7 +46,24 @@
             AndroidGcmController.get(this).onMessageReceived(data);
             return;
         }
-        pushMessageReceived(from, data);
+
+        final Context applicationContext = getApplicationContext();
+
+        // Dispatch the message to the GCM Driver for native features.
+        ThreadUtils.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                GCMMessage message = null;
+                try {
+                    message = new GCMMessage(from, data);
+                } catch (IllegalArgumentException e) {
+                    Log.e(TAG, "Received an invalid GCM Message", e);
+                    return;
+                }
+
+                scheduleOrDispatchMessageToDriver(applicationContext, message);
+            }
+        });
     }
 
     @Override
@@ -63,28 +86,50 @@
         GcmUma.recordDeletedMessages(getApplicationContext());
     }
 
-    private void pushMessageReceived(final String from, final Bundle data) {
-        final String bundleSubtype = "subtype";
-        if (!data.containsKey(bundleSubtype)) {
-            Log.w(TAG, "Received push message with no subtype");
-            return;
+    /**
+     * Either schedules |message| to be dispatched through the Job Scheduler, which we use on
+     * Android N and beyond, or immediately dispatches the message on other versions of Android.
+     * Must be called on the UI thread both for the BackgroundTaskScheduler and for dispatching
+     * the |message| to the GCMDriver.
+     */
+    static void scheduleOrDispatchMessageToDriver(Context context, GCMMessage message) {
+        ThreadUtils.assertOnUiThread();
+
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            Bundle extras = message.toBundle();
+
+            // TODO(peter): Add UMA for measuring latency introduced by the BackgroundTaskScheduler.
+            TaskInfo backgroundTask = TaskInfo.createOneOffTask(TaskIds.GCM_BACKGROUND_TASK_JOB_ID,
+                                                      GCMBackgroundTask.class, 0 /* immediately */)
+                                              .setExtras(extras)
+                                              .build();
+
+            BackgroundTaskSchedulerFactory.getScheduler().schedule(context, backgroundTask);
+
+        } else {
+            dispatchMessageToDriver(context, message);
         }
-        final String appId = data.getString(bundleSubtype);
-        ThreadUtils.runOnUiThread(new Runnable() {
-            @Override
-            @SuppressFBWarnings("DM_EXIT")
-            public void run() {
-                try {
-                    ChromeBrowserInitializer.getInstance(getApplicationContext())
-                        .handleSynchronousStartup();
-                    GCMDriver.onMessageReceived(appId, from, data);
-                } catch (ProcessInitException e) {
-                    Log.e(TAG, "ProcessInitException while starting the browser process");
-                    // Since the library failed to initialize nothing in the application
-                    // can work, so kill the whole application not just the activity.
-                    System.exit(-1);
-                }
-            }
-        });
+    }
+
+    /**
+     * To be called when a GCM message is ready to be dispatched. Will initialise the native code
+     * of the browser process, and forward the message to the GCM Driver. Must be called on the UI
+     * thread.
+     */
+    @SuppressFBWarnings("DM_EXIT")
+    static void dispatchMessageToDriver(Context applicationContext, GCMMessage message) {
+        ThreadUtils.assertOnUiThread();
+
+        try {
+            ChromeBrowserInitializer.getInstance(applicationContext).handleSynchronousStartup();
+            GCMDriver.dispatchMessage(message);
+
+        } catch (ProcessInitException e) {
+            Log.e(TAG, "ProcessInitException while starting the browser process");
+
+            // Since the library failed to initialize nothing in the application can work, so kill
+            // the whole application as opposed to just this service.
+            System.exit(-1);
+        }
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundTask.java b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundTask.java
new file mode 100644
index 0000000..db2533b
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundTask.java
@@ -0,0 +1,58 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.services.gcm;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.MainThread;
+
+import org.chromium.base.Log;
+import org.chromium.components.background_task_scheduler.BackgroundTask;
+import org.chromium.components.background_task_scheduler.TaskParameters;
+import org.chromium.components.gcm_driver.GCMMessage;
+
+/**
+ * Processes jobs that have been scheduled for delivering GCM messages to the native GCM Driver,
+ * processing for which may exceed the lifetime of the GcmListenerService.
+ */
+@TargetApi(Build.VERSION_CODES.N)
+public class GCMBackgroundTask implements BackgroundTask {
+    private static final String TAG = "GCMBackgroundTask";
+
+    /**
+     * Called when a GCM message is ready to be delivered to the GCM Driver consumer. Because we
+     * don't yet know when a message has been fully processed, the task returns that processing has
+     * been completed, and we hope that the system keeps us alive long enough to finish processing.
+     *
+     * @return Boolean indicating whether the WakeLock for this task must be maintained.
+     */
+    @MainThread
+    @Override
+    public boolean onStartTask(
+            Context context, TaskParameters taskParameters, TaskFinishedCallback callback) {
+        Bundle extras = taskParameters.getExtras();
+        if (!GCMMessage.validateBundle(extras)) {
+            Log.e(TAG, "The received bundle containing message data could not be validated.");
+            return false;
+        }
+
+        ChromeGcmListenerService.dispatchMessageToDriver(context, new GCMMessage(extras));
+        return false;
+    }
+
+    /**
+     * Called when the system has determined that processing the GCM message must be stopped.
+     *
+     * @return Boolean indicating whether the task has to be rescheduled.
+     */
+    @MainThread
+    @Override
+    public boolean onStopTask(Context context, TaskParameters taskParameters) {
+        // The GCM Driver has no mechanism for aborting previously dispatched messages.
+        return false;
+    }
+}
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 19f24575..6ec6b3a 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -886,6 +886,7 @@
   "java/src/org/chromium/chrome/browser/services/AndroidEduOwnerCheckCallback.java",
   "java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java",
   "java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java",
+  "java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundTask.java",
   "java/src/org/chromium/chrome/browser/services/gcm/GcmUma.java",
   "java/src/org/chromium/chrome/browser/services/gcm/InvalidationGcmUpstreamSender.java",
   "java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
index 67f7371..15db01f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
@@ -30,6 +30,7 @@
 import org.chromium.chrome.test.util.browser.TabTitleObserver;
 import org.chromium.chrome.test.util.browser.notifications.MockNotificationManagerProxy.NotificationEntry;
 import org.chromium.components.gcm_driver.GCMDriver;
+import org.chromium.components.gcm_driver.GCMMessage;
 import org.chromium.components.gcm_driver.instance_id.FakeInstanceIDWithSubtype;
 import org.chromium.content.browser.test.util.Criteria;
 import org.chromium.content.browser.test.util.CriteriaHelper;
@@ -293,10 +294,14 @@
             @Override
             public void run() {
                 Context context = getInstrumentation().getTargetContext().getApplicationContext();
+
                 Bundle extras = new Bundle();
+                extras.putString("subtype", appId);
+
+                GCMMessage message = new GCMMessage(senderId, extras);
                 try {
                     ChromeBrowserInitializer.getInstance(context).handleSynchronousStartup();
-                    GCMDriver.onMessageReceived(appId, senderId, extras);
+                    GCMDriver.dispatchMessage(message);
                 } catch (ProcessInitException e) {
                     fail("Chrome browser failed to initialize.");
                 }
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index e73e74a..96e6fe9 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1641,7 +1641,7 @@
     Search engine
   </message>
   <message name="IDS_SETTINGS_SEARCH_EXPLANATION" desc="Explanation for the search engine dropdown setting.">
-    Search engine used when searching from the <ph name="BEGIN_LINK">&lt;a target="_blank" href="$1"&gt;</ph>omnibox<ph name="END_LINK">&lt;/a&gt;</ph>
+    Search engine used when searching from the <ph name="BEGIN_LINK">&lt;a target="_blank" href="$1"&gt;</ph>address bar<ph name="END_LINK">&lt;/a&gt;</ph>
   </message>
   <message name="IDS_SETTINGS_SEARCH_MANAGE_SEARCH_ENGINES" desc="Label for the Manage Search Engines button.">
     Manage search engines
diff --git a/chrome/browser/android/offline_pages/background_loader_offliner.cc b/chrome/browser/android/offline_pages/background_loader_offliner.cc
index 468547b..ff7226a 100644
--- a/chrome/browser/android/offline_pages/background_loader_offliner.cc
+++ b/chrome/browser/android/offline_pages/background_loader_offliner.cc
@@ -268,7 +268,9 @@
 
   // Pass in the original URL if it's different from last committed
   // when redirects occur.
-  if (params.url != request.url())
+  if (!request.original_url().is_empty())
+    params.original_url = request.original_url();
+  else if (params.url != request.url())
     params.original_url = request.url();
 
   offline_page_model_->SavePage(
diff --git a/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc b/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc
index 09b3350..f3d5f2f 100644
--- a/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc
+++ b/chrome/browser/android/offline_pages/downloads/offline_page_download_bridge.cc
@@ -85,7 +85,8 @@
   return tab->web_contents();
 }
 
-void SavePageIfNotNavigatedAway(const GURL& original_url,
+void SavePageIfNotNavigatedAway(const GURL& url,
+                                const GURL& original_url,
                                 const ScopedJavaGlobalRef<jobject>& j_tab_ref) {
   content::WebContents* web_contents = GetWebContentsFromJavaTab(j_tab_ref);
   if (!web_contents)
@@ -93,8 +94,8 @@
 
   // This ignores fragment differences in URLs, bails out only if tab has
   // navigated away and not just scrolled to a fragment.
-  GURL url = web_contents->GetLastCommittedURL();
-  if (!OfflinePageUtils::EqualsIgnoringFragment(url, original_url))
+  GURL current_url = web_contents->GetLastCommittedURL();
+  if (!OfflinePageUtils::EqualsIgnoringFragment(current_url, url))
     return;
 
   offline_pages::ClientId client_id;
@@ -112,9 +113,13 @@
         offline_pages::RequestCoordinatorFactory::GetForBrowserContext(
             web_contents->GetBrowserContext());
     if (request_coordinator) {
-      request_id = request_coordinator->SavePageLater(
-          url, client_id, true,
-          RequestCoordinator::RequestAvailability::DISABLED_FOR_OFFLINER);
+      offline_pages::RequestCoordinator::SavePageLaterParams params;
+      params.url = current_url;
+      params.client_id = client_id;
+      params.availability =
+          RequestCoordinator::RequestAvailability::DISABLED_FOR_OFFLINER;
+      params.original_url = original_url;
+      request_id = request_coordinator->SavePageLater(params);
     } else {
       DVLOG(1) << "SavePageIfNotNavigatedAway has no valid coordinator.";
     }
@@ -145,6 +150,7 @@
 }
 
 void RequestQueueDuplicateCheckDone(
+    const GURL& url,
     const GURL& original_url,
     const ScopedJavaGlobalRef<jobject>& j_tab_ref,
     bool has_duplicates,
@@ -170,10 +176,11 @@
     return;
   }
 
-  SavePageIfNotNavigatedAway(original_url, j_tab_ref);
+  SavePageIfNotNavigatedAway(url, original_url, j_tab_ref);
 }
 
-void ModelDuplicateCheckDone(const GURL& original_url,
+void ModelDuplicateCheckDone(const GURL& url,
+                             const GURL& original_url,
                              const ScopedJavaGlobalRef<jobject>& j_tab_ref,
                              bool has_duplicates,
                              const base::Time& latest_saved_time) {
@@ -193,16 +200,16 @@
         base::TimeDelta::FromDays(7).InSeconds(), 50);
 
     OfflinePageInfoBarDelegate::Create(
-        base::Bind(&SavePageIfNotNavigatedAway, original_url, j_tab_ref),
-        original_url, web_contents);
+        base::Bind(&SavePageIfNotNavigatedAway, url, original_url, j_tab_ref),
+        url, web_contents);
     return;
   }
 
   OfflinePageUtils::CheckExistenceOfRequestsWithURL(
       Profile::FromBrowserContext(web_contents->GetBrowserContext())
           ->GetOriginalProfile(),
-      kDownloadNamespace, original_url,
-      base::Bind(&RequestQueueDuplicateCheckDone, original_url, j_tab_ref));
+      kDownloadNamespace, url, base::Bind(&RequestQueueDuplicateCheckDone, url,
+                                          original_url, j_tab_ref));
 }
 
 void ToJavaOfflinePageDownloadItemList(
@@ -371,12 +378,15 @@
     return;
 
   GURL url = web_contents->GetLastCommittedURL();
+  GURL original_url =
+      offline_pages::OfflinePageUtils::GetOriginalURLFromWebContents(
+          web_contents);
 
   ScopedJavaGlobalRef<jobject> j_tab_ref(env, j_tab);
 
   OfflinePageUtils::CheckExistenceOfPagesWithURL(
       tab->GetProfile()->GetOriginalProfile(), kDownloadNamespace, url,
-      base::Bind(&ModelDuplicateCheckDone, url, j_tab_ref));
+      base::Bind(&ModelDuplicateCheckDone, url, original_url, j_tab_ref));
 }
 
 void OfflinePageDownloadBridge::CancelDownload(
diff --git a/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc b/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc
index 81af5aed..db1d635 100644
--- a/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc
+++ b/chrome/browser/android/offline_pages/evaluation/offline_page_evaluation_bridge.cc
@@ -349,10 +349,11 @@
   client_id.name_space = ConvertJavaStringToUTF8(env, j_namespace);
   client_id.id = ConvertJavaStringToUTF8(env, j_client_id);
 
-  request_coordinator_->SavePageLater(
-      GURL(ConvertJavaStringToUTF8(env, j_url)), client_id,
-      static_cast<bool>(user_requested),
-      RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER);
+  RequestCoordinator::SavePageLaterParams params;
+  params.url = GURL(ConvertJavaStringToUTF8(env, j_url));
+  params.client_id = client_id;
+  params.user_requested = static_cast<bool>(user_requested);
+  request_coordinator_->SavePageLater(params);
 }
 
 void OfflinePageEvaluationBridge::GetRequestsInQueue(
diff --git a/chrome/browser/android/offline_pages/offline_page_bridge.cc b/chrome/browser/android/offline_pages/offline_page_bridge.cc
index 2661b85..126025e 100644
--- a/chrome/browser/android/offline_pages/offline_page_bridge.cc
+++ b/chrome/browser/android/offline_pages/offline_page_bridge.cc
@@ -466,10 +466,13 @@
       offline_pages::RequestCoordinatorFactory::GetInstance()->
           GetForBrowserContext(browser_context_);
 
-  coordinator->SavePageLater(
-      GURL(ConvertJavaStringToUTF8(env, j_url)), client_id,
-      static_cast<bool>(user_requested),
-      RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER);
+  RequestCoordinator::SavePageLaterParams params;
+  params.url = GURL(ConvertJavaStringToUTF8(env, j_url));
+  params.client_id = client_id;
+  params.user_requested = static_cast<bool>(user_requested);
+  params.availability =
+      RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER;
+  coordinator->SavePageLater(params);
 }
 
 ScopedJavaLocalRef<jstring> OfflinePageBridge::GetOfflinePageHeaderForReload(
diff --git a/chrome/browser/android/offline_pages/offline_page_utils.cc b/chrome/browser/android/offline_pages/offline_page_utils.cc
index a640ab4..1d304f2 100644
--- a/chrome/browser/android/offline_pages/offline_page_utils.cc
+++ b/chrome/browser/android/offline_pages/offline_page_utils.cc
@@ -28,8 +28,8 @@
 #include "components/offline_pages/core/offline_page_model.h"
 #include "components/offline_pages/core/request_header/offline_page_header.h"
 #include "content/public/browser/browser_context.h"
+#include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/web_contents.h"
-#include "url/gurl.h"
 
 namespace offline_pages {
 namespace {
@@ -243,13 +243,23 @@
   if (!request_coordinator)
     return;
 
-  ClientId client_id(kDownloadNamespace, base::GenerateGUID());
-  request_coordinator->SavePageLater(
-      url, client_id, true,
-      RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER);
+  RequestCoordinator::SavePageLaterParams params;
+  params.url = url;
+  params.client_id = ClientId(kDownloadNamespace, base::GenerateGUID());
+  request_coordinator->SavePageLater(params);
 
   android::OfflinePageNotificationBridge notification_bridge;
   notification_bridge.ShowDownloadingToast();
 }
 
+// static
+GURL OfflinePageUtils::GetOriginalURLFromWebContents(
+    content::WebContents* web_contents) {
+  content::NavigationEntry* entry =
+      web_contents->GetController().GetLastCommittedEntry();
+  if (!entry || entry->GetRedirectChain().size() <= 1)
+    return GURL();
+  return entry->GetRedirectChain().front();
+}
+
 }  // namespace offline_pages
diff --git a/chrome/browser/android/offline_pages/offline_page_utils.h b/chrome/browser/android/offline_pages/offline_page_utils.h
index 85f61b60..f223195 100644
--- a/chrome/browser/android/offline_pages/offline_page_utils.h
+++ b/chrome/browser/android/offline_pages/offline_page_utils.h
@@ -9,8 +9,7 @@
 
 #include "base/callback.h"
 #include "components/offline_pages/core/offline_page_model.h"
-
-class GURL;
+#include "url/gurl.h"
 
 namespace base {
 class Time;
@@ -95,6 +94,10 @@
 
   static void StartOfflinePageDownload(content::BrowserContext* context,
                                        const GURL& url);
+
+  // Returns original URL of the given web contents. Empty URL is returned if
+  // no redirect occurred.
+  static GURL GetOriginalURLFromWebContents(content::WebContents* web_contents);
 };
 
 }  // namespace offline_pages
diff --git a/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc b/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc
index 2be4550e..8f55101 100644
--- a/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc
+++ b/chrome/browser/android/offline_pages/offline_page_utils_unittest.cc
@@ -186,12 +186,11 @@
   RequestCoordinator* request_coordinator =
       RequestCoordinatorFactory::GetForBrowserContext(profile());
 
-  offline_pages::ClientId client_id;
-  client_id.name_space = kDownloadNamespace;
-  client_id.id = kTestPage3ClientId;
-  request_coordinator->SavePageLater(
-      kTestPage3Url, client_id, true,
-      RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER);
+  RequestCoordinator::SavePageLaterParams params;
+  params.url = kTestPage3Url;
+  params.client_id =
+      offline_pages::ClientId(kDownloadNamespace, kTestPage3ClientId);
+  request_coordinator->SavePageLater(params);
   RunUntilIdle();
 }
 
diff --git a/chrome/browser/android/offline_pages/prerendering_offliner.cc b/chrome/browser/android/offline_pages/prerendering_offliner.cc
index 5554393f..d85f3cbf 100644
--- a/chrome/browser/android/offline_pages/prerendering_offliner.cc
+++ b/chrome/browser/android/offline_pages/prerendering_offliner.cc
@@ -82,7 +82,9 @@
     save_page_params.is_background = true;
     // Pass in the original URL if it is different from the last committed URL
     // when redirects occur.
-    if (save_page_params.url != request.url())
+    if (!request.original_url().is_empty())
+      save_page_params.original_url = request.original_url();
+    else if (save_page_params.url != request.url())
       save_page_params.original_url = request.url();
 
     SavePage(save_page_params, std::move(archiver),
diff --git a/chrome/browser/android/offline_pages/recent_tab_helper.cc b/chrome/browser/android/offline_pages/recent_tab_helper.cc
index 064036a..a4afe42 100644
--- a/chrome/browser/android/offline_pages/recent_tab_helper.cc
+++ b/chrome/browser/android/offline_pages/recent_tab_helper.cc
@@ -392,6 +392,8 @@
   save_page_params.client_id = snapshot_info->client_id;
   save_page_params.proposed_offline_id = snapshot_info->request_id;
   save_page_params.is_background = false;
+  save_page_params.original_url =
+      OfflinePageUtils::GetOriginalURLFromWebContents(web_contents());
   page_model_->SavePage(
       save_page_params, delegate_->CreatePageArchiver(web_contents()),
       base::Bind(&RecentTabHelper::SavePageCallback,
diff --git a/chrome/browser/banners/app_banner_manager_browsertest.cc b/chrome/browser/banners/app_banner_manager_browsertest.cc
index dda2b5d..d61d0b17 100644
--- a/chrome/browser/banners/app_banner_manager_browsertest.cc
+++ b/chrome/browser/banners/app_banner_manager_browsertest.cc
@@ -136,7 +136,7 @@
       if (iterations > 0) {
         ui_test_utils::NavigateToURL(browser, test_url);
 
-        EXPECT_EQ(false, manager->will_show());
+        EXPECT_FALSE(manager->will_show());
         EXPECT_FALSE(manager->is_active());
 
         histograms.ExpectTotalCount(banners::kMinutesHistogram, 0);
diff --git a/chrome/browser/chromeos/input_method/input_method_syncer.cc b/chrome/browser/chromeos/input_method/input_method_syncer.cc
index d27002a..12ce3b7 100644
--- a/chrome/browser/chromeos/input_method/input_method_syncer.cc
+++ b/chrome/browser/chromeos/input_method/input_method_syncer.cc
@@ -12,8 +12,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/task_runner.h"
-#include "base/task_runner_util.h"
-#include "base/threading/sequenced_worker_pool.h"
+#include "base/task_scheduler/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/common/pref_names.h"
 #include "components/pref_registry/pref_registry_syncable.h"
@@ -56,7 +55,6 @@
 // Checks whether each language is supported, replacing locales with variants
 // if they are available. Must be called on a thread that allows IO.
 std::string CheckAndResolveLocales(const std::string& languages) {
-  DCHECK(content::BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
   if (languages.empty())
     return languages;
   std::vector<std::string> values = base::SplitString(
@@ -237,12 +235,11 @@
       AddSupportedInputMethodValues(preferred_languages_.GetValue(),
                                     preferred_languages_syncable,
                                     prefs::kLanguagePreferredLanguages));
-  base::PostTaskAndReplyWithResult(
-      content::BrowserThread::GetBlockingPool(),
-      FROM_HERE,
+  base::PostTaskWithTraitsAndReplyWithResult(
+      FROM_HERE, base::TaskTraits().MayBlock().WithPriority(
+                     base::TaskPriority::BACKGROUND),
       base::Bind(&CheckAndResolveLocales, languages),
-      base::Bind(&InputMethodSyncer::FinishMerge,
-                 weak_factory_.GetWeakPtr()));
+      base::Bind(&InputMethodSyncer::FinishMerge, weak_factory_.GetWeakPtr()));
 }
 
 std::string InputMethodSyncer::AddSupportedInputMethodValues(
diff --git a/chrome/browser/chromeos/net/client_cert_store_chromeos.cc b/chrome/browser/chromeos/net/client_cert_store_chromeos.cc
index d64c1751..7174c202 100644
--- a/chrome/browser/chromeos/net/client_cert_store_chromeos.cc
+++ b/chrome/browser/chromeos/net/client_cert_store_chromeos.cc
@@ -12,7 +12,7 @@
 #include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/location.h"
-#include "base/task_scheduler/post_task.h"
+#include "base/threading/worker_pool.h"
 #include "chrome/browser/chromeos/certificate_provider/certificate_provider.h"
 #include "crypto/nss_crypto_module_delegate.h"
 #include "net/ssl/ssl_cert_request_info.h"
@@ -81,13 +81,18 @@
     password_delegate.reset(
         password_delegate_factory_.Run(request->host_and_port));
   }
-  base::PostTaskWithTraitsAndReply(
-      FROM_HERE, base::TaskTraits().MayBlock().WithShutdownBehavior(
-                     base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
-      base::Bind(&ClientCertStoreChromeOS::GetAndFilterCertsOnWorkerThread,
-                 base::Unretained(this), base::Passed(&password_delegate),
-                 request, additional_certs, selected_certs),
-      callback);
+  if (base::WorkerPool::PostTaskAndReply(
+          FROM_HERE,
+          base::Bind(&ClientCertStoreChromeOS::GetAndFilterCertsOnWorkerThread,
+                     base::Unretained(this), base::Passed(&password_delegate),
+                     request, additional_certs, selected_certs),
+          callback, true)) {
+    return;
+  }
+  // If the task could not be posted, behave as if there were no certificates
+  // which requires to clear |selected_certs|.
+  selected_certs->clear();
+  callback.Run();
 }
 
 void ClientCertStoreChromeOS::GetAndFilterCertsOnWorkerThread(
diff --git a/chrome/browser/chromeos/net/client_cert_store_chromeos_unittest.cc b/chrome/browser/chromeos/net/client_cert_store_chromeos_unittest.cc
index 3621e9e..c3c63f9 100644
--- a/chrome/browser/chromeos/net/client_cert_store_chromeos_unittest.cc
+++ b/chrome/browser/chromeos/net/client_cert_store_chromeos_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/chromeos/net/client_cert_store_chromeos.h"
 
+#include <memory>
 #include <string>
 
 #include "base/callback.h"
@@ -13,7 +14,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
-#include "base/test/scoped_task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/certificate_provider/certificate_provider.h"
 #include "crypto/scoped_test_nss_db.h"
@@ -77,7 +77,7 @@
 
 class ClientCertStoreChromeOSTest : public ::testing::Test {
  public:
-  ClientCertStoreChromeOSTest() {}
+  ClientCertStoreChromeOSTest() : message_loop_(new base::MessageLoopForIO()) {}
 
   scoped_refptr<net::X509Certificate> ImportCertToSlot(
       const std::string& cert_filename,
@@ -88,7 +88,7 @@
   }
 
  private:
-  base::test::ScopedTaskScheduler scoped_task_scheduler_;
+  std::unique_ptr<base::MessageLoop> message_loop_;
 };
 
 // Ensure that cert requests, that are started before the filter is initialized,
diff --git a/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc b/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc
index 7bc699a..13763da 100644
--- a/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc
+++ b/chrome/browser/chromeos/policy/policy_cert_verifier_browsertest.cc
@@ -12,6 +12,7 @@
 #include "base/callback.h"
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/net/cert_verify_proc_chromeos.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread_bundle.h"
@@ -44,6 +45,8 @@
         crypto::GetPrivateSlotForChromeOSUser(
             test_nss_user_.username_hash(),
             base::Callback<void(crypto::ScopedPK11Slot)>())));
+    test_cert_db_->SetSlowTaskRunnerForTest(
+        base::ThreadTaskRunnerHandle::Get());
 
     cert_verifier_.reset(new PolicyCertVerifier(base::Bind(
         &PolicyCertVerifierTest::OnTrustAnchorUsed, base::Unretained(this))));
diff --git a/chrome/browser/chromeos/policy/system_log_uploader.cc b/chrome/browser/chromeos/policy/system_log_uploader.cc
index f472a2e4..fce6ed1 100644
--- a/chrome/browser/chromeos/policy/system_log_uploader.cc
+++ b/chrome/browser/chromeos/policy/system_log_uploader.cc
@@ -9,11 +9,11 @@
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/memory/ptr_util.h"
+#include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/syslog_logging.h"
-#include "base/task_runner_util.h"
-#include "base/threading/sequenced_worker_pool.h"
+#include "base/task_scheduler/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/policy/upload_job_impl.h"
 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
@@ -21,7 +21,6 @@
 #include "chrome/common/chrome_switches.h"
 #include "components/feedback/anonymizer_tool.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
-#include "content/public/browser/browser_thread.h"
 #include "net/http/http_request_headers.h"
 #include "system_log_uploader.h"
 
@@ -94,9 +93,10 @@
     const LogUploadCallback& upload_callback) {
   // Run ReadFiles() in the thread that interacts with the file system and
   // return system logs to |upload_callback| on the current thread.
-  base::PostTaskAndReplyWithResult(content::BrowserThread::GetBlockingPool(),
-                                   FROM_HERE, base::Bind(&ReadFiles),
-                                   upload_callback);
+  base::PostTaskWithTraitsAndReplyWithResult(
+      FROM_HERE, base::TaskTraits().MayBlock().WithPriority(
+                     base::TaskPriority::BACKGROUND),
+      base::Bind(&ReadFiles), upload_callback);
 }
 
 std::unique_ptr<policy::UploadJob> SystemLogDelegate::CreateUploadJob(
diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc
index 106ff22e..9a9de0d 100644
--- a/chrome/browser/devtools/devtools_sanity_browsertest.cc
+++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc
@@ -64,8 +64,10 @@
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_registry_observer.h"
 #include "extensions/browser/extension_system.h"
 #include "extensions/browser/notification_types.h"
+#include "extensions/browser/test_extension_registry_observer.h"
 #include "extensions/common/switches.h"
 #include "extensions/common/value_builder.h"
 #include "net/dns/mock_host_resolver.h"
@@ -489,23 +491,9 @@
         browser()->profile())->extension_service();
     extensions::ExtensionRegistry* registry =
         extensions::ExtensionRegistry::Get(browser()->profile());
-    size_t num_before = registry->enabled_extensions().size();
-    {
-      content::NotificationRegistrar registrar;
-      registrar.Add(this,
-                    extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED,
-                    content::NotificationService::AllSources());
-      base::CancelableClosure timeout(
-          base::Bind(&TimeoutCallback, "Extension load timed out."));
-      base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-          FROM_HERE, timeout.callback(), TestTimeouts::action_timeout());
-      extensions::UnpackedInstaller::Create(service)->Load(path);
-      content::RunMessageLoop();
-      timeout.Cancel();
-    }
-    size_t num_after = registry->enabled_extensions().size();
-    if (num_after != (num_before + 1))
-      return nullptr;
+    extensions::TestExtensionRegistryObserver observer(registry);
+    extensions::UnpackedInstaller::Create(service)->Load(path);
+    observer.WaitForExtensionLoaded();
 
     if (!WaitForExtensionViewsToLoad())
       return nullptr;
@@ -560,15 +548,9 @@
   void Observe(int type,
                const content::NotificationSource& source,
                const content::NotificationDetails& details) override {
-    switch (type) {
-      case extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED:
-      case extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_FIRST_LOAD:
-        base::MessageLoopForUI::current()->QuitWhenIdle();
-        break;
-      default:
-        NOTREACHED();
-        break;
-    }
+    DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_FIRST_LOAD,
+              type);
+    base::MessageLoopForUI::current()->QuitWhenIdle();
   }
 
   base::FilePath test_extensions_dir_;
diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
index 11caece..1f44504 100644
--- a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
+++ b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "base/memory/linked_ptr.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/extensions/extension_action.h"
 #include "chrome/browser/profiles/profile.h"
@@ -31,10 +30,11 @@
 class ExtensionIndicatorIcon : public StatusIconObserver,
                                public ExtensionActionIconFactory::Observer {
  public:
-  static ExtensionIndicatorIcon* Create(const Extension* extension,
-                                        ExtensionAction* action,
-                                        Profile* profile,
-                                        StatusTray* status_tray);
+  static std::unique_ptr<ExtensionIndicatorIcon> Create(
+      const Extension* extension,
+      ExtensionAction* action,
+      Profile* profile,
+      StatusTray* status_tray);
   ~ExtensionIndicatorIcon() override;
 
   // StatusIconObserver implementation.
@@ -56,7 +56,7 @@
   ExtensionActionIconFactory icon_factory_;
 };
 
-ExtensionIndicatorIcon* ExtensionIndicatorIcon::Create(
+std::unique_ptr<ExtensionIndicatorIcon> ExtensionIndicatorIcon::Create(
     const Extension* extension,
     ExtensionAction* action,
     Profile* profile,
@@ -66,10 +66,10 @@
 
   // Check if a status icon was successfully created.
   if (extension_icon->icon_)
-    return extension_icon.release();
+    return extension_icon;
 
   // We could not create a status icon.
-  return NULL;
+  return std::unique_ptr<ExtensionIndicatorIcon>();
 }
 
 ExtensionIndicatorIcon::~ExtensionIndicatorIcon() {
@@ -183,10 +183,11 @@
     return;
   }
 
-  ExtensionIndicatorIcon* extension_icon = ExtensionIndicatorIcon::Create(
-      extension, extension_action, profile_, status_tray_);
+  std::unique_ptr<ExtensionIndicatorIcon> extension_icon =
+      ExtensionIndicatorIcon::Create(extension, extension_action, profile_,
+                                     status_tray_);
   if (extension_icon)
-    system_indicators_[extension->id()] = make_linked_ptr(extension_icon);
+    system_indicators_[extension->id()] = std::move(extension_icon);
 }
 
 void SystemIndicatorManager::RemoveIndicator(const std::string& extension_id) {
diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h
index 58b0e6b7..fe024985 100644
--- a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h
+++ b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.h
@@ -10,7 +10,6 @@
 
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
-#include "base/memory/linked_ptr.h"
 #include "base/scoped_observer.h"
 #include "base/threading/thread_checker.h"
 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
@@ -68,8 +67,8 @@
   // Causes the indicator for the given extension to be hidden.
   void RemoveIndicator(const std::string& extension_id);
 
-  typedef std::map<const std::string, linked_ptr<ExtensionIndicatorIcon> >
-      SystemIndicatorMap;
+  using SystemIndicatorMap =
+      std::map<const std::string, std::unique_ptr<ExtensionIndicatorIcon>>;
 
   Profile* profile_;
   StatusTray* status_tray_;
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
index aaa3df60..be07e4d 100644
--- a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
+++ b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
@@ -129,7 +129,7 @@
     auto throttle = base::MakeUnique<Throttle>();
     throttle->set_url(url);
     throttles_.push_back(throttle->AsWeakPtr());
-    return throttle;
+    return std::move(throttle);
   }
 
  private:
diff --git a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
index 0126832d..c74a5711 100644
--- a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
@@ -1776,15 +1776,18 @@
   linked_ptr<EventResponseDelta> d0(
       new EventResponseDelta("extid0", base::Time::FromInternalValue(2500)));
   deltas.push_back(d0);
+  bool request_headers_modified0;
   net::HttpRequestHeaders headers0;
   headers0.MergeFrom(base_headers);
-  MergeOnBeforeSendHeadersResponses(deltas, &headers0, &warning_set, &net_log);
+  MergeOnBeforeSendHeadersResponses(deltas, &headers0, &warning_set, &net_log,
+                                    &request_headers_modified0);
   ASSERT_TRUE(headers0.GetHeader("key1", &header_value));
   EXPECT_EQ("value 1", header_value);
   ASSERT_TRUE(headers0.GetHeader("key2", &header_value));
   EXPECT_EQ("value 2", header_value);
   EXPECT_EQ(0u, warning_set.size());
   EXPECT_EQ(0u, capturing_net_log.GetSize());
+  EXPECT_FALSE(request_headers_modified0);
 
   // Delete, modify and add a header.
   linked_ptr<EventResponseDelta> d1(
@@ -1796,9 +1799,11 @@
   deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
   warning_set.clear();
   capturing_net_log.Clear();
+  bool request_headers_modified1;
   net::HttpRequestHeaders headers1;
   headers1.MergeFrom(base_headers);
-  MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log);
+  MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log,
+                                    &request_headers_modified1);
   EXPECT_FALSE(headers1.HasHeader("key1"));
   ASSERT_TRUE(headers1.GetHeader("key2", &header_value));
   EXPECT_EQ("value 3", header_value);
@@ -1806,6 +1811,7 @@
   EXPECT_EQ("value 3", header_value);
   EXPECT_EQ(0u, warning_set.size());
   EXPECT_EQ(1u, capturing_net_log.GetSize());
+  EXPECT_TRUE(request_headers_modified1);
 
   // Check that conflicts are atomic, i.e. if one header modification
   // collides all other conflicts of the same extension are declined as well.
@@ -1818,9 +1824,11 @@
   deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
   warning_set.clear();
   capturing_net_log.Clear();
+  bool request_headers_modified2;
   net::HttpRequestHeaders headers2;
   headers2.MergeFrom(base_headers);
-  MergeOnBeforeSendHeadersResponses(deltas, &headers2, &warning_set, &net_log);
+  MergeOnBeforeSendHeadersResponses(deltas, &headers2, &warning_set, &net_log,
+                                    &request_headers_modified2);
   EXPECT_FALSE(headers2.HasHeader("key1"));
   ASSERT_TRUE(headers2.GetHeader("key2", &header_value));
   EXPECT_EQ("value 3", header_value);
@@ -1830,6 +1838,7 @@
   EXPECT_EQ(1u, warning_set.size());
   EXPECT_TRUE(HasWarning(warning_set, "extid2"));
   EXPECT_EQ(2u, capturing_net_log.GetSize());
+  EXPECT_TRUE(request_headers_modified2);
 
   // Check that identical modifications don't conflict and operations
   // can be merged.
@@ -1842,9 +1851,11 @@
   deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
   warning_set.clear();
   capturing_net_log.Clear();
+  bool request_headers_modified3;
   net::HttpRequestHeaders headers3;
   headers3.MergeFrom(base_headers);
-  MergeOnBeforeSendHeadersResponses(deltas, &headers3, &warning_set, &net_log);
+  MergeOnBeforeSendHeadersResponses(deltas, &headers3, &warning_set, &net_log,
+                                    &request_headers_modified3);
   EXPECT_FALSE(headers3.HasHeader("key1"));
   ASSERT_TRUE(headers3.GetHeader("key2", &header_value));
   EXPECT_EQ("value 3", header_value);
@@ -1855,6 +1866,7 @@
   EXPECT_EQ(1u, warning_set.size());
   EXPECT_TRUE(HasWarning(warning_set, "extid2"));
   EXPECT_EQ(3u, capturing_net_log.GetSize());
+  EXPECT_TRUE(request_headers_modified3);
 }
 
 TEST(ExtensionWebRequestHelpersTest,
@@ -1907,15 +1919,18 @@
     deltas.push_back(delta);
   }
   deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
+  bool request_headers_modified1;
   net::HttpRequestHeaders headers1;
   headers1.MergeFrom(base_headers);
   warning_set.clear();
-  MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log);
+  MergeOnBeforeSendHeadersResponses(deltas, &headers1, &warning_set, &net_log,
+                                    &request_headers_modified1);
   EXPECT_TRUE(headers1.HasHeader("Cookie"));
   ASSERT_TRUE(headers1.GetHeader("Cookie", &header_value));
   EXPECT_EQ("name=new value; name2=new value; name4=\"value 4\"", header_value);
   EXPECT_EQ(0u, warning_set.size());
   EXPECT_EQ(0u, capturing_net_log.GetSize());
+  EXPECT_FALSE(request_headers_modified1);
 }
 
 namespace {
@@ -2201,15 +2216,18 @@
   linked_ptr<EventResponseDelta> d0(
       new EventResponseDelta("extid0", base::Time::FromInternalValue(3000)));
   deltas.push_back(d0);
+  bool response_headers_modified0;
   scoped_refptr<net::HttpResponseHeaders> new_headers0;
   GURL allowed_unsafe_redirect_url0;
   MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(),
                                   &new_headers0, &allowed_unsafe_redirect_url0,
-                                  &warning_set, &net_log);
+                                  &warning_set, &net_log,
+                                  &response_headers_modified0);
   EXPECT_FALSE(new_headers0.get());
   EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty());
   EXPECT_EQ(0u, warning_set.size());
   EXPECT_EQ(0u, capturing_net_log.GetSize());
+  EXPECT_FALSE(response_headers_modified0);
 
   linked_ptr<EventResponseDelta> d1(
       new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
@@ -2220,11 +2238,13 @@
   deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
   warning_set.clear();
   capturing_net_log.Clear();
+  bool response_headers_modified1;
   scoped_refptr<net::HttpResponseHeaders> new_headers1;
   GURL allowed_unsafe_redirect_url1;
   MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(),
                                   &new_headers1, &allowed_unsafe_redirect_url1,
-                                  &warning_set, &net_log);
+                                  &warning_set, &net_log,
+                                  &response_headers_modified1);
   ASSERT_TRUE(new_headers1.get());
   EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty());
   std::multimap<std::string, std::string> expected1;
@@ -2239,6 +2259,7 @@
   EXPECT_EQ(expected1, actual1);
   EXPECT_EQ(0u, warning_set.size());
   EXPECT_EQ(1u, capturing_net_log.GetSize());
+  EXPECT_TRUE(response_headers_modified1);
 
   // Check that we replace response headers only once.
   linked_ptr<EventResponseDelta> d2(
@@ -2251,11 +2272,13 @@
   deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
   warning_set.clear();
   capturing_net_log.Clear();
+  bool response_headers_modified2;
   scoped_refptr<net::HttpResponseHeaders> new_headers2;
   GURL allowed_unsafe_redirect_url2;
   MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(),
                                   &new_headers2, &allowed_unsafe_redirect_url2,
-                                  &warning_set, &net_log);
+                                  &warning_set, &net_log,
+                                  &response_headers_modified2);
   ASSERT_TRUE(new_headers2.get());
   EXPECT_TRUE(allowed_unsafe_redirect_url2.is_empty());
   iter = 0;
@@ -2267,6 +2290,7 @@
   EXPECT_EQ(1u, warning_set.size());
   EXPECT_TRUE(HasWarning(warning_set, "extid2"));
   EXPECT_EQ(2u, capturing_net_log.GetSize());
+  EXPECT_TRUE(response_headers_modified2);
 }
 
 // Check that we do not delete too much
@@ -2294,11 +2318,13 @@
       new EventResponseDelta("extid1", base::Time::FromInternalValue(2000)));
   d1->deleted_response_headers.push_back(ResponseHeader("KEY1", "Value2"));
   deltas.push_back(d1);
+  bool response_headers_modified1;
   scoped_refptr<net::HttpResponseHeaders> new_headers1;
   GURL allowed_unsafe_redirect_url1;
   MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(),
                                   &new_headers1, &allowed_unsafe_redirect_url1,
-                                  &warning_set, &net_log);
+                                  &warning_set, &net_log,
+                                  &response_headers_modified1);
   ASSERT_TRUE(new_headers1.get());
   EXPECT_TRUE(allowed_unsafe_redirect_url1.is_empty());
   std::multimap<std::string, std::string> expected1;
@@ -2315,6 +2341,7 @@
   EXPECT_EQ(expected1, actual1);
   EXPECT_EQ(0u, warning_set.size());
   EXPECT_EQ(1u, capturing_net_log.GetSize());
+  EXPECT_TRUE(response_headers_modified1);
 }
 
 // Tests whether onHeadersReceived can initiate a redirect.
@@ -2338,15 +2365,18 @@
   linked_ptr<EventResponseDelta> d0(
       new EventResponseDelta("extid0", base::Time::FromInternalValue(0)));
   deltas.push_back(d0);
+  bool response_headers_modified0;
   scoped_refptr<net::HttpResponseHeaders> new_headers0;
   GURL allowed_unsafe_redirect_url0;
   MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(),
                                   &new_headers0, &allowed_unsafe_redirect_url0,
-                                  &warning_set, &net_log);
+                                  &warning_set, &net_log,
+                                  &response_headers_modified0);
   EXPECT_FALSE(new_headers0.get());
   EXPECT_TRUE(allowed_unsafe_redirect_url0.is_empty());
   EXPECT_EQ(0u, warning_set.size());
   EXPECT_EQ(0u, capturing_net_log.GetSize());
+  EXPECT_FALSE(response_headers_modified0);
 
   // Single redirect.
   GURL new_url_1("http://foo.com");
@@ -2356,17 +2386,20 @@
   deltas.push_back(d1);
   deltas.sort(&InDecreasingExtensionInstallationTimeOrder);
   capturing_net_log.Clear();
+  bool response_headers_modified1;
   scoped_refptr<net::HttpResponseHeaders> new_headers1;
   GURL allowed_unsafe_redirect_url1;
   MergeOnHeadersReceivedResponses(GURL(kExampleUrl), deltas, base_headers.get(),
                                   &new_headers1, &allowed_unsafe_redirect_url1,
-                                  &warning_set, &net_log);
+                                  &warning_set, &net_log,
+                                  &response_headers_modified1);
 
   EXPECT_TRUE(new_headers1.get());
   EXPECT_TRUE(new_headers1->HasHeaderValue("Location", new_url_1.spec()));
   EXPECT_EQ(new_url_1, allowed_unsafe_redirect_url1);
   EXPECT_TRUE(warning_set.empty());
   EXPECT_EQ(1u, capturing_net_log.GetSize());
+  EXPECT_FALSE(response_headers_modified1);
 }
 
 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) {
diff --git a/chrome/browser/media/cast_remoting_connector_fuzzertest.cc b/chrome/browser/media/cast_remoting_connector_fuzzertest.cc
index 8719100..d43cf95c 100644
--- a/chrome/browser/media/cast_remoting_connector_fuzzertest.cc
+++ b/chrome/browser/media/cast_remoting_connector_fuzzertest.cc
@@ -15,6 +15,7 @@
   // Make sure the compiler does not try to optimize-away calls by storing their
   // results in a volatile variable.
   volatile unsigned int ignored_result;
+  (void)ignored_result;
 
   using Messaging = CastRemotingConnectorMessaging;
 
diff --git a/chrome/browser/net/net_error_tab_helper.cc b/chrome/browser/net/net_error_tab_helper.cc
index 2cac81c..7453d790 100644
--- a/chrome/browser/net/net_error_tab_helper.cc
+++ b/chrome/browser/net/net_error_tab_helper.cc
@@ -296,12 +296,11 @@
       offline_pages::RequestCoordinatorFactory::GetForBrowserContext(
           web_contents()->GetBrowserContext());
   DCHECK(request_coordinator) << "No RequestCoordinator for SavePageLater";
-  offline_pages::ClientId client_id(
-      offline_pages::kAsyncNamespace, base::GenerateGUID());
-  request_coordinator->SavePageLater(
-      page_url, client_id, true /*user_requested*/,
-      offline_pages::RequestCoordinator::RequestAvailability::
-          ENABLED_FOR_OFFLINER);
+  offline_pages::RequestCoordinator::SavePageLaterParams params;
+  params.url = page_url;
+  params.client_id = offline_pages::ClientId(offline_pages::kAsyncNamespace,
+                                             base::GenerateGUID());
+  request_coordinator->SavePageLater(params);
 }
 #endif  // defined(OS_ANDROID)
 
diff --git a/chrome/browser/previews/previews_service.cc b/chrome/browser/previews/previews_service.cc
index ae9f773..bfc31ea 100644
--- a/chrome/browser/previews/previews_service.cc
+++ b/chrome/browser/previews/previews_service.cc
@@ -29,10 +29,11 @@
     const base::FilePath& profile_path) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
+  base::SequencedWorkerPool* blocking_pool =
+      content::BrowserThread::GetBlockingPool();
   // Get the background thread to run SQLite on.
   scoped_refptr<base::SequencedTaskRunner> background_task_runner =
-      content::BrowserThread::GetBlockingPool()->GetSequencedTaskRunner(
-          content::BrowserThread::GetBlockingPool()->GetSequenceToken());
+      blocking_pool->GetSequencedTaskRunner(blocking_pool->GetSequenceToken());
 
   previews_ui_service_ = base::MakeUnique<previews::PreviewsUIService>(
       previews_io_data, io_task_runner,
diff --git a/chrome/browser/resources/md_history/app.js b/chrome/browser/resources/md_history/app.js
index e13e57a3..058bd546 100644
--- a/chrome/browser/resources/md_history/app.js
+++ b/chrome/browser/resources/md_history/app.js
@@ -88,7 +88,6 @@
     'history-checkbox-select': 'checkboxSelected',
     'history-close-drawer': 'closeDrawer_',
     'history-view-changed': 'historyViewChanged_',
-    'opened-changed': 'onOpenedChanged_',
     'unselect-all': 'unselectAll',
   },
 
@@ -158,15 +157,7 @@
     var drawer = /** @type {!CrDrawerElement} */ (this.$.drawer.get());
     drawer.align = document.documentElement.dir == 'ltr' ? 'left' : 'right';
     drawer.toggle();
-  },
-
-  /**
-   * @param {!CustomEvent} e
-   * @private
-   */
-  onOpenedChanged_: function(e) {
-    if (e.detail.value)
-      this.showMenuPromo_ = false;
+    this.showMenuPromo_ = false;
   },
 
   /**
diff --git a/chrome/browser/resources/welcome/win10/inline.css b/chrome/browser/resources/welcome/win10/inline.css
index ac9ce13..1b4ad1d 100644
--- a/chrome/browser/resources/welcome/win10/inline.css
+++ b/chrome/browser/resources/welcome/win10/inline.css
@@ -15,6 +15,7 @@
 
 a {
   color: var(--google-blue-500);
+  cursor: pointer;
   text-decoration: none;
 }
 
diff --git a/chrome/browser/resources/welcome/win10/inline.html b/chrome/browser/resources/welcome/win10/inline.html
index eec0458d9..dd31a554 100644
--- a/chrome/browser/resources/welcome/win10/inline.html
+++ b/chrome/browser/resources/welcome/win10/inline.html
@@ -20,6 +20,8 @@
   <script src="/welcome.js"></script>
 </head>
 <body>
+  <!-- TODO(tmartino): Create a dom-module and transfer contents of inline.css
+       inside.-->
   <template is="dom-bind" id="inline-app">
     <div class="content">
       <div class="header-logo"></div>
diff --git a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
index 04b77aa..38c6a7f 100644
--- a/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
+++ b/chrome/browser/subresource_filter/subresource_filter_browsertest.cc
@@ -423,8 +423,8 @@
   base::HistogramTester tester;
   ui_test_utils::NavigateToURL(browser(), url);
 
-  const auto kSubframeNames = {"one", "two", "three"};
-  const auto kExpectScriptInFrameToLoad = {false, true, false};
+  const std::vector<const char*> kSubframeNames{"one", "two", "three"};
+  const std::vector<bool> kExpectScriptInFrameToLoad{false, true, false};
   ASSERT_NO_FATAL_FAILURE(ExpectParsedScriptElementLoadedStatusInFrames(
       kSubframeNames, kExpectScriptInFrameToLoad));
 
@@ -440,9 +440,11 @@
   ASSERT_NO_FATAL_FAILURE(
       SetRulesetToDisallowURLsWithPathSuffix("included_script.js"));
 
-  const auto kSubframeNames = {"one", "two", "three"};
-  const auto kExpectScriptInFrameToLoadWithoutActivation = {true, true, true};
-  const auto kExpectScriptInFrameToLoadWithActivation = {false, true, false};
+  const std::vector<const char*> kSubframeNames{"one", "two", "three"};
+  const std::vector<bool> kExpectScriptInFrameToLoadWithoutActivation{
+      true, true, true};
+  const std::vector<bool> kExpectScriptInFrameToLoadWithActivation{false, true,
+                                                                   false};
 
   ui_test_utils::NavigateToURL(browser(), url_without_activation);
   ASSERT_NO_FATAL_FAILURE(ExpectParsedScriptElementLoadedStatusInFrames(
@@ -489,8 +491,8 @@
   ASSERT_NO_FATAL_FAILURE(
       SetRulesetToDisallowURLsWithPathSuffix("included_script.js"));
 
-  const auto kSubframeNames = {"one", "two", "three"};
-  const auto kExpectScriptInFrameToLoad = {true, true, true};
+  const std::vector<const char*> kSubframeNames{"one", "two", "three"};
+  const std::vector<bool> kExpectScriptInFrameToLoad{true, true, true};
 
   for (const auto& url_with_activation :
        {url_with_activation_but_dns_error,
@@ -627,8 +629,8 @@
   ASSERT_NO_FATAL_FAILURE(
       SetRulesetToDisallowURLsWithPathSuffix("included_script.js"));
   ui_test_utils::NavigateToURL(browser(), a_url);
-  ExpectParsedScriptElementLoadedStatusInFrames({"b", "c", "d"},
-                                                {false, false, false});
+  ExpectParsedScriptElementLoadedStatusInFrames(
+      std::vector<const char*>{"b", "c", "d"}, {false, false, false});
 }
 
 IN_PROC_BROWSER_TEST_F(SubresourceFilterBrowserTest,
@@ -640,7 +642,8 @@
       SetRulesetWithRules({testing::CreateSuffixRule("included_script.js"),
                            testing::CreateWhitelistRuleForDocument("c.com")}));
   ui_test_utils::NavigateToURL(browser(), a_url);
-  ExpectParsedScriptElementLoadedStatusInFrames({"b", "d"}, {false, true});
+  ExpectParsedScriptElementLoadedStatusInFrames(
+      std::vector<const char*>{"b", "d"}, {false, true});
 }
 
 // Tests checking how histograms are recorded. ---------------------------------
diff --git a/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc
index 5e043d92..4efb236 100644
--- a/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc
+++ b/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc
@@ -66,7 +66,17 @@
     : LauncherItemController(extension_misc::kChromeAppId,
                              std::string(),
                              launcher_controller),
-      shelf_model_(shelf_model) {}
+      shelf_model_(shelf_model) {
+  // Tag all open browser windows with the appropriate shelf id property. This
+  // associates each window with the shelf item for the active web contents.
+  for (auto* browser : *BrowserList::GetInstance()) {
+    if (IsBrowserRepresentedInBrowserList(browser) &&
+        browser->tab_strip_model()->GetActiveWebContents()) {
+      SetShelfIDForBrowserWindowContents(
+          browser, browser->tab_strip_model()->GetActiveWebContents());
+    }
+  }
+}
 
 BrowserShortcutLauncherItemController::
     ~BrowserShortcutLauncherItemController() {}
@@ -279,10 +289,12 @@
     return false;
 
   // v1 App popup windows with a valid app id have their own icon.
-  if (browser->is_app() && browser->is_type_popup() &&
-      ash::WmShell::Get()->shelf_delegate()->GetShelfIDForAppID(
-          web_app::GetExtensionIdFromApplicationName(browser->app_name())) > 0)
+  ash::ShelfDelegate* delegate = ash::WmShell::Get()->shelf_delegate();
+  if (browser->is_app() && browser->is_type_popup() && delegate &&
+      delegate->GetShelfIDForAppID(web_app::GetExtensionIdFromApplicationName(
+          browser->app_name())) > 0) {
     return false;
+  }
 
   // Settings browsers have their own icon.
   if (IsSettingsBrowser(browser))
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
index b204f527..8f7d0e4 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
@@ -2151,9 +2151,7 @@
 }
 
 // Check that the window's ShelfID property matches that of the active tab.
-// TODO(https://crbug.com/694941): Disabled due to flakiness.
-IN_PROC_BROWSER_TEST_F(ShelfAppBrowserTest,
-                       DISABLED_MatchingShelfIDandActiveTab) {
+IN_PROC_BROWSER_TEST_F(ShelfAppBrowserTest, MatchingShelfIDandActiveTab) {
   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
   EXPECT_EQ(1, browser()->tab_strip_model()->count());
   EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
diff --git a/chrome/browser/ui/cocoa/external_protocol_dialog_cocoa.mm b/chrome/browser/ui/cocoa/external_protocol_dialog_cocoa.mm
index 8b451e59..e3d7b8f 100644
--- a/chrome/browser/ui/cocoa/external_protocol_dialog_cocoa.mm
+++ b/chrome/browser/ui/cocoa/external_protocol_dialog_cocoa.mm
@@ -97,22 +97,26 @@
 
   content::WebContents* web_contents =
       tab_util::GetWebContentsByID(render_process_host_id_, routing_id_);
-  Profile* profile =
-      Profile::FromBrowserContext(web_contents->GetBrowserContext());
 
-  bool isChecked = [[alert_ suppressionButton] state] == NSOnState;
-  // Set the "don't warn me again" info.
-  if (isChecked)
-    ExternalProtocolHandler::SetBlockState(url_.scheme(), blockState, profile);
+  if (web_contents) {
+    Profile* profile =
+        Profile::FromBrowserContext(web_contents->GetBrowserContext());
+    bool isChecked = [[alert_ suppressionButton] state] == NSOnState;
+    // Set the "don't warn me again" info.
+    if (isChecked)
+      ExternalProtocolHandler::SetBlockState(url_.scheme(), blockState,
+                                             profile);
 
-  ExternalProtocolHandler::RecordCheckboxStateMetrics(isChecked);
-  ExternalProtocolHandler::RecordHandleStateMetrics(isChecked, blockState);
+    ExternalProtocolHandler::RecordCheckboxStateMetrics(isChecked);
+    ExternalProtocolHandler::RecordHandleStateMetrics(isChecked, blockState);
 
-  if (blockState == ExternalProtocolHandler::DONT_BLOCK) {
-    UMA_HISTOGRAM_LONG_TIMES("clickjacking.launch_url",
-                             base::Time::Now() - creation_time_);
+    if (blockState == ExternalProtocolHandler::DONT_BLOCK) {
+      UMA_HISTOGRAM_LONG_TIMES("clickjacking.launch_url",
+                               base::Time::Now() - creation_time_);
 
-    ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(url_, web_contents);
+      ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(url_,
+                                                             web_contents);
+    }
   }
 
   [self autorelease];
diff --git a/chrome/browser/ui/libgtkui/gtk_ui.cc b/chrome/browser/ui/libgtkui/gtk_ui.cc
index 9bdb18c..c1c6be7 100644
--- a/chrome/browser/ui/libgtkui/gtk_ui.cc
+++ b/chrome/browser/ui/libgtkui/gtk_ui.cc
@@ -657,7 +657,7 @@
             : nullptr);
   }
 
-  return gtk_border;
+  return std::move(gtk_border);
 }
 
 void GtkUi::AddWindowButtonOrderObserver(
diff --git a/chrome/browser/ui/test/test_browser_dialog.h b/chrome/browser/ui/test/test_browser_dialog.h
index d071a80..0e9daa2 100644
--- a/chrome/browser/ui/test/test_browser_dialog.h
+++ b/chrome/browser/ui/test/test_browser_dialog.h
@@ -52,7 +52,7 @@
 //
 // Dialogs listed can be shown interactively using the --dialog argument. E.g.
 //
-//   browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive \
+//   browser_tests --gtest_filter=BrowserDialogTest.Invoke --interactive
 //       --dialog=FooDialogTest.InvokeDialog_name
 class TestBrowserDialog {
  protected:
diff --git a/chrome/browser/ui/views/webshare/webshare_target_picker_view.h b/chrome/browser/ui/views/webshare/webshare_target_picker_view.h
index 18464cf3..6e4db2e 100644
--- a/chrome/browser/ui/views/webshare/webshare_target_picker_view.h
+++ b/chrome/browser/ui/views/webshare/webshare_target_picker_view.h
@@ -17,15 +17,12 @@
 
 class GURL;
 class TargetPickerTableModel;
+class WebShareTargetPickerViewTest;
 
 namespace views {
 class TableView;
 }
 
-namespace {
-class WebShareTargetPickerViewTest;
-}
-
 // Dialog that presents the user with a list of share target apps. Allows the
 // user to pick one target to be opened and have data passed to it.
 //
diff --git a/chrome/browser/ui/views/webshare/webshare_target_picker_view_unittest.cc b/chrome/browser/ui/views/webshare/webshare_target_picker_view_unittest.cc
index a8d04789..130f70f 100644
--- a/chrome/browser/ui/views/webshare/webshare_target_picker_view_unittest.cc
+++ b/chrome/browser/ui/views/webshare/webshare_target_picker_view_unittest.cc
@@ -24,8 +24,6 @@
 #include "ui/views/window/dialog_delegate.h"
 #include "url/gurl.h"
 
-namespace {
-
 class WebShareTargetPickerViewTest : public views::ViewsTestBase {
  public:
   WebShareTargetPickerViewTest() {}
@@ -169,5 +167,3 @@
   EXPECT_EQ(base::Optional<std::string>("https://appone.com/path/bits"),
             result());
 }
-
-}  // namespace
diff --git a/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc b/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc
index 7d6a0b8..3a1bee5 100644
--- a/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc
+++ b/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc
@@ -167,6 +167,8 @@
       save_page_request->SetDouble("lastAttempt",
                                    request->last_attempt_time().ToJsTime());
       save_page_request->SetString("id", std::to_string(request->request_id()));
+      save_page_request->SetString("originalUrl",
+                                   request->original_url().spec());
     }
   }
   ResolveJavascriptCallback(base::StringValue(callback_id), save_page_requests);
@@ -282,13 +284,13 @@
     std::ostringstream id_stream;
     id_stream << base::GenerateGUID();
 
+    offline_pages::RequestCoordinator::SavePageLaterParams params;
+    params.url = GURL(url);
+    params.client_id = offline_pages::ClientId(offline_pages::kAsyncNamespace,
+                                               id_stream.str());
     ResolveJavascriptCallback(
-        *callback_id,
-        base::FundamentalValue(request_coordinator_->SavePageLater(
-                GURL(url), offline_pages::ClientId(
-                               offline_pages::kAsyncNamespace, id_stream.str()),
-                true, offline_pages::RequestCoordinator::RequestAvailability::
-                          ENABLED_FOR_OFFLINER) > 0));
+        *callback_id, base::FundamentalValue(
+                          request_coordinator_->SavePageLater(params) > 0));
   } else {
     ResolveJavascriptCallback(*callback_id, base::FundamentalValue(false));
   }
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc
index 1d33be5d..fd07196c 100644
--- a/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -662,6 +662,28 @@
     return;
   }
 
+  // Early exit if there is already a preferences push pending sync startup.
+  if (sync_startup_tracker_)
+    return;
+
+  if (!service->IsEngineInitialized()) {
+    // Requesting the sync service to start may trigger call to PushSyncPrefs.
+    // Setting up the startup tracker beforehand correctly signals the
+    // re-entrant call to early exit.
+    sync_startup_tracker_.reset(new SyncStartupTracker(profile_, this));
+    service->RequestStart();
+
+    // See if it's even possible to bring up the sync engine - if not
+    // (unrecoverable error?), don't bother displaying a spinner that will be
+    // immediately closed because this leads to some ugly infinite UI loop (see
+    // http://crbug.com/244769).
+    if (SyncStartupTracker::GetSyncServiceState(profile_) !=
+        SyncStartupTracker::SYNC_STARTUP_ERROR) {
+      DisplaySpinner();
+    }
+    return;
+  }
+
   // User is already logged in. They must have brought up the config wizard
   // via the "Advanced..." button or through One-Click signin (cases 4-6), or
   // they are re-enabling sync after having disabled it (case 7).
@@ -770,30 +792,9 @@
   }
 #endif
 
-  // Early exit if there is already a preferences push pending sync startup.
-  if (sync_startup_tracker_)
-    return;
-
   ProfileSyncService* service = GetSyncService();
   // The sync service may be nullptr if it has been just disabled by policy.
-  if (!service)
-    return;
-
-  if (!service->IsEngineInitialized()) {
-    // Requesting the sync service to start may trigger another reentrant call
-    // to PushSyncPrefs. Setting up the startup tracker beforehand correctly
-    // signals the re-entrant call to early exit.
-    sync_startup_tracker_.reset(new SyncStartupTracker(profile_, this));
-    service->RequestStart();
-
-    // See if it's even possible to bring up the sync engine - if not
-    // (unrecoverable error?), don't bother displaying a spinner that will be
-    // immediately closed because this leads to some ugly infinite UI loop (see
-    // http://crbug.com/244769).
-    if (SyncStartupTracker::GetSyncServiceState(profile_) !=
-        SyncStartupTracker::SYNC_STARTUP_ERROR) {
-      DisplaySpinner();
-    }
+  if (!service || !service->IsEngineInitialized()) {
     return;
   }
 
diff --git a/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
index c99641ff..45c7fc1 100644
--- a/chrome/browser/ui/webui/settings/people_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -291,6 +291,8 @@
       handler_->sync_startup_tracker_->OnStateChanged(mock_pss_);
   }
 
+  void NotifySyncStateChanged() { handler_->OnStateChanged(mock_pss_); }
+
   virtual std::string GetTestUser() {
     return std::string(kTestUser);
   }
@@ -370,6 +372,7 @@
   EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false));
   error_ = GoogleServiceAuthError::AuthErrorNone();
   EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false));
+  EXPECT_CALL(*mock_pss_, RequestStart());
 
   // We're simulating a user setting up sync, which would cause the engine to
   // kick off initialization, but not download user data types. The sync
@@ -394,6 +397,7 @@
   error_ = GoogleServiceAuthError::AuthErrorNone();
   // Sync engine is stopped initially, and will start up.
   EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false));
+  EXPECT_CALL(*mock_pss_, RequestStart());
   SetDefaultExpectationsForConfigPage();
 
   handler_->OpenSyncSetup();
@@ -431,6 +435,7 @@
   EXPECT_CALL(*mock_pss_, IsEngineInitialized())
       .WillOnce(Return(false))
       .WillRepeatedly(Return(true));
+  EXPECT_CALL(*mock_pss_, RequestStart());
   SetDefaultExpectationsForConfigPage();
   handler_->OpenSyncSetup();
 
@@ -451,6 +456,7 @@
   EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false));
   error_ = GoogleServiceAuthError::AuthErrorNone();
   EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false));
+  EXPECT_CALL(*mock_pss_, RequestStart());
 
   handler_->OpenSyncSetup();
   ExpectPageStatusChanged(PeopleHandler::kSpinnerPageStatus);
@@ -466,6 +472,14 @@
                 profile_)->current_login_ui());
 }
 
+// Tests that signals not related to user intention to configure sync don't
+// trigger sync engine start.
+TEST_F(PeopleHandlerTest, OnlyStartEngineWhenConfiguringSync) {
+  EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false));
+  EXPECT_CALL(*mock_pss_, RequestStart()).Times(0);
+  NotifySyncStateChanged();
+}
+
 #if !defined(OS_CHROMEOS)
 
 class PeopleHandlerNonCrosTest : public PeopleHandlerTest {
diff --git a/chrome/browser/ui/webui/welcome_win10_handler.cc b/chrome/browser/ui/webui/welcome_win10_handler.cc
index a72f45c5..e57e746 100644
--- a/chrome/browser/ui/webui/welcome_win10_handler.cc
+++ b/chrome/browser/ui/webui/welcome_win10_handler.cc
@@ -104,14 +104,14 @@
   }
 
   // Only wait for a small amount of time for the result. If the timer fires,
-  // it will be assumed that Chrome is pinned to the taskbar. This is to make
-  // sure the instructions are never displayed in case it was impossible to
-  // determine the pinned state.
+  // it will be assumed that Chrome isn't pinned to the taskbar. This is to make
+  // sure the instructions are displayed in case it was impossible to determine
+  // the pinned state.
   constexpr base::TimeDelta kPinnedToTaskbarTimeout =
       base::TimeDelta::FromMilliseconds(200);
   timer_.Start(FROM_HERE, kPinnedToTaskbarTimeout,
                base::Bind(&WelcomeWin10Handler::OnIsPinnedToTaskbarDetermined,
-                          base::Unretained(this), true, true));
+                          base::Unretained(this), true, false));
 }
 
 void WelcomeWin10Handler::HandleSetDefaultBrowser(const base::ListValue* args) {
diff --git a/chrome/test/data/webui/md_history/history_toolbar_test.js b/chrome/test/data/webui/md_history/history_toolbar_test.js
index 1d971d71..f2dfa7ef 100644
--- a/chrome/test/data/webui/md_history/history_toolbar_test.js
+++ b/chrome/test/data/webui/md_history/history_toolbar_test.js
@@ -101,6 +101,14 @@
     assertTrue(notice.hidden);
   });
 
+  test('menu promo hides when drawer is opened', function() {
+    app.showMenuPromo_ = true;
+    app.hasDrawer_ = true;
+    Polymer.dom.flush();
+    MockInteractions.tap(toolbar.$['main-toolbar'].$$('#menuButton'));
+    assertFalse(app.showMenuPromo_);
+  });
+
   teardown(function() {
     registerMessageCallback('queryHistory', this, function() {});
   });
diff --git a/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc b/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc
index 7418f1f..ab40288 100644
--- a/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc
+++ b/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc
@@ -21,6 +21,7 @@
 #include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/test/scoped_task_scheduler.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_checker.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -232,6 +233,7 @@
 
   void OnPauseCompleted();
 
+  base::test::ScopedTaskScheduler task_scheduler_;
   MediaPipelineDeviceParams::MediaSyncType sync_type_;
   MediaPipelineDeviceParams::AudioStreamType audio_type_;
   std::unique_ptr<TaskRunnerImpl> task_runner_;
@@ -903,8 +905,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, Mp3Playback) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForAudioOnly("sfx.mp3");
   PauseBeforeEos();
@@ -913,8 +913,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, AacPlayback) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForAudioOnly("sfx.m4a");
   PauseBeforeEos();
@@ -923,8 +921,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, VorbisPlayback) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeIgnorePts);
   ConfigureForAudioOnly("sfx.ogg");
   Start();
@@ -934,8 +930,6 @@
 // TODO(kmackay) FFmpegDemuxForTest can't handle AC3 or EAC3.
 
 TEST_F(AudioVideoPipelineDeviceTest, OpusPlayback_Optional) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForAudioOnly("bear-opus.ogg");
   PauseBeforeEos();
@@ -944,8 +938,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, FlacPlayback_Optional) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForAudioOnly("bear.flac");
   PauseBeforeEos();
@@ -954,8 +946,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, H264Playback) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForVideoOnly("bear.h264", true /* raw_h264 */);
   PauseBeforeEos();
@@ -964,8 +954,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, WebmPlaybackWithPause) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   // Setup to pause for 100ms every 500ms
   AddPause(base::TimeDelta::FromMilliseconds(500),
@@ -977,8 +965,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, Vp8Playback) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForVideoOnly("bear-vp8a.webm", false /* raw_h264 */);
   Start();
@@ -986,8 +972,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, WebmPlayback) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForFile("bear-640x360.webm");
   PauseBeforeEos();
@@ -998,7 +982,6 @@
 // TODO(kmackay) FFmpegDemuxForTest can't handle HEVC or VP9.
 
 TEST_F(AudioVideoPipelineDeviceTest, AudioBackendStates) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
   Initialize();
   MediaPipelineBackend::AudioDecoder* audio_decoder =
       backend()->CreateAudioDecoder();
@@ -1015,7 +998,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, AudioEffectsBackendStates) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
   set_audio_type(MediaPipelineDeviceParams::kAudioStreamSoundEffects);
   set_sync_type(MediaPipelineDeviceParams::kModeIgnorePts);
   Initialize();
@@ -1033,7 +1015,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, VideoBackendStates) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
   Initialize();
   MediaPipelineBackend::VideoDecoder* video_decoder =
       backend()->CreateVideoDecoder();
@@ -1050,7 +1031,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, AudioImmediateEos) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
   Initialize();
   MediaPipelineBackend::AudioDecoder* audio_decoder =
       backend()->CreateAudioDecoder();
@@ -1063,10 +1043,10 @@
   SetAudioFeeder(std::move(feeder));
 
   StartImmediateEosTest();
+  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, VideoImmediateEos) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
   Initialize();
   MediaPipelineBackend::VideoDecoder* video_decoder =
       backend()->CreateVideoDecoder();
@@ -1079,11 +1059,10 @@
   SetVideoFeeder(std::move(feeder));
 
   StartImmediateEosTest();
+  base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, Mp3Playback_WithEffectsStreams) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForAudioOnly("sfx.mp3");
   PauseBeforeEos();
@@ -1093,8 +1072,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, AacPlayback_WithEffectsStreams) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForAudioOnly("sfx.m4a");
   PauseBeforeEos();
@@ -1104,8 +1081,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, VorbisPlayback_WithEffectsStreams) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeIgnorePts);
   ConfigureForAudioOnly("sfx.ogg");
   AddEffectsStreams();
@@ -1116,8 +1091,6 @@
 // TODO(kmackay) FFmpegDemuxForTest can't handle AC3 or EAC3.
 
 TEST_F(AudioVideoPipelineDeviceTest, OpusPlayback_WithEffectsStreams_Optional) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForAudioOnly("bear-opus.ogg");
   PauseBeforeEos();
@@ -1127,8 +1100,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, FlacPlayback_WithEffectsStreams_Optional) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForAudioOnly("bear.flac");
   PauseBeforeEos();
@@ -1138,8 +1109,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, H264Playback_WithEffectsStreams) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForVideoOnly("bear.h264", true /* raw_h264 */);
   PauseBeforeEos();
@@ -1149,8 +1118,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, WebmPlaybackWithPause_WithEffectsStreams) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   // Setup to pause for 100ms every 500ms
   AddPause(base::TimeDelta::FromMilliseconds(500),
@@ -1163,8 +1130,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, Vp8Playback_WithEffectsStreams) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForVideoOnly("bear-vp8a.webm", false /* raw_h264 */);
   AddEffectsStreams();
@@ -1173,8 +1138,6 @@
 }
 
 TEST_F(AudioVideoPipelineDeviceTest, WebmPlayback_WithEffectsStreams) {
-  std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
-
   set_sync_type(MediaPipelineDeviceParams::kModeSyncPts);
   ConfigureForFile("bear-640x360.webm");
   PauseBeforeEos();
diff --git a/chromeos/cert_loader_unittest.cc b/chromeos/cert_loader_unittest.cc
index c42722b6..6056f76 100644
--- a/chromeos/cert_loader_unittest.cc
+++ b/chromeos/cert_loader_unittest.cc
@@ -11,8 +11,8 @@
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
+#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "base/test/scoped_task_scheduler.h"
 #include "crypto/scoped_nss_types.h"
 #include "crypto/scoped_test_nss_db.h"
 #include "net/cert/nss_cert_database_chromeos.h"
@@ -103,6 +103,7 @@
     certdb->reset(new TestNSSCertDatabase(
         crypto::ScopedPK11Slot(PK11_ReferenceSlot(db->slot())),
         crypto::ScopedPK11Slot(PK11_ReferenceSlot(db->slot()))));
+    (*certdb)->SetSlowTaskRunnerForTest(message_loop_.task_runner());
   }
 
   void ImportCACert(const std::string& cert_file,
@@ -143,7 +144,7 @@
   crypto::ScopedTestNSSDB primary_db_;
   std::unique_ptr<TestNSSCertDatabase> primary_certdb_;
 
-  base::test::ScopedTaskScheduler scoped_task_scheduler_;
+  base::MessageLoop message_loop_;
 
  private:
   size_t certificates_loaded_events_count_;
diff --git a/chromeos/network/auto_connect_handler_unittest.cc b/chromeos/network/auto_connect_handler_unittest.cc
index 515ef5b..4491a2ff6 100644
--- a/chromeos/network/auto_connect_handler_unittest.cc
+++ b/chromeos/network/auto_connect_handler_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/files/file_util.h"
 #include "base/json/json_reader.h"
 #include "base/macros.h"
+#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/scoped_task_scheduler.h"
@@ -77,7 +78,9 @@
 class AutoConnectHandlerTest : public testing::Test {
  public:
   AutoConnectHandlerTest()
-      : test_manager_client_(nullptr), test_service_client_(nullptr) {}
+      : test_manager_client_(nullptr),
+        test_service_client_(nullptr),
+        scoped_task_scheduler_(&message_loop_) {}
 
   void SetUp() override {
     ASSERT_TRUE(test_nssdb_.is_open());
@@ -86,6 +89,7 @@
     test_nsscertdb_.reset(new net::NSSCertDatabaseChromeOS(
         crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())),
         crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot()))));
+    test_nsscertdb_->SetSlowTaskRunnerForTest(message_loop_.task_runner());
 
     CertLoader::Initialize();
     CertLoader::ForceHardwareBackedForTesting();
@@ -248,6 +252,7 @@
   ShillServiceClient::TestInterface* test_service_client_;
   crypto::ScopedTestNSSDB test_nssdb_;
   std::unique_ptr<net::NSSCertDatabaseChromeOS> test_nsscertdb_;
+  base::MessageLoopForUI message_loop_;
 
  private:
   base::test::ScopedTaskScheduler scoped_task_scheduler_;
diff --git a/chromeos/network/client_cert_resolver_unittest.cc b/chromeos/network/client_cert_resolver_unittest.cc
index be02db03..0fe79c15 100644
--- a/chromeos/network/client_cert_resolver_unittest.cc
+++ b/chromeos/network/client_cert_resolver_unittest.cc
@@ -57,7 +57,8 @@
       : network_properties_changed_count_(0),
         service_test_(nullptr),
         profile_test_(nullptr),
-        cert_loader_(nullptr) {}
+        cert_loader_(nullptr),
+        scoped_task_scheduler_(&message_loop_) {}
   ~ClientCertResolverTest() override {}
 
   void SetUp() override {
@@ -67,6 +68,7 @@
     test_nsscertdb_.reset(new net::NSSCertDatabaseChromeOS(
         crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())),
         crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot()))));
+    test_nsscertdb_->SetSlowTaskRunnerForTest(message_loop_.task_runner());
 
     DBusThreadManager::Initialize();
     service_test_ =
@@ -291,6 +293,7 @@
   std::unique_ptr<NetworkConfigurationHandler> network_config_handler_;
   std::unique_ptr<ManagedNetworkConfigurationHandlerImpl>
       managed_config_handler_;
+  base::MessageLoop message_loop_;
   base::test::ScopedTaskScheduler scoped_task_scheduler_;
   scoped_refptr<net::X509Certificate> test_client_cert_;
   std::string test_ca_cert_pem_;
diff --git a/chromeos/network/network_cert_migrator_unittest.cc b/chromeos/network/network_cert_migrator_unittest.cc
index 489cb68..006027b0 100644
--- a/chromeos/network/network_cert_migrator_unittest.cc
+++ b/chromeos/network/network_cert_migrator_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/test/scoped_task_scheduler.h"
 #include "chromeos/cert_loader.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/shill_profile_client.h"
@@ -49,6 +48,7 @@
     test_nsscertdb_.reset(new net::NSSCertDatabaseChromeOS(
         crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())),
         crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot()))));
+    test_nsscertdb_->SetSlowTaskRunnerForTest(message_loop_.task_runner());
 
     DBusThreadManager::Initialize();
     service_test_ =
@@ -189,7 +189,7 @@
   scoped_refptr<net::X509Certificate> test_client_cert_;
   std::string test_client_cert_pkcs11_id_;
   std::string test_client_cert_slot_id_;
-  base::test::ScopedTaskScheduler scoped_task_scheduler_;
+  base::MessageLoop message_loop_;
 
  private:
   std::unique_ptr<NetworkStateHandler> network_state_handler_;
diff --git a/chromeos/network/network_connection_handler_unittest.cc b/chromeos/network/network_connection_handler_unittest.cc
index 9ea2356..8224c02 100644
--- a/chromeos/network/network_connection_handler_unittest.cc
+++ b/chromeos/network/network_connection_handler_unittest.cc
@@ -13,9 +13,9 @@
 #include "base/files/file_util.h"
 #include "base/json/json_reader.h"
 #include "base/macros.h"
+#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
-#include "base/test/scoped_task_scheduler.h"
 #include "chromeos/cert_loader.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/shill_device_client.h"
@@ -110,6 +110,7 @@
     test_nsscertdb_.reset(new net::NSSCertDatabaseChromeOS(
         crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot())),
         crypto::ScopedPK11Slot(PK11_ReferenceSlot(test_nssdb_.slot()))));
+    test_nsscertdb_->SetSlowTaskRunnerForTest(message_loop_.task_runner());
 
     CertLoader::Initialize();
     CertLoader::ForceHardwareBackedForTesting();
@@ -309,7 +310,7 @@
   ShillServiceClient::TestInterface* test_service_client_;
   crypto::ScopedTestNSSDB test_nssdb_;
   std::unique_ptr<net::NSSCertDatabaseChromeOS> test_nsscertdb_;
-  base::test::ScopedTaskScheduler scoped_task_scheduler_;
+  base::MessageLoopForUI message_loop_;
   std::string result_;
 
  private:
diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskIds.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskIds.java
index 72540e5..0654004d 100644
--- a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskIds.java
+++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskIds.java
@@ -11,5 +11,8 @@
 public final class TaskIds {
     public static final int TEST = 0x00008378;
 
+    public static final int GCM_BACKGROUND_TASK_JOB_ID = 1;
+    public static final int NOTIFICATION_SERVICE_JOB_ID = 21;
+
     private TaskIds() {}
 }
diff --git a/components/certificate_transparency/ct_policy_manager_unittest.cc b/components/certificate_transparency/ct_policy_manager_unittest.cc
index 51fe6db..6abc261 100644
--- a/components/certificate_transparency/ct_policy_manager_unittest.cc
+++ b/components/certificate_transparency/ct_policy_manager_unittest.cc
@@ -20,10 +20,9 @@
 
 namespace {
 
-template <size_t N>
-base::ListValue* ListValueFromStrings(const char* const (&strings)[N]) {
+base::ListValue* ListValueFromStrings(const std::vector<const char*>& strings) {
   std::unique_ptr<base::ListValue> result(new base::ListValue);
-  for (const auto& str : strings) {
+  for (auto* const str : strings) {
     result->AppendString(str);
   }
   return result.release();
@@ -67,8 +66,9 @@
 
   // Now set a preference, pump the message loop, and ensure things are now
   // reflected.
-  pref_service_.SetManagedPref(prefs::kCTRequiredHosts,
-                               ListValueFromStrings({"google.com"}));
+  pref_service_.SetManagedPref(
+      prefs::kCTRequiredHosts,
+      ListValueFromStrings(std::vector<const char*>{"google.com"}));
   base::RunLoop().RunUntilIdle();
 
   // The new preferences should take effect.
@@ -94,8 +94,9 @@
 
   // Now set a preference, pump the message loop, and ensure things are now
   // reflected.
-  pref_service_.SetManagedPref(prefs::kCTExcludedHosts,
-                               ListValueFromStrings({"google.com"}));
+  pref_service_.SetManagedPref(
+      prefs::kCTExcludedHosts,
+      ListValueFromStrings(std::vector<const char*>{"google.com"}));
   base::RunLoop().RunUntilIdle();
 
   // The new preferences should take effect.
@@ -123,7 +124,7 @@
   // URLs).
   pref_service_.SetManagedPref(
       prefs::kCTRequiredHosts,
-      ListValueFromStrings({
+      ListValueFromStrings(std::vector<const char*>{
           "file:///etc/fstab", "file://withahost/etc/fstab",
           "file:///c|/Windows", "*", "https://*", "example.com",
           "https://example.test:invalid_port",
@@ -180,12 +181,13 @@
   // but then require it for a specific host.
   pref_service_.SetManagedPref(
       prefs::kCTExcludedHosts,
-      ListValueFromStrings({"example.com", ".sub.example.com",
-                            ".sub.accounts.example.com", "test.example.com"}));
+      ListValueFromStrings(std::vector<const char*>{
+          "example.com", ".sub.example.com", ".sub.accounts.example.com",
+          "test.example.com"}));
   pref_service_.SetManagedPref(
       prefs::kCTRequiredHosts,
-      ListValueFromStrings(
-          {"sub.example.com", "accounts.example.com", "test.example.com"}));
+      ListValueFromStrings(std::vector<const char*>{
+          "sub.example.com", "accounts.example.com", "test.example.com"}));
   base::RunLoop().RunUntilIdle();
 
   EXPECT_EQ(CTRequirementLevel::NOT_REQUIRED,
@@ -231,8 +233,9 @@
 
   // Now set a preference, pump the message loop, and ensure things are now
   // reflected.
-  pref_service_.SetManagedPref(prefs::kCTRequiredHosts,
-                               ListValueFromStrings({"google.com"}));
+  pref_service_.SetManagedPref(
+      prefs::kCTRequiredHosts,
+      ListValueFromStrings(std::vector<const char*>{"google.com"}));
   base::RunLoop().RunUntilIdle();
 
   // The new preferences should take effect.
@@ -251,8 +254,9 @@
             delegate->IsCTRequiredForHost("example.com"));
   EXPECT_EQ(CTRequirementLevel::DEFAULT,
             delegate->IsCTRequiredForHost("sub.example.com"));
-  pref_service_.SetManagedPref(prefs::kCTRequiredHosts,
-                               ListValueFromStrings({"sub.example.com"}));
+  pref_service_.SetManagedPref(
+      prefs::kCTRequiredHosts,
+      ListValueFromStrings(std::vector<const char*>{"sub.example.com"}));
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(CTRequirementLevel::REQUIRED,
             delegate->IsCTRequiredForHost("google.com"));
diff --git a/components/dom_distiller/standalone/content_extractor_browsertest.cc b/components/dom_distiller/standalone/content_extractor_browsertest.cc
index 459c3d3..1e6c834e 100644
--- a/components/dom_distiller/standalone/content_extractor_browsertest.cc
+++ b/components/dom_distiller/standalone/content_extractor_browsertest.cc
@@ -125,9 +125,10 @@
     content::BrowserContext* context,
     const base::FilePath& db_path,
     const FileToUrlMap& file_to_url_map) {
+  base::SequencedWorkerPool* blocking_pool =
+      content::BrowserThread::GetBlockingPool();
   scoped_refptr<base::SequencedTaskRunner> background_task_runner =
-      content::BrowserThread::GetBlockingPool()->GetSequencedTaskRunner(
-          content::BrowserThread::GetBlockingPool()->GetSequenceToken());
+      blocking_pool->GetSequencedTaskRunner(blocking_pool->GetSequenceToken());
 
   // TODO(cjhopman): use an in-memory database instead of an on-disk one with
   // temporary directory.
diff --git a/components/gcm_driver/android/BUILD.gn b/components/gcm_driver/android/BUILD.gn
index c1f6374..5909fd4 100644
--- a/components/gcm_driver/android/BUILD.gn
+++ b/components/gcm_driver/android/BUILD.gn
@@ -21,7 +21,19 @@
 
   java_files = [
     "java/src/org/chromium/components/gcm_driver/GCMDriver.java",
+    "java/src/org/chromium/components/gcm_driver/GCMMessage.java",
     "java/src/org/chromium/components/gcm_driver/GoogleCloudMessagingSubscriber.java",
     "java/src/org/chromium/components/gcm_driver/GoogleCloudMessagingV2.java",
   ]
 }
+
+junit_binary("components_gcm_driver_junit_tests") {
+  java_files =
+      [ "junit/src/org/chromium/components/gcm_driver/GCMMessageTest.java" ]
+  deps = [
+    ":gcm_driver_java",
+    "//base:base_java",
+    "//base:base_java_test_support",
+    "//third_party/hamcrest:hamcrest_java",
+  ]
+}
diff --git a/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java
index 5d11c73..b914c9b 100644
--- a/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java
+++ b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMDriver.java
@@ -6,7 +6,6 @@
 
 import android.content.Context;
 import android.os.AsyncTask;
-import android.os.Bundle;
 
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
@@ -15,8 +14,6 @@
 import org.chromium.base.annotations.JNINamespace;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 
 /**
  * This class is the Java counterpart to the C++ GCMDriverAndroid class.
@@ -115,41 +112,16 @@
     }
 
     // The caller of this function is responsible for ensuring the browser process is initialized.
-    public static void onMessageReceived(String appId, String senderId, Bundle extras) {
-        // TODO(johnme): Store message and redeliver later if Chrome is killed before delivery.
+    public static void dispatchMessage(GCMMessage message) {
         ThreadUtils.assertOnUiThread();
+
         if (sInstance == null) {
-            // Change of behaviour, throw exception instead of failing silently with Log.e.
             throw new RuntimeException("Failed to instantiate GCMDriver.");
         }
-        final String bundleSubtype = "subtype";
-        final String bundleSenderId = "from";
-        final String bundleCollapseKey = "collapse_key";
-        final String bundleRawData = "rawData";
-        final String bundleGcmplex = "com.google.ipc.invalidation.gcmmplex.";
 
-        String collapseKey = extras.getString(bundleCollapseKey);  // May be null.
-        byte[] rawData = extras.getByteArray(bundleRawData);  // May be null.
-
-        List<String> dataKeysAndValues = new ArrayList<String>();
-        for (String key : extras.keySet()) {
-            // TODO(johnme): Check there aren't other keys that we need to exclude.
-            if (key.equals(bundleSubtype) || key.equals(bundleSenderId)
-                    || key.equals(bundleCollapseKey) || key.equals(bundleRawData)
-                    || key.startsWith(bundleGcmplex)) {
-                continue;
-            }
-            Object value = extras.get(key);
-            if (!(value instanceof String)) {
-                continue;
-            }
-            dataKeysAndValues.add(key);
-            dataKeysAndValues.add((String) value);
-        }
-
-        sInstance.nativeOnMessageReceived(sInstance.mNativeGCMDriverAndroid,
-                appId, senderId, collapseKey, rawData,
-                dataKeysAndValues.toArray(new String[dataKeysAndValues.size()]));
+        sInstance.nativeOnMessageReceived(sInstance.mNativeGCMDriverAndroid, message.getAppId(),
+                message.getSenderId(), message.getCollapseKey(), message.getRawData(),
+                message.getDataKeysAndValuesArray());
     }
 
     @VisibleForTesting
diff --git a/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMMessage.java b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMMessage.java
new file mode 100644
index 0000000..e5d3559
--- /dev/null
+++ b/components/gcm_driver/android/java/src/org/chromium/components/gcm_driver/GCMMessage.java
@@ -0,0 +1,177 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.components.gcm_driver;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.os.Bundle;
+
+import org.chromium.base.annotations.SuppressFBWarnings;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+/**
+ * Represents the contents of a GCM Message that is to be handled by the GCM Driver. Can be created
+ * based on data received from GCM, or serialized and deserialized to and from a Bundle.
+ */
+public class GCMMessage {
+    /**
+     * Keys used to store information in the bundle for serialization purposes.
+     */
+    private static final String BUNDLE_KEY_APP_ID = "appId";
+    private static final String BUNDLE_KEY_COLLAPSE_KEY = "collapseKey";
+    private static final String BUNDLE_KEY_DATA = "data";
+    private static final String BUNDLE_KEY_RAW_DATA = "rawData";
+    private static final String BUNDLE_KEY_SENDER_ID = "senderId";
+
+    private final String mSenderId;
+    private final String mAppId;
+
+    @Nullable
+    private final String mCollapseKey;
+    @Nullable
+    private final byte[] mRawData;
+
+    /**
+     * Array that contains pairs of entries in the format of {key, value}.
+     */
+    private final String[] mDataKeysAndValuesArray;
+
+    /**
+     * Validates that all required fields have been set in the given bundle.
+     */
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    public static boolean validateBundle(Bundle bundle) {
+        return bundle.containsKey(BUNDLE_KEY_APP_ID) && bundle.containsKey(BUNDLE_KEY_COLLAPSE_KEY)
+                && bundle.containsKey(BUNDLE_KEY_DATA) && bundle.containsKey(BUNDLE_KEY_RAW_DATA)
+                && bundle.containsKey(BUNDLE_KEY_SENDER_ID);
+    }
+
+    /**
+     * Creates a GCMMessage object based on data received from GCM. The extras will be filtered.
+     */
+    public GCMMessage(String senderId, Bundle extras) {
+        String bundleCollapseKey = "collapse_key";
+        String bundleGcmplex = "com.google.ipc.invalidation.gcmmplex.";
+        String bundleRawData = "rawData";
+        String bundleSenderId = "from";
+        String bundleSubtype = "subtype";
+
+        if (!extras.containsKey(bundleSubtype)) {
+            throw new IllegalArgumentException("Received push message with no subtype");
+        }
+
+        mSenderId = senderId;
+        mAppId = extras.getString(bundleSubtype);
+
+        mCollapseKey = extras.getString(bundleCollapseKey); // May be null.
+        mRawData = extras.getByteArray(bundleRawData); // May be null.
+
+        List<String> dataKeysAndValues = new ArrayList<String>();
+        for (String key : extras.keySet()) {
+            if (key.equals(bundleSubtype) || key.equals(bundleSenderId)
+                    || key.equals(bundleCollapseKey) || key.equals(bundleRawData)
+                    || key.startsWith(bundleGcmplex)) {
+                continue;
+            }
+
+            Object value = extras.get(key);
+            if (!(value instanceof String)) {
+                continue;
+            }
+
+            dataKeysAndValues.add(key);
+            dataKeysAndValues.add((String) value);
+        }
+
+        mDataKeysAndValuesArray = dataKeysAndValues.toArray(new String[dataKeysAndValues.size()]);
+    }
+
+    /**
+     * Creates a GCMMessage object based on the given bundle. Assumes that the bundle has previously
+     * been created through {@link #toBundle}.
+     */
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    public GCMMessage(Bundle bundle) {
+        mSenderId = bundle.getString(BUNDLE_KEY_SENDER_ID);
+        mAppId = bundle.getString(BUNDLE_KEY_APP_ID);
+        mCollapseKey = bundle.getString(BUNDLE_KEY_COLLAPSE_KEY);
+        // The rawData field needs to distinguish between {not set, set but empty, set with data}.
+        String rawDataString = bundle.getString(BUNDLE_KEY_RAW_DATA);
+        if (rawDataString != null) {
+            if (rawDataString.length() > 0) {
+                mRawData = rawDataString.getBytes(StandardCharsets.ISO_8859_1);
+            } else {
+                mRawData = new byte[0];
+            }
+        } else {
+            mRawData = null;
+        }
+
+        mDataKeysAndValuesArray = bundle.getStringArray(BUNDLE_KEY_DATA);
+    }
+
+    public String getSenderId() {
+        return mSenderId;
+    }
+
+    public String getAppId() {
+        return mAppId;
+    }
+
+    @Nullable
+    public String getCollapseKey() {
+        return mCollapseKey;
+    }
+
+    /**
+     * Callers are expected to not modify values in the returned byte array.
+     */
+    @Nullable
+    @SuppressFBWarnings("EI_EXPOSE_REP")
+    public byte[] getRawData() {
+        return mRawData;
+    }
+
+    /**
+     * Callers are expected to not modify values in the returned byte array.
+     */
+    @SuppressFBWarnings("EI_EXPOSE_REP")
+    public String[] getDataKeysAndValuesArray() {
+        return mDataKeysAndValuesArray;
+    }
+
+    /**
+     * Serializes the contents of this GCM Message to a new bundle that can be stored, for example
+     * for purposes of scheduling a job. Only methods available in BaseBundle may be used here,
+     * as it may have to be converted to a PersistableBundle.
+     */
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    public Bundle toBundle() {
+        Bundle bundle = new Bundle();
+        bundle.putString(BUNDLE_KEY_SENDER_ID, mSenderId);
+        bundle.putString(BUNDLE_KEY_APP_ID, mAppId);
+        bundle.putString(BUNDLE_KEY_COLLAPSE_KEY, mCollapseKey);
+
+        // The rawData field needs to distinguish between {not set, set but empty, set with data}.
+        if (mRawData != null) {
+            if (mRawData.length > 0) {
+                bundle.putString(
+                        BUNDLE_KEY_RAW_DATA, new String(mRawData, StandardCharsets.ISO_8859_1));
+            } else {
+                bundle.putString(BUNDLE_KEY_RAW_DATA, "");
+            }
+        } else {
+            bundle.putString(BUNDLE_KEY_RAW_DATA, null);
+        }
+
+        bundle.putStringArray(BUNDLE_KEY_DATA, mDataKeysAndValuesArray);
+        return bundle;
+    }
+}
diff --git a/components/gcm_driver/android/junit/src/org/chromium/components/gcm_driver/GCMMessageTest.java b/components/gcm_driver/android/junit/src/org/chromium/components/gcm_driver/GCMMessageTest.java
new file mode 100644
index 0000000..44040ac
--- /dev/null
+++ b/components/gcm_driver/android/junit/src/org/chromium/components/gcm_driver/GCMMessageTest.java
@@ -0,0 +1,178 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.components.gcm_driver;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import android.os.Build;
+import android.os.Bundle;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.util.MinAndroidSdkLevel;
+import org.chromium.testing.local.LocalRobolectricTestRunner;
+
+/**
+ * Unit tests for GCMMessage.
+ */
+@RunWith(LocalRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class GCMMessageTest {
+    /**
+     * Tests that a message object can be created based on data received from GCM. Note that the raw
+     * data field is tested separately.
+     */
+    @Test
+    public void testCreateMessageFromGCM() {
+        Bundle extras = new Bundle();
+
+        // Compose a simple message that lacks all optional fields.
+        extras.putString("subtype", "MyAppId");
+
+        {
+            GCMMessage message = new GCMMessage("MySenderId", extras);
+
+            assertEquals("MySenderId", message.getSenderId());
+            assertEquals("MyAppId", message.getAppId());
+            assertEquals(null, message.getCollapseKey());
+            assertArrayEquals(new String[] {}, message.getDataKeysAndValuesArray());
+        }
+
+        // Add the optional fields: collapse key, raw binary data and a custom property.
+        extras.putString("collapse_key", "MyCollapseKey");
+        extras.putByteArray("rawData", new byte[] {0x00, 0x15, 0x30, 0x45});
+        extras.putString("property", "value");
+
+        {
+            GCMMessage message = new GCMMessage("MySenderId", extras);
+
+            assertEquals("MySenderId", message.getSenderId());
+            assertEquals("MyAppId", message.getAppId());
+            assertEquals("MyCollapseKey", message.getCollapseKey());
+            assertArrayEquals(
+                    new String[] {"property", "value"}, message.getDataKeysAndValuesArray());
+        }
+    }
+
+    /**
+     * Tests that the bundle containing extras from GCM will be filtered for values that we either
+     * pass through by other means, or that we know to be irrelevant to regular GCM messages.
+     */
+    @Test
+    public void testFiltersExtraBundle() {
+        Bundle extras = new Bundle();
+
+        // These should be filtered by full key.
+        extras.putString("collapse_key", "collapseKey");
+        extras.putString("rawData", "rawData");
+        extras.putString("from", "from");
+        extras.putString("subtype", "subtype");
+
+        // These should be filtered by prefix matching.
+        extras.putString("com.google.ipc.invalidation.gcmmplex.foo", "bar");
+        extras.putString("com.google.ipc.invalidation.gcmmplex.bar", "baz");
+
+        // These should be filtered because they're not strings.
+        extras.putBoolean("myBoolean", true);
+        extras.putInt("myInteger", 42);
+
+        // These should not be filtered.
+        extras.putString("collapse_key2", "secondCollapseKey");
+        extras.putString("myString", "foobar");
+
+        GCMMessage message = new GCMMessage("senderId", extras);
+
+        assertArrayEquals(new String[] {"collapse_key2", "secondCollapseKey", "myString", "foobar"},
+                message.getDataKeysAndValuesArray());
+    }
+
+    /**
+     * Tests that a GCMMessage object can be serialized to and deserialized from a persistable
+     * bundle. Note that the raw data field is tested separately. Only run on Android L and beyond
+     * because it depends on PersistableBundle.
+     */
+    @Test
+    @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP)
+    public void testSerializationToPersistableBundle() {
+        Bundle extras = new Bundle();
+
+        // Compose a simple message that lacks all optional fields.
+        extras.putString("subtype", "MyAppId");
+
+        {
+            GCMMessage message = new GCMMessage("MySenderId", extras);
+            GCMMessage copiedMessage = new GCMMessage(message.toBundle());
+
+            assertEquals(message.getSenderId(), copiedMessage.getSenderId());
+            assertEquals(message.getAppId(), copiedMessage.getAppId());
+            assertEquals(message.getCollapseKey(), copiedMessage.getCollapseKey());
+            assertArrayEquals(
+                    message.getDataKeysAndValuesArray(), copiedMessage.getDataKeysAndValuesArray());
+        }
+
+        // Add the optional fields: collapse key, raw binary data and a custom property.
+        extras.putString("collapse_key", "MyCollapseKey");
+        extras.putString("property", "value");
+
+        {
+            GCMMessage message = new GCMMessage("MySenderId", extras);
+            GCMMessage copiedMessage = new GCMMessage(message.toBundle());
+
+            assertEquals(message.getSenderId(), copiedMessage.getSenderId());
+            assertEquals(message.getAppId(), copiedMessage.getAppId());
+            assertEquals(message.getCollapseKey(), copiedMessage.getCollapseKey());
+            assertArrayEquals(
+                    message.getDataKeysAndValuesArray(), copiedMessage.getDataKeysAndValuesArray());
+        }
+    }
+
+    /**
+     * Tests that the raw data field can be serialized and deserialized as expected. It should be
+     * NULL when undefined, an empty byte array when defined but empty, and a regular, filled
+     * byte array when data has been provided. Only run on Android L and beyond because it depends
+     * on PersistableBundle.
+     */
+    @Test
+    @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP)
+    public void testRawDataSerializationBehaviour() {
+        Bundle extras = new Bundle();
+        extras.putString("subtype", "MyAppId");
+
+        // Case 1: No raw data supplied. Should be NULL.
+        {
+            GCMMessage message = new GCMMessage("MySenderId", extras);
+            GCMMessage copiedMessage = new GCMMessage(message.toBundle());
+
+            assertArrayEquals(null, message.getRawData());
+            assertArrayEquals(null, copiedMessage.getRawData());
+        }
+
+        extras.putByteArray("rawData", new byte[] {});
+
+        // Case 2: Empty byte array of raw data supplied. Should be just that.
+        {
+            GCMMessage message = new GCMMessage("MySenderId", extras);
+            GCMMessage copiedMessage = new GCMMessage(message.toBundle());
+
+            assertArrayEquals(new byte[] {}, message.getRawData());
+            assertArrayEquals(new byte[] {}, copiedMessage.getRawData());
+        }
+
+        extras.putByteArray("rawData", new byte[] {0x00, 0x15, 0x30, 0x45});
+
+        // Case 3: Byte array with data supplied.
+        {
+            GCMMessage message = new GCMMessage("MySenderId", extras);
+            GCMMessage copiedMessage = new GCMMessage(message.toBundle());
+
+            assertArrayEquals(new byte[] {0x00, 0x15, 0x30, 0x45}, message.getRawData());
+            assertArrayEquals(new byte[] {0x00, 0x15, 0x30, 0x45}, copiedMessage.getRawData());
+        }
+    }
+}
diff --git a/components/offline_pages/core/background/BUILD.gn b/components/offline_pages/core/background/BUILD.gn
index 2ee9a96..639715606 100644
--- a/components/offline_pages/core/background/BUILD.gn
+++ b/components/offline_pages/core/background/BUILD.gn
@@ -118,6 +118,7 @@
     "//base/test:test_support",
     "//components/offline_pages/core",
     "//components/offline_pages/core:switches",
+    "//sql:sql",
     "//testing/gtest",
     "//url",
   ]
diff --git a/components/offline_pages/core/background/request_coordinator.cc b/components/offline_pages/core/background/request_coordinator.cc
index aaa2821..661445a 100644
--- a/components/offline_pages/core/background/request_coordinator.cc
+++ b/components/offline_pages/core/background/request_coordinator.cc
@@ -155,6 +155,19 @@
 
 }  // namespace
 
+RequestCoordinator::SavePageLaterParams::SavePageLaterParams()
+    : user_requested(true),
+      availability(RequestAvailability::ENABLED_FOR_OFFLINER) {}
+
+RequestCoordinator::SavePageLaterParams::SavePageLaterParams(
+    const SavePageLaterParams& other) {
+  url = other.url;
+  client_id = other.client_id;
+  user_requested = other.user_requested;
+  availability = other.availability;
+  original_url = other.original_url;
+}
+
 RequestCoordinator::RequestCoordinator(
     std::unique_ptr<OfflinerPolicy> policy,
     std::unique_ptr<Offliner> offliner,
@@ -194,41 +207,47 @@
 
 RequestCoordinator::~RequestCoordinator() {}
 
-int64_t RequestCoordinator::SavePageLater(const GURL& url,
-                                          const ClientId& client_id,
-                                          bool user_requested,
-                                          RequestAvailability availability) {
-  DVLOG(2) << "URL is " << url << " " << __func__;
+int64_t RequestCoordinator::SavePageLater(
+    const SavePageLaterParams& save_page_later_params) {
+  DVLOG(2) << "URL is " << save_page_later_params.url << " " << __func__;
 
-  if (!OfflinePageModel::CanSaveURL(url)) {
-    DVLOG(1) << "Not able to save page for requested url: " << url;
+  if (!OfflinePageModel::CanSaveURL(save_page_later_params.url)) {
+    DVLOG(1) << "Not able to save page for requested url: "
+             << save_page_later_params.url;
     return 0L;
   }
 
   int64_t id = GenerateOfflineId();
 
   // Build a SavePageRequest.
-  offline_pages::SavePageRequest request(id, url, client_id, base::Time::Now(),
-                                         user_requested);
+  offline_pages::SavePageRequest request(
+      id, save_page_later_params.url, save_page_later_params.client_id,
+      base::Time::Now(), save_page_later_params.user_requested);
+  request.set_original_url(save_page_later_params.original_url);
 
   // If the download manager is not done with the request, put it on the
   // disabled list.
-  if (availability == RequestAvailability::DISABLED_FOR_OFFLINER)
+  if (save_page_later_params.availability ==
+      RequestAvailability::DISABLED_FOR_OFFLINER) {
     disabled_requests_.insert(id);
+  }
 
   // Put the request on the request queue.
   queue_->AddRequest(request,
                      base::Bind(&RequestCoordinator::AddRequestResultCallback,
-                                weak_ptr_factory_.GetWeakPtr(), availability));
+                                weak_ptr_factory_.GetWeakPtr(),
+                                save_page_later_params.availability));
 
   // Record the network quality when this request is made.
   if (network_quality_estimator_) {
     RecordSavePageLaterNetworkQuality(
-        client_id, network_quality_estimator_->GetEffectiveConnectionType());
+        save_page_later_params.client_id,
+        network_quality_estimator_->GetEffectiveConnectionType());
   }
 
   return id;
 }
+
 void RequestCoordinator::GetAllRequests(const GetRequestsCallback& callback) {
   // Get all matching requests from the request queue, send them to our
   // callback.  We bind the namespace and callback to the front of the callback
diff --git a/components/offline_pages/core/background/request_coordinator.h b/components/offline_pages/core/background/request_coordinator.h
index 09606f2e..b9d3fae9 100644
--- a/components/offline_pages/core/background/request_coordinator.h
+++ b/components/offline_pages/core/background/request_coordinator.h
@@ -60,6 +60,28 @@
     DISABLED_FOR_OFFLINER,
   };
 
+  // Describes the parameters to control how to save a page when system
+  // conditions allow.
+  struct SavePageLaterParams {
+    SavePageLaterParams();
+    SavePageLaterParams(const SavePageLaterParams& other);
+
+    // The last committed URL of the page to save.
+    GURL url;
+
+    // The identification used by the client.
+    ClientId client_id;
+
+    // Whether the user requests the save action. Defaults to true.
+    bool user_requested;
+
+    // Request availability. Defaults to ENABLED_FOR_OFFLINER.
+    RequestAvailability availability;
+
+    // The original URL of the page to save. Empty if no redirect occurs.
+    GURL original_url;
+  };
+
   // Callback specifying which request IDs were actually removed.
   typedef base::Callback<void(const MultipleItemStatuses&)>
       RemoveRequestsCallback;
@@ -79,10 +101,7 @@
 
   // Queues |request| to later load and save when system conditions allow.
   // Returns an id if the page could be queued successfully, 0L otherwise.
-  int64_t SavePageLater(const GURL& url,
-                        const ClientId& client_id,
-                        bool user_requested,
-                        RequestAvailability availability);
+  int64_t SavePageLater(const SavePageLaterParams& save_page_later_params);
 
   // Remove a list of requests by |request_id|.  This removes requests from the
   // request queue, and cancels an in-progress prerender.
diff --git a/components/offline_pages/core/background/request_coordinator_unittest.cc b/components/offline_pages/core/background/request_coordinator_unittest.cc
index 8fc4f2a7d..753dd883 100644
--- a/components/offline_pages/core/background/request_coordinator_unittest.cc
+++ b/components/offline_pages/core/background/request_coordinator_unittest.cc
@@ -247,6 +247,24 @@
 
   SavePageRequest AddRequest2();
 
+  int64_t SavePageLater() {
+    RequestCoordinator::SavePageLaterParams params;
+    params.url = kUrl1;
+    params.client_id = kClientId1;
+    params.user_requested = kUserRequested;
+    return coordinator()->SavePageLater(params);
+  }
+
+  int64_t SavePageLaterWithAvailability(
+      RequestCoordinator::RequestAvailability availability) {
+    RequestCoordinator::SavePageLaterParams params;
+    params.url = kUrl1;
+    params.client_id = kClientId1;
+    params.user_requested = kUserRequested;
+    params.availability = availability;
+    return coordinator()->SavePageLater(params);
+  }
+
   Offliner::RequestStatus last_offlining_status() const {
     return coordinator()->last_offlining_status_;
   }
@@ -274,6 +292,10 @@
 
   const base::HistogramTester& histograms() const { return histogram_tester_; }
 
+  const std::set<int64_t>& disabled_requests() {
+    return coordinator()->disabled_requests_;
+  }
+
  private:
   GetRequestsResult last_get_requests_result_;
   MultipleItemStatuses last_remove_results_;
@@ -435,10 +457,7 @@
 
 TEST_F(RequestCoordinatorTest, StartScheduledProcessingWithRequestInProgress) {
   // Start processing for this request.
-  EXPECT_NE(coordinator()->SavePageLater(
-                kUrl1, kClientId1, kUserRequested,
-                RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER),
-            0);
+  EXPECT_NE(0, SavePageLater());
 
   // Ensure that the forthcoming request does not finish - we simulate it being
   // in progress by asking it to skip making the completion callback.
@@ -489,10 +508,7 @@
 
 TEST_F(RequestCoordinatorTest, StartImmediateProcessingWithRequestInProgress) {
   // Start processing for this request.
-  EXPECT_NE(coordinator()->SavePageLater(
-                kUrl1, kClientId1, kUserRequested,
-                RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER),
-            0);
+  EXPECT_NE(0, SavePageLater());
 
   // Disable the automatic offliner callback.
   EnableOfflinerCallback(false);
@@ -518,23 +534,30 @@
   coordinator()->SetInternalStartProcessingCallbackForTest(
       processing_callback());
 
-  EXPECT_NE(coordinator()->SavePageLater(
-                kUrl1, kClientId1, kUserRequested,
-                RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER),
-            0);
+  // Use default values for |user_requested| and |availability|.
+  RequestCoordinator::SavePageLaterParams params;
+  params.url = kUrl1;
+  params.client_id = kClientId1;
+  params.original_url = kUrl2;
+  EXPECT_NE(0, coordinator()->SavePageLater(params));
 
   // Expect that a request got placed on the queue.
   coordinator()->queue()->GetRequests(base::Bind(
       &RequestCoordinatorTest::GetRequestsDone, base::Unretained(this)));
 
+  // Expect that the request is not added to the disabled list by default.
+  EXPECT_TRUE(disabled_requests().empty());
+
   // Wait for callbacks to finish, both request queue and offliner.
   PumpLoop();
   EXPECT_TRUE(processing_callback_called());
 
   // Check the request queue is as expected.
-  EXPECT_EQ(1UL, last_requests().size());
+  ASSERT_EQ(1UL, last_requests().size());
   EXPECT_EQ(kUrl1, last_requests().at(0)->url());
   EXPECT_EQ(kClientId1, last_requests().at(0)->client_id());
+  EXPECT_TRUE(last_requests().at(0)->user_requested());
+  EXPECT_EQ(kUrl2, last_requests().at(0)->original_url());
 
   // Expect that the scheduler got notified.
   SchedulerStub* scheduler_stub =
@@ -562,10 +585,7 @@
   coordinator()->SetInternalStartProcessingCallbackForTest(
       processing_callback());
 
-  EXPECT_TRUE(
-      coordinator()->SavePageLater(
-          kUrl1, kClientId1, kUserRequested,
-          RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER) != 0);
+  EXPECT_NE(0, SavePageLater());
 
   // Expect that a request got placed on the queue.
   coordinator()->queue()->GetRequests(base::Bind(
@@ -1031,9 +1051,12 @@
 }
 
 TEST_F(RequestCoordinatorTest, MarkRequestCompleted) {
-  int64_t request_id = coordinator()->SavePageLater(
-      kUrl1, kClientId1, kUserRequested,
+  int64_t request_id = SavePageLaterWithAvailability(
       RequestCoordinator::RequestAvailability::DISABLED_FOR_OFFLINER);
+
+  // Verify that the request is added to the disabled list.
+  EXPECT_FALSE(disabled_requests().empty());
+
   PumpLoop();
   EXPECT_NE(request_id, 0l);
 
@@ -1055,9 +1078,12 @@
   // Pretend we are on low-end device so immediate start won't happen.
   SetIsLowEndDeviceForTest(true);
 
-  int64_t request_id = coordinator()->SavePageLater(
-      kUrl1, kClientId1, kUserRequested,
+  int64_t request_id = SavePageLaterWithAvailability(
       RequestCoordinator::RequestAvailability::DISABLED_FOR_OFFLINER);
+
+  // Verify that the request is added to the disabled list.
+  EXPECT_FALSE(disabled_requests().empty());
+
   PumpLoop();
   EXPECT_NE(request_id, 0l);
 
@@ -1125,10 +1151,7 @@
   // in progress by asking it to skip making the completion callback.
   EnableOfflinerCallback(false);
 
-  EXPECT_NE(coordinator()->SavePageLater(
-                kUrl1, kClientId1, kUserRequested,
-                RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER),
-            0);
+  EXPECT_NE(0, SavePageLater());
   PumpLoop();
 
   // Verify that immediate start from adding the request did happen.
@@ -1316,10 +1339,7 @@
   // Turn off the callback so that the request stops before processing in
   // PumpLoop.
   EnableOfflinerCallback(false);
-  EXPECT_NE(coordinator()->SavePageLater(
-                kUrl1, kClientId1, kUserRequested,
-                RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER),
-            0);
+  EXPECT_NE(0, SavePageLater());
   PumpLoop();
 
   EXPECT_TRUE(is_busy());
@@ -1332,10 +1352,7 @@
   EXPECT_FALSE(offline_pages::IsOfflinePagesSvelteConcurrentLoadingEnabled());
 
   // Make a request.
-  EXPECT_NE(coordinator()->SavePageLater(
-                kUrl1, kClientId1, kUserRequested,
-                RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER),
-            0);
+  EXPECT_NE(0, SavePageLater());
   PumpLoop();
 
   // Verify not immediately busy (since low-end device).
@@ -1352,10 +1369,11 @@
   EnableOfflinerCallback(false);
 
   // Make another request.
-  EXPECT_NE(coordinator()->SavePageLater(
-                kUrl2, kClientId2, kUserRequested,
-                RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER),
-            0);
+  RequestCoordinator::SavePageLaterParams params;
+  params.url = kUrl2;
+  params.client_id = kClientId2;
+  params.user_requested = kUserRequested;
+  EXPECT_NE(0, coordinator()->SavePageLater(params));
   PumpLoop();
 
   // Verify immediate processing did start this time.
@@ -1365,10 +1383,7 @@
 TEST_F(RequestCoordinatorTest, SavePageDoesntStartProcessingWhenDisconnected) {
   SetNetworkConnected(false);
   EnableOfflinerCallback(false);
-  EXPECT_NE(
-      coordinator()->SavePageLater(
-          kUrl1, kClientId1, kUserRequested,
-          RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER), 0);
+  EXPECT_NE(0, SavePageLater());
   PumpLoop();
   EXPECT_FALSE(is_busy());
 
@@ -1392,10 +1407,7 @@
   // PumpLoop.
   EnableOfflinerCallback(false);
 
-  EXPECT_NE(coordinator()->SavePageLater(
-                kUrl1, kClientId1, kUserRequested,
-                RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER),
-            0);
+  EXPECT_NE(0, SavePageLater());
   PumpLoop();
   EXPECT_TRUE(is_busy());
 }
@@ -1491,10 +1503,7 @@
   // in progress by asking it to skip making the completion callback.
   EnableOfflinerCallback(false);
 
-  EXPECT_NE(coordinator()->SavePageLater(
-                kUrl1, kClientId1, kUserRequested,
-                RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER),
-            0);
+  EXPECT_NE(0, SavePageLater());
 
   // Repeat the timeout for MaxCompleteTries - 1 times in order to increase the
   // completed tries on this request.
diff --git a/components/offline_pages/core/background/request_queue_store_sql.cc b/components/offline_pages/core/background/request_queue_store_sql.cc
index 5e5672a..099f774 100644
--- a/components/offline_pages/core/background/request_queue_store_sql.cc
+++ b/components/offline_pages/core/background/request_queue_store_sql.cc
@@ -42,26 +42,63 @@
                       " state INTEGER NOT NULL DEFAULT 0,"
                       " url VARCHAR NOT NULL,"
                       " client_namespace VARCHAR NOT NULL,"
-                      " client_id VARCHAR NOT NULL"
+                      " client_id VARCHAR NOT NULL,"
+                      " original_url VARCHAR NOT NULL DEFAULT ''"
                       ")";
   return db->Execute(kSql);
 }
 
+bool UpgradeWithQuery(sql::Connection* db, const char* upgrade_sql) {
+  if (!db->Execute("ALTER TABLE " REQUEST_QUEUE_TABLE_NAME
+                   " RENAME TO temp_" REQUEST_QUEUE_TABLE_NAME)) {
+    return false;
+  }
+  if (!CreateRequestQueueTable(db))
+    return false;
+  if (!db->Execute(upgrade_sql))
+    return false;
+  return db->Execute("DROP TABLE IF EXISTS temp_" REQUEST_QUEUE_TABLE_NAME);
+}
+
+bool UpgradeFrom57(sql::Connection* db) {
+  const char kSql[] =
+      "INSERT INTO " REQUEST_QUEUE_TABLE_NAME
+      " (request_id, creation_time, activation_time, last_attempt_time, "
+      "started_attempt_count, completed_attempt_count, state, url, "
+      "client_namespace, client_id) "
+      "SELECT "
+      "request_id, creation_time, activation_time, last_attempt_time, "
+      "started_attempt_count, completed_attempt_count, state, url, "
+      "client_namespace, client_id "
+      "FROM temp_" REQUEST_QUEUE_TABLE_NAME;
+  return UpgradeWithQuery(db, kSql);
+}
+
 bool CreateSchema(sql::Connection* db) {
+  sql::Transaction transaction(db);
+  if (!transaction.Begin())
+    return false;
+
+  if (!db->DoesTableExist(REQUEST_QUEUE_TABLE_NAME)) {
+    if (!CreateRequestQueueTable(db))
+      return false;
+  }
+
   // If there is not already a state column, we need to drop the old table.  We
   // are choosing to drop instead of upgrade since the feature is not yet
-  // released, so we don't use a transaction to protect existing data, or try to
-  // migrate it.
+  // released, so we don't try to migrate it.
   if (!db->DoesColumnExist(REQUEST_QUEUE_TABLE_NAME, "state")) {
     if (!db->Execute("DROP TABLE IF EXISTS " REQUEST_QUEUE_TABLE_NAME))
       return false;
   }
 
-  if (!CreateRequestQueueTable(db))
-    return false;
+  if (!db->DoesColumnExist(REQUEST_QUEUE_TABLE_NAME, "original_url")) {
+    if (!UpgradeFrom57(db))
+      return false;
+  }
 
   // TODO(fgorski): Add indices here.
-  return true;
+  return transaction.Commit();
 }
 
 // Create a save page request from a SQL result.  Expects complete rows with
@@ -83,11 +120,12 @@
   const GURL url(statement.ColumnString(7));
   const ClientId client_id(statement.ColumnString(8),
                            statement.ColumnString(9));
+  const GURL original_url(statement.ColumnString(10));
 
   DVLOG(2) << "making save page request - id " << id << " url " << url
            << " client_id " << client_id.name_space << "-" << client_id.id
            << " creation time " << creation_time << " user requested "
-           << kUserRequested;
+           << kUserRequested << " original_url " << original_url;
 
   std::unique_ptr<SavePageRequest> request(new SavePageRequest(
       id, url, client_id, creation_time, activation_time, kUserRequested));
@@ -95,6 +133,7 @@
   request->set_started_attempt_count(started_attempt_count);
   request->set_completed_attempt_count(completed_attempt_count);
   request->set_request_state(state);
+  request->set_original_url(original_url);
   return request;
 }
 
@@ -104,7 +143,7 @@
   const char kSql[] =
       "SELECT request_id, creation_time, activation_time,"
       " last_attempt_time, started_attempt_count, completed_attempt_count,"
-      " state, url, client_namespace, client_id"
+      " state, url, client_namespace, client_id, original_url"
       " FROM " REQUEST_QUEUE_TABLE_NAME " WHERE request_id=?";
 
   sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
@@ -132,9 +171,9 @@
       "INSERT OR IGNORE INTO " REQUEST_QUEUE_TABLE_NAME
       " (request_id, creation_time, activation_time,"
       " last_attempt_time, started_attempt_count, completed_attempt_count,"
-      " state, url, client_namespace, client_id)"
+      " state, url, client_namespace, client_id, original_url)"
       " VALUES "
-      " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+      " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
 
   sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
   statement.BindInt64(0, request.request_id());
@@ -147,6 +186,7 @@
   statement.BindString(7, request.url().spec());
   statement.BindString(8, request.client_id().name_space);
   statement.BindString(9, request.client_id().id);
+  statement.BindString(10, request.original_url().spec());
 
   if (!statement.Run())
     return ItemActionStatus::STORE_ERROR;
@@ -160,7 +200,7 @@
       "UPDATE OR IGNORE " REQUEST_QUEUE_TABLE_NAME
       " SET creation_time = ?, activation_time = ?, last_attempt_time = ?,"
       " started_attempt_count = ?, completed_attempt_count = ?, state = ?,"
-      " url = ?, client_namespace = ?, client_id = ?"
+      " url = ?, client_namespace = ?, client_id = ?, original_url = ?"
       " WHERE request_id = ?";
 
   sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
@@ -173,7 +213,8 @@
   statement.BindString(6, request.url().spec());
   statement.BindString(7, request.client_id().name_space);
   statement.BindString(8, request.client_id().id);
-  statement.BindInt64(9, request.request_id());
+  statement.BindString(9, request.original_url().spec());
+  statement.BindInt64(10, request.request_id());
 
   if (!statement.Run())
     return ItemActionStatus::STORE_ERROR;
@@ -236,7 +277,7 @@
   const char kSql[] =
       "SELECT request_id, creation_time, activation_time,"
       " last_attempt_time, started_attempt_count, completed_attempt_count,"
-      " state, url, client_namespace, client_id"
+      " state, url, client_namespace, client_id, original_url"
       " FROM " REQUEST_QUEUE_TABLE_NAME;
 
   sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
diff --git a/components/offline_pages/core/background/request_queue_store_unittest.cc b/components/offline_pages/core/background/request_queue_store_unittest.cc
index 7d697c6..bf78969 100644
--- a/components/offline_pages/core/background/request_queue_store_unittest.cc
+++ b/components/offline_pages/core/background/request_queue_store_unittest.cc
@@ -15,10 +15,14 @@
 #include "components/offline_pages/core/background/request_queue_in_memory_store.h"
 #include "components/offline_pages/core/background/request_queue_store_sql.h"
 #include "components/offline_pages/core/background/save_page_request.h"
+#include "sql/connection.h"
+#include "sql/statement.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace offline_pages {
 
+#define REQUEST_QUEUE_TABLE_NAME "request_queue_v1"
+
 using UpdateStatus = RequestQueueStore::UpdateStatus;
 
 namespace {
@@ -37,6 +41,51 @@
   RESULT_TRUE,
 };
 
+void BuildTestStoreWithSchemaFromM57(const base::FilePath& file) {
+  sql::Connection connection;
+  ASSERT_TRUE(
+      connection.Open(file.Append(FILE_PATH_LITERAL("RequestQueue.db"))));
+  ASSERT_TRUE(connection.is_open());
+  ASSERT_TRUE(connection.BeginTransaction());
+  ASSERT_TRUE(connection.Execute(
+      "CREATE TABLE " REQUEST_QUEUE_TABLE_NAME
+      " (request_id INTEGER PRIMARY KEY NOT NULL,"
+      " creation_time INTEGER NOT NULL,"
+      " activation_time INTEGER NOT NULL DEFAULT 0,"
+      " last_attempt_time INTEGER NOT NULL DEFAULT 0,"
+      " started_attempt_count INTEGER NOT NULL,"
+      " completed_attempt_count INTEGER NOT NULL,"
+      " state INTEGER NOT NULL DEFAULT 0,"
+      " url VARCHAR NOT NULL,"
+      " client_namespace VARCHAR NOT NULL,"
+      " client_id VARCHAR NOT NULL"
+      ")"));
+
+  ASSERT_TRUE(connection.CommitTransaction());
+  sql::Statement statement(connection.GetUniqueStatement(
+      "INSERT OR IGNORE INTO " REQUEST_QUEUE_TABLE_NAME
+      " (request_id, creation_time, activation_time,"
+      " last_attempt_time, started_attempt_count, completed_attempt_count,"
+      " state, url, client_namespace, client_id)"
+      " VALUES "
+      " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"));
+
+  statement.BindInt64(0, kRequestId);
+  statement.BindInt64(1, 0);
+  statement.BindInt64(2, 0);
+  statement.BindInt64(3, 0);
+  statement.BindInt64(4, 0);
+  statement.BindInt64(5, 0);
+  statement.BindInt64(6, 0);
+  statement.BindString(7, kUrl.spec());
+  statement.BindString(8, kClientId.name_space);
+  statement.BindString(9, kClientId.id);
+  ASSERT_TRUE(statement.Run());
+  ASSERT_TRUE(connection.DoesTableExist(REQUEST_QUEUE_TABLE_NAME));
+  ASSERT_FALSE(
+      connection.DoesColumnExist(REQUEST_QUEUE_TABLE_NAME, "original_url"));
+}
+
 }  // namespace
 
 // Class that serves as a base for testing different implementations of the
@@ -155,6 +204,8 @@
 class RequestQueueStoreFactory {
  public:
   virtual RequestQueueStore* BuildStore(const base::FilePath& path) = 0;
+  virtual RequestQueueStore* BuildStoreWithOldSchema(
+      const base::FilePath& path, int version) = 0;
 };
 
 // Implements a store factory for in memory store.
@@ -164,6 +215,11 @@
     RequestQueueStore* store = new RequestQueueInMemoryStore();
     return store;
   }
+
+  RequestQueueStore* BuildStoreWithOldSchema(const base::FilePath& path,
+                                             int version) override {
+    return nullptr;
+  }
 };
 
 // Implements a store factory for SQLite based implementation of the store.
@@ -174,6 +230,16 @@
         new RequestQueueStoreSQL(base::ThreadTaskRunnerHandle::Get(), path);
     return store;
   }
+
+  RequestQueueStore* BuildStoreWithOldSchema(const base::FilePath& path,
+                                             int version) override {
+    EXPECT_EQ(57, version);
+    BuildTestStoreWithSchemaFromM57(path);
+
+    RequestQueueStore* store =
+        new RequestQueueStoreSQL(base::ThreadTaskRunnerHandle::Get(), path);
+    return store;
+  }
 };
 
 // Defines a store test fixture templatized by the store factory.
@@ -181,6 +247,7 @@
 class RequestQueueStoreTest : public RequestQueueStoreTestBase {
  public:
   std::unique_ptr<RequestQueueStore> BuildStore();
+  std::unique_ptr<RequestQueueStore> BuildStoreWithOldSchema(int version);
 
  protected:
   T factory_;
@@ -193,6 +260,14 @@
   return store;
 }
 
+template <typename T>
+std::unique_ptr<RequestQueueStore>
+RequestQueueStoreTest<T>::BuildStoreWithOldSchema(int version) {
+  std::unique_ptr<RequestQueueStore> store(
+      factory_.BuildStoreWithOldSchema(temp_directory_.GetPath(), version));
+  return store;
+}
+
 // |StoreTypes| lists all factories, based on which the tests will be created.
 typedef testing::Types<RequestQueueInMemoryStoreFactory,
                        RequestQueueStoreSQLFactory>
@@ -203,6 +278,23 @@
 // defined on the |RequestQuieueStoreBaseTest| class. That's by design.
 TYPED_TEST_CASE(RequestQueueStoreTest, StoreTypes);
 
+TYPED_TEST(RequestQueueStoreTest, UpgradeFromVersion57Store) {
+  std::unique_ptr<RequestQueueStore> store(this->BuildStoreWithOldSchema(57));
+  // In-memory store does not support upgrading.
+  if (!store)
+    return;
+  this->InitializeStore(store.get());
+
+  store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone,
+                                base::Unretained(this)));
+  this->PumpLoop();
+  ASSERT_EQ(LastResult::RESULT_TRUE, this->last_result());
+  ASSERT_EQ(1u, this->last_requests().size());
+  EXPECT_EQ(kRequestId, this->last_requests()[0]->request_id());
+  EXPECT_EQ(kUrl, this->last_requests()[0]->url());
+  EXPECT_EQ(GURL(), this->last_requests()[0]->original_url());
+}
+
 TYPED_TEST(RequestQueueStoreTest, GetRequestsEmpty) {
   std::unique_ptr<RequestQueueStore> store(this->BuildStore());
   this->InitializeStore(store.get());
@@ -283,6 +375,7 @@
   base::Time creation_time = base::Time::Now();
   SavePageRequest request(kRequestId, kUrl, kClientId, creation_time,
                           kUserRequested);
+  request.set_original_url(kUrl2);
 
   store->AddRequest(request,
                     base::Bind(&RequestQueueStoreTestBase::AddRequestDone,
@@ -340,6 +433,7 @@
   SavePageRequest updated_request(kRequestId, kUrl, kClientId,
                                   new_creation_time, activation_time,
                                   kUserRequested);
+  updated_request.set_original_url(kUrl2);
   // Try to update a non-existing request.
   SavePageRequest updated_request2(kRequestId2, kUrl, kClientId,
                                    new_creation_time, activation_time,
diff --git a/components/offline_pages/core/background/save_page_request.cc b/components/offline_pages/core/background/save_page_request.cc
index 02019de..9b19dc4 100644
--- a/components/offline_pages/core/background/save_page_request.cc
+++ b/components/offline_pages/core/background/save_page_request.cc
@@ -47,7 +47,8 @@
       completed_attempt_count_(other.completed_attempt_count_),
       last_attempt_time_(other.last_attempt_time_),
       user_requested_(other.user_requested_),
-      state_(other.state_) {}
+      state_(other.state_),
+      original_url_(other.original_url_) {}
 
 SavePageRequest::~SavePageRequest() {}
 
@@ -59,7 +60,7 @@
          started_attempt_count_ == other.started_attempt_count_ &&
          completed_attempt_count_ == other.completed_attempt_count_ &&
          last_attempt_time_ == other.last_attempt_time_ &&
-         state_ == other.state_;
+         state_ == other.state_ && original_url_ == other.original_url_;
 }
 
 void SavePageRequest::MarkAttemptStarted(const base::Time& start_time) {
diff --git a/components/offline_pages/core/background/save_page_request.h b/components/offline_pages/core/background/save_page_request.h
index 9f9e9ed..b1bd54e 100644
--- a/components/offline_pages/core/background/save_page_request.h
+++ b/components/offline_pages/core/background/save_page_request.h
@@ -87,6 +87,11 @@
     user_requested_ = user_requested;
   }
 
+  const GURL& original_url() const { return original_url_; }
+  void set_original_url(const GURL& original_url) {
+    original_url_ = original_url;
+  }
+
  private:
   // ID of this request.
   int64_t request_id_;
@@ -120,6 +125,9 @@
 
   // The current state of this request
   RequestState state_;
+
+  // The original URL of the page to be offlined. Empty if no redirect occurs.
+  GURL original_url_;
 };
 
 }  // namespace offline_pages
diff --git a/components/offline_pages/core/background/save_page_request_unittest.cc b/components/offline_pages/core/background/save_page_request_unittest.cc
index 7fc2dcd..ddfc2b9 100644
--- a/components/offline_pages/core/background/save_page_request_unittest.cc
+++ b/components/offline_pages/core/background/save_page_request_unittest.cc
@@ -11,6 +11,7 @@
 namespace {
 const int64_t kRequestId = 42;
 const GURL kUrl("http://example.com");
+const GURL kUrl2("http://example.com/test");
 const ClientId kClientId("bookmark", "1234");
 const bool kUserRequested = true;
 }  // namespace
@@ -26,16 +27,18 @@
   base::Time creation_time = base::Time::Now();
   SavePageRequest request(kRequestId, kUrl, kClientId, creation_time,
                           kUserRequested);
-  ASSERT_EQ(kRequestId, request.request_id());
-  ASSERT_EQ(kUrl, request.url());
-  ASSERT_EQ(kClientId, request.client_id());
-  ASSERT_EQ(creation_time, request.creation_time());
-  ASSERT_EQ(creation_time, request.activation_time());
-  ASSERT_EQ(base::Time(), request.last_attempt_time());
-  ASSERT_EQ(0, request.completed_attempt_count());
-  ASSERT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state());
-  ASSERT_EQ(0, request.started_attempt_count());
-  ASSERT_EQ(0, request.completed_attempt_count());
+  request.set_original_url(kUrl2);
+  EXPECT_EQ(kRequestId, request.request_id());
+  EXPECT_EQ(kUrl, request.url());
+  EXPECT_EQ(kClientId, request.client_id());
+  EXPECT_EQ(creation_time, request.creation_time());
+  EXPECT_EQ(creation_time, request.activation_time());
+  EXPECT_EQ(base::Time(), request.last_attempt_time());
+  EXPECT_EQ(0, request.completed_attempt_count());
+  EXPECT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state());
+  EXPECT_EQ(0, request.started_attempt_count());
+  EXPECT_EQ(0, request.completed_attempt_count());
+  EXPECT_EQ(kUrl2, request.original_url());
 }
 
 TEST_F(SavePageRequestTest, StartAndCompleteRequest) {
@@ -48,29 +51,29 @@
   request.MarkAttemptStarted(start_time);
 
   // Most things don't change about the request.
-  ASSERT_EQ(kRequestId, request.request_id());
-  ASSERT_EQ(kUrl, request.url());
-  ASSERT_EQ(kClientId, request.client_id());
-  ASSERT_EQ(creation_time, request.creation_time());
-  ASSERT_EQ(activation_time, request.activation_time());
+  EXPECT_EQ(kRequestId, request.request_id());
+  EXPECT_EQ(kUrl, request.url());
+  EXPECT_EQ(kClientId, request.client_id());
+  EXPECT_EQ(creation_time, request.creation_time());
+  EXPECT_EQ(activation_time, request.activation_time());
 
   // Attempt time, attempt count and status will though.
-  ASSERT_EQ(start_time, request.last_attempt_time());
-  ASSERT_EQ(1, request.started_attempt_count());
-  ASSERT_EQ(SavePageRequest::RequestState::OFFLINING, request.request_state());
+  EXPECT_EQ(start_time, request.last_attempt_time());
+  EXPECT_EQ(1, request.started_attempt_count());
+  EXPECT_EQ(SavePageRequest::RequestState::OFFLINING, request.request_state());
 
   request.MarkAttemptCompleted();
 
   // Again, most things don't change about the request.
-  ASSERT_EQ(kRequestId, request.request_id());
-  ASSERT_EQ(kUrl, request.url());
-  ASSERT_EQ(kClientId, request.client_id());
-  ASSERT_EQ(creation_time, request.creation_time());
-  ASSERT_EQ(activation_time, request.activation_time());
+  EXPECT_EQ(kRequestId, request.request_id());
+  EXPECT_EQ(kUrl, request.url());
+  EXPECT_EQ(kClientId, request.client_id());
+  EXPECT_EQ(creation_time, request.creation_time());
+  EXPECT_EQ(activation_time, request.activation_time());
 
   // Last attempt time and status are updated.
-  ASSERT_EQ(1, request.completed_attempt_count());
-  ASSERT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state());
+  EXPECT_EQ(1, request.completed_attempt_count());
+  EXPECT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state());
 }
 
 TEST_F(SavePageRequestTest, StartAndAbortRequest) {
@@ -82,27 +85,27 @@
   request.MarkAttemptStarted(start_time);
 
   // Most things don't change about the request.
-  ASSERT_EQ(kRequestId, request.request_id());
-  ASSERT_EQ(kUrl, request.url());
-  ASSERT_EQ(kClientId, request.client_id());
-  ASSERT_EQ(creation_time, request.creation_time());
+  EXPECT_EQ(kRequestId, request.request_id());
+  EXPECT_EQ(kUrl, request.url());
+  EXPECT_EQ(kClientId, request.client_id());
+  EXPECT_EQ(creation_time, request.creation_time());
 
   // Attempt time and attempt count will though.
-  ASSERT_EQ(start_time, request.last_attempt_time());
-  ASSERT_EQ(1, request.started_attempt_count());
-  ASSERT_EQ(SavePageRequest::RequestState::OFFLINING, request.request_state());
+  EXPECT_EQ(start_time, request.last_attempt_time());
+  EXPECT_EQ(1, request.started_attempt_count());
+  EXPECT_EQ(SavePageRequest::RequestState::OFFLINING, request.request_state());
 
   request.MarkAttemptAborted();
 
   // Again, most things don't change about the request.
-  ASSERT_EQ(kRequestId, request.request_id());
-  ASSERT_EQ(kUrl, request.url());
-  ASSERT_EQ(kClientId, request.client_id());
-  ASSERT_EQ(creation_time, request.creation_time());
+  EXPECT_EQ(kRequestId, request.request_id());
+  EXPECT_EQ(kUrl, request.url());
+  EXPECT_EQ(kClientId, request.client_id());
+  EXPECT_EQ(creation_time, request.creation_time());
 
   // Last attempt time is updated and completed attempt count did not rise.
-  ASSERT_EQ(0, request.completed_attempt_count());
-  ASSERT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state());
+  EXPECT_EQ(0, request.completed_attempt_count());
+  EXPECT_EQ(SavePageRequest::RequestState::AVAILABLE, request.request_state());
 }
 
 }  // namespace offline_pages
diff --git a/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc b/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc
index aed1609..12db77e 100644
--- a/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc
+++ b/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc
@@ -231,9 +231,10 @@
 
 int64_t DownloadUIAdapterTest::AddRequest(const GURL& url,
                                           const ClientId& client_id) {
-  return request_coordinator()->SavePageLater(
-      url, client_id, /* user_requested */ true,
-      RequestCoordinator::RequestAvailability::ENABLED_FOR_OFFLINER);
+  RequestCoordinator::SavePageLaterParams params;
+  params.url = url;
+  params.client_id = client_id;
+  return request_coordinator()->SavePageLater(params);
 }
 
 TEST_F(DownloadUIAdapterTest, InitialLoad) {
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index ef3ab69..b4335de 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -561,6 +561,10 @@
     "download/download_item_impl_delegate.h",
     "download/download_job.cc",
     "download/download_job.h",
+    "download/download_job_factory.cc",
+    "download/download_job_factory.h",
+    "download/download_job_impl.cc",
+    "download/download_job_impl.h",
     "download/download_manager_impl.cc",
     "download/download_manager_impl.h",
     "download/download_net_log_parameters.cc",
@@ -573,12 +577,16 @@
     "download/download_resource_handler.h",
     "download/download_stats.cc",
     "download/download_stats.h",
+    "download/download_worker.cc",
+    "download/download_worker.h",
     "download/drag_download_file.cc",
     "download/drag_download_file.h",
     "download/drag_download_util.cc",
     "download/drag_download_util.h",
     "download/mhtml_generation_manager.cc",
     "download/mhtml_generation_manager.h",
+    "download/parallel_download_job.cc",
+    "download/parallel_download_job.h",
     "download/rate_estimator.cc",
     "download/rate_estimator.h",
     "download/save_file.cc",
diff --git a/content/browser/download/download_create_info.cc b/content/browser/download/download_create_info.cc
index 244c7d2..4fe7be5d 100644
--- a/content/browser/download/download_create_info.cc
+++ b/content/browser/download/download_create_info.cc
@@ -22,7 +22,8 @@
       has_user_gesture(false),
       result(DOWNLOAD_INTERRUPT_REASON_NONE),
       save_info(std::move(save_info)),
-      request_net_log(net_log) {}
+      request_net_log(net_log),
+      accept_range(false) {}
 
 DownloadCreateInfo::DownloadCreateInfo()
     : DownloadCreateInfo(base::Time(),
diff --git a/content/browser/download/download_create_info.h b/content/browser/download/download_create_info.h
index c0c7f17..174fded 100644
--- a/content/browser/download/download_create_info.h
+++ b/content/browser/download/download_create_info.h
@@ -110,6 +110,9 @@
   // For continuing a download, the ETag of the file.
   std::string etag;
 
+  // If "Accept-Ranges:bytes" header presents in the response header.
+  bool accept_range;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(DownloadCreateInfo);
 };
diff --git a/content/browser/download/download_item_impl.cc b/content/browser/download/download_item_impl.cc
index b1957ab6..34571f59 100644
--- a/content/browser/download/download_item_impl.cc
+++ b/content/browser/download/download_item_impl.cc
@@ -40,6 +40,8 @@
 #include "content/browser/download/download_file.h"
 #include "content/browser/download/download_interrupt_reasons_impl.h"
 #include "content/browser/download/download_item_impl_delegate.h"
+#include "content/browser/download/download_job_factory.h"
+#include "content/browser/download/download_job_impl.h"
 #include "content/browser/download/download_net_log_parameters.h"
 #include "content/browser/download/download_request_handle.h"
 #include "content/browser/download/download_stats.h"
@@ -240,7 +242,6 @@
     std::unique_ptr<DownloadRequestHandleInterface> request_handle,
     const net::NetLogWithSource& net_log)
     : is_save_package_download_(true),
-      request_handle_(std::move(request_handle)),
       guid_(base::ToUpperASCII(base::GenerateGUID())),
       download_id_(download_id),
       target_path_(path),
@@ -254,6 +255,7 @@
       current_path_(path),
       net_log_(net_log),
       weak_ptr_factory_(this) {
+  job_ = base::MakeUnique<DownloadJobImpl>(this, std::move(request_handle));
   delegate_->Attach();
   Init(true /* actively downloading */, SRC_SAVE_PAGE_AS);
 }
@@ -350,7 +352,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   // Ignore irrelevant states.
-  if (is_paused_)
+  if (IsPaused())
     return;
 
   switch (state_) {
@@ -363,15 +365,15 @@
     case RESUMING_INTERNAL:
       // No active request.
       // TODO(asanka): In the case of RESUMING_INTERNAL, consider setting
-      // is_paused_ even if there's no request currently associated with this
-      // DII. When a request is assigned (due to a resumption, for example) we
-      // can honor the is_paused_ setting.
+      // |DownloadJob::is_paused_| even if there's no request currently
+      // associated with this DII. When a request is assigned (due to a
+      // resumption, for example) we can honor the |DownloadJob::is_paused_|
+      // setting.
       return;
 
     case IN_PROGRESS_INTERNAL:
     case TARGET_PENDING_INTERNAL:
-      request_handle_->PauseRequest();
-      is_paused_ = true;
+      job_->Pause();
       UpdateObservers();
       return;
 
@@ -395,10 +397,10 @@
 
     case TARGET_PENDING_INTERNAL:
     case IN_PROGRESS_INTERNAL:
-      if (!is_paused_)
+      if (!IsPaused())
         return;
-      request_handle_->ResumeRequest();
-      is_paused_ = false;
+      if (job_)
+        job_->Resume(true);
       UpdateObservers();
       return;
 
@@ -486,7 +488,7 @@
 }
 
 bool DownloadItemImpl::IsPaused() const {
-  return is_paused_;
+  return job_ ? job_->is_paused() : false;
 }
 
 bool DownloadItemImpl::IsTemporary() const {
@@ -507,7 +509,7 @@
     case TARGET_PENDING_INTERNAL:
     case TARGET_RESOLVED_INTERNAL:
     case IN_PROGRESS_INTERNAL:
-      return is_paused_;
+      return IsPaused();
 
     case INTERRUPTED_INTERNAL: {
       ResumeMode resume_mode = GetResumeMode();
@@ -701,7 +703,7 @@
 }
 
 int64_t DownloadItemImpl::CurrentSpeed() const {
-  if (is_paused_)
+  if (IsPaused())
     return 0;
   return bytes_per_sec_;
 }
@@ -780,9 +782,9 @@
   // paths that might be used by DownloadItems created from history import.
   // Currently such items have null request_handle_s, where other items
   // (regular and SavePackage downloads) have actual objects off the pointer.
-  if (request_handle_)
-    return request_handle_->GetWebContents();
-  return NULL;
+  if (job_)
+    return job_->GetWebContents();
+  return nullptr;
 }
 
 void DownloadItemImpl::OnContentCheckCompleted(DownloadDangerType danger_type) {
@@ -887,7 +889,7 @@
   // We won't auto-restart if we've used up our attempts or the
   // download has been paused by user action.
   bool user_action_required =
-      (auto_resume_count_ >= kMaxAutoResumeAttempts || is_paused_);
+      (auto_resume_count_ >= kMaxAutoResumeAttempts || IsPaused());
 
   switch(last_reason_) {
     case DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR:
@@ -1180,15 +1182,15 @@
   DVLOG(20) << __func__ << "() this=" << DebugString(true);
 
   download_file_ = std::move(file);
-  request_handle_ = std::move(req_handle);
+  job_ = DownloadJobFactory::CreateJob(this, std::move(req_handle),
+                                       new_create_info);
   destination_error_ = DOWNLOAD_INTERRUPT_REASON_NONE;
 
   if (state_ == CANCELLED_INTERNAL) {
     // The download was in the process of resuming when it was cancelled. Don't
     // proceed.
     ReleaseDownloadFile(true);
-    if (request_handle_)
-      request_handle_->CancelRequest();
+    job_->Cancel(true);
     return;
   }
 
@@ -1239,14 +1241,18 @@
   }
 
   // Successful download start.
-  DCHECK(download_file_.get());
-  DCHECK(request_handle_.get());
+  DCHECK(download_file_);
+  DCHECK(job_);
 
   if (state_ == RESUMING_INTERNAL)
     UpdateValidatorsOnResumption(new_create_info);
 
   TransitionTo(TARGET_PENDING_INTERNAL);
 
+  job_->Start();
+}
+
+void DownloadItemImpl::StartDownload() {
   BrowserThread::PostTask(
       BrowserThread::FILE, FROM_HERE,
       base::Bind(&DownloadFile::Initialize,
@@ -1643,8 +1649,8 @@
     SetHashState(std::move(hash_state));
   }
 
-  if (request_handle_)
-    request_handle_->CancelRequest();
+  if (job_)
+    job_->Cancel(false);
 
   if (reason == DOWNLOAD_INTERRUPT_REASON_USER_CANCELED ||
       reason == DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN) {
@@ -1784,9 +1790,10 @@
       DCHECK(current_path_.DirName() == target_path_.DirName())
           << "Current output directory must match target directory.";
       DCHECK(download_file_) << "Output file must be owned by download item.";
-      DCHECK(request_handle_) << "Download source must be active.";
-      DCHECK(!is_paused_) << "At the time a download enters IN_PROGRESS state, "
-                             "it must not be paused.";
+      DCHECK(job_) << "Must have active download job.";
+      DCHECK(!job_->is_paused())
+          << "At the time a download enters IN_PROGRESS state, "
+             "it must not be paused.";
       break;
 
     case COMPLETING_INTERNAL:
@@ -1954,8 +1961,9 @@
                            ? INITIATED_BY_MANUAL_RESUMPTION
                            : INITIATED_BY_AUTOMATIC_RESUMPTION);
   delegate_->ResumeInterruptedDownload(std::move(download_params), GetId());
-  // Just in case we were interrupted while paused.
-  is_paused_ = false;
+
+  if (job_)
+    job_->Resume(false);
 }
 
 // static
diff --git a/content/browser/download/download_item_impl.h b/content/browser/download/download_item_impl.h
index 47a0b0b6..6980498 100644
--- a/content/browser/download/download_item_impl.h
+++ b/content/browser/download/download_item_impl.h
@@ -28,6 +28,7 @@
 namespace content {
 class DownloadFile;
 class DownloadItemImplDelegate;
+class DownloadJob;
 
 // See download_item.h for usage.
 class CONTENT_EXPORT DownloadItemImpl
@@ -232,6 +233,8 @@
       std::unique_ptr<crypto::SecureHash> hash_state) override;
 
  private:
+  friend class DownloadJob;
+
   // Fine grained states of a download.
   //
   // New downloads can be created in the following states:
@@ -395,6 +398,9 @@
   // this is.
   void Init(bool active, DownloadType download_type);
 
+  // Start a series of events that result in the file being downloaded.
+  void StartDownload();
+
   // Callback from file thread when we initialize the DownloadFile.
   void OnDownloadFileInitialized(DownloadInterruptReason result);
 
@@ -505,10 +511,6 @@
   // TODO(rdsmith): Replace with a generalized enum for "download source".
   const bool is_save_package_download_ = false;
 
-  // The handle to the request information.  Used for operations outside the
-  // download system.
-  std::unique_ptr<DownloadRequestHandleInterface> request_handle_;
-
   std::string guid_;
 
   uint32_t download_id_ = kInvalidId;
@@ -598,9 +600,6 @@
   // Our delegate.
   DownloadItemImplDelegate* delegate_ = nullptr;
 
-  // In progress downloads may be paused by the user, we note it here.
-  bool is_paused_ = false;
-
   // A flag for indicating if the download should be opened at completion.
   bool open_when_complete_ = false;
 
@@ -684,6 +683,8 @@
   // Net log to use for this download.
   const net::NetLogWithSource net_log_;
 
+  std::unique_ptr<DownloadJob> job_;
+
   base::WeakPtrFactory<DownloadItemImpl> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(DownloadItemImpl);
diff --git a/content/browser/download/download_job.cc b/content/browser/download/download_job.cc
index c54428d1..4da7eb4 100644
--- a/content/browser/download/download_job.cc
+++ b/content/browser/download/download_job.cc
@@ -4,40 +4,25 @@
 
 #include "content/browser/download/download_job.h"
 
+#include "content/browser/download/download_item_impl.h"
+
 namespace content {
 
-// Unknown download progress.
-const int kDownloadProgressUnknown = -1;
-
-// Unknown download speed.
-const int kDownloadSpeedUnknown = -1;
-
-DownloadJob::DownloadJob() : manager_(nullptr) {}
+DownloadJob::DownloadJob(DownloadItemImpl* download_item)
+    : download_item_(download_item), is_paused_(false) {}
 
 DownloadJob::~DownloadJob() = default;
 
-void DownloadJob::OnAttached(DownloadJob::Manager* manager) {
-  DCHECK(!manager_) << "DownloadJob::Manager has already been attached.";
-  manager_ = manager;
+void DownloadJob::Pause() {
+  is_paused_ = true;
 }
 
-void DownloadJob::OnBeforeDetach() {
-  manager_ = nullptr;
+void DownloadJob::Resume(bool resume_request) {
+  is_paused_ = false;
 }
 
-void DownloadJob::StartedSavingResponse() {
-  if (manager_)
-    manager_->OnSavingStarted(this);
-}
-
-void DownloadJob::Interrupt(DownloadInterruptReason reason) {
-  if (manager_)
-    manager_->OnDownloadInterrupted(this, reason);
-}
-
-void DownloadJob::Complete() {
-  if (manager_)
-    manager_->OnDownloadComplete(this);
+void DownloadJob::StartDownload() const {
+  download_item_->StartDownload();
 }
 
 }  // namespace content
diff --git a/content/browser/download/download_job.h b/content/browser/download/download_job.h
index 2192d410..836cfdaa 100644
--- a/content/browser/download/download_job.h
+++ b/content/browser/download/download_job.h
@@ -12,82 +12,25 @@
 #include "content/public/browser/download_interrupt_reasons.h"
 
 namespace content {
+
+class DownloadItemImpl;
 class WebContents;
 
-// Unknown download progress.
-extern const int kDownloadProgressUnknown;
-
-// Unknown download speed.
-extern const int kDownloadSpeedUnknown;
-
-// DownloadJob contains internal download logic.
-// The owner of DownloadJob(e.g DownloadItemImpl) should implement
-// DownloadJob::Manager to be informed with important changes from
-// DownloadJob and modify its states accordingly.
+// DownloadJob lives on UI thread and subclasses implement actual download logic
+// and interact with DownloadItemImpl.
+// The base class is a friend class of DownloadItemImpl.
 class CONTENT_EXPORT DownloadJob {
  public:
-  // The interface used to interact with the owner of the download job.
-  class CONTENT_EXPORT Manager {
-   public:
-    // Called when |download_job| becomes actively download data.
-    virtual void OnSavingStarted(DownloadJob* download_job) = 0;
-
-    // Called when |download_job| is interrupted.
-    virtual void OnDownloadInterrupted(DownloadJob* download_job,
-                                       DownloadInterruptReason reason) = 0;
-
-    // Called when |download_job| is completed and inform the manager.
-    virtual void OnDownloadComplete(DownloadJob* download_job) = 0;
-
-    // Sets the download danger type.
-    virtual void SetDangerType(DownloadDangerType danger_type) = 0;
-  };
-
-  DownloadJob();
+  explicit DownloadJob(DownloadItemImpl* download_item);
   virtual ~DownloadJob();
 
-  DownloadJob::Manager* manager() { return manager_; }
-
-  // Called when DownloadJob is attached to DownloadJob::Manager.
-  // |manager| can be nullptr.
-  virtual void OnAttached(DownloadJob::Manager* manager);
-
-  // Called before DownloadJob is detached from its manager.
-  virtual void OnBeforeDetach();
-
   // Download operations.
+  virtual void Start() = 0;
   virtual void Cancel(bool user_cancel) = 0;
-  virtual void Pause() = 0;
-  virtual void Resume() = 0;
+  virtual void Pause();
+  virtual void Resume(bool resume_request);
 
-  // Return if the download file can be opened.
-  // See |DownloadItem::CanOpenDownload|.
-  virtual bool CanOpen() const = 0;
-
-  // Return if the download job can be resumed.
-  virtual bool CanResume() const = 0;
-
-  // See |DownloadItem::CanShowInFolder|.
-  virtual bool CanShowInFolder() const = 0;
-
-  // Return if the download job is actively downloading.
-  virtual bool IsActive() const = 0;
-
-  // Return if the download job is paused.
-  virtual bool IsPaused() const = 0;
-
-  // Return a number between 0 and 100 to represent the percentage progress of
-  // the download. Return |kDownloadProgressUnknown| if the progress is
-  // indeterminate.
-  virtual int PercentComplete() const = 0;
-
-  // Return the estimated current download speed in bytes per second.
-  // Or return kDownloadSpeedUnknown if the download speed is not measurable.
-  virtual int64_t CurrentSpeed() const = 0;
-
-  // Set the estimated remaining time of the download to |remaining| and return
-  // true if time remaining is available, otherwise return false.
-  virtual bool TimeRemaining(base::TimeDelta* remaining) const = 0;
+  bool is_paused() const { return is_paused_; }
 
   // Return the WebContents associated with the download. Usually used to
   // associate a browser window for any UI that needs to be displayed to the
@@ -96,24 +39,15 @@
   // WebContents.
   virtual WebContents* GetWebContents() const = 0;
 
-  // Print the debug string including internal states of the download job.
-  virtual std::string DebugString(bool verbose) const = 0;
-
  protected:
-  // Mark the download as being active.
-  void StartedSavingResponse();
+  void StartDownload() const;
 
-  // Mark the download as interrupted.
-  void Interrupt(DownloadInterruptReason reason);
-
-  // Mark the download job as completed.
-  void Complete();
-
-  // Owner of this DownloadJob, Only valid between OnAttached() and
-  // OnBeforeDetach(), inclusive. Otherwise set to nullptr.
-  DownloadJob::Manager* manager_;
+  DownloadItemImpl* download_item_;
 
  private:
+  // If the download progress is paused by the user.
+  bool is_paused_;
+
   DISALLOW_COPY_AND_ASSIGN(DownloadJob);
 };
 
diff --git a/content/browser/download/download_job_factory.cc b/content/browser/download/download_job_factory.cc
new file mode 100644
index 0000000..3123aef
--- /dev/null
+++ b/content/browser/download/download_job_factory.cc
@@ -0,0 +1,59 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/download/download_job_factory.h"
+
+#include <memory>
+
+#include "base/memory/ptr_util.h"
+#include "content/browser/download/download_item_impl.h"
+#include "content/browser/download/download_job.h"
+#include "content/browser/download/download_job_impl.h"
+#include "content/browser/download/parallel_download_job.h"
+#include "content/public/common/content_features.h"
+
+namespace content {
+
+namespace {
+
+// Default minimum file size in bytes to enable a parallel download, 2048KB.
+// TODO(xingliu): Use finch parameters to configure minimum file size.
+const int64_t kMinFileSizeParallelDownload = 2097152;
+
+bool ShouldUseParallelDownload(const DownloadCreateInfo& create_info) {
+  // 1. Accept-Ranges, Content-Length and strong validators response headers.
+  // 2. Feature |kParallelDownloading| enabled.
+  // 3. Content-Length is no less than |kMinFileSizeParallelDownload|.
+  // 3. (Undetermined) Http/1.1 protocol.
+  // 4. (Undetermined) Not under http proxy, e.g. data saver.
+
+  // Etag and last modified are stored into DownloadCreateInfo in
+  // DownloadRequestCore only if the response header complies to the strong
+  // validator rule.
+  bool has_strong_validator =
+      !create_info.etag.empty() || !create_info.last_modified.empty();
+
+  return has_strong_validator && create_info.accept_range &&
+         create_info.total_bytes >= kMinFileSizeParallelDownload &&
+         base::FeatureList::IsEnabled(features::kParallelDownloading);
+}
+
+}  // namespace
+
+std::unique_ptr<DownloadJob> DownloadJobFactory::CreateJob(
+    DownloadItemImpl* download_item,
+    std::unique_ptr<DownloadRequestHandleInterface> req_handle,
+    const DownloadCreateInfo& create_info) {
+  // Build parallel download job.
+  if (ShouldUseParallelDownload(create_info)) {
+    return base::MakeUnique<ParallelDownloadJob>(download_item,
+                                                 std::move(req_handle));
+  }
+
+  // An ordinary download job.
+  return base::MakeUnique<DownloadJobImpl>(download_item,
+                                           std::move(req_handle));
+}
+
+}  // namespace
diff --git a/content/browser/download/download_job_factory.h b/content/browser/download/download_job_factory.h
new file mode 100644
index 0000000..10eaa21a
--- /dev/null
+++ b/content/browser/download/download_job_factory.h
@@ -0,0 +1,33 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_FACTORY_H_
+#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_FACTORY_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "content/browser/download/download_create_info.h"
+
+namespace content {
+
+class DownloadItemImpl;
+class DownloadJob;
+class DownloadRequestHandleInterface;
+
+// Factory class to create different kinds of DownloadJob.
+class DownloadJobFactory {
+ public:
+  static std::unique_ptr<DownloadJob> CreateJob(
+      DownloadItemImpl* download_item,
+      std::unique_ptr<DownloadRequestHandleInterface> req_handle,
+      const DownloadCreateInfo& create_info);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(DownloadJobFactory);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_FACTORY_H_
diff --git a/content/browser/download/download_job_impl.cc b/content/browser/download/download_job_impl.cc
new file mode 100644
index 0000000..c5239e8
--- /dev/null
+++ b/content/browser/download/download_job_impl.cc
@@ -0,0 +1,46 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/download/download_job_impl.h"
+
+#include "content/public/browser/web_contents.h"
+
+namespace content {
+
+DownloadJobImpl::DownloadJobImpl(
+    DownloadItemImpl* download_item,
+    std::unique_ptr<DownloadRequestHandleInterface> request_handle)
+    : DownloadJob(download_item), request_handle_(std::move(request_handle)) {}
+
+DownloadJobImpl::~DownloadJobImpl() = default;
+
+void DownloadJobImpl::Start() {
+  DownloadJob::StartDownload();
+}
+
+void DownloadJobImpl::Cancel(bool user_cancel) {
+  if (request_handle_)
+    request_handle_->CancelRequest();
+}
+
+void DownloadJobImpl::Pause() {
+  DownloadJob::Pause();
+  if (request_handle_)
+    request_handle_->PauseRequest();
+}
+
+void DownloadJobImpl::Resume(bool resume_request) {
+  DownloadJob::Resume(resume_request);
+  if (!resume_request)
+    return;
+
+  if (request_handle_)
+    request_handle_->ResumeRequest();
+}
+
+WebContents* DownloadJobImpl::GetWebContents() const {
+  return request_handle_ ? request_handle_->GetWebContents() : nullptr;
+}
+
+}  // namespace content
diff --git a/content/browser/download/download_job_impl.h b/content/browser/download/download_job_impl.h
new file mode 100644
index 0000000..c24f92d
--- /dev/null
+++ b/content/browser/download/download_job_impl.h
@@ -0,0 +1,40 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_IMPL_H_
+#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_IMPL_H_
+
+#include "base/macros.h"
+#include "content/browser/download/download_item_impl.h"
+#include "content/browser/download/download_job.h"
+#include "content/browser/download/download_request_handle.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+class CONTENT_EXPORT DownloadJobImpl : public DownloadJob {
+ public:
+  DownloadJobImpl(
+      DownloadItemImpl* download_item,
+      std::unique_ptr<DownloadRequestHandleInterface> request_handle);
+  ~DownloadJobImpl() override;
+
+  // DownloadJob implementation.
+  void Start() override;
+  void Cancel(bool user_cancel) override;
+  void Pause() override;
+  void Resume(bool resume_request) override;
+  WebContents* GetWebContents() const override;
+
+ private:
+  // Used to perform operations on network request.
+  // Can be null on interrupted download.
+  std::unique_ptr<DownloadRequestHandleInterface> request_handle_;
+
+  DISALLOW_COPY_AND_ASSIGN(DownloadJobImpl);
+};
+
+}  //  namespace content
+
+#endif  // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_JOB_IMPL_H_
diff --git a/content/browser/download/download_job_unittest.cc b/content/browser/download/download_job_unittest.cc
index acdc5f1..ee758ad 100644
--- a/content/browser/download/download_job_unittest.cc
+++ b/content/browser/download/download_job_unittest.cc
@@ -5,25 +5,18 @@
 #include <memory>
 
 #include "base/memory/ptr_util.h"
+#include "content/browser/download/download_item_impl_delegate.h"
 #include "content/browser/download/download_job.h"
+#include "content/browser/download/mock_download_item_impl.h"
 #include "content/browser/download/mock_download_job.h"
+#include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using ::testing::NiceMock;
+
 namespace content {
 
-class MockDownloadJobManager : public DownloadJob::Manager {
- public:
-  MockDownloadJobManager() = default;
-  ~MockDownloadJobManager() = default;
-
-  MOCK_METHOD1(OnSavingStarted, void(DownloadJob* download_job));
-  MOCK_METHOD1(SetDangerType, void(DownloadDangerType));
-  MOCK_METHOD2(OnDownloadInterrupted,
-               void(DownloadJob* download_job, DownloadInterruptReason reason));
-  MOCK_METHOD1(OnDownloadComplete, void(DownloadJob* download_job));
-};
-
 // Test for DownloadJob base class functionalities.
 class DownloadJobTest : public testing::Test {
  public:
@@ -31,22 +24,20 @@
   ~DownloadJobTest() override = default;
 
   void SetUp() override {
-    download_job_manager_ = base::MakeUnique<MockDownloadJobManager>();
-    EXPECT_TRUE(download_job_manager_.get());
-    download_job_ = base::MakeUnique<MockDownloadJob>();
+    item_delegate_ = base::MakeUnique<DownloadItemImplDelegate>();
+    download_item_ =
+        base::MakeUnique<NiceMock<MockDownloadItemImpl>>(item_delegate_.get());
+    download_job_ = base::MakeUnique<MockDownloadJob>(download_item_.get());
   }
 
-  std::unique_ptr<MockDownloadJobManager> download_job_manager_;
+  content::TestBrowserThreadBundle browser_threads_;
+  std::unique_ptr<DownloadItemImplDelegate> item_delegate_;
+  std::unique_ptr<MockDownloadItemImpl> download_item_;
   std::unique_ptr<MockDownloadJob> download_job_;
 };
 
-TEST_F(DownloadJobTest, AttachAndDetach) {
-  // Ensure the manager should be valid only between attach and detach call.
-  EXPECT_FALSE(download_job_->manager());
-  download_job_->OnAttached(download_job_manager_.get());
-  EXPECT_TRUE(download_job_->manager());
-  download_job_->OnBeforeDetach();
-  EXPECT_FALSE(download_job_->manager());
+TEST_F(DownloadJobTest, Pause) {
+  DCHECK(download_job_->download_item());
 }
 
 }  // namespace content
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index 983e26ae..ae778d2 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -520,16 +520,6 @@
     url_downloaders_.push_back(std::move(downloader));
 }
 
-void DownloadManagerImpl::RemoveUrlDownloader(UrlDownloader* downloader) {
-  for (auto ptr = url_downloaders_.begin(); ptr != url_downloaders_.end();
-       ++ptr) {
-    if (ptr->get() == downloader) {
-      url_downloaders_.erase(ptr);
-      return;
-    }
-  }
-}
-
 // static
 DownloadInterruptReason DownloadManagerImpl::BeginDownloadRequest(
     std::unique_ptr<net::URLRequest> url_request,
@@ -716,6 +706,24 @@
                                                      : nullptr;
 }
 
+void DownloadManagerImpl::OnUrlDownloaderStarted(
+    std::unique_ptr<DownloadCreateInfo> download_create_info,
+    std::unique_ptr<ByteStreamReader> stream_reader,
+    const DownloadUrlParameters::OnStartedCallback& callback) {
+  StartDownload(std::move(download_create_info), std::move(stream_reader),
+                callback);
+}
+
+void DownloadManagerImpl::OnUrlDownloaderStopped(UrlDownloader* downloader) {
+  for (auto ptr = url_downloaders_.begin(); ptr != url_downloaders_.end();
+       ++ptr) {
+    if (ptr->get() == downloader) {
+      url_downloaders_.erase(ptr);
+      return;
+    }
+  }
+}
+
 void DownloadManagerImpl::GetAllDownloads(DownloadVector* downloads) {
   for (const auto& it : downloads_) {
     downloads->push_back(it.second.get());
diff --git a/content/browser/download/download_manager_impl.h b/content/browser/download/download_manager_impl.h
index edf17777..b035d90 100644
--- a/content/browser/download/download_manager_impl.h
+++ b/content/browser/download/download_manager_impl.h
@@ -40,6 +40,7 @@
 class ResourceContext;
 
 class CONTENT_EXPORT DownloadManagerImpl : public DownloadManager,
+                                           public UrlDownloader::Delegate,
                                            private DownloadItemImplDelegate {
  public:
   using DownloadItemImplCreated = base::Callback<void(DownloadItemImpl*)>;
@@ -112,6 +113,13 @@
   DownloadItem* GetDownload(uint32_t id) override;
   DownloadItem* GetDownloadByGuid(const std::string& guid) override;
 
+  // UrlDownloader::Delegate implementation.
+  void OnUrlDownloaderStarted(
+      std::unique_ptr<DownloadCreateInfo> download_create_info,
+      std::unique_ptr<ByteStreamReader> stream_reader,
+      const DownloadUrlParameters::OnStartedCallback& callback) override;
+  void OnUrlDownloaderStopped(UrlDownloader* downloader) override;
+
   // For testing; specifically, accessed from TestFileErrorInjector.
   void SetDownloadItemFactoryForTesting(
       std::unique_ptr<DownloadItemFactory> item_factory);
@@ -119,8 +127,6 @@
       std::unique_ptr<DownloadFileFactory> file_factory);
   virtual DownloadFileFactory* GetDownloadFileFactoryForTesting();
 
-  void RemoveUrlDownloader(UrlDownloader* downloader);
-
   // Helper function to initiate a download request. This function initiates
   // the download using functionality provided by the
   // ResourceDispatcherHostImpl::BeginURLRequest function. The function returns
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc
index c9a225cf..d13298f 100644
--- a/content/browser/download/download_manager_impl_unittest.cc
+++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -32,6 +32,7 @@
 #include "content/browser/download/download_item_impl_delegate.h"
 #include "content/browser/download/download_request_handle.h"
 #include "content/browser/download/mock_download_file.h"
+#include "content/browser/download/mock_download_item_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/download_interrupt_reasons.h"
 #include "content/public/browser/download_item.h"
@@ -75,126 +76,6 @@
       arg->default_download_directory == download_directory;
 }
 
-class MockDownloadItemImpl : public DownloadItemImpl {
- public:
-  // Use history constructor for minimal base object.
-  explicit MockDownloadItemImpl(DownloadItemImplDelegate* delegate)
-      : DownloadItemImpl(delegate,
-                         std::string("7d122682-55b5-4a47-a253-36cadc3e5bee"),
-                         content::DownloadItem::kInvalidId,
-                         base::FilePath(),
-                         base::FilePath(),
-                         std::vector<GURL>(),
-                         GURL(),
-                         GURL(),
-                         GURL(),
-                         GURL(),
-                         "application/octet-stream",
-                         "application/octet-stream",
-                         base::Time(),
-                         base::Time(),
-                         std::string(),
-                         std::string(),
-                         0,
-                         0,
-                         std::string(),
-                         DownloadItem::COMPLETE,
-                         DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
-                         DOWNLOAD_INTERRUPT_REASON_NONE,
-                         false,
-                         std::vector<DownloadItem::ReceivedSlice>(),
-                         net::NetLogWithSource()) {}
-  virtual ~MockDownloadItemImpl() {}
-
-  MOCK_METHOD4(OnDownloadTargetDetermined,
-               void(const base::FilePath&, TargetDisposition,
-                    DownloadDangerType, const base::FilePath&));
-  MOCK_METHOD1(AddObserver, void(DownloadItem::Observer*));
-  MOCK_METHOD1(RemoveObserver, void(DownloadItem::Observer*));
-  MOCK_METHOD0(UpdateObservers, void());
-  MOCK_METHOD0(CanShowInFolder, bool());
-  MOCK_METHOD0(CanOpenDownload, bool());
-  MOCK_METHOD0(ShouldOpenFileBasedOnExtension, bool());
-  MOCK_METHOD0(OpenDownload, void());
-  MOCK_METHOD0(ShowDownloadInShell, void());
-  MOCK_METHOD0(ValidateDangerousDownload, void());
-  MOCK_METHOD2(StealDangerousDownload, void(bool, const AcquireFileCallback&));
-  MOCK_METHOD3(UpdateProgress, void(int64_t, int64_t, const std::string&));
-  MOCK_METHOD1(Cancel, void(bool));
-  MOCK_METHOD0(MarkAsComplete, void());
-  void OnAllDataSaved(int64_t, std::unique_ptr<crypto::SecureHash>) override {
-    NOTREACHED();
-  }
-  MOCK_METHOD0(OnDownloadedFileRemoved, void());
-  void Start(std::unique_ptr<DownloadFile> download_file,
-             std::unique_ptr<DownloadRequestHandleInterface> req_handle,
-             const DownloadCreateInfo& create_info) override {
-    MockStart(download_file.get(), req_handle.get());
-  }
-
-  MOCK_METHOD2(MockStart, void(DownloadFile*, DownloadRequestHandleInterface*));
-
-  MOCK_METHOD0(Remove, void());
-  MOCK_CONST_METHOD1(TimeRemaining, bool(base::TimeDelta*));
-  MOCK_CONST_METHOD0(CurrentSpeed, int64_t());
-  MOCK_CONST_METHOD0(PercentComplete, int());
-  MOCK_CONST_METHOD0(AllDataSaved, bool());
-  MOCK_CONST_METHOD1(MatchesQuery, bool(const base::string16& query));
-  MOCK_CONST_METHOD0(IsDone, bool());
-  MOCK_CONST_METHOD0(GetFullPath, const base::FilePath&());
-  MOCK_CONST_METHOD0(GetTargetFilePath, const base::FilePath&());
-  MOCK_CONST_METHOD0(GetTargetDisposition, TargetDisposition());
-  MOCK_METHOD1(OnContentCheckCompleted, void(DownloadDangerType));
-  MOCK_CONST_METHOD0(GetState, DownloadState());
-  MOCK_CONST_METHOD0(GetUrlChain, const std::vector<GURL>&());
-  MOCK_METHOD1(SetTotalBytes, void(int64_t));
-  MOCK_CONST_METHOD0(GetURL, const GURL&());
-  MOCK_CONST_METHOD0(GetOriginalUrl, const GURL&());
-  MOCK_CONST_METHOD0(GetReferrerUrl, const GURL&());
-  MOCK_CONST_METHOD0(GetTabUrl, const GURL&());
-  MOCK_CONST_METHOD0(GetTabReferrerUrl, const GURL&());
-  MOCK_CONST_METHOD0(GetSuggestedFilename, std::string());
-  MOCK_CONST_METHOD0(GetContentDisposition, std::string());
-  MOCK_CONST_METHOD0(GetMimeType, std::string());
-  MOCK_CONST_METHOD0(GetOriginalMimeType, std::string());
-  MOCK_CONST_METHOD0(GetReferrerCharset, std::string());
-  MOCK_CONST_METHOD0(GetRemoteAddress, std::string());
-  MOCK_CONST_METHOD0(GetTotalBytes, int64_t());
-  MOCK_CONST_METHOD0(GetReceivedBytes, int64_t());
-  MOCK_CONST_METHOD0(GetHashState, const std::string&());
-  MOCK_CONST_METHOD0(GetHash, const std::string&());
-  MOCK_CONST_METHOD0(GetId, uint32_t());
-  MOCK_CONST_METHOD0(GetGuid, const std::string&());
-  MOCK_CONST_METHOD0(GetStartTime, base::Time());
-  MOCK_CONST_METHOD0(GetEndTime, base::Time());
-  MOCK_METHOD0(GetDownloadManager, DownloadManager*());
-  MOCK_CONST_METHOD0(IsPaused, bool());
-  MOCK_CONST_METHOD0(GetOpenWhenComplete, bool());
-  MOCK_METHOD1(SetOpenWhenComplete, void(bool));
-  MOCK_CONST_METHOD0(GetFileExternallyRemoved, bool());
-  MOCK_CONST_METHOD0(GetDangerType, DownloadDangerType());
-  MOCK_CONST_METHOD0(IsDangerous, bool());
-  MOCK_METHOD0(GetAutoOpened, bool());
-  MOCK_CONST_METHOD0(GetForcedFilePath, const base::FilePath&());
-  MOCK_CONST_METHOD0(HasUserGesture, bool());
-  MOCK_CONST_METHOD0(GetTransitionType, ui::PageTransition());
-  MOCK_CONST_METHOD0(IsTemporary, bool());
-  MOCK_METHOD1(SetOpened, void(bool));
-  MOCK_CONST_METHOD0(GetOpened, bool());
-  MOCK_CONST_METHOD0(GetLastModifiedTime, const std::string&());
-  MOCK_CONST_METHOD0(GetETag, const std::string&());
-  MOCK_CONST_METHOD0(GetLastReason, DownloadInterruptReason());
-  MOCK_CONST_METHOD0(GetBrowserContext, BrowserContext*());
-  MOCK_CONST_METHOD0(GetWebContents, WebContents*());
-  MOCK_CONST_METHOD0(GetFileNameToReportUser, base::FilePath());
-  MOCK_METHOD1(SetDisplayName, void(const base::FilePath&));
-  MOCK_METHOD0(NotifyRemoved, void());
-  // May be called when vlog is on.
-  std::string DebugString(bool verbose) const override {
-    return std::string();
-  }
-};
-
 class MockDownloadManagerDelegate : public DownloadManagerDelegate {
  public:
   MockDownloadManagerDelegate();
diff --git a/content/browser/download/download_request_core.cc b/content/browser/download/download_request_core.cc
index 699f771d..a99127c 100644
--- a/content/browser/download/download_request_core.cc
+++ b/content/browser/download/download_request_core.cc
@@ -351,6 +351,9 @@
 
     if (!headers->GetMimeType(&create_info->original_mime_type))
       create_info->original_mime_type.clear();
+
+    create_info->accept_range =
+        headers->HasHeaderValue("Accept-Ranges", "bytes");
   }
 
   // Blink verifies that the requester of this download is allowed to set a
diff --git a/content/browser/download/download_worker.cc b/content/browser/download/download_worker.cc
new file mode 100644
index 0000000..d537b1d
--- /dev/null
+++ b/content/browser/download/download_worker.cc
@@ -0,0 +1,93 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/download/download_worker.h"
+
+#include "content/browser/download/download_create_info.h"
+#include "content/public/browser/download_interrupt_reasons.h"
+#include "content/public/browser/web_contents.h"
+
+namespace content {
+namespace {
+
+const int kVerboseLevel = 1;
+
+std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread>
+CreateUrlDownloader(std::unique_ptr<DownloadUrlParameters> params,
+                    base::WeakPtr<UrlDownloader::Delegate> delegate) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  // Build the URLRequest, BlobDataHandle is hold in original request for image
+  // download.
+  std::unique_ptr<net::URLRequest> url_request =
+      DownloadRequestCore::CreateRequestOnIOThread(DownloadItem::kInvalidId,
+                                                   params.get());
+
+  return std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread>(
+      UrlDownloader::BeginDownload(delegate, std::move(url_request),
+                                   params->referrer())
+          .release());
+}
+
+}  // namespace
+
+DownloadWorker::DownloadWorker() : weak_factory_(this) {}
+
+DownloadWorker::~DownloadWorker() = default;
+
+void DownloadWorker::SendRequest(
+    std::unique_ptr<DownloadUrlParameters> params) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  BrowserThread::PostTaskAndReplyWithResult(
+      BrowserThread::IO, FROM_HERE,
+      base::Bind(&CreateUrlDownloader, base::Passed(&params),
+                 weak_factory_.GetWeakPtr()),
+      base::Bind(&DownloadWorker::AddUrlDownloader,
+                 weak_factory_.GetWeakPtr()));
+}
+
+void DownloadWorker::Pause() {
+  request_handle_->PauseRequest();
+}
+
+void DownloadWorker::Resume() {
+  request_handle_->ResumeRequest();
+}
+
+void DownloadWorker::Cancel() {
+  request_handle_->CancelRequest();
+}
+
+void DownloadWorker::OnUrlDownloaderStarted(
+    std::unique_ptr<DownloadCreateInfo> create_info,
+    std::unique_ptr<ByteStreamReader> stream_reader,
+    const DownloadUrlParameters::OnStartedCallback& callback) {
+  // |callback| is not used in subsequent requests.
+  DCHECK(callback.is_null());
+
+  // TODO(xingliu): Pass the |stream_reader| to parallel job and handle failed
+  // request.
+  if (create_info->result !=
+      DownloadInterruptReason::DOWNLOAD_INTERRUPT_REASON_NONE) {
+    VLOG(kVerboseLevel) << "Parallel download sub request failed. reason = "
+                        << create_info->result;
+    NOTIMPLEMENTED();
+    return;
+  }
+
+  request_handle_ = std::move(create_info->request_handle);
+}
+
+void DownloadWorker::OnUrlDownloaderStopped(UrlDownloader* downloader) {
+  // Release the |url_downloader_|, the object will be deleted on IO thread.
+  url_downloader_.reset();
+}
+
+void DownloadWorker::AddUrlDownloader(
+    std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread>
+        downloader) {
+  url_downloader_ = std::move(downloader);
+}
+
+}  // namespace content
diff --git a/content/browser/download/download_worker.h b/content/browser/download/download_worker.h
new file mode 100644
index 0000000..75a7f96c
--- /dev/null
+++ b/content/browser/download/download_worker.h
@@ -0,0 +1,63 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_WORKER_H_
+#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_WORKER_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "content/browser/byte_stream.h"
+#include "content/browser/download/download_request_handle.h"
+#include "content/browser/download/url_downloader.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/download_url_parameters.h"
+
+namespace content {
+
+// Helper class used to send subsequent range requests to fetch slices of the
+// file after handling response of the original non-range request.
+// TODO(xingliu): we should consider to reuse this class for single connection
+// download.
+class DownloadWorker : public UrlDownloader::Delegate {
+ public:
+  DownloadWorker();
+  virtual ~DownloadWorker();
+
+  // Send network request to ask for a download.
+  void SendRequest(std::unique_ptr<DownloadUrlParameters> params);
+
+  // Download operations.
+  void Pause();
+  void Resume();
+  void Cancel();
+
+ private:
+  // UrlDownloader::Delegate implementation.
+  void OnUrlDownloaderStarted(
+      std::unique_ptr<DownloadCreateInfo> create_info,
+      std::unique_ptr<ByteStreamReader> stream_reader,
+      const DownloadUrlParameters::OnStartedCallback& callback) override;
+  void OnUrlDownloaderStopped(UrlDownloader* downloader) override;
+
+  void AddUrlDownloader(
+      std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread>
+          downloader);
+
+  // Used to control the network request. Live on UI thread.
+  std::unique_ptr<DownloadRequestHandleInterface> request_handle_;
+
+  // Used to handle the url request. Live and die on IO thread.
+  std::unique_ptr<UrlDownloader, BrowserThread::DeleteOnIOThread>
+      url_downloader_;
+
+  base::WeakPtrFactory<DownloadWorker> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(DownloadWorker);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_WORKER_H_
diff --git a/content/browser/download/mock_download_item_impl.cc b/content/browser/download/mock_download_item_impl.cc
new file mode 100644
index 0000000..92795c0
--- /dev/null
+++ b/content/browser/download/mock_download_item_impl.cc
@@ -0,0 +1,38 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/download/mock_download_item_impl.h"
+
+namespace content {
+
+MockDownloadItemImpl::MockDownloadItemImpl(DownloadItemImplDelegate* delegate)
+    : DownloadItemImpl(delegate,
+                       std::string("7d122682-55b5-4a47-a253-36cadc3e5bee"),
+                       content::DownloadItem::kInvalidId,
+                       base::FilePath(),
+                       base::FilePath(),
+                       std::vector<GURL>(),
+                       GURL(),
+                       GURL(),
+                       GURL(),
+                       GURL(),
+                       "application/octet-stream",
+                       "application/octet-stream",
+                       base::Time(),
+                       base::Time(),
+                       std::string(),
+                       std::string(),
+                       0,
+                       0,
+                       std::string(),
+                       DownloadItem::COMPLETE,
+                       DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
+                       DOWNLOAD_INTERRUPT_REASON_NONE,
+                       false,
+                       std::vector<DownloadItem::ReceivedSlice>(),
+                       net::NetLogWithSource()) {}
+
+MockDownloadItemImpl::~MockDownloadItemImpl() = default;
+
+}  // namespace content
diff --git a/content/browser/download/mock_download_item_impl.h b/content/browser/download/mock_download_item_impl.h
new file mode 100644
index 0000000..205d84a9
--- /dev/null
+++ b/content/browser/download/mock_download_item_impl.h
@@ -0,0 +1,117 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOWNLOAD_MOCK_DOWNLOAD_ITEM_IMPL_H_
+#define CONTENT_BROWSER_DOWNLOAD_MOCK_DOWNLOAD_ITEM_IMPL_H_
+
+#include "base/macros.h"
+#include "content/browser/download/download_create_info.h"
+#include "content/browser/download/download_file.h"
+#include "content/browser/download/download_item_impl.h"
+#include "content/browser/download/download_request_handle.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace content {
+
+class BrowserContext;
+class DownloadManager;
+class WebContents;
+
+class MockDownloadItemImpl : public DownloadItemImpl {
+ public:
+  // Use history constructor for minimal base object.
+  explicit MockDownloadItemImpl(DownloadItemImplDelegate* delegate);
+  ~MockDownloadItemImpl() override;
+
+  MOCK_METHOD4(OnDownloadTargetDetermined,
+               void(const base::FilePath&,
+                    TargetDisposition,
+                    DownloadDangerType,
+                    const base::FilePath&));
+  MOCK_METHOD1(AddObserver, void(DownloadItem::Observer*));
+  MOCK_METHOD1(RemoveObserver, void(DownloadItem::Observer*));
+  MOCK_METHOD0(UpdateObservers, void());
+  MOCK_METHOD0(CanShowInFolder, bool());
+  MOCK_METHOD0(CanOpenDownload, bool());
+  MOCK_METHOD0(ShouldOpenFileBasedOnExtension, bool());
+  MOCK_METHOD0(OpenDownload, void());
+  MOCK_METHOD0(ShowDownloadInShell, void());
+  MOCK_METHOD0(ValidateDangerousDownload, void());
+  MOCK_METHOD2(StealDangerousDownload, void(bool, const AcquireFileCallback&));
+  MOCK_METHOD3(UpdateProgress, void(int64_t, int64_t, const std::string&));
+  MOCK_METHOD1(Cancel, void(bool));
+  MOCK_METHOD0(MarkAsComplete, void());
+  void OnAllDataSaved(int64_t, std::unique_ptr<crypto::SecureHash>) override {
+    NOTREACHED();
+  }
+  MOCK_METHOD0(OnDownloadedFileRemoved, void());
+  void Start(std::unique_ptr<DownloadFile> download_file,
+             std::unique_ptr<DownloadRequestHandleInterface> req_handle,
+             const DownloadCreateInfo& create_info) override {
+    MockStart(download_file.get(), req_handle.get());
+  }
+
+  MOCK_METHOD2(MockStart, void(DownloadFile*, DownloadRequestHandleInterface*));
+
+  MOCK_METHOD0(Remove, void());
+  MOCK_CONST_METHOD1(TimeRemaining, bool(base::TimeDelta*));
+  MOCK_CONST_METHOD0(CurrentSpeed, int64_t());
+  MOCK_CONST_METHOD0(PercentComplete, int());
+  MOCK_CONST_METHOD0(AllDataSaved, bool());
+  MOCK_CONST_METHOD1(MatchesQuery, bool(const base::string16& query));
+  MOCK_CONST_METHOD0(IsDone, bool());
+  MOCK_CONST_METHOD0(GetFullPath, const base::FilePath&());
+  MOCK_CONST_METHOD0(GetTargetFilePath, const base::FilePath&());
+  MOCK_CONST_METHOD0(GetTargetDisposition, TargetDisposition());
+  MOCK_METHOD1(OnContentCheckCompleted, void(DownloadDangerType));
+  MOCK_CONST_METHOD0(GetState, DownloadState());
+  MOCK_CONST_METHOD0(GetUrlChain, const std::vector<GURL>&());
+  MOCK_METHOD1(SetTotalBytes, void(int64_t));
+  MOCK_CONST_METHOD0(GetURL, const GURL&());
+  MOCK_CONST_METHOD0(GetOriginalUrl, const GURL&());
+  MOCK_CONST_METHOD0(GetReferrerUrl, const GURL&());
+  MOCK_CONST_METHOD0(GetTabUrl, const GURL&());
+  MOCK_CONST_METHOD0(GetTabReferrerUrl, const GURL&());
+  MOCK_CONST_METHOD0(GetSuggestedFilename, std::string());
+  MOCK_CONST_METHOD0(GetContentDisposition, std::string());
+  MOCK_CONST_METHOD0(GetMimeType, std::string());
+  MOCK_CONST_METHOD0(GetOriginalMimeType, std::string());
+  MOCK_CONST_METHOD0(GetReferrerCharset, std::string());
+  MOCK_CONST_METHOD0(GetRemoteAddress, std::string());
+  MOCK_CONST_METHOD0(GetTotalBytes, int64_t());
+  MOCK_CONST_METHOD0(GetReceivedBytes, int64_t());
+  MOCK_CONST_METHOD0(GetHashState, const std::string&());
+  MOCK_CONST_METHOD0(GetHash, const std::string&());
+  MOCK_CONST_METHOD0(GetId, uint32_t());
+  MOCK_CONST_METHOD0(GetGuid, const std::string&());
+  MOCK_CONST_METHOD0(GetStartTime, base::Time());
+  MOCK_CONST_METHOD0(GetEndTime, base::Time());
+  MOCK_METHOD0(GetDownloadManager, DownloadManager*());
+  MOCK_CONST_METHOD0(IsPaused, bool());
+  MOCK_CONST_METHOD0(GetOpenWhenComplete, bool());
+  MOCK_METHOD1(SetOpenWhenComplete, void(bool));
+  MOCK_CONST_METHOD0(GetFileExternallyRemoved, bool());
+  MOCK_CONST_METHOD0(GetDangerType, DownloadDangerType());
+  MOCK_CONST_METHOD0(IsDangerous, bool());
+  MOCK_METHOD0(GetAutoOpened, bool());
+  MOCK_CONST_METHOD0(GetForcedFilePath, const base::FilePath&());
+  MOCK_CONST_METHOD0(HasUserGesture, bool());
+  MOCK_CONST_METHOD0(GetTransitionType, ui::PageTransition());
+  MOCK_CONST_METHOD0(IsTemporary, bool());
+  MOCK_METHOD1(SetOpened, void(bool));
+  MOCK_CONST_METHOD0(GetOpened, bool());
+  MOCK_CONST_METHOD0(GetLastModifiedTime, const std::string&());
+  MOCK_CONST_METHOD0(GetETag, const std::string&());
+  MOCK_CONST_METHOD0(GetLastReason, DownloadInterruptReason());
+  MOCK_CONST_METHOD0(GetBrowserContext, BrowserContext*());
+  MOCK_CONST_METHOD0(GetWebContents, WebContents*());
+  MOCK_CONST_METHOD0(GetFileNameToReportUser, base::FilePath());
+  MOCK_METHOD1(SetDisplayName, void(const base::FilePath&));
+  MOCK_METHOD0(NotifyRemoved, void());
+  // May be called when vlog is on.
+  std::string DebugString(bool verbose) const override { return std::string(); }
+};
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_DOWNLOAD_MOCK_DOWNLOAD_ITEM_IMPL_H_
diff --git a/content/browser/download/mock_download_job.cc b/content/browser/download/mock_download_job.cc
index 9108e61..fd94c33 100644
--- a/content/browser/download/mock_download_job.cc
+++ b/content/browser/download/mock_download_job.cc
@@ -6,7 +6,8 @@
 
 namespace content {
 
-MockDownloadJob::MockDownloadJob() = default;
+MockDownloadJob::MockDownloadJob(DownloadItemImpl* download_item)
+    : DownloadJob(download_item) {}
 
 MockDownloadJob::~MockDownloadJob() = default;
 
diff --git a/content/browser/download/mock_download_job.h b/content/browser/download/mock_download_job.h
index 39ea72e..25a4ad037 100644
--- a/content/browser/download/mock_download_job.h
+++ b/content/browser/download/mock_download_job.h
@@ -14,15 +14,20 @@
 
 namespace content {
 
+class DownloadItemImpl;
+
 class MockDownloadJob : public DownloadJob {
  public:
-  MockDownloadJob();
+  explicit MockDownloadJob(DownloadItemImpl* download_item);
   ~MockDownloadJob() override;
 
+  DownloadItemImpl* download_item() { return download_item_; }
+
   // DownloadJob implementation.
+  MOCK_METHOD0(Start, void());
   MOCK_METHOD1(Cancel, void(bool));
   MOCK_METHOD0(Pause, void());
-  MOCK_METHOD0(Resume, void());
+  MOCK_METHOD1(Resume, void(bool));
   MOCK_CONST_METHOD0(CanOpen, bool());
   MOCK_CONST_METHOD0(CanResume, bool());
   MOCK_CONST_METHOD0(CanShowInFolder, bool());
diff --git a/content/browser/download/parallel_download_job.cc b/content/browser/download/parallel_download_job.cc
new file mode 100644
index 0000000..41ba75be
--- /dev/null
+++ b/content/browser/download/parallel_download_job.cc
@@ -0,0 +1,103 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/download/parallel_download_job.h"
+
+#include "base/memory/ptr_util.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/storage_partition.h"
+
+namespace content {
+
+namespace {
+
+// TODO(xingliu): Use finch parameters to configure constants.
+// Default number of requests in a parallel download, including the original
+// request.
+const int kParallelRequestCount = 2;
+
+}  // namespace
+
+ParallelDownloadJob::ParallelDownloadJob(
+    DownloadItemImpl* download_item,
+    std::unique_ptr<DownloadRequestHandleInterface> request_handle)
+    : DownloadJobImpl(download_item, std::move(request_handle)),
+      request_num_(kParallelRequestCount) {}
+
+ParallelDownloadJob::~ParallelDownloadJob() = default;
+
+void ParallelDownloadJob::Cancel(bool user_cancel) {
+  DownloadJobImpl::Cancel(user_cancel);
+  for (auto& worker : workers_)
+    worker->Cancel();
+}
+
+void ParallelDownloadJob::Pause() {
+  DownloadJobImpl::Pause();
+  for (auto& worker : workers_)
+    worker->Pause();
+}
+
+void ParallelDownloadJob::Resume(bool resume_request) {
+  DownloadJobImpl::Resume(resume_request);
+  if (!resume_request)
+    return;
+
+  for (auto& worker : workers_)
+    worker->Resume();
+}
+
+void ParallelDownloadJob::ForkRequestsForNewDownload(int64_t bytes_received,
+                                                     int64_t total_bytes) {
+  if (!download_item_ || total_bytes <= 0 || bytes_received >= total_bytes ||
+      request_num_ <= 1) {
+    return;
+  }
+
+  int64_t bytes_left = total_bytes - bytes_received;
+  int64_t slice_size = bytes_left / request_num_;
+  slice_size = slice_size > 0 ? slice_size : 1;
+  int num_requests = bytes_left / slice_size;
+  int64_t current_offset = bytes_received + slice_size;
+
+  // TODO(xingliu): Add records for slices in history db.
+  for (int i = 0; i < num_requests - 1; ++i) {
+    int64_t length = (i == (num_requests - 2))
+                         ? slice_size + (bytes_left % slice_size)
+                         : slice_size;
+    CreateRequest(current_offset, length);
+    current_offset += slice_size;
+  }
+}
+
+void ParallelDownloadJob::CreateRequest(int64_t offset, int64_t length) {
+  std::unique_ptr<DownloadWorker> worker = base::MakeUnique<DownloadWorker>();
+
+  DCHECK(download_item_);
+  StoragePartition* storage_partition =
+      BrowserContext::GetStoragePartitionForSite(
+          download_item_->GetBrowserContext(), download_item_->GetSiteUrl());
+
+  std::unique_ptr<DownloadUrlParameters> download_params(
+      new DownloadUrlParameters(download_item_->GetURL(),
+                                storage_partition->GetURLRequestContext()));
+  download_params->set_file_path(download_item_->GetFullPath());
+  download_params->set_last_modified(download_item_->GetLastModifiedTime());
+  download_params->set_etag(download_item_->GetETag());
+  download_params->set_offset(offset);
+
+  // Setting the length will result in range request to fetch a slice of the
+  // file.
+  download_params->set_length(length);
+
+  // Subsequent range requests have the same referrer URL as the original
+  // download request.
+  download_params->set_referrer(Referrer(download_item_->GetReferrerUrl(),
+                                         blink::WebReferrerPolicyAlways));
+  // Send the request.
+  worker->SendRequest(std::move(download_params));
+  workers_.push_back(std::move(worker));
+}
+
+}  // namespace content
diff --git a/content/browser/download/parallel_download_job.h b/content/browser/download/parallel_download_job.h
new file mode 100644
index 0000000..e3914ed0
--- /dev/null
+++ b/content/browser/download/parallel_download_job.h
@@ -0,0 +1,59 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_JOB_H_
+#define CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_JOB_H_
+
+#include <memory>
+#include <vector>
+
+#include "base/macros.h"
+#include "content/browser/download/download_job_impl.h"
+#include "content/browser/download/download_worker.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+// DownloadJob that can create concurrent range requests to fetch different
+// parts of the file.
+// The original request is hold in base class DownloadUrlJob.
+class CONTENT_EXPORT ParallelDownloadJob : public DownloadJobImpl {
+ public:
+  ParallelDownloadJob(
+      DownloadItemImpl* download_item,
+      std::unique_ptr<DownloadRequestHandleInterface> request_handle);
+  ~ParallelDownloadJob() override;
+
+  // DownloadUrlJob implementation.
+  void Cancel(bool user_cancel) override;
+  void Pause() override;
+  void Resume(bool resume_request) override;
+
+ private:
+  friend class ParallelDownloadJobTest;
+
+  typedef std::vector<std::unique_ptr<DownloadWorker>> WorkerList;
+
+  // Build multiple http requests for a new download,
+  // the rest of the bytes starting from |bytes_received| will be equally
+  // distributed to each connection, including the original connection.
+  // the last connection may take additional bytes.
+  void ForkRequestsForNewDownload(int64_t bytes_received, int64_t total_bytes);
+
+  // Create one range request, virtual for testing.
+  virtual void CreateRequest(int64_t offset, int64_t length);
+
+  // Number of concurrent requests for a new download, include the original
+  // request.
+  int request_num_;
+
+  // Subsequent tasks to send range requests.
+  WorkerList workers_;
+
+  DISALLOW_COPY_AND_ASSIGN(ParallelDownloadJob);
+};
+
+}  //  namespace content
+
+#endif  // CONTENT_BROWSER_DOWNLOAD_PARALLEL_DOWNLOAD_JOB_H_
diff --git a/content/browser/download/parallel_download_job_unittest.cc b/content/browser/download/parallel_download_job_unittest.cc
new file mode 100644
index 0000000..4828b2af
--- /dev/null
+++ b/content/browser/download/parallel_download_job_unittest.cc
@@ -0,0 +1,138 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/download/parallel_download_job.h"
+
+#include <utility>
+#include <vector>
+
+#include "base/memory/ptr_util.h"
+#include "content/browser/download/download_item_impl_delegate.h"
+#include "content/browser/download/mock_download_item_impl.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::NiceMock;
+
+namespace content {
+
+namespace {
+
+class MockDownloadRequestHandle : public DownloadRequestHandleInterface {
+ public:
+  MOCK_CONST_METHOD0(GetWebContents, WebContents*());
+  MOCK_CONST_METHOD0(GetDownloadManager, DownloadManager*());
+  MOCK_CONST_METHOD0(PauseRequest, void());
+  MOCK_CONST_METHOD0(ResumeRequest, void());
+  MOCK_CONST_METHOD0(CancelRequest, void());
+  MOCK_CONST_METHOD0(DebugString, std::string());
+};
+
+}  // namespace
+
+class ParallelDownloadJobForTest : public ParallelDownloadJob {
+ public:
+  ParallelDownloadJobForTest(
+      DownloadItemImpl* download_item,
+      std::unique_ptr<DownloadRequestHandleInterface> request_handle)
+      : ParallelDownloadJob(download_item, std::move(request_handle)) {}
+
+  void CreateRequest(int64_t offset, int64_t length) override {
+    fake_tasks_.push_back(std::pair<int64_t, int64_t>(offset, length));
+  }
+
+  std::vector<std::pair<int64_t, int64_t>> fake_tasks_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(ParallelDownloadJobForTest);
+};
+
+class ParallelDownloadJobTest : public testing::Test {
+ public:
+  void SetUp() override {
+    item_delegate_ = base::MakeUnique<DownloadItemImplDelegate>();
+    download_item_ =
+        base::MakeUnique<NiceMock<MockDownloadItemImpl>>(item_delegate_.get());
+    job_ = base::MakeUnique<ParallelDownloadJobForTest>(
+        download_item_.get(), base::MakeUnique<MockDownloadRequestHandle>());
+  }
+
+  void CreateNewDownloadRequests(int64_t total_bytes,
+                                 int64_t bytes_received,
+                                 int request_num) {
+    job_->request_num_ = request_num;
+    job_->ForkRequestsForNewDownload(bytes_received, total_bytes);
+  }
+
+  content::TestBrowserThreadBundle browser_threads_;
+  std::unique_ptr<DownloadItemImplDelegate> item_delegate_;
+  std::unique_ptr<MockDownloadItemImpl> download_item_;
+  std::unique_ptr<ParallelDownloadJobForTest> job_;
+};
+
+// Test if sub tasks are created correctly.
+TEST_F(ParallelDownloadJobTest, CreateNewDownloadRequests) {
+  EXPECT_TRUE(job_->fake_tasks_.empty());
+
+  // Totally 2 requests for 100 bytes.
+  // Original request:  Range:0-49, for 50 bytes.
+  // Task 1:  Range:50-99, for 50 bytes.
+  CreateNewDownloadRequests(100, 0, 2);
+  EXPECT_EQ(1, static_cast<int>(job_->fake_tasks_.size()));
+  EXPECT_EQ(50, job_->fake_tasks_[0].first);
+  EXPECT_EQ(50, job_->fake_tasks_[0].second);
+  job_->fake_tasks_.clear();
+
+  // Totally 3 requests for 100 bytes.
+  // Original request:  Range:0-32, for 33 bytes.
+  // Task 1:  Range:33-65, for 33 bytes.
+  // Task 2:  Range:66-99, for 34 bytes.
+  CreateNewDownloadRequests(100, 0, 3);
+  EXPECT_EQ(2, static_cast<int>(job_->fake_tasks_.size()));
+  EXPECT_EQ(33, job_->fake_tasks_[0].first);
+  EXPECT_EQ(33, job_->fake_tasks_[0].second);
+  EXPECT_EQ(66, job_->fake_tasks_[1].first);
+  EXPECT_EQ(34, job_->fake_tasks_[1].second);
+  job_->fake_tasks_.clear();
+
+  // Totally 3 requests for 100 bytes. Start from the 17th byte.
+  // Original request:  Range:17-43, for 27 bytes.
+  // Task 1:  Range:44-70, for 27 bytes.
+  // Task 2:  Range:71-99, for 29 bytes.
+  CreateNewDownloadRequests(100, 17, 3);
+  EXPECT_EQ(2, static_cast<int>(job_->fake_tasks_.size()));
+  EXPECT_EQ(44, job_->fake_tasks_[0].first);
+  EXPECT_EQ(27, job_->fake_tasks_[0].second);
+  EXPECT_EQ(71, job_->fake_tasks_[1].first);
+  EXPECT_EQ(29, job_->fake_tasks_[1].second);
+  job_->fake_tasks_.clear();
+
+  // Less than 2 requests, do nothing.
+  CreateNewDownloadRequests(100, 17, 1);
+  EXPECT_TRUE(job_->fake_tasks_.empty());
+  CreateNewDownloadRequests(100, 17, 0);
+  EXPECT_TRUE(job_->fake_tasks_.empty());
+
+  // Received bytes are no less than total bytes, do nothing.
+  CreateNewDownloadRequests(100, 100, 3);
+  EXPECT_TRUE(job_->fake_tasks_.empty());
+  CreateNewDownloadRequests(100, 255, 3);
+  EXPECT_TRUE(job_->fake_tasks_.empty());
+
+  // Edge cases for 0 bytes.
+  CreateNewDownloadRequests(0, 0, 3);
+  EXPECT_TRUE(job_->fake_tasks_.empty());
+
+  // 2 bytes left for 3 additional requests. Only 1 are built.
+  // Original request:  Range:98-98, for 1 byte.
+  // Task 1:  Range:99-99, for 1 byte.
+  CreateNewDownloadRequests(100, 98, 4);
+  EXPECT_EQ(1, static_cast<int>(job_->fake_tasks_.size()));
+  EXPECT_EQ(99, job_->fake_tasks_[0].first);
+  EXPECT_EQ(1, job_->fake_tasks_[0].second);
+  job_->fake_tasks_.clear();
+}
+
+}  // namespace content
diff --git a/content/browser/download/url_downloader.cc b/content/browser/download/url_downloader.cc
index 7f6019a..bc1ae26 100644
--- a/content/browser/download/url_downloader.cc
+++ b/content/browser/download/url_downloader.cc
@@ -10,7 +10,6 @@
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "content/browser/byte_stream.h"
 #include "content/browser/download/download_create_info.h"
-#include "content/browser/download/download_manager_impl.h"
 #include "content/browser/download/download_request_handle.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/download_interrupt_reasons.h"
@@ -27,27 +26,21 @@
 class UrlDownloader::RequestHandle : public DownloadRequestHandleInterface {
  public:
   RequestHandle(base::WeakPtr<UrlDownloader> downloader,
-                base::WeakPtr<DownloadManagerImpl> download_manager_impl,
                 scoped_refptr<base::SequencedTaskRunner> downloader_task_runner)
       : downloader_(downloader),
-        download_manager_impl_(download_manager_impl),
         downloader_task_runner_(downloader_task_runner) {}
   RequestHandle(RequestHandle&& other)
       : downloader_(std::move(other.downloader_)),
-        download_manager_impl_(std::move(other.download_manager_impl_)),
         downloader_task_runner_(std::move(other.downloader_task_runner_)) {}
   RequestHandle& operator=(RequestHandle&& other) {
     downloader_ = std::move(other.downloader_);
-    download_manager_impl_ = std::move(other.download_manager_impl_);
     downloader_task_runner_ = std::move(other.downloader_task_runner_);
     return *this;
   }
 
   // DownloadRequestHandleInterface
   WebContents* GetWebContents() const override { return nullptr; }
-  DownloadManager* GetDownloadManager() const override {
-    return download_manager_impl_ ? download_manager_impl_.get() : nullptr;
-  }
+  DownloadManager* GetDownloadManager() const override { return nullptr; }
   void PauseRequest() const override {
     downloader_task_runner_->PostTask(
         FROM_HERE, base::Bind(&UrlDownloader::PauseRequest, downloader_));
@@ -63,7 +56,6 @@
 
  private:
   base::WeakPtr<UrlDownloader> downloader_;
-  base::WeakPtr<DownloadManagerImpl> download_manager_impl_;
   scoped_refptr<base::SequencedTaskRunner> downloader_task_runner_;
 
   DISALLOW_COPY_AND_ASSIGN(RequestHandle);
@@ -71,7 +63,7 @@
 
 // static
 std::unique_ptr<UrlDownloader> UrlDownloader::BeginDownload(
-    base::WeakPtr<DownloadManagerImpl> download_manager,
+    base::WeakPtr<UrlDownloader::Delegate> delegate,
     std::unique_ptr<net::URLRequest> request,
     const Referrer& referrer) {
   Referrer::SetReferrerForRequest(request.get(), referrer);
@@ -82,16 +74,16 @@
   // From this point forward, the |UrlDownloader| is responsible for
   // |started_callback|.
   std::unique_ptr<UrlDownloader> downloader(
-      new UrlDownloader(std::move(request), download_manager));
+      new UrlDownloader(std::move(request), delegate));
   downloader->Start();
 
   return downloader;
 }
 
 UrlDownloader::UrlDownloader(std::unique_ptr<net::URLRequest> request,
-                             base::WeakPtr<DownloadManagerImpl> manager)
+                             base::WeakPtr<Delegate> delegate)
     : request_(std::move(request)),
-      manager_(manager),
+      delegate_(delegate),
       core_(request_.get(), this),
       weak_ptr_factory_(this) {}
 
@@ -213,13 +205,14 @@
     std::unique_ptr<DownloadCreateInfo> create_info,
     std::unique_ptr<ByteStreamReader> stream_reader,
     const DownloadUrlParameters::OnStartedCallback& callback) {
-  create_info->request_handle.reset(
-      new RequestHandle(weak_ptr_factory_.GetWeakPtr(), manager_,
-                        base::SequencedTaskRunnerHandle::Get()));
-  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
-                          base::Bind(&DownloadManagerImpl::StartDownload,
-                                     manager_, base::Passed(&create_info),
-                                     base::Passed(&stream_reader), callback));
+  create_info->request_handle.reset(new RequestHandle(
+      weak_ptr_factory_.GetWeakPtr(), base::SequencedTaskRunnerHandle::Get()));
+
+  BrowserThread::PostTask(
+      BrowserThread::UI, FROM_HERE,
+      base::Bind(&UrlDownloader::Delegate::OnUrlDownloaderStarted, delegate_,
+                 base::Passed(&create_info), base::Passed(&stream_reader),
+                 callback));
 }
 
 void UrlDownloader::OnReadyToRead() {
@@ -241,7 +234,8 @@
 void UrlDownloader::Destroy() {
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
-      base::Bind(&DownloadManagerImpl::RemoveUrlDownloader, manager_, this));
+      base::Bind(&UrlDownloader::Delegate::OnUrlDownloaderStopped, delegate_,
+                 this));
 }
 
 }  // namespace content
diff --git a/content/browser/download/url_downloader.h b/content/browser/download/url_downloader.h
index ffbc7e6..4ba35d0 100644
--- a/content/browser/download/url_downloader.h
+++ b/content/browser/download/url_downloader.h
@@ -21,17 +21,30 @@
 namespace content {
 class ByteStreamReader;
 struct DownloadCreateInfo;
-class DownloadManagerImpl;
 
 class UrlDownloader : public net::URLRequest::Delegate,
                       public DownloadRequestCore::Delegate {
  public:
+  // Implemented by the owner of UrlDownloader, functions need to be called on
+  // UI thread.
+  class Delegate {
+   public:
+    // Called after response is handled and the byte stream is established.
+    virtual void OnUrlDownloaderStarted(
+        std::unique_ptr<DownloadCreateInfo> download_create_info,
+        std::unique_ptr<ByteStreamReader> stream_reader,
+        const DownloadUrlParameters::OnStartedCallback& callback) = 0;
+
+    // Called after the connection is cannceled or finished.
+    virtual void OnUrlDownloaderStopped(UrlDownloader* downloader) = 0;
+  };
+
   UrlDownloader(std::unique_ptr<net::URLRequest> request,
-                base::WeakPtr<DownloadManagerImpl> manager);
+                base::WeakPtr<Delegate> delegate);
   ~UrlDownloader() override;
 
   static std::unique_ptr<UrlDownloader> BeginDownload(
-      base::WeakPtr<DownloadManagerImpl> download_manager,
+      base::WeakPtr<UrlDownloader::Delegate> delegate,
       std::unique_ptr<net::URLRequest> request,
       const Referrer& referrer);
 
@@ -67,7 +80,9 @@
   void Destroy();
 
   std::unique_ptr<net::URLRequest> request_;
-  base::WeakPtr<DownloadManagerImpl> manager_;
+
+  // Live on UI thread, post task to call |delegate_| functions.
+  base::WeakPtr<Delegate> delegate_;
   DownloadRequestCore core_;
 
   base::WeakPtrFactory<UrlDownloader> weak_ptr_factory_;
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 6246fac3..3beb56b 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -2603,6 +2603,12 @@
   Send(new InputMsg_DeleteSurroundingText(routing_id_, before, after));
 }
 
+void RenderFrameHostImpl::DeleteSurroundingTextInCodePoints(int before,
+                                                            int after) {
+  Send(new InputMsg_DeleteSurroundingTextInCodePoints(routing_id_, before,
+                                                      after));
+}
+
 void RenderFrameHostImpl::JavaScriptDialogClosed(
     IPC::Message* reply_msg,
     bool success,
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 0ca442b..0dd8f60 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -458,9 +458,16 @@
   void ExtendSelectionAndDelete(size_t before, size_t after);
 
   // Deletes text before and after the current cursor position, excluding the
-  // selection.
+  // selection. The lengths are supplied in Java chars (UTF-16 Code Unit), not
+  // in code points or in glyphs.
   void DeleteSurroundingText(size_t before, size_t after);
 
+  // Deletes text before and after the current cursor position, excluding the
+  // selection. The lengths are supplied in code points, not in Java chars
+  // (UTF-16 Code Unit) or in glyphs. Do nothing if there are one or more
+  // invalid surrogate pairs in the requested range.
+  void DeleteSurroundingTextInCodePoints(int before, int after);
+
   // Notifies the RenderFrame that the JavaScript message that was shown was
   // closed by the user.
   void JavaScriptDialogClosed(IPC::Message* reply_msg,
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc
index 987f0fa..f18085e 100644
--- a/content/browser/gpu/gpu_internals_ui.cc
+++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -304,6 +304,8 @@
       return "GPU_READ";
     case gfx::BufferUsage::SCANOUT:
       return "SCANOUT";
+    case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
+      return "SCANOUT_CPU_READ_WRITE";
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
       return "GPU_READ_CPU_READ_WRITE";
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
diff --git a/content/browser/loader/resource_scheduler.cc b/content/browser/loader/resource_scheduler.cc
index 5f8c5743..683e120a 100644
--- a/content/browser/loader/resource_scheduler.cc
+++ b/content/browser/loader/resource_scheduler.cc
@@ -18,6 +18,7 @@
 #include "base/stl_util.h"
 #include "base/supports_user_data.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "base/trace_event/trace_event.h"
 #include "content/common/resource_messages.h"
 #include "content/public/browser/resource_request_info.h"
 #include "content/public/browser/resource_throttle.h"
@@ -371,7 +372,7 @@
         in_flight_delayable_count_(0),
         total_layout_blocking_count_(0),
         priority_requests_delayable_(priority_requests_delayable),
-        has_pending_start_task_(false),
+        num_skipped_scans_due_to_scheduled_start_(0),
         started_requests_since_yielding_(0),
         did_scheduler_yield_(false),
         yielding_scheduler_enabled_(yielding_scheduler_enabled),
@@ -402,7 +403,7 @@
       EraseInFlightRequest(request);
 
       // Removing this request may have freed up another to load.
-      ScheduleLoadAnyStartablePendingRequests(
+      LoadAnyStartablePendingRequests(
           has_html_body_ ? RequestStartTrigger::COMPLETION_POST_BODY
                          : RequestStartTrigger::COMPLETION_PRE_BODY);
     }
@@ -765,12 +766,14 @@
   // TODO(csharrison): Reconsider this if IPC batching becomes an easy to use
   // pattern.
   void ScheduleLoadAnyStartablePendingRequests(RequestStartTrigger trigger) {
-    if (has_pending_start_task_)
-      return;
-    has_pending_start_task_ = true;
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(&Client::LoadAnyStartablePendingRequests,
-                              weak_ptr_factory_.GetWeakPtr(), trigger));
+    if (num_skipped_scans_due_to_scheduled_start_ == 0) {
+      TRACE_EVENT0("loading", "ScheduleLoadAnyStartablePendingRequests");
+      base::ThreadTaskRunnerHandle::Get()->PostTask(
+          FROM_HERE,
+          base::Bind(&Client::LoadAnyStartablePendingRequests,
+                     weak_ptr_factory_.GetWeakPtr(), trigger));
+    }
+    num_skipped_scans_due_to_scheduled_start_ += 1;
   }
 
   void ResumeIfYielded() {
@@ -803,7 +806,12 @@
     //     the previous request still in the list.
     // 3) We do not start the request, same as above, but StartRequest() tells
     //     us there's no point in checking any further requests.
-    has_pending_start_task_ = false;
+    TRACE_EVENT0("loading", "LoadAnyStartablePendingRequests");
+    if (num_skipped_scans_due_to_scheduled_start_ > 0) {
+      UMA_HISTOGRAM_COUNTS_1M("ResourceScheduler.NumSkippedScans.ScheduleStart",
+                              num_skipped_scans_due_to_scheduled_start_);
+    }
+    num_skipped_scans_due_to_scheduled_start_ = 0;
     RequestQueue::NetQueue::iterator request_iter =
         pending_requests_.GetNextHighestIterator();
 
@@ -851,7 +859,9 @@
   // be delayed.
   bool priority_requests_delayable_;
 
-  bool has_pending_start_task_;
+  // The number of LoadAnyStartablePendingRequests scans that were skipped due
+  // to smarter task scheduling around reprioritization.
+  int num_skipped_scans_due_to_scheduled_start_;
 
   // The number of started requests since the last ResumeIfYielded task was
   // run.
diff --git a/content/browser/renderer_host/ime_adapter_android.cc b/content/browser/renderer_host/ime_adapter_android.cc
index 0c852a3..3721d364 100644
--- a/content/browser/renderer_host/ime_adapter_android.cc
+++ b/content/browser/renderer_host/ime_adapter_android.cc
@@ -283,6 +283,17 @@
     rfh->DeleteSurroundingText(before, after);
 }
 
+void ImeAdapterAndroid::DeleteSurroundingTextInCodePoints(
+    JNIEnv*,
+    const JavaParamRef<jobject>&,
+    int before,
+    int after) {
+  RenderFrameHostImpl* rfh =
+      static_cast<RenderFrameHostImpl*>(GetFocusedFrame());
+  if (rfh)
+    rfh->DeleteSurroundingTextInCodePoints(before, after);
+}
+
 bool ImeAdapterAndroid::RequestTextInputStateUpdate(
     JNIEnv* env,
     const JavaParamRef<jobject>&) {
diff --git a/content/browser/renderer_host/ime_adapter_android.h b/content/browser/renderer_host/ime_adapter_android.h
index 288f4402..71ffef2 100644
--- a/content/browser/renderer_host/ime_adapter_android.h
+++ b/content/browser/renderer_host/ime_adapter_android.h
@@ -75,6 +75,11 @@
                              const base::android::JavaParamRef<jobject>&,
                              int before,
                              int after);
+  void DeleteSurroundingTextInCodePoints(
+      JNIEnv*,
+      const base::android::JavaParamRef<jobject>&,
+      int before,
+      int after);
   void ResetImeAdapter(JNIEnv*, const base::android::JavaParamRef<jobject>&);
   void RequestCursorUpdate(JNIEnv*, const base::android::JavaParamRef<jobject>&,
                            bool immediateRequest, bool monitorRequest);
diff --git a/content/common/input_messages.h b/content/common/input_messages.h
index 7221f95..7deff3c 100644
--- a/content/common/input_messages.h
+++ b/content/common/input_messages.h
@@ -163,11 +163,20 @@
                     int /* after */)
 
 // Deletes text before and after the current cursor position, excluding the
-// selection.
+// selection. The lengths are supplied in Java chars (UTF-16 Code Unit), not in
+// code points or in glyphs.
 IPC_MESSAGE_ROUTED2(InputMsg_DeleteSurroundingText,
                     int /* before */,
                     int /* after */)
 
+// Deletes text before and after the current cursor position, excluding the
+// selection. The lengths are supplied in code points, not in Java chars (UTF-16
+// Code Unit) or in glyphs. Does nothing if there are one or more invalid
+// surrogate pairs in the requested range
+IPC_MESSAGE_ROUTED2(InputMsg_DeleteSurroundingTextInCodePoints,
+                    int /* before */,
+                    int /* after */)
+
 // Selects between the given start and end offsets in the currently focused
 // editable field.
 IPC_MESSAGE_ROUTED2(InputMsg_SetEditableSelectionOffsets,
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
index 124dbcc8..5956eeea7 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java
@@ -633,6 +633,26 @@
     }
 
     /**
+     * Send a request to the native counterpart to delete a given range of characters.
+     * @param beforeLength Number of code points to extend the selection by before the existing
+     *                     selection.
+     * @param afterLength Number of code points to extend the selection by after the existing
+     *                    selection.
+     * @return Whether the native counterpart of ImeAdapter received the call.
+     */
+    boolean deleteSurroundingTextInCodePoints(int beforeLength, int afterLength) {
+        mViewEmbedder.onImeEvent();
+        if (mNativeImeAdapterAndroid == 0) return false;
+        nativeSendKeyEvent(mNativeImeAdapterAndroid, null, WebInputEventType.RawKeyDown, 0,
+                SystemClock.uptimeMillis(), COMPOSITION_KEY_CODE, 0, false, 0);
+        nativeDeleteSurroundingTextInCodePoints(
+                mNativeImeAdapterAndroid, beforeLength, afterLength);
+        nativeSendKeyEvent(mNativeImeAdapterAndroid, null, WebInputEventType.KeyUp, 0,
+                SystemClock.uptimeMillis(), COMPOSITION_KEY_CODE, 0, false, 0);
+        return true;
+    }
+
+    /**
      * Send a request to the native counterpart to set the selection to given range.
      * @param start Selection start index.
      * @param end Selection end index.
@@ -783,6 +803,8 @@
     private native void nativeSetComposingRegion(long nativeImeAdapterAndroid, int start, int end);
     private native void nativeDeleteSurroundingText(long nativeImeAdapterAndroid,
             int before, int after);
+    private native void nativeDeleteSurroundingTextInCodePoints(
+            long nativeImeAdapterAndroid, int before, int after);
     private native void nativeResetImeAdapter(long nativeImeAdapterAndroid);
     private native boolean nativeRequestTextInputStateUpdate(long nativeImeAdapterAndroid);
     private native void nativeRequestCursorUpdate(long nativeImeAdapterAndroid,
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java b/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
index f7dd561..274bb133 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/ThreadedInputConnection.java
@@ -427,9 +427,21 @@
     /**
      * @see InputConnection#deleteSurroundingTextInCodePoints(int, int)
      */
-    public boolean deleteSurroundingTextInCodePoints(int beforeLength, int afterLength) {
-        // TODO(changwan): Implement this. http://crbug.com/595525
-        return false;
+    public boolean deleteSurroundingTextInCodePoints(
+            final int beforeLength, final int afterLength) {
+        if (DEBUG_LOGS) {
+            Log.w(TAG, "deleteSurroundingTextInCodePoints [%d %d]", beforeLength, afterLength);
+        }
+        ThreadUtils.postOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                if (mPendingAccent != 0) {
+                    finishComposingTextOnUiThread();
+                }
+                mImeAdapter.deleteSurroundingTextInCodePoints(beforeLength, afterLength);
+            }
+        });
+        return true;
     }
 
     /**
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java b/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java
index 41f43d8b..d4e2547 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java
@@ -4,6 +4,7 @@
 
 package org.chromium.content.browser.input;
 
+import android.annotation.TargetApi;
 import android.app.Activity;
 import android.content.ClipData;
 import android.content.ClipboardManager;
@@ -265,6 +266,38 @@
 
     @SmallTest
     @Feature({"TextInput", "Main"})
+    public void testDeleteSurroundingTextInCodePointsWithRangeSelection() throws Throwable {
+        final String trophy = "\uD83C\uDFC6";
+        commitText("ab" + trophy + "cdef" + trophy + "gh", 1);
+        waitAndVerifyUpdateSelection(0, 12, 12, -1, -1);
+
+        setSelection(6, 8);
+        waitAndVerifyUpdateSelection(1, 6, 8, -1, -1);
+        assertTextsAroundCursor("ab" + trophy + "cd", "ef", trophy + "gh");
+
+        deleteSurroundingTextInCodePoints(2, 2);
+        waitAndVerifyUpdateSelection(2, 4, 6, -1, -1);
+        assertTextsAroundCursor("ab" + trophy, "ef", "h");
+    }
+
+    @SmallTest
+    @Feature({"TextInput", "Main"})
+    public void testDeleteSurroundingTextInCodePointsWithCursorSelection() throws Throwable {
+        final String trophy = "\uD83C\uDFC6";
+        commitText("ab" + trophy + "cd" + trophy, 1);
+        waitAndVerifyUpdateSelection(0, 8, 8, -1, -1);
+
+        setSelection(4, 4);
+        waitAndVerifyUpdateSelection(1, 4, 4, -1, -1);
+        assertTextsAroundCursor("ab" + trophy, null, "cd" + trophy);
+
+        deleteSurroundingTextInCodePoints(2, 2);
+        waitAndVerifyUpdateSelection(2, 1, 1, -1, -1);
+        assertTextsAroundCursor("a", null, trophy);
+    }
+
+    @SmallTest
+    @Feature({"TextInput", "Main"})
     public void testSetComposingTextForNewCursorPositions() throws Throwable {
         // Cursor is on the right of composing text when newCursorPosition > 0.
         setComposingText("ab", 1);
@@ -1382,6 +1415,48 @@
 
     @MediumTest
     @Feature({"TextInput"})
+    public void testContentEditableEvents_DeleteSurroundingTextInCodePoints() throws Throwable {
+        focusElementAndWaitForStateUpdate("contenteditable_event");
+        waitForEventLogs("selectionchange,selectionchange");
+        clearEventLogs();
+
+        commitText("hello", 1);
+        waitAndVerifyUpdateSelection(0, 5, 5, -1, -1);
+        waitForEventLogs("keydown(229),input,keyup(229),selectionchange");
+        clearEventLogs();
+
+        setSelection(2, 2);
+        waitAndVerifyUpdateSelection(1, 2, 2, -1, -1);
+        waitForEventLogs("selectionchange");
+        clearEventLogs();
+
+        deleteSurroundingTextInCodePoints(1, 1);
+        waitAndVerifyUpdateSelection(2, 1, 1, -1, -1);
+        // TODO(yabinh): It should only fire 1 input and 1 selectionchange events.
+        waitForEventLogs("keydown(229),input,input,keyup(229),selectionchange,selectionchange");
+    }
+
+    @MediumTest
+    @Feature({"TextInput"})
+    public void testInputTextEvents_DeleteSurroundingTextInCodePoints() throws Throwable {
+        commitText("hello", 1);
+        waitAndVerifyUpdateSelection(0, 5, 5, -1, -1);
+        waitForEventLogs("keydown(229),input,keyup(229),selectionchange");
+        clearEventLogs();
+
+        setSelection(2, 2);
+        waitAndVerifyUpdateSelection(1, 2, 2, -1, -1);
+        waitForEventLogs("selectionchange");
+        clearEventLogs();
+
+        deleteSurroundingTextInCodePoints(1, 1);
+        waitAndVerifyUpdateSelection(2, 1, 1, -1, -1);
+        // TODO(yabinh): It should only fire 1 input and 1 selectionchange events.
+        waitForEventLogs("keydown(229),input,input,keyup(229),selectionchange,selectionchange");
+    }
+
+    @MediumTest
+    @Feature({"TextInput"})
     public void testGetCursorCapsMode() throws Throwable {
         focusElementAndWaitForStateUpdate("contenteditable_event");
         commitText("Hello World", 1);
@@ -1756,6 +1831,21 @@
         });
     }
 
+    // Note that deleteSurroundingTextInCodePoints() was introduced in Android N (Api level 24), but
+    // the Android repository used in Chrome is behind that (level 23). So this function can't be
+    // called by keyboard apps currently.
+    @TargetApi(24)
+    private boolean deleteSurroundingTextInCodePoints(final int before, final int after)
+            throws Exception {
+        final ThreadedInputConnection connection = (ThreadedInputConnection) mConnection;
+        return runBlockingOnImeThread(new Callable<Boolean>() {
+            @Override
+            public Boolean call() {
+                return connection.deleteSurroundingTextInCodePoints(before, after);
+            }
+        });
+    }
+
     private CharSequence getTextBeforeCursor(final int length, final int flags) throws Exception {
         final ChromiumBaseInputConnection connection = mConnection;
         return runBlockingOnImeThread(new Callable<CharSequence>() {
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 4555fc24..4af9b671 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -1533,6 +1533,8 @@
     IPC_MESSAGE_HANDLER(InputMsg_ExtendSelectionAndDelete,
                         OnExtendSelectionAndDelete)
     IPC_MESSAGE_HANDLER(InputMsg_DeleteSurroundingText, OnDeleteSurroundingText)
+    IPC_MESSAGE_HANDLER(InputMsg_DeleteSurroundingTextInCodePoints,
+                        OnDeleteSurroundingTextInCodePoints)
     IPC_MESSAGE_HANDLER(InputMsg_SetCompositionFromExistingText,
                         OnSetCompositionFromExistingText)
     IPC_MESSAGE_HANDLER(InputMsg_SetEditableSelectionOffsets,
@@ -2108,6 +2110,12 @@
   frame_->deleteSurroundingText(before, after);
 }
 
+void RenderFrameImpl::OnDeleteSurroundingTextInCodePoints(int before,
+                                                          int after) {
+  ImeEventGuard guard(GetRenderWidget());
+  frame_->deleteSurroundingTextInCodePoints(before, after);
+}
+
 void RenderFrameImpl::OnSetAccessibilityMode(AccessibilityMode new_mode) {
   if (accessibility_mode_ == new_mode)
     return;
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index e80c00d..d1731be2 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -873,6 +873,7 @@
   void OnExecuteNoValueEditCommand(const std::string& name);
   void OnExtendSelectionAndDelete(int before, int after);
   void OnDeleteSurroundingText(int before, int after);
+  void OnDeleteSurroundingTextInCodePoints(int before, int after);
   void OnReload(bool bypass_cache);
   void OnReloadLoFiImages();
   void OnTextSurroundingSelectionRequest(uint32_t max_length);
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index 90e361c..38e418b6 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -1670,6 +1670,31 @@
   EXPECT_EQ(0, info.selectionEnd);
 }
 
+TEST_F(RenderViewImplTest, OnDeleteSurroundingTextInCodePoints) {
+  // Load an HTML page consisting of an input field.
+  LoadHTML(
+      // "ab" + trophy + space + "cdef" + trophy + space + "gh".
+      "<input id=\"test1\" value=\"ab&#x1f3c6; cdef&#x1f3c6; gh\">");
+  ExecuteJavaScriptForTests("document.getElementById('test1').focus();");
+
+  frame()->SetEditableSelectionOffsets(4, 4);
+  frame()->DeleteSurroundingTextInCodePoints(2, 2);
+  blink::WebInputMethodController* controller =
+      frame()->GetWebFrame()->inputMethodController();
+  blink::WebTextInputInfo info = controller->textInputInfo();
+  // "a" + "def" + trophy + space + "gh".
+  EXPECT_EQ(WebString::fromUTF8("adef\xF0\x9F\x8F\x86 gh"), info.value);
+  EXPECT_EQ(1, info.selectionStart);
+  EXPECT_EQ(1, info.selectionEnd);
+
+  frame()->SetEditableSelectionOffsets(1, 3);
+  frame()->DeleteSurroundingTextInCodePoints(1, 4);
+  info = controller->textInputInfo();
+  EXPECT_EQ("deh", info.value);
+  EXPECT_EQ(0, info.selectionStart);
+  EXPECT_EQ(2, info.selectionEnd);
+}
+
 // Test that the navigating specific frames works correctly.
 TEST_F(RenderViewImplTest, NavigateSubframe) {
   // Load page A.
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index d07808a..4215971 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -31,6 +31,8 @@
   sources = [
     "../browser/download/mock_download_file.cc",
     "../browser/download/mock_download_file.h",
+    "../browser/download/mock_download_item_impl.cc",
+    "../browser/download/mock_download_item_impl.h",
     "../browser/download/mock_download_job.cc",
     "../browser/download/mock_download_job.h",
     "../browser/media/session/mock_media_session_observer.cc",
@@ -1051,6 +1053,7 @@
     "../browser/download/download_job_unittest.cc",
     "../browser/download/download_manager_impl_unittest.cc",
     "../browser/download/download_request_core_unittest.cc",
+    "../browser/download/parallel_download_job_unittest.cc",
     "../browser/download/rate_estimator_unittest.cc",
     "../browser/download/save_package_unittest.cc",
     "../browser/fileapi/copy_or_move_file_validator_unittest.cc",
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc
index 7682e3e..786d5f4 100644
--- a/content/test/test_render_frame.cc
+++ b/content/test/test_render_frame.cc
@@ -56,6 +56,10 @@
   OnDeleteSurroundingText(before, after);
 }
 
+void TestRenderFrame::DeleteSurroundingTextInCodePoints(int before, int after) {
+  OnDeleteSurroundingTextInCodePoints(before, after);
+}
+
 void TestRenderFrame::Unselect() {
   OnUnselect();
 }
diff --git a/content/test/test_render_frame.h b/content/test/test_render_frame.h
index 62ddb2d..9d799268 100644
--- a/content/test/test_render_frame.h
+++ b/content/test/test_render_frame.h
@@ -38,6 +38,7 @@
   void SetEditableSelectionOffsets(int start, int end);
   void ExtendSelectionAndDelete(int before, int after);
   void DeleteSurroundingText(int before, int after);
+  void DeleteSurroundingTextInCodePoints(int before, int after);
   void Unselect();
   void SetAccessibilityMode(AccessibilityMode new_mode);
   void SetCompositionFromExistingText(
diff --git a/device/gamepad/gamepad_standard_mappings_linux.cc b/device/gamepad/gamepad_standard_mappings_linux.cc
index b4de59f..38367685 100644
--- a/device/gamepad/gamepad_standard_mappings_linux.cc
+++ b/device/gamepad/gamepad_standard_mappings_linux.cc
@@ -317,6 +317,38 @@
   mapped->axesLength = AXIS_INDEX_COUNT;
 }
 
+void MapperSamsung_EI_GP20(const blink::WebGamepad& input,
+                           blink::WebGamepad* mapped) {
+  *mapped = input;
+  mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0];
+  mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
+  mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3];
+  mapped->buttons[BUTTON_INDEX_QUATERNARY] = input.buttons[4];
+  mapped->buttons[BUTTON_INDEX_LEFT_SHOULDER] = NullButton();
+  mapped->buttons[BUTTON_INDEX_RIGHT_SHOULDER] = NullButton();
+  mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = input.buttons[6];
+  mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = input.buttons[7];
+  mapped->buttons[BUTTON_INDEX_BACK_SELECT] = input.buttons[10];
+  mapped->buttons[BUTTON_INDEX_START] = input.buttons[11];
+  mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = NullButton();
+  mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = NullButton();
+
+  mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[5]);
+  mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[5]);
+  mapped->buttons[BUTTON_INDEX_DPAD_LEFT] = AxisNegativeAsButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_DPAD_RIGHT] =
+      AxisPositiveAsButton(input.axes[4]);
+  mapped->buttons[BUTTON_INDEX_META] = input.buttons[15];
+
+  mapped->axes[AXIS_INDEX_LEFT_STICK_X] = input.axes[0];
+  mapped->axes[AXIS_INDEX_LEFT_STICK_Y] = input.axes[1];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_X] = input.axes[2];
+  mapped->axes[AXIS_INDEX_RIGHT_STICK_Y] = input.axes[3];
+
+  mapped->buttonsLength = BUTTON_INDEX_COUNT;
+  mapped->axesLength = AXIS_INDEX_COUNT;
+}
+
 struct MappingData {
   const char* const vendor_id;
   const char* const product_id;
@@ -335,6 +367,7 @@
     {"046d", "c21d", MapperXInputStyleGamepad},  // Logitech F310
     {"046d", "c21e", MapperXInputStyleGamepad},  // Logitech F510
     {"046d", "c21f", MapperXInputStyleGamepad},  // Logitech F710
+    {"04e8", "a000", MapperSamsung_EI_GP20},     // Samsung Gamepad EI-GP20
     {"054c", "0268", MapperPlaystationSixAxis},  // Playstation SIXAXIS
     {"054c", "05c4", MapperDualshock4},          // Playstation Dualshock 4
     {"054c", "09cc", MapperDualshock4},          // Dualshock 4 (PS4 Slim)
diff --git a/extensions/README b/extensions/README
deleted file mode 100644
index c994549..0000000
--- a/extensions/README
+++ /dev/null
@@ -1,3 +0,0 @@
-This will become a reusable extensions module. It implements the core parts of
-Chrome's extension system, and can be used with any host of the 'content'
-module.
diff --git a/extensions/README.md b/extensions/README.md
new file mode 100644
index 0000000..e17a37d
--- /dev/null
+++ b/extensions/README.md
@@ -0,0 +1,9 @@
+This will become a reusable extensions module. It implements the core parts of
+Chrome's extension system, and can be used with any host of the
+[content module](/content/README.md).
+
+Some extensions code that is not Chrome-specific still lives in
+[//chrome/browser/extensions](/chrome/browser/extensions) and will be moved
+here.
+
+See [//extensions/docs](/extensions/docs) for technical documentation.
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index b810232..5788904 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -87,6 +87,19 @@
 
 namespace {
 
+// Describes the action taken by the Web Request API for a given stage of a web
+// request.
+// These values are written to logs.  New enum values can be added, but existing
+// enum values must never be renumbered or deleted and reused.
+enum RequestAction {
+  CANCEL = 0,
+  REDIRECT = 1,
+  MODIFY_REQUEST_HEADERS = 2,
+  MODIFY_RESPONSE_HEADERS = 3,
+  SET_AUTH_CREDENTIALS = 4,
+  MAX
+};
+
 const char kWebRequestEventPrefix[] = "webRequest.";
 
 // List of all the webRequest events.
@@ -130,6 +143,12 @@
   return "Not reached";
 }
 
+void LogRequestAction(RequestAction action) {
+  DCHECK_NE(RequestAction::MAX, action);
+  UMA_HISTOGRAM_ENUMERATION("Extensions.WebRequestAction", action,
+                            RequestAction::MAX);
+}
+
 bool IsWebRequestEvent(const std::string& event_name) {
   std::string web_request_event_name(event_name);
   if (base::StartsWith(web_request_event_name,
@@ -1800,6 +1819,8 @@
       base::Time::Now() - blocked_request.blocking_time;
   request_time_tracker_->IncrementTotalBlockTime(request_id, block_time);
 
+  bool request_headers_modified = false;
+  bool response_headers_modified = false;
   bool credentials_set = false;
 
   deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder);
@@ -1817,17 +1838,15 @@
   } else if (blocked_request.event == kOnBeforeSendHeaders) {
     CHECK(!blocked_request.callback.is_null());
     helpers::MergeOnBeforeSendHeadersResponses(
-        blocked_request.response_deltas,
-        blocked_request.request_headers,
-        &warnings,
-        blocked_request.net_log);
+        blocked_request.response_deltas, blocked_request.request_headers,
+        &warnings, blocked_request.net_log, &request_headers_modified);
   } else if (blocked_request.event == kOnHeadersReceived) {
     CHECK(!blocked_request.callback.is_null());
     helpers::MergeOnHeadersReceivedResponses(
         blocked_request.request->url(), blocked_request.response_deltas,
         blocked_request.original_response_headers.get(),
         blocked_request.override_response_headers, blocked_request.new_url,
-        &warnings, blocked_request.net_log);
+        &warnings, blocked_request.net_log, &response_headers_modified);
   } else if (blocked_request.event == kOnAuthRequired) {
     CHECK(blocked_request.callback.is_null());
     CHECK(!blocked_request.auth_callback.is_null());
@@ -1850,12 +1869,28 @@
                    browser_context, warnings));
   }
 
-  if (canceled) {
+  const bool redirected =
+      blocked_request.new_url && !blocked_request.new_url->is_empty();
+
+  if (canceled)
     request_time_tracker_->SetRequestCanceled(request_id);
-  } else if (blocked_request.new_url &&
-             !blocked_request.new_url->is_empty()) {
+  else if (redirected)
     request_time_tracker_->SetRequestRedirected(request_id);
-  }
+
+  // Log UMA metrics. Note: We are not necessarily concerned with the final
+  // action taken. Instead we are interested in how frequently the different
+  // actions are used by extensions. Hence multiple actions may be logged for a
+  // single delta execution.
+  if (canceled)
+    LogRequestAction(RequestAction::CANCEL);
+  if (redirected)
+    LogRequestAction(RequestAction::REDIRECT);
+  if (request_headers_modified)
+    LogRequestAction(RequestAction::MODIFY_REQUEST_HEADERS);
+  if (response_headers_modified)
+    LogRequestAction(RequestAction::MODIFY_RESPONSE_HEADERS);
+  if (credentials_set)
+    LogRequestAction(RequestAction::SET_AUTH_CREDENTIALS);
 
   // This triggers onErrorOccurred if canceled is true.
   int rv = canceled ? net::ERR_BLOCKED_BY_CLIENT : net::OK;
diff --git a/extensions/browser/api/web_request/web_request_api_helpers.cc b/extensions/browser/api/web_request/web_request_api_helpers.cc
index 2acfd65d..4f9e10b 100644
--- a/extensions/browser/api/web_request/web_request_api_helpers.cc
+++ b/extensions/browser/api/web_request/web_request_api_helpers.cc
@@ -687,7 +687,11 @@
     const EventResponseDeltas& deltas,
     net::HttpRequestHeaders* request_headers,
     extensions::WarningSet* conflicting_extensions,
-    const net::NetLogWithSource* net_log) {
+    const net::NetLogWithSource* net_log,
+    bool* request_headers_modified) {
+  DCHECK(request_headers_modified);
+  *request_headers_modified = false;
+
   EventResponseDeltas::const_iterator delta;
 
   // Here we collect which headers we have removed or set to new values
@@ -784,6 +788,7 @@
       }
       net_log->AddEvent(net::NetLogEventType::CHROME_EXTENSION_MODIFIED_HEADERS,
                         base::Bind(&NetLogModificationCallback, delta->get()));
+      *request_headers_modified = true;
     } else {
       conflicting_extensions->insert(
           extensions::Warning::CreateRequestHeaderConflictWarning(
@@ -1051,7 +1056,11 @@
     scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
     GURL* allowed_unsafe_redirect_url,
     extensions::WarningSet* conflicting_extensions,
-    const net::NetLogWithSource* net_log) {
+    const net::NetLogWithSource* net_log,
+    bool* response_headers_modified) {
+  DCHECK(response_headers_modified);
+  *response_headers_modified = false;
+
   EventResponseDeltas::const_iterator delta;
 
   // Here we collect which headers we have removed or added so far due to
@@ -1117,6 +1126,7 @@
       }
       net_log->AddEvent(net::NetLogEventType::CHROME_EXTENSION_MODIFIED_HEADERS,
                         CreateNetLogExtensionIdCallback(delta->get()));
+      *response_headers_modified = true;
     } else {
       conflicting_extensions->insert(
           extensions::Warning::CreateResponseHeaderConflictWarning(
diff --git a/extensions/browser/api/web_request/web_request_api_helpers.h b/extensions/browser/api/web_request/web_request_api_helpers.h
index b1b9e6c..d6da981 100644
--- a/extensions/browser/api/web_request/web_request_api_helpers.h
+++ b/extensions/browser/api/web_request/web_request_api_helpers.h
@@ -281,11 +281,14 @@
     const net::NetLogWithSource* net_log);
 // Modifies the headers in |request_headers| according to |deltas|. Conflicts
 // are tried to be resolved.
+// Stores in |request_headers_modified| whether the request headers were
+// modified.
 void MergeOnBeforeSendHeadersResponses(
     const EventResponseDeltas& deltas,
     net::HttpRequestHeaders* request_headers,
     extensions::WarningSet* conflicting_extensions,
-    const net::NetLogWithSource* net_log);
+    const net::NetLogWithSource* net_log,
+    bool* request_headers_modified);
 // Modifies the "Set-Cookie" headers in |override_response_headers| according to
 // |deltas.response_cookie_modifications|. If |override_response_headers| is
 // NULL, a copy of |original_response_headers| is created. Conflicts are
@@ -302,6 +305,8 @@
 // Extension-initiated redirects are written to |override_response_headers|
 // (to request redirection) and |*allowed_unsafe_redirect_url| (to make sure
 // that the request is not cancelled with net::ERR_UNSAFE_REDIRECT).
+// Stores in |response_headers_modified| whether the response headers were
+// modified.
 void MergeOnHeadersReceivedResponses(
     const GURL& url,
     const EventResponseDeltas& deltas,
@@ -309,7 +314,8 @@
     scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
     GURL* allowed_unsafe_redirect_url,
     extensions::WarningSet* conflicting_extensions,
-    const net::NetLogWithSource* net_log);
+    const net::NetLogWithSource* net_log,
+    bool* response_headers_modified);
 // Merge the responses of blocked onAuthRequired handlers. The first
 // registered listener that supplies authentication credentials in a response,
 // if any, will have its authentication credentials used. |request| must be
diff --git a/extensions/docs/extension_and_app_types.md b/extensions/docs/extension_and_app_types.md
new file mode 100644
index 0000000..b409a4b
--- /dev/null
+++ b/extensions/docs/extension_and_app_types.md
@@ -0,0 +1,87 @@
+# Extension and App Types
+
+Generally, browser extensions cut across websites and web apps, while apps
+provide more isolated functionality.
+
+[TOC]
+
+![Summary of extension types showing browser extensions, packaged/platform apps,
+and hosted/bookmark apps](extension_types.png)
+
+## Browser extensions
+
+Browser extensions often provide an interactive toolbar icon, but can also run
+without any UI. They may interact with the browser or tab contents, and can
+request more extensive permissions than apps.
+
+## Apps
+
+### Platform app
+
+Platform apps (*v2 packaged apps*) are standalone applications that mostly run
+independently of the browser. Their windows look and feel like native
+applications but simply host the app's pages.
+
+Most apps, like Calculator and the Files app, create their window(s) and
+initialize a UI in response to Chrome's `chrome.app.runtime.onLaunched` event.
+Some apps don't show a window but work in the background instead. Platform apps
+can connect to more device types than browser extensions have access to.
+
+Platform apps are deprecated on non-Chrome OS platforms.
+
+### Packaged app (legacy)
+
+[Legacy (v1) packaged apps](https://developer.chrome.com/extensions/apps)
+combined the appearance of a [hosted app](#Hosted-app) -- a windowed wrapper
+around a website -- with the power of extension APIs. With the launch of
+platform apps and the app-specific APIs, legacy packaged apps are deprecated.
+
+### Hosted app
+
+A [hosted app](https://developer.chrome.com/webstore/hosted_apps) is mostly
+metadata: a web URL to launch, a list of associated URLs, and a list of HTML5
+permissions. Chrome ask for these permissions during the app's installation,
+allowing the associated URL to bypass the normal Chrome permission prompts for
+HTML5 features.
+
+### Bookmark app
+
+A bookmark app is a simplified hosted app that Chrome creates on demand. When
+the user taps "Add to desktop" (or "Add to shelf" on Chrome OS) in the Chrome
+menu, Chrome creates a barebones app whose manifest specifies the current tab's
+URL. A shortcut to this URL appears in chrome://apps using the site's favicon.
+
+Chrome then creates a desktop shortcut that will open a browser window with
+flags that specify the app and profile. Activating the icon launches the
+"bookmarked" URL in a tab or a window.
+
+## Manifest
+
+A particular manifest key in an extension's `manifest.json` file determines what
+kind of extension it is:
+
+* Platform app: `app.background.page` and/or `app.background.scripts`
+* Legacy packaged app: `app.launch.local_path`
+* Hosted app: `app.launch.web_url`
+* Browser extension: none of the above
+
+## Notes
+
+`Extension` is the class type for all extensions and apps, so technically
+speaking, an app *is-an* `Extension`. The word "extension" usually refers only
+to non-app extensions, a.k.a. *browser extensions*.
+
+## See also
+
+* [`Manifest::Type` declaration](https://cs.chromium.org/chromium/src/extensions/common/manifest.h?gs=cpp%253Aextensions%253A%253Aclass-Manifest%253A%253Aenum-Type%2540chromium%252F..%252F..%252Fextensions%252Fcommon%252Fmanifest.h%257Cdef&gsn=Type&ct=xref_usages)
+* Extensions (3rd-party developer documentation)
+    * [Extension APIs](https://developer.chrome.com/extensions/api_index)
+    * [Extension manifest file format](
+      https://developer.chrome.com/extensions/manifest)
+* Apps (3rd-party developer documentation)
+    * [Platform app APIs](https://developer.chrome.com/apps/api_index)
+    * [Platform app manifest file format](
+      https://developer.chrome.com/apps/manifest)
+    * [Choosing an app type](https://developer.chrome.com/webstore/choosing)
+    * Ancient article introducing the [motivation for apps (outdated)](
+      https://developer.chrome.com/webstore/apps_vs_extensions)
diff --git a/extensions/docs/extension_types.png b/extensions/docs/extension_types.png
new file mode 100644
index 0000000..5d66c16
--- /dev/null
+++ b/extensions/docs/extension_types.png
Binary files differ
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc
index 37bd2ea..2efc42d 100644
--- a/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc
+++ b/gpu/ipc/client/gpu_memory_buffer_impl_io_surface.cc
@@ -21,6 +21,7 @@
       return kIOSurfaceLockAvoidSync;
     case gfx::BufferUsage::GPU_READ:
     case gfx::BufferUsage::SCANOUT:
+    case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
       return 0;
   }
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc b/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc
index 9c2e1bc6..8390d38 100644
--- a/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc
+++ b/gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.cc
@@ -98,6 +98,7 @@
     case gfx::BufferUsage::GPU_READ:
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
+    case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
       return true;
     case gfx::BufferUsage::SCANOUT:
       return false;
diff --git a/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h b/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h
index fb27bb8..af67695c 100644
--- a/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h
+++ b/gpu/ipc/client/gpu_memory_buffer_impl_test_template.h
@@ -53,6 +53,7 @@
   for (auto format : gfx::GetBufferFormatsForTesting()) {
     gfx::BufferUsage usages[] = {
         gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT,
+        gfx::BufferUsage::SCANOUT_CPU_READ_WRITE,
         gfx::BufferUsage::GPU_READ_CPU_READ_WRITE,
         gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT};
     for (auto usage : usages) {
diff --git a/gpu/ipc/common/gpu_memory_buffer_support.cc b/gpu/ipc/common/gpu_memory_buffer_support.cc
index 64412459..aa3f179 100644
--- a/gpu/ipc/common/gpu_memory_buffer_support.cc
+++ b/gpu/ipc/common/gpu_memory_buffer_support.cc
@@ -31,6 +31,7 @@
   switch (usage) {
     case gfx::BufferUsage::GPU_READ:
     case gfx::BufferUsage::SCANOUT:
+    case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
       return format == gfx::BufferFormat::BGRA_8888 ||
              format == gfx::BufferFormat::RGBA_8888 ||
              format == gfx::BufferFormat::BGRX_8888;
diff --git a/gpu/ipc/host/gpu_memory_buffer_support.cc b/gpu/ipc/host/gpu_memory_buffer_support.cc
index 860257c..e006083 100644
--- a/gpu/ipc/host/gpu_memory_buffer_support.cc
+++ b/gpu/ipc/host/gpu_memory_buffer_support.cc
@@ -70,8 +70,9 @@
         gfx::BufferFormat::RGBX_8888, gfx::BufferFormat::BGRA_8888,
         gfx::BufferFormat::BGRX_8888, gfx::BufferFormat::UYVY_422,
         gfx::BufferFormat::YVU_420,   gfx::BufferFormat::YUV_420_BIPLANAR};
-    const gfx::BufferUsage kGPUReadWriteUsages[] = {gfx::BufferUsage::GPU_READ,
-                                                    gfx::BufferUsage::SCANOUT};
+    const gfx::BufferUsage kGPUReadWriteUsages[] = {
+        gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT,
+        gfx::BufferUsage::SCANOUT_CPU_READ_WRITE};
     for (auto format : kGPUReadWriteFormats) {
       for (auto usage : kGPUReadWriteUsages) {
         if (IsNativeGpuMemoryBufferConfigurationSupported(format, usage))
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h b/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h
index 0af2d6e8..4d0ed2d 100644
--- a/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h
+++ b/gpu/ipc/service/gpu_memory_buffer_factory_test_template.h
@@ -32,6 +32,7 @@
   for (auto format : gfx::GetBufferFormatsForTesting()) {
     gfx::BufferUsage usages[] = {
         gfx::BufferUsage::GPU_READ, gfx::BufferUsage::SCANOUT,
+        gfx::BufferUsage::SCANOUT_CPU_READ_WRITE,
         gfx::BufferUsage::GPU_READ_CPU_READ_WRITE,
         gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT};
     for (auto usage : usages) {
diff --git a/gpu/tools/compositor_model_bench/render_tree.cc b/gpu/tools/compositor_model_bench/render_tree.cc
index 752975c28..e98d174 100644
--- a/gpu/tools/compositor_model_bench/render_tree.cc
+++ b/gpu/tools/compositor_model_bench/render_tree.cc
@@ -362,7 +362,7 @@
       n->add_child(child.release());
   }
 
-  return n;
+  return std::move(n);
 }
 
 std::unique_ptr<RenderNode> InterpretCanvasLayer(
@@ -381,7 +381,7 @@
   if (!InterpretCCData(node, n.get()))
     return nullptr;
 
-  return n;
+  return std::move(n);
 }
 
 std::unique_ptr<RenderNode> InterpretVideoLayer(
@@ -400,7 +400,7 @@
   if (!InterpretCCData(node, n.get()))
     return nullptr;
 
-  return n;
+  return std::move(n);
 }
 
 std::unique_ptr<RenderNode> InterpretImageLayer(
@@ -419,7 +419,7 @@
   if (!InterpretCCData(node, n.get()))
     return nullptr;
 
-  return n;
+  return std::move(n);
 }
 
 std::unique_ptr<RenderNode> InterpretNode(const base::DictionaryValue& node) {
@@ -472,4 +472,3 @@
 
   return InterpretContentLayer(*root);
 }
-
diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm
index f669f1bf..2dc15af 100644
--- a/ios/chrome/browser/tabs/tab.mm
+++ b/ios/chrome/browser/tabs/tab.mm
@@ -1796,6 +1796,11 @@
   [parentTabModel_ notifyTabChanged:self];
 }
 
+- (void)webStateDidChangeTitle:(web::WebState*)webState {
+  [self saveTitleToHistoryDB];
+  [parentTabModel_ notifyTabChanged:self];
+}
+
 - (void)webStateDidDismissInterstitial:(web::WebState*)webState {
   [parentTabModel_ notifyTabChanged:self];
 }
@@ -1815,12 +1820,6 @@
   return YES;
 }
 
-- (void)webController:(CRWWebController*)webController
-       titleDidChange:(NSString*)title {
-  [self saveTitleToHistoryDB];
-  [parentTabModel_ notifyTabChanged:self];
-}
-
 - (BOOL)urlTriggersNativeAppLaunch:(const GURL&)url
                          sourceURL:(const GURL&)sourceURL
                        linkClicked:(BOOL)linkClicked {
diff --git a/ios/chrome/browser/tabs/tab_unittest.mm b/ios/chrome/browser/tabs/tab_unittest.mm
index 1136415..7594a6980 100644
--- a/ios/chrome/browser/tabs/tab_unittest.mm
+++ b/ios/chrome/browser/tabs/tab_unittest.mm
@@ -54,7 +54,6 @@
 using web::WebStateImpl;
 
 static const char kNewTabUrl[] = "chrome://newtab/";
-static NSString* const kNewTabTitle = @"New Tab";
 static const char kGoogleUserUrl[] = "http://google.com";
 static const char kGoogleRedirectUrl[] = "http://www.google.fr/";
 static NSString* const kGoogleTitle = @"Google";
@@ -247,7 +246,7 @@
     base::string16 new_title = base::SysNSStringToUTF16(title);
     [tab_ navigationManager]->GetLastCommittedItem()->SetTitle(new_title);
 
-    [tab_ webController:mock_web_controller_ titleDidChange:title];
+    web_state_impl_->OnTitleChanged();
     [[[(id)mock_web_controller_ expect]
         andReturnValue:OCMOCK_VALUE(kPageLoaded)] loadPhase];
     web_state_impl_->OnPageLoaded(redirectUrl, true);
@@ -267,7 +266,7 @@
     [[[(id)mock_web_controller_ expect]
         andReturnValue:OCMOCK_VALUE(kPageLoaded)] loadPhase];
     web_state_impl_->OnPageLoaded(url, true);
-    [tab_ webController:mock_web_controller_ titleDidChange:kNewTabTitle];
+    web_state_impl_->OnTitleChanged();
   }
 
   void QueryAllHistory(history::QueryResults* results) {
diff --git a/ios/chrome/browser/ui/main/main_view_controller.h b/ios/chrome/browser/ui/main/main_view_controller.h
index 92ea289..16174892 100644
--- a/ios/chrome/browser/ui/main/main_view_controller.h
+++ b/ios/chrome/browser/ui/main/main_view_controller.h
@@ -5,7 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_UI_MAIN_MAIN_VIEW_CONTROLLER_H_
 #define IOS_CHROME_BROWSER_UI_MAIN_MAIN_VIEW_CONTROLLER_H_
 
-#import <UIKit/UIKIt.h>
+#import <UIKit/UIKit.h>
 
 // A UIViewController that provides a property to maintain a single child view
 // controller.
diff --git a/ios/web/public/test/fakes/crw_test_web_state_observer.h b/ios/web/public/test/fakes/crw_test_web_state_observer.h
index 5befde4..6d01ab0f 100644
--- a/ios/web/public/test/fakes/crw_test_web_state_observer.h
+++ b/ios/web/public/test/fakes/crw_test_web_state_observer.h
@@ -46,6 +46,11 @@
   double progress;
 };
 
+// Arguments passed to |webStateDidChangeTitle:|.
+struct TestTitleWasSetInfo {
+  WebState* web_state;
+};
+
 // Arguments passed to |webState:didSubmitDocumentWithFormNamed:userInitiated:|.
 struct TestSubmitDocumentInfo {
   WebState* web_state;
@@ -116,6 +121,8 @@
 // Arguments passed to |webState:didChangeLoadingProgress:|.
 @property(nonatomic, readonly)
     web::TestChangeLoadingProgressInfo* changeLoadingProgressInfo;
+// Arguments passed to |webStateDidChangeTitle:|.
+@property(nonatomic, readonly) web::TestTitleWasSetInfo* titleWasSetInfo;
 // Arguments passed to |webState:didSubmitDocumentWithFormNamed:userInitiated:|.
 @property(nonatomic, readonly) web::TestSubmitDocumentInfo* submitDocumentInfo;
 // Arguments passed to
diff --git a/ios/web/public/test/fakes/crw_test_web_state_observer.mm b/ios/web/public/test/fakes/crw_test_web_state_observer.mm
index b7e785c..1d79daf 100644
--- a/ios/web/public/test/fakes/crw_test_web_state_observer.mm
+++ b/ios/web/public/test/fakes/crw_test_web_state_observer.mm
@@ -29,6 +29,8 @@
   // Arguments passed to |webState:didChangeLoadingProgress:|.
   std::unique_ptr<web::TestChangeLoadingProgressInfo>
       _changeLoadingProgressInfo;
+  // Arguments passed to |webStateDidChangeTitle:|.
+  std::unique_ptr<web::TestTitleWasSetInfo> _titleWasSetInfo;
   // Arguments passed to
   // |webState:didSubmitDocumentWithFormNamed:userInitiated:|.
   std::unique_ptr<web::TestSubmitDocumentInfo> _submitDocumentInfo;
@@ -72,6 +74,10 @@
   return _changeLoadingProgressInfo.get();
 }
 
+- (web::TestTitleWasSetInfo*)titleWasSetInfo {
+  return _titleWasSetInfo.get();
+}
+
 - (web::TestSubmitDocumentInfo*)submitDocumentInfo {
   return _submitDocumentInfo.get();
 }
@@ -143,6 +149,11 @@
   _changeLoadingProgressInfo->progress = progress;
 }
 
+- (void)webStateDidChangeTitle:(web::WebState*)webState {
+  _titleWasSetInfo = base::MakeUnique<web::TestTitleWasSetInfo>();
+  _titleWasSetInfo->web_state = webState;
+}
+
 - (void)webState:(web::WebState*)webState
     didSubmitDocumentWithFormNamed:(const std::string&)formName
                      userInitiated:(BOOL)userInitiated {
diff --git a/ios/web/public/web_state/ui/crw_web_delegate.h b/ios/web/public/web_state/ui/crw_web_delegate.h
index 838af86..04d273a 100644
--- a/ios/web/public/web_state/ui/crw_web_delegate.h
+++ b/ios/web/public/web_state/ui/crw_web_delegate.h
@@ -125,10 +125,6 @@
 // or nil otherwise.
 - (id<CRWNativeContent>)controllerForUnhandledContentAtURL:(const GURL&)url;
 
-// Called when the page supplies a new title.
-- (void)webController:(CRWWebController*)webController
-       titleDidChange:(NSString*)title;
-
 // Called when CRWWebController did suppress a dialog (JavaScript, HTTP
 // authentication or window.open).
 // NOTE: Called only if CRWWebController.shouldSuppressDialogs is set to YES.
diff --git a/ios/web/public/web_state/web_state_observer.h b/ios/web/public/web_state/web_state_observer.h
index ff0a15de..bbf6da5 100644
--- a/ios/web/public/web_state/web_state_observer.h
+++ b/ios/web/public/web_state/web_state_observer.h
@@ -85,6 +85,9 @@
   // loaded).
   virtual void LoadProgressChanged(double progress) {}
 
+  // Called when the title of the WebState is set.
+  virtual void TitleWasSet() {}
+
   // Called on form submission. |user_initiated| is true if the user
   // interacted with the page.
   virtual void DocumentSubmitted(const std::string& form_name,
diff --git a/ios/web/public/web_state/web_state_observer_bridge.h b/ios/web/public/web_state/web_state_observer_bridge.h
index 93614ab..7e51232 100644
--- a/ios/web/public/web_state/web_state_observer_bridge.h
+++ b/ios/web/public/web_state/web_state_observer_bridge.h
@@ -39,6 +39,9 @@
 - (void)webState:(web::WebState*)webState
     didChangeLoadingProgress:(double)progress;
 
+// Invoked by WebStateObserverBridge::TitleWasSet.
+- (void)webStateDidChangeTitle:(web::WebState*)webState;
+
 // Invoked by WebStateObserverBridge::DocumentSubmitted.
 - (void)webState:(web::WebState*)webState
     didSubmitDocumentWithFormNamed:(const std::string&)formName
@@ -95,6 +98,7 @@
       web::PageLoadCompletionStatus load_completion_status) override;
   void InterstitialDismissed() override;
   void LoadProgressChanged(double progress) override;
+  void TitleWasSet() override;
   void DocumentSubmitted(const std::string& form_name,
                          bool user_initiated) override;
   void FormActivityRegistered(const std::string& form_name,
diff --git a/ios/web/web_state/ui/crw_context_menu_controller.h b/ios/web/web_state/ui/crw_context_menu_controller.h
index e068caf..9be3c98 100644
--- a/ios/web/web_state/ui/crw_context_menu_controller.h
+++ b/ios/web/web_state/ui/crw_context_menu_controller.h
@@ -6,7 +6,7 @@
 #define IOS_WEB_WEB_STATE_UI_CRW_CONTEXT_MENU_CONTROLLER_H_
 
 #import <Foundation/Foundation.h>
-#import <Webkit/Webkit.h>
+#import <WebKit/WebKit.h>
 
 #import "ios/web/public/block_types.h"
 
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index a232f4c6..ac37f126 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -1019,12 +1019,8 @@
 
 - (void)setDelegate:(id<CRWWebDelegate>)delegate {
   _delegate.reset(delegate);
-  if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) {
-    if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)])
-      [self.nativeController setDelegate:self];
-    else
-      [self.nativeController setDelegate:nil];
-  }
+  if ([self.nativeController respondsToSelector:@selector(setDelegate:)])
+    [self.nativeController setDelegate:self];
 }
 
 - (void)dealloc {
@@ -1086,8 +1082,7 @@
 
 // NativeControllerDelegate method, called to inform that title has changed.
 - (void)nativeContent:(id)content titleDidChange:(NSString*)title {
-  // Responsiveness to delegate method was checked in setDelegate:.
-  [_delegate webController:self titleDidChange:title];
+  _webStateImpl->OnTitleChanged();
 }
 
 - (void)setNativeControllerWebUsageEnabled:(BOOL)webUsageEnabled {
@@ -1375,10 +1370,7 @@
   // other platforms send this (tab sync triggers need to be compared against
   // upstream).
   self.navigationManagerImpl->OnNavigationItemChanged();
-
-  if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) {
-    [_delegate webController:self titleDidChange:title];
-  }
+  _webStateImpl->OnTitleChanged();
 }
 
 - (BOOL)isCurrentNavigationItemPOST {
@@ -1803,15 +1795,12 @@
   [self didFinishWithURL:currentURL loadSuccess:loadSuccess];
 
   NSString* title = [self.nativeController title];
-  if (title)
+  if (title) {
     [self setNavigationItemTitle:title];
+  }
 
-  // If the controller handles title change notification, route those to the
-  // delegate.
-  if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) {
-    if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) {
-      [self.nativeController setDelegate:self];
-    }
+  if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) {
+    [self.nativeController setDelegate:self];
   }
 }
 
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm
index 3a52ccdc..51541e2 100644
--- a/ios/web/web_state/ui/crw_web_controller_unittest.mm
+++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -10,6 +10,7 @@
 
 #include "base/ios/ios_util.h"
 #import "base/mac/scoped_nsobject.h"
+#include "base/strings/utf_string_conversions.h"
 #import "base/test/ios/wait_util.h"
 #import "ios/testing/ocmock_complex_type_helper.h"
 #import "ios/web/navigation/crw_session_controller.h"
@@ -992,6 +993,41 @@
   EXPECT_FALSE([delegate_ initiatedByUser]);
 };
 
+// Tests page title changes.
+typedef web::WebTestWithWebState CRWWebControllerTitleTest;
+TEST_F(CRWWebControllerTitleTest, TitleChange) {
+  // Observes and waits for TitleWasSet call.
+  class TitleObserver : public web::WebStateObserver {
+   public:
+    explicit TitleObserver(web::WebState* web_state)
+        : web::WebStateObserver(web_state) {}
+    // Returns number of times |TitleWasSet| was called.
+    int title_change_count() { return title_change_count_; }
+    // WebStateObserver overrides:
+    void TitleWasSet() override { title_change_count_++; }
+
+   private:
+    int title_change_count_ = 0;
+  };
+
+  TitleObserver observer(web_state());
+  ASSERT_EQ(0, observer.title_change_count());
+
+  // Expect TitleWasSet callback after the page is loaded.
+  LoadHtml(@"<title>Title1</title>");
+  EXPECT_EQ("Title1", base::UTF16ToUTF8(web_state()->GetTitle()));
+  EXPECT_EQ(1, observer.title_change_count());
+
+  // Expect at least one more TitleWasSet callback after changing title via
+  // JavaScript. On iOS 10 WKWebView fires 3 callbacks after JS excucution
+  // with the following title changes: "Title2", "" and "Title2".
+  // TODO(crbug.com/696104): There should be only 2 calls of TitleWasSet.
+  // Fix expecteation when WKWebView stops sending extra KVO calls.
+  ExecuteJavaScript(@"window.document.title = 'Title2';");
+  EXPECT_EQ("Title2", base::UTF16ToUTF8(web_state()->GetTitle()));
+  EXPECT_GE(observer.title_change_count(), 2);
+};
+
 // Fixture class to test WKWebView crashes.
 class CRWWebControllerWebProcessTest : public web::WebTestWithWebController {
  protected:
diff --git a/ios/web/web_state/web_state_impl.h b/ios/web/web_state/web_state_impl.h
index 5d4f0e8..2123406 100644
--- a/ios/web/web_state/web_state_impl.h
+++ b/ios/web/web_state/web_state_impl.h
@@ -88,6 +88,9 @@
   // Notifies the observers that navigation to error page did finish.
   void OnErrorPageNavigation(const GURL& url);
 
+  // Called when page title was changed.
+  void OnTitleChanged();
+
   // Notifies the observers that the render process was terminated.
   void OnRenderProcessGone();
 
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm
index 824affd..b386a03b 100644
--- a/ios/web/web_state/web_state_impl.mm
+++ b/ios/web/web_state/web_state_impl.mm
@@ -207,6 +207,11 @@
     observer.DidFinishNavigation(context.get());
 }
 
+void WebStateImpl::OnTitleChanged() {
+  for (auto& observer : observers_)
+    observer.TitleWasSet();
+}
+
 void WebStateImpl::OnRenderProcessGone() {
   for (auto& observer : observers_)
     observer.RenderProcessGone();
diff --git a/ios/web/web_state/web_state_impl_unittest.mm b/ios/web/web_state/web_state_impl_unittest.mm
index 3aa7097..dfd34691 100644
--- a/ios/web/web_state/web_state_impl_unittest.mm
+++ b/ios/web/web_state/web_state_impl_unittest.mm
@@ -129,6 +129,7 @@
         page_loaded_called_with_success_(false),
         history_state_changed_called_(false),
         did_finish_navigation_called_(false),
+        title_was_set_called_(false),
         web_state_destroyed_called_(false) {}
 
   // Methods returning true if the corresponding WebStateObserver method has
@@ -154,6 +155,7 @@
   bool did_finish_navigation_called() const {
     return did_finish_navigation_called_;
   }
+  bool title_was_set_called() const { return title_was_set_called_; }
   bool web_state_destroyed_called() const {
     return web_state_destroyed_called_;
   }
@@ -180,6 +182,7 @@
     page_loaded_called_with_success_ =
         load_completion_status == PageLoadCompletionStatus::SUCCESS;
   }
+  void TitleWasSet() override { title_was_set_called_ = true; }
   void WebStateDestroyed() override {
     EXPECT_TRUE(web_state()->IsBeingDestroyed());
     web_state_destroyed_called_ = true;
@@ -193,6 +196,7 @@
   bool page_loaded_called_with_success_;
   bool history_state_changed_called_;
   bool did_finish_navigation_called_;
+  bool title_was_set_called_;
   bool web_state_destroyed_called_;
 };
 
@@ -399,6 +403,11 @@
   web_state_->OnErrorPageNavigation(GURL("http://test"));
   EXPECT_TRUE(observer->did_finish_navigation_called());
 
+  // Test that OnTitleChanged() is called.
+  EXPECT_FALSE(observer->title_was_set_called());
+  web_state_->OnTitleChanged();
+  EXPECT_TRUE(observer->title_was_set_called());
+
   // Test that WebStateDestroyed() is called.
   EXPECT_FALSE(observer->web_state_destroyed_called());
   web_state_.reset();
diff --git a/ios/web/web_state/web_state_observer_bridge.mm b/ios/web/web_state/web_state_observer_bridge.mm
index bf22c02c..cd54e6db 100644
--- a/ios/web/web_state/web_state_observer_bridge.mm
+++ b/ios/web/web_state/web_state_observer_bridge.mm
@@ -73,6 +73,11 @@
     [observer_ webState:web_state() didChangeLoadingProgress:progress];
 }
 
+void WebStateObserverBridge::TitleWasSet() {
+  if ([observer_ respondsToSelector:@selector(webStateDidChangeTitle:)])
+    [observer_ webStateDidChangeTitle:web_state()];
+}
+
 void WebStateObserverBridge::DocumentSubmitted(const std::string& form_name,
                                                bool user_initiated) {
   SEL selector =
diff --git a/ios/web/web_state/web_state_observer_bridge_unittest.mm b/ios/web/web_state/web_state_observer_bridge_unittest.mm
index 8d626ef..e627675 100644
--- a/ios/web/web_state/web_state_observer_bridge_unittest.mm
+++ b/ios/web/web_state/web_state_observer_bridge_unittest.mm
@@ -101,6 +101,15 @@
   EXPECT_EQ(kTestLoadProgress, [observer_ changeLoadingProgressInfo]->progress);
 }
 
+// Tests |webStateDidChangeTitle:| forwarding.
+TEST_F(WebStateObserverBridgeTest, TitleWasSet) {
+  ASSERT_FALSE([observer_ titleWasSetInfo]);
+
+  bridge_->TitleWasSet();
+  ASSERT_TRUE([observer_ titleWasSetInfo]);
+  EXPECT_EQ(&test_web_state_, [observer_ titleWasSetInfo]->web_state);
+}
+
 // Tests |webState:didSubmitDocumentWithFormNamed:userInitiated:| forwarding.
 TEST_F(WebStateObserverBridgeTest, DocumentSubmitted) {
   ASSERT_FALSE([observer_ submitDocumentInfo]);
diff --git a/media/base/demuxer_perftest.cc b/media/base/demuxer_perftest.cc
index 45b44991..b04db50 100644
--- a/media/base/demuxer_perftest.cc
+++ b/media/base/demuxer_perftest.cc
@@ -12,6 +12,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/test/scoped_task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -48,20 +49,19 @@
   DISALLOW_COPY_AND_ASSIGN(DemuxerHostImpl);
 };
 
-static void QuitLoopWithStatus(base::MessageLoop* message_loop,
+static void QuitLoopWithStatus(base::Closure quit_cb,
                                media::PipelineStatus status) {
   CHECK_EQ(status, media::PIPELINE_OK);
-  message_loop->task_runner()->PostTask(
-      FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
+  quit_cb.Run();
 }
 
 static void OnEncryptedMediaInitData(EmeInitDataType init_data_type,
                                      const std::vector<uint8_t>& init_data) {
-  VLOG(0) << "File is encrypted.";
+  DVLOG(1) << "File is encrypted.";
 }
 
 static void OnMediaTracksUpdated(std::unique_ptr<MediaTracks> tracks) {
-  VLOG(0) << "Got media tracks info, tracks = " << tracks->tracks().size();
+  DVLOG(1) << "Got media tracks info, tracks = " << tracks->tracks().size();
 }
 
 typedef std::vector<media::DemuxerStream* > Streams;
@@ -177,10 +177,10 @@
 
 static void RunDemuxerBenchmark(const std::string& filename) {
   base::FilePath file_path(GetTestDataFilePath(filename));
-  double total_time = 0.0;
+  base::TimeDelta total_time;
   for (int i = 0; i < kBenchmarkIterations; ++i) {
     // Setup.
-    base::MessageLoop message_loop;
+    base::test::ScopedTaskScheduler scoped_task_scheduler;
     DemuxerHostImpl demuxer_host;
     FileDataSource data_source;
     ASSERT_TRUE(data_source.Initialize(file_path));
@@ -189,34 +189,32 @@
         base::Bind(&OnEncryptedMediaInitData);
     Demuxer::MediaTracksUpdatedCB tracks_updated_cb =
         base::Bind(&OnMediaTracksUpdated);
-    FFmpegDemuxer demuxer(message_loop.task_runner(), &data_source,
+    FFmpegDemuxer demuxer(base::ThreadTaskRunnerHandle::Get(), &data_source,
                           encrypted_media_init_data_cb, tracks_updated_cb,
                           new MediaLog());
 
-    demuxer.Initialize(&demuxer_host,
-                       base::Bind(&QuitLoopWithStatus, &message_loop),
-                       false);
-    base::RunLoop().Run();
+    {
+      base::RunLoop run_loop;
+      demuxer.Initialize(
+          &demuxer_host,
+          base::Bind(&QuitLoopWithStatus, run_loop.QuitClosure()), false);
+      run_loop.Run();
+    }
+
     StreamReader stream_reader(&demuxer, false);
 
     // Benchmark.
     base::TimeTicks start = base::TimeTicks::Now();
-    while (!stream_reader.IsDone()) {
+    while (!stream_reader.IsDone())
       stream_reader.Read();
-    }
-    base::TimeTicks end = base::TimeTicks::Now();
-    total_time += (end - start).InSecondsF();
+    total_time += base::TimeTicks::Now() - start;
     demuxer.Stop();
-    QuitLoopWithStatus(&message_loop, PIPELINE_OK);
-    base::RunLoop().Run();
+    base::RunLoop().RunUntilIdle();
   }
 
-  perf_test::PrintResult("demuxer_bench",
-                         "",
-                         filename,
-                         kBenchmarkIterations / total_time,
-                         "runs/s",
-                         true);
+  perf_test::PrintResult("demuxer_bench", "", filename,
+                         kBenchmarkIterations / total_time.InSecondsF(),
+                         "runs/s", true);
 }
 
 #if defined(OS_WIN)
diff --git a/media/filters/blocking_url_protocol.cc b/media/filters/blocking_url_protocol.cc
index 9f8e95e..760e4c4e3 100644
--- a/media/filters/blocking_url_protocol.cc
+++ b/media/filters/blocking_url_protocol.cc
@@ -17,6 +17,7 @@
                                          const base::Closure& error_cb)
     : data_source_(data_source),
       error_cb_(error_cb),
+      is_streaming_(data_source_->IsStreaming()),
       aborted_(base::WaitableEvent::ResetPolicy::MANUAL,
                base::WaitableEvent::InitialState::NOT_SIGNALED),  // We never
                                                                   // want to
@@ -31,24 +32,32 @@
 
 void BlockingUrlProtocol::Abort() {
   aborted_.Signal();
+  base::AutoLock lock(data_source_lock_);
+  data_source_ = nullptr;
 }
 
 int BlockingUrlProtocol::Read(int size, uint8_t* data) {
-  // Read errors are unrecoverable.
-  if (aborted_.IsSignaled())
-    return AVERROR(EIO);
+  {
+    // Read errors are unrecoverable.
+    base::AutoLock lock(data_source_lock_);
+    if (!data_source_) {
+      DCHECK(aborted_.IsSignaled());
+      return AVERROR(EIO);
+    }
 
-  // Even though FFmpeg defines AVERROR_EOF, it's not to be used with I/O
-  // routines. Instead return 0 for any read at or past EOF.
-  int64_t file_size;
-  if (data_source_->GetSize(&file_size) && read_position_ >= file_size)
-    return 0;
+    // Even though FFmpeg defines AVERROR_EOF, it's not to be used with I/O
+    // routines. Instead return 0 for any read at or past EOF.
+    int64_t file_size;
+    if (data_source_->GetSize(&file_size) && read_position_ >= file_size)
+      return 0;
 
-  // Blocking read from data source until either:
-  //   1) |last_read_bytes_| is set and |read_complete_| is signalled
-  //   2) |aborted_| is signalled
-  data_source_->Read(read_position_, size, data, base::Bind(
-      &BlockingUrlProtocol::SignalReadCompleted, base::Unretained(this)));
+    // Blocking read from data source until either:
+    //   1) |last_read_bytes_| is set and |read_complete_| is signalled
+    //   2) |aborted_| is signalled
+    data_source_->Read(read_position_, size, data,
+                       base::Bind(&BlockingUrlProtocol::SignalReadCompleted,
+                                  base::Unretained(this)));
+  }
 
   base::WaitableEvent* events[] = { &aborted_, &read_complete_ };
   size_t index = base::WaitableEvent::WaitMany(events, arraysize(events));
@@ -75,8 +84,10 @@
 }
 
 bool BlockingUrlProtocol::SetPosition(int64_t position) {
+  base::AutoLock lock(data_source_lock_);
   int64_t file_size;
-  if ((data_source_->GetSize(&file_size) && position > file_size) ||
+  if (!data_source_ ||
+      (data_source_->GetSize(&file_size) && position > file_size) ||
       position < 0) {
     return false;
   }
@@ -86,11 +97,12 @@
 }
 
 bool BlockingUrlProtocol::GetSize(int64_t* size_out) {
-  return data_source_->GetSize(size_out);
+  base::AutoLock lock(data_source_lock_);
+  return data_source_ ? data_source_->GetSize(size_out) : 0;
 }
 
 bool BlockingUrlProtocol::IsStreaming() {
-  return data_source_->IsStreaming();
+  return is_streaming_;
 }
 
 void BlockingUrlProtocol::SignalReadCompleted(int size) {
diff --git a/media/filters/blocking_url_protocol.h b/media/filters/blocking_url_protocol.h
index 4f9ef4f..7e6a1eb 100644
--- a/media/filters/blocking_url_protocol.h
+++ b/media/filters/blocking_url_protocol.h
@@ -9,6 +9,7 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
+#include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
 #include "media/filters/ffmpeg_glue.h"
 
@@ -17,19 +18,19 @@
 class DataSource;
 
 // An implementation of FFmpegURLProtocol that blocks until the underlying
-// asynchronous DataSource::Read() operation completes.
+// asynchronous DataSource::Read() operation completes. Generally constructed on
+// the media thread and used by ffmpeg through the AVIO interface from a
+// sequenced blocking pool.
 class MEDIA_EXPORT BlockingUrlProtocol : public FFmpegURLProtocol {
  public:
   // Implements FFmpegURLProtocol using the given |data_source|. |error_cb| is
   // fired any time DataSource::Read() returns an error.
-  //
-  // TODO(scherkus): After all blocking operations are isolated on a separate
-  // thread we should be able to eliminate |error_cb|.
   BlockingUrlProtocol(DataSource* data_source, const base::Closure& error_cb);
   virtual ~BlockingUrlProtocol();
 
   // Aborts any pending reads by returning a read error. After this method
-  // returns all subsequent calls to Read() will immediately fail.
+  // returns all subsequent calls to Read() will immediately fail. May be called
+  // from any thread and upon return ensures no further use of |data_source_|.
   void Abort();
 
   // FFmpegURLProtocol implementation.
@@ -44,8 +45,14 @@
   // has completed.
   void SignalReadCompleted(int size);
 
+  // |data_source_lock_| allows Abort() to be called from any thread and stop
+  // all outstanding access to |data_source_|. Typically Abort() is called from
+  // the media thread while ffmpeg is operating on another thread.
+  base::Lock data_source_lock_;
   DataSource* data_source_;
+
   base::Closure error_cb_;
+  const bool is_streaming_;
 
   // Used to unblock the thread during shutdown and when reads complete.
   base::WaitableEvent aborted_;
diff --git a/media/filters/blocking_url_protocol_unittest.cc b/media/filters/blocking_url_protocol_unittest.cc
index 266f893..dda4000 100644
--- a/media/filters/blocking_url_protocol_unittest.cc
+++ b/media/filters/blocking_url_protocol_unittest.cc
@@ -20,9 +20,10 @@
 class BlockingUrlProtocolTest : public testing::Test {
  public:
   BlockingUrlProtocolTest()
-      : url_protocol_(&data_source_,
-                      base::Bind(&BlockingUrlProtocolTest::OnDataSourceError,
-                                 base::Unretained(this))) {
+      : url_protocol_(new BlockingUrlProtocol(
+            &data_source_,
+            base::Bind(&BlockingUrlProtocolTest::OnDataSourceError,
+                       base::Unretained(this)))) {
     CHECK(data_source_.Initialize(GetTestDataFilePath("bear-320x240.webm")));
   }
 
@@ -33,7 +34,7 @@
   MOCK_METHOD0(OnDataSourceError, void());
 
   FileDataSource data_source_;
-  BlockingUrlProtocol url_protocol_;
+  std::unique_ptr<BlockingUrlProtocol> url_protocol_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BlockingUrlProtocolTest);
@@ -43,35 +44,35 @@
 TEST_F(BlockingUrlProtocolTest, Read) {
   // Set read head to zero as Initialize() will have parsed a bit of the file.
   int64_t position = 0;
-  EXPECT_TRUE(url_protocol_.SetPosition(0));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
+  EXPECT_TRUE(url_protocol_->SetPosition(0));
+  EXPECT_TRUE(url_protocol_->GetPosition(&position));
   EXPECT_EQ(0, position);
 
   // Read 32 bytes from offset zero and verify position.
   uint8_t buffer[32];
-  EXPECT_EQ(32, url_protocol_.Read(32, buffer));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
+  EXPECT_EQ(32, url_protocol_->Read(32, buffer));
+  EXPECT_TRUE(url_protocol_->GetPosition(&position));
   EXPECT_EQ(32, position);
 
   // Read an additional 32 bytes and verify position.
-  EXPECT_EQ(32, url_protocol_.Read(32, buffer));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
+  EXPECT_EQ(32, url_protocol_->Read(32, buffer));
+  EXPECT_TRUE(url_protocol_->GetPosition(&position));
   EXPECT_EQ(64, position);
 
   // Seek to end and read until EOF.
   int64_t size = 0;
-  EXPECT_TRUE(url_protocol_.GetSize(&size));
-  EXPECT_TRUE(url_protocol_.SetPosition(size - 48));
-  EXPECT_EQ(32, url_protocol_.Read(32, buffer));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
+  EXPECT_TRUE(url_protocol_->GetSize(&size));
+  EXPECT_TRUE(url_protocol_->SetPosition(size - 48));
+  EXPECT_EQ(32, url_protocol_->Read(32, buffer));
+  EXPECT_TRUE(url_protocol_->GetPosition(&position));
   EXPECT_EQ(size - 16, position);
 
-  EXPECT_EQ(16, url_protocol_.Read(32, buffer));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
+  EXPECT_EQ(16, url_protocol_->Read(32, buffer));
+  EXPECT_TRUE(url_protocol_->GetPosition(&position));
   EXPECT_EQ(size, position);
 
-  EXPECT_EQ(0, url_protocol_.Read(32, buffer));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
+  EXPECT_EQ(0, url_protocol_->Read(32, buffer));
+  EXPECT_TRUE(url_protocol_->GetPosition(&position));
   EXPECT_EQ(size, position);
 }
 
@@ -80,23 +81,23 @@
 
   uint8_t buffer[32];
   EXPECT_CALL(*this, OnDataSourceError());
-  EXPECT_EQ(AVERROR(EIO), url_protocol_.Read(32, buffer));
+  EXPECT_EQ(AVERROR(EIO), url_protocol_->Read(32, buffer));
 }
 
 TEST_F(BlockingUrlProtocolTest, GetSetPosition) {
   int64_t size;
   int64_t position;
-  EXPECT_TRUE(url_protocol_.GetSize(&size));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
+  EXPECT_TRUE(url_protocol_->GetSize(&size));
+  EXPECT_TRUE(url_protocol_->GetPosition(&position));
 
-  EXPECT_TRUE(url_protocol_.SetPosition(512));
-  EXPECT_FALSE(url_protocol_.SetPosition(size + 1));
-  EXPECT_FALSE(url_protocol_.SetPosition(-1));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
+  EXPECT_TRUE(url_protocol_->SetPosition(512));
+  EXPECT_FALSE(url_protocol_->SetPosition(size + 1));
+  EXPECT_FALSE(url_protocol_->SetPosition(-1));
+  EXPECT_TRUE(url_protocol_->GetPosition(&position));
   EXPECT_EQ(512, position);
 
-  EXPECT_TRUE(url_protocol_.SetPosition(size));
-  EXPECT_TRUE(url_protocol_.GetPosition(&position));
+  EXPECT_TRUE(url_protocol_->SetPosition(size));
+  EXPECT_TRUE(url_protocol_->GetPosition(&position));
   EXPECT_EQ(size, position);
 }
 
@@ -104,18 +105,21 @@
   int64_t data_source_size = 0;
   int64_t url_protocol_size = 0;
   EXPECT_TRUE(data_source_.GetSize(&data_source_size));
-  EXPECT_TRUE(url_protocol_.GetSize(&url_protocol_size));
+  EXPECT_TRUE(url_protocol_->GetSize(&url_protocol_size));
   EXPECT_NE(0, data_source_size);
   EXPECT_EQ(data_source_size, url_protocol_size);
 }
 
 TEST_F(BlockingUrlProtocolTest, IsStreaming) {
   EXPECT_FALSE(data_source_.IsStreaming());
-  EXPECT_FALSE(url_protocol_.IsStreaming());
+  EXPECT_FALSE(url_protocol_->IsStreaming());
 
   data_source_.force_streaming_for_testing();
+  url_protocol_.reset(new BlockingUrlProtocol(
+      &data_source_, base::Bind(&BlockingUrlProtocolTest::OnDataSourceError,
+                                base::Unretained(this))));
   EXPECT_TRUE(data_source_.IsStreaming());
-  EXPECT_TRUE(url_protocol_.IsStreaming());
+  EXPECT_TRUE(url_protocol_->IsStreaming());
 }
 
 }  // namespace media
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
index f7747e6..7919a2e 100644
--- a/media/filters/ffmpeg_demuxer.cc
+++ b/media/filters/ffmpeg_demuxer.cc
@@ -22,6 +22,8 @@
 #include "base/strings/stringprintf.h"
 #include "base/sys_byteorder.h"
 #include "base/task_runner_util.h"
+#include "base/task_scheduler/post_task.h"
+#include "base/threading/sequenced_worker_pool.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "media/audio/sample_rates.h"
@@ -845,7 +847,13 @@
     const scoped_refptr<MediaLog>& media_log)
     : host_(NULL),
       task_runner_(task_runner),
-      blocking_thread_("FFmpegDemuxer"),
+      // FFmpeg has no asynchronous API, so we use base::WaitableEvents inside
+      // the BlockingUrlProtocol to handle hops to the render thread for network
+      // reads and seeks.
+      blocking_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
+          base::TaskTraits().MayBlock().WithBaseSyncPrimitives().WithPriority(
+              base::TaskPriority::USER_BLOCKING))),
+      stopped_(false),
       pending_read_(false),
       data_source_(data_source),
       media_log_(media_log),
@@ -866,6 +874,12 @@
   // NOTE: This class is not destroyed on |task_runner|, so we must ensure that
   // there are no outstanding WeakPtrs by the time we reach here.
   DCHECK(!weak_factory_.HasWeakPtrs());
+
+  // There may be outstanding tasks in the blocking pool which are trying to use
+  // these members, so release them in sequence with any outstanding calls. The
+  // earlier call to Abort() on |data_source_| prevents further access to it.
+  blocking_task_runner_->DeleteSoon(FROM_HERE, url_protocol_.release());
+  blocking_task_runner_->DeleteSoon(FROM_HERE, glue_.release());
 }
 
 std::string FFmpegDemuxer::GetDisplayName() const {
@@ -899,9 +913,8 @@
   format_context->max_analyze_duration = 60 * AV_TIME_BASE;
 
   // Open the AVFormatContext using our glue layer.
-  CHECK(blocking_thread_.Start());
   base::PostTaskAndReplyWithResult(
-      blocking_thread_.task_runner().get(), FROM_HERE,
+      blocking_task_runner_.get(), FROM_HERE,
       base::Bind(&FFmpegGlue::OpenContext, base::Unretained(glue_.get())),
       base::Bind(&FFmpegDemuxer::OnOpenContextDone, weak_factory_.GetWeakPtr(),
                  status_cb));
@@ -911,7 +924,7 @@
   DCHECK(task_runner_->BelongsToCurrentThread());
 
   // If Stop() has been called, then drop this call.
-  if (!blocking_thread_.IsRunning())
+  if (stopped_)
     return;
 
   // This should only be called after the demuxer has been initialized.
@@ -929,7 +942,7 @@
   data_source_->Abort();
 
   // Aborting the read may cause EOF to be marked, undo this.
-  blocking_thread_.task_runner()->PostTask(
+  blocking_task_runner_->PostTask(
       FROM_HERE, base::Bind(&UnmarkEndOfStream, glue_->format_context()));
   pending_read_ = false;
 
@@ -949,12 +962,6 @@
   data_source_->Stop();
   url_protocol_->Abort();
 
-  // This will block until all tasks complete. Note that after this returns it's
-  // possible for reply tasks (e.g., OnReadFrameDone()) to be queued on this
-  // thread. Each of the reply task methods must check whether we've stopped the
-  // thread and drop their results on the floor.
-  blocking_thread_.Stop();
-
   for (const auto& stream : streams_) {
     if (stream)
       stream->Stop();
@@ -963,7 +970,9 @@
   data_source_ = NULL;
 
   // Invalidate WeakPtrs on |task_runner_|, destruction may happen on another
-  // thread.
+  // thread. We don't need to wait for any outstanding tasks since they will all
+  // fail to return after invalidating WeakPtrs.
+  stopped_ = true;
   weak_factory_.InvalidateWeakPtrs();
   cancel_pending_seek_factory_.InvalidateWeakPtrs();
 }
@@ -1022,7 +1031,7 @@
 
   pending_seek_cb_ = cb;
   base::PostTaskAndReplyWithResult(
-      blocking_thread_.task_runner().get(), FROM_HERE,
+      blocking_task_runner_.get(), FROM_HERE,
       base::Bind(&av_seek_frame, glue_->format_context(), seeking_stream->index,
                  ConvertToTimeBase(seeking_stream->time_base, seek_time),
                  // Always seek to a timestamp <= to the desired timestamp.
@@ -1159,7 +1168,7 @@
 void FFmpegDemuxer::OnOpenContextDone(const PipelineStatusCB& status_cb,
                                       bool result) {
   DCHECK(task_runner_->BelongsToCurrentThread());
-  if (!blocking_thread_.IsRunning()) {
+  if (stopped_) {
     MEDIA_LOG(ERROR, media_log_) << GetDisplayName() << ": bad state";
     status_cb.Run(PIPELINE_ERROR_ABORT);
     return;
@@ -1173,20 +1182,17 @@
 
   // Fully initialize AVFormatContext by parsing the stream a little.
   base::PostTaskAndReplyWithResult(
-      blocking_thread_.task_runner().get(),
-      FROM_HERE,
-      base::Bind(&avformat_find_stream_info,
-                 glue_->format_context(),
+      blocking_task_runner_.get(), FROM_HERE,
+      base::Bind(&avformat_find_stream_info, glue_->format_context(),
                  static_cast<AVDictionary**>(NULL)),
       base::Bind(&FFmpegDemuxer::OnFindStreamInfoDone,
-                 weak_factory_.GetWeakPtr(),
-                 status_cb));
+                 weak_factory_.GetWeakPtr(), status_cb));
 }
 
 void FFmpegDemuxer::OnFindStreamInfoDone(const PipelineStatusCB& status_cb,
                                          int result) {
   DCHECK(task_runner_->BelongsToCurrentThread());
-  if (!blocking_thread_.IsRunning() || !data_source_) {
+  if (stopped_ || !data_source_) {
     MEDIA_LOG(ERROR, media_log_) << GetDisplayName() << ": bad state";
     status_cb.Run(PIPELINE_ERROR_ABORT);
     return;
@@ -1606,7 +1612,7 @@
   DCHECK(task_runner_->BelongsToCurrentThread());
   CHECK(!pending_seek_cb_.is_null());
 
-  if (!blocking_thread_.IsRunning()) {
+  if (stopped_) {
     MEDIA_LOG(ERROR, media_log_) << GetDisplayName() << ": bad state";
     base::ResetAndReturn(&pending_seek_cb_).Run(PIPELINE_ERROR_ABORT);
     return;
@@ -1692,8 +1698,8 @@
   DCHECK(task_runner_->BelongsToCurrentThread());
 
   // Make sure we have work to do before reading.
-  if (!blocking_thread_.IsRunning() || !StreamsHaveAvailableCapacity() ||
-      pending_read_ || !pending_seek_cb_.is_null()) {
+  if (stopped_ || !StreamsHaveAvailableCapacity() || pending_read_ ||
+      !pending_seek_cb_.is_null()) {
     return;
   }
 
@@ -1705,11 +1711,9 @@
 
   pending_read_ = true;
   base::PostTaskAndReplyWithResult(
-      blocking_thread_.task_runner().get(),
-      FROM_HERE,
+      blocking_task_runner_.get(), FROM_HERE,
       base::Bind(&av_read_frame, glue_->format_context(), packet_ptr),
-      base::Bind(&FFmpegDemuxer::OnReadFrameDone,
-                 weak_factory_.GetWeakPtr(),
+      base::Bind(&FFmpegDemuxer::OnReadFrameDone, weak_factory_.GetWeakPtr(),
                  base::Passed(&packet)));
 }
 
@@ -1718,7 +1722,7 @@
   DCHECK(pending_read_);
   pending_read_ = false;
 
-  if (!blocking_thread_.IsRunning() || !pending_seek_cb_.is_null())
+  if (stopped_ || !pending_seek_cb_.is_null())
     return;
 
   // Consider the stream as ended if:
diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h
index a5b15bc6..4c06c4c 100644
--- a/media/filters/ffmpeg_demuxer.h
+++ b/media/filters/ffmpeg_demuxer.h
@@ -32,7 +32,9 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "base/threading/thread.h"
+#include "base/memory/weak_ptr.h"
+#include "base/sequenced_task_runner.h"
+#include "base/single_thread_task_runner.h"
 #include "media/base/audio_decoder_config.h"
 #include "media/base/decoder_buffer.h"
 #include "media/base/decoder_buffer_queue.h"
@@ -295,8 +297,12 @@
 
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
-  // Thread on which all blocking FFmpeg operations are executed.
-  base::Thread blocking_thread_;
+  // Task runner on which all blocking FFmpeg operations are executed; retrieved
+  // from base::TaskScheduler.
+  scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
+
+  // Indicates if Stop() has been called.
+  bool stopped_;
 
   // Tracks if there's an outstanding av_read_frame() operation.
   //
diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc
index 92766f1..d0a7d1a2 100644
--- a/media/filters/ffmpeg_demuxer_unittest.cc
+++ b/media/filters/ffmpeg_demuxer_unittest.cc
@@ -18,6 +18,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/test/mock_callback.h"
+#include "base/test/scoped_task_scheduler.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "media/base/decrypt_config.h"
@@ -85,6 +86,8 @@
   virtual ~FFmpegDemuxerTest() {
     if (demuxer_)
       demuxer_->Stop();
+    demuxer_.reset();
+    base::RunLoop().RunUntilIdle();
   }
 
   void CreateDemuxer(const std::string& name) {
@@ -101,7 +104,7 @@
         &FFmpegDemuxerTest::OnMediaTracksUpdated, base::Unretained(this));
 
     demuxer_.reset(new FFmpegDemuxer(
-        message_loop_.task_runner(), data_source_.get(),
+        base::ThreadTaskRunnerHandle::Get(), data_source_.get(),
         encrypted_media_init_data_cb, tracks_updated_cb, new MediaLog()));
   }
 
@@ -188,9 +191,8 @@
                 buffer->discard_padding().first);
       EXPECT_EQ(read_expectation.is_key_frame, buffer->is_key_frame());
     }
-    DCHECK_EQ(&message_loop_, base::MessageLoop::current());
     OnReadDoneCalled(read_expectation.size, read_expectation.timestamp_us);
-    message_loop_.task_runner()->PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
   }
 
@@ -239,11 +241,12 @@
   }
 
   // Fixture members.
+
+  base::test::ScopedTaskScheduler task_scheduler_;
   std::unique_ptr<FileDataSource> data_source_;
   std::unique_ptr<FFmpegDemuxer> demuxer_;
   StrictMock<MockDemuxerHost> host_;
   std::unique_ptr<MediaTracks> media_tracks_;
-  base::MessageLoop message_loop_;
 
   AVFormatContext* format_context() {
     return demuxer_->glue_->format_context();
diff --git a/media/formats/mp4/box_definitions.cc b/media/formats/mp4/box_definitions.cc
index 558367e7..9e500dc 100644
--- a/media/formats/mp4/box_definitions.cc
+++ b/media/formats/mp4/box_definitions.cc
@@ -1068,7 +1068,10 @@
   // the wild don't set it.
   //
   //  RCHECK((flags & 0x020000) && !(flags & 0x1));
-  RCHECK(!(reader->flags() & 0x1));
+  RCHECK_MEDIA_LOGGED(!(reader->flags() & 0x1), reader->media_log(),
+                      "TFHD base-data-offset not allowed by MSE. See "
+                      "https://www.w3.org/TR/mse-byte-stream-format-isobmff/"
+                      "#movie-fragment-relative-addressing");
 
   if (reader->flags() & 0x2) {
     RCHECK(reader->Read4(&sample_description_index));
diff --git a/media/test/BUILD.gn b/media/test/BUILD.gn
index 595da4c..1d426da 100644
--- a/media/test/BUILD.gn
+++ b/media/test/BUILD.gn
@@ -39,6 +39,7 @@
 
     deps = [
       "//base",
+      "//base/test:test_support",
       "//media:test_support",
       "//media/audio:test_support",
       "//media/base:test_support",
diff --git a/media/test/pipeline_integration_test.cc b/media/test/pipeline_integration_test.cc
index 15e6e868..da174a1 100644
--- a/media/test/pipeline_integration_test.cc
+++ b/media/test/pipeline_integration_test.cc
@@ -1723,16 +1723,12 @@
   EXPECT_HASH_EQ(config.hash, GetAudioHash());
 }
 
-// TODO(CHCUNNINGHAM): Re-enable for OSX once 1% flakiness is root caused.
-// See http://crbug.com/571898
-#if !defined(OS_MACOSX)
 // CBR seeks should always be fast and accurate.
 INSTANTIATE_TEST_CASE_P(
     CBRSeek_HasTOC,
     Mp3FastSeekIntegrationTest,
     ::testing::Values(Mp3FastSeekParams("bear-audio-10s-CBR-has-TOC.mp3",
-                                        "-0.71,0.36,2.96,2.68,2.10,-1.08,")));
-#endif
+                                        "-0.71,0.36,2.96,2.68,2.11,-1.08,")));
 
 INSTANTIATE_TEST_CASE_P(
     CBRSeeks_NoTOC,
diff --git a/media/test/pipeline_integration_test_base.cc b/media/test/pipeline_integration_test_base.cc
index 6115e472..3902b1f2 100644
--- a/media/test/pipeline_integration_test_base.cc
+++ b/media/test/pipeline_integration_test_base.cc
@@ -59,6 +59,7 @@
   if (pipeline_->IsRunning())
     Stop();
 
+  demuxer_.reset();
   pipeline_.reset();
   base::RunLoop().RunUntilIdle();
 }
@@ -310,6 +311,7 @@
   data_source_ = std::move(data_source);
 
 #if !defined(MEDIA_DISABLE_FFMPEG)
+  task_scheduler_.reset(new base::test::ScopedTaskScheduler(&message_loop_));
   demuxer_ = std::unique_ptr<Demuxer>(new FFmpegDemuxer(
       message_loop_.task_runner(), data_source_.get(),
       base::Bind(&PipelineIntegrationTestBase::DemuxerEncryptedMediaInitDataCB,
diff --git a/media/test/pipeline_integration_test_base.h b/media/test/pipeline_integration_test_base.h
index 192d6f8..580e963c 100644
--- a/media/test/pipeline_integration_test_base.h
+++ b/media/test/pipeline_integration_test_base.h
@@ -11,6 +11,7 @@
 #include "base/md5.h"
 #include "base/memory/scoped_vector.h"
 #include "base/message_loop/message_loop.h"
+#include "base/test/scoped_task_scheduler.h"
 #include "media/audio/clockless_audio_sink.h"
 #include "media/audio/null_audio_sink.h"
 #include "media/base/demuxer.h"
@@ -133,6 +134,9 @@
   base::MD5Context md5_context_;
   bool hashing_enabled_;
   bool clockless_playback_;
+
+  // TaskScheduler is used only for FFmpegDemuxer.
+  std::unique_ptr<base::test::ScopedTaskScheduler> task_scheduler_;
   std::unique_ptr<Demuxer> demuxer_;
   std::unique_ptr<DataSource> data_source_;
   std::unique_ptr<PipelineImpl> pipeline_;
diff --git a/net/cert/nss_cert_database.cc b/net/cert/nss_cert_database.cc
index 14aa891..98f6882 100644
--- a/net/cert/nss_cert_database.cc
+++ b/net/cert/nss_cert_database.cc
@@ -18,7 +18,9 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/observer_list_threadsafe.h"
-#include "base/task_scheduler/post_task.h"
+#include "base/task_runner.h"
+#include "base/task_runner_util.h"
+#include "base/threading/worker_pool.h"
 #include "crypto/scoped_nss_types.h"
 #include "net/base/crypto_module.h"
 #include "net/base/net_errors.h"
@@ -100,14 +102,10 @@
 
   // base::Passed will NULL out |certs|, so cache the underlying pointer here.
   CertificateList* raw_certs = certs.get();
-  base::PostTaskWithTraitsAndReply(
-      FROM_HERE, base::TaskTraits()
-                     .WithShutdownBehavior(
-                         base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN)
-                     .MayBlock(),
-      base::Bind(&NSSCertDatabase::ListCertsImpl,
-                 base::Passed(crypto::ScopedPK11Slot()),
-                 base::Unretained(raw_certs)),
+  GetSlowTaskRunner()->PostTaskAndReply(
+      FROM_HERE, base::Bind(&NSSCertDatabase::ListCertsImpl,
+                            base::Passed(crypto::ScopedPK11Slot()),
+                            base::Unretained(raw_certs)),
       base::Bind(callback, base::Passed(&certs)));
 }
 
@@ -118,11 +116,8 @@
 
   // base::Passed will NULL out |certs|, so cache the underlying pointer here.
   CertificateList* raw_certs = certs.get();
-  base::PostTaskWithTraitsAndReply(
-      FROM_HERE, base::TaskTraits()
-                     .WithShutdownBehavior(
-                         base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN)
-                     .MayBlock(),
+  GetSlowTaskRunner()->PostTaskAndReply(
+      FROM_HERE,
       base::Bind(&NSSCertDatabase::ListCertsImpl,
                  base::Passed(crypto::ScopedPK11Slot(PK11_ReferenceSlot(slot))),
                  base::Unretained(raw_certs)),
@@ -381,11 +376,8 @@
 void NSSCertDatabase::DeleteCertAndKeyAsync(
     const scoped_refptr<X509Certificate>& cert,
     const DeleteCertCallback& callback) {
-  base::PostTaskWithTraitsAndReplyWithResult(
-      FROM_HERE, base::TaskTraits()
-                     .WithShutdownBehavior(
-                         base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN)
-                     .MayBlock(),
+  base::PostTaskAndReplyWithResult(
+      GetSlowTaskRunner().get(), FROM_HERE,
       base::Bind(&NSSCertDatabase::DeleteCertAndKeyImpl, cert),
       base::Bind(&NSSCertDatabase::NotifyCertRemovalAndCallBack,
                  weak_factory_.GetWeakPtr(), callback));
@@ -409,6 +401,11 @@
   observer_list_->RemoveObserver(observer);
 }
 
+void NSSCertDatabase::SetSlowTaskRunnerForTest(
+    const scoped_refptr<base::TaskRunner>& task_runner) {
+  slow_task_runner_for_test_ = task_runner;
+}
+
 // static
 void NSSCertDatabase::ListCertsImpl(crypto::ScopedPK11Slot slot,
                                     CertificateList* certs) {
@@ -429,6 +426,12 @@
   CERT_DestroyCertList(cert_list);
 }
 
+scoped_refptr<base::TaskRunner> NSSCertDatabase::GetSlowTaskRunner() const {
+  if (slow_task_runner_for_test_.get())
+    return slow_task_runner_for_test_;
+  return base::WorkerPool::GetTaskRunner(true /*task is slow*/);
+}
+
 void NSSCertDatabase::NotifyCertRemovalAndCallBack(
     const DeleteCertCallback& callback,
     bool success) {
diff --git a/net/cert/nss_cert_database.h b/net/cert/nss_cert_database.h
index d096f18..a9f5c8ac 100644
--- a/net/cert/nss_cert_database.h
+++ b/net/cert/nss_cert_database.h
@@ -25,6 +25,7 @@
 namespace base {
 template <class ObserverType>
 class ObserverListThreadSafe;
+class TaskRunner;
 }
 
 namespace net {
@@ -235,6 +236,10 @@
   // Check whether cert is stored in a hardware slot.
   bool IsHardwareBacked(const X509Certificate* cert) const;
 
+  // Overrides task runner that's used for running slow tasks.
+  void SetSlowTaskRunnerForTest(
+      const scoped_refptr<base::TaskRunner>& task_runner);
+
  protected:
   // Certificate listing implementation used by |ListCerts*| and
   // |ListCertsSync|. Static so it may safely be used on the worker thread.
@@ -243,6 +248,11 @@
   static void ListCertsImpl(crypto::ScopedPK11Slot slot,
                             CertificateList* certs);
 
+  // Gets task runner that should be used for slow tasks like certificate
+  // listing. Defaults to a base::WorkerPool runner, but may be overriden
+  // in tests (see SetSlowTaskRunnerForTest).
+  scoped_refptr<base::TaskRunner> GetSlowTaskRunner() const;
+
  protected:
   // Broadcasts notifications to all registered observers.
   void NotifyObserversCertDBChanged();
@@ -275,6 +285,9 @@
   // A helper observer that forwards events from this database to CertDatabase.
   std::unique_ptr<Observer> cert_notification_forwarder_;
 
+  // Task runner that should be used in tests if set.
+  scoped_refptr<base::TaskRunner> slow_task_runner_for_test_;
+
   const scoped_refptr<base::ObserverListThreadSafe<Observer>> observer_list_;
 
   base::WeakPtrFactory<NSSCertDatabase> weak_factory_;
diff --git a/net/cert/nss_cert_database_chromeos.cc b/net/cert/nss_cert_database_chromeos.cc
index e3a7dfd..d3bb89c 100644
--- a/net/cert/nss_cert_database_chromeos.cc
+++ b/net/cert/nss_cert_database_chromeos.cc
@@ -14,7 +14,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/location.h"
-#include "base/task_scheduler/post_task.h"
+#include "base/task_runner.h"
 #include "net/base/crypto_module.h"
 #include "net/cert/x509_certificate.h"
 
@@ -49,13 +49,9 @@
 
   // base::Pased will NULL out |certs|, so cache the underlying pointer here.
   CertificateList* raw_certs = certs.get();
-  base::PostTaskWithTraitsAndReply(
-      FROM_HERE, base::TaskTraits()
-                     .WithShutdownBehavior(
-                         base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN)
-                     .MayBlock(),
-      base::Bind(&NSSCertDatabaseChromeOS::ListCertsImpl, profile_filter_,
-                 base::Unretained(raw_certs)),
+  GetSlowTaskRunner()->PostTaskAndReply(
+      FROM_HERE, base::Bind(&NSSCertDatabaseChromeOS::ListCertsImpl,
+                            profile_filter_, base::Unretained(raw_certs)),
       base::Bind(callback, base::Passed(&certs)));
 }
 
diff --git a/net/cert/nss_cert_database_chromeos_unittest.cc b/net/cert/nss_cert_database_chromeos_unittest.cc
index e5e3606..89b5c23 100644
--- a/net/cert/nss_cert_database_chromeos_unittest.cc
+++ b/net/cert/nss_cert_database_chromeos_unittest.cc
@@ -8,9 +8,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "base/test/scoped_task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "crypto/nss_util_internal.h"
 #include "crypto/scoped_test_nss_chromeos_user.h"
@@ -50,8 +48,7 @@
                                     public CertDatabase::Observer {
  public:
   NSSCertDatabaseChromeOSTest()
-      : scoped_task_scheduler_(base::MessageLoop::current()),
-        observer_added_(false),
+      : observer_added_(false),
         db_changed_count_(0),
         user_1_("user1"),
         user_2_("user2") {}
@@ -69,6 +66,7 @@
         crypto::GetPrivateSlotForChromeOSUser(
             user_1_.username_hash(),
             base::Callback<void(crypto::ScopedPK11Slot)>())));
+    db_1_->SetSlowTaskRunnerForTest(base::ThreadTaskRunnerHandle::Get());
     db_1_->SetSystemSlot(
         crypto::ScopedPK11Slot(PK11_ReferenceSlot(system_db_.slot())));
     db_2_.reset(new NSSCertDatabaseChromeOS(
@@ -76,6 +74,7 @@
         crypto::GetPrivateSlotForChromeOSUser(
             user_2_.username_hash(),
             base::Callback<void(crypto::ScopedPK11Slot)>())));
+    db_2_->SetSlowTaskRunnerForTest(base::ThreadTaskRunnerHandle::Get());
 
     // Add observer to CertDatabase for checking that notifications from
     // NSSCertDatabaseChromeOS are proxied to the CertDatabase.
@@ -92,8 +91,6 @@
   void OnCertDBChanged() override { db_changed_count_++; }
 
  protected:
-  base::test::ScopedTaskScheduler scoped_task_scheduler_;
-
   bool observer_added_;
   int db_changed_count_;
 
diff --git a/net/cert/nss_cert_database_unittest.cc b/net/cert/nss_cert_database_unittest.cc
index 0d99c8a..235ea44c 100644
--- a/net/cert/nss_cert_database_unittest.cc
+++ b/net/cert/nss_cert_database_unittest.cc
@@ -15,12 +15,10 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/lazy_instance.h"
-#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/test/scoped_task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "crypto/scoped_nss_types.h"
 #include "crypto/scoped_test_nss_db.h"
@@ -63,9 +61,6 @@
 
 class CertDatabaseNSSTest : public testing::Test {
  public:
-  CertDatabaseNSSTest()
-      : scoped_task_scheduler_(base::MessageLoop::current()) {}
-
   void SetUp() override {
     ASSERT_TRUE(test_nssdb_.is_open());
     cert_db_.reset(new NSSCertDatabase(
@@ -130,7 +125,6 @@
     return result;
   }
 
-  base::test::ScopedTaskScheduler scoped_task_scheduler_;
   std::unique_ptr<NSSCertDatabase> cert_db_;
   const CertificateList empty_cert_list_;
   crypto::ScopedTestNSSDB test_nssdb_;
@@ -151,6 +145,7 @@
   // This test isn't terribly useful, though it will at least let valgrind test
   // for leaks.
   CertificateList certs;
+  cert_db_->SetSlowTaskRunnerForTest(base::ThreadTaskRunnerHandle::Get());
   cert_db_->ListCerts(base::Bind(&SwapCertList, base::Unretained(&certs)));
   EXPECT_EQ(0U, certs.size());
 
diff --git a/net/cert/x509_util_openssl.cc b/net/cert/x509_util_openssl.cc
index d36fd5e4..4a58262 100644
--- a/net/cert/x509_util_openssl.cc
+++ b/net/cert/x509_util_openssl.cc
@@ -285,9 +285,16 @@
 }
 
 // Returns true if |der_cache| points to valid data, false otherwise.
-// (note: the DER-encoded data in |der_cache| is owned by |cert|, callers should
+// (note: the DER-encoded data in |der_cache| is owned by |x509|, callers should
 // not free it).
 bool GetDER(X509* x509, base::StringPiece* der_cache) {
+  if (x509->buf) {
+    *der_cache = base::StringPiece(
+        reinterpret_cast<const char*>(CRYPTO_BUFFER_data(x509->buf)),
+        CRYPTO_BUFFER_len(x509->buf));
+    return true;
+  }
+
   int x509_der_cache_index =
       g_der_cache_singleton.Get().der_cache_ex_index();
 
diff --git a/net/data/ssl/wosign/wosign_domains.gperf b/net/data/ssl/wosign/wosign_domains.gperf
index 88b2ee3..a57719b3 100644
--- a/net/data/ssl/wosign/wosign_domains.gperf
+++ b/net/data/ssl/wosign/wosign_domains.gperf
@@ -6,34 +6,22 @@
 // This file contains the set of domains that were issued certificates by
 // WoSign and StartCom-branded CAs and were logged before
 // 2016-10-21 00:00:00 UTC. This list only contains those domains whose
-// certificates were not revoked as of 2016-12-31 and which appear within
-// the Alexa Top 1M dataset as of 2016-12-28.
+// certificates were not revoked as of 2017-02-27 and which appear within
+// the top 500,000 entries of the Alexa Top 1M dataset as of 2016-12-28.
 %}
 %%
 005.tv, 0
 010100100000.com, 0
 0101shop.com, 0
 01788.net, 0
-01game.com, 0
-01teacher.com, 0
 020leader.com, 0
-02cq.com, 0
-0318ol.com, 0
-0513c.com, 0
-0514soft.com, 0
 05506.com, 0
-0577hr.com, 0
 05.ru, 0
 06681.com, 0
 0678life.com, 0
 07073.com, 0
-0762jr.com, 0
 07zr.com, 0
-0800net.com.br, 0
-0951job.com, 0
-098.pl, 0
 0fees.us, 0
-0web.ir, 0
 10000.com, 0
 10000link.com, 0
 1000bankov.ru, 0
@@ -43,90 +31,48 @@
 1000ukg.kz, 0
 10010.org, 0
 10044.cn, 0
-100500miles.ru, 0
 10086.cn, 0
 1008.cn, 0
 100bt.com, 0
-100e.com, 0
-100hub.com, 0
 100-k-1.ru, 0
-100k.net.ua, 0
-100kuskov.ru, 0
 100megabit.ru, 0
 100msh.com, 0
-100steps.net, 0
 100vkusov.ru, 0
 100xuexi.com, 0
 10101111.com, 0
-10155.com, 0
 101.com, 0
-101hr.com, 0
-101ka.com, 0
 101sauna.ru, 0
-101widgets.com, 0
-10333.com, 0
 10brandchina.com, 0
 10gigabit.net, 0
 10to8.com, 0
 110.com, 0
-110disk.net, 0
 11185.cn, 0
-111.com.cn, 0
 11315.com, 0
 115.com, 0
-117o.com, 0
 1-1ads.com, 0
-1-1.su, 0
 11x11.ru, 0
-120na80.cz, 0
-120x.net, 0
 121mai.com, 0
-12301.cn, 0
-123aprende.com, 0
 123.com.cn, 0
-123hjemmeside.dk, 0
-123mov.net, 0
 124zhe.com, 0
 12580.tv, 0
-12582.cn, 0
 125.la, 0
 126.net, 0
-12seemeilen.de, 0
-1300acepro.com, 0
-133448.com, 0
-135qp.com, 0
 1360.com, 0
 139site.com, 0
 1406.kz, 0
-15166.com, 0
-155175.com, 0
 161.ru, 0
-1633.com, 0
-16889999.com, 0
-16hour.com, 0
 16mb.com, 0
 17500.cn, 0
 178448.com, 0
-1791diamonds.com, 0
 17bdc.com, 0
-17doubao.com, 0
 17heli.com, 0
 17house.com, 0
-17huo.com, 0
 17k.com, 0
-17must.com, 0
-17sportweb.com, 0
 17yigo.com, 0
-17zuoye.net, 0
-18183.com, 0
-185sy.com, 0
 189.cn, 0
 189cube.com, 0
-189go.cn, 0
-18zf.com, 0
 1905.com, 0
 190.com, 0
-1919.cn, 0
 1919hdtv.com, 0
 1927.kiev.ua, 0
 197top.com, 0
@@ -136,218 +82,130 @@
 1blu.de, 0
 1byone.com, 0
 1byone.co.uk, 0
-1byone.de, 0
 1byone.jp, 0
 1cbit.ru, 0
-1chotel.ru, 0
 1conan.com, 0
 1dxr.com, 0
-1game.ua, 0
 1gb.ua, 0
 1hai.cn, 0
-1huwai.com, 0
 1jbest.com, 0
-1ka.cn, 0
 1kejian.com, 0
 1kxun.mobi, 0
-1more.com, 0
 1-page.com, 0
-1pkk.ru, 0
-1platforma.ru, 0
-1plus1.net, 0
 1plus1.ua, 0
 1popov.ru, 0
 1prime.ru, 0
 1proxy.de, 0
 1september.ru, 0
-1st-attractive.com, 0
-1stwebdesigns.com, 0
 1tempurl.com, 0
-1track.ru, 0
 1tv.co.ua, 0
 1tvcrimea.ru, 0
-1v2d.com, 0
 2016bec.ro, 0
-2016.life, 0
-2100d.com, 0
-2114.com, 0
-212webhost.com, 0
 2144.cn, 0
 21cn.com, 0
 21.co.uk, 0
 21food.cn, 0
 21jrr.com, 0
-21mmo.com, 0
 21vbluecloud.com, 0
 21vianet.com, 0
-21yunwei.com, 0
-22v.net, 0
 22web.org, 0
 230km.ru, 0
-2330.tw, 0
 23356.com, 0
 233.com, 0
 2341.tv, 0
 23yy.com, 0
-247rack.com, 0
 24dx.ru, 0
 24gadget.ru, 0
 24maker.com, 0
 24paybank.com, 0
-25u.com, 0
 27.ua, 0
-29bet.co, 0
 29.ru, 0
 2ap.pl, 0
 2bulu.com, 0
-2cash.ru, 0
 2dfire.com, 0
 2dip.su, 0
 2do2go.ru, 0
-2fh.co, 0
 2gis.ae, 0
-2gis.cl, 0
 2gis.com, 0
 2gis.com.cy, 0
-2gis.cz, 0
-2gis.it, 0
 2gis.kg, 0
 2gis.kz, 0
 2gis.ru, 0
 2gis.ua, 0
-2hi.pl, 0
-2iretegas.it, 0
-2ix.de, 0
 2k2k.cc, 0
 2kom.ru, 0
-2kraski.ru, 0
 2manhua.com, 0
-2mao.cc, 0
-2peak.com, 0
 2plus2.ua, 0
-2proxy.de, 0
-2ryby.pl, 0
-2stick.ru, 0
-2sxvpn.wang, 0
-300188.cn, 0
 300.cn, 0
 3023.com, 0
 30post.com, 0
 310win.com, 0
 315jiage.cn, 0
-32ph.com, 0
 3310.com, 0
 3322.org, 0
 33pol.net, 0
 33rus.ru, 0
-33un.com, 0
 3400.org, 0
 34regiongaz.ru, 0
 34travel.by, 0
 360.cn, 0
 360.com, 0
 360doc.com, 0
-360fdc.com, 0
 360haoyao.com, 0
 360jie.com.cn, 0
-360jk.com, 0
 360kad.com, 0
 360kan.com, 0
-360pay.cn, 0
 360safe.com, 0
 360shouji.com, 0
 360shouzhuan.com, 0
 360totalsecurity.com, 0
 360tpcdn.com, 0
-360zimeiti.com, 0
-361sport.com, 0
-365hsh.com, 0
 365rili.com, 0
-365soke.cn, 0
 365webcall.com, 0
 36fy.com, 0
 36jr.com, 0
-36krcnd.com, 0
 36kr.com, 0
-37k.org, 0
-37ren.com, 0
 39.net, 0
 3arrafni.com, 0
 3bro.info, 0
-3cx.asia, 0
 3cx.com, 0
 3cx.de, 0
 3cx.es, 0
 3cx.eu, 0
 3cx.fr, 0
-3cx.it, 0
-3cx.net, 0
 3cx.ru, 0
 3cx.us, 0
-3cyber.info, 0
-3dcenter.org, 0
 3dmgame.com, 0
 3dnews.ru, 0
 3dyf.com, 0
-3-e.cz, 0
-3e.eu, 0
-3esynaptiq.com, 0
-3ie.fr, 0
-3mang.com, 0
 3proxy.de, 0
-3proxy.ru, 0
 3songshu.com, 0
-3tong.net, 0
-3utilities.com, 0
-4008087799.com, 0
 40407.com, 0
 404content.com, 0
-41.cn, 0
-41q.com, 0
 4231.vn, 0
-42trip.com, 0
-4399om.com, 0
-4399sy.com, 0
 442hz.com, 0
 45so.org, 0
-46etplus.com, 0
 4848438.com, 0
 48.cn, 0
-4all.com, 0
 4c.cn, 0
 4d.com, 0
-4dk.ru, 0
-4gjsq.net, 0
 4hu.com, 0
 4ka.sk, 0
 4nmv.ru, 0
 4paradigm.com, 0
 4pda.uz, 0
 4programmers.net, 0
-4proxy.us, 0
 4px.com, 0
-4qualia.co.jp, 0
-4real.gr, 0
-4ru.es, 0
-4shared-desktop.com, 0
 4tuning.ro, 0
-4uarab.com, 0
 4vision.ru, 0
-50webs.org, 0
-5112017.org, 0
-515to.com, 0
 517.cn, 0
 517na.com, 0
-51baogao.cn, 0
 51bi.com, 0
-51bmb.com, 0
 51.com, 0
-51datakey.com, 0
 51duoduo.com, 0
 51duoying.com, 0
 51eng.com, 0
 51goagent.com, 0
-51gsl.com, 0
 51laibei.com, 0
 51liucheng.com, 0
 51mypc.cn, 0
@@ -355,22 +213,15 @@
 51pianmen.com, 0
 51rz.com, 0
 51shebao.com, 0
-51tniu.com, 0
 51tuodao.com, 0
 51vip.biz, 0
 51vv.com, 0
-51wnl.com, 0
-51xiaoshuang.com, 0
 51yangsheng.com, 0
 51ykb.com, 0
-51yund.com, 0
-51yunqiang.cn, 0
 520cfc.com, 0
-5262.com, 0
 52bug.cn, 0
 52daohang.com, 0
 52dfg.com, 0
-52ilm.com, 0
 52ilm.vip, 0
 52itstyle.com, 0
 52jbj.com, 0
@@ -378,51 +229,37 @@
 52joy.org, 0
 52life.cc, 0
 52ml.net, 0
-52spin.com, 0
 531314.com, 0
-550550.ru, 0
 55188.com, 0
-552la.com, 0
 55freehost.com, 0
 55haitao.com, 0
 565656.com, 0
 56p2b.com, 0
 5778.com, 0
-58bank.com, 0
 58cdn.com.cn, 0
 58corp.com, 0
-5900.com.ar, 0
 59pi.com, 0
-59store.com, 0
 5adm.cc, 0
-5c.com.cn, 0
 5di.tv, 0
 5dmat-web.com, 0
 5gbfree.com, 0
 5g-ppp.eu, 0
 5hxn.com, 0
-5idream.net, 0
 5igupiao.com, 0
 5ilog.com, 0
-5karmanov.ru, 0
-5ok.com.ua, 0
 5ppai.com, 0
 5qqksa.com, 0
 5xiaoyuan.cn, 0
 5zig.net, 0
 600280.com, 0
-601601.com, 0
-60500.ru, 0
 6080bo.com, 0
 60-fps.org, 0
 612459.com, 0
 66163.com, 0
 6655.la, 0
-66law.cn, 0
 66.ru, 0
 6789g.com, 0
 68edu.ru, 0
-68kmla.org, 0
 6ack.com, 0
 6a.com, 0
 6d1b.cc, 0
@@ -431,25 +268,18 @@
 6rz.in, 0
 6so.so, 0
 6te.net, 0
-700shin.ru, 0
-7-11.cn, 0
 72du.com, 0
 72e.net, 0
-7311.by, 0
 7618.com, 0
 76.ru, 0
 77169.com, 0
-771dian.com, 0
 77file.com, 0
 7958.com, 0
-7bitcasino.com, 0
 7days.ru, 0
 7ero.org, 0
 7fon.ru, 0
 7i24.com, 0
 7launcher.com, 0
-7moor.com, 0
-7n5.net, 0
 7nujoom.com, 0
 7to.com.tw, 0
 7tor.org, 0
@@ -458,11 +288,8 @@
 80code.com, 0
 80pai.net, 0
 80s.tw, 0
-80uncle.com, 0
-80vps.com, 0
 81mv.com, 0
 85vod.com, 0
-868e.com, 0
 86y.org, 0
 87.cn, 0
 87dyy.com, 0
@@ -471,9 +298,7 @@
 8866.org, 0
 890m.com, 0
 8a.hk, 0
-8asyym.com, 0
 8eoe.com, 0
-8gongli.com, 0
 8pig.com, 0
 8solution.de, 0
 8solutions.cloud, 0
@@ -484,44 +309,32 @@
 9080.tv, 0
 90music.ir, 0
 9111.ru, 0
-911proxy.com, 0
-91300.com, 0
 9158.com, 0
-9188.com, 0
 91.com, 0
 91game.com, 0
 91huayi.com, 0
-91kds.net, 0
-91moe.com, 0
-91pintuan.com, 0
 91pxb.com, 0
 91ri.org, 0
 91ssfq.com, 0
 91sst.com, 0
 91wii.com, 0
 91wutong.com, 0
-91y.com, 0
 91yun.org, 0
 91yunxiao.com, 0
 92081.org, 0
 921.com, 0
-92ez.com, 0
 9384.com, 0
 945.com, 0
-94cb.com, 0
 9513.com, 0
 9527yy.com, 0
 95579.com, 0
-9597.biz, 0
 96533.com, 0
 9666.cn, 0
 96.lt, 0
 980x.com, 0
-988house.com, 0
 99496.com, 0
 999.com, 0
 999d.com, 0
-99chan.org, 0
 99.com, 0
 9ht.com, 0
 9ifriend.com, 0
@@ -532,198 +345,107 @@
 a2yy.com, 0
 a360.ru, 0
 a4yy.com, 0
-a696.com, 0
-a6adserv.com, 0
-a8z8.com, 0
 a-a-ah.ru, 0
 aaayun.com, 0
-aab-edu.net, 0
 aapig.com.cn, 0
 aasaanjobs.com, 0
-aasfp.com, 0
 aas.org, 0
 aasp.org.br, 0
 aauekpoma.edu.ng, 0
 aazyw.com, 0
-abacusemedia.com, 0
-abadan-ref.ir, 0
-abakan.ru, 0
-abakus-internet-marketing.de, 0
-abble.cn, 0
-abbseo.com, 0
 abbyy.com, 0
 abbyyeu.com, 0
-abbyy-ls.com, 0
 abbyy.ru, 0
-abbyy.ua, 0
-abbyyusa.com, 0
 abc188.com, 0
 abc360.com, 0
-abc6.net, 0
 abcapk.com, 0
-abcb2b.eu, 0
-abcd.bz, 0
-abc.edu.sv, 0
 abclite.net, 0
 abc.re, 0
 abcydia.com, 0
-abelohost.com, 0
 abfar-kh.ir, 0
-abf.cz, 0
 abf.se, 0
-abhiguitar.com, 0
-abidjan911.com, 0
 abileneisd.org, 0
 abit-poisk.org.ua, 0
 abitu.net, 0
-abitur-und-studium.de, 0
-abiyefon.com, 0
-ablecloud.cn, 0
 abletive.com, 0
-abm-com.de, 0
-about-nya.com, 0
 abp.bzh, 0
 abresalamat.ir, 0
 abrites.com, 0
-abs.cn, 0
 absi.be, 0
 absolutbank.ru, 0
 absolutist.com, 0
 absolutist.ru, 0
-abuxiaoxi.com, 0
-abz.ch, 0
-abzone.cz, 0
-academicconf.com, 0
-academy21.ru, 0
 acanomas.com, 0
-accentforex.com, 0
-access.ly, 0
-accounterlive.com, 0
-accuenplatform.com, 0
-acelerato.com, 0
 acer.com, 0
-aceteamwork.com, 0
 acfun.tv, 0
-acg.bz, 0
 acgcss.com, 0
 acg-moe.com, 0
 acgmoon.org, 0
 acgn.ren, 0
-ac.gov.ru, 0
 acgpy.com, 0
 acg.tf, 0
-acilissaati24.com, 0
 ac-illust.com, 0
 acision.com, 0
-acko.net, 0
-acko.ru, 0
-acli.it, 0
-a-closer-look.com, 0
 aclu.org, 0
-acm.ac.uk, 0
 acmcoder.com, 0
-acmhabitat.fr, 0
-acom.pt, 0
-aconcaguapoker.com, 0
 acoola.ru, 0
 acornsau.com.au, 0
 acousticalsurfaces.com, 0
-ac-project.net, 0
 acquadiparma.com, 0
 acronis.com, 0
 acrylicwifi.com, 0
 acsc.az, 0
 acs.si, 0
-acs-tpkg.com, 0
-actilove.ch, 0
 actionnetwork.org, 0
-actiplans.com, 0
 actitime.com, 0
 active24.cz, 0
-active-city.net, 0
-activeeon.com, 0
 activelink.ie, 0
-activemotif.com, 0
 activ.kz, 0
-actonlytics.com, 0
 actoys.net, 0
 acueducto.com.co, 0
-acumatica.com, 0
-acupuncture.org.uk, 0
-ad7.com, 0
 ada.edu.az, 0
 adamas.ru, 0
 adashboard.info, 0
 adbusters.org, 0
 ad.co.kr, 0
 adcom.it, 0
-adctools.com, 0
-adcubum.com, 0
-added-value.com, 0
 addison-electronique.com, 0
-addpipe.com, 0
 addradio.de, 0
-add.re.kr, 0
-addvalue.de, 0
-adept.co.za, 0
-adfreehost.ir, 0
 adic.co.kr, 0
-adicu.com, 0
 adioma.com, 0
-adks.cn, 0
 adkulan.kz, 0
-adllink.com.br, 0
 admagazine.ru, 0
-admgor.nnov.ru, 0
 admin.ch, 0
 adminhost.org, 0
 administrator.de, 0
 adminn.cn, 0
 admin.tomsk.ru, 0
-admissions.fr, 0
 admkrsk.ru, 0
 admoblkaluga.ru, 0
-admon.org, 0
 admsakhalin.ru, 0
-adobeconnect.ir, 0
-adofms.com.au, 0
 adp.com, 0
-adpop-1.com, 0
-adpop.com, 0
-adquisitio.com.mx, 0
 adquisitio.es, 0
 adquisitio.it, 0
-ad-rek.ru, 0
 adriagate.com, 0
 adrs.me, 0
 ads1-adnow.com, 0
 ads2-adnow.com, 0
 ads3-adnow.com, 0
 ads5-adnow.com, 0
-adsanityplugin.com, 0
 adseedata.com, 0
-adselect.ir, 0
 adsender.us, 0
 adsensor.org, 0
 adstarknetwork.com, 0
 aduana.cl, 0
-adukacyja.info, 0
-adultwebmastercenter.biz, 0
 advancedrenamer.com, 0
 advancedtomato.com, 0
 advendor.net, 0
 adverten.com, 0
-adverti.ru, 0
 advertising.management, 0
 adview.cn, 0
-adviqo.com, 0
 advisor.travel, 0
 adways.net, 0
 adwhiztech.com, 0
-adwifi.com.tw, 0
-adwitiyacollection.com, 0
-adxxx.me, 0
-adxxx.org, 0
 ady.az, 0
 ady-co.com, 0
 adygnet.ru, 0
@@ -734,67 +456,34 @@
 adzuna.co.za, 0
 adzuna.de, 0
 adzuna.fr, 0
-adzuna.in, 0
 adzuna.nl, 0
 adzuna.pl, 0
 adzuna.ru, 0
 adzz.me, 0
 aegean.gr, 0
 aegee.org, 0
-aegif.jp, 0
 aelius.com, 0
-ae.org, 0
-aeparser.com, 0
-aepb.gov.cn, 0
-aerial.net, 0
 aerosoft.de, 0
 aertecsolutions.com, 0
-aerztekammer.at, 0
 aesop.com, 0
 aewb.cn, 0
-afagh.info, 0
-afaghnet.ir, 0
-afanti100.com, 0
-afd.berlin, 0
-afflecks.com, 0
-affordplan.com, 0
 afghan123.com, 0
 afphabitat.cl, 0
-afraid.org, 0
-africaintelligence.com, 0
 africaintelligence.fr, 0
-africaninnovation.org, 0
 africanleadershipacademy.org, 0
-africanmeccasafaris.com, 0
-afrimalin.cm, 0
-afrimalin.com.gn, 0
-agantty.com, 0
 agava.net, 0
 agava.ru, 0
-agc-energies.fr, 0
-agearche.ru, 0
 agefi.fr, 0
-agendatrad.org, 0
 agfw.me, 0
-agglo-annecy.fr, 0
 agh.edu.pl, 0
-agilecontents.com, 0
-agimonline.com, 0
 aginomoto.com, 0
 agnesb.com, 0
 agonistes.gr, 0
-agoodme.com, 0
 agora.co.il, 0
-agora-energiewende.de, 0
-agpc28.com, 0
-agrafka.com.ua, 0
 agrant.cn, 0
 agrantsem.com, 0
 agriconomie.com, 0
 agroklub.com, 0
-agro-mash.ru, 0
-agronationale.ru, 0
-agropravda.com, 0
 agrosemfond.ru, 0
 agroxxi.ru, 0
 agts.tv, 0
@@ -802,54 +491,25 @@
 ahjzu.edu.cn, 0
 ahmia.fi, 0
 ahml.ru, 0
-ahnw.gov.cn, 0
-ahs-de.com, 0
 ahtv.cn, 0
 ahu.edu.cn, 0
-ahvaznovin.ir, 0
 aia.com.sg, 0
-aiaiu.com, 0
-aibing.cc, 0
-ai.ch, 0
 aidaojia.com, 0
-aidl.pw, 0
-aigame100.com, 0
-aihuo360.com, 0
-aiirony.com, 0
 aiisen.com, 0
 aikaiyuan.com, 0
-aikf.com, 0
 aimatech.com, 0
-aimms.com, 0
-aimodel.me, 0
-aim.uz, 0
-ainiseo.com, 0
-aipa.ru, 0
-aipb.org, 0
 air-austral.com, 0
 airbase.ru, 0
 airbusgroup.com, 0
 aircn.org, 0
-aircrack-ng.org, 0
 airdog.com, 0
 airedesantafe.com.ar, 0
 airelf.com.tw, 0
 airgun.org.ua, 0
-airlinegeeks.com, 0
-airly.co, 0
 airmp3.me, 0
-airnet.ru, 0
-air-serenity.com, 0
 airstoc.com, 0
 airtime.pro, 0
-airtribune.com, 0
-airwarriors.com, 0
 airweave.jp, 0
-ais.by, 0
-aisidi.com, 0
-aisne.fr, 0
-aist.net.ru, 0
-ais.ua, 0
 ait.ac.th, 0
 aitech.ac.jp, 0
 ai-thinker.com, 0
@@ -858,53 +518,30 @@
 aizhuizhui.com, 0
 ajaums.ac.ir, 0
 ajinga.com, 0
-ajmide.com, 0
 ajou.ac.kr, 0
 akademie-bv.de, 0
-akademikerverlag.de, 0
 akado-ural.ru, 0
 akairan.com, 0
-akama.com.tw, 0
-akasakaprince.com, 0
-akb48game.jp, 0
-akcis.org, 0
 akisho.ru, 0
 akket.com, 0
-aknw.de, 0
-akosi.ru, 0
 akson.ru, 0
-aktinos.com, 0
-akud.info, 0
 akusherstvo.ru, 0
-alain-bensoussan.com, 0
 alamesacuba.com, 0
-alapetite.fr, 0
 alarmtrade.ru, 0
-alaska.ua, 0
 alau.kz, 0
 albank.ru, 0
 albedo.pw, 0
 alberlet.hu, 0
 alberthsieh.com, 0
-alberto.gr, 0
-albooked.com, 0
 alcateia.com.br, 0
 alcatelonetouch.com, 0
-alchevsk.net, 0
-alconost.com, 0
-aldebaran.cz, 0
 aldjf.com, 0
-alemtat.kz, 0
 alertachiapas.com, 0
-aler.to, 0
 alexa_host, 0
 alexander-freundeskreis.org, 0
 alexandriava.gov, 0
 alexandrinsky.ru, 0
-alexbloggt.com, 0
-alexbruni.ru, 0
 alexfitness.ru, 0
-alexnettm.org.ua, 0
 alexwz.com, 0
 alexyanovsky.com, 0
 alfabank.kz, 0
@@ -912,560 +549,298 @@
 alfa-forex.ru, 0
 alfatyping.com, 0
 alfred.camera, 0
-algoritma.it, 0
-alhassan.de, 0
-ali213.net, 0
 aliall.ru, 0
-aliapp.com, 0
 aliatic.com, 0
-alibi.by, 0
 alicall.com, 0
-alicomez.com, 0
-alidemo.cn, 0
 aliexsale.ru, 0
-aligo.in, 0
 alinino.az, 0
-aliseed.com, 0
-alittlebit.ru, 0
-alittlebityummy.com, 0
-aliwords.com, 0
 aliyuncs.com, 0
-all4os.com, 0
 allaboutjazz.com, 0
-allaboutparenting.ro, 0
-allananas.ru, 0
 all.biz, 0
 allboxing.ru, 0
 allcoin.com, 0
-allcorp.ru, 0
-alldiscount.info, 0
 alles-vegetarisch.de, 0
-alleyneinc.net, 0
 allfon.org, 0
-allhostings.ru, 0
-alliance-global.com, 0
 allinpay.com, 0
-all-in.xyz, 0
 allmedia.ru, 0
 allmovies.uz, 0
 allnokia.ru, 0
 allobnk.com, 0
 allo.ua, 0
 allplay.uz, 0
-allrad.ru, 0
 allseenalliance.org, 0
 allthefallen.ninja, 0
 alltobid.com, 0
 allure.ru, 0
-allwetterzoo.de, 0
 allyes.com, 0
-almamarket.pl, 0
 almasdarnews.com, 0
 almatv.kz, 0
-almaz.center, 0
 almedina.net, 0
-almin.ru, 0
 almodi.org, 0
 almohtarifdz.com, 0
 alo.ir, 0
-alone.tw, 0
-alpedhueznet.com, 0
 alphabrock.cn, 0
 alphacrc.com, 0
-alphacrew.com, 0
 alpha-network.io, 0
-alphaspel.se, 0
 alpha-wallet.com, 0
-alphest.com, 0
-alpine.com, 0
-alpinelinux.org, 0
 alser.kz, 0
-als-japan.com, 0
-alsyundawy.com, 0
 altarix.ru, 0
 altechna.com, 0
-altegrosky.ru, 0
 altel.kz, 0
 alternatehistory.com, 0
-alternetivo.cz, 0
 altervista.org, 0
-alterway.fr, 0
-altigator.com, 0
-altinkaya.com.tr, 0
 altissia.com, 0
 altlinux.org, 0
-altlinux.ru, 0
 altrk.net, 0
-altruja.de, 0
 altspu.ru, 0
-alt-team.com, 0
-alvanikoku.edu.ng, 0
 alwaysdata.net, 0
-alyzq.com, 0
 amainhobbies.com, 0
-amalgam-fansubs.tk, 0
 amanbo.co.ke, 0
 amanbo.com, 0
 amap.com, 0
 amaroma.it, 0
-amarone.hu, 0
 amazee.io, 0
-amazingradio.com, 0
 amazonaws.com, 0
-ambiente.gob.ar, 0
 amdn.news, 0
-amersport.ru, 0
-amforward.com, 0
 amfostacolo.ro, 0
 amigaosecreto.com.br, 0
 amigo.lv, 0
 amigosdecosat.com, 0
-amikash.ca, 0
-aminidc.com, 0
 amiro.ru, 0
-ammc.ma, 0
-amniran.org, 0
 amocrm.com, 0
-amolf.nl, 0
 amorousgame.com, 0
-amoskadan.cz, 0
 ampfutures.com, 0
 amplexor.com, 0
 ampr.org, 0
-amrita-rus.ru, 0
 amss.ac.cn, 0
-amt.com.cn, 0
-amv.es, 0
-anadea.info, 0
-anadyr.org, 0
-anafarsh.com, 0
-analyticaltrader.com, 0
-anapa-official.ru, 0
-anchel.nl, 0
 ancii.com, 0
-ancor.ru, 0
 andalucia.org, 0
-anderlecht.be, 0
 anderlecht-online.be, 0
-anderssen.ru, 0
 andipartners.com, 0
 andraste.io, 0
 andrewcbancroft.com, 0
 androbit.net, 0
 androidcentral.com, 0
-android-coffee.com, 0
-android-gems.com, 0
 android-help.ru, 0
 android-iphone-recovery.com, 0
-androidlearning.in, 0
 androidlost.com, 0
-andyet.com, 0
-andykamto.com, 0
 anegrinews.ru, 0
 anekdot.ru, 0
-anevia.com, 0
 angara.net, 0
-angellight.com, 0
-anglius.ru, 0
 angrymetalguy.com, 0
 anhuinews.com, 0
-anidesu.ru, 0
 anidex.moe, 0
 animan.uz, 0
 animationclub.ru, 0
 animecharactersdatabase.com, 0
-animeimpulse.com, 0
 animelayer.ru, 0
-anime-pictures.net, 0
 anime-rus.ru, 0
 animetosho.org, 0
-animetreff.de, 0
-anionix.ru, 0
 anitama.cn, 0
 anitoys.com, 0
 anizone.net, 0
-ankaraka.org.tr, 0
 ankerkraut.de, 0
 ankermann.com, 0
 ankiety-tv.pl, 0
-anko3.com, 0
-ankolpakov.ru, 0
 anmb.ro, 0
-annet.pl, 0
 annibuku.com, 0
-annkestore.com, 0
-anoneko.com, 0
 anonimag.es, 0
 anonymox.net, 0
 anotherhome.net, 0
-anovaculinary.com, 0
-anpc.ro, 0
-anpec.org.br, 0
 anritsu.com, 0
 anruan.com, 0
 ansan.ac.kr, 0
-ans.cz, 0
 anseo.cn, 0
 answercenter.ir, 0
-answerconnect.com, 0
-answerconnect.co.uk, 0
 anta.cn, 0
 anta.com, 0
-antagosoft.com, 0
-antclub.org, 0
-anticenz.org, 0
-antiplag.ru, 0
 antizapret.info, 0
 antoshkaspb.ru, 0
-antplanet.ru, 0
-antrak.org.tr, 0
-antshares.org, 0
 antsoul.com, 0
 anturis.com, 0
-anunciobot.com, 0
 anunciosparatodos.com, 0
-anvidelabs.org, 0
 anviz.com, 0
 anwalt24.de, 0
-anyfiles.co, 0
 anysdk.com, 0
-anysports.tv, 0
-anyway.fm, 0
 anzhen.org, 0
 anzhi.com, 0
-aoaoao.me, 0
-aofall.com, 0
 aomygod.com, 0
 aonb.ru, 0
-aor.ca, 0
-aoreteam.com, 0
 aori.ru, 0
 aos.com, 0
-aov.de, 0
-ap1.by, 0
 apabi.com, 0
 apachehaus.com, 0
 apachelounge.com, 0
-apaipian.com, 0
-apalon.com, 0
 apartamenty.kz, 0
-apave.com, 0
-apba.es, 0
 aperza.jp, 0
 apexdc.net, 0
-apex.fr, 0
 apexpoint.com, 0
-apfelwerk.de, 0
-apgsensors.com, 0
-apgsga.ch, 0
-apic.in, 0
-apimatic.io, 0
-apkdigg.co, 0
 apkdy.com, 0
 apk.tw, 0
-aplgo.com, 0
-aplicit.com, 0
 aplikasipc.com, 0
 apmetrix.com, 0
 apn.ru, 0
 apolisglobal.com, 0
 appadhoc.com, 0
-appbase.io, 0
-appbonus.ru, 0
 appcan.cn, 0
 appcelerator.com, 0
-appcoachs.com, 0
 appdated.de, 0
 appdb.cc, 0
 appfollow.io, 0
-appful.io, 0
-app-global.ru, 0
 appier.com, 0
-appier.net, 0
 applico.ru, 0
-applied-research.ru, 0
 applinzi.com, 0
 applysquare.com, 0
 applythis.net, 0
 apppark.cn, 0
-appreal-vr.com, 0
 apps555.com, 0
-appshike.com, 0
 appsmod.com, 0
-appsocks.cn, 0
 appson.ir, 0
-appstar.com.cn, 0
-appvault.com, 0
-apreva.fr, 0
 apricityos.com, 0
-apronline.gov.ar, 0
 apropos-store.com, 0
-aptekarsk.ru, 0
 apur.org, 0
 apusapps.com, 0
 apuscn.com, 0
 apx.fr, 0
 aqha.com, 0
-aql.com, 0
 aqua-calc.com, 0
 aqualogo.ru, 0
 aquariumbg.com, 0
-aquaservice.com, 0
 aqua-shop.ru, 0
-arabshack.com, 0
 aradhost.com, 0
 arado.org, 0
-aranycsillag.net, 0
 aras.com, 0
-arawaza.com, 0
 arb4host.net, 0
 arba.uz, 0
-arbeitsschutz-portal.de, 0
-arbicon.ru, 0
 arbital.ru, 0
 arb-silva.de, 0
-arbuse.ru, 0
-arcadiamedical.ro, 0
 arcadja.com, 0
-arch-anywhere.org, 0
-archboy.org, 0
-archermind.com, 0
-archersbr.com, 0
 archirodon.net, 0
-arcsoft.com.cn, 0
 ardahan.edu.tr, 0
-ardda.gov.az, 0
 ardisson.ir, 0
-areajugones.es, 0
-areeya.co.th, 0
-arefyevstudio.com, 0
-arenabg.ch, 0
-arenabg.com, 0
 arencenter.ir, 0
-ares.com.tw, 0
-argentinacompra.gov.ar, 0
 argentina.gob.ar, 0
-argor.com, 0
-ar.gov, 0
 ariacomputer.ir, 0
 ariansystem.net, 0
 ariejan.net, 0
 arielis.com, 0
-ari.ir, 0
 arindo.net, 0
 aris.ge, 0
-aristo.ru, 0
-aritmos.it, 0
 arize.ir, 0
 arkadium.com, 0
 arkena.com, 0
 arkh-edu.ru, 0
 arkrdigital.com, 0
-arkvpn.wang, 0
-arlan.ru, 0
-arlingtonva.us, 0
 arma3.ru, 0
-armene.com, 0
 armor.kiev.ua, 0
-armorymarek.com, 0
 armtorrent.com, 0
 army.gr, 0
-armysoft.es, 0
 arnotts.ie, 0
 aroundprague.cz, 0
-arpuplus.com, 0
-arqatech.com, 0
-arsacia.ir, 0
-arsenal-sib.ru, 0
 ars-grin.gov, 0
 ars.sicilia.it, 0
-art1st.me, 0
-artar.com.sa, 0
-artcom.de, 0
-art-download.org, 0
-artezio.com, 0
 artfoxlive.com, 0
 artinfo.pl, 0
 artinvestment.ru, 0
-artistravel.eu, 0
 artist.ru, 0
-artlife.ru, 0
-artlords.com, 0
 art-oboi.com.ua, 0
 artonline.ru, 0
 artrade.com, 0
-artreal.ru, 0
 artron.net, 0
-artsadd.com, 0
 arturia.com, 0
-arty.space, 0
-asafaweb.com, 0
 asanak.ir, 0
 asanapps.com, 0
-asandk.com, 0
 asanfile.com, 0
 asanwebhost.com, 0
 asaptickets.com, 0
-ascendcorp.com, 0
-ascendi.pt, 0
-asc.es, 0
-asda.gr, 0
-asendiahk.com, 0
 aseugame.com, 0
 ashampoo.net, 0
-ashanet.org, 0
-asheblog.org, 0
-ashiyue.com, 0
-ashkalov.ru, 0
 ashland.edu, 0
-ashmanov.com, 0
 asiafull.com, 0
-asiago.it, 0
 asiainfo.com, 0
-asiainfo.com.cn, 0
-asiangeo.com, 0
 asiaplus.tj, 0
 asiatech.ir, 0
-asicminermarket.com, 0
 asilmedia.uz, 0
-asirikuy.com, 0
 asjyy.com, 0
 askermekani.com, 0
 askform.cn, 0
 asknlearn.com, 0
 askona.ru, 0
-askthepsych.com, 0
 aslenkov.ru, 0
 aslibra.com, 0
 asomin.net, 0
-asp.be, 0
 asphaltgold.de, 0
 aspiremi.com, 0
-asp.krakow.pl, 0
 aspone.me, 0
 aspswelten.de, 0
 asrock.com, 0
 assai.com.br, 0
 asse.fr, 0
-assistbet.co, 0
-assorti-market.ru, 0
 astana.kz, 0
-astana.tk, 0
 astegiudiziarie.it, 0
-asteriskmx.org, 0
 asteroidos.org, 0
 astralnalog.ru, 0
 astrobites.org, 0
 astrocenter.com, 0
 astrogeo.va.it, 0
 astrohled.cz, 0
-astrology.com, 0
 astro-online.ru, 0
 astropro.ru, 0
 astrosage.com, 0
 astroweb.tv, 0
 astrowi.com, 0
-asurgumus.com, 0
-asus.com.cn, 0
 asuscomm.com, 0
-asusmarket.ru, 0
 aswifter.com, 0
 atabank.com, 0
-ataka.tv, 0
-ataksupermarket.ru, 0
 ataland.com, 0
-atanor.ru, 0
 at-consulting.ru, 0
-atel76.ru, 0
 atempurl.com, 0
 atfbooru.ninja, 0
-atg-corp.com, 0
 ath.cx, 0
-athlenda.com, 0
 athome.lu, 0
 atiyehsazan.ir, 0
-atlanta.ua, 0
-atlanticmetro.net, 0
-atm.gob.ec, 0
 atmyplace.ru, 0
 atnf.csiro.au, 0
-atnifty.com, 0
 atol.ru, 0
-atomuniverse.net, 0
-aton.ru, 0
-atpesercizio.it, 0
-atraining.ru, 0
 atrapalo.com, 0
 atraveo.de, 0
-atrsara.ir, 0
 atservers.net, 0
-atso-net.jp, 0
 attijariwafa.com, 0
-attivonetworks.com, 0
 at.ua, 0
 atua.com.br, 0
 atyourservice.com.cy, 0
-atzenbunker.ws, 0
 auca.kg, 0
 auchandirect.fr, 0
 auchan.net, 0
 auchan.ro, 0
 auchan.ru, 0
 auctionata.com, 0
-audacity-forum.de, 0
-audatex.de, 0
 audials.com, 0
 audiklub.cz, 0
 audinate.com, 0
-audiofreaks.nl, 0
-audiophile.org, 0
 audioveda.ru, 0
-auditionpvs.com, 0
 audit-it.ru, 0
 au.edu.tw, 0
 aufe.edu.cn, 0
-augcg.com, 0
-auis.edu, 0
-aulacenter.com, 0
-aulamejor.com, 0
 auna.de, 0
 auna.fr, 0
 auna.it, 0
-auna-multimedia.co.uk, 0
-auna-multimedia.es, 0
-auno.kz, 0
 auooo.com, 0
-aurora-online.ru, 0
-aurubis.com, 0
-aussiebushwalking.com, 0
-austlink.net, 0
 austral.edu.ar, 0
 australia.com, 0
 australianturfclub.com.au, 0
-austrian.com, 0
 author24.ru, 0
 autoalkatresz.hu, 0
 autoazart.ru, 0
-autobam.ru, 0
-autobase.biz, 0
-autobole.com, 0
 autocash.com, 0
-autocensor.com, 0
 autocharge.ir, 0
 autocont.cz, 0
-autofides.ru, 0
-autoflex.hu, 0
 autofoco.com, 0
 autoforum.com.br, 0
 autohausaz.com, 0
-autoimport31.ru, 0
 autojarov.cz, 0
-autojerry.fi, 0
 autoklad.ua, 0
-autoklub.cz, 0
-autolikeviet.vn, 0
 automic.com, 0
-automotivelinux.org, 0
 autonavi.com, 0
 autonavigator.hu, 0
 autoonline.com, 0
@@ -1475,13 +850,8 @@
 autopilot.li, 0
 autoradiopc.it, 0
 autoria.biz, 0
-autoshinavrn.ru, 0
 autospares.lv, 0
-autostels.ru, 0
-autostrong-m.by, 0
 autosup.by, 0
-autosup.ru, 0
-autoteile-teufel.at, 0
 autoteile-teufel.de, 0
 autotoolza.ru, 0
 autotown55.ru, 0
@@ -1490,74 +860,42 @@
 autozi.com, 0
 auxiliadorapredial.com.br, 0
 avaclinic.ru, 0
-avalon.ru, 0
-ava.md, 0
-avance-lg.com, 0
 avanset.com, 0
 avantbrowser.com, 0
-avantel.ru, 0
-avantgarde-labs.de, 0
 ava-saz.ir, 0
-avatanplus.com, 0
-avatan.ru, 0
-avatanshop.ru, 0
-avbt123.com, 0
 avcast.org, 0
-avenard.com, 0
-avenuedesvins.fr, 0
 aversi.ge, 0
 avg.club, 0
-av-gk.ru, 0
 avia.lt, 0
-avia.md, 0
 avianca.com.br, 0
 aviapark.com, 0
-aviationsmilitaires.net, 0
 avic.com, 0
 avic.ir, 0
-avis.pl, 0
 avito.ru, 0
 avlab.pl, 0
-avocat.qc.ca, 0
-avokado.kz, 0
-avokzal.ru, 0
 avonstore.com.br, 0
 avosapps.com, 0
-avra.pl, 0
 av.ru, 0
-avselectro-msk.ru, 0
 avselectro.ru, 0
 avsim.net, 0
 avspare.com, 0
 avtobor.uz, 0
 avtograd.ru, 0
-avtomir.ru, 0
 avtonalogi.ru, 0
-avtoopt.com, 0
 avto.pro, 0
 avtovod.org.ua, 0
-avtovokzal-on-line.ru, 0
 avtovokzaly.ru, 0
-avt.pl, 0
-avvalniaz.ir, 0
-awem.com, 0
-awstaticdn.net, 0
 awwapp.com, 0
 axa.cz, 0
-axelname.ru, 0
 axiangblog.com, 0
-axigen.com, 0
-axiomplus.com.ua, 0
 axiomtelecom.com, 0
 axiomus.ru, 0
 axp.dk, 0
 axzchou.com, 0
 ayla.com.cn, 0
-aytopalencia.es, 0
 ayudatpymes.com, 0
 ayurina.net, 0
 ayz.pl, 0
-azarfam.com, 0
 azasrs.gov, 0
 azcuba.cu, 0
 azersu.az, 0
@@ -1567,26 +905,18 @@
 az.gov, 0
 azimuthotels.com, 0
 azinsurance.az, 0
-azoft.com, 0
 az.pl, 0
 azsigorta.az, 0
-azskmg.kz, 0
 aztu.edu.az, 0
 azure.cn, 0
 azure.com, 0
-b0ne.com, 0
 b1.com.cn, 0
-b1-systems.de, 0
-b2cpl.ru, 0
 b2wdigital.com, 0
 b3log.org, 0
-b4value.net, 0
 b5m.com, 0
-b7yy.com, 0
 b8b8.tv, 0
 b8yy.com, 0
 baba-mail.co.il, 0
-babelsberger-filmgymnasium.de, 0
 babilon-m.tj, 0
 babilon-t.tj, 0
 babosik.ru, 0
@@ -1594,46 +924,27 @@
 babruisk.com, 0
 babyblog.ru, 0
 babylongirls.co.uk, 0
-babypark.nl, 0
-babysfera.ru, 0
-babysitting24.ch, 0
 bacc1688.com, 0
 back2basics-wow.eu, 0
 bad.watch, 0
 bagevent.com, 0
-baggersmag.com, 0
-bagllerina.com, 0
 ba.gov.br, 0
 bahamsafar.com, 0
-bahmut.com, 0
 baicheng.com, 0
 baidu.com, 0
-baidu.nu, 0
-baidupan.com, 0
 baiduyun.me, 0
 baijiahulian.com, 0
 baijindai.com, 0
 baikal-daily.ru, 0
 baiten.cn, 0
 baitv.com, 0
-baixing.cn, 0
 baixou.com.br, 0
-bajiegc.com, 0
-bakemono-subs.com, 0
-bakkerdehouthandel.nl, 0
 baksman.com, 0
 baktelecom.az, 0
-baku2015.com, 0
 baku2017.com, 0
-bakulev.ru, 0
 balancer.ru, 0
-balassiintezet.hu, 0
-balder.se, 0
 baldtruthtalk.com, 0
 baldwins.co.uk, 0
-balgrist.ch, 0
-balitrand.fr, 0
-balkan.ru, 0
 ballbar.cc, 0
 baltikums.eu, 0
 bamada.net, 0
@@ -1641,18 +952,14 @@
 bamilo.com, 0
 bamper.by, 0
 bananacare.ch, 0
-bancogalicia.com.ar, 0
 bancomoc.mz, 0
 bandaancha.eu, 0
 bang5mai.com, 0
 bangcle.com, 0
 banggood.cn, 0
 banglatext.com, 0
-bangnipai.com, 0
 bangqu.com, 0
 banhai.com, 0
-banif.com.mt, 0
-banio.ir, 0
 banjiajia.com, 0
 bank24.uz, 0
 bankbps.pl, 0
@@ -1662,157 +969,84 @@
 bankmandiri.co.id, 0
 bankofbeijing.com.cn, 0
 bankofdl.com, 0
-bankowebezprawie.pl, 0
 bankreferatov.ru, 0
 banks.is, 0
-banmaxiaozhen.com, 0
 banob.ir, 0
 banyantree.com, 0
 bao.cn, 0
-baojia.com, 0
 baomitu.com, 0
-baoyuntong.com, 0
-baozou.com, 0
 baozun.cn, 0
-bappedakaltim.com, 0
-baraodemaua.br, 0
-baratz.es, 0
-barbars.ru, 0
 barbioyunu.com.tr, 0
 barcodeberlin.com, 0
-bareknucklepickups.co.uk, 0
-barnacl.es, 0
 barneos22.ru, 0
 barracuda.digital, 0
 bartin.edu.tr, 0
-bartonccc.edu, 0
 bas.co.jp, 0
-basetis.com, 0
 basezap.com, 0
 bashagroplast.com, 0
 bashkortostan.ru, 0
-basis.com, 0
 baskcompany.ru, 0
-basnet.by, 0
 bast.ru, 0
 basu.ac.ir, 0
-batcave.net, 0
 batiaoyu.com, 0
 battlecomics.co.kr, 0
-battleofballs.com, 0
 battleship-game.org, 0
-baykoreans.com, 0
-baykoreans.net, 0
 baysideonline.com, 0
-baza-artistov.ru, 0
-bazakolejowa.pl, 0
-baza.net, 0
-bazarelentrerriano.com.ar, 0
-bazarknig.ru, 0
 bazhongol.com, 0
 bazhuayu.com, 0
-bbdogroup.ru, 0
 bbmundo.com, 0
-bbonfire.com, 0
-bbport.ru, 0
 bbspro.net, 0
 bbvafrances.com.ar, 0
 bbztx.com, 0
-bcactc.com, 0
-bcamath.org, 0
 bcassessment.ca, 0
-bcat.ge, 0
 bcb5.com, 0
 bccto.me, 0
 bcebos.com, 0
 bch.com.cn, 0
-bch.hn, 0
-bcr.gob.sv, 0
 bcr.ro, 0
 bcsh.com, 0
 bcy.net, 0
 bda.bg, 0
 bdear.xyz, 0
-bdew.net, 0
 bd-film.com, 0
 bdimg.com, 0
-bdjc001.com, 0
-bdo.global, 0
 bdpan.com, 0
-bdpu.org, 0
 bdqn.cn, 0
-bdsmclub.pl, 0
 bdsm-russia.com, 0
 bdstatic.com, 0
-bdsu.de, 0
 bea.aero, 0
-beactive.it, 0
-beamr.com, 0
-beam.tv, 0
 bearworld.co.kr, 0
 beate-uhse.com, 0
-beatsound.ru, 0
 beatstage.com, 0
-beautyjagd.de, 0
-bebehouse.com, 0
 bebekoyunu.com.tr, 0
 bebinak.com, 0
 bebio.pl, 0
-becoder.org, 0
-beejournal.ru, 0
 beeline.ru, 0
 beeteco.com, 0
-beevalley.co.jp, 0
-beevideo.tv, 0
 behe.com, 0
-behranoil.com, 0
-behsaa.com, 0
-behsakala.com, 0
-behtarin.tj, 0
 beibei.com, 0
-beiersdorfgroup.com, 0
-beijingtoday.com.cn, 0
-beitaichufang.com, 0
 beitone.com, 0
 bejbynet.cz, 0
 belgazprombank.by, 0
 belgium.be, 0
 belgraviacentre.com, 0
-belhard.com, 0
 belightsoft.com, 0
 belink.com, 0
 belive.ru, 0
 belle8.com, 0
 bellicon.com, 0
-bellini.fr, 0
-bellpotter.com.au, 0
 belorusskiy-trikotazh.ru, 0
 belregion.ru, 0
-beltranssat.by, 0
 be.ma, 0
 bemanicn.com, 0
-bencil.pro, 0
-benedettis.com, 0
 benefitresource.com, 0
-benefitsystems.bg, 0
 benefitsystems.pl, 0
 beneylu.com, 0
 beneyluschool.net, 0
-bengalimusic.in, 0
 bengbeng.com, 0
-bengtsfors.se, 0
-benlai.com, 0
-benlailife.com, 0
 benmi.com, 0
-benq.com.cn, 0
-benrmatthews.com, 0
-beogradskioglasi.com, 0
-beontop.ae, 0
 berbidvps.ir, 0
-berdyansk.net, 0
-beridver.ru, 0
 berito.ru, 0
-berlin-partner.de, 0
 berlitz.com, 0
 berlitz.de, 0
 bernat.im, 0
@@ -1827,24 +1061,15 @@
 besmart.kz, 0
 besplatnyeprogrammy.net, 0
 bestcake.com, 0
-best-carnival.ru, 0
-besthosting.ua, 0
-bestload.me, 0
-bestmani.ru, 0
 best-price.com, 0
 bestprice.gr, 0
-bestr.it, 0
 bestsdk.com, 0
 bestsecret.at, 0
-bestsecret.ch, 0
 bestsecret.com, 0
 bestsecret.co.uk, 0
-bestsecret.fr, 0
 bestsecret.se, 0
 bestsolution.at, 0
 bestsub.com, 0
-bestv.cn, 0
-bestwallpapers-hd.com, 0
 bestwatch.ru, 0
 bestwinsoft.com, 0
 betaarchive.com, 0
@@ -1852,247 +1077,137 @@
 beta.gouv.fr, 0
 betawoo.com, 0
 betcity.ru.com, 0
-betcityru.com, 0
-bethowen.ru, 0
 bethplanet.ru, 0
 betina.ir, 0
-bet-minute.com, 0
 betonline.ag, 0
-beton.org, 0
-betprisma.com, 0
-betsbc-24.com, 0
-betsbc42.com, 0
 betscsgo.net, 0
 betsdota2.net, 0
-betsgate.com, 0
-bettingbusiness.ru, 0
 bexio.com, 0
 beyond3d.com, 0
-beyond-edge.com, 0
-beyond.pl, 0
 beyondsoft.com, 0
 beyotime.com, 0
-bezaza.ru, 0
-bezko.ru, 0
-bezlimit.ru, 0
 bezrealitky.cz, 0
-bezuzyteczna.pl, 0
 bfarm.de, 0
-bfgames.biz, 0
-bfh.com.cn, 0
 bfi.org, 0
-bfkh.ru, 0
-bfme-modding.ru, 0
 bftcom.com, 0
 bfun.cn, 0
 bfxdata.com, 0
-bfz.hu, 0
-bg.ac.rs, 0
 bgctv.com.cn, 0
 bget.ru, 0
 bgflash.com, 0
 bgforum.ru, 0
-bgreco.net, 0
 bgtop.net, 0
 bgu.co.il, 0
-bgunb.ru, 0
 bgy.com.cn, 0
 bh3.com, 0
 bialystok.pl, 0
-biapy.com, 0
-biba.de, 0
 bible-center.ru, 0
 bibleonline.ru, 0
-bible.ru, 0
 biblio.by, 0
 biblioclub.ru, 0
 biblionix.com, 0
-biboran.com, 0
 bibs.jp, 0
-bichruletka.ru, 0
 bidnews.cn, 0
 bidoo.com, 0
 bieszczady.pl, 0
-bi-file.ru, 0
-bigangwan.com, 0
 bigbangnews.com, 0
 bighost.ir, 0
 bigmir.net, 0
 bignox.com, 0
 bigotti.ro, 0
 bigpicture.ru, 0
-bigquant.com, 0
 bi-group.kz, 0
 biji.io, 0
-bikecitizens.net, 0
-bikefriday.com, 0
-bikemaster.ru, 0
 bikeroar.com, 0
 bikexpert.ro, 0
 bildungscentrum.de, 0
-bildung-schweiz.ch, 0
 biletix.ru, 0
-biletsofit.ru, 0
 bilibili.com, 0
 bilietai.lt, 0
 biligame.com, 0
 bilimal.kz, 0
-billing.ru, 0
 billin.net, 0
 bilp.fr, 0
 bimacarecard.com, 0
 bimm.uz, 0
 bimt.com, 0
-binarisonori.com, 0
-binaryfruit.com, 0
-binary.ninja, 0
-binb.co, 0
-bingo-boom.ru, 0
-bingoenglish.com, 0
 bingostars.com, 0
 bingyan.net, 0
 binomo.com, 0
-bin.sh, 0
 binus.ac.id, 0
 binzhi.com, 0
-biogena.com, 0
-biopodushka.ru, 0
-biotecan.com, 0
 bioware.ru, 0
-bipc.co.jp, 0
 bipdrive.com, 0
-bipskickers.com, 0
-bipush.com, 0
-birdol.com, 0
-birlikhabergazetesi.com, 0
-birmingham.io, 0
-birulevo.net, 0
 biryerde.biz, 0
 bisaboard.de, 0
 bisafans.de, 0
-bisai.tv, 0
-bislink.ir, 0
-bisoft.com.mx, 0
-bistek.com.br, 0
 bistudio.com, 0
 bistu.edu.cn, 0
 bit2.biz, 0
 bitauto.com, 0
 bitballoon.com, 0
-bitcheese.net, 0
 bitcoin.com, 0
 bitcomet.com, 0
-bitgame.ir, 0
 bit-hdtv.com, 0
-bitinn.net, 0
 bitkan.com, 0
-bitmessage.ch, 0
 bitminter.com, 0
 bitnamiapp.com, 0
-bitovi.com, 0
-bitp.kiev.ua, 0
 bitref.com, 0
 bitrix24.com, 0
 bits-handwerkersoftware.de, 0
-bits-hochschule.de, 0
 bitsighttech.com, 0
 bitskins.com, 0
-bittiraha.fi, 0
-bittorrentfiles.org, 0
-bittv.info, 0
 bittylicious.com, 0
 biyao.com, 0
-biysk22.ru, 0
 bizagi.com, 0
 biz.ht, 0
-bizmate.it, 0
 bizovo.ru, 0
-bizright.co.jp, 0
 biz.tm, 0
 bizws.cn, 0
-bjadks.com, 0
 bjd.com.cn, 0
 bjdx.gov.cn, 0
 bjedu.gov.cn, 0
-bjev.com.cn, 0
 bjhd.gov.cn, 0
-bjitic.com, 0
-bjjlb.org.cn, 0
 bjjtgl.gov.cn, 0
 bjkw.gov.cn, 0
 bjnsf.org, 0
-bjpost.com.cn, 0
-bj-tct.com, 0
 bjtu.edu.cn, 0
-bjwh.gov.cn, 0
 bk55.ru, 0
 bk-media.de, 0
 bkool.com, 0
 blablacar.com, 0
-blablacar.net, 0
-blablacode.ru, 0
-blackanddecker.com.br, 0
 blackberries.ru, 0
 blackberrys.ru, 0
 blackbiz.ws, 0
-blackpixel.com, 0
-blackroosteraudio.com, 0
-blackyau.cc, 0
-blafusel.de, 0
 blagovest-moskva.ru, 0
 blanco.com, 0
-blankslate.io, 0
 bl.ee, 0
 blender.org, 0
-bleujour.com, 0
-bl.gov.cn, 0
 blibao.com, 0
-blinko.ru, 0
 blitz-cinestar-bh.ba, 0
 blitz-cinestar.hr, 0
-blitzcorp.org, 0
-blockchainiz.io, 0
 block.io, 0
-bloemert.com, 0
 blogfeng.com, 0
-blogforacure.com, 0
 blogfuntw.com, 0
-bloggersclub.net, 0
 blogin.co, 0
 blogpage.eu, 0
-blogram.net, 0
 blogrebellen.de, 0
-blogshark.net, 0
-blogs-optimieren.de, 0
 blogsyte.com, 0
 blogun.ru, 0
-bloodcat.com, 0
 bloombex-options.com, 0
-blowtopop.net, 0
-blueandwhitehousepubandhkco.com, 0
-bluecomvn.com, 0
 bluefocusgroup.com, 0
 bluegolf.com, 0
-bluemarblegeo.com, 0
-bluemp.net, 0
-blueprintsys.com, 0
 blueprism.com, 0
 bluereader.org, 0
-bluesales.ru, 0
 blueshop.ca, 0
 blueshop.com.tw, 0
 bluesoft.com.br, 0
 bluevine.com, 0
-bluvacanze.it, 0
-bmbgroup.com, 0
 bme.hu, 0
 bm.lv, 0
 bmobile.ne.jp, 0
-bm.ru, 0
 bm-services.com, 0
-bmwclubmoto.ru, 0
 bmw.com.cn, 0
-bnaat.com, 0
 bndes.gov.br, 0
 bnext.com.tw, 0
 bnisecurities.co.id, 0
@@ -2100,261 +1215,140 @@
 bn.ru, 0
 bnu.edu.cn, 0
 board24.lg.ua, 0
-boardom.io, 0
 boatingmag.com, 0
 bobs.com.br, 0
 bobsfa.com.br, 0
 boce.cn, 0
-bochkameda.net, 0
-bodc.ac.uk, 0
 boeffla.de, 0
 boeingisback.com, 0
-boerde-berufskolleg.de, 0
 boerse-stuttgart.de, 0
 bog.gov.gh, 0
-bohemiaenergy.cz, 0
-boioiong.com, 0
 bokee.net, 0
-boke.io, 0
-bokeyy.com, 0
 bombardir.ru, 0
 bombardo.ru, 0
-bombato.net, 0
 bomberarena.com, 0
-bomc.top, 0
 bome.com, 0
 bonbg.com, 0
-bonding.de, 0
 bondora.com, 0
-bondora.ee, 0
-bonek.de, 0
 bonitasoft.com, 0
 bonjwa.de, 0
 bonniercorp.com, 0
 bonnier.news, 0
 bonree.com, 0
-bonusesfera.com.br, 0
-bookacan.com, 0
-bookandtrip.ru, 0
-bookandtrip.ua, 0
-bookbet23.com, 0
 bookcdn.com, 0
 bookcity.club, 0
 booked.net, 0
-bookinbudapest.com, 0
 bookingpoint.net, 0
 bookmanager.com, 0
-bookmap.com, 0
 bookmate.com, 0
 book.ru, 0
 booksfree4u.tk, 0
 bookshop.ru, 0
-booksrun.com, 0
-booktory.com, 0
-booktype.pro, 0
 book-ye.com.ua, 0
-bookzone.ro, 0
 boombate.com, 0
 boomer.sk, 0
 boosj.com, 0
-boothamschool.com, 0
 bootstrapstudio.io, 0
-borfast.com, 0
-borges.es, 0
 borimed.com, 0
 borjdental.ir, 0
 bork.ru, 0
-bornemann.net, 0
 borsonline.hu, 0
-bose.res.in, 0
-bosscasino.eu, 0
 botevgrad.com, 0
-botnet.cc, 0
 bot.nu, 0
-botreetechnologies.com, 0
-botscript.ir, 0
 botzone.org, 0
-boukal.cz, 0
 bounceme.net, 0
-bouncepingpong.com, 0
 bourky.cz, 0
 boutique-parfums.fr, 0
 bov.com, 0
-boweihe.me, 0
-bowwowinsurance.com.au, 0
-boxcar.io, 0
 boxed.com, 0
-box-evidence.com, 0
 boxueio.com, 0
 boyans.net, 0
-boyhost.cn, 0
-boypoint.de, 0
-boysonyourscreen.org, 0
 boytrap2.net, 0
 bozhong.com, 0
-boziking.com, 0
 bozza.ru, 0
 bplaced.net, 0
-bpmsg.com, 0
 bq.sg, 0
-braas.de, 0
 brainient.com, 0
 brainpad.co.jp, 0
-brainsoftware.org, 0
-brainwave-research-institute.com, 0
 branchable.com, 0
-brandica.ir, 0
-brandos.se, 0
-brankovucinec.com, 0
-bravecollective.com, 0
-braveineve.com, 0
 bravosupermarket.az, 0
-br.com, 0
 br.de, 0
-breachalarm.com, 0
 breakingmuscle.com, 0
-breitling.co.jp, 0
 bremerhaven.de, 0
-bremsspur.org, 0
 bresser.de, 0
-bretty.de, 0
-brewers.com, 0
-brg14.at, 0
-bricker.info, 0
 bricker.ru, 0
 bricofer.it, 0
 bricomarche.pt, 0
-bridgeresort.ru, 0
-brightbox.com, 0
-brightsignnetwork.com, 0
 brightwallpapers.com.ua, 0
 briian.com, 0
 brilliancce.com, 0
-bringo247.ru, 0
-brn.cz, 0
-broadrichness.com, 0
 brocent.com, 0
 brodude.ru, 0
-broekhuis.nl, 0
-brokersjeans.com, 0
-bromium.com, 0
 brot-fuer-die-welt.de, 0
 brown-eyes.ru, 0
 brownpapertickets.com, 0
 brownsugar.tw, 0
 browserdoktor.de, 0
 browserleaks.com, 0
-browshot.com, 0
 brra.bg, 0
 brrc.ru, 0
-bruderste.in, 0
-brudno.com.ua, 0
-brusnika.ru, 0
 bsau.ru, 0
-bscotch.net, 0
-bsi.si, 0
 bsn.ru, 0
 bspb.ru, 0
-bspect.com, 0
-bstester.com, 0
 bstu.ru, 0
-bsuc.cc, 0
 bsuir.by, 0
-bswj.net, 0
-bt2d.com, 0
 btago.com, 0
 btbtdy.com, 0
 btcfans.com, 0
-btcinv4u.com, 0
 btempurl.com, 0
 btfx.net, 0
 btime.com, 0
-btk-fh.de, 0
-btmgg.com, 0
 btn-muenzen.de, 0
 btpeer.com, 0
 btrans.by, 0
-btsearch.co, 0
-btsearch.me, 0
 btydt.com, 0
 buaa.edu.cn, 0
 bubi.cn, 0
-bucek.name, 0
-buchmann.ch, 0
 bucketlist.org, 0
 buct.edu.cn, 0
-budacode.com, 0
-bud-stroynoy.ru, 0
 buffer.com, 0
 bufs.ac.kr, 0
 bugclose.com, 0
 bugetul.ro, 0
-bugscan.net, 0
 bugtags.com, 0
-bugunneleroldu.com, 0
-buhaoting.com, 0
 buhgalter911.com, 0
 buildabazaar.com, 0
-builder.eu, 0
 builder.hu, 0
-builds.io, 0
-buildyourownguitar.com.au, 0
 bukaba.com, 0
 bukainfo.com, 0
-buklya.com, 0
 bukmacherskie.com, 0
-bulkinkeys.com, 0
-bulkreefsupply.com, 0
-bulletsend.com, 0
 bultannews.com, 0
 bumimi.com, 0
 bundesliga.at, 0
-bunkus.org, 0
 bunz.com, 0
 bupa.com.sa, 0
 bupt.edu.cn, 0
-burenqi.com, 0
-burgerfuel.com, 0
-burgessyachts.com, 0
 burjauto.com, 0
 burningshed.com, 0
 busfor.com, 0
-busfor.pl, 0
 busfor.ru, 0
-business4all.ca, 0
 business-gazeta.ru, 0
-businesshemden.com, 0
-businessinfo.cz, 0
-business-internet.biz, 0
 businessportal.gr, 0
-business-software.com, 0
 businessstudio.ru, 0
-businesstoday.co.ke, 0
-busmap.vn, 0
 busqueda-local.es, 0
 bussoladoinvestidor.com.br, 0
-busybeeschildcare.co.uk, 0
 buyalenovo.com, 0
-buycheapr.com, 0
 buyex.ir, 0
-buyunder500.in, 0
 buzzerbeater.com, 0
-buzzhire.co, 0
 bvbcode.com, 0
-bwt-group.com, 0
 bybbs.org, 0
-byb.cn, 0
 bydauto.com.cn, 0
-bydgoszcz.pl, 0
 byethost10.com, 0
-byethost11.com, 0
-byethost12.com, 0
 byethost13.com, 0
 byethost14.com, 0
 byethost15.com, 0
 byethost16.com, 0
 byethost17.com, 0
-byethost18.com, 0
 byethost22.com, 0
 byethost24.com, 0
 byethost32.com, 0
@@ -2363,25 +1357,12 @@
 byethost8.com, 0
 byethost9.com, 0
 byfen.com, 0
-byggahus.se, 0
 bygmax.dk, 0
-byside.com, 0
-bytecdn.cn, 0
 byte.fm, 0
-bytemag.ru, 0
-bz-bx.net, 0
-bzgame.cc, 0
-bzs.su, 0
-c2lab.ovh, 0
 c4dcn.com, 0
-c7sky.com, 0
 c9users.io, 0
 caac.net, 0
 caa.edu.cn, 0
-caat.org.uk, 0
-cableforum.co.uk, 0
-cabovillas.com, 0
-cadict.net, 0
 cadstudio.ru, 0
 cafe24.com, 0
 cafekado.ir, 0
@@ -2394,179 +1375,93 @@
 caijing.com.cn, 0
 cailianpress.com, 0
 cailiaoren.com, 0
-caimomo.com, 0
-cainiaoapp.cn, 0
-caisan.io, 0
 caixin.com, 0
 caknun.com, 0
 caktusgroup.com, 0
 calcudoku.org, 0
-calculator-imt.com, 0
 calculatorpi.com, 0
-caldera.com, 0
 californiasciencecenter.org, 0
 callbackhunter.com, 0
 calligra.org, 0
-callnote.net, 0
 calmradio.com, 0
 caltech.edu, 0
-calvarycare.org.au, 0
-calweb.com, 0
-calyptix.com, 0
-camayak.com, 0
 cambiaresearch.com, 0
 cambiaste.com, 0
-cambio.se, 0
-cambodia-airports.aero, 0
-cambsed.net, 0
 camelia.lt, 0
 camellia-sinensis.com, 0
 cameron.edu, 0
-cameronsino.com, 0
 camisetanerd.com, 0
-camlab.co.uk, 0
 camonster.com, 0
-campaignmaster.co.uk, 0
 camping.info, 0
-camping-penhoat.com, 0
 camptocamp.com, 0
-campusgifts.co.uk, 0
 campyokwe.org, 0
-canaan.io, 0
-canadianarchitect.com, 0
-cancer.gov.co, 0
-cancerimagingarchive.net, 0
-candsleads.com, 0
-candy.it, 0
 canfreee.com, 0
 cang.com, 0
 canliligtvseyret.org, 0
-canoe.ie, 0
 canpars.ca, 0
-cantr.net, 0
-can-tv.cn, 0
 can.ua, 0
-caobai.com, 0
 caogen8.co, 0
 caoliuporn.com, 0
-capeanalytics.com, 0
-capitalmadrid.com, 0
-capital-match.com, 0
-capitalsports.de, 0
-captainbook.gr, 0
 captaincontrat.com, 0
-captainverify.com, 0
-captiv8.io, 0
 captivoice.com, 0
-captureone.cn, 0
-caracter.ru, 0
 carambis.com, 0
 carambis.ru, 0
-caravaning-univers.com, 0
 cardcastgame.com, 0
-cardmarket.eu, 0
 cardpay.com, 0
-cardq.co.kr, 0
-card-sharing.ru, 0
-cardwinner.com, 0
 careerindex.jp, 0
-career.lk, 0
-careesma.in, 0
-carefy.com, 0
-careiphone.com, 0
 carfix.ru, 0
 cargeek.ir, 0
-carhire.ie, 0
 caricatura.ru, 0
 caritas.at, 0
 carlab.co.kr, 0
 carnoc.com, 0
 carpediem.cd, 0
-carptime.ru, 0
 carrefourinternet.com, 0
-carreirafashion.com.br, 0
-carsbase.com, 0
 cars.kg, 0
-cars-promo.com, 0
-carta.ro, 0
 carteblanchepartenaires.fr, 0
-cartft.com, 0
 cartridgesave.co.uk, 0
 carus-verlag.com, 0
-car.uz, 0
 casadocodigo.com.br, 0
 casaley.com.mx, 0
-casalomacollege.edu, 0
 cas.cz, 0
 case24.it, 0
-caseloadmanager.com, 0
-cash24.ru, 0
-cashlai.com, 0
 casicloud.com, 0
 casinuevo.net, 0
 caspian.aero, 0
 cass.cn, 0
 castavote.it, 0
 casting360.com, 0
-castrol-original.ru, 0
-casualgamers.club, 0
 catalinahub.net, 0
 catalysts.cc, 0
 catfan.me, 0
-catharinehill.com.br, 0
-cathay-ins.com.cn, 0
-catholic.edu.au, 0
-catie.ac.cr, 0
 catlin.edu, 0
 cattry.com, 0
-catwalkwholesale.com, 0
 cau.edu.cn, 0
 causeway.com, 0
-cavinnash.at, 0
 cawi.fr, 0
-caykaragazetesi.com, 0
-cayneshousewares.com, 0
 cazin.net, 0
-cba.pl, 0
 cbbank.com, 0
-cbc.rs, 0
 cbda.cn, 0
-cbk.waw.pl, 0
 c-brains.jp, 0
 cbri.res.in, 0
-cbsi.com, 0
-cbsig.net, 0
 ccav1.com, 0
 ccav1.me, 0
 ccav.info, 0
 ccb.com, 0
-ccc.ac, 0
-cccamonde.com, 0
 cccampass.com, 0
 ccc.de, 0
 cccm.com, 0
 cccpmo.com, 0
 cccyun.cc, 0
 ccdi.gov.cn, 0
-cce.cz, 0
 ccf.com.cn, 0
-ccgenbr.com.br, 0
-ccit.js.cn, 0
 cclonline.com, 0
 ccpph.com.cn, 0
-cctin.com, 0
-cctld.ru, 0
-cdbbank.az, 0
 cdc.im, 0
 cdcoslm.com, 0
 cdeway.com, 0
 cdfgj.gov.cn, 0
-cdischina.com, 0
 cdmarf.ru, 0
-cdm.org, 0
-cdn3x.com, 0
-cdnbetcity.com, 0
-cdrinfo.pl, 0
 cds.spb.ru, 0
 cdu.edu.ua, 0
 cdut.edu.cn, 0
@@ -2574,93 +1469,45 @@
 cdvpodarok.ru, 0
 cea.gov.cn, 0
 ceair.com, 0
-ceamadeus.com, 0
 cecb2b.com, 0
 ce.cn, 0
 cedarhd.com, 0
-cedrus.hu, 0
-ceeji.net, 0
-cefa.com, 0
 ce.gov.br, 0
-ceh9.tv, 0
 cehome.com, 0
 cei.com.cn, 0
 cekid.com, 0
-ceknito.cz, 0
-ceknito.sk, 0
-celakaja.lv, 0
 celemony.com, 0
-celera-group.com, 0
 celesc.com.br, 0
-celignes.com, 0
-cellstat.net, 0
 celulardireto.com.br, 0
-censhare.com, 0
 censys.io, 0
 centaline.com.cn, 0
 center-inform.ru, 0
-centeva.com, 0
-cention.se, 0
 centiumsoftware.com, 0
 centminmod.com, 0
-centracom.com, 0
 centralclubs.com, 0
-centralhealth.com.hk, 0
-centralmenu.com.pt, 0
 centralpark.com, 0
 centralstationcrm.net, 0
-centredeliquidationduquebec.com, 0
 centreon.com, 0
 centriohost.com, 0
-centroimpiego.it, 0
-centrora.com, 0
-centrzaimov.ru, 0
-cenynadne.sk, 0
 cephaiti.ht, 0
-cephastanesi.org, 0
 ceph.org.cn, 0
-ceramique.com, 0
-cerfrance.fr, 0
-certbase.de, 0
-certissim.com, 0
-certitudes.org, 0
-cert.org.cn, 0
 cesan.com.br, 0
-cesanta.com, 0
-cesareox.com, 0
-cesco.co.kr, 0
 ces.edu.uy, 0
 cesurformaciononline.com, 0
-cetc.com.cn, 0
-cetera.ru, 0
-ceu.edu.ph, 0
 ceva.com, 0
 ceve-market.org, 0
-cev.lu, 0
 cez.cz, 0
 cez.ro, 0
-cezurity.com, 0
-cf2016.ru, 0
 cfdsupport.com, 0
-cfei.net, 0
-cfldcn.com, 0
-cflex.com, 0
-cfpd.org.cn, 0
-cg976.fr, 0
-cgilfe.it, 0
 cgil.it, 0
 cgpersia.ru, 0
 cgs.gov.cn, 0
 cgu.edu.tw, 0
-chachazhan.com, 0
 chacuo.net, 0
-chadis.com, 0
 chaicp.com, 0
 chainfire.eu, 0
 chains.cc, 0
-chainsea.com.tw, 0
 chain.so, 0
-chaiwubi.com, 0
 chalmers.se, 0
 chal-tec.com, 0
 chamonet.com, 0
@@ -2672,7 +1519,6 @@
 chanet.com.cn, 0
 changan.com.cn, 0
 changba.com, 0
-change38.ch, 0
 changeip.net, 0
 changingedu.com, 0
 changyou.com, 0
@@ -2683,72 +1529,43 @@
 chaoshanw.cn, 0
 chapaiming.com, 0
 charogh.com, 0
-charter.com, 0
-chartrank.com, 0
 chat2desk.com, 0
 chataoke.com, 0
 chat-brasil.com, 0
 chatcity.de, 0
 chat-pt.com, 0
-chatruletka.com, 0
-chattermill.io, 0
 chatti.de, 0
 chaturbate.com.br, 0
-chatworld.de, 0
-chaxuntu.com, 0
 chb.com.tw, 0
 chcivyhodnejsienergie.cz, 0
 chdbits.vip, 0
 chd.edu.cn, 0
 che300.com, 0
-cheapjerseysfree.com, 0
-cheatcodesiosandroid.com, 0
 cheatorhackgames.com, 0
-cheatsandhack.info, 0
-cheatsgamehack.info, 0
 chebaba.com, 0
-chebao.com.cn, 0
-checknow.co.uk, 0
 cheers.com.tw, 0
-chefpartyswinger.com, 0
 cheladmin.ru, 0
 chelcenter.ru, 0
 chelm.pl, 0
 chel.ru, 0
 chem99.com, 0
-chemistry.org.tw, 0
-chemweb.com, 0
-chengduair.cc, 0
 chengdu.cn, 0
-chengniu.com, 0
 chengzivr.com, 0
-chennaihalls.in, 0
 chenxingweb.com, 0
 chenyudong.com, 0
 cherinfo.ru, 0
-chernigiv-rada.gov.ua, 0
-cheros.ru, 0
-chers.com.ua, 0
 cherubicsoft.com, 0
-cheryjaguarlandrover.com, 0
 chesspuzzle.net, 0
 chess-samara.ru, 0
 chevy-clan.ru, 0
-chexch.com, 0
-chexiu.cn, 0
-chgaki.ru, 0
-chgik.ru, 0
 chiapas.gob.mx, 0
 chia.ua, 0
 chickenkiller.com, 0
 chicrank.ir, 0
 childdevelop.com.ua, 0
-chiletrabajos.cl, 0
-chillglobal.com, 0
 chinaar.com, 0
 chinabluemix.net, 0
 chinacache.com, 0
-chinacardpos.com, 0
 china-cba.net, 0
 chinachugui.com, 0
 chinacloudapi.cn, 0
@@ -2757,105 +1574,56 @@
 china.com.cn, 0
 chinadaily.com.cn, 0
 chinadance.cn, 0
-chinaeducationexpo.com, 0
 chinaemail.cn, 0
-china-entercom.com, 0
-chinahr.com, 0
 chinahrt.com, 0
 chinamobile.com, 0
 chinancce.com, 0
 chinanetcenter.com, 0
-chinaoct.com, 0
 chinaopple.com, 0
 chinapiwei.com, 0
 chinaports.com, 0
-china-post-track.com, 0
 chinasalestore.com, 0
 china-shftz.gov.cn, 0
-chinaums.com, 0
-chinaunicom.cn, 0
-chinayasha.com, 0
 chineseall.cn, 0
 chinesecio.com, 0
 chinesegamer.net, 0
 chinesetest.cn, 0
-chinlingo.com, 0
 chint.com, 0
 chipfind.ru, 0
-chipic.ir, 0
-chitaitext.ru, 0
-chither.com, 0
-chkaja.com, 0
-chnlanker.com, 0
-chocolissimo.de, 0
 choices360.com, 0
-choisirsonfioul.fr, 0
-chongmoa.com, 0
-chopacho.ru, 0
-chordshub.com, 0
 chorus.ai, 0
 chrdk.ru, 0
-chrihani.com, 0
 chrishogan360.com, 0
-christenenvoorisrael.nl, 0
-christianliebel.com, 0
-christian-luetgens.de, 0
 chronicle.co.zw, 0
 chroniclejournal.com, 0
 chsu.ru, 0
-chtodelat.com, 0
 chuangkit.com, 0
-chuangkoo.com, 0
 chuanke.com, 0
-chu-dijon.fr, 0
 chudobilet.ru, 0
-chudu24.com, 0
 chuhai.edu.hk, 0
-chuhai.hk, 0
 chujianapp.com, 0
-chunk.com.cn, 0
 chuvsu.ru, 0
-chuyhiep.net, 0
-chv.ua, 0
-chytryhonza.cz, 0
-chzu.edu.cn, 0
 ci123.com, 0
 cib.com.cn, 0
-ci-bi.ru, 0
 cicams.ac.cn, 0
 cicon.ru, 0
-cidcode.net, 0
 ciencia-ficcion.com, 0
 ciftlikbank.com, 0
-cifttik.com, 0
-cig.com.cn, 0
-cik.bg, 0
-cimb.com, 0
 cimex.com.cu, 0
-cimt.de, 0
-cindasc.com, 0
-cinecoffee.com, 0
 cinemacity.hu, 0
 cinemapark.ru, 0
 cinematik.net, 0
 cinestarcinemas.rs, 0
-cinoherniklub.cz, 0
 ciob.org, 0
-cipcipstore.it, 0
 ciper.cl, 0
-cipf.es, 0
-circuitodejerez.com, 0
 circulaire-en-ligne.ca, 0
 cirici.com, 0
 ciscoexam.online, 0
-cislink.com, 0
 citadele.lt, 0
 citationprocessingcenter.com, 0
 cit.edu.tw, 0
 citicsf.com, 0
-citictel-cpc.com, 0
 citrio.com, 0
-cits.br, 0
 citsgbt.com, 0
 cittadellasalute.to.it, 0
 cityads.com, 0
@@ -2863,191 +1631,111 @@
 city.kharkov.ua, 0
 cityshop.com.cn, 0
 citytaxi.az, 0
-city-wohnen.de, 0
-ciu20.org, 0
-ciuvo.com, 0
 civey.com, 0
-civilavia.info, 0
-cizgi.com.tr, 0
-cjh.com.cn, 0
 cjlu.edu.cn, 0
-cjwsjy.com.cn, 0
 ck12info.org, 0
 ck180.com, 0
-ckclouds.com, 0
 ck-modelcars.de, 0
 clammr.com, 0
-clang.cn, 0
 clans.de, 0
 clansweb.com, 0
 clarin.com, 0
-clark-chen.com, 0
-clarocloud.co.za, 0
 classicalarchives.com, 0
 classic-gaming.net, 0
-classit.ro, 0
-classmethod.info, 0
-clayboxltd.com, 0
-clayesmore.com, 0
-cleanenergywire.org, 0
 cleanlinesurf.com, 0
-cleanpix.com, 0
-cleanvoice.ru, 0
-clearcast.co.uk, 0
 clearch.org, 0
-clear-code.com, 0
 clearscore.com, 0
 clearwebstats.com, 0
-clemensotto.com, 0
 cles.jp, 0
 cleveroad.com, 0
-cleversite.ru, 0
 cleversubtitles.ru, 0
 clewm.net, 0
 clickad.info, 0
 clickers.info, 0
-clickpayment.ir, 0
 click.uz, 0
 clickview.com.au, 0
 cliclavoroveneto.it, 0
 client-shop-logistics.ru, 0
 client.xzn.ir, 0
 cli.im, 0
-clilk.com, 0
 climate-kic.org, 0
-clinicbuddy.com, 0
-clio.it, 0
-clip.af, 0
 clippersync.com, 0
-clir.org, 0
 clockshop.ru, 0
-cloud4you.biz, 0
-cloud4y.ru, 0
 cloud86.cn, 0
 cloudapp.net, 0
-cloudcampus.cc, 0
 cloudcc.com, 0
 clouddn.com, 0
 cloudfire.ir, 0
 cloudfront.net, 0
-cloud.geek.nz, 0
 cloudin.cn, 0
 cloudlinux.com, 0
 cloudme.com, 0
 cloud-mine.online, 0
-cloudns.cc, 0
 cloudonaut.io, 0
-cloudparse.com, 0
 cloudrexx.com, 0
 cloudrino.net, 0
-cloudron.io, 0
 cloudsite.ir, 0
-cloudsmart.lu, 0
-cloudsms.com.ng, 0
-cloudsplus.com.cn, 0
 clouds.tf, 0
 cloudtv.bz, 0
 cloudvhost.cn, 0
 cloudware.jp, 0
-cloudxink.com, 0
-club3.cf, 0
-clubdesavantages.fr, 0
-clubs1.bg, 0
 clutchpoints.com, 0
 clzg.cn, 0
-cmaritime.com.cn, 0
-cmbi.com.hk, 0
-cmc.gv.ao, 0
-cmcnu.or.kr, 0
 cmeiwei.com, 0
-cmfchina.com, 0
-cmgame.com, 0
-cmgine.net, 0
 cml.pt, 0
 cmlt.ru, 0
 cmonitor.pl, 0
-cmscafe.ru, 0
 cms.gov.af, 0
 cms-guide.com, 0
 cm-sintra.pt, 0
 cmsky.com, 0
-cmtt.ru, 0
 cmu.ac.th, 0
 cmu.edu, 0
 cmu-edu.eu, 0
 cnaidai.com, 0
-cnbb.com.cn, 0
 cnblogs.com, 0
-cnbluebox.com, 0
 cncf.io, 0
 cndhl.com, 0
 cnexps.com, 0
 cnfeol.com, 0
-cngaosu.com, 0
 cngold.org, 0
 cn-healthcare.com, 0
 cnhnb.com, 0
 cnhubei.com, 0
-cnic.cn, 0
 cnki.net, 0
 cnkrl.cn, 0
-cnl.sk, 0
 cnl.su, 0
-cnl.tv, 0
-cnoa.cn, 0
 cnooc.com.cn, 0
 cnool.net, 0
 cnpatent.com, 0
 cnpq.br, 0
-cnprint.org, 0
-cnpzhe.com, 0
 cnr.cn, 0
 cnseay.com, 0
 cnsecer.com, 0
 cnshb.ru, 0
 cnsuning.com, 0
-cnsuning.com.hk, 0
-cntaiping.com, 0
-cnte.tn, 0
 cnt.my, 0
 cntraveller.ru, 0
 cntv.cn, 0
-cnxct.com, 0
 cnx-software.com, 0
 coaching-foot.com, 0
-coap.kz, 0
 cocha.com, 0
-cocobongo.com, 0
 cocoking.info, 0
 cocoleech.com, 0
 codacy.com, 0
 co.de, 0
 codeaurora.org, 0
-codebeer.ru, 0
 codebox.ir, 0
-codecanyonwp.com, 0
 codecasts.com.br, 0
 codeclic.com, 0
 codeforge.cn, 0
 codeforge.com, 0
 codefresh.io, 0
 code-industry.net, 0
-codelife.me, 0
 codemao.cn, 0
-coderknock.com, 0
 coder-note.com, 0
-code-route.info, 0
-coding-academy.fr, 0
-coding.io, 0
-coduka.de, 0
-coffee-butik.ru, 0
-cofina.pt, 0
 cofm.es, 0
-cofpo.org, 0
-coi.cz, 0
-coinflux.com, 0
 coinjar.com, 0
-coinjar.com.au, 0
 coinkeeper.me, 0
 coinpalace.io, 0
 coinsbank.com, 0
@@ -3055,122 +1743,64 @@
 coinsup.com, 0
 colasoft.com, 0
 colasoft.com.cn, 0
-colbeh.ir, 0
-coldline.hu, 0
 colettehq.com, 0
-colibri.io, 0
 collabora.com, 0
 collaboraoffice.com, 0
 collaborative.org, 0
-collect.ai, 0
 collectivefab.com, 0
-collegeblondin.qc.ca, 0
 collegemarching.com, 0
-collibra.com, 0
 collsk12.org, 0
-colobot.info, 0
 coloproperty.com, 0
 color.com, 0
-colornumbers.ru, 0
-color-print39.ru, 0
-colourlife.com, 0
-colproba.org.ar, 0
-coma.lv, 0
-com.be, 0
 combowombo.ru, 0
 combr.ru, 0
-comein.sk, 0
-comeitaliani.it, 0
-comelite-arch.com, 0
-comelz.com, 0
-comeremcasa.com, 0
-comfone.com, 0
-comicool.cn, 0
-comics-porno.ru, 0
 com.kz, 0
-comlan.com, 0
 comli.com, 0
 comlu.com, 0
-commaster.net, 0
-commcenter.es, 0
-commerceduniya.com, 0
 commonhealth.com.tw, 0
-commonkindness.com, 0
 commotionwireless.net, 0
-comm-tec.de, 0
-communications.support, 0
 compagniedumontblanc.fr, 0
-companeo.be, 0
 companeo.com, 0
-compariimobiliare.ro, 0
 compass.education, 0
-compassplus.ru, 0
-complexityexplorer.org, 0
-comptable-en-ligne.fr, 0
-compulab.co.il, 0
 compumatrix.co, 0
-compumatrix.us.com, 0
-compumed.com.my, 0
-compusoluciones.com, 0
-computerads.ir, 0
-computershop.pisa.it, 0
 computrabajo.com, 0
 computrabajo.com.hn, 0
-com.se, 0
 comss.ru, 0
 comstats.de, 0
-comtech.com.cn, 0
 comtradeshop.com, 0
 comune.siena.it, 0
 comxa.com, 0
 conanwiki.org, 0
-concordemed.com, 0
 conde.com, 0
 condenast.co.uk, 0
 condenast.ru, 0
 confessionsofahomeschooler.com, 0
-confmaster.net, 0
 conglinnet.com, 0
 congm.in, 0
 connectedly.com, 0
-connectify.com, 0
 connectify.me, 0
 co.no, 0
-conpoint.com, 0
 conseil-config.com, 0
 conseq.cz, 0
-conservatoriotorino.gov.it, 0
-construction411.com, 0
-consulimus.de, 0
 consultant.ru, 0
 consumerscompare.org, 0
 contabo.host, 0
 contactlab.com, 0
 conta.mobi, 0
 contao.org, 0
-conte.by, 0
 content-cooperation.com, 0
-continentalcarbonic.com, 0
 contractiq.com, 0
 contragents.ru, 0
-controlerp.org, 0
-controletechniquegratuit.com, 0
 converter.cz, 0
 convex.ru, 0
 coobar.com, 0
 coodoor.com, 0
-coohua.com, 0
-cook-key.de, 0
-cook-key.it, 0
 coolapk.com, 0
 coolapkmarket.com, 0
-coolbaby.ru, 0
-coolion.com, 0
 coolnull.com, 0
 coolyun.com, 0
 coop-game.com, 0
 coop.py, 0
-coore.jp, 0
 copasa.com.br, 0
 copel.net, 0
 copiny.com, 0
@@ -3179,406 +1809,213 @@
 co.pt, 0
 copybet.com, 0
 copy.sh, 0
-copytrack.com, 0
-coracle.com, 0
-coradir.com.ar, 0
 coral-club.com, 0
-cordoba.es, 0
-corecodec.com, 0
-coreinfrastructure.org, 0
-corelan.be, 0
-corenominal.org, 0
 corepacks.com, 0
-core-rpg.net, 0
 cornell.edu, 0
-corrections.govt.nz, 0
-corsocomo.com, 0
-cortona3d.com, 0
-co.ru, 0
-cosmobase.ru, 0
-cosmos.ru, 0
-cotonti.com, 0
 counsellingresource.com, 0
 countryclubworld.com, 0
 countrygarden.com.cn, 0
-couponkun.jp, 0
 coursinformatiquepdf.com, 0
 cowlevel.net, 0
 co.za, 0
 cp247.net, 0
-cpanel.ir, 0
-cpapd.org.cn, 0
-cp.com.cn, 0
 cpc.vn, 0
 cpic.com.cn, 0
-cplusplus.me, 0
 cpmchina.co, 0
-cpnv.ch, 0
-cpoc.cn, 0
-cppcc.gov.cn, 0
-cprsweb.com, 0
-cpsite.ru, 0
 cpygames.com, 0
-cq118.com, 0
-cqgh.org, 0
 cqjtu.edu.cn, 0
 cqnews.net, 0
 cqsq.com, 0
 cqtimes.cn, 0
 cqu.edu.cn, 0
 cqupt.edu.cn, 0
-cr911.ru, 0
-cra0vision.net, 0
 crackberry.com, 0
-crack-cheat.ru, 0
-crackhogar.com, 0
 crackingking.com, 0
 craftmann.ru, 0
 crate.io, 0
 craym.eu, 0
-crazycen.com, 0
-crazyguyonabike.com, 0
-crazyhotseeds.com, 0
 crb-dnr.ru, 0
 crcc.cn, 0
 crc.com.cn, 0
-crc.com.hk, 0
-crdclub.su, 0
 creagames.com, 0
 creartest.com, 0
 createjs.cc, 0
-createsurvey.ru, 0
-creativcdn.net, 0
 credit2go.cn, 0
 credit-card.ru, 0
 creditchina.gov.cn, 0
 creditolo.de, 0
 crediton.ge, 0
-creditonline.hu, 0
-crediton.lv, 0
-crefal.edu.mx, 0
-cretaforce.gr, 0
 crevalue.cn, 0
 cribs.me, 0
 cri.cn, 0
 crictracker.com, 0
 crimea.com, 0
 crimea.ru, 0
-criogenizado.com, 0
 crisp.im, 0
-crm-simple.com, 0
-crmtipoftheday.com, 0
 crn.ru, 0
-croc-informatique.fr, 0
 croc.ru, 0
-crocus-hall.ru, 0
 croix-rouge.fr, 0
 cronista.com, 0
-cronobet.com, 0
 cronodeal.ch, 0
 croppola.com, 0
 cross-area.com, 0
-crouse.org, 0
 crous-toulouse.fr, 0
 crowdtangle.com, 0
-crsc.cn, 0
-crt.ru, 0
 crtslt.com, 0
 cruisingworld.com, 0
 cruzados.cl, 0
-crypters.ru, 0
-cryptogods.net, 0
-cryptomator.org, 0
-cryptshare.com, 0
-crystalvoice.sg, 0
 cs12333.com, 0
 csa.fr, 0
 csair.com, 0
-csbaonline.org, 0
 cscec.com, 0
 csc.fi, 0
 cs.co.nz, 0
-csdb.cn, 0
-csd.org.tw, 0
 cse.ru, 0
-csf.fr, 0
-csfunds.com.cn, 0
 csg.cn, 0
 csgoblaze.com, 0
 csgo.com, 0
-csgodestroy.com, 0
 csgofast.com, 0
 csgo-fate.ru, 0
-csgogamers.com, 0
 csgohouse.org, 0
 csgola.com, 0
-csgoloot.com, 0
 csgoshop.com, 0
 csgo.tm, 0
 csh.org.tw, 0
-cshr.com.cn, 0
-cshrss.gov.cn, 0
-cs-htc.com, 0
 csicr.cz, 0
 csie.org, 0
-csi.it, 0
 csi-net.it, 0
-cska.ru, 0
 cskin.net, 0
-csldbz.gov.cn, 0
-cslg.cn, 0
 csmania.ru, 0
-csna.cn, 0
 csob.sk, 0
-csopa.hu, 0
 csrc.ac.cn, 0
 csrc.gov.cn, 0
-csroller.ru, 0
 cssbuy.com, 0
 csscompressor.com, 0
 csserv.ru, 0
 csswg.org, 0
 cstnet.cn, 0
-c-stud.ru, 0
 csumentor.edu, 0
-csvt.qc.ca, 0
 csvw.com, 0
 ct10000.com, 0
 ct8.pl, 0
 ctfeshop.com.cn, 0
 ctfmall.com, 0
-cto1.ru, 0
 ctolib.com, 0
 ctrip.com, 0
-ctrlworks.com, 0
 c-t-s.ru, 0
-ctx.zone, 0
-cubalan.com, 0
-cubeisland.de, 0
 cubingchina.com, 0
-cuc.ac.jp, 0
 cuca.co.ao, 0
 cuccfree.com, 0
 cuc.edu.cn, 0
-cu-elbayadh.dz, 0
 cuentosparadormir.com, 0
 cuevana-movil.com, 0
 cuhk.edu.hk, 0
-cuintouch.com, 0
 cuiqingcai.com, 0
 cuizituan.com, 0
 cuk.pl, 0
-cultizone.fr, 0
-cu.ma, 0
 cumt.edu.cn, 0
-cupcakeproject.com, 0
 cupet.cu, 0
 cup.ir, 0
-cure53.de, 0
-curitzjt.cf, 0
 currencyrate.today, 0
-curriculum-web.com, 0
-curs.md, 0
 cursomeca.com, 0
-cuspy.org, 0
 customs4u.com, 0
 customs.ru, 0
-cuteness.com, 0
 cutestat.com, 0
 cutv.com, 0
-cv.ee, 0
-cv.lv, 0
-cvmc.org, 0
-cvonline.lt, 0
 cvp.com, 0
 cvte.com, 0
 cvut.cz, 0
-cw1.tw, 0
 cwbook.com.tw, 0
 cw.com.tw, 0
-cwdsellier.com, 0
 cwt-online.com.cn, 0
 cx580.com, 0
-cxcyds.com, 0
 cxhxrz.com, 0
-cxstar.com, 0
-cybercrime.gov.ua, 0
-cyberdefense.jp, 0
 cyberduck.io, 0
-cybergun.it, 0
 cyberoam.com, 0
-cyberprofs.com, 0
-cybersitter.com, 0
 cybo.com, 0
-cyclestore.com.es, 0
 cyclestore.co.uk, 0
-cycleworld.com, 0
-cycloneshockey.com, 0
 cycu.edu.tw, 0
 cyklobazar.cz, 0
 cyolito.com, 0
 cyotek.com, 0
-cyscorpions.com, 0
-cytbj.com, 0
 cyut.edu.tw, 0
-czcg.com, 0
 czech.cz, 0
-czechgames.com, 0
-czech-games.net, 0
 czechia.com, 0
-cz-pes.cz, 0
-czsmk.com, 0
 czxiu.com, 0
-d2fan.com, 0
-dabtc.com, 0
 dactylocours.com, 0
 dadaabc.com, 0
-dadacps.com, 0
 dadasoft.net, 0
 daddyleagues.com, 0
-dadget.ru, 0
 daewooenc.com, 0
 daewoong.co.kr, 0
 dafabet.com, 0
 dafangya.com, 0
 dafangya.com.cn, 0
 daft.ie, 0
-dahe.cn, 0
 dahuangbbs.com, 0
 dahuatech.com, 0
-dahuitu.net, 0
 daichuqu.com, 0
-daily-movies.ch, 0
 dailynews.co.th, 0
 dailystandard.com, 0
-dairyfarmgroup.com, 0
 dajia365.com, 0
 dajie.com, 0
-dalasterisk.com, 0
-dalcroze.ch, 0
-dalegames.com, 0
 daling.com, 0
-dalinuosi.lt, 0
-damailicai.com, 0
-dameiketang.com, 0
-damochka.ru, 0
-danar.ru, 0
-danbistore.com, 0
-danceconvention.net, 0
-daneiakartes.info, 0
-danet.vn, 0
 dangbei.com, 0
 dangdang.com, 0
-danilova.pro, 0
 dankstop.com, 0
-dan.me.uk, 0
-danmuji.cn, 0
-dannysite.com, 0
-dansezza.ru, 0
 daoiqi.com, 0
 daojia.com, 0
 daojia.com.cn, 0
 daojia-inc.com, 0
 daoyoudao.com, 0
-dapa.ir, 0
 daparto.de, 0
-dapenti.com, 0
 dapiniu.com, 0
-dapmalaysia.org, 0
-dapurcokelat.com, 0
 daren.pro, 0
-daricheno.com, 0
-darkbyte.ru, 0
-darkko.net, 0
-darklight.online, 0
 dark-night.me, 0
-darkseed.fr, 0
 darksidecc.com, 0
 darktech.org, 0
 dark-time.com, 0
 daroo.by, 0
 daroo.ru, 0
-da.ru, 0
 daryo.uz, 0
 dasannetworks.com, 0
 dataart.com, 0
 datacaciques.com, 0
-datacave.ch, 0
-dataexpress.com.tw, 0
 datagate.ee, 0
 data.gouv.fr, 0
-data.gov.hk, 0
-datagroup.ua, 0
-datakrat.ru, 0
 dataobject.hu, 0
-datapath.io, 0
-dataspeex.de, 0
 datastory.com.cn, 0
 datayes.com, 0
 datayuan.cn, 0
-datazucar.cu, 0
-datek.cn, 0
-datepanchang.com, 0
 datys.cu, 0
-daukce.cz, 0
-daunix.com, 0
-dautermann.io, 0
 daveramsey.com, 0
-davidrm.com, 0
 davidshuttle.com, 0
-davinciapps.com, 0
 davin.work, 0
-davispolk.com, 0
-davra.uz, 0
 dawang.tv, 0
 dawsoncollege.qc.ca, 0
-daxx.com, 0
 daybet24.com, 0
 daybuy.tw, 0
 daycare.com, 0
 daydao.com, 0
 dayezhifu.com, 0
 dayhr.com, 0
-dayin.la, 0
-daythem.edu.vn, 0
-dazzlepod.com, 0
-dba-china.com, 0
 dbappsecurity.com.cn, 0
-dbbest.com, 0
-dbelyaev.ru, 0
 dbface.com, 0
 dbpayment.com, 0
-dbscar.com, 0
 dc.gov, 0
-dcits.com, 0
 dcservices.in, 0
 dctp.tv, 0
-ddc.ac.kr, 0
 dd-dns.de, 0
-ddelivery.ru, 0
 ddit.ac.in, 0
-ddky.com, 0
-ddn.com, 0
 ddnsfree.com, 0
 ddns.info, 0
-ddnsking.com, 0
 ddns.me, 0
-ddns.ms, 0
-ddnss.de, 0
-ddns.us, 0
 ddoddotv.com, 0
 ddo.jp, 0
-ddol.es, 0
-ddoong2.com, 0
 ddpai.com, 0
 de1.cc, 0
-deaftone.com, 0
 dealber.gr, 0
-dealhaitao.com, 0
-deals.mu, 0
 deanza.edu, 0
-dearii.com, 0
-deartanker.com, 0
 deathgrind.club, 0
 debate.com.mx, 0
 debeste.de, 0
@@ -3586,90 +2023,43 @@
 debianforum.ru, 0
 debian-handbook.info, 0
 debian.net, 0
-debtcc.com, 0
 debugme.eu, 0
 de-clic.ro, 0
-decofire.pl, 0
-decoriko.ru, 0
 dedibox.fr, 0
-dedicated.co.za, 0
-dedizones.com, 0
 dedyn.io, 0
-deelkall.com, 0
-deeper.eu, 0
-deepgram.com, 0
-deepin.org, 0
 deepoon.com, 0
 deepss.co, 0
-defcon.ru, 0
 defo.ru, 0
-defre.be, 0
 deg.net, 0
-deichbrand.de, 0
-dejoris.de, 0
 del.ac.id, 0
 delaempokupki.ru, 0
 delfi.ee, 0
 delfi.lt, 0
 delfi.lv, 0
-delhivery.com, 0
 deliveryhero.com, 0
 deliverymuch.com.br, 0
 dell-brand.com, 0
 delmagyar.hu, 0
-deloks.ru, 0
 delovoymir.biz, 0
-delovoy-saransk.ru, 0
 delsa.net, 0
 delta.com.tw, 0
 deltacredit.ru, 0
-delwi-itr.de, 0
 demiart.ru, 0
 demirbank.az, 0
 demis.ru, 0
-demohoster.com, 0
 demoup.com, 0
-denascorp.ru, 0
-denbusiness.ru, 0
-dengivsem.com, 0
-denibertovic.com, 0
-denkwerk.com, 0
-dentaid.es, 0
 dentalspeedgraph.com.br, 0
-deondernemer.nl, 0
 de-oosterpoort.nl, 0
 depit.ru, 0
-depna.com, 0
 depositphotos.com, 0
 deppon.com, 0
-derbysoft.com, 0
 derev-grad.ru, 0
-derinat.ru, 0
-dermustermann.de, 0
 desamais.fr, 0
-descendentstudios.com, 0
 desc-wondo.org, 0
-designeroutlets-wolfsburg.de, 0
-design-hero.ru, 0
-design-sites.ru, 0
-desu.me, 0
-detective-conan-vostfr.info, 0
-detivgorode.ua, 0
-detoatepentrutoti.ro, 0
-detsky-mir.com, 0
-dev2.in, 0
 devbean.net, 0
-devel.cz, 0
-devicelock.com, 0
-devinotele.com, 0
 deviq.com, 0
 deviserweb.com, 0
 devochki-i-igry.ru, 0
-devoffice.com, 0
-devsmm.com, 0
-devuan.org, 0
-dewaele.com, 0
-dezhou.gov.cn, 0
 dezinfo.net, 0
 dfacture.com, 0
 dfb365.com, 0
@@ -3677,255 +2067,140 @@
 dfss.com.cn, 0
 dftb.cn, 0
 dg.gov.cn, 0
-dgphoenix.com, 0
 dgprocast.com, 0
 dgso.cn, 0
 dgut.edu.cn, 0
-dgx.io, 0
-dhammacitta.org, 0
 dhb168.com, 0
-dhcp.com.br, 0
 dh.hu, 0
 dhis2.org, 0
-dhs.org, 0
 dhu.edu.cn, 0
-dhyhost.com, 0
 diakoweb.com, 0
-dialnice.info, 0
-diamondkeys.ru, 0
-diandianzu.com, 0
-dian.fm, 0
 dianhun.cn, 0
 dianjia.com, 0
 dianjoy.com, 0
-dianlujitao.com, 0
-dianrui.com, 0
 dianxiaomi.com, 0
 diaox2.com, 0
 diaoyuweng.com, 0
-diarioeltiempo.com.ar, 0
 diarioregistrado.com, 0
 diasporafoundation.org, 0
-dibpak.com, 0
-dicholding.com, 0
 dicoding.com, 0
-diconium.com, 0
 didatrip.com, 0
-diddlefinger.com, 0
-di-digo.com, 0
 didispace.com, 0
-didtheyreadit.com, 0
 didww.com, 0
-didyoumean-generator.com, 0
-die-auto-welt.de, 0
 diedart1.com, 0
-diederichs.com, 0
-diego.hu, 0
-dieselaccess.com, 0
 dieteren.be, 0
 die-tier-welt.com, 0
-digger-online.ru, 0
 digiboy.ir, 0
-digicom.net.ua, 0
 digiexam.com, 0
 digiexam.se, 0
 digift.ru, 0
 digikam.org, 0
 digik.ir, 0
 digitalcourage.de, 0
-digitaldruid.net, 0
-digitalero.rip, 0
-digital-forest.info, 0
 digitalmarketing.jp, 0
 digitalpad.co.jp, 0
-digitas.fr, 0
 digitellmobile.com, 0
 digito.com.tw, 0
-digix.io, 0
-dilekecza.com, 0
-dimensiondata.cloud, 0
 dimonvideo.ru, 0
 dinamicbet.com, 0
 dinaserver.com, 0
-dingdone.com, 0
 dingtalk.com, 0
 dinnerqueen.net, 0
-diocese-frejus-toulon.com, 0
 diocesismalaga.es, 0
-dior.cn, 0
-dipacademy.ru, 0
-dipaul.ru, 0
 dip.jp, 0
 diploma.de, 0
-directcall.com.br, 0
 directemar.cl, 0
 directgames.co.kr, 0
 directg.net, 0
-directnews.gr, 0
-directoriocubano.info, 0
-directoriodelosaltos.net, 0
 directpay.ir, 0
-directreal.sk, 0
 dirindirin.com, 0
-dirox.net, 0
-dirteam.com, 0
 dirtrider.com, 0
 discharge.be, 0
-discotek.club, 0
-discoworld.dk, 0
-disfilm.cz, 0
 diskingressos.com.br, 0
-diskret.de, 0
-diskstation.eu, 0
 diskstation.me, 0
-displayfusion.com, 0
 distance.ru, 0
-districenter.es, 0
-ditujiupian.com, 0
 dituwuyou.com, 0
 diulas.com, 0
-diva-e.com, 0
-diveinedu.com, 0
-divineengine.xyz, 0
 divteam.com, 0
 diychina.org, 0
 diyidan.com, 0
-diyidan.net, 0
-dj66.net, 0
 djcity.com.au, 0
 djdelivery.com, 0
 djduoduo.com, 0
 djfansub.com, 0
 djicorp.com, 0
-djjuniores.com, 0
 dj.ru, 0
 djv.de, 0
 djvu-pdf.com, 0
 djzmz.org, 0
 dk.kz, 0
-dlang.org, 0
-dle-news.ir, 0
 dlinkddns.com, 0
-dlinnov.com, 0
-dlsite.com.tw, 0
-dlt.com, 0
 dm930.com, 0
 dmall.com, 0
 dmc.de, 0
 dm.center, 0
 dmeng.net, 0
 dmnico.cn, 0
-dmww.com, 0
-dndz.tv, 0
 dnevnik.ru, 0
-dniproavia.com, 0
 dnpr.com.ua, 0
 dnr24.su, 0
-dnrsovet.su, 0
 dnsalias.com, 0
-dnsalias.org, 0
 dnsbil.com, 0
 dns.com.cn, 0
 dnscrypt.org, 0
-dns-dns.com, 0
 dnsisp.net, 0
 dnspai.com, 0
 dnsrv.ru, 0
-dnswa.com, 0
-dns.watch, 0
 do1.com.cn, 0
-dobavim.ru, 0
 dobot.cc, 0
-dobreobaly.cz, 0
 docdoc.ru, 0
 docer.com, 0
 dockerapp.io, 0
-docland.ru, 0
 docscrewbanks.com, 0
-docs-for-me.ru, 0
-doctorbormental.ru, 0
-doctorcom.com, 0
-doctormckay.com, 0
 doctorspring.com, 0
 doctrine.fr, 0
-doctu.ru, 0
 documentfoundation.org, 0
-dodohome.com.tw, 0
-dodopal.com, 0
-do.edu.ru, 0
 doefiratv.org, 0
 dogechain.info, 0
 dogovor24.kz, 0
-doguselektrik.com.tr, 0
-doido.ru, 0
-doi.gov, 0
 doity.com.br, 0
 dojobsonline.com, 0
-dojos.org, 0
-doki.co, 0
 dokipedia.ru, 0
 doktordanhaberler.com, 0
-doktornarabote.ru, 0
-dolabank.com, 0
 dollaruz.com, 0
 dolopo.net, 0
-dolorescannon.com, 0
-dom2-lifes.info, 0
-domain.by, 0
-domaintescil.com, 0
 domashke.net, 0
-dom-decora.ru, 0
 domeny.tv, 0
 domex.do, 0
 dominicos.org, 0
-dominos.by, 0
 dominos.com.do, 0
 dominos.ua, 0
 domirobot.com, 0
-dom-land.com, 0
-domob.cn, 0
-domobile.com, 0
-domovid.ru, 0
-domovina.je, 0
-domtain.de, 0
 domtele.com, 0
 donationalerts.ru, 0
-donfishback.com, 0
 dongao.com, 0
 dongeejiao.com, 0
-dongjiang.com.cn, 0
 dongshun3d.com, 0
-dongyoungsang.com, 0
 donjons-tresors.com, 0
 donland.ru, 0
 donnons.org, 0
 donya-digital.com, 0
-dooa.com, 0
 dooland.com, 0
-doppelkopf-palast.de, 0
-doraemoney.com, 0
 dorama.asia, 0
-doremir.com, 0
 dornanet.net, 0
 dornbracht.com, 0
-doroga.tv, 0
 dor.org, 0
 dorsafamily.ir, 0
 doska.chita.ru, 0
-dosnap.com, 0
-dosp.org, 0
 doswap.com, 0
 dota2house.com, 0
 dota2.net, 0
-dota2top.cn, 0
 dothome.co.kr, 0
 dotlan.net, 0
 dotroll.com, 0
-dots-game.org, 0
 dottnet.it, 0
 dotunnel001.com, 0
 dotunnel.com, 0
-dotw.com, 0
 dou-bi.co, 0
 doublemap.com, 0
 doubletwist.com, 0
@@ -3934,223 +2209,116 @@
 douran.com, 0
 dowater.com, 0
 dowerandhall.com, 0
-downarchive.link, 0
-down.lc, 0
 downloadatoz.com, 0
 downloadcenter.me, 0
-download-flow.com, 0
 downloadgamesnow.org, 0
 downloadmanager.ir, 0
 download-redtube.eu, 0
-downloads-world.net, 0
 doxue.com, 0
-dozer.cc, 0
 dpap.ro, 0
 dpb.sk, 0
-dpfs.net, 0
 dp.gov.ua, 0
-dpg-physik.de, 0
-dpmb.cz, 0
 dpm.org.cn, 0
 dpo.cz, 0
-dprp.net, 0
 dp.ru, 0
-dpsi.com, 0
 dracoblue.net, 0
 draeger.com, 0
 dragonbound.net, 0
 dragongoserver.net, 0
 dragonknight.ru, 0
-dragonteam.ninja, 0
-dragplus.com, 0
-drakor.com, 0
-draw123.com.tw, 0
-drbd.org, 0
 drdump.com, 0
-dreamaction.co, 0
 dream.ren, 0
-dream-soft.de, 0
 dreifisch.com, 0
 drfakhar.ir, 0
-drgrab.ca, 0
 drgrab.com, 0
 drgrab.com.au, 0
-drgrab.co.nz, 0
 drgrab.co.uk, 0
-driedfloralshop.com, 0
-drillseo.com, 0
-driptip.ru, 0
-dripworks.com, 0
-drive2day.de, 0
-drive-my.com, 0
 driversnout.com, 0
-drlrcs.com, 0
 drofa-ventana.ru, 0
-drogariasnissei.com.br, 0
-drohobych.net, 0
-droi.com, 0
 droidbox.co.uk, 0
 droidboxforums.com, 0
 droidmod.ru, 0
 droidwiki.de, 0
 drom.ru, 0
-drone-forum.com, 0
-droneland.nl, 0
-dronk.ru, 0
 dropscan.de, 0
-drtihanyi.com, 0
 drugscouts.de, 0
-dschool.ru, 0
-dscloud.biz, 0
 dscloud.me, 0
-ds.cn, 0
-dsd.gov.hk, 0
-dshield.org, 0
 dsmynas.com, 0
 dsnews.ua, 0
-dsphere.info, 0
-dsporto.de, 0
 dss.go.th, 0
-dstu.education, 0
 dsty.ac.jp, 0
-dszo.cz, 0
-dszysoft.com, 0
-dtcj.com, 0
-dtcom.com.br, 0
 dtdns.net, 0
-dtempurl.com, 0
 dtest.cz, 0
-dtest.sk, 0
-dtln.ru, 0
-du9l.com, 0
-dualnitro.com, 0
 dualshockers.com, 0
 duanzhihu.com, 0
 duapp.com, 0
 dubna.net, 0
 dubtrack.fm, 0
-duc.cn, 0
 duckdns.org, 0
 duden.de, 0
-duguletian.com, 0
-duhowpi.net, 0
 duia.com, 0
 duiba.com.cn, 0
 duitang.com, 0
 dujin.org, 0
 duke.edu, 0
-dukey.cn, 0
 dumaosheng.com, 0
-duma.tomsk.ru, 0
-dumrt.ru, 0
 dundi.in, 0
-duniapulsa.co, 0
 dunkhome.com, 0
-duobeiyun.com, 0
 duocaitou.com, 0
 duoc.cl, 0
 duoduotv.com, 0
-duohuo.org, 0
-duoluodeyu.com, 0
 duplicationcentre.co.uk, 0
 durdom.in.ua, 0
 dushu.io, 0
-dusign.cn, 0
 dusoyun.com, 0
-dustmoon.com, 0
 dut.edu.ua, 0
 dutpt.com, 0
-duxa.cc, 0
-dva.lu, 0
-dvbank.ru, 0
-dv-com.net, 0
 dvdfab.cn, 0
 dvfu.ru, 0
 dvinaland.ru, 0
-dvr163.com, 0
 dvrdns.org, 0
 dwhd.org, 0
-dwhite.gr, 0
-dwkeji.com, 0
 dx.am, 0
-dxdt.ru, 0
-dx-racer.cz, 0
-dy530.com, 0
-dy886.com, 0
 dy.fi, 0
-dylog.it, 0
-dynabic.com, 0
 dynalias.com, 0
 dynalias.org, 0
 dynamic-dns.net, 0
-dynamo-dresden.de, 0
-dyndns-at-home.com, 0
 dyndns.biz, 0
 dyndns.dk, 0
 dyndns.info, 0
 dyndns-ip.com, 0
-dyndns.pro, 0
-dyndns-remote.com, 0
 dyndns-server.com, 0
 dyndns.tv, 0
 dyndns.ws, 0
 dynns.com, 0
 dynu.com, 0
-dynu.net, 0
-dyn-vpn.de, 0
-dzienniknaukowy.pl, 0
 dzo.com.ua, 0
-dzs.cz, 0
 dzsofts.net, 0
 dzwww.com, 0
-e100.eu, 0
-e123.pw, 0
 e2e4online.ru, 0
-e2say.com, 0
-e2time.net, 0
-e36.lv, 0
-e-actionlearning.jp, 0
 eadaily.com, 0
-eae-publishing.com, 0
 eagleplatform.com, 0
-ean-search.org, 0
 eapteka.ru, 0
 eareview.net, 0
-earthtreksclimbing.com, 0
 easemob.com, 0
-easetou.com, 0
 easeye.com.cn, 0
-easi-services.fr, 0
-eastal.com, 0
-eastcom.com, 0
 eastday.com, 0
 eastmachinery.com, 0
 eastview.com, 0
-eastweb.ir, 0
 easyapi.com, 0
 easyaq.com, 0
-easyaq.org, 0
-easycoding.org, 0
-easycoin.cz, 0
 easydrop.ru, 0
 easyfly.club, 0
-easynotebooks.de, 0
 easynvest.com.br, 0
 easyon.cn, 0
 easypano.com, 0
 easypass.cn, 0
-easypay.bg, 0
 easypm.cn, 0
-easysport.de, 0
-easytaxi.com.br, 0
 easytoys.cz, 0
 easyuni.com, 0
-easywebshop.com, 0
 ebacheca.it, 0
-ebaoquan.org, 0
 ebarrito.com, 0
 ebase.com, 0
-eb.br, 0
 ebesucher.com, 0
 ebesucher.de, 0
 ebesucher.es, 0
@@ -4159,407 +2327,232 @@
 ebg.net, 0
 ebible.org, 0
 ebmpapst.com, 0
-ebnevelde.hu, 0
-eboo.ir, 0
 ebookcn.com, 0
-ebottega.it, 0
 ebptt.com, 0
 ebrarbilgisayar.com, 0
 ebs.org.cn, 0
-ebuick.com.cn, 0
-ecall.ch, 0
-ecbiz.ru, 0
 eccom.com.cn, 0
-ecenter.travel, 0
 ecf.asso.fr, 0
 e-chinalife.com, 0
 echo24.cz, 0
-echofabrik.de, 0
 echosante.com, 0
 echoteen.com, 0
-eckert-schulen.de, 0
-eclisse.it, 0
 eclub.se, 0
 ecmsglobal.com, 0
-ecn.cz, 0
 ecnu.edu.cn, 0
-ecodms.de, 0
 ecoin.cc, 0
-ecolex.org, 0
-ecom-labs.com, 0
-ecommerce.gov.ir, 0
 economy.gov.az, 0
-economy.gov.by, 0
-economy.gov.ru, 0
 eco.pt, 0
-ecorepay.cc, 0
-ecovacs-japan.com, 0
-ecovanna.ru, 0
-ecovita.ru, 0
 ecpic.com.cn, 0
-ecplay.com, 0
 ecrm.com.tw, 0
-ecu.ac.uk, 0
 eczhuyin.com, 0
 ed2k.in, 0
 edaixi.cn, 0
 edaixi.com, 0
 edelweiss5.com, 0
 edge-core.com, 0
-edia.nl, 0
-edifier.ru, 0
 edigital.hu, 0
 edinarcoin.com, 0
 editions-ue.com, 0
-edizioni-ai.com, 0
 edj.club, 0
-edmundwatson.com, 0
 edm.uz, 0
 edmw.xyz, 0
 ednet.ns.ca, 0
 edns.com, 0
 edoc2.com, 0
 edooon.com, 0
-edoramedia.com, 0
-edsonqueiroz.com.br, 0
 edt02.net, 0
-edthena.com, 0
 edu35.ru, 0
-edu4school.gr, 0
 edu4schools.gr, 0
-edu53.ru, 0
-edu95.ru, 0
-eduasistent.ro, 0
 educacion.gob.ar, 0
-educationalinitiatives.com, 0
 educatorshandbook.com, 0
 educom.ru, 0
-edu-family.ru, 0
 eduherald.ru, 0
-edu.ky, 0
 edu.kz, 0
 edusite.ru, 0
 edu.sk, 0
 eduspb.com, 0
 edu.te.ua, 0
 edu.tomsk.ru, 0
-eduweb.com.ve, 0
-edznet.com, 0
 eee.com, 0
 eelly.com, 0
-eeload.com, 0
-eenot.com, 0
 eeworld.com.cn, 0
-eexcel.com.hk, 0
 eeyy.com, 0
 efeihu.com, 0
-efenix.cz, 0
 eff.org, 0
-effu.eu, 0
 efko.ru, 0
-efm.de, 0
 eforms.org, 0
 efrei.fr, 0
 efrontlearning.com, 0
-efsol.ru, 0
 efsyn.gr, 0
 efubo.com, 0
 efun.com, 0
 efunfun.com, 0
-efunkr.com, 0
 efuntw.com, 0
 efusion.co.jp, 0
-efw.cn, 0
 efzg.hr, 0
-e-garakuta.net, 0
-egarante.com, 0
 egent.ru, 0
-egmanga.com.tw, 0
 egou.com, 0
 egov66.ru, 0
 egret.com, 0
-egret-labs.org, 0
 egrp365.ru, 0
 egrul-egrip.ru, 0
 ehaoyao.com, 0
-ehbds.gov.cn, 0
-eheyin.com, 0
 ehighsun.com, 0
 ehm.cz, 0
 ehousechina.com, 0
 ehrana.si, 0
 ehrmedijugrupa.lv, 0
 eia.edu.co, 0
-eias.ru, 0
-eichsfeld-gymnasium.de, 0
 eicp.net, 0
-eiffel.com, 0
 eimagine.com, 0
 eink.com, 0
 e-inv.cn, 0
 eircom.net, 0
-eisenbahn.com.br, 0
 ejabberd.im, 0
 ejarehkhodro.com, 0
 ejieban.com, 0
-ejn.gov.ba, 0
 ejsino.com, 0
-ejuice.cz, 0
-ekartki-swiateczne.pl, 0
 eken.com, 0
 e-koncept.ru, 0
-ekr.or.kr, 0
 eksenbilgisayar.com, 0
-ekspresskonto.ee, 0
 eks.sk, 0
-eku8.com, 0
-elabjournal.com, 0
 elaion.ch, 0
-elane.ru, 0
 elar.ru, 0
 elasticbeanstalk.com, 0
-elasticrun.in, 0
-e-lationshop.de, 0
 elblag.pl, 0
 elbrus-zapchasti.ru, 0
-eldawlanews.com, 0
 eldiadehoy.net, 0
 eldorado.com.ua, 0
 eldorar.com, 0
-e-lead.com.tw, 0
 eleadglobal.com, 0
 elec.ru, 0
-electriclove.at, 0
-electroflot.ru, 0
-electrofun.ro, 0
 electro-mpo.ru, 0
 electronic-star.ch, 0
 electronic-star.cz, 0
 electronic-star.es, 0
-electronic-star.fi, 0
 electronic-star.fr, 0
 electronic-star.hr, 0
 electronic-star.hu, 0
 electronic-star.it, 0
 electronic-star.pl, 0
-electronic-star.pt, 0
 electronic-star.ro, 0
-electronic-star.se, 0
 electronic-star.si, 0
 electronic-star.sk, 0
-elegantt.com, 0
-eleks.com, 0
 elektra.ru, 0
 elektronik-star.de, 0
-elektronline.hu, 0
-elemer.ru, 0
 elem.mobi, 0
 elenafurs.ru, 0
-elenet.me, 0
 ele.to, 0
 eletrosom.com, 0
 elevenpaths.com, 0
 elf.com.tw, 0
-elfdict.com, 0
 elga.gr, 0
 elgato.com, 0
-elgaucho.com, 0
 eliademy.com, 0
-elinklaw.com, 0
-eliquidshop.cz, 0
-eliseparts.com, 0
 elitesochi.com, 0
 eliteunitedcrew.org, 0
 elitmus.com, 0
 elit.ro, 0
-elit.ua, 0
 eliv-group.ru, 0
-elkomp.ru, 0
 elkor.lv, 0
 ellco.ru, 0
 elleshop.com.cn, 0
 ellwoodepps.com, 0
 elm327rus.ru, 0
 elma-bpm.ru, 0
-elmarplatense.com, 0
 elmosanat.com, 0
 elnet.by, 0
 eloancn.com, 0
 elotech.com.br, 0
-elpo.net, 0
-elpreciodelagasolina.com, 0
-elsa.org, 0
-elsu.ru, 0
 eltallerdelbit.com, 0
 elte.hu, 0
-eltek.com, 0
-elumbus-reisen.de, 0
 elway.ru, 0
 ely.by, 0
-emailbidding.com, 0
-emailtray.com, 0
 emaintec.com, 0
-e-maker.com.tw, 0
 emao.com, 0
-emaos.de, 0
 emarbox.com, 0
 emarsys.com, 0
-emasa.es, 0
 embdev.net, 0
 embedy.cc, 0
 embl.de, 0
-emccann.net, 0
 emcmos.ru, 0
-emcsthai.com, 0
-emediamusic.com, 0
-emediava.org, 0
 emedi.gr, 0
 emeil.ir, 0
-emeraldmatch.com, 0
-emergencymedicinecases.com, 0
-emg.ru, 0
 emis.co.ao, 0
 emlid.com, 0
-emmalabs.com, 0
 emmaus-france.org, 0
 emnuvens.com.br, 0
 emo.org.tr, 0
 emory.edu, 0
 emos.cz, 0
-empathia.cz, 0
-empathy-portal.de, 0
 empireofcode.com, 0
 empleonuevo.com, 0
 emprana.ru, 0
-empro.com.br, 0
 emsb.qc.ca, 0
-ems.com.br, 0
-ems.network, 0
 emtec.com, 0
-emtelco.co, 0
-emu.ee, 0
-emulatornexus.com, 0
-emza.ru, 0
 enaa.com, 0
 enablecloud.co.uk, 0
-enaces.com, 0
 enact.co.uk, 0
 ename.net, 0
-en-charente-maritime.com, 0
 e-nci.com, 0
 encipher.it, 0
-enco.com, 0
 encoding.com, 0
 endian.com, 0
 endmyopia.org, 0
 endomondo.com, 0
-endplay.com, 0
 endpoint.com, 0
-energietec.eu, 0
 energiezivota.com, 0
-energy.gov.ua, 0
-energylabel.gov.cn, 0
 enflares.com, 0
-engagement.fr, 0
 engineowning.com, 0
 eng.it, 0
 england.nhs.uk, 0
-english-club.tv, 0
 englishtopics.net, 0
-engolit.de, 0
-eniac.ir, 0
-eniyikuafor.com, 0
-enjoitech.com, 0
-enkral.net, 0
-enlaza.mx, 0
-enl.wtf, 0
 en-marche.fr, 0
 e-norvik.eu, 0
-enow.cn, 0
-enportal.de, 0
 enriccorberainstitute.com, 0
-enro-griffins.de, 0
 ensage-forum.ru, 0
 ensartaos.com.ve, 0
 ensg.eu, 0
-entboost.com, 0
 entega.de, 0
-entre-geeks.com, 0
 entreleadership.com, 0
-entsog.eu, 0
-entware.net, 0
 enu.kz, 0
-envirolink.org, 0
-envisioncn.com, 0
-enwebhost.com, 0
-eoft.eu, 0
-eos.ru, 0
-eos-uptrade.de, 0
 eot.su, 0
 epac.to, 0
-epafos.gr, 0
 epam.com, 0
 epanchang.com, 0
 e-pard.com, 0
 epaslaugos.lt, 0
-epast.org, 0
-e-paths.com, 0
-epawaweather.com, 0
 epay.com, 0
-epay.lt, 0
-epcos.com, 0
-epd47.ru, 0
-epe.ir, 0
 epetbar.com, 0
-ephotobay.com, 0
 epicwow.com, 0
-epi.es, 0
 epi.sk, 0
-epita.fr, 0
 epitech.eu, 0
-epizod.ua, 0
 epizy.com, 0
-epm.br, 0
-e-pointchina.com.cn, 0
 epom.com, 0
 epommarket.com, 0
-epos.dk, 0
-epremki.pl, 0
 eprints.org, 0
 eprocurement.gov.gr, 0
-eproton.cz, 0
 epsic.ch, 0
 eptonic.com, 0
 epwk.com, 0
 eq28.cn, 0
 eqbal.ac.ir, 0
 erasmusu.com, 0
-erdalcelebi.com, 0
-ergasianews.gr, 0
 ericom.com, 0
 erinn.biz, 0
-erinome.net, 0
-eronsk.xxx, 0
 eropolis.hu, 0
 eroticen.com, 0
 erp-mz.ru, 0
-erpscan.com, 0
 errrotica.com, 0
 ershouhui.com, 0
-ertyu.org, 0
-esadn.com, 0
 escapefromtarkov.com, 0
-escape-game.org, 0
 escapes.ca, 0
 escience.cn, 0
 escolasecreches.com.br, 0
 escorts2000.com, 0
-escuelassj.com, 0
 esdict.cn, 0
-esearch.me, 0
 eseemodel.com, 0
-e-seenet.com, 0
-esetafrica.com, 0
 eset.kz, 0
 es.gov.br, 0
 eshangke.com, 0
@@ -4568,198 +2561,118 @@
 eshuyuan.net, 0
 esiea.fr, 0
 esi.uz, 0
-eskalat24.ru, 0
-eskalat.biz, 0
-eskom.eu, 0
-eso-database.com, 0
 eso.lt, 0
-esotravel.cz, 0
-espaciovino.com.ar, 0
-espago.com, 0
-esper.net, 0
-espol.edu.ec, 0
-esr-case.com, 0
 esri.com, 0
-essaybox.org, 0
 essayedge.com, 0
 essencegold.com.br, 0
 essentialpim.com, 0
 estcard.ee, 0
-estet.ru, 0
-esteveterradas.cat, 0
 estismail.com, 0
-estlandro.cc, 0
-estratosplus.com, 0
 estreams.tv, 0
 est.ua, 0
 estudarfora.org.br, 0
-estudar.org.br, 0
-estudiantesdelaplata.com, 0
 esu10.org, 0
 esu3.org, 0
 esu7.org, 0
-e-svatek.cz, 0
 esxi.gr, 0
 esy.es, 0
 et8.org, 0
 eta.cz, 0
 etaex.com, 0
 etagi.com, 0
-etalab.gouv.fr, 0
-etalasebisnis.com, 0
 etaplius.lt, 0
-etarget.cz, 0
 etb.net.co, 0
 etcnetwork.tv, 0
-etenal.me, 0
 etf.com, 0
 et-forum.org, 0
-eth0.com.br, 0
 ethereal-gaming.com, 0
-ethereumpool.co, 0
 ethfans.org, 0
-eth-gethired.ch, 0
-ethicsoft.it, 0
-ethinking.de, 0
-ethitter.com, 0
-ethst.de, 0
-ethz.ch, 0
-etick.ir, 0
 etland.co.kr, 0
 etong.com, 0
 etongdai.com, 0
-etowns.net, 0
-etowns.org, 0
 etracker.com, 0
-etruel.com, 0
-ets2planet.com, 0
 etsb.qc.ca, 0
-etstory.cn, 0
-etu.ru, 0
 euchost.com, 0
 eudic.net, 0
-eulji.ac.kr, 0
 eunetworks.com, 0
 euobserver.com, 0
 eurabota.com, 0
 eurasia.edu, 0
-eurasiangroup.org, 0
-eureka.lk, 0
 eurekamag.com, 0
 eurekers.com, 0
 eurodir.ru, 0
 eurofirms.es, 0
-eurogalaxy.sk, 0
 eurogest.company, 0
 euronics.cz, 0
 euronics.hu, 0
 euronova-italia.it, 0
 europa2.sk, 0
 europages.com, 0
-europa-market.ru, 0
 europeya.ru, 0
 eurostudy.info, 0
-eurovial.ro, 0
 eu.spb.ru, 0
 euvic.pl, 0
 eval.hu, 0
 evasionssecretes.fr, 0
-eveger.de, 0
-evejiaoben.com, 0
 evenflo.com, 0
 eventact.com, 0
 eventfarm.com, 0
-eventhia.com, 0
 eventim.si, 0
 eventpal.com.tw, 0
 eventsair.com, 0
 eve-online-com.ru, 0
 everest.com.tw, 0
 evergrande.com, 0
-evergreen.ca, 0
 evermarker.com, 0
-evermeet.cx, 0
-eversendai.com, 0
 everycaller.com, 0
-everyday.in.th, 0
 everymatrix.com, 0
 everything.kz, 0
 evget.com, 0
-evibe.in, 0
-evicertia.com, 0
 eviivo.com, 0
 evil0x.com, 0
-eviloctal.com, 0
 eviron.ru, 0
 evn.bg, 0
 evoi.ru, 0
-evolio.ro, 0
 evolix.net, 0
-evolutiontravel.it, 0
-evolveum.com, 0
 evotor.ru, 0
 evo-web.co.uk, 0
 evraz.com, 0
 evroopt.by, 0
 evvnt.com, 0
-evzo.net, 0
-eway-crm.com, 0
 eways.co, 0
 eways.ir, 0
 ewe.de, 0
 ewei.com, 0
 eweiqi.com, 0
-ewon.biz, 0
-exali.de, 0
 examslocal.com, 0
-exane.com, 0
 exaprint.fr, 0
-exapro.com, 0
-exceda.com, 0
 excelcalcs.com, 0
-excelsiorcommerce.com, 0
 exdreams.net, 0
 exehack.net, 0
 exertisireland.ie, 0
 exetools.com, 0
 ex-fs.net, 0
-exileed.com, 0
 eximb.com, 0
-experientia.com, 0
 experitest.com, 0
 experty.com, 0
-explee.com, 0
-exploretunes.com, 0
 explorr.net, 0
-expoforum.ru, 0
 exportimes.com, 0
-exportpages.com, 0
 exportpages.de, 0
 express.com.ar, 0
-express-odarennost.ru, 0
-exrates.me, 0
 extmail.org, 0
-extplorer.net, 0
 extrahop.com, 0
 extremecraft.net, 0
 extremo.club, 0
 eyaos.com, 0
 eyehere.net, 0
-eyou.net, 0
 ezacg.net, 0
-ezaisheng.com, 0
 ezdravkrg.org, 0
 ezfun.xyz, 0
 ezloo.com, 0
-ezmedia.me, 0
 ez.no, 0
-ezotericum.ru, 0
 ezoterikus.hu, 0
-ez-pz.com, 0
 ezwow.org, 0
-ezxing.com, 0
 ezyro.com, 0
-f0x.pw, 0
 f1news.ru, 0
 f3322.net, 0
 f3322.org, 0
@@ -4768,79 +2681,41 @@
 fabfab.net, 0
 fabrikaokon.ru, 0
 fabula.club, 0
-fabulous.ch, 0
-fabzat.com, 0
 facebac.com, 0
-facehack.me, 0
 faceit.ir, 0
 facenews.ua, 0
-facens.br, 0
-faceu.mobi, 0
-faceunity.com, 0
-facforpro.com, 0
-fackelmann.de, 0
 facta.com.br, 0
 factcool.com, 0
-factorenergia.com, 0
 factorkon.ir, 0
 factor.ua, 0
-facturamos.com.mx, 0
 factureaza.ro, 0
 fael.edu.br, 0
 fafait.ir, 0
 fainor.com.br, 0
-fairfieldcityschools.com, 0
 fairr.de, 0
-fairtop.in, 0
 faisco.cn, 0
 faisco.com, 0
 fakturyonline.eu, 0
-falconsocial.com, 0
-fals.com.br, 0
-famafutar.hu, 0
 famebit.com, 0
 famerom.ir, 0
-familienshirt.com, 0
-family.com.tw, 0
 familydoctor.com.cn, 0
-familyds.com, 0
-familyds.net, 0
 famo.ir, 0
-famtastic.cz, 0
-famtastic.hr, 0
-famtastic.hu, 0
-famtastic.ro, 0
-famtastic.sk, 0
 fancourier.ro, 0
 fanfic-fr.net, 0
-fanfic.hu, 0
-fanfou.com, 0
 fangamer.com, 0
-fangjie.info, 0
 fangjinsuo.com, 0
-fangrs.com, 0
 fangte.com, 0
 fanhaojia.com, 0
-fanpagesmarket.ru, 0
 fanqier.cn, 0
-fantabobshow.com, 0
-fantasyleague.com, 0
 fantawild.com, 0
-fantazya.net, 0
 fantlab.ru, 0
-fapiao.com, 0
-faponly.com, 0
-fapstor.com, 0
 far800.com, 0
 farakav.com, 0
 farapayamak.ir, 0
 farapic.com, 0
 faraso.org, 0
 fareastone.com.tw, 0
-farebookings.com, 0
 fariasbrito.com.br, 0
-farmaimpex.ru, 0
-farmainstant.com, 0
 farmalisto.com.co, 0
 farmec.ro, 0
 farmnest.com, 0
@@ -4849,98 +2724,63 @@
 farsiworld.ir, 0
 fashaoyou.net, 0
 fashion71.net, 0
-fashion.bg, 0
 fashioncompany.rs, 0
 fashionfriends.ch, 0
-fashn.de, 0
 fast-anime.ru, 0
 fastcr.cz, 0
 fasteasy.at, 0
-fasten.com, 0
 fastjet.com, 0
-fastloader.co, 0
 fast-mirror.de, 0
 fastprom.net, 0
-fastread.ru, 0
 fast-report.com, 0
-fastreport.ru, 0
 fasttony.es, 0
 fast-unfollow.com, 0
 fastvideotoscana.it, 0
 fastwebserver.de, 0
 fat.com.tw, 0
-fat-down.ru, 0
-fattor-rc.com.br, 0
 favbet.com, 0
 favera.ru, 0
 favorit.com.ua, 0
-favoritsport.com.ua, 0
 faw-vw.com, 0
 fayea.com, 0
 fayzfm.uz, 0
 fazekas.hu, 0
-fazmusic15.org, 0
-faz-musics.in, 0
 fbresponder.com.br, 0
-fbxos.fr, 0
 fcasd.edu, 0
 fcbarcelona.cz, 0
 fccs.com, 0
 fckrasnodar.ru, 0
-fcm-live.de, 0
 fcn.de, 0
-fcrmedia.ie, 0
-fcsm.ru, 0
 fcstpauli.com, 0
 fct-altai.ru, 0
-fcv.edu.br, 0
 fd114.com, 0
 fdc.com.cn, 0
 fdlx.com, 0
-f-droid.org, 0
 fedpress.ru, 0
 fedsp.com, 0
-fedyay.net, 0
 feedbooks.com, 0
 feedbooks.net, 0
-feedonomics.com, 0
 feedvisor.com, 0
-feelingplace.com, 0
 fee.org, 0
-feidai.com, 0
 feifandy.net, 0
-feifanvpn.com.cn, 0
-feig.de, 0
-feihuo.com, 0
 feijiu.net, 0
 feiliu.com, 0
 fei.sg, 0
 feisovet.ru, 0
-feixueacg.com, 0
-feiyangedu.com, 0
 feiyulian.cn, 0
 felgenshop.de, 0
 felink.com, 0
-feliway.com, 0
-femininesite.ru, 0
 fengbuy.com, 0
 feng.com, 0
 feng-shui.ru, 0
 fengsung.com, 0
-fengzigame.com, 0
 fenjinshe.com, 0
 fensifuwu.com, 0
 fenxiangba.org, 0
 fernsehkritik.tv, 0
-ferrarischule.at, 0
 ferrino.it, 0
-ferrite.ru, 0
-ferrotec.com, 0
 ferro-video.com, 0
-fertagus.pt, 0
 fert.cn, 0
-feste-ip.net, 0
-festima.ru, 0
 fextralife.com, 0
 ffa-assurance.fr, 0
 ffforever.info, 0
@@ -4948,138 +2788,64 @@
 ffhs.ch, 0
 ffmpeg.org, 0
 ffplum.info, 0
-ffruit.eu, 0
 ffsg.org, 0
 ffxiv.cn, 0
-fgs-impianti.it, 0
-fgup-ohrana.ru, 0
 fh21.com.cn, 0
-fh-diploma.de, 0
 fh-koeln.de, 0
-fhmsolutions.com, 0
 fhnw.ch, 0
-fia.academy, 0
-fialkovod.ru, 0
 fia-net.com, 0
 fiberhome.com, 0
-fibrum.com, 0
 fictiongrill.com, 0
 fictionmania.tv, 0
-fidelity-media.com, 0
-fidelitysalus.it, 0
-fidella.org, 0
 fidion.de, 0
 fieb.org.br, 0
 fieldandstream.com, 0
 fieldnation.com, 0
-fieldschina.com, 0
-fievent.com, 0
-fifanice.com, 0
 fiff.de, 0
-figotan.org, 0
-fileconvoy.com, 0
 filelist.ro, 0
-filemakermagazine.com, 0
-file.pet, 0
 filerooz.com, 0
 fileseek.ca, 0
 filesell.ir, 0
 filesend.to, 0
 filetender.com, 0
-fileup.ir, 0
-file-up.net, 0
-filewave.com, 0
-filkab.com, 0
-fill.ee, 0
 filmcrave.com, 0
 filmesonlinex1.com, 0
 filmistreet.com, 0
 film--izle.com, 0
 film.tv, 0
 film-ussr.ru, 0
-filorga.com, 0
 finansovyesovety.ru, 0
-finas-services.de, 0
 findercom.ru, 0
-findface.me, 0
-findface.pro, 0
 findface.ru, 0
-findlifevalue.com, 0
 findmima.com, 0
-findschool.ca, 0
 findsomeone.co.nz, 0
 findtenders.ru, 0
 findu.com, 0
-findyourtrainer.com, 0
-finestsin.de, 0
-fingent.com, 0
-finkafe.com, 0
-finkzeit.at, 0
-finolog.ru, 0
-fin-partners.ru, 0
-firdi.org.tw, 0
-fire2000.rocks, 0
-firefoxfan.cc, 0
-firehol.org, 0
 firejune.com, 0
-firepoweredgaming.com, 0
 firestock.ru, 0
-firmenkontaktmesse.de, 0
 firmstep.com, 0
 firo.ru, 0
-firstbit.ae, 0
-firstcare.com.cn, 0
 firstcarrental.co.za, 0
 firstleap.cn, 0
-first-moment.de, 0
 firstonetv.eu, 0
-firststage.org, 0
-fischer.com.br, 0
 fisc.md, 0
 fishbattle.net, 0
-fishcn.com, 0
-fisherman-market.ru, 0
-fishifarm.ru, 0
 fishki.net, 0
-fishyforum.com, 0
-fiskarsmarket.ru, 0
-fit.ac.ir, 0
-fitilio.com, 0
-fitnesspell.com, 0
-fitnessplus.ru, 0
 fitnezz.net, 0
-fixcenter.com.ua, 0
-fiza.ir, 0
-fizkult-nn.ru, 0
 fj.cn, 0
 fjcyl.com, 0
-fjdqqb.com, 0
-fjrs.gov.cn, 0
 fju.edu.tw, 0
 flag.org, 0
 flamboyant.com.br, 0
 flamp.ru, 0
-flarumone.com, 0
-flashphoner.com, 0
 flatfy.az, 0
 flatfy.by, 0
 flatfy.kz, 0
-flatfy.pl, 0
 flatfy.ro, 0
-flatfy.ru, 0
-flaticon.es, 0
-flatterer.ru, 0
-flboos.com, 0
-fleeber.com, 0
 fleex.tv, 0
 flexcils.com, 0
 flexibits.com, 0
-flibusta.net, 0
 flickrocket.com, 0
-flight-finder.com, 0
-flinteractive.fr, 0
-flip.id, 0
-flipup.ru, 0
 flipwalls.com.cn, 0
 flixbus.at, 0
 flixbus.be, 0
@@ -5087,7 +2853,6 @@
 flixbus.co.uk, 0
 flixbus.cz, 0
 flixbus.de, 0
-flixbus.dk, 0
 flixbus.es, 0
 flixbus.fr, 0
 flixbus.hr, 0
@@ -5095,204 +2860,100 @@
 flixbus.nl, 0
 flixbus.pl, 0
 flixbus.ru, 0
-flixbus.se, 0
-flixmobility.com, 0
 flnet.org, 0
 flnka.ru, 0
 floobits.com, 0
 floralinvestment.com, 0
 floraverse.com, 0
-floridelux.ro, 0
-flotalamacarena.com, 0
 flowerpassword.com, 0
 flowerplus.cn, 0
-flow-list.cz, 0
-flowmon.com, 0
-flowtraders.com, 0
 flptrading.net, 0
-fluentcloud.com, 0
-fluffy.is, 0
-fluger.pro, 0
-flukso.net, 0
-fluxbytes.com, 0
 fluxfm.de, 0
-fluxicon.com, 0
-flyco.com, 0
-flycosmos.com, 0
 flyerdevil.de, 0
-flyerpilot.de, 0
-flyingacademy.com, 0
 flyingmag.com, 0
-flymycloud.com, 0
-flynet.by, 0
 flynsarmy.com, 0
 flytcloud.com, 0
-fly.tj, 0
 flyuia.com, 0
 flyvpn.com, 0
-fmach.it, 0
-fmaroof.ir, 0
 fmdisk.net, 0
-fnblasanimas.com, 0
 fnmotol.cz, 0
 foboko.com, 0
-focusmedia.cn, 0
-focus-net.net, 0
 focus.ua, 0
-fodar.ru, 0
-foheart.com, 0
-followmyvote.com, 0
 fonar.tv, 0
 fondazionearching.it, 0
-fond-kino.ru, 0
-f-online.at, 0
-fontenay-sous-bois.fr, 0
-foodband.ru, 0
-foodbrothers.com, 0
 foodclub.ru, 0
 food.co.il, 0
-foodfox.ru, 0
-foodrussia.net, 0
 foody.com.cy, 0
-football-onlain.tv, 0
 footballua.tv, 0
-footbolka.ru, 0
 footway.dk, 0
-footway.fi, 0
-footway.no, 0
 footway.se, 0
-force9.co.uk, 0
 forces-war-records.co.uk, 0
 fordaq.com, 0
-fordclubs.org, 0
-ford-koegler.de, 0
-foresealife.com, 0
 foreveross.com, 0
-forexac.com, 0
-forexclub-russia.ru, 0
-forexsklad.com, 0
 forgerock.com, 0
 forgerock.org, 0
 forgottenbooks.com, 0
 forma2plus.com, 0
-formalytx.com, 0
-format-tv.net, 0
-formo.ua, 0
-formpipe.com, 0
 formsdotstar.com, 0
 formstone.it, 0
 formulalubvi.com, 0
-formulastudent.de, 0
 formz.com, 0
 foroffice.ru, 0
 forotrolls.com, 0
 fortiddns.com, 0
 fortinet.com, 0
-fortiss.org, 0
-fortunebill.com, 0
 forum-3dcenter.org, 0
 forumbee.com, 0
-forum-hardware.de, 0
-forum-laptopy.info.pl, 0
 forum.vn.ua, 0
-forumx.com.br, 0
-forushefile.com, 0
-forus.ru, 0
 for-vk.com, 0
 forward-bank.com, 0
-forwardvelo.ru, 0
 foscam.com, 0
 foscammall.com, 0
-fossee.in, 0
 fossies.org, 0
 fosu.edu.cn, 0
 fotile.com, 0
-fotky-foto.cz, 0
-fotoalbum.ee, 0
-fotoalbum.es, 0
-fotocopy.hu, 0
 fotoev.com, 0
-fotogoroda.net, 0
 fotograf.de, 0
 fotokasten.de, 0
 fotolab.ru, 0
 foton.com.cn, 0
-fotoprivet.com, 0
 fotor.com, 0
 fotor.com.cn, 0
 fotosklad.ru, 0
-fotospektr.ru, 0
 fotostars.me, 0
 foundationsu.com, 0
-founder.com, 0
-founderio.com, 0
 fountainpen.it, 0
-fourglobe.co.jp, 0
-fourierdsl.co.za, 0
-fow.watch, 0
 fox008.com, 0
 foxconn.com, 0
 foxconnmall.com, 0
-foxdeploy.com, 0
 foxitreader.cn, 0
 fox-mall.ru, 0
-foxrenderfarm.com, 0
 foxtrot.com.ua, 0
 fozzy.com, 0
 fpucentral.com, 0
 fqapps.com, 0
-fqproxy.com, 0
-fqrouter2.cn, 0
-frac.tl, 0
 fragfinn.de, 0
-frag-mutti.de, 0
-francedns.com, 0
-franceserv.com, 0
-franceserv.fr, 0
 france-troc.com, 0
-francite.net, 0
 francochinois.com, 0
 frankkingclub.com, 0
-franklincollege.edu, 0
-frankysweb.de, 0
-fraudect.com, 0
 frdic.com, 0
-free521.com, 0
 freebieac.com, 0
 freeboxos.fr, 0
 freebusy.io, 0
-freebytes.com, 0
 freeconferencecall.com, 0
-freeddns.org, 0
-freedns.io, 0
 freedomrussia.org, 0
 freedom-vrn.ru, 0
-freedriver.org, 0
 free-ebooks.net, 0
 free-electrons.com, 0
-freefeed.net, 0
-freefielder.jp, 0
-freefii.de, 0
 free.fr, 0
-freegeoip.net, 0
-free-hack.com, 0
-freehacks.ru, 0
-free-hosting.ir, 0
-freeintro.net, 0
-free-it.ru, 0
-freeje.com, 0
-freekulinar.ru, 0
 freelance.boutique, 0
 freelance.com, 0
-freelancerclub.net, 0
 freelance.ru, 0
 freelance.today, 0
 freemail.gr, 0
 freemaineads.com, 0
-freeman-btc.com, 0
 freepaper.me, 0
 free-pdftoword.com, 0
-freepik.es, 0
 freepost.es, 0
 freeprojectz.com, 0
 free-ro.com, 0
@@ -5300,156 +2961,96 @@
 freeskiers.net, 0
 freesoft-board.to, 0
 freestoriesforkids.com, 0
-freestylersworld.com, 0
 freetemplatesonline.com, 0
 free-torrent.org, 0
 free-torrents.org, 0
 freevar.com, 0
-freevpnxz.com, 0
 freevps.us, 0
 freexf.com, 0
 freezingblue.com, 0
 freie-volksmission.de, 0
 freifunk.net, 0
-frejustoulon.fr, 0
 frekvence1.cz, 0
-frenchkiss.ru, 0
 freshports.org, 0
 freshwatersystems.com, 0
 fr.ht, 0
 friends-forum.com, 0
 fri-gate.org, 0
-frischeis.at, 0
 friskyradio.com, 0
-fritzsch.net, 0
-frogshealth.com, 0
 fromae.com, 0
-frontcam.ru, 0
-frontenddev.org, 0
 fronter.com, 0
 frontpad.ru, 0
 frostland.pro, 0
 froxlor.org, 0
-frozenbyte.com, 0
 frozencpu.com, 0
 frsky-rc.com, 0
-fruct.org, 0
-frugalmechanic.com, 0
 fruitday.com, 0
-fryd.ru, 0
-fryshuset.se, 0
 fs.com, 0
 fsfund.com, 0
-fsfxpackages.com, 0
 fshrss.gov.cn, 0
 fsinf.at, 0
 fsk-ees.ru, 0
-fskn.gov.ru, 0
 fspro.net, 0
-fstrf.ru, 0
-ftbeautycn.com, 0
-ftsafe.com, 0
-ftvyifubi.com, 0
 fuckav.ru, 0
-fuckbilibili.com, 0
 fudan.edu.cn, 0
 fudan.sh.cn, 0
-fuelcellsworks.com, 0
-fugumobile.cn, 0
-fujian.gov.cn, 0
 fujifilm-x.ru, 0
-fukun.org, 0
 fulba.com, 0
-fulgan.com, 0
 fulidang.com, 0
-fulid.net, 0
 fuli.moe, 0
 fuling.com, 0
-fuliren.com, 0
 fuliv8.com, 0
-full-chip.net, 0
-fullprogramindir.biz, 0
 fullsecurity.org, 0
 fumasoft.com, 0
 funcook.com, 0
 fundamenta.hu, 0
 fundamental-research.ru, 0
-funeed.com, 0
-funeralone.com, 0
 funfactory.com, 0
-funfunquiz.com, 0
-fungames-forfree.com, 0
 funiber.org, 0
 funi.com, 0
-funinsta.ru, 0
-funkmeldesystem.de, 0
-funnysocks.ru, 0
 funpot.net, 0
 funradio.sk, 0
 funshion.com, 0
 fun-taiwan.com, 0
 funweek.it, 0
 fuqizy.com, 0
-furfest.org, 0
-furnation.com, 0
-furnation.ru, 0
 fusker.xxx, 0
 fussballfantipp.de, 0
 futbalnet.sk, 0
 futboholic.com, 0
 futboholic.com.ua, 0
 futboholic.ru, 0
-futbolki.ru, 0
 futpack.ru, 0
 fut.ru, 0
 futu5.com, 0
 futunn.com, 0
-futurecovenant.com, 0
-future-processing.pl, 0
 fuwo.com, 0
 fuyaogroup.com, 0
-fvds.ru, 0
-fx678.com, 0
-fx77.com, 0
 fxclub.org, 0
-fx-mt4.info, 0
 fxpan.com, 0
 fxsound.com, 0
 fxteam.ru, 0
 fyber.com, 0
-fyeedu.net, 0
-fync.edu.cn, 0
-fynews.net, 0
 fyygame.pw, 0
 fyysports.com, 0
 fyzhuji.com, 0
 fzdm.com, 0
-gadz.org, 0
-gaeamobile.com, 0
-gaeamobile.net, 0
 gagahi.com, 0
 gainapp.com, 0
-gaiz.com, 0
 galactikka.com, 0
 galaksion.com, 0
-galaktika.ru, 0
-galanz.com, 0
 galax.com, 0
-galaxytech.com, 0
 galgame.co, 0
 galinos.gr, 0
-gallerr.com, 0
 gallery-dump.com, 0
 galpenergia.com, 0
 gals.uz, 0
 game13.com, 0
 game2.cn, 0
 game2.com.cn, 0
-gamed9.com, 0
 gamedreamer.com.tw, 0
 gameforgirl.ru, 0
 gamehitzone.com, 0
-gamehonor.com, 0
 gameindy.com, 0
 gameliebe.com, 0
 gamelumi.com, 0
@@ -5466,7 +3067,6 @@
 gamesites.cz, 0
 gamesow.com, 0
 gamesplanet.com, 0
-gamesuit.ru, 0
 gameswelt.at, 0
 gameswelt.ch, 0
 gameswelt.de, 0
@@ -5474,194 +3074,110 @@
 gameurs.net, 0
 gameware.at, 0
 gamexp.ru, 0
-gamingmasters.org, 0
 gamyun.net, 0
 gannun.cn, 0
 ganso.com.cn, 0
 gansuche.cn, 0
-gaogulou.com, 0
 gaokaopai.com, 0
-gaokaowangbao.com, 0
 gaopeng.com, 0
 gaosouyi.com, 0
 gaotizi.com, 0
 garada.net, 0
-garageentertainment.com.au, 0
-garage-gps.com, 0
 garagemca.org, 0
-garant.by, 0
 garant.ru, 0
-garazh.ir, 0
 garden.org, 0
 garminshop.ir, 0
 gartenhaus-gmbh.de, 0
-garvan.org.au, 0
 gaskrank.tv, 0
 gastrogate.com, 0
 gasu.ru, 0
-gatan.com, 0
 gavag.ru, 0
-gaws.ru, 0
-gaypal.co, 0
 gazeta.ru, 0
 gazprom.ru, 0
-gaz.ru, 0
 gazu.ru, 0
 gba.gov.ar, 0
-gbs.edu, 0
 gcbi.com.cn, 0
-gcnewhorizons.net, 0
-gcp.edu.cn, 0
-gcstech.net, 0
 gcup.ru, 0
-gcx.org, 0
-gd10010.cn, 0
-gd88.org, 0
 gdalpha.com, 0
-gdcuffs.com, 0
-gdekluet.ru, 0
 gdga.gov.cn, 0
 gdgbpx.com, 0
 gd-line.com, 0
-gdsyzx.edu.cn, 0
 gdufs.edu.cn, 0
-gdzelektrik.com.tr, 0
 gear.host, 0
-gearsource.com, 0
-gebeco.de, 0
-gebrauchte-veranstaltungstechnik.de, 0
-geckosoftware.com, 0
 ge.com.cn, 0
-gedichte.com, 0
-gedizelektrik.com.tr, 0
-gedofile.com, 0
 geekbang.org, 0
 geekbrains.ru, 0
 geekie.com.br, 0
 geekielab.com.br, 0
-geekmaze.ru, 0
 geekpeek.net, 0
 geekteam.pro, 0
 geekup.pl, 0
-geekweekconf.com, 0
-geenfc.com, 0
 gefaellt-mir.me, 0
 gegejia.com, 0
-geichina.org, 0
-geilicdn.com, 0
-geizreich.de, 0
 gem4me.com, 0
-gemfury.com, 0
-gemkadeh.com, 0
 gemz.ir, 0
 gench.edu.cn, 0
 genealogieonline.nl, 0
 geneanet.org, 0
 geneawiki.com, 0
-genebang.com, 0
 genecopoeia.com, 0
-generalroca.gov.ar, 0
-generals.mobi, 0
 generationlove.com, 0
-generations-patrimoine.com, 0
-geniesolutions.com.au, 0
 genofond.org, 0
 genomics.cn, 0
 genscript.com, 0
 genscript.com.cn, 0
 genser.ru, 0
-geodata.it, 0
 geoprostor.net, 0
-georgikon.hu, 0
-georgio.fr, 0
 gerald.top, 0
 gerdoo.net, 0
 gerdoosoft.com, 0
 gerencianet.com.br, 0
-german-railroads.de, 0
-germanssky.de, 0
 germanystudy.net, 0
 geru.com.br, 0
-gesamtschule-zeuthen.eu, 0
 ges-bo.de, 0
-geschenkkartenwelt.de, 0
 gesext.de, 0
 get4click.ru, 0
-geta6.net, 0
 getabstract.com, 0
 getadmiral.com, 0
-getawesomesupport.com, 0
-getcoins.win, 0
 getcs16.ru, 0
 getdc.ru, 0
-getfreegate.com, 0
 get-in-it.de, 0
 getinmybelly.com, 0
 getitfree.cn, 0
-getitnow.gr, 0
-getkey.eu, 0
-getline.in, 0
 getmyscript.com, 0
 getriver.com, 0
 getrix.it, 0
 getsitecontrol.com, 0
-getsteam.cards, 0
 get-styles.ru, 0
 gettertools.com, 0
-getter-tools.de, 0
 get-tune.cc, 0
-get-tune.net, 0
-gettune.net, 0
 getujobs.com, 0
-getway.me, 0
-getwox.com, 0
 gewobag.de, 0
-gezergiyim.com, 0
-gfaq.ru, 0
-gfi.es, 0
-gfmrecharge.co.in, 0
 gfw.pics, 0
 gfycat.com, 0
 gg4m.com, 0
-ggbinary.com, 0
 ggcj.com, 0
 ggmgastro.com, 0
 ghac.cn, 0
-ghostforbeginners.com, 0
-ghostry.cn, 0
-ghtinc.com, 0
-gianganh.net, 0
 gibdd.ru, 0
 gicp.net, 0
 gidnetwork.com, 0
-giftcards.eu, 0
-giftman.ru, 0
 giftster.com, 0
 gigabaza.ru, 0
 gigabyte.cn, 0
 gigaleecher.com, 0
-giga-rapid.com, 0
 gigaserver.cz, 0
-gigatribe.com, 0
-gigatron.rs, 0
 gigatronshop.com, 0
-giga.ua, 0
 gigfa.com, 0
 giiwa.org, 0
-gilbo.ru, 0
 gimhoy.com, 0
-gimlet.us, 0
 gimp.org, 0
-gimvic.org, 0
 ginger-cat.ru, 0
-ginsystem.us, 0
 gioc.kiev.ua, 0
 gionee.com, 0
 giordano.com, 0
 gioseppo.com, 0
 gioxx.org, 0
-gipsr.ru, 0
-gira.cc, 0
 gira.com, 0
 gira.de, 0
 girimulya.com, 0
@@ -5671,125 +3187,63 @@
 girsa.ru, 0
 gisclub.tv, 0
 gis-lab.info, 0
-gisroad.com, 0
-gitgud.io, 0
 github.io, 0
 gitlab.cc, 0
-gitsea.com, 0
 giuseppe.cn, 0
 giustizia-amministrativa.it, 0
-givegift.com.hk, 0
 giveyousomecolortoseesee.com, 0
 gizmiz.com, 0
 gizzmoheaven.com, 0
-gjn.cz, 0
-gjs.so, 0
 gjzq.com.cn, 0
-gkk.uz, 0
-gkovd.ru, 0
-gladiators.ru, 0
 glamius.ru, 0
-glamot.cz, 0
 glamour.ru, 0
 glashkoff.com, 0
 glassrpske.com, 0
-glav-dostavka.ru, 0
 glavred.info, 0
 glitchthegame.com, 0
-glitzcloud.com, 0
-glkb.ch, 0
-globaladvisors.biz, 0
-global-customer.com, 0
 globaldynamicmarketing.com, 0
-globalhitss.com, 0
 globalitanalytics.com, 0
-global-katalog.ru, 0
 globalnomadic.com, 0
-globalpartszone.com, 0
 globalpolicy.org, 0
-globex.cn, 0
 globusmax.co.il, 0
 glocalme.com, 0
-gloeckle.de, 0
 glogow.pl, 0
-glopoi.com, 0
-glorioustrainwrecks.com, 0
-glyphter.com, 0
 gmcc.net, 0
-gm-city.ru, 0
-gmdao.cc, 0
-gmg.biz, 0
-gmod.de, 0
-gmtincorp.com, 0
-gmuz.uz, 0
-gnawers.de, 0
-gnewstv.com, 0
 gnome.org, 0
-gntech.ac.kr, 0
 gnway.cc, 0
 gnway.com, 0
-go189.cn, 0
-go2bus.ru, 0
 go2olymp.com, 0
-goanews.com, 0
 goapr.com, 0
-goarmy.co.uk, 0
 gobaidugle.com, 0
 gob.bo, 0
 gob.cl, 0
 gob.do, 0
-gobelinland.fr, 0
 gochengdu.cn, 0
-godata.tw, 0
 godeyes.cn, 0
 godic.net, 0
 god.jp, 0
 godnota.org, 0
-godon.biz, 0
 goeasy.io, 0
-goeducation.com.tw, 0
-goflyla.com, 0
-gogames.me, 0
 gogosu.xyz, 0
-gogovan.sg, 0
-go.gov.br, 0
-gogovpn.org, 0
 gogvo.com, 0
-goingnative.cn, 0
 goip.de, 0
-golbazar.net, 0
-gol.bg, 0
 goldapple.ru, 0
 goldbroker.com, 0
 goldbroker.fr, 0
-goldbroker.it, 0
 golden-monkey.ru, 0
 goldenpages.ie, 0
-goldenpalace.be, 0
-golden-time.ru, 0
-goldflyer.ru, 0
-goldpharma.cn, 0
 goldwind.com.cn, 0
 golo365.com, 0
 golospravdy.com, 0
 golpas.com, 0
-gomefinance.com.cn, 0
 gomehigo.hk, 0
 gomel.today, 0
-gomezacebo-pombo.com, 0
 gomobil.cz, 0
-goncakitap.com.tr, 0
 g-one-inc.com, 0
-gonetis.com, 0
 gongfubb.com, 0
-gonightshift.com, 0
-goocig.com, 0
 good.cc, 0
 goodgame.ru, 0
 goodly.pro, 0
-goodmaoningboy.com, 0
-good-movie.ru, 0
-goodnight.at, 0
 goodsflow.com, 0
 goodtyping.com, 0
 goody25.com, 0
@@ -5797,32 +3251,21 @@
 goo.kz, 0
 gootara.org, 0
 gopas.cz, 0
-gorcenter.spb.ru, 0
-gorcomnet.ru, 0
-gorcom.ru, 0
 gorlice.pl, 0
 go.ro, 0
 gorodche.ru, 0
-gorodovik.com, 0
-gorodtv.net, 0
 goskills.com, 0
-gosmonitor.ru, 0
 gospmr.org, 0
 gossh.net, 0
 gotdns.com, 0
-gotdns.org, 0
 gothicwiki.pw, 0
 gotocdn.com, 0
 gotokeep.com, 0
-gotye.com.cn, 0
-goujiawang.com, 0
 gouv.bj, 0
 gouv.ci, 0
-gov110.cn, 0
 gov35.ru, 0
 gov.cl, 0
 government.bg, 0
-gov.karelia.ru, 0
 gov.kz, 0
 gov.md, 0
 gov.mg, 0
@@ -5830,208 +3273,106 @@
 govoritmoskva.ru, 0
 gov.ro, 0
 gov.sc, 0
-gov.sk, 0
 gov.taipei, 0
 govvrn.ru, 0
 gow.help, 0
 gp.by, 0
 gpgtools.org, 0
-gpl-express.com, 0
 gpntb.ru, 0
-gppc.ru, 0
-gqget.com, 0
 gq.ru, 0
-graacc.org.br, 0
-graa.ru, 0
-grabberz.com, 0
 grabien.com, 0
 grabitjeeves.com, 0
-graffitishop.it, 0
-graffitishop.net, 0
-gramula.com, 0
 grandcapital.net, 0
-grandest.fr, 0
 grandtheftarma.com, 0
-graphcommons.com, 0
 graphsketch.com, 0
-gravitypayments.com, 0
 gravitytales.com, 0
 gr.ch, 0
 grcrt.net, 0
 greatagroup.com, 0
-greekfestival.gr, 0
-greenbooki.ru, 0
-greengo.hu, 0
 green-japan.com, 0
-greenlightdigital.com, 0
 greenmama.ru, 0
 greenpeace.fr, 0
 greenpeace.org.br, 0
 greetz.be, 0
 greetz.nl, 0
-greg-kennedy.com, 0
-gregsdrivingschool.net, 0
-griddynamics.net, 0
 gridrepublic.org, 0
 gridsum.com, 0
-griffincapital.com, 0
-grimbets.com, 0
-grishko.ru, 0
-grisino.com, 0
 grnet.gr, 0
 grodno.net, 0
 groene.nl, 0
-gronkh-wiki.de, 0
 groov.pl, 0
-grossum.com, 0
 groundspeak.com, 0
-groupboard.com, 0
 groupe-efrei.fr, 0
-groupeleader.com, 0
-groupensia.com, 0
-group-ib.com, 0
-grouppartner.ru, 0
 growfood.pro, 0
 grpl.org, 0
 grsu.by, 0
-gruendl.de, 0
-grupoasv.com, 0
 grupocobra.com, 0
-grupodass.com.br, 0
-grupofrisa.com, 0
 grupoiris.net, 0
-grupomednet.com.br, 0
 gruponzn.com, 0
 gruposanilab.es, 0
 gruposayer.com, 0
-grupovips.com, 0
 gruppoiren.it, 0
-gruppolapastamadre.it, 0
 grupposandonato.it, 0
 gruso.cz, 0
 gruzovichkof.ru, 0
-gs8.com.tw, 0
-gsier.com.cn, 0
-gskj.gov.cn, 0
-gsmarena.com, 0
 gsmhosting.com, 0
 gsn7.jp, 0
-gso-koeln.de, 0
-g-store.ru, 0
 gstu.by, 0
 gtags.net, 0
 gtk.org, 0
-gtsce.com, 0
-gtshina.ru, 0
-gtue.de, 0
-guadaltel.es, 0
-guagua.cn, 0
 guahao.com, 0
 guanba.com, 0
 guangming.com.my, 0
 guap.ru, 0
 guardian.ng, 0
-guavabooking.com, 0
 guazi.com, 0
 gucheng.com, 0
-gucodd.ru, 0
 gudauri.ru, 0
 guerrillamail.com, 0
 guestcentric.net, 0
-gufener.com, 0
-gufs.org, 0
-guge.xxx, 0
 guguke.net, 0
 guidechem.com, 0
-guide.com.ru, 0
-guifibaix.net, 0
-guifi.net, 0
 guiguiw.com, 0
-guihaibk.com, 0
 guilinbank.com.cn, 0
 gulbenkian.pt, 0
-gulfstream.ru, 0
-gulliway.org, 0
-gullprint.com, 0
 gumrf.ru, 0
 gum.ru, 0
-gundam.eu, 0
-gunserver.ru, 0
 guosen.com.cn, 0
-guostrj.ru, 0
-gup.kz, 0
-gup.ru, 0
 gusline.ru, 0
-gusti-cuir.fr, 0
-gusti-lader.se, 0
 gusti-leder.de, 0
 gustullays.ro, 0
 guu.ru, 0
 gv.com.sg, 0
-gvhouse.com, 0
 gvodbox.com, 0
 gw500.com, 0
-gwales.com, 0
 gwdang.com, 0
 gwifi.com.cn, 0
-gwsecu.com, 0
-gwup.net, 0
-gxdlr.gov.cn, 0
-gxi.gov.cn, 0
 gxnews.com.cn, 0
-gxufe.edu.cn, 0
-gxust.edu.cn, 0
-gyb.ch, 0
-gybond.de, 0
-gyenno.com, 0
-gyertyalang.hu, 0
-gym-gbw.de, 0
-gymlit.cz, 0
 gymnasium-ganderkesee.eu, 0
 gymondo.de, 0
-gym-stolz.de, 0
-gym-training.com, 0
 gyroscope.com, 0
 gz163.cn, 0
 gzedu.com, 0
 gzjjzd.gov.cn, 0
 gzjkw.net, 0
 gzkkonline.com, 0
-gzlanen.com, 0
 gzmpc.com, 0
 gzmtr.com, 0
-gznet.com, 0
-gzpot.com, 0
-gzsfj.gov.cn, 0
-gztz.org, 0
-gzwhir.com, 0
 h1n.ru, 0
-h2opal.com, 0
 h3c.com, 0
 h3yun.com, 0
-h5jun.com, 0
-h6app.com, 0
-haadthip.com, 0
 haahi.com, 0
-haa.su, 0
-habari.co.tz, 0
 habbopoop.org, 0
-haberegider.com, 0
 habito.com, 0
 habitos.mx, 0
 habtium.es, 0
 hacam.me, 0
 hack80.com, 0
-hackacheats.com, 0
 hackademics.fr, 0
 hack.chat, 0
 hack-cn.com, 0
 hac-ker.net, 0
 hackerthemes.com, 0
-hackforums.ru, 0
-hackmygame.info, 0
-hacksbycheats.com, 0
-hacksforcheats.info, 0
 hackspark.fr, 0
 hacpai.com, 0
 hadawebshop.hu, 0
@@ -6043,41 +3384,22 @@
 haibei.in, 0
 haier.com, 0
 haier.net, 0
-haihangyun.com, 0
 haimanchajian.com, 0
-haiphong.gov.vn, 0
-hairde.cn, 0
-hair.ms, 0
-hair.su, 0
 haisoft.net, 0
 haiziwang.com, 0
-hajduszoboszlo.hu, 0
-ha-lab.com, 0
 hal.ac.jp, 0
 half-moon.org, 0
-halidi.org, 0
 halihali.tv, 0
 hallard.me, 0
 hallenstadion.ch, 0
 halykbank.kz, 0
 ham3d.co, 0
-hamdi.web.id, 0
-hamfiles.co.uk, 0
-hamhire.com, 0
-haminvara.com, 0
 hamlog.ru, 0
-hamradioshop.it, 0
 hamresan.net, 0
-hamromovie.com, 0
-handball4all.de, 0
 handbrake.fr, 0
 hand-china.com, 0
-handel.pro, 0
 handhand.net, 0
 handicap-job.com, 0
-handicap-love.de, 0
-handyparadies.de, 0
-handy.travel, 0
 hanfan.cc, 0
 hanfverband.de, 0
 hangge.com, 0
@@ -6085,147 +3407,82 @@
 hangzhou.gov.cn, 0
 hanhuazu.cc, 0
 hanjutv.com, 0
-hansn.cn, 0
 hanwha.co.kr, 0
-hanyalewat.com, 0
 hao123.com, 0
 hao24.cn, 0
 hao24.com, 0
 hao76.com, 0
-haoche51.com, 0
 haochedai.com, 0
 haodai.com, 0
 haodianpu.com, 0
 haodou.com, 0
-haofang.net, 0
 haohaizi.com, 0
 haoid.cn, 0
-haojs.cc, 0
 haomaiche.com, 0
-haomwei.com, 0
-haoshitong.com, 0
-haoso.com, 0
 haosou.com, 0
 haosuzhou.com, 0
-haowanyou.com, 0
 haoxiana.com, 0
-haoyangmao8.com, 0
 haozhebao.com, 0
-happeak.ru, 0
-happening.im, 0
 happist.com, 0
 happy88.com, 0
-happyelements.cn, 0
 happyelements.com, 0
 happyjuzi.com, 0
-happyme.club, 0
-happyskin.vn, 0
-happyz.me, 0
-harats.ru, 0
 hardgrand.com, 0
 hardtunedstore.com, 0
-hardwarebg.com, 0
-hargawebsite.com, 0
 haribo.com, 0
-harizanov.com, 0
 haroldltd.ru, 0
-harpacrista.org, 0
 harpoongaming.com, 0
 harpost.com, 0
 harvest.org, 0
-hasgeek.com, 0
-hash-c.co.jp, 0
 hashemian.com, 0
 hashflare.io, 0
 hashkiller.co.uk, 0
-hashlearn.com, 0
 hasjob.co, 0
-haskellstack.org, 0
-hassanabul.com, 0
 hassyon.com, 0
 hasznaltauto.hu, 0
-hasznaltautokereso.hu, 0
-hata.mobi, 0
-hatco.ir, 0
-hausaerzteverband.de, 0
-haus-des-meeres.at, 0
-haushaltshilfe24.at, 0
 haust.edu.cn, 0
 havaforum.com, 0
-hawaii.edu, 0
 hawaiipacifichealth.org, 0
-hayatikodla.net, 0
-haykerproductions.de, 0
 haypost.am, 0
-hays-careers.com, 0
 hazeover.com, 0
-hbcsd.org, 0
-hbhtxx.com, 0
 hb-n-tax.gov.cn, 0
-hboeck.de, 0
 hbooker.com, 0
-hbsc.cn, 0
 hbut.edu.cn, 0
 hc360.com, 0
-hcamur.ru, 0
 hcc.edu.tw, 0
-hclugano.ch, 0
 hc.ru, 0
 hcsibir.ru, 0
 hcs.land, 0
-hd123.com, 0
 hdarea.co, 0
 hdb.com, 0
 hdbox.ws, 0
-hdcity.org, 0
 hdclub.org, 0
-hdclub.sk, 0
 hdcmct.org, 0
-hddlife.com, 0
-hddlife.ru, 0
-hdfax.com, 0
 hd.free.fr, 0
 hdhello.com, 0
 hdhome.org, 0
-hdk.cz, 0
-hdktv.org, 0
 hdmoney.cn, 0
-hdmyjob.com, 0
 hdschools.org, 0
 hdshwh.com, 0
 hdslb.com, 0
 hd-spain.com, 0
 hdtmedia.com, 0
 hdw.la, 0
-head.ru, 0
 headstats.com, 0
 healthday.com.au, 0
 health.nz, 0
 heartbowsmakeup.com, 0
-hearthigen.com, 0
-hearth.net, 0
-heateor.com, 0
 heavytools.hu, 0
-hebaodai.com, 0
 hebei.com.cn, 0
-hebergratuit.net, 0
 hebis.de, 0
 hebut.edu.cn, 0
 hec.gov.pk, 0
-hechonghua.com, 0
-hedonism.com, 0
-hefe-und-mehr.de, 0
 heidelbergerwohnen.de, 0
-heidelpay.de, 0
 heiguang.com, 0
-heilsarmee.ch, 0
 hej.sk, 0
 hekko24.pl, 0
 heliguy.com, 0
 heliohost.org, 0
-heliopark.ru, 0
-helios.kz, 0
-hellclan.co.uk, 0
 hellenicnavy.gr, 0
 hellmann.net, 0
 hellocq.net, 0
@@ -6233,103 +3490,60 @@
 hellotars.com, 0
 hellweg.de, 0
 helmo.be, 0
-helpangel.org, 0
-help.com, 0
-help-im.ru, 0
 helpmij.nl, 0
 helprace.com, 0
 helpshift.com, 0
-helsinn.com, 0
 hemden.de, 0
 hentairules.net, 0
-herbies-herbs.com, 0
-herbolariosiempreviva.com, 0
 hercrentals.com, 0
 hermitageshop.ru, 0
 herni.cz, 0
 herokuapp.com, 0
 heureka.cz, 0
 heureka.sk, 0
-heuteinhamburg.de, 0
 heveya.ru, 0
 heweather.com, 0
 hexieshe.com, 0
 hexindai.com, 0
-hey-ai.com, 0
-heysky.cn, 0
-hgame.com, 0
 hgmail.com, 0
-hgsfss.com, 0
-hgyouxi.net, 0
 hh010.com, 0
-hh2.com, 0
 hhos.ru, 0
-hhwforum.hu, 0
 hiapk.com, 0
 hiapphere.com, 0
 hicraft.cn, 0
 hidalgo.gob.mx, 0
-hidata.org, 0
 hide-my-ip.com, 0
 hi-docs.com, 0
-hidolphin.cn, 0
-hifi.fr, 0
 hifi-tower.co.uk, 0
-hifi-tower.ie, 0
-higherlogic.com, 0
 high-minded.net, 0
 highpin.cn, 0
 highscreen.ru, 0
 hightech.fm, 0
 hihocoder.com, 0
-hihotel.asia, 0
-hiknow.com, 0
-hillstonenet.com, 0
 hinabian.com, 0
 hinaloe.net, 0
 hinata-online-community.fr, 0
-hindustansoftware.in, 0
-hinine.com, 0
 hipac.cn, 0
 hi-pda.com, 0
 hipertextual.com, 0
-hipnosenapratica.com.br, 0
 hippocratesinst.org, 0
-hirealestate.es, 0
 hirede.com, 0
 hiredops.com, 0
 hirist.com, 0
 hisense.com, 0
-his.gov.sd, 0
-hismarttv.com, 0
 histmag.org, 0
 histock.tw, 0
-histoire-image.org, 0
-hisunpharm.com, 0
 hitbox.tv, 0
 hitechboard.ru, 0
 hit.edu.cn, 0
 hitonline.ua, 0
 hitour.cc, 0
-hitrust.com.tw, 0
 hitutor.com.tw, 0
-hiyd.com, 0
-hiyowa.com, 0
 hj-qz.com, 0
 hkbf.org, 0
-hkcccc.org, 0
-hkcompany.org, 0
 hkedu.sh.cn, 0
-hk-lawyer.org, 0
-hkl-baumaschinen.de, 0
 hkst.com, 0
-hksuning.com, 0
-hkust.se, 0
-hkzyy.com.cn, 0
 hlamer.ru, 0
-hldns.ru, 0
-hledejinzerat.cz, 0
-hlidacsmluv.cz, 0
 hm.edu, 0
 hnagroup.com, 0
 hnagroup.net, 0
@@ -6337,166 +3551,82 @@
 hnair.net, 0
 hndnews.com, 0
 hneao.cn, 0
-hnee.de, 0
-hnks.gov.cn, 0
-hnldesign.nl, 0
 hnr.cn, 0
 hnrsks.com, 0
-hnrsks.gov.cn, 0
 hnteacher.net, 0
 hnu.edu.cn, 0
-hobbybrauerversand.de, 0
-hobby-site.com, 0
-hobimasak.info, 0
-hochanda.com, 0
 hochbahn.de, 0
 hochbahn-direkt.de, 0
 hockey30.com, 0
-hoerbiger.com, 0
 hoffmann-group.com, 0
 hoge.cn, 0
-hoippo.km.ua, 0
-hojitoyz.ir, 0
 hokudai.ac.jp, 0
 hola.com, 0
 holarse-linuxgaming.de, 0
-holder.com.ua, 0
-holema.eu, 0
 hol.es, 0
-holidaycalendar.com, 0
 holike.com, 0
-holime.cz, 0
 hollard.co.za, 0
-hollr2099.ga, 0
 holmesreport.com, 0
-holmglad.edu.hk, 0
 hologfx.com, 0
 holyo.org, 0
-homates.com, 0
 home-cloud.me, 0
-homecloud.pl, 0
 homeip.net, 0
 homelinux.com, 0
 homelinux.org, 0
-homemadetools.net, 0
-homemasters.ru, 0
 homemediaserver.ru, 0
 homenet.org, 0
 homepc.it, 0
 home.pl, 0
 homerez.com, 0
 homeserver.com, 0
-homeservice24.ch, 0
 homeunix.com, 0
 homeworkmarket.com, 0
-homeworkshop.org.uk, 0
-honest-fund.com, 0
-hongweipeng.com, 0
-hongxinbao.com, 0
 honor.es, 0
-honxb.com, 0
-hoop.co.uk, 0
-hoor.ir, 0
-hoornews.com, 0
-hoozin.com, 0
-hopdoddy.com, 0
-hopebilling.com, 0
 hoperun.com, 0
-hoplon.com, 0
-hop-sport.pl, 0
 hopto.org, 0
 horabrasil.com.br, 0
-horariodeapertura24.es, 0
-horki.info, 0
 horoscope.com, 0
 horoscopo.com, 0
-horoshee.fm, 0
-hospedando.com, 0
-hospmall.com, 0
-host4africa.com, 0
-host4g.ru, 0
 hostazor.com.tr, 0
-hostcoz.com, 0
 host-ed.me, 0
-hostedpbx.lu, 0
 hostelmanagement.com, 0
-hoste.pl, 0
 hosteurope.de, 0
-hoste.work, 0
-host-food.ru, 0
 hostforweb.com, 0
 hostiman.ru, 0
-hostingasp.pl, 0
-hostinghouse.pl, 0
 hostingkunde.de, 0
-hostingradio.ru, 0
 hostingtime.de, 0
-hosting.ua, 0
-hostit.ir, 0
 hostitsmart.com, 0
-host.kz, 0
 hostminio.es, 0
 hostpair.com, 0
 hostpark.cn, 0
 hostplus.gr, 0
 hostseo.com, 0
-hostserv.eu, 0
-hostsleek.com, 0
-hostsuki.pro, 0
 host-tracker.com, 0
-hostwp.es, 0
-hostzi.com, 0
 hotbikeweb.com, 0
 hotdealsclub.com, 0
 hot-deals.org, 0
-hotelmix.es, 0
-hotelmix.it, 0
-hotelnow.co.kr, 0
 hotels.ru, 0
-hotelston.com, 0
 hotjob.cn, 0
 ho.ua, 0
-houam.com, 0
-houbank.com, 0
 house365.com, 0
 housingcare.org, 0
 houxue.com, 0
 hoverwatch.com, 0
-howarth-timber.co.uk, 0
 how-living.com, 0
-howoo.net, 0
 howtoinstall.co, 0
 hozehkh.com, 0
-hozi.co.za, 0
-hozobzor.com, 0
-hpc.ru, 0
 hp-lexicon.org, 0
-hponline.cz, 0
-hpplay.com.cn, 0
-hpxy.net, 0
-hqhost.net, 0
 hq-patronen.de, 0
 hqvpn.cn, 0
-hrackarna.cz, 0
 hrbeu.edu.cn, 0
-hrc.govt.nz, 0
-hrjuice.com, 0
-hrlocker.com, 0
 hrloo.com, 0
-hrnz.co.nz, 0
-hro.ru, 0
 hrp.hu, 0
-hrpraktijk.nl, 0
-hrs.cn, 0
 hrsd.com, 0
 hrstop.com, 0
 hrstoppro.com, 0
 hrtl.com.cn, 0
-hrtoday.ch, 0
 hrtpayment.com, 0
 hrwhisper.me, 0
-hs21.de, 0
-hsc.gov.ua, 0
 hschinese.com, 0
 h-schmidt.net, 0
 hscloud.cn, 0
@@ -6505,205 +3635,112 @@
 hslda.org, 0
 hsw.com.au, 0
 hsweb.me, 0
-htche.com, 0
 htfc.com, 0
-htgwf.com, 0
 ht-line.ru, 0
-htl-klu.at, 0
 htmlweb.ru, 0
 hts.ru, 0
-ht-systems.ru, 0
-httv.de, 0
-htv.bg, 0
 htyd50.com, 0
-htzyw.com, 0
-huai123.me, 0
 huajiao.com, 0
-huangwenchao.com.cn, 0
-huangxiaolong.net, 0
-huanhuba.com, 0
-huanqiushuzi.com, 0
-huashengsheng.com, 0
 huawei.com, 0
 huaxi100.com, 0
 huaxincem.com, 0
 huaxing.com, 0
-huayugame.com, 0
-hub-avocat.fr, 0
 hubcity.ir, 0
-hubeikaowu.com, 0
 hublaa.me, 0
 hubpress.ir, 0
 hubsan.com, 0
-hucheck.com, 0
-hudebnibanka.cz, 0
-huhamhire.com, 0
 huijia.edu.cn, 0
 huilianyi.com, 0
 huimaiche.com, 0
 huim.com, 0
-huimei.com, 0
 huimin.cn, 0
-huishoubao.com, 0
-hulsta.com, 0
-humaxasia.com.tw, 0
-humlak.cz, 0
 humlnet.cz, 0
 hunan.gov.cn, 0
-hunarr.co.in, 0
 hundsun.com, 0
-hunhan.kr, 0
-hunjuwang.com, 0
 hunliji.com, 0
-hunterdouglas.com.ar, 0
 hunters.com, 0
-hunters.sx, 0
 huntnews.in, 0
 huntworld.ru, 0
 huodonghezi.com, 0
 huoduan.com, 0
-huoduan.net, 0
-huodull.com, 0
 huorong.cn, 0
-huox.tv, 0
-huoyunren.com, 0
 hushangcaifu.com, 0
 hust.edu.cn, 0
 hustonline.net, 0
-hustvpn.com, 0
-hutamakarya.com, 0
 huway.com, 0
 huxiu.com, 0
 huzhan.com, 0
-hvaonline.net, 0
-hvf-bs.net, 0
-hvngroups.net, 0
 hwu.edu.tw, 0
 hx9999.com, 0
 hxacc.com, 0
 hxsd.com, 0
 hxtao.site, 0
-hybridmedia.be, 0
 hyipchina.com, 0
 hyip.tc, 0
-hyit.edu.cn, 0
 hymer.com, 0
 hymnal.net, 0
 hyperay.cc, 0
 hyperhosting.gr, 0
 hyperledger.org, 0
 hyperreal.info, 0
-hypers.com, 0
 hypetap.com, 0
 hypnoseries.tv, 0
-hypweb.net, 0
 hytc.edu.cn, 0
 hytera.com, 0
 hzfc.gov.cn, 0
-hzg.de, 0
 hzjcb.com, 0
-hzsh.xyz, 0
 i234.me, 0
-i24.cc, 0
-i3dpworld.com, 0
 i3wm.org, 0
 i4th.in.th, 0
-i7vpnn.com, 0
 i8xiaoshi.com, 0
-iachieved.it, 0
 iae.edu.ar, 0
 iaixue.com, 0
-ialf.edu, 0
-ialpa.net, 0
-iamgstore.com, 0
-iamue.com, 0
 iamwhitneywisconsin.com, 0
-iandunn.name, 0
 iapppay.com, 0
-iariss.fr, 0
 iasassessment.com, 0
 iasbs.ac.ir, 0
-ias.com.tr, 0
 iask.in, 0
 iautos.cn, 0
 ib3tv.com, 0
-ibanquan.com, 0
 ibantang.com, 0
 ibanyu.com, 0
 ibaoyin.com, 0
-ibaren.com, 0
-ibaroody.com, 0
-ibayapp.com, 0
-ibb.waw.pl, 0
-ibc-solar.de, 0
-ibdfam.org.br, 0
 ibero.mx, 0
 ibis.net.ua, 0
-ibooked.com.br, 0
 iboxpay.com, 0
 iboys.at, 0
 iboys.cz, 0
-ibpssc.in, 0
 ibroadlink.com, 0
 ibs.re.kr, 0
-ibs.ru, 0
-ibsys.com, 0
-iburger.bz, 0
 i-cad.fr, 0
 icaile.com, 0
-icard.com, 0
-icasa.ru, 0
 icculus.org, 0
 iccup.com, 0
-icc-usa.com, 0
-icdo.org, 0
-ice-apple.com, 0
 iceberg.ru, 0
-ice-fx.com, 0
 icegram.com, 0
-icej.org, 0
 icetrade.by, 0
-iceveil.com, 0
-icewing.cc, 0
 ichess.es, 0
 ichess.net, 0
 iciba.com, 0
 icicilombard.com, 0
-i-circle.net, 0
 ickd.cn, 0
-iclassx.com, 0
 iclei.org, 0
-icn.org.au, 0
 icourse163.org, 0
-icreator.cn, 0
 icrt.cu, 0
 ict.ac.cn, 0
-icta.lk, 0
-ictb.cz, 0
 icult.ru, 0
 icybee.cn, 0
 icy-veins.com, 0
-idaam.com.br, 0
 idaybreak.com, 0
-idda.com.au, 0
 ideabank.by, 0
-ideachess.com, 0
 ideadunes.com, 0
 ideal.az, 0
 idealkaynak.net, 0
-idealsee.com, 0
-idesa.com.py, 0
 idf.il, 0
 idhost.kz, 0
-idiannaomi.com, 0
-idioma.com, 0
-idirecto.es, 0
 idl.pl, 0
-idmarch.org, 0
-idm.party, 0
 idokep.eu, 0
 idokep.hu, 0
-idokep.ro, 0
 idoklad.cz, 0
 idomix.de, 0
 idope.se, 0
@@ -6713,420 +3750,217 @@
 idsurvey.it, 0
 idtdna.com, 0
 id.uz, 0
-idv.biz, 0
-idv.la, 0
 idwpublishing.com, 0
 idx.com.cn, 0
-iecc.com, 0
-iee.lu, 0
-iemag.ru, 0
-ieminc.com, 0
-iesde.com.br, 0
-iesgrancapitan.org, 0
 iesp.edu.br, 0
-ietv.cc, 0
 ifanqiang.cn, 0
 ifanr.com, 0
-ifcmarkets.ae, 0
 ifcmarkets.com, 0
-ifcmarkets.es, 0
-ifcmarkets.ru, 0
 ifcmir.asia, 0
 ifeng.com, 0
 ifinterface.com, 0
 ifj.edu.pl, 0
-ifjing.com, 0
-iflym.com, 0
 iflysse.com, 0
 ifmo.ru, 0
-ifmsa.pl, 0
-ifnet.or.jp, 0
 ifood360.com, 0
-ifreespeed.com, 0
 ifto.edu.br, 0
-ifz.ru, 0
-igma.ru, 0
 ignatianum.edu.pl, 0
 ignitenet.com, 0
 ignorelist.com, 0
-igola.com, 0
 igoos.net, 0
 igps.ru, 0
 i-gram.ir, 0
-igrarniya.ru, 0
-igrovyeavtomatyvulcan.com, 0
 igrow.cn, 0
 igrushki7.com.ua, 0
-igs-aurichwest.de, 0
-igs-buchholz.de, 0
-igs-linden.eu, 0
-igsmelle.net, 0
 ih5.cn, 0
-ihaima.com, 0
-ihep.ac.cn, 0
-ihewro.com, 0
-ihoc.net, 0
 iho.in, 0
 ihonex.com, 0
-ihr-darlehen.de, 0
 ihrscloud.com, 0
 ihuaben.com, 0
 ihuan.me, 0
 ihx99.vip, 0
-iiapple.com, 0
-iica.in, 0
 iicavers.ru, 0
 ii-i.org, 0
 iiit.ac.in, 0
 iimjobs.com, 0
-iinfo.cz, 0
-iinuu.lv, 0
-iirose.com, 0
 iiss.org, 0
 iitb.ac.in, 0
 iitg.ac.in, 0
-iitp.ru, 0
-ijh.cc, 0
-ijser.cn, 0
 ikalogs.ru, 0
-ikapiracy.com, 0
-ikarussecurity.com, 0
 ikc.edu.tr, 0
-ikiapharm.com, 0
 iki.fi, 0
 iklangratiz.com, 0
 iklub.sk, 0
 iknow.jp, 0
 iknow.travel, 0
-ikraikra.ru, 0
 ikros.sk, 0
-iks.ru, 0
 ikuai8.com, 0
 ilab.cn, 0
 ilam.ac.ir, 0
-ilance.com, 0
 ilanni.com, 0
 ilaoyawo.com, 0
 ilcorsaronero.info, 0
-iletisimmakinesi.com, 0
-iliasnet.de, 0
 iligang.cn, 0
 ilizium.com, 0
-illucit.com, 0
-ilook.by, 0
 ilounge.ua, 0
 ilovemum.ru, 0
-iloveoops.com, 0
 ilucca.net, 0
-ilustra.org, 0
-ilvescovado.it, 0
-ilync.cn, 0
 im9.cz, 0
-imafex.sk, 0
 imageban.ru, 0
-images-du-monde.fr, 0
 imag.fr, 0
-imaginacolombia.com, 0
 imaginarium.com.br, 0
 imaginarium.es, 0
 imarket.by, 0
 imarotulos.com, 0
-imas.me, 0
-imatrix.com, 0
-imaxin.com, 0
-imaxmv.com, 0
 imcn.me, 0
-imcopex.com, 0
-imc.tomsk.ru, 0
 imedi.ge, 0
 imeidata.net, 0
 imei-server.com, 0
 imei-server.ru, 0
-ime.moe, 0
-imenidni.eu, 0
-i-meto.com, 0
-imgchr.com, 0
-img.com.br, 0
 img.com.ua, 0
-imikoko.com, 0
-imin.ru, 0
 immigrationvoice.org, 0
-immmmm.com, 0
-immobiliarefull.com, 0
 immobilienscout24.at, 0
 immobilienscout24.de, 0
-immocha.com, 0
 immotransit.be, 0
 imoffice.com, 0
 imore.com, 0
 impactradius.com, 0
-imperator.club, 0
 imperia-sadovoda.ru, 0
 imperiyanews.ru, 0
-imperosoftware.com, 0
 implyingrigged.info, 0
 impresa.pt, 0
 impressorajato.com.br, 0
 improbable.io, 0
 impulse.de, 0
-imspm.com, 0
-imssx.com, 0
 imsxm.com, 0
 imwork.net, 0
-in66.com, 0
 inaani.com, 0
-inap.gob.ar, 0
 in-berlin.de, 0
-inboxinsight.co.uk, 0
 inbucovina.ro, 0
-incaa.gob.ar, 0
 inc.com, 0
 incircle.jp, 0
 inconcertcc.com, 0
 incontrion.com, 0
 inc.ru, 0
-incust.com, 0
 inc-vrdl.iq, 0
 indamail.hu, 0
-indexa.de, 0
-indexforce.com, 0
-index.org.ru, 0
 indiada.ru, 0
 indiatradefair.com, 0
-indieweb.org, 0
 indirads.work, 0
-indir.biz, 0
-indirimkuponum.net, 0
-individualkimsk.com, 0
-indonesianbacktrack.or.id, 0
 indra.com, 0
-indue.com.au, 0
-indusos.com, 0
-ine.gob.gt, 0
-inera.se, 0
-ines.ro, 0
 inet.edu.ar, 0
 i-news.kz, 0
-inf74.ru, 0
-infars.ru, 0
-infiniflux.com, 0
 infiniti.com.cn, 0
 infinitus.com.cn, 0
 infinitycloud.com, 0
 infinixmobility.com, 0
-infino.me, 0
-infiplay.com, 0
 inflibnet.ac.in, 0
-influans.com, 0
-influencerdb.net, 0
 inflyteapp.com, 0
 info241.com, 0
 infobox.ru, 0
 infobusiness2.ru, 0
-infoherman.com, 0
 infoimoveis.com.br, 0
 infokam.su, 0
-infokartta.fi, 0
-infolan.by, 0
-info-leaks.ru, 0
 infomaniak.ch, 0
 infomaniak.com, 0
 infomercados.com, 0
-infometer.org, 0
-infomir.com.ua, 0
 infomir.eu, 0
-infomiruk.co.uk, 0
 infonavit.org.mx, 0
-infoniqa.com, 0
 infon.ru, 0
 infopraca.pl, 0
-infoprotector.com, 0
-inforesheniya.ru, 0
 inforesist.org, 0
 informamolise.com, 0
-informatics.ru, 0
-information-security.fr, 0
-informika.ru, 0
 inform.kz, 0
 inforoutefpt.org, 0
 infoskidka.ru, 0
 infosliv.club, 0
-infosport.ru, 0
-infoteca.it, 0
 infotec.be, 0
-infotec.com.pe, 0
 info.tm, 0
 infovend.ru, 0
-infovip.biz, 0
 infradead.org, 0
 infrymo.com, 0
 inf.ua, 0
-ingegneriareputazionale.com, 0
 ingeteam.com, 0
-ingress-mosaics.com, 0
-ingrnet.com, 0
 inistrack.net, 0
-initkms.ru, 0
-inits.at, 0
 inje.ac.kr, 0
-injntu.com, 0
-inkdrop.info, 0
 inke.cn, 0
-inke.com, 0
-inklestudios.com, 0
-inloox.com, 0
-inloox.de, 0
-inmart.ua, 0
-inmotionhosting.com, 0
 inmyroom.ru, 0
 innab.org, 0
-innerwise.com, 0
-innolux.com, 0
 innopolis.ru, 0
 innotech.co.jp, 0
-innotechx.com, 0
-inobroker.de, 0
 inonu.edu.tr, 0
 inovance.cn, 0
 inovarmais.com, 0
-inovex.de, 0
 inpa.gov.br, 0
-inpayment.ru, 0
-inplat-tech.com, 0
 inpost.ru, 0
 inpsycho.ru, 0
 inres.sk, 0
-inscripcionscc.com, 0
-inscription-facile.com, 0
-insearch.edu.au, 0
 insertcoin.mx, 0
 insert.com.pl, 0
-insgeek.com, 0
-inshanedesigns.com, 0
-insideblog.org, 0
 insideparadeplatz.ch, 0
 insistpost.com, 0
 inspire-energy.com.cn, 0
 inspur.com, 0
 instabot.ir, 0
 instagramtakiphilesi.com, 0
-instahack.me, 0
-instakib.com, 0
-instalex.ru, 0
 instamc.com.br, 0
-instaps.ru, 0
 instawork.com, 0
 instela.com, 0
 instrumentschedule.com, 0
 insurancenewsnet.com, 0
 insynq.com, 0
-intaa.net, 0
 intant.ru, 0
-inteam.com, 0
-intechinfo.fr, 0
 intechnic.com, 0
 integle.com, 0
-integnity.com, 0
-integralmedica.com.br, 0
-intel-academy.ru, 0
-intelek.cz, 0
-intelipost.com.br, 0
-intelligenceonline.com, 0
-intellij.net, 0
-intelsib.ru, 0
 intelvision.sc, 0
 interaction-design.org, 0
-interactivewebs.com, 0
 interaffairs.ru, 0
 interakt.co, 0
-interalpen.com, 0
-interaxions.ru, 0
-intercity.by, 0
 intermaps.com, 0
-international-license.com, 0
 internations.org, 0
-internetkurse-koeln.de, 0
-internetreputation.com, 0
-internet-verschenkmarkt.de, 0
 internetwerk.de, 0
-internorm.com, 0
-interpane.com, 0
 interpreters.travel, 0
 interra.ru, 0
-interspeedia.com, 0
 intersport.es, 0
 intersport.ru, 0
-inters.ru, 0
-intertop.kz, 0
-intertrustgroup.com, 0
-intertwine.it, 0
 intex.in, 0
 inthepicture.com, 0
-inti.co.id, 0
 intimcity.nl, 0
 intinfra.com, 0
-intnet.dj, 0
 intocareers.org, 0
-intorobot.com, 0
 intovps.com, 0
-intred.it, 0
-intt.gob.ve, 0
 intuit.com, 0
 intuit.ru, 0
 intvua.com, 0
 inventec.com, 0
 investservices.ir, 0
-invoicebus.com, 0
 invoiceplane.com, 0
-inwebpro.gr, 0
-inwx.com, 0
 inwx.de, 0
 iobb.net, 0
-iocenter.ru, 0
 ioe.edu.np, 0
 ioinformatics.org, 0
 iok.la, 0
 iol8.com, 0
 ioliu.cn, 0
 iomedia.ru, 0
-iondigi.com, 0
-ionidea.com, 0
 i-on.net, 0
-iooo.hu, 0
 ios.ac.cn, 0
-iosjailbreak.tech, 0
 iotivity.org, 0
 ip138.com, 0
 ip-188-165-217.eu, 0
-ipalfish.com, 0
-ip-approval.com, 0
-ipaslovakia.sk, 0
 ipb.ac.id, 0
-ipcn.org, 0
 ipdisk.co.kr, 0
 iperf.fr, 0
-ipeye.ru, 0
 ipfs.io, 0
-ip-games.ru, 0
 ipinyou.com, 0
 ipipe.ru, 0
 ipmobilea.com, 0
 ipmu.jp, 0
 ipnxnigeria.net, 0
-ipoint.kz, 0
-ippexpo.org, 0
-ippi.com, 0
 ipresta.ir, 0
 ipricegroup.com, 0
-iprim.ru, 0
-iprotime.com, 0
-ipstock.com, 0
-iptel.org, 0
 iptime.org, 0
-ipxe.org, 0
 iqads.ro, 0
-iqbaby.ru, 0
-iqbusiness.net, 0
 iqit-commerce.com, 0
 iqoption.com, 0
 iqor.com, 0
@@ -7137,13 +3971,9 @@
 irangpsmap.com, 0
 iranh.ir, 0
 iranicard.com, 0
-irankhodros.com, 0
 irankiai.lt, 0
 iranmap.biz, 0
-iranmodern.com, 0
 iranmohajerat.ir, 0
-iran-music.com, 0
-irannic.org, 0
 iranonymous.org, 0
 iransamaneh.com, 0
 iranserver.com, 0
@@ -7153,35 +3983,24 @@
 iraqinews.com, 0
 irbib.com, 0
 ircity.ru, 0
-irdp.ac.tz, 0
 ireadercity.com, 0
 iredmail.org, 0
 iresis.com, 0
 irfanview.de, 0
 irgups.ru, 0
-irht.ir, 0
-iriding.cc, 0
-iridize.com, 0
 iriney.ru, 0
-irklib.ru, 0
 irk.ru, 0
 irockbunny.com, 0
 ironplanet.com, 0
-ironwifi.com, 0
 iroot.kr, 0
 irpowerweb.com, 0
 irr.ru, 0
 irsahosting.ir, 0
 irsecteam.org, 0
-irserv.ir, 0
-irun.org, 0
 is74.ru, 0
-isaanco.com, 0
-is-a-geek.com, 0
 is-a-geek.org, 0
 is-best.net, 0
 ischool.com.tw, 0
-i-schools.ru, 0
 iscool.co.il, 0
 isea.ru, 0
 iseehd.tv, 0
@@ -7190,238 +4009,127 @@
 ishangzu.com, 0
 ishanitech.biz, 0
 ishansong.com, 0
-ishield.cn, 0
 ishinfo.com, 0
 ishoutbox.com, 0
 ishuhui.com, 0
-isiarussia.ru, 0
 isi.edu, 0
 isif-life.com, 0
-iskmarket.com, 0
 iskn.co, 0
-iskyshop.com, 0
 islands.com, 0
 ismdy.com, 0
 isming.me, 0
-isnap.com, 0
-isoffice.cn, 0
 isolux.ru, 0
 isotools.org, 0
-ispbyte.ru, 0
 ispeak.cn, 0
-ispfr.net, 0
-isqchina.cn, 0
-isqchina.com, 0
-isra.edu.pk, 0
-israela.ru, 0
 israfish.com, 0
 issaplus.com, 0
 issdigitalthe.com.br, 0
-istafrica.com, 0
 istanbulbilisim.com.tr, 0
-istanbulfm.com.tr, 0
 istarshine.com, 0
 istarvip.cn, 0
 istek.edu.az, 0
 istic.ac.cn, 0
 istio.com, 0
-istitutodeglinnocenti.it, 0
-istranet.ru, 0
 istt.ir, 0
 istu.edu, 0
 isu.ru, 0
-isuv.de, 0
-iswind.com, 0
-it2b.com.br, 0
-it376.com, 0
-itaita.ru, 0
-italtronik.it, 0
 italy-vms.ru, 0
 itangyi.com, 0
 itb.ac.id, 0
-itbusiness.com.ua, 0
 itcast.cn, 0
-itchannel.pt, 0
 itcinfotech.com, 0
-itc-life.ru, 0
 itcolima.edu.mx, 0
-it-connection.ru, 0
 it.cx, 0
-itdos.com, 0
 iteam.ru, 0
-itec.es, 0
 itecgoi.in, 0
 itechgyan.com, 0
-itechromania.com, 0
-itehk.com.hk, 0
 itelligence.de, 0
-itelon.ru, 0
 ithmz.com, 0
-ithub.hu, 0
-itiankong.net, 0
 itiffany.cc, 0
-itinsight.pt, 0
-itiscali.cz, 0
 itivi.pl, 0
-itjh.net, 0
 it-kb.ru, 0
 itlab.com.br, 0
 itlalaguna.edu.mx, 0
 itmages.ru, 0
 itm.edu, 0
-itmitte.de, 0
 itmo.com, 0
 itmonline.co.in, 0
-itnull.ru, 0
-itotii.com, 0
 itour.cn, 0
 itouzi.com, 0
-itoyun.cn, 0
-itp.ac.cn, 0
 it.pt, 0
 itransition.com, 0
 itresearches.ir, 0
 itrip.com, 0
-itsajten.se, 0
 itshaman.ru, 0
-itshneg.com, 0
 itsk.com, 0
-itsyourshop.ru, 0
 ittour.com.ua, 0
-ittun.com, 0
-it-tv.org, 0
-itugo.com, 0
-itural.ru, 0
-itworx.com, 0
-itwriter.ru, 0
-ityx.de, 0
 itzmx.com, 0
 i.ua, 0
 iubh.de, 0
-iusss.us, 0
-iust.ac.ir, 0
 iustice.net, 0
 iuventa.sk, 0
 iuvui.net, 0
-ivan-site.com, 0
-ivaoru.org, 0
 ivc34.ru, 0
-ivedu.ru, 0
-ivers.ru, 0
 ivest.kz, 0
 iviewui.com, 0
 ivi.ru, 0
-ivolga.tv, 0
 i-vtb.by, 0
 ivteleradio.ru, 0
 iwant.cz, 0
-iwascoding.com, 0
-iwavesystems.com, 0
-iwin.me, 0
-iwo.es, 0
-iwuzhen.org, 0
-iwww.me, 0
 ixdzs.com, 0
 ixingpan.com, 0
 ixinyou.com, 0
 ixiumei.com, 0
-iyibank.com, 0
 iyingdi.com, 0
 iyiou.com, 0
-iyuce.com, 0
 iyuntoo.com, 0
 iyunv.com, 0
 iyunxiao.com, 0
-izhforum.info, 0
-izhuchuang.com, 0
 izim.az, 0
 izmailovo.ru, 0
-izntz.com, 0
 iztwp.com, 0
 izvestia.ru, 0
-j0.cn, 0
-j2e.com, 0
 jaadee.com, 0
-jaai.cn, 0
 jaas.ac.cn, 0
 jabber.ru, 0
 jac.com.cn, 0
-jackcola.org, 0
-jacksonholewy.com, 0
 jaeapp.com, 0
 jaguar.ru, 0
-jahanscan.ir, 0
 jahanserver.com, 0
-jahwa.com.cn, 0
-jakerevans.com, 0
-jakumo.org, 0
 jalf.com, 0
 jamasp.ir, 0
-jambit.com, 0
-jambler.com, 0
 jamesallen.com, 0
-jammer4uk.com, 0
-jana.com, 0
-janfou.com, 0
-ja.nl, 0
 janosh.com, 0
-jantrish.ru, 0
-japandaisuki.com, 0
-japantrek.ru, 0
 japex.ru, 0
-jap-mom.com, 0
 jaranguda.com, 0
 jardinazuayo.fin.ec, 0
 jarjad.ru, 0
-jarltech.de, 0
-jaroslaw.pl, 0
-javacardos.com, 0
-javamilk.com, 0
 javanonline.ir, 0
 javarush.ru, 0
 javascript.ru, 0
 jawset.com, 0
 jazz-shop.ru, 0
-jc-bingo.com, 0
 jci.cc, 0
 jcndev.com, 0
-jconline.cn, 0
-jcouncil.net, 0
 jcy.gov.cn, 0
 jdair.net, 0
-jdbc.tokyo, 0
 jd.com, 0
 jdlf.com.au, 0
-jdriven.com, 0
 jecvay.com, 0
-jee.io, 0
 jejunu.ac.kr, 0
 jelastic.com, 0
 jellyfish.net, 0
 jenkers.com, 0
-jenniczech.com, 0
-jennifersoft.com, 0
-je-papote.com, 0
-jeppson.org, 0
 jerez.es, 0
 jergym.cz, 0
-jerky.com, 0
 jerryspizza.ro, 0
-jester-soft.ws, 0
-jesuislibre.net, 0
 jesus-comes.com, 0
 jetinsta.com, 0
-jetlovers.com, 0
 jetzt.at, 0
-jewcer.org, 0
 jeyserver.com, 0
 jfservice.ru, 0
-jfz.com, 0
-jg-gta.com, 0
 jgospel.net, 0
 jhddg.com, 0
-jhs.ch, 0
-jhsnet.org, 0
 jhu.edu, 0
 jia.com, 0
 jiae.com, 0
@@ -7431,33 +4139,17 @@
 jiangmen.gov.cn, 0
 jiangnan.edu.cn, 0
 jianjiaobuluo.com, 0
-jiankang51.cn, 0
 jiankang.com, 0
-jianyezuqiu.cn, 0
-jianzhimao.com, 0
 jiashuangkuaizi.com, 0
-jiashuangkuaizi.com.cn, 0
-jiasule.com, 0
-jiaxincloud.com, 0
 jiayougo.com, 0
-jicin.cz, 0
-jiecao.fm, 0
 jiedaibao.com, 0
 jiedai.cn, 0
-jieliku.com, 0
 jiemodui.com, 0
 jieyitong.cn, 0
-jiitsimplified.com, 0
 jijiys.com, 0
-jike.info, 0
 jikewenku.cn, 0
-jileniao.net, 0
-jiloc.com, 0
-jiluxinqing.com, 0
 jin10.com, 0
 jindl.com.cn, 0
-jingletruck.com, 0
-jingruis.com, 0
 jinkan.org, 0
 jinnong.cn, 0
 jinri.cn, 0
@@ -7470,121 +4162,69 @@
 jinzhoubank.com, 0
 jios.org, 0
 jisutiyu.com, 0
-jit.edu.cn, 0
 jitterclick.it, 0
-jiu6.com, 0
 jiuguge.com, 0
 jiuxian.com, 0
-jiuzhang.net, 0
 jiuzhilan.com, 0
 jivaro.com, 0
-jixuanran.com, 0
 jj.cn, 0
 jjmmw.com, 0
 jkpan.cc, 0
 jl.gov.cn, 0
-jlmedu.com, 0
 jlnu.edu.cn, 0
 jlpay.com, 0
 jlu.edu.cn, 0
 jluzh.com, 0
-jmc.asia, 0
 jme.com, 0
-jmmama.com.cn, 0
-jmoins.fr, 0
 jmramirez.pro, 0
-jmtw.cc, 0
-jmyan.com, 0
-jnbhgbox.org, 0
-job-63.ru, 0
 jobbik.hu, 0
-jobcluster.de, 0
 jobindo.com, 0
-jobitus.com, 0
-jobmixer.com, 0
-jobnet.com.tw, 0
 job.ru, 0
 job-sbu.org, 0
 jobthai.com, 0
-jodies.de, 0
 jodoplay.com, 0
-joelmediatv.de, 0
-joeyh.name, 0
-johanpaul.net, 0
 joiiup.com, 0
-joinfcloud.com, 0
 joinquant.com, 0
-joins-job.com, 0
-joinsquad.ru, 0
 joker.com, 0
-jokerkartenwelt.de, 0
 jolco.com, 0
 joomlagate.com, 0
-joomlashop.org, 0
-joseantoniomadrigal.com, 0
-josefprusa.cz, 0
 jostle.me, 0
-joubert-change.fr, 0
-joudou.com, 0
 jourdegalop.com, 0
-journeyman.tv, 0
 joybomb.com.tw, 0
 joyfulhonda.com, 0
-joykidshop.com, 0
-joyland.se, 0
 joyme.com, 0
 joyomm.com, 0
-joyoung.com, 0
 joyowo.com, 0
-jozsefattilaszinhaz.hu, 0
 jpgazeta.ru, 0
 jpg.wtf, 0
-jplopsoft.idv.tw, 0
 jpmarumaru.com, 0
-jpmens.net, 0
 jp.net, 0
 jpn.ph, 0
-jpwind.com, 0
 jqpublicblog.com, 0
 jquery.re, 0
 jrj.com.cn, 0
-jrmf360.com, 0
-js7tv.cn, 0
 js99cf.com, 0
 jsbc.com, 0
 jsinfo.net, 0
-jsj.com.cn, 0
 jslib.org.cn, 0
 jsrun.net, 0
-j-stash.club, 0
 jst-hosp.com.cn, 0
 jstv.com, 0
-jsychrss.gov.cn, 0
-jtfa.cn, 0
-jtljia.com, 0
-jtmfoodgroup.com, 0
-jtthink.com, 0
 ju53.com, 0
-juandemariana.org, 0
 juanpi.com, 0
 juanpi.org, 0
 jubaopay.com, 0
 juben108.com, 0
 jubna.com, 0
-jubushoushen.com, 0
 jucaicat.com, 0
 juesheng.com, 0
 juhe.cn, 0
-juick.com, 0
 juicysexstories.com, 0
-juii.net, 0
 juju.com, 0
 julianhuang.cc, 0
 julyedu.com, 0
 jumei.com, 0
-jumin.cc, 0
 juming.com, 0
-jumpingcrab.com, 0
 jumpserver.org, 0
 juneinter.com, 0
 juneyaoair.com, 0
@@ -7592,27 +4232,14 @@
 jungle-world.com, 0
 juniperresearch.com, 0
 juniqe.com, 0
-junkart.in, 0
-junlin.li, 0
-juntong.or.kr, 0
-junzejun.com, 0
 jupem.gov.my, 0
-jupiterhell.com, 0
 jurion.de, 0
 jusha.com, 0
-justarchi.net, 0
-justcoded.com, 0
-just-half-price.dk, 0
-just-hosting.ru, 0
 justhost.ru, 0
-justmoda.ru, 0
-just.social, 0
 justwinit.cn, 0
 juzhao.net, 0
 juzilab.com, 0
-juziplus.net, 0
 jv.ru, 0
-jvstoronto.org, 0
 jvtuiba.com, 0
 jvweb.fr, 0
 jvweb.org, 0
@@ -7622,10 +4249,7 @@
 jxzmz.org, 0
 jy391.com, 0
 jyall.com, 0
-jyh.com, 0
 jylc168.com, 0
-jzez100.com, 0
-jzteyao.com, 0
 k12.al.us, 0
 k12.ca.us, 0
 k12china.com, 0
@@ -7638,19 +4262,12 @@
 k12.or.us, 0
 k12.pa.us, 0
 k12.va.us, 0
-k1kan.cc, 0
-k31.ru, 0
 k3.cn, 0
-k3idc.com, 0
-k5-conference.com, 0
 k7computing.com, 0
-k8dy.top, 0
-kaartenhuis.nl, 0
 kaartje2go.nl, 0
 kabbalahgroup.info, 0
 kabbalah.info, 0
 kachon.com, 0
-kade.de, 0
 kadinca.club, 0
 kadrovik.ru, 0
 kadu.ru, 0
@@ -7662,59 +4279,33 @@
 kaganonline.com, 0
 kagawa.jp, 0
 kagirl.cn, 0
-kagithane.bel.tr, 0
 kags.com, 0
-kaifakuai.com, 0
 kaikeba.com, 0
 kaike.la, 0
 kaimi.io, 0
 kaist.ac.kr, 0
 kaixian.tv, 0
-kajot-casino.com, 0
 kajot.cz, 0
-kakolijeciti.com, 0
 kakpravilnosdelat.ru, 0
-kakuro-knacker.de, 0
 kalcaddle.com, 0
 kaleostra.com, 0
 kalibr603.ru, 0
 kaluga-gov.ru, 0
 kalvin.cn, 0
 kalyanamitra.org, 0
-kalyanis.ru, 0
-kalyanmir.ru, 0
-kalyanvkarmane.ru, 0
-kamaran.ru, 0
 kamaz.ru, 0
 kameleoon.com, 0
 kamensktel.ru, 0
-kamenwang.com, 0
-kametsu.com, 0
-kamgov.ru, 0
-kamjachoob.com, 0
-kamo-uniforma.ru, 0
-kamrad.ru, 0
 kanagawa.jp, 0
-kanalizaciyavdome.ru, 0
-kancapos.com, 0
 kancelarskezidle.com, 0
 kancloud.cn, 0
 kandasoft.com, 0
-kandianying.tv, 0
 kaneland.org, 0
-kanet.ru, 0
-kangmei.com.cn, 0
-kangndo.com, 0
 kangou.cn, 0
-kanibaspinar.net.tr, 0
 kannadigaworld.com, 0
 kanyanbao.com, 0
-kanyewestshoe.com, 0
 kanyewestsneakers.com, 0
-kanz.jp, 0
 kaolalicai.cn, 0
-kaomanfen.com, 0
-kaonsoftwares.com, 0
 kaoputou.com, 0
 kaoyan.com, 0
 kapaza.be, 0
@@ -7724,230 +4315,140 @@
 kapten-son.com, 0
 karandash.by, 0
 karaoteca.com, 0
-karate.ru, 0
 karatov.com, 0
 karcher.ru, 0
 karelia.pro, 0
-karex.ru, 0
 kargo.com, 0
 karibiya.ru, 0
 karl.com, 0
-karmagroup.com, 0
 karmania-auto.ir, 0
-karner-dechow.at, 0
 karofilm.ru, 0
-karpvp.net, 0
 kartagrada.ru, 0
-kartasportowa.pl, 0
 kartina.tv, 0
-kartinatv.co.il, 0
 kartinfo.me, 0
 kartkolandia.pl, 0
 kartoteka.by, 0
 karwan.cn, 0
 kasaba.uz, 0
-kasperskyclub.ru, 0
 kaspersky.ru, 0
-kassa.uz, 0
-kassir.kz, 0
-kastnersw.cz, 0
 katacoda.com, 0
-katatelecom.com, 0
-katetooncopywriter.com.au, 0
-kau-boys.com, 0
 kau-boys.de, 0
 kaufen.com, 0
 kaufmann.dk, 0
 kauf.sk, 0
-kaunoenergija.lt, 0
-kautbullinger.de, 0
-kavehglass.com, 0
 kavehome.com, 0
 kawasaki-net.ne.jp, 0
-kazagro.kz, 0
-kazakhmys.kz, 0
-kazakh-zerno.kz, 0
-kaze-travel.co.jp, 0
 kazminerals.com, 0
 kaznau.kz, 0
 kazntu.kz, 0
-kazpost.kz, 0
-kaztranscom.kz, 0
-kaztransoil.kz, 0
 kaztrk.kz, 0
 kb20.cc, 0
-kbb1.com, 0
 kbcnet.rs, 0
 kbdyw.com, 0
 kbrnet.ru, 0
-kbs.co.kr, 0
 kbstar.com, 0
 kbtu.kz, 0
 kcg.gov.tw, 0
-kcloud.me, 0
-kcorp.sk, 0
 kc-shoes.ru, 0
-kcsnet.or.kr, 0
 kddi.com, 0
 kde.org, 0
 kdevelop.org, 0
 kdliker.com, 0
 kdl.org, 0
 kdslife.com, 0
-ke8u.com, 0
 keaz.ru, 0
 kebudayaanindonesia.net, 0
-kechlibar.net, 0
 kedou.com, 0
 keejob.com, 0
 keelbeel.com, 0
-keepfree.de, 0
 keepo.me, 0
-keep.pl, 0
-keft.ru, 0
 kejianet.cn, 0
 kelasexcel.web.id, 0
-kemdikbud.go.id, 0
-kenfor.com, 0
 kenh76.vn, 0
-kenkaitube.com, 0
-kentrade.go.ke, 0
-kepeslap.hu, 0
-kerawa.com, 0
 kerch.net, 0
-keri.re.kr, 0
-kerneleros.com, 0
 kernelnewbies.org, 0
 kernel.org, 0
-kerosoft.com, 0
 ketabrah.ir, 0
 ketabshop.ir, 0
 ketangpai.com, 0
 ketianyun.com, 0
 kevinguanchedarias.com, 0
-kewaimiao.com, 0
 kexindai.com, 0
 key4math.com, 0
 keyboardmaestro.com, 0
 keybr.com, 0
 keylol.com, 0
 keymachine.de, 0
-keysystems.ru, 0
-keytrade.com, 0
 keyweb.de, 0
-keywordinspector.com, 0
 kfc.ru, 0
 kg7.ru, 0
 kgeu.ru, 0
-kgh.on.ca, 0
 kgs-drochtersen.de, 0
 kgsu.ru, 0
 khabshop.com, 0
 khai.edu, 0
-khaneirany.com, 0
 kharidaram.com, 0
-kharidazma.com, 0
-khatvongsong.vn, 0
 kh.edu.tw, 0
 khhq.net, 0
-khidmatnegara.gov.my, 0
 khnu.km.ua, 0
 khosousi.com, 0
-khotkovo.net, 0
 khstu.ru, 0
 khv.gov.ru, 0
 khv.ru, 0
 kia.ru, 0
 kichler.com, 0
-kick9.com, 0
-kick.lv, 0
 kicks-ass.net, 0
 kicksdaily.net, 0
 kickservapp.com, 0
 kickz.com, 0
-kidcheck.com, 0
-kid-control.com, 0
-kiddywood.ru, 0
 kidlogger.net, 0
 kidscasting.com, 0
 kidsmusic.info, 0
 kids-price.ru, 0
 kievcity.gov.ua, 0
 kimsufi.com, 0
-kinderedu.ru, 0
-kindertelefoon.nl, 0
-kineme.net, 0
 kingdee.com, 0
 kingnet.com.tw, 0
 kingoapp.com, 0
 kingpokers.com, 0
-kingsoft.net, 0
 kingss.win, 0
-kingsunsoft.com, 0
-kinhom.com, 0
-kinokosmos.ee, 0
-kinoloop.ru, 0
 kinoluvr.net, 0
 kinomarvel.info, 0
-kinonews.de, 0
 kinopark.kz, 0
 kinopik.info, 0
-kinoscenariy.net, 0
 kinosearch.me, 0
-kinosky.net, 0
 kinosmena.ru, 0
-kinotut.org, 0
 kinovinki.net, 0
-kinozal.cc, 0
 kinozal.website, 0
-kippee.com, 0
-kippnyc.org, 0
 kiprinform.com, 0
-kipspb.ru, 0
-kirmiziperfect.com, 0
-kirpalani.com, 0
 kissandfly.at, 0
 kissandfly.com, 0
 kissandfly.de, 0
-kissfm.md, 0
-kit.ac.jp, 0
 kitchenmag.ru, 0
 kitenet.ru, 0
 kitwee.com, 0
-kiwihk.net, 0
-kiwi.nz, 0
 kiwitaxi.com, 0
 kiwitaxi.ru, 0
 kiyu.tw, 0
-kjb-connect.com, 0
 kjds.com, 0
 kjm6.de, 0
 kjson.com, 0
 kjvvv.kr, 0
-kkguan.com, 0
 kkmcom.ru, 0
-kknyazeva.ru, 0
 kktv8.com, 0
 kku.ac.kr, 0
 kku.ac.th, 0
 klagemauer.tv, 0
 klarstein.com, 0
 klarstein.fr, 0
-klarstein.hu, 0
 klarstein.it, 0
-klarstein.sk, 0
 kla.tv, 0
-klavtorg.ru, 0
 kl.com.ua, 0
 kldp.org, 0
 kl.edu.tw, 0
 kleeneze.co.uk, 0
-kleotour.ru, 0
-kler.pl, 0
 klickmail.com.br, 0
 klick-tipp.com, 0
-klimatex.eu, 0
-klogeschichten.net, 0
 kloud51.com, 0
 klubcytrynki.pl, 0
 klv-oboi.ru, 0
@@ -7960,165 +4461,95 @@
 knastu.ru, 0
 knet.cn, 0
 kneu.edu.ua, 0
-knigafund.ru, 0
 knightfrank.com, 0
 knighthunter.com, 0
 knigogid.ru, 0
-knigosvet.com, 0
 knowbox.cn, 0
-knowledgehook.com, 0
 knutd.com.ua, 0
 knutd.edu.ua, 0
-knu.ua, 0
 kobayashi.co.jp, 0
-koblist.com, 0
-kochanhaengerwerke.de, 0
 koenig-solutions.com, 0
 kolgot.net, 0
 kolhoz.mobi, 0
 kolosej.si, 0
 komcity.ru, 0
-komersa.lv, 0
-komicolle.org, 0
-komi-news.ru, 0
 komoot.de, 0
 komparify.com, 0
-kompas.si, 0
 komtv.org, 0
 konduit.io, 0
 konicaminolta.com.cn, 0
-konigchain.com, 0
 konstanz.de, 0
-kontestapp.com, 0
 konwerter.net, 0
 konzolokszervize.hu, 0
 koo.cn, 0
 kookit.com, 0
 kookje.ac.kr, 0
 koolearn.com, 0
-kooxpi.com, 0
-kopeysk24.ru, 0
 kopilkaclub.ru, 0
 korea.ac.kr, 0
 koreastardaily.com, 0
-korenpub.com, 0
 koreus.com, 0
 korex.co.kr, 0
-kornit.com, 0
-koronacloud.com, 0
-koshelek.kz, 0
-koshikira.de, 0
-kosice.sk, 0
-kosmos-kino.ru, 0
 kosmos-x.net.ru, 0
-kotitorni.com, 0
 koule.cz, 0
-koulouba.com, 0
-kovrov.net, 0
 kpfu.ru, 0
 kpi.kharkov.ua, 0
-kplus.pro, 0
-kpoly.edu.gh, 0
 kq88.com, 0
 krakow.pl, 0
-kralici.cz, 0
-kralmp3.org, 0
 kramtp.info, 0
 krasgmu.ru, 0
-kraslan.ru, 0
 krasmama.ru, 0
-krasno.ru, 0
-krasview.ru, 0
 krautchan.net, 0
-krebsforum-fuer-angehoerige.de, 0
 kreditech.com, 0
 kre.hu, 0
 kresla-market.ru, 0
-k-res.net, 0
-kr.gov.ua, 0
 krita.org, 0
-krl.co.id, 0
 kro.kr, 0
 krones.com, 0
-krosno.com.pl, 0
 kros.sk, 0
-krsn.ru, 0
 krsu.edu.kg, 0
-kr-ustecky.cz, 0
-krutomer.ru, 0
 ksamata.ru, 0
-ksbao.com, 0
-ksd-i.com, 0
-ksil.com, 0
 ksivi.co, 0
-ksivi.pro, 0
-ksk66.ru, 0
-ksmx.me, 0
 ksoa.net, 0
 kspu.ru, 0
 ksrf.ru, 0
-kss45.ru, 0
-kstp.ir, 0
 kstu.kg, 0
 kstu.ru, 0
 ksu.edu.tw, 0
 ksu.kz, 0
 ksyic.com, 0
 kt.am, 0
-ktb.com.tw, 0
 ktb.co.th, 0
 k-telecom.org, 0
 kth.se, 0
 ktng.com, 0
 ktokogda.com, 0
 ktovkurse.com, 0
-ktze.kz, 0
-kuadro.com.br, 0
 kuaidi.com, 0
 kuaidihelp.com, 0
 kuaidi.hk, 0
 kuaikanmanhua.com, 0
-kuaishou.com, 0
-kuaiyun.cn, 0
 kuaxue.com, 0
-kubaninstrument.ru, 0
 kubankredit.ru, 0
 kubannet.ru, 0
 kubsau.ru, 0
 kubstu.ru, 0
 kucharkaprodceru.cz, 0
 kudo.co.id, 0
-kueiwa.com, 0
 kufatec.de, 0
-kugou.net, 0
 kuguya.com, 0
 kuitao8.com, 0
 kukmin.tv, 0
 kukubt.com, 0
 kuku.lu, 0
 kullsms.com, 0
-kulturniportal.cz, 0
-kumamoto.jp, 0
-kunstnet.de, 0
-kupai.me, 0
 kupi-prodai.kz, 0
-kuponuna.com, 0
-kupplung.at, 0
-kupplung.de, 0
-kuraldisi.com, 0
-kurien.co.kr, 0
 kurier.at, 0
 kursoteka.ru, 0
-kurtizanki.su, 0
-kurzy.sk, 0
 kusuriexpress.com, 0
-kutnahora.cz, 0
-kuvajmo-blogovski.com, 0
 kuwo.cn, 0
 kuz.ua, 0
 kvaclub.ru, 0
-kvado.ru, 0
-kvarnado.ru, 0
 kvartiranasutki.by, 0
 kvartplata.info, 0
 kvcc.edu, 0
@@ -8126,71 +4557,37 @@
 kwant-project.org, 0
 kwps.info, 0
 kws7.com, 0
-kxtui.com, 0
-kyberia.sk, 0
 kyiv.ua, 0
-kylesfileserver.org, 0
 kylos.pl, 0
-kymcolux.com, 0
-kyoceramobile.com, 0
 kyoto-wu.ac.jp, 0
 kysto.com, 0
 kzn.ru, 0
-kzwr.com, 0
 l2jbrasil.com, 0
 l3600.com, 0
 l4m.fr, 0
-laartcc.org, 0
 lab4u.ru, 0
 labazur.com, 0
 labelup.ru, 0
-labelzone.co.uk, 0
 labix.org, 0
 labmedica-patient.fr, 0
-laboradian.com, 0
 labruixador.es, 0
-lacl.fr, 0
 lacompagnie.com, 0
-lacomunity.com, 0
-lacotto.jp, 0
-lada.kz, 0
-ladige.it, 0
-ladya-avto.ru, 0
 ladyband.com, 0
-ladybirds.ru, 0
 ladyclick.ru, 0
 ladyplace.ru, 0
-lae-edu.com, 0
-laekh.de, 0
 lael.be, 0
-lafibre.info, 0
-lagarderob.ru, 0
-lagence.pt, 0
-laguiaw.com, 0
 lagunacity.ru, 0
-lairen.com, 0
 lakana.com, 0
-lalettrea.fr, 0
 lalilali.com, 0
-laltroweb.it, 0
-lambertgroup.ro, 0
-lames.jp, 0
-lamptkes.org, 0
 lan1.de, 0
 lance.moe, 0
-lancloud.ru, 0
-landiannews.com, 0
 landi.com, 0
-landicorp.com, 0
-landmarklondon.co.uk, 0
 landray.com.cn, 0
 landrover.ru, 0
 lanet.lv, 0
 lanet.me, 0
 lanet.ua, 0
 lanfw.com, 0
-langageoral.com, 0
-langate.tv, 0
 langhamhotels.com, 0
 langland.cc, 0
 langren8.com, 0
@@ -8200,179 +4597,101 @@
 lanseyujie.com, 0
 lanterncn.cn, 0
 lanzou.com, 0
-laocaibao.com, 0
 laparfumerie.ru, 0
-laplacinte.ro, 0
-laplagnet.com, 0
 lap-publishing.com, 0
-laptopg7.vn, 0
 laptopszaki.hu, 0
 laptopvip.vn, 0
 laravist.com, 0
-laraweb.ir, 0
 lardbucket.org, 0
-largadoemguarapari.com.br, 0
-larinshop.com, 0
 larsjung.de, 0
-larusodejda.ru, 0
-laserbits.com, 0
-laserline.de, 0
-lasignificationprenom.com, 0
 lasindias.com, 0
-laspace.ru, 0
 last2ticket.com, 0
-lastationdeski.com, 0
-latamautos.com, 0
-latetrain.cn, 0
 lativ.com, 0
 lativ.com.tw, 0
-latoquedor.com, 0
 latvenergo.lv, 0
-latymer.co.uk, 0
 laukar.com, 0
 launchaco.com, 0
 lausanne.ch, 0
 lavaradio.com, 0
 lavector.com, 0
-lavitrinedelamode.com, 0
-lawfulpath.com, 0
-law-school.de, 0
 layabox.com, 0
-layouteditor.net, 0
 laziodisu.it, 0
 lazurit.com, 0
 lazyland.net, 0
-lazytool2.com, 0
-lbgoo.com, 0
 lbxcn.com, 0
-lbyx.cn, 0
 lcbk.net, 0
 lcd1.ru, 0
-lcgitsystems.com.br, 0
 lcxzs.cn, 0
-lcygroup.com, 0
-ldap-account-manager.org, 0
 ldcx.net, 0
 ldichina.com, 0
 ldiglobal.org, 0
 leadbit.com, 0
-leadercf.com, 0
-leader-id.ru, 0
-leadermt.ru, 0
-leadingsoft.com, 0
 leadiq.io, 0
-leadsale.com, 0
 leadvertex.ru, 0
-leaf-hide.jp, 0
-league-mastery.com, 0
 leandev.cn, 0
 leangoo.com, 0
-leanlabs.io, 0
-learnamatrol.com, 0
 learnattack.de, 0
-learning2learn.cn, 0
 learninghabitat.org, 0
-learningshop.com, 0
-learnsoci.al, 0
 leavesongs.com, 0
 leawo.com, 0
 leboncoin.fr, 0
 lecake.com, 0
-leclick.ru, 0
 lecloud.com, 0
 lede-project.org, 0
-ledwatts.fr, 0
-leechking.com, 0
 leeet.net, 0
-leet.cc, 0
 leforumcatholique.org, 0
-lefresnoy.net, 0
 legadelfilodoro.it, 0
 legalacts.ru, 0
-legalaid.gov.ua, 0
 legal-alien.ru, 0
-legavolleyfemminile.it, 0
 leg.br, 0
-legendsec.com, 0
-legionowo.pl, 0
 legnica.pl, 0
 legrandchangement.com, 0
 legrandchangement.tv, 0
-lehangart.com, 0
 lehner-versand.ch, 0
 lehrerfortbildung-bw.de, 0
 leibnitz.net, 0
-leicashop.ir, 0
-leidiandian.com, 0
 leiner.at, 0
 leju.com, 0
 lemeids.com, 0
-lemezkucko.hu, 0
-lemoboo.de, 0
-lemonnow.com, 0
 lemonsay.com, 0
 lemurov.net, 0
-lending51.com, 0
 lendio.com, 0
 lendock.com, 0
 lendon.pl, 0
-lenfilm.ru, 0
-leniter.org, 0
 lenizdat.ru, 0
-lennoxintl.com, 0
 lenobl.ru, 0
 lenovo.com, 0
 lenovo.com.cn, 0
-lenreg.ru, 0
 leomadeiras.com.br, 0
 leoneteam.com, 0
 leonrestaurants.co.uk, 0
 leopays.com, 0
-leplandiscret.com, 0
 lepu.cn, 0
-lepumedical.com, 0
 lerevecraze.com, 0
-lesieur.fr, 0
 lesiteimmo.com, 0
 lesk.ru, 0
-lestendances.fr, 0
-lestheatres.net, 0
-lesy.sk, 0
 letgo.com, 0
 letitfly.me, 0
-lets-farm.com, 0
 letsfilm.org, 0
 lets-fish.com, 0
-lets-hunt.com, 0
 letsinvite.xyz, 0
 letstalkpayments.com, 0
 letu.ru, 0
 letu.ua, 0
 leupay.eu, 0
-levelup.in.th, 0
 levneknihy.cz, 0
 lewaimai.com, 0
 lewaos.com, 0
-lewei50.com, 0
 lexdir.com, 0
 lextel.it, 0
 leya.com, 0
-leyifan.com, 0
 leyue100.com, 0
-lfrm.net, 0
-lfs.org.uk, 0
-lgallardo.com, 0
-lgek.ru, 0
-lgg.ru, 0
-lhageek.com, 0
-lh-broker.ru, 0
 lh.or.kr, 0
 lhoroscope.com, 0
 liangxinyao.com, 0
 lianshang.com, 0
 lianyexiuchang.in, 0
 liaohuqiu.net, 0
-libbs.com.br, 0
 libertex.com, 0
 libertex.org, 0
 liberty.me, 0
@@ -8380,139 +4699,76 @@
 libraryofbabel.info, 0
 library.sh.cn, 0
 libreoffice.org, 0
-libreriacoletti.it, 0
 libri.it, 0
 libro.at, 0
-libroco.it, 0
-libros.ink, 0
 libsdl.org, 0
-libsmr.ru, 0
 libvirt.org, 0
-license.ddns.net, 0
 licenseha.com, 0
-lichanglin.cn, 0
-lider-exp.ru, 0
 lidgroup.ru, 0
-liesegang-partner.de, 0
 lieyunwang.com, 0
-lifan.moe, 0
 life2film.com, 0
-lifefood.eu, 0
 lifehacker.ru, 0
 lifeline.org.au, 0
 life-realty.ru, 0
-lifeseasy.com.cn, 0
 lifestyle4living.de, 0
 lifestyle.ng, 0
-lifetyper.com, 0
-lifo.gr, 0
-ligainternet.ru, 0
 liga.net, 0
-ligerelectronics.com, 0
-lightc.com, 0
-lighthouse.gr, 0
 lightss.co, 0
-lightstar.ru, 0
-ligloo.fr, 0
-liguebretagnebillard.fr, 0
 like4u.ru, 0
-likefifa.ru, 0
-likelo.ws, 0
-likesnew.ru, 0
 likewear.ru, 0
 likinming.com, 0
 lilanz.com, 0
-lileesystems.com, 0
-lilletourism.com, 0
 lima-city.de, 0
 lime-shop.ru, 0
 limh.me, 0
-limijiaoyin.com, 0
 limin.com, 0
 limuzhengxin.com, 0
 linban.com, 0
 lindner-group.com, 0
 linekong.com, 0
-linemedia.ru, 0
-linewell.com, 0
 linghit.com, 0
 lingla.com, 0
-linglongtech.com, 0
 linguanet.ru, 0
-linguarana.com, 0
 linguitronics.com, 0
 linhadefensiva.org, 0
 linkello.com, 0
 linkpc.net, 0
 linkup.com, 0
-linsenpate.de, 0
 lintut.com, 0
-linux62.org, 0
-linuxcenter.kz, 0
-linux.cn, 0
 linuxeye.com, 0
 linuxfoundation.org, 0
 linuxihaa.ir, 0
 linuxito.com, 0
-linux-mips.org, 0
-linux-mm.org, 0
 linux-onlineshop.de, 0
 linuxpl.eu, 0
-linuxsecurity.com, 0
 linuxsoid.com, 0
-linux-tips-and-tricks.de, 0
-linzi.ru, 0
-linzy.ru, 0
-lionfree.net, 0
 lions.de, 0
-liotech.ru, 0
 lipi.go.id, 0
 liqu.com, 0
-liquidation.com, 0
 liquid-life.de, 0
 liquidm.com, 0
-lirise.com, 0
 lirn.net, 0
 lis99.com, 0
 listafirme.ro, 0
-listcarbrands.com, 0
-listenflower.com, 0
 listenod.ru, 0
-listingdomsearch.com, 0
-listupp.com.br, 0
-listupp.es, 0
-listupp.fr, 0
 listupp.it, 0
 listupp.pl, 0
-listupp.ru, 0
 liteforex.com, 0
 liteforex.ru, 0
-litl-admin.ru, 0
 littlecaprice-dreams.com, 0
-littlelunch.de, 0
 littleswan.com, 0
-liturgia.pt, 0
 liu.ba, 0
 liubingyang.com, 0
-liugong.com, 0
 liujason.com, 0
 liujunchen.xyz, 0
 liuzhichao.com, 0
 livacha.com, 0
 livecoding.tv, 0
-livecoins.ru, 0
 livefast.it, 0
-livehome3d.com, 0
 livelivelive.com, 0
-livepda.ru, 0
-liveschool.net, 0
 livescore.com, 0
 livescore.co.uk, 0
-livetyping.com, 0
-living-bots.net, 0
-livingnaturally.com, 0
 livrenet.ru, 0
-liwai.com, 0
 lixin.edu.cn, 0
 liyang.io, 0
 liyathabara.com, 0
@@ -8520,67 +4776,37 @@
 lizhenwang.cn, 0
 lizhenwang.com, 0
 lizhi.fm, 0
-lizhi.io, 0
 lizhiweike.com, 0
 lizi.com, 0
-lizihang.com, 0
-ljscripts.com, 0
 ljsilvers.com, 0
-lj-top.ru, 0
-lkker.com, 0
 lks-tv.ru, 0
 llamayamovil.com, 0
 lmcservers.com, 0
-lmdinteractive.com, 0
 lmt.lv, 0
-lncc.br, 0
 lnka.cn, 0
 lnu.edu.cn, 0
 lnu.edu.ua, 0
-lo9.de, 0
 loadedmovies.com, 0
-loadup.ru, 0
 loadxtreme.ph, 0
 localau.com, 0
-loccitane.cn, 0
-lockinchina.com, 0
 locojoy.com, 0
-locpg.hk, 0
-locutorioonline.es, 0
 loe.lviv.ua, 0
-loganmarchione.com, 0
 logcg.com, 0
 logic-games.spb.ru, 0
-logicmelon.com, 0
-logico.cloud, 0
-logindex.com, 0
 loginto.me, 0
 logobaker.ru, 0
 logodashi.com, 0
-logoip.de, 0
-logomatic.fr, 0
-logos.net, 0
-logre.eu, 0
-loh-group.com, 0
-lojasegmento.com.br, 0
 lojaskd.com.br, 0
 loji.com, 0
-lokalebasen.dk, 0
 lol5s.com, 0
 loldan.com, 0
 loli-h.com, 0
-lomax.cz, 0
 londontheatredirect.com, 0
-longfor.com, 0
 longsys.com, 0
 lookfor.kz, 0
 looknij.in, 0
 loongair.cn, 0
-loopbyte.com, 0
-loramobile.de, 0
-lords.mobi, 0
 loreal.net, 0
-lostcut.net, 0
 lostiempos.com, 0
 loto.ro, 0
 lottery.gov.cn, 0
@@ -8589,210 +4815,119 @@
 louisacoffee.com.tw, 0
 louisiana.edu, 0
 louisiana.gov, 0
-lovean.com, 0
-lovehd.top, 0
 loveliv.es, 0
 lovelivewiki.com, 0
 loveota.com, 0
-love-piano.ru, 0
 lovepresent.ru, 0
 loveq.cn, 0
-loveslife.biz, 0
-loveu.tw, 0
-lowcostparking.eu, 0
 lowcygier.pl, 0
 lowyinstitute.org, 0
-loxforum.com, 0
 loyalsoldier.me, 0
-lpcorp.com, 0
 lpcware.com, 0
 lpgenerator.ru, 0
-lrts.net, 0
 lsjsoso.com, 0
-lskc.edu.hk, 0
-lsoft.hu, 0
-ltdtickets.com, 0
 ltd.ua, 0
 ltsu.org, 0
 lua.org, 0
-luatminhgia.com.vn, 0
 lublin.eu, 0
 lucca.fr, 0
 luciad.com, 0
-ludado.com, 0
 ludwig.guru, 0
 luebeck.de, 0
 lufficc.com, 0
 lugasat.org.ua, 0
 lugons.org, 0
-luisfm.es, 0
-luluyou.com, 0
-lumenvox.com, 0
-lundalogik.com, 0
-lundao.com, 0
 lun.ua, 0
-luogu.org, 0
 luohuedu.net, 0
-luolei.org, 0
 luoxiao123.cn, 0
-lurenet.ua, 0
 lurkmo.re, 0
 lurkmore.co, 0
-lurkmore.net, 0
 lurkmore.ru, 0
 lurkmore.so, 0
 lurkmore.to, 0
 lusen.com, 0
-lush.com.ua, 0
 lusilusi.com, 0
-luviaglobal.com, 0
 luxedition.ru, 0
 luxoft.com, 0
 luxottica.com, 0
-luxuqing.com, 0
 luzhou.com, 0
 lv9.org, 0
-lvbeivpn.cc, 0
 lvbeivpn.cn, 0
 lvcgroup.com, 0
 lvwenhan.com, 0
-lvxia.me, 0
 lvyouquan.cn, 0
-lwl12.com, 0
 lwl.org, 0
-lwxshow.com, 0
 lxx1.com, 0
 lyad.fr, 0
-lyblog.net, 0
-lybomudr.ru, 0
-lyceefrancais.at, 0
-lyceefrancais.org.uk, 0
 lyceum62.ru, 0
-lyfboat.com, 0
-lylinux.org, 0
-lysa-hora.cz, 0
-lzhaofu.cn, 0
 lzu.edu.cn, 0
 m19aixin.com, 0
 m1net.com.sg, 0
 m247.com, 0
 m24.ru, 0
-m2c.ru, 0
 m2indonesia.com, 0
-m2mled.net, 0
-m3guo.com, 0
-maansun.com, 0
 mabangerp.com, 0
 ma.by, 0
-macau-airport.com, 0
 maccentre.ru, 0
-macgames.fr, 0
 mach3.jp, 0
-machinalis.com, 0
-machula.ru, 0
-maco.eu, 0
 macpeers.com, 0
 macphun.com, 0
 macprime.ch, 0
-macroscop.com, 0
 mac-status.de, 0
 macx86.cn, 0
 macx.cn, 0
 macx.ws, 0
 madailicai.com, 0
 madefire.com, 0
-madeinua.org, 0
 mad-gamble.net, 0
 madisoft.it, 0
-madison.ru, 0
-madurodam.nl, 0
-madvaper.ru, 0
-madwave.ru, 0
 maeda-atsuko.cn, 0
 maedchenflohmarkt.de, 0
 maemo.org, 0
-magazindoberman.ru, 0
-magazinlinz.ru, 0
 magcity74.ru, 0
-magecom.net, 0
-magenting.com, 0
 maggioli.it, 0
-magicalgirlsubs.de, 0
 magiccardmarket.eu, 0
-magicdoorss.com, 0
 magickartenmarkt.de, 0
 magiclen.org, 0
-magicstreams.gr, 0
-magicutilities.net, 0
-magimetrics.com, 0
-magnya.com, 0
 magtu.ru, 0
-mahluklar.org, 0
-mahor.ru, 0
-mahost.ca, 0
 mahua.com, 0
-maihaoche.com, 0
-mail3admin.de, 0
 mail-archive.com, 0
-mailasail.com, 0
 mailbox.hu, 0
 mailermailer.com, 0
 mail.gov.af, 0
 mail.kz, 0
-mailpile.is, 0
 maimemo.com, 0
 maimiaotech.com, 0
 mainbox.com, 0
 mainkeys.net, 0
-mainstreamdata.com, 0
-maiotaku.com, 0
 mai.ru, 0
 maiseed.com, 0
 makedonias.gr, 0
 makedreamprofits.ru, 0
-makeevka.com, 0
-makeii.com, 0
-makeupgroup.cz, 0
 maki-chan.de, 0
 makkhichoose.com, 0
 makler.md, 0
 makler.ua, 0
-maknails.ru, 0
-makovka.com.ua, 0
 maksatbilgi.com, 0
 maktab.tj, 0
 malaga.es, 0
-malchish.org, 0
 maliactu.info, 0
-maliburumdrinks.com, 0
 malina.ru, 0
-malloom.com, 0
 mamanam.com, 0
-mamantena.ru, 0
 mamazin.com.ua, 0
 mambaby.com, 0
 mamsy.ru, 0
-manabii.info, 0
 mandarinaduck.com, 0
-m-and-d.com, 0
 mangapanda.info, 0
 mango.com, 0
 mangoerp.com, 0
 mangooutlet.com, 0
 maniac-forum.de, 0
-manifest.ge, 0
 mann.tv, 0
-manprogress.com, 0
-manqian.cn, 0
 mans.edu.eg, 0
-manstrong.com.tw, 0
 manticgames.com, 0
-mantoufan.com, 0
-manuskri.tn, 0
-manybot.io, 0
 manzana.ua, 0
 maoming.gov.cn, 0
-maori.nz, 0
 mapado.com, 0
 mapamista.org.ua, 0
 mapbar.com, 0
@@ -8802,111 +4937,61 @@
 mapshop.ir, 0
 maralhost.com, 0
 maralhost.marketing, 0
-maratsafin.pro, 0
-marbeho.com, 0
 marburg.de, 0
 marcaentradas.com, 0
-marcopinheiro.com, 0
-marcopol.pl, 0
 marelepescar.ro, 0
 marfeel.com, 0
 marietta.edu, 0
 mariinsky.ru, 0
-mariinsky.tv, 0
-marijuanagrowing.eu, 0
-marine-conservation.org, 0
 marinelink.com, 0
-maritimeprofessional.com, 0
-markaz.uz, 0
-marketgoo.com, 0
-market.hu, 0
-marketinsight.it, 0
 marketmind.at, 0
-marketsmaster.org, 0
 markiza.sk, 0
 marklogic.com, 0
-markova.com, 0
 mark.ru, 0
 marktplatz-mittelstand.de, 0
 markum.net, 0
-marlinmag.com, 0
-marshrutka.com.ua, 0
 marthadebayle.com, 0
-martinezloriente.com, 0
-marwell.org.uk, 0
 marya.ru, 0
 masalnews.ir, 0
-mascheronistore.it, 0
 mashhad724.ir, 0
 mashhad.me, 0
 masivapp.com, 0
-maslahatim.uz, 0
-masnegocio.com, 0
 maspormas.com, 0
 massaget.kz, 0
 massengeschmack.tv, 0
 mastera-rukodeliya.ru, 0
 mastercity.ru, 0
-masterofsoccer.com, 0
 masterphone.ru, 0
-master-tao.com, 0
-masterzx.com, 0
-masutaka.net, 0
-matekmindenkinek.hu, 0
-matrixcalc.org, 0
-matrix-vision.com, 0
 matrony.ru, 0
-mauiarts.org, 0
 mavn.is, 0
 mawenjian.net, 0
 mawqe3.net, 0
-maxcuties.top, 0
-maxi.by, 0
-maxicard.ua, 0
-maxi-sale.ru, 0
 maxjia.com, 0
 maxmilhas.com.br, 0
-maxserv.com, 0
-maxst.com, 0
-maxtrack.uz, 0
 maxxipoint.com, 0
-maxzon.ru, 0
 mayflower.de, 0
-maytoni.ru, 0
-mazda.at, 0
 mazda.ch, 0
 mazda.de, 0
 mazdaeur.com, 0
 mazda.fr, 0
 mazda.hr, 0
-mazsihisz.hu, 0
 m-bet.co.tz, 0
 mbfilm.ir, 0
 mbhs.edu, 0
 mblox.com, 0
-mbo.com.ph, 0
-mbwar.com, 0
 mcafeestore.com, 0
-mc-auto.ru, 0
 mcbot.gq, 0
-mcb.ru, 0
 mccme.ru, 0
 mcdir.ru, 0
 mcdonalds.cz, 0
 mcent.com, 0
-mcetv.fr, 0
-mcfuzhu.net, 0
-mcgen.eu, 0
 mcguirksgolf.com, 0
-m-classic.com, 0
 mclc.ir, 0
 mcmaster.ca, 0
 mcncc.com, 0
-mcocmod.net, 0
 mconvert.net, 0
 m-cosmetica.ru, 0
 mcplay.cn, 0
-mcscostruzioni.it, 0
 mct.gov.az, 0
 mcu.edu.tw, 0
 mcx.ru, 0
@@ -8914,26 +4999,18 @@
 mdict.cn, 0
 mdlivre.com.br, 0
 mdman.cc, 0
-mdog.mobi, 0
 mdolls.mobi, 0
 mdrv.ru, 0
 mdt-dodin.ru, 0
-mdv.de, 0
 meabilis.fr, 0
 measurementlab.net, 0
 meatbox.co.kr, 0
-mebeel.ru, 0
 mebelion.ru, 0
-mebel-top.ru, 0
 mecare.cn, 0
 mecbsegov.in, 0
 mecbsekvs.in, 0
-mechanization.ru, 0
-mectronica.it, 0
 medansatu.com, 0
-medbanks.cn, 0
 medbox.ru, 0
-medeintegra.com, 0
 medgadgets.ru, 0
 mediabak.com, 0
 mediabinn.com, 0
@@ -8946,160 +5023,85 @@
 mediakee.com, 0
 medialid.com, 0
 medialog.fr, 0
-mediaquelle.at, 0
-mediaraven.be, 0
-mediaresearch.se, 0
-mediascanner.net, 0
-mediasity.co, 0
 mediate.com, 0
 mediatoday.ru, 0
-mediatop.ws, 0
 mediavex.com, 0
-mediaweb.ru, 0
 mediazenn.com, 0
 medicalvideos.us, 0
-medicinalegal.gov.co, 0
-medicina.ru, 0
-medienrecht-urheberrecht.de, 0
 medieval-europe.eu, 0
-mediker.kz, 0
 medion.com, 0
 medjouel.com, 0
-medlibrary.org, 0
-medmag.ru, 0
-medmastery.com, 0
 medmedicine.it, 0
 medmeeting.org, 0
 mednet.ru, 0
 medscape.ru, 0
 medspros.ru, 0
 meduza.io, 0
-meekan.com, 0
 meest.us, 0
 meetfighters.com, 0
 meetme.com, 0
 meetshared.com, 0
-mef.net, 0
 megacampus.ru, 0
 megafilmes4k.com.br, 0
-mega-f.ru, 0
-megaglest.org, 0
 megaleech.us, 0
 megaline-films.kz, 0
-megaline.kg, 0
-megalink.ru, 0
 megamag.by, 0
 megamart.az, 0
-megameh.com, 0
-megaplan.by, 0
-megaplan.ru, 0
 megaterem.ru, 0
 megatheme.ir, 0
 megatrack.ru, 0
-megazat.com, 0
-megcart.com, 0
 me.gov.ar, 0
-mehrschool.com, 0
-meibu.net, 0
 meidebi.com, 0
 meideng.net, 0
 meiduimall.com, 0
-meigongyun.com, 0
-meijisp.jp, 0
 meilele.com, 0
-meinezwangsversteigerung.de, 0
 meinfernbus.de, 0
 meipian.cn, 0
 meipian.me, 0
 meishi.cc, 0
 meishij.net, 0
-meister.de, 0
 meitu.com, 0
-meix.com, 0
-meiyijia.com.cn, 0
 meizu.cn, 0
 meizu.com, 0
-melastampi.it, 0
-melenky.ru, 0
 mel.fm, 0
-melhorembarque.com.br, 0
-melodiak.hu, 0
 meloman.kz, 0
 memedai.cn, 0
-memeorandum.com, 0
 mena.org.eg, 0
-menariniapac.com, 0
 mendikat.net, 0
 mengdouwang.cn, 0
 mengniu.com.cn, 0
 mengzhu.tv, 0
 mensa.es, 0
-mensa.hu, 0
 menschen-leben.at, 0
 mephi.ru, 0
-mercadopme.com.br, 0
 mercedes-benz.ua, 0
 mercurial-scm.org, 0
-merici.ca, 0
-merproject.org, 0
 mersen.com, 0
-mertcangokgoz.com, 0
 mesago.de, 0
-mesalva.com, 0
 mesec.cz, 0
 mes.edu.cu, 0
 meshok.net, 0
 meshok.ru, 0
 meslekhocam.com, 0
-mestam.info, 0
-metabo.su, 0
 metapix.net, 0
-metasix.com.br, 0
-metasix.solutions, 0
-meten.cn, 0
-meteobox.cz, 0
-meteocontrol.de, 0
-meteorad.ru, 0
 meteor.ie, 0
 metin2.tc, 0
-metragi.ru, 0
 metricskey.net, 0
 metro.cl, 0
-metrol.jp, 0
 metropol.co.ke, 0
-metropole.cz, 0
-metropolitan.bg, 0
 metrosantiago.cl, 0
-metrosphera.ru, 0
-metroui.org.ua, 0
 metrouusor.com, 0
 metservice.com, 0
-metstr.com, 0
-mew.su, 0
 mexicoo.mx, 0
-mf8.biz, 0
 mfa.gov.by, 0
 mfb.io, 0
-mfc-74.ru, 0
-mfc74.ru, 0
-mfcto.ru, 0
 mferma.ru, 0
 mfor.hu, 0
-mfortune.co.uk, 0
 mf.uz, 0
-mgameday.com, 0
-mgb.bg, 0
-mgou.ru, 0
-mg-pen.com, 0
 mgpu.ru, 0
 mgts.ru, 0
 mgutm.ru, 0
-mguu.ru, 0
-mgvision.com, 0
-mhecy.com, 0
 mhelp.kz, 0
-mhliving.ru, 0
-mhp.com.ua, 0
 mhr-developer.com, 0
 mhunters.com, 0
 miacugra.ru, 0
@@ -9107,187 +5109,109 @@
 miamed.de, 0
 miamidade.gov, 0
 mianfeiwucan.org, 0
-mianshui365.com, 0
-miantiao.me, 0
 mianvpn.com, 0
-miaomiao520.cn, 0
 miaoyueyue.com, 0
-miascarpa.ru, 0
 miass.ru, 0
-mibd-gold.com, 0
-mibew.org, 0
 micasaverde.com, 0
-mic.co.at, 0
-michaelwest.com.au, 0
-michalsons.com, 0
-michelf.ca, 0
-michiganlabs.com, 0
-micous.com, 0
-microline.hr, 0
 microsoft.com, 0
 microsoftonline.cn, 0
 micros.uz, 0
-midaijihua.com, 0
 midea.com, 0
-midrub.com, 0
-miestilo.ru, 0
 mie-u.ac.jp, 0
 mightysignal.com, 0
 mignews.com.ua, 0
-migocorp.com, 0
 migros.ch, 0
 migu.cn, 0
-mihanwebserver.com, 0
 mihoyo.com, 0
-miit.gov.cn, 0
 mijnhva.nl, 0
 mikatiming.de, 0
 mikenopa.com, 0
 mikrocontroller.net, 0
-mikrotik-bg.net, 0
-mikrovps.hu, 0
-mikroways.net, 0
 mik.ua, 0
 mikulas.sk, 0
 mila.by, 0
 milanpassport.com.ua, 0
-militaryzone.ru, 0
 miloserdie.ru, 0
-mima.re, 0
 mimemoi.com, 0
 mimikko.cn, 0
 minbank.ru, 0
 minceraft.cl, 0
 mindai.com, 0
 mindasset.com, 0
-mindcont.com, 0
 mindjet.com, 0
-mindmeld.com, 0
 mindnode.com, 0
-mindoktor.se, 0
 mindresearch.org, 0
 mindstore.io, 0
 mineblue.com, 0
 mine.bz, 0
 mineconcapes.net, 0
-minecraft-alex.ru, 0
-minecrafting.ru, 0
 minecraftiplist.com, 0
 minecraft-moscow.com, 0
 minelist.kr, 0
-minem.gob.ar, 0
 mine.nu, 0
 mine-online.pw, 0
-minervanetworks.com, 0
 mines.edu, 0
 minfin.com.ua, 0
-mingdianwu8.com, 0
 mingkyaa.com, 0
 mingli.ru, 0
-mingyuanyun.com, 0
 mini189.cn, 0
 mini-koleso.ru, 0
-minimalart.cn, 0
-mininfra.gov.rw, 0
 mininterior.gob.ar, 0
 mininterior.gov.ar, 0
-miniyun.cn, 0
-minq.info, 0
 minsal.cl, 0
 minsk.by, 0
 mintrans.ru, 0
-mintrud.karelia.ru, 0
 minuporno.com, 0
-minus33.com, 0
 minv.sk, 0
 minyo.us, 0
-minzdravsakhalin.ru, 0
 mioji.com, 0
 mios.com, 0
-mipa.de, 0
-mipa-paints.com, 0
 mipko.ru, 0
 mipt.ru, 0
 mipuf.es, 0
 miracal.ru, 0
 mirage.ru, 0
-miranda-ng.org, 0
-mirante.net.br, 0
 mirapri.com, 0
-miraton.ua, 0
-mirbeer.ru, 0
 mirchar.ru, 0
 mirgaza.ru, 0
 miridei.com, 0
 mirkrestikom.ru, 0
 mirkvartir.ru, 0
-mirndv.ru, 0
-mir.partners, 0
-mirpchel.com, 0
-mirsushi.com, 0
 mis66.ru, 0
 missevan.com, 0
-missfresh.cn, 0
 missland.com, 0
-mista.ru, 0
 misterhorse.tv, 0
-misterspex.ch, 0
-misterspex.com, 0
 misterspex.co.uk, 0
 misterspex.de, 0
 misterspex.es, 0
 misterspex.fr, 0
-misterspex.nl, 0
 mist-game.ru, 0
 misuland.com, 0
-mi-sys.com, 0
 mit.com.mm, 0
 mit.edu, 0
 mitsubishielectric.com, 0
 mittwaldserver.info, 0
-mitusky.com, 0
-mitutoyo.eu, 0
 mit.uz, 0
-mitwork.kz, 0
 miu.ac.ir, 0
 miui.com, 0
-miuipro.ru, 0
 miutour.com, 0
 mivitec.net, 0
 mivlgu.ru, 0
-mivocloud.com, 0
-mixdrop.ru, 0
 mixupload.com, 0
 mixxx.org, 0
-miyagi.es, 0
 miyagi.jp, 0
-miyijia.com, 0
 mizban24.net, 0
-mizbansite.com, 0
-mjbang.cn, 0
 mj-king.net, 0
 mkb.ru, 0
-mke.hu, 0
 mkf.com, 0
-mk.gov.ua, 0
-mk-host.com, 0
-mkn.de, 0
-mkrada.gov.ua, 0
 mkvcorporation.com, 0
 mkvtoolnix.download, 0
 mlbeta.com, 0
-mlhang.com, 0
-mlife.by, 0
-mljia.cn, 0
-mljiadev.cn, 0
 mlpmerch.com, 0
-mlsdev.com, 0
 mma.su, 0
 mmbank.ru, 0
-mmcs.pro, 0
 mmdai.com, 0
 mmet.cn, 0
-mmgp.com, 0
 mmgp.ru, 0
 mmk.ru, 0
 mmo4me.net, 0
@@ -9295,56 +5219,26 @@
 mmotraffic.com, 0
 mmtrix.com, 0
 mmyuer.com, 0
-mnbaa.com, 0
 mnb.hu, 0
-mnb.mn, 0
-mnd.cz, 0
-mnenie.su, 0
 mne.ru, 0
 mngz.ru, 0
 mnogokarat.ru, 0
 mnt.ee, 0
-mo2g.com, 0
 mo9.com, 0
-moahr.cn, 0
-mobazi.ir, 0
-mobcb.com, 0
 mob.com, 0
 mobdisc.com, 0
 mobialia.com, 0
-mobiamo.com, 0
 mobibrw.com, 0
-mobicheckin.com, 0
-mobicom.mn, 0
-mobile-harddisk.nl, 0
 mobilenations.com, 0
-mobileshop.ir, 0
 mobil-helden.de, 0
-mobilnost.hr, 0
 mobinnet.net, 0
-mobit.dp.ua, 0
-mobi-to-pdf.com, 0
-mobius.studio, 0
 mobomarket.net, 0
-mobopan.cn, 0
 mobsoftffree.xyz, 0
 mobtakeran.com, 0
-mobwall.com.ua, 0
 mockuai.com, 0
-mockup.io, 0
-modablaj.com, 0
-modayiz.com, 0
-mod.bg, 0
 modcom.kz, 0
-moddota.com, 0
 modelmen.ru, 0
-modelon.com, 0
-modeltag.com, 0
 modmcpe.net, 0
-modmed.com, 0
-modstore.pro, 0
-modularcircuits.com, 0
-modum.by, 0
 modxcloud.com, 0
 modx.com, 0
 modx.pro, 0
@@ -9353,175 +5247,101 @@
 moegirl.org, 0
 moe.hm, 0
 moemesto.ru, 0
-moe-navi.jp, 0
 moesk.ru, 0
 mofac-alfred.com, 0
 mofang.com, 0
 mofangge.com, 0
-mofanghr.com, 0
 moguta.ru, 0
 moha.gov.my, 0
 mohammad-toluei.ir, 0
-mohande3.com, 0
 mohandeseit.ir, 0
 mohmo.net, 0
-mohmoshop.net, 0
 mohurd.gov.cn, 0
 moikit.com, 0
 moi-uni.ru, 0
-mojdoktor.gov.rs, 0
-mojeid.cz, 0
 mojichina.com, 0
 mojilala.com, 0
 mokpo.ac.kr, 0
 mokylin.com, 0
 molbase.cn, 0
 molbase.com, 0
-moleskines.ru, 0
 molnet.ru, 0
-molochnoe.ru, 0
-momic.me, 0
-momo-net.com, 0
 monamie.kz, 0
-mondiaspora.net, 0
-mondovantaggio.com, 0
-mondraker.com, 0
-monema.it, 0
-monerohash.com, 0
 monetizus.com, 0
 moneydashboard.com, 0
 moneyman.es, 0
 moneyman.ge, 0
 moneyman.kz, 0
-moneyman.pl, 0
-money-man.ru, 0
 moneyman.ru, 0
 moneyplatform.com, 0
-mongeneraliste.be, 0
-mon.gov.ru, 0
-mon.gov.ua, 0
-monifymedia.com, 0
 monitoring-plugins.org, 0
-monitor-polski.pl, 0
-monitorsanywhere.com, 0
 monitorulcj.ro, 0
-monkey-live.com, 0
 monkeytravel.com, 0
-monkkee.com, 0
 monolife.ru, 0
 monopoly-one.com, 0
 monstandardfacile.com, 0
 monsters-tk.net, 0
 montclair.edu, 0
-mooban.cn, 0
 moocollege.com, 0
-moodleschule.de, 0
 moodviewer.com, 0
 moojing.com, 0
 moonback.ru, 0
-moonfly.net, 0
 moonseo.cn, 0
 mooo.com, 0
-mooseframework.com, 0
-mooseframework.org, 0
 moovel.com, 0
-moovweb.com, 0
 mopaasapp.com, 0
 mopaas.com, 0
 moparscape.org, 0
-mopubi.com, 0
 morebooks.de, 0
 morefirm.ru, 0
-morepiva.ua, 0
 moretv.com.cn, 0
 morfans.cn, 0
 morgan.edu, 0
-morgoth.ru, 0
-morph.io, 0
-morznet.com, 0
-moscow.ovh, 0
-moscowteslaclub.ru, 0
-moseeker.com, 0
 mos-gorsud.ru, 0
-mos-kino.ru, 0
 mosmoda.com.tr, 0
 mosolymp.ru, 0
 mosreg.ru, 0
 mos.ru, 0
-mossport.ru, 0
-mostinfo.net, 0
-mosturflot.ru, 0
 motarjeminiran.com, 0
-motchallenge.net, 0
 motocms.com, 0
 motof.cn, 0
-motomaxonlineshop.com, 0
 motorbit.com, 0
 motorcyclistonline.com, 0
-motor-oel-guenstig.de, 0
-moto-scuter.ru, 0
-motosdetrabajo.com.mx, 0
-motoslave.net, 0
-motot.net, 0
 mountainduck.io, 0
 mountfield.cz, 0
 mountfield.sk, 0
-mountyhall.com, 0
-mousesports.com, 0
-mouwasat.com, 0
 movavi.com, 0
 moviejie.com, 0
 movielala.com, 0
-moviemaps.org, 0
 movienthusiast.com, 0
 movietend.com, 0
-movilizer.com, 0
-moviran.org, 0
 movitech.cn, 0
 movit-tech.com, 0
-movnow.com, 0
-moxacg.com, 0
-moxiaonai.cn, 0
 moyoyo.com, 0
 moyuniver.ru, 0
 mozaika.dn.ua, 0
-mozaik.info.hu, 0
 mozanaplo.hu, 0
-mozaweb.com, 0
 mozaweb.hu, 0
-mozayka.com.ua, 0
 moz.gov.ua, 0
-mozilla.community, 0
 mp3bass.ru, 0
 mp3.cc, 0
 mp3kw.com, 0
 mp3nta.com, 0
 mp3.pm, 0
-mp3-telechargement.net, 0
-mp4la.net, 0
 mp.br, 0
 mpets.mobi, 0
 mp.gov.in, 0
-mpgu.info, 0
 mpgu.org, 0
 mplayerhq.hu, 0
 mplife.com, 0
 mpsj99.com, 0
-mptool.cn, 0
 mpt.ru, 0
-mqlforum.com, 0
 mratwork.com, 0
 mrcode.ir, 0
 mrcraig.xyz, 0
-mrcredits.ru, 0
 mrecorder.com, 0
-mrgfd.org.ua, 0
 mritd.me, 0
-mrju.cn, 0
-mrlong.cc, 0
-mrmo.cc, 0
 mrmondialisation.org, 0
-m.ro, 0
 mrporn.com, 0
 mrtimemaker.com, 0
 mrush.mobi, 0
@@ -9529,247 +5349,134 @@
 mr-wu.cn, 0
 ms0571.com, 0
 msa.gov.cn, 0
-msalkirov.ru, 0
 msd25.com, 0
-msdi.cn, 0
 msignitechina.com, 0
 msig.sg, 0
-msilab.net, 0
-msk.su, 0
-m-sku.com, 0
 msl.ua, 0
-msmsu.ru, 0
-m-stat.gr, 0
 msu.ru, 0
-msv-duisburg.de, 0
-msxf.com, 0
 mta.mn, 0
-mta-sa.org, 0
 mta.ua, 0
 mt-bbs.com, 0
-mtcsys.com, 0
-mtechpro.com, 0
 mte.gov.br, 0
 mt.gov.br, 0
-mtgpulse.com, 0
 mti.co.jp, 0
 mtis.by, 0
-mti.ua, 0
 mtn.co.za, 0
-mtrend.ru, 0
 mtroyal.ca, 0
 mts.by, 0
 mts.ru, 0
 mts.tm, 0
-mtuci.ru, 0
 mtv235.com, 0
-mubrr.com.br, 0
-mucangjun.com, 0
 mucfc.com, 0
 muchong.com, 0
-mueller-of.de, 0
 muh.ru, 0
 muis.gov.sg, 0
-mujglock.com, 0
-mujin.co.jp, 0
-mujot.net, 0
-mu-kingdom.com, 0
-mukolin.cz, 0
 muloqot.uz, 0
-multiloginapp.com, 0
-multinet.dp.ua, 0
 multi-net.ru, 0
 multi-online.ru, 0
 multiplay.ru, 0
 multirama.gr, 0
 multirom.me, 0
-multisport.cz, 0
-multitest.me, 0
 multitest.ua, 0
 multitran.com, 0
 multitran.ru, 0
 multiupload.biz, 0
 multiwork.org, 0
 mumayi.com, 0
-mumble.ru, 0
-mumms.com, 0
 mums.ac.ir, 0
 mun.ca, 0
-mundialvac.com, 0
 muniao.com, 0
 munzinger.de, 0
-muppetism.com, 0
-muquan.net, 0
 murabba.com, 0
 murad.com, 0
 murdoch.edu.au, 0
-murm.pro, 0
-musa24.fi, 0
 musc.edu, 0
-musclebearporn.com, 0
-museumsbund.de, 0
 music-all.ir, 0
 music-group.com, 0
-musicland.ru, 0
-musicnota.ru, 0
-musicshelf.jp, 0
 musikazblai.com, 0
-musik-promotion.net, 0
 musiland.cn, 0
 mutlucell.com, 0
-mutterhaus.de, 0
-muv.ac, 0
 muyingzhijia.com, 0
 muzhiso.com, 0
-muzikata.net, 0
-muziker.com, 0
-muziker.es, 0
-muziker.pt, 0
 muziker.si, 0
 muziker.sk, 0
 muzikum.eu, 0
-muzkom.ru, 0
 muzlan.ru, 0
 muzmix.com, 0
 muzoic.com, 0
 muzoic.org, 0
-muzrec.com, 0
 muz.uz, 0
 mvbits.com, 0
-mvmv.com.tw, 0
 mvs.gov.ua, 0
-mvu.com.br, 0
 mwa.co.th, 0
-mwee.cn, 0
-mw-light.ru, 0
-mxp.tw, 0
-mxyun.com, 0
-my3ds.pl, 0
-my3gb.com, 0
 my3w.com, 0
-my891.com, 0
 m-yabe.com, 0
 myaiji.com, 0
-myanimeshelf.com, 0
 myanmarmp3.net, 0
-myanmore.com, 0
 myanonamouse.net, 0
-myartsonline.com, 0
 myasustor.com, 0
 myauto.ge, 0
-mybanker.dk, 0
-mybb.de, 0
 mybodygraph.com, 0
-myboracayguide.com, 0
 mybox.ru, 0
-mycat.io, 0
-my-cccp.ru, 0
-mycos.com, 0
-mydailymanga.com, 0
-myddns.com, 0
-myddns.ru, 0
 mydns.jp, 0
-mydreamplus.com, 0
 myds.me, 0
 my-eclipse.cn, 0
-myfirms.su, 0
 myfolio.com, 0
 myfoscam.com, 0
 myfoscam.org, 0
 myfreeproject.com, 0
 myfritz.net, 0
-myftb.de, 0
-myftp.biz, 0
 myftp.org, 0
 mygalgame.com, 0
 mygarage.ro, 0
-mygaste.com, 0
 my-gateway.de, 0
-mygiftcard.ru, 0
 mygiftcardsplus.com, 0
-mygjp.com, 0
 my.gov.cn, 0
-mygzb.com, 0
-myhloli.com, 0
 myhome.cx, 0
 myhomeworkapp.com, 0
 myihor.ru, 0
 myimmitracker.com, 0
 myindiacoupons.com, 0
-myjar.com, 0
-myjeeva.com, 0
 myjino.ru, 0
 myjob.uz, 0
-mykhg.de, 0
 mykitchen.am, 0
 myl.com.cn, 0
 mylifeorganized.net, 0
-mymoria.de, 0
 mymru.ca, 0
-mynetgear.com, 0
 mynetname.net, 0
 mynewcompany.com, 0
-mynj.cn, 0
 myop.cf, 0
-myowndns.info, 0
-myparcels.net, 0
 myparcels.ru, 0
-mypet-online.ru, 0
 my-phone-finder.com, 0
-myphotobook.ch, 0
-myphotobook.de, 0
-myphotobook.fr, 0
 myphotobook.it, 0
 myphotos.cc, 0
 mypoints.com, 0
-mypoolin.com, 0
 mypos.eu, 0
 mypost4u.com, 0
 my-private-network.co.uk, 0
 myprom.ru, 0
 myqcloud.com, 0
 myqnapcloud.com, 0
-myrenova.com, 0
-myrescue.net, 0
 myrusakov.ru, 0
-mysav.eu, 0
 myschoolapp.com, 0
 myschoolcdn.com, 0
-mysecuritycamera.com, 0
 myseldon.com, 0
 my-servers.us, 0
-mysisel.com, 0
 mysocialbook.com, 0
 mysocio.ru, 0
-mysocrat.com, 0
 mysof.net, 0
 myspiegel.de, 0
-myss.club, 0
-mytextmusic.com, 0
-mythware.com, 0
-mytickets.ae, 0
 my.to, 0
 mytokri.com, 0
-myvapedeal.com, 0
-my.vg, 0
 myviasat.ru, 0
 myvimir.ru, 0
 mywed.ru, 0
-mywinamp.com, 0
-mywire.org, 0
-mywishboard.com, 0
 mywork.com.vn, 0
 mywpku.com, 0
-myxs.net, 0
 myxzy.com, 0
 myyearbook.com, 0
-myzqb.cn, 0
-myzte.com, 0
 mz19.ru, 0
 mzmoney.com, 0
-mzoo.mobi, 0
-mztgame.com, 0
-mzt.ru, 0
 mz-web.de, 0
 n0l.hu, 0
 n131adserv.com, 0
@@ -9780,64 +5487,35 @@
 n159adserv.com, 0
 n19adshostnet.com, 0
 n214adserv.com, 0
-n24.ru, 0
 n264adserv.com, 0
-n280adserv.com, 0
-n329adserv.com, 0
 n4bb.com, 0
 n56adshostnet.com, 0
-n64adserv.com, 0
 n99adshostnet.com, 0
-nabezky.sk, 0
 naca.com, 0
 nacalynx.com, 0
 nacao.org.cn, 0
-nacta.edu.cn, 0
-nadesne.ru, 0
 nadloc.kz, 0
-naftan.by, 0
-naiadmmm.com, 0
-naifl.ru, 0
-naikuber.com, 0
-naimies.com, 0
 naim.ru, 0
 najlepszefoto.pl, 0
-nalogcodex.ru, 0
 nalog.ru, 0
 namava.ir, 0
 namba.kg, 0
-named.cn, 0
 nametests.com, 0
-namhuy.net, 0
 namidensetsu.com, 0
-nanaiki.ru, 0
 nanguo.cn, 0
-nanhai.gov.cn, 0
 nanhutravel.com, 0
 nani.com.tw, 0
 nanoo.tv, 0
-nano-pad.ru, 0
 nanopool.org, 0
 nanosemantics.ru, 0
 nanrenwa.com, 0
-na-olimpe.ru, 0
 naomi24.com.ua, 0
 nap6.com, 0
-napa.com, 0
 napai.cn, 0
-napensii.ua, 0
 napratica.org.br, 0
 narfu.ru, 0
-narkom.net, 0
-narkom.pro, 0
-narkom.tv, 0
-narod-expert.ru, 0
-naroi.ru, 0
-nartac.com, 0
 nas-broker.com, 0
 nasejidelna.cz, 0
-nasf.ru, 0
-nas.gov.ua, 0
 nashanyanya.ru, 0
 nashaplaneta.net, 0
 nashural.ru, 0
@@ -9846,46 +5524,27 @@
 nat123.net, 0
 natalie-tours.ru, 0
 natapp.cn, 0
-nationsgame.net, 0
 nativeads.com, 0
 native-network.net, 0
 nativerootsdispensary.com, 0
-natlot.be, 0
 natm.ru, 0
 natron.fr, 0
-nattule.com, 0
 natural-sciences.ru, 0
-naturalwellbeing.com, 0
-natureacoeur.fr, 0
-nauchu-gotovit.ru, 0
 nau.edu.ua, 0
 nauka.gov.pl, 0
-naumen.ru, 0
-nav.by, 0
 naviextras.com, 0
-navigate.de, 0
-navikey.org, 0
-naviki.org, 0
-navrcholu.cz, 0
 nayavideo.com, 0
 nazk.gov.ua, 0
-nazuby.cz, 0
 nazwa.pl, 0
-nbastats.info, 0
 nbd.com.cn, 0
 nbdeli.com, 0
-nbedu.gov.cn, 0
-nbepb.gov.cn, 0
 nbhis.com, 0
-nbikemsu.ru, 0
-nbmetro.com, 0
 nbn.org.il, 0
 nbrc.ac.in, 0
 nca.gov.tw, 0
 ncas.or.kr, 0
 ncca.ie, 0
 ncfgroup.com, 0
-nchkz.ru, 0
 ncihealth.cn, 0
 ncku.edu.tw, 0
 ncnu.edu.tw, 0
@@ -9901,34 +5560,17 @@
 ndr.de, 0
 ndv.ru, 0
 nea.gov.cn, 0
-nearadio.no, 0
-nebopro.ru, 0
-neco.tech, 0
-nectarin.ru, 0
-necy.eu, 0
-nedes.sk, 0
 neftekamsk.ru, 0
 neigou.com, 0
 nejlepsiceny.cz, 0
 nekto.me, 0
 nemaloknig.info, 0
-nemidoonam.com, 0
-nemzetiszinhaz.hu, 0
-neocron-game.com, 0
-neocube-russia.ru, 0
-neoebiz.co.kr, 0
 neoferr.com, 0
-neoflex.ru, 0
-neolant.ru, 0
 neoline.ru, 0
 neotriad.com, 0
 neoway.com.br, 0
-nephila.it, 0
 nepszava.hu, 0
 nestoilgroup.com, 0
-net46.net, 0
-net9.org, 0
-net-agenta.ru, 0
 netangels.ru, 0
 netatmo.com, 0
 netau.net, 0
@@ -9937,173 +5579,95 @@
 netcraft.com, 0
 netease.com, 0
 netease.im, 0
-neteasy.pl, 0
-neteng.co, 0
 net-film.ru, 0
-nethesis.it, 0
 nethouse.ru, 0
 netim.com, 0
-netim.fr, 0
-netim.net, 0
 netiyi.com, 0
-net-load.com, 0
-netmaid.com.sg, 0
-netnea.com, 0
 netoearth.com, 0
 netpioneer.de, 0
 netplus.ch, 0
-netplus.tv, 0
-netsdl.com, 0
 netsh.org, 0
 netsparkmobile.com, 0
 netsun.com, 0
-nettoplast.ru, 0
 netvolante.jp, 0
-net-well.ru, 0
-netwi.ru, 0
-networkguru.ru, 0
-networkhealth.com, 0
-netxms.org, 0
 netzpolitik.org, 0
 netztest.at, 0
 neu.edu.cn, 0
-neura.edu.au, 0
-neurocogtrials.com, 0
-neurogroove.info, 0
 neuronup.com, 0
 neusoft.com, 0
 neusoft.edu.cn, 0
 neutrik.com, 0
 neutrium.net, 0
-nevalink.net, 0
-nevsedni-svet.cz, 0
-newalive.net, 0
 newbd.com, 0
-newchama.com, 0
 newchic.com, 0
-newdefend.com, 0
 newfrog.com, 0
 newhistorian.com, 0
-newhopegroup.com, 0
 newhorizonindia.edu, 0
-newhorizons.ae, 0
 newifi.com, 0
-newikis.com, 0
 newinform.com, 0
-newmanity.com, 0
 newmanvip.com, 0
 newm.co.kr, 0
 newmobilelife.com, 0
 new-retail.ru, 0
-new-rock-france.com, 0
 new-rus.tv, 0
-newsbin.com, 0
 news.cn, 0
 newscom.com, 0
-newsdog.today, 0
 news-for.me, 0
 newsghana.com.gh, 0
 newsko.ru, 0
 newsone.ua, 0
 newsprom.ru, 0
-newssummedup.com, 0
 news.tj, 0
 newstral.com, 0
 newszeit.com, 0
 newtab.club, 0
 newtimes.ru, 0
-newtranx.com, 0
-newz-complex.org, 0
-nexsoft.com.tr, 0
 nex-tech.com, 0
-nextgis.com, 0
 nextlayer.at, 0
-nextmail.ru, 0
 nextmp.net, 0
-nexusenergia.com, 0
 neytron.com, 0
 nezavisne.com, 0
-nfc-tag-shop.de, 0
-nfls.com.cn, 0
 nfmedia.com, 0
-nfo.so, 0
 nfs.com.ru, 0
 nfshost.com, 0
-nfsplanet.com, 0
 ngaaron.com, 0
 ngagelive.com, 0
 ngame.cn, 0
-ngamew.com, 0
 ngbit.com, 0
-ng-erp.com, 0
 nginx.org, 0
-ngmk.uz, 0
 ngmu.ru, 0
 ngonline.cn, 0
-ngp-ua.info, 0
 ngrok.cc, 0
 ngrok.io, 0
-nh.ee, 0
 niarela.net, 0
 niazerooz.com, 0
 nibs.ac.cn, 0
 nicaifu.com, 0
 nic.cz, 0
-nicdn.de, 0
-nicebnb.com, 0
-nicecotedazur.org, 0
 nic.edu, 0
 nicelabel.com, 0
-nic.gob.ar, 0
-nickstories.de, 0
-nicolawealth.com, 0
 nicpars.ir, 0
-nic.tr, 0
-nicweb.net, 0
-nidami.com, 0
 nie.edu.sg, 0
-night-ladies.ru, 0
-nightwolves.ru, 0
-nihaoshijie.com.cn, 0
 nijiero-ch.com, 0
 niji.fr, 0
 nikan.ir, 0
 nikonians.org, 0
 niks.by, 0
-nilokala.com, 0
-nimaboke.com, 0
-nina.gov.pl, 0
-ninja250.org, 0
 ninjamock.com, 0
 ninjaromeo.com, 0
-nintendo.es, 0
-nip.io, 0
-nipkipro.ru, 0
 nipne.ro, 0
-nippon-antenna.co.jp, 0
 niracloud.com, 0
-nirhtu.ru, 0
-nirt.res.in, 0
 nitec.kz, 0
 nitecore.com, 0
 nitk.ac.in, 0
-nitrokey.com, 0
 nitroserv.com, 0
-niubide.com, 0
 niuche.com, 0
-niu.cl, 0
-niume.com, 0
 niva-club.net, 0
-niwi.nz, 0
-nixpro.by, 0
-nix.ru, 0
 nixstore.ru, 0
-nj13z.cn, 0
 njd1.com, 0
 njit.edu.cn, 0
 njmu.edu.cn, 0
 n-joy.de, 0
-njucs-os.tk, 0
 nju.edu.cn, 0
 njust.edu.cn, 0
 nkforex.com, 0
@@ -10113,22 +5677,14 @@
 nl.ua, 0
 nmdn.net, 0
 nmedik.org, 0
-nmetau.edu.ua, 0
-nmg.gov.cn, 0
-nmm-hd.org, 0
 nmn.tw, 0
 nmzh.net, 0
-nnbbxx.net, 0
 nng.com, 0
 nnovosti.info, 0
-no1lounges.com, 0
 no1muse.com, 0
 noao.edu, 0
-nobleocarina.net, 0
 no-bs.de, 0
 nochi.com, 0
-nococoti.org, 0
-noda.me, 0
 nodelog.cn, 0
 nodevice.com, 0
 nodevice.com.pt, 0
@@ -10136,93 +5692,58 @@
 nodevice.fr, 0
 nodevice.it, 0
 nodevice.jp, 0
-nody.me, 0
-nohoobag.com, 0
 no-ip.biz, 0
 no-ip.ca, 0
 no-ip.com, 0
 noip.me, 0
 no-ip.net, 0
-noisefm.ru, 0
 nolog.com, 0
 nomadit.co.uk, 0
-nomensa.com, 0
-nominic.ru, 0
-nomisma.it, 0
 nomnomka.ru, 0
 nomorelyrics.net, 0
-nonfiction.fr, 0
-noniu.com, 0
 non.li, 0
-nonli.com, 0
-nonstop-recruitment.com, 0
 noonbora.xyz, 0
 noor.net, 0
 noor-publishing.com, 0
-norakrolika.ru, 0
-norbar.com, 0
-norbit.ru, 0
 nordstar.ru, 0
-nordvpn.com, 0
 nordwindairlines.ru, 0
-norilsk-city.ru, 0
 noringa.ru, 0
 norma.uz, 0
-nornik.ru, 0
 northghost.com, 0
 norvik.eu, 0
 no-shave.org, 0
-nostromo.io, 0
-nota11.com.br, 0
 notaire.be, 0
 notariat.ru, 0
 notaris.be, 0
 notebooksbilliger.de, 0
 note-pad.net, 0
-noticiasx7.com, 0
 notifyfox.com, 0
 notifyninja.com, 0
 notik.ru, 0
-notmuchmail.org, 0
-notre-siecle.com, 0
 novabizz.com, 0
-novaenergia.net, 0
 nova.net.cn, 0
-novatek.ru, 0
 novatour.ru, 0
 novayaopera.ru, 0
 noveinzeraty.cz, 0
-novex.com.gt, 0
 novgorod.ru, 0
-novline.ru, 0
 novobyt.ru, 0
 novonordisk.com, 0
 novotelecom.ru, 0
 novreg.ru, 0
 nowcoder.com, 0
-nowecor.de, 0
 now.im, 0
-nowlink.it, 0
 noxue.com, 0
 npc.gov.cn, 0
-np.gov.ua, 0
-npmcompare.com, 0
 nps.edu, 0
 nptu.edu.tw, 0
-npu.ac.th, 0
 npu.gov.ua, 0
 nqu.edu.tw, 0
-nrada.gov.ua, 0
 nrcc.org, 0
-nrhh.org, 0
-ns48.pl, 0
-nsccsz.gov.cn, 0
 nsc.ru, 0
 nsfocus.com, 0
 nsimg.net, 0
 nsk.ru, 0
 nsk.su, 0
-nsktarelka.ru, 0
 nso.edu, 0
 nso.ru, 0
 nssm.cc, 0
@@ -10230,290 +5751,154 @@
 nstu.ru, 0
 nsu.edu.cn, 0
 nsuem.ru, 0
-nsupdate.info, 0
 nsw.edu.au, 0
 nsw.gov.au, 0
-n-sysdes.co.jp, 0
 ntbg.org, 0
 ntbprov.go.id, 0
-ntex.tw, 0
 ntk-intourist.ru, 0
-ntm.ir, 0
 ntnu.edu.tw, 0
 ntnu.no, 0
 ntpc.edu.tw, 0
-ntp-servers.net, 0
 ntrqq.net, 0
-ntrun.com, 0
 ntt-it.co.jp, 0
-ntt.pl, 0
 ntu.edu.tw, 0
 ntv.ru, 0
-nu3.at, 0
 nu3.ch, 0
-nu3.com, 0
 nu3.de, 0
 nu3.fr, 0
 nuaa.edu.cn, 0
 nuageapp.com, 0
 nuance-nts.com, 0
-nucrf.ru, 0
 nudt.edu.cn, 0
-nuestracasa.com.co, 0
 nuevaeps.com.co, 0
-nugalis.com, 0
 nuipogoda.ru, 0
 nuk.edu.tw, 0
-nulling.space, 0
 number2.com, 0
 nung.edu.ua, 0
 nurotan.kz, 0
 nut.cc, 0
-nutspace.com, 0
 nutz.cn, 0
-nuu.uz, 0
-nux.ro, 0
-nva-hk.com, 0
 nvrnet.ru, 0
 nw.ru, 0
-nwtc.edu, 0
-nwt.cz, 0
-nxlog.co, 0
 nxrom.us, 0
-nyaki.ru, 0
 nyaso.com, 0
-nyc.ny.us, 0
-nydusvpn.com.cn, 0
 nyitvatartas24.hu, 0
-nysoftland.com.cn, 0
 nyugat.hu, 0
-nyxcosmetic.com.ua, 0
 nzb.cat, 0
-nzcompany.org, 0
 n-z.jp, 0
-o12.pl, 0
 o2.cz, 0
-o2label.ru, 0
 o2switch.net, 0
 oakandfort.ca, 0
 oakandfort.com, 0
-oaklynschool.org, 0
-oaseatm.com.ar, 0
 oasiscatalog.com, 0
-oat.ru, 0
-oball.ru, 0
 obambu.com, 0
-obbtest.com, 0
-obd2-shop.eu, 0
-obiz.com.tw, 0
-obukhov.ru, 0
 obyava.ua, 0
-ob-zor.ru, 0
-ocamlcore.org, 0
-oca.org, 0
-ocas.ca, 0
 occ.com.mx, 0
-oceanfilmtour.com, 0
-oceanic.com.br, 0
-oceanoptics.cn, 0
 oceanoptics.com, 0
-ocenschiki-i-eksperty.ru, 0
 ochenprosto.ru, 0
 ochkov.net, 0
 oclaro.com, 0
-ocmax.sk, 0
-ocrking.com, 0
 ocrosoft.com, 0
 ocrsdk.com, 0
-ocry.com, 0
 ocs.ru, 0
-oddle.me, 0
 oddpi.com, 0
-oddsoddsodds.com, 0
 odessa.gov.ua, 0
 odessa-life.od.ua, 0
-odiaweb.in, 0
-odin.ru, 0
 odisha.gov.in, 0
-od.no, 0
-odontosystem.com.br, 0
-odoo-community.org, 0
 oe24.at, 0
-oeag.at, 0
-oefb.at, 0
 oeh-wu.at, 0
 oei.es, 0
 oe.if.ua, 0
-oem-oil.com, 0
 oevg-versteigerungen.at, 0
 ofamni.com, 0
-ofb.uz, 0
 ofcard.com, 0
 ofertaschevrolet.com.br, 0
 ofertasdeemprego.pt, 0
 ofertasdetrabajosyempleos.com, 0
 offcn.com, 0
 office-4-sale.de, 0
-officeevolution.com, 0
 officen.kr, 0
 officeplus.cn, 0
-officetotalshop.com.br, 0
 officeweb365.com, 0
-off.net.mk, 0
-offquattro.com, 0
 ofigenno.com, 0
 o-film.com, 0
-ofk18.ru, 0
 oformi.net, 0
 ofo.so, 0
 ofoto.org, 0
-oftendining.com, 0
 ogilvy.com.cn, 0
-ogilvy.it, 0
-oglaszamy24.pl, 0
 ogmem.com, 0
-ogrn.ru, 0
 ohgaki.net, 0
 ohtuleht.ee, 0
-oichinote.com, 0
 oicp.net, 0
-oieau.fr, 0
-oieau.org, 0
-oilchoice.ru, 0
-oitibs.com, 0
-okabashi.com, 0
-okair.net, 0
-okb1.ru, 0
 okbuy.com, 0
 ok-crimea.ru, 0
-okfun.org, 0
 okhosting.com, 0
 okidoki.ee, 0
-okidoki.ru, 0
-okoutris.gr, 0
 oktawave.com, 0
-oktell.ru, 0
-okupdate.ru, 0
 okwave.co.jp, 0
 okwave.jp, 0
-okwoo.com, 0
-okwu.edu, 0
 olark.com, 0
 olay.com.tr, 0
-olaytv.com.tr, 0
-olcdn.net, 0
-oldbk.ru, 0
 oldboyedu.com, 0
-old-games.ru, 0
-olico.it, 0
 olimex.com, 0
 olimpiada.ru, 0
-olimpt4.info, 0
 olimp.us, 0
-ollbiz.com, 0
 oll.tv, 0
-olympiaodos.gr, 0
 olz.by, 0
 om1.ru, 0
 omadaalithias.gr, 0
-omct.org, 0
 ome.tv, 0
-omgmobc.com, 0
 omgpu.ru, 0
 omgtu.ru, 0
-omk.ru, 0
 omnia.online, 0
 omnicomm.ru, 0
 omnikportal.com, 0
 omniscriptum.com, 0
-omnitron-systems.com, 0
 omsk.com, 0
 omskportal.ru, 0
 omskzan.ru, 0
 omsys.com.cn, 0
-omvapors.com, 0
 on5.ir, 0
-onaft.edu.ua, 0
-onda.ma, 0
-ondonnedesnouvelles.com, 0
-onechina.xyz, 0
 onego.ru, 0
-one.gov.hk, 0
 oneinstack.com, 0
-oneland.su, 0
 one-news.net, 0
-oneniceapp.com, 0
-onepiece.com.pl, 0
 one.pl, 0
 oneplus.cn, 0
-onepluscorp.cn, 0
-oneshield.com, 0
-onestic.com, 0
-onetrum.com, 0
-onevisionimaging.com, 0
-oneway.mobi, 0
-onfiles.me, 0
 onion.to, 0
 onligamez.ru, 0
 online2pdf.com, 0
-online-apteka.com.ua, 0
-onlinecomics.ru, 0
 online.cq.cn, 0
-onlinedizi.co, 0
 onlinefilerepair.com, 0
 online-go.com, 0
 onlinehome-server.com, 0
 onlinehome-server.info, 0
-online.kz, 0
 onlinelabs.ir, 0
-onlinemizban.net, 0
-online-olimpiada.ru, 0
-onlinepatent.ru, 0
 onlinepbx.ru, 0
-onlinepng.com, 0
 onlineproxy.eu, 0
 onlineservers.ir, 0
 online.tm, 0
 onlinetopgame.com, 0
-onlinetv.ru, 0
 onlinewebfonts.com, 0
 onloon.net, 0
-onlybird.com, 0
 onlyfans.com, 0
 onlyhot.net, 0
 onlylady.com, 0
-onlymobiles.com, 0
 onlymult.com, 0
 onlysasta.com, 0
 onmovie.ge, 0
 on.net, 0
 onnibus.com, 0
-onofis.com, 0
 onpage.org, 0
 ontariocolleges.ca, 0
 ont.by, 0
-onthewifi.com, 0
-onyx-boox.ru, 0
 oodii.com, 0
 oo.gd, 0
 ooi.moe, 0
-oomoe.moe, 0
 oostende.be, 0
-opapopa.ru, 0
-opava.cz, 0
-op.cz, 0
-open4u.ru, 0
 open.ac.uk, 0
 openal.org, 0
 openapis.org, 0
-openarch.nl, 0
-openasapp.net, 0
-openbadges.it, 0
-opencart2x.ru, 0
-opencartfrm.com, 0
 opencart.ir, 0
-opencartmodul.net, 0
-opencpu.org, 0
 opencsw.org, 0
 opendaylight.org, 0
 openlanguage.com, 0
@@ -10525,17 +5910,10 @@
 opennet.ru, 0
 opennicproject.org, 0
 open-o.org, 0
-openpediatrics.org, 0
-openprocurement.org, 0
 openproject.org, 0
-openproject-stage.com, 0
-open-real-estate.info, 0
-openreceptores.com, 0
 opensignal.com, 0
-opensource-excellence.com, 0
 openssource.info, 0
 openstat.com, 0
-opentopcart.com, 0
 opentown.org, 0
 opentraintimes.com, 0
 openttdcoop.org, 0
@@ -10543,53 +5921,29 @@
 openvz.org, 0
 openweb.co.za, 0
 openwrt.org, 0
-opera-online.com, 0
 opnfv.org, 0
 opogame.com, 0
 opole.pl, 0
 opolskie.pl, 0
-oponylux.pl, 0
-oporaua.org, 0
 oportuna.com, 0
 oppo.com, 0
-opportunitynetwork.com, 0
 opsteel.cn, 0
-opsview.com, 0
-optima.cz, 0
 optimism.ru, 0
-optimoney.ru, 0
-optiopay.com, 0
-opus.co.jp, 0
-orange-business.ru, 0
 orange.ci, 0
 orange.jo, 0
 orange-prem.com, 0
-orange-servicespace.com, 0
-orange-social.com, 0
-oraridiapertura24.it, 0
 orbita.dn.ua, 0
-orderbird.com, 0
 orderkleeneze.co.uk, 0
 orderonline.cn, 0
-ordinec.ru, 0
 oregonstudentaid.gov, 0
 orel.ru, 0
 orenu.co.il, 0
-orfeo-toolbox.org, 0
 orfogrammka.ru, 0
-organicawater.com, 0
-orgprint.com, 0
-oriental-dreamworks.com, 0
-orientdienst.de, 0
 orionnet.ru, 0
 oriwiki.net, 0
 ormansu.gov.tr, 0
-oroundo.com, 0
-orsk-adm.ru, 0
 orsk.ru, 0
-ortaid.fr, 0
 or.tl, 0
-ortn.edu, 0
 orzdream.com, 0
 orz.hm, 0
 osaifu.com, 0
@@ -10597,50 +5951,28 @@
 oschina.io, 0
 oschina.net, 0
 osd.at, 0
-osf-global.com, 0
-osirisshoes.com, 0
-osmbuildings.org, 0
 osmocom.org, 0
 osnova.tv, 0
 os-scape.com, 0
-osstech.co.jp, 0
-osu.ru, 0
 osvita.ua, 0
 osx86.cn, 0
-osx.hk, 0
 oszk.hu, 0
-otanice.com, 0
-otani.co, 0
 otarikkoc.com, 0
-otdelkino.ru, 0
-otelrus.ru, 0
-otenko.com, 0
-otmechalka.com, 0
 otpbank.com.ua, 0
 otpbank.ro, 0
 otr-files.de, 0
-otr-ratte.de, 0
 otr.ru, 0
-ottino.com, 0
 otyrar.kz, 0
 oucnet.cn, 0
-ouistock.fr, 0
 oum.ru, 0
-ouo.us, 0
 oupeng.com, 0
-our-dream.cn, 0
 ourgold.ru, 0
 ourjnu.com, 0
-ourmind.ru, 0
 ourocg.cn, 0
-oursays.com, 0
 ourstage.com, 0
 oursweb.net, 0
-ourutec.com, 0
-ourwalrus.com, 0
 outdoorlife.com, 0
 outdoorvoices.com, 0
-outfittery.ch, 0
 outfittery.com, 0
 outfittery.de, 0
 outlook.cn, 0
@@ -10648,11 +5980,8 @@
 ovdinfo.org, 0
 overhear.club, 0
 overnightprints.com, 0
-overstockart.com, 0
-overtechnologies.com, 0
 overthewire.org, 0
 overture.org, 0
-overwall.cc, 0
 overwiki.ru, 0
 ovh.ca, 0
 ovh.net, 0
@@ -10660,128 +5989,71 @@
 ovomedia.tv, 0
 ovotv.com, 0
 ow2.org, 0
-ow365.cn, 0
 owen.ru, 0
-owk.cz, 0
-owox.com, 0
-ows.farm, 0
 ox.ac.uk, 0
 oxge.net, 0
 oxy.edu, 0
-oyasu.info, 0
-oypo.nl, 0
-oyunlarim.com.tr, 0
-ozgrozer.com, 0
 ozon.ru, 0
-p2bt.com, 0
-p2pnet.pl, 0
 p2psearchers.com, 0
 p30rank.ir, 0
-p7.de, 0
 paci.gov.kw, 0
-pacogames.com, 0
-pacreception.com, 0
 pactera.com, 0
-pactwork.com, 0
-paddez.com, 0
 paddlepalace.com, 0
-paderno.com, 0
-pados.hu, 0
 paetep.com, 0
-pagedmeble.pl, 0
-pages-24.fr, 0
 pages24.mx, 0
-pages24.pl, 0
-page-weight.ru, 0
 pagewizz.com, 0
 paginesi.it, 0
-pagoda.com.cn, 0
 pagostad.gob.ar, 0
 pa.gov.br, 0
 pagro.at, 0
 pah.org.pl, 0
-paidui.com, 0
 paiq.nl, 0
 palemoon.org, 0
 paleoforum.ru, 0
 palettegear.com, 0
-palexpo.ch, 0
-palizafzar.com, 0
-palobby.com, 0
 panc.cc, 0
 panchemodan.ru, 0
-pancr.ru, 0
 panda.tv, 0
 pandatv.com, 0
 pandemic-legion.pl, 0
-paneco.mx, 0
-pangora.com, 0
-panolapse360.com, 0
 panono.com, 0
 panqis.cn, 0
 panypay.ir, 0
 panzar.ru, 0
 paoding.cc, 0
-pa-online.it, 0
 paopaoche.net, 0
 papapiqueetmamancoud.fr, 0
-papapt.com, 0
-paparazziuav.org, 0
 papayamobile.com, 0
-papeleriaarte.com, 0
 paperdl.com, 0
-paperhive.org, 0
 paperpass.com, 0
-paperplane.io, 0
-paper-republic.org, 0
 papersearch.net, 0
 papersogay.com, 0
 papierovetasky-vrecka.sk, 0
 paradisep30.ir, 0
 paragon-software.com, 0
-paralelnipolis.cz, 0
 paran.com, 0
 paraninfo.es, 0
-parano.be, 0
-paraplan.ru, 0
 paratype.com, 0
-parcamarketim.com, 0
 parcelapp.net, 0
 parcelchina.co.uk, 0
-parcheggilowcost.it, 0
 pardazmizban.com, 0
 parenting.com.tw, 0
 parents.org.gr, 0
-parfumerika.ru, 0
 parfum-lider.ru, 0
-parfumuri-timisoara.ro, 0
-paristamil.com, 0
 parks.org.il, 0
 parmisit.com, 0
-parmismedia3.com, 0
 parscanada.com, 0
 parseapp.com, 0
-parsec.tv, 0
 parsine.com, 0
-parsmags.com, 0
-parsregister.ir, 0
-pars-server.com, 0
-partkeepr.org, 0
 part-kom.ru, 0
 partnerchoice.co.uk, 0
 partoserver.com, 0
 parts66.ru, 0
-parts-kobo.com, 0
 partsrunner.de, 0
-pasaiaport.eus, 0
-pasaz24.pl, 0
 pasionfutbol.com, 0
 pasona.com.tw, 0
-pas.org.my, 0
 pasp.ru, 0
 pass4sures.com, 0
-pass7.cf, 0
-pass.is, 0
 passkit.com, 0
 passportindex.org, 0
 passwordrecoverytools.com, 0
@@ -10789,23 +6061,15 @@
 pastaoyunu.com.tr, 0
 pastebox.in, 0
 patagames.com, 0
-pateks.info, 0
-patentamt.at, 0
 pathfinder.gr, 0
 patiotuerca.com, 0
 patpat.com, 0
 patriarchia.ru, 0
-patrimoniocultural.pt, 0
 patronbase.com, 0
-patroneer.com, 0
 patschool.com, 0
-pau.edu.ng, 0
 pavilion.com.bd, 0
-pawnmail.com, 0
 paxsz.com, 0
 payad.me, 0
-payamkutah.com, 0
-payapal.ir, 0
 paybao.com.tw, 0
 paybone.cn, 0
 paycheckcity.com, 0
@@ -10813,114 +6077,65 @@
 paykeeper.ru, 0
 payline.ir, 0
 paymentwall.com, 0
-paymoon.com, 0
-payner.bg, 0
 paypersale.ru, 0
-paypertrail.com, 0
-payrexx.com, 0
-payroll-taxes.com, 0
 payscale.com, 0
 paywithpoli.com, 0
 pb86.net, 0
 pb.gov.br, 0
 pbplus.me, 0
-pbs-video.com, 0
 pbvusd.net, 0
 pbwiki.com, 0
 pc1ads.com, 0
-pc2ads.com, 0
 pc3ads.com, 0
 pc6.com, 0
-pcask.ru, 0
 pcauto.com.cn, 0
 pcbaby.com.cn, 0
-pcfun.ro, 0
 pcgames.com.cn, 0
 pcgarage.ro, 0
-pcgho.com, 0
-pchelp.zone, 0
-pchome.com, 0
 pchome.net, 0
 pchouse.com.cn, 0
-pci-suntektech.com, 0
 pcjoy.cn, 0
 pclady.com.cn, 0
-pclender.com, 0
-pcmag.ru, 0
 pcmarket.com.hk, 0
 pcmax.jp, 0
-pcnala.com, 0
-pc-online.co.il, 0
 pconline.com.cn, 0
 pc-radio.ru, 0
 pcradio.ru, 0
-pcsolottoresulttoday.com, 0
 pcstore.com.tw, 0
 pcvideo.com.cn, 0
-pcv.pt, 0
 pcweek.ru, 0
 pcworld.com.vn, 0
-pdaclub.pl, 0
 pdalife.ru, 0
 pdfm.net, 0
-pdlada.ru, 0
 pdn.ac.lk, 0
-pecs.hu, 0
 peergrade.io, 0
 pegast.com.ua, 0
-pegastour.ru, 0
 pegasus.de, 0
-pegasusknight.com, 0
-pegasusshop.de, 0
 pegatroncorp.com, 0
 pegitboard.com, 0
 pe.hu, 0
-p-e.kr, 0
-pelago.events, 0
 peliculas.cc, 0
-pelock.com, 0
 pelotok.net, 0
-penflip.com, 0
 penjualan.web.id, 0
-pensadordeapuestas.com, 0
-penshop.cz, 0
-pensioneram.info, 0
 pentesterschool.ir, 0
-pentestit.ru, 0
-peo.hu, 0
 peopleandconnection.com, 0
 peopleandlaw.ru, 0
-pepperkoko.com, 0
-peralppay.com, 0
 perevody-deneg.ru, 0
 perfekto.ru, 0
 performancehorizon.com, 0
 performia.com, 0
-peristeri.gr, 0
 permedu.ru, 0
-permprofi.ru, 0
-perqasje.com, 0
 persiangig.com, 0
 persiantools.com, 0
 person.com, 0
 personeelssysteem.nl, 0
-perspektiva-inva.ru, 0
-perssist.com, 0
 pervouralsk.ru, 0
 pesapal.com, 0
-pescms.com, 0
 pesc.ru, 0
 peshkupauje.com, 0
 pes.spb.ru, 0
-petdesk.com, 0
-peterkin.com.au, 0
-petersen.org, 0
-petkusuri.com, 0
-petradiamonds.com, 0
 petrimazepa.com, 0
 petrokimia-gresik.com, 0
-petromap.ru, 0
-petroren.com, 0
 petrsu.ru, 0
 petsoftware.net, 0
 petwellbeing.com, 0
@@ -10928,150 +6143,83 @@
 peugeot.it, 0
 peykasa.ir, 0
 pfconcept.com, 0
-pf-enclave.org, 0
-pfsw.com, 0
 pfthost.com, 0
-pgpru.com, 0
 pgsha.ru, 0
-pgw.jp, 0
 pgzs.com, 0
-phaistosnetworks.gr, 0
 phalconphp.com, 0
-pharminnotech.com, 0
-pharosmaris.net, 0
 phase-6.de, 0
 phcorner.net, 0
-phdl.net, 0
 phicomm.com, 0
 philipp-plein.com, 0
-philmorehost.net, 0
 philo.at, 0
-philofacile.com, 0
-phi-sci.com, 0
-phoenicis.com.ua, 0
-phoenix-dnr.ru, 0
-phoenixtree.com.cn, 0
 photo-ac.com, 0
-photobox.com, 0
 photocase.com, 0
 photocase.de, 0
-photographers.ua, 0
 photolemur.com, 0
-photonomy.ru, 0
 photophoto.cn, 0
 photoprocenter.ru, 0
 photorank.me, 0
 photosex.biz, 0
 photoshop-master.ru, 0
-photo-toolbox.com, 0
 photoworld.com.cn, 0
-php2.cc, 0
 phpcaptcha.org, 0
 phpclub.ru, 0
-phpdr.net, 0
-php-friends.de, 0
 phpinfo.me, 0
 phpmywind.com, 0
 phpnet.us, 0
 phps.kr, 0
-phpwind.me, 0
-phpxy.com, 0
-phtg.ch, 0
-phyks.me, 0
 phystech.edu, 0
-phystech.international, 0
-pi3g.com, 0
 picantecooking.com, 0
 picclick.de, 0
-picload.org, 0
-picnic.ly, 0
 picovico.com, 0
 picovr.com, 0
-picowork.com, 0
 picp.net, 0
 pictureview.com, 0
 pidak.cz, 0
 pidgin.im, 0
 pieas.edu.pk, 0
-piemex.net, 0
 pierotofy.it, 0
 pigcms.com, 0
-pikperfect.com, 0
 piktab.com, 0
 pilaipiwang.com, 0
 pila.pl, 0
-piligrim.ua, 0
-pilotgroup.net, 0
-pilot-theatre.com, 0
 piluli.ru, 0
 pinakothek.de, 0
 pine4.net, 0
-pine.fm, 0
 ping-admin.ru, 0
 pingan.com.cn, 0
 pingan.com.hk, 0
 pingpongx.com, 0
 pingstart.com, 0
-pingvin.pro, 0
 pingxx.com, 0
-pinkcasino.co.uk, 0
 pinpool.ir, 0
-pinsmedical.com, 0
-pinzhi365.com, 0
 pioneer-life.ir, 0
 pios.gov.pl, 0
-pipi.cn, 0
-pippkro.ru, 0
 piratebuhta.cc, 0
-pirateking.online, 0
 piratenpad.de, 0
 piratenpartei.de, 0
 piratepay.ir, 0
-pirateproxy.club, 0
 piratepublic.com, 0
-piratskastranka.si, 0
-pirobase.de, 0
-pirogov-dvorik.ru, 0
-pisofttech.com, 0
-pitbullguitars.com, 0
-pitchvision.com, 0
-pitersmoke.ru, 0
-pitupitu.pl, 0
-piuis.ru, 0
-pi-usa.us, 0
-pivnidenicek.cz, 0
 pixabay.com, 0
 pixelplus.ru, 0
 pixi.eu, 0
 pizzahut.be, 0
 pizzahut.com.ph, 0
 pizzamanager.eu, 0
-pjbc.gob.mx, 0
-pjeveracruz.gob.mx, 0
 pji.co.kr, 0
 pjn.gov.ar, 0
 pjud.cl, 0
-pjw.io, 0
 pkget.com, 0
-pkgh.edu.ru, 0
-pk.gov.pl, 0
 pkm.gov.gr, 0
-pkmn.net, 0
-pkmnreborn.com, 0
-pkpai.com, 0
 pkpai.kr, 0
 pkr.com, 0
 pks.id, 0
 pku.edu.cn, 0
 pkuh6.cn, 0
-placesrf.ru, 0
 placla.cz, 0
 plac-official.com, 0
 plagiarism-detector.com, 0
-plagly.com, 0
 plainjs.com, 0
-plainviewisd.org, 0
-plak.co.za, 0
 plan1.ru, 0
 planet3dnow.de, 0
 planetakino.ua, 0
@@ -11080,166 +6228,84 @@
 planetawrestling.com, 0
 planetemu.net, 0
 planete-zemlya.ru, 0
-planetkde.org, 0
-planet-kob.ru, 0
 planet-mcpe.net, 0
 planet.nl, 0
 planetofhotels.com, 0
-planetvampire.com, 0
 plan.io, 0
-planplus.cn, 0
 planujemywesele.pl, 0
 plarium.com, 0
-plasma-mobile.org, 0
-plasp.com, 0
-plasters.ru, 0
-plastics.ua, 0
-plastinka.com, 0
-plasway.com, 0
 plates4less.co.uk, 0
-platformaofd.ru, 0
 platon.sk, 0
-playa-games.com, 0
-playamedia.com, 0
-playgb.com, 0
-playgwent.cn, 0
 playinitium.com, 0
 playlist24.ru, 0
-playpass.be, 0
 playsport.cc, 0
-playstation.com, 0
-playstation.com.hk, 0
-playstore-api.com, 0
-playtomax.com, 0
-playzhan.com, 0
 plccenter.com, 0
 plobalapps.com, 0
-plocan.eu, 0
 pluie-solide.com, 0
-pluimen.nl, 0
-plumgrid.com, 0
 plus.com, 0
-plusgsm.com.br, 0
-plusmaster.ir, 0
-plus-plus.tv, 0
 ply.st, 0
-pm7.com, 0
 pmail.idv.tw, 0
 pmit.cn, 0
 pmlp.gov.lv, 0
 pndk.in, 0
-pneumax.ru, 0
-pnpapps.net, 0
 pnu.edu.ru, 0
 pnzreg.ru, 0
-pobedavkusa.ru, 0
 pocketbook-int.com, 0
 pocketdice.io, 0
 pocketlive.tv, 0
-podarit.net, 0
 podarit-prazdniki.ru, 0
-podari-zhizn.ru, 0
 poda.tv, 0
 podnikatel.cz, 0
-poems.co.id, 0
-poetrylabs.com, 0
 pofu.ru, 0
 pogazam.ru, 0
 pogliad.ua, 0
 pogovorim.net, 0
-poidem.ru, 0
-pointslab.org, 0
 poisk.ru, 0
-pokatne.pl, 0
 poke8.com, 0
 pokebip.com, 0
-pokedextracker.com, 0
-pokegosurewin.net, 0
 pokemoncardmarket.eu, 0
 pokemongomap.live, 0
-pokemonworld.ru, 0
-pokerdiscover.com, 0
 pokermatch.com, 0
-pokermoscow.ru, 0
 pokevision.hk, 0
 pokupo.ru, 0
 poland.travel, 0
 polarion.com, 0
-polar.org.cn, 0
 polessu.by, 0
-polibr.com.br, 0
-police.gov.ua, 0
-poliklinika45.ru, 0
-polime.it, 0
 politeka.net, 0
-politiadefrontiera.ro, 0
 politics.co.uk, 0
 polito.it, 0
-poliupg.ac.id, 0
 polocai.com, 0
-poloskaos.com, 0
-polovinka.org, 0
-polscygracze.pl, 0
-polska.lu, 0
-polska.travel, 0
-poltava.info, 0
 polus.com.ru, 0
 polus.su, 0
-polycn.com, 0
 polycomp.bg, 0
-polygongroup.com, 0
 polyv.net, 0
-pomelloapp.com, 0
 pomodoneapp.com, 0
 pomogi.org, 0
 pomorsu.ru, 0
 pomotodo.com, 0
 pomurec.com, 0
-ponosa.net, 0
 ponroy.com, 0
 p-on.ru, 0
 pontosido.com, 0
 pop136.com, 0
 pop800.com, 0
 popart.hk, 0
-popdg.com, 0
-popel-studio.com, 0
-popeyesdelivery.com.sg, 0
-popfax.com, 0
-popgo.space, 0
 popmog.com, 0
-popmotor.ru, 0
-popname.cz, 0
-popphoto.com, 0
 popsci.com, 0
 popunder24.com, 0
 popunder.net, 0
 porn0sex.net, 0
-porn4you.xxx, 0
-pornbase.info, 0
 pornfay.com, 0
 pornhublive.com, 0
 porno-gif.ru, 0
 porno-sex-online.com, 0
 pornvideos247.com, 0
-portail-familles.net, 0
-portaleperilcittadino.it, 0
-portal-preobrazenie.ru, 0
 portaltvto.com, 0
 portalwifi.com, 0
 portaportal.com, 0
-portfoliofinancial.hu, 0
 portfolio.hu, 0
-portodeimbituba.com.br, 0
-portoitapoa.com.br, 0
-portonave.com.br, 0
-portsdebalears.com, 0
-poshk.ru, 0
 positivoinformatica.com.br, 0
-posn.or.th, 0
-pos-shop.ru, 0
 postcalc.ru, 0
-postcross.me, 0
 postech.ac.kr, 0
 posteo.de, 0
 postgrespro.ru, 0
@@ -11247,27 +6313,19 @@
 postimees.ee, 0
 post.kz, 0
 postleitzahl.org, 0
-postmarket.kz, 0
 posuta.com, 0
 potemki.com, 0
-potokar.si, 0
 potsdam.de, 0
 potsdam.edu, 0
 pouyanit.com, 0
 povarenok.ru, 0
 pow88.com, 0
 powereasy.net, 0
-poweredbyclear.com, 0
-powerliftingiran.ir, 0
 powernet.com.ru, 0
-pozapisi.ru, 0
 poznan.pl, 0
 pp100.com, 0
 ppgame.com, 0
-ppm.cn, 0
-pptake.com, 0
 pptfans.cn, 0
-pptmall.net, 0
 ppt.ru, 0
 pptv.com, 0
 ppvke.com, 0
@@ -11275,133 +6333,68 @@
 ppzuche.com, 0
 praegnanz.de, 0
 praktiker.hu, 0
-prala.pl, 0
-prankies.com, 0
-prasac.com.kh, 0
 pravda.sk, 0
 pravosudje.ba, 0
-pravsha.by, 0
-prawda2.info, 0
-prb.bg, 0
 prcjx.cn, 0
-prefis.sk, 0
-prego-services.de, 0
 prehraj.to, 0
 preis24.de, 0
-preissuche24.info, 0
-preistalent.de, 0
 premier-kladionica.com, 0
 premiumy.pl, 0
-prepaidcard.com.mm, 0
-preparedpantry.com, 0
 prepfactory.com, 0
 preporucamo.com, 0
 presidence.bj, 0
 presidencia.gov.co, 0
-pressenews.fr, 0
 prestigeflowers.co.uk, 0
 prestigehampers.co.uk, 0
 prestigio.com, 0
-presto-apps.com, 0
-pretenziy.ru, 0
 prettyporno.net, 0
 prettysecrets.com, 0
 prezentacii.org, 0
-prezi-dent.ru, 0
 pr.gov.br, 0
 pricefx.eu, 0
 pricett.com, 0
 primacom.de, 0
-primaseller.com, 0
 primat.cz, 0
 primeapps.in, 0
-primeins.gr, 0
 primeminister.kz, 0
 primeton.com, 0
 print100.com, 0
 printer-spb.ru, 0
-printmod.ru, 0
 print-post.com, 0
-printui.com, 0
-prinzeugen.net, 0
-priscillaelmusical.es, 0
 prisonlegalnews.org, 0
-prissa.com.mx, 0
-priusfreunde.de, 0
 privatedns.biz, 0
 private-immobilienangebote.de, 0
 privatelink.de, 0
-privatportal.sk, 0
 privesc.eu, 0
 privet.com, 0
-privoz.pl, 0
-prizel.ru, 0
-prizrenpost.com, 0
-prncloud.com, 0
-prnwatch.com, 0
-pro2e.com.tw, 0
 proball.ru, 0
 proberry.ru, 0
-pro-bike.ru, 0
-probiznesmen.ru, 0
 procd.net, 0
 process-one.net, 0
-proc.ru, 0
-procvetok.com, 0
 prodaman.ru, 0
 prodj.com.ua, 0
 produccion.gob.ar, 0
-productimpossible.com, 0
 profbuh8.ru, 0
-professionals-security.com, 0
-proffstore.com, 0
-profhariz.com, 0
 profibeer.ru, 0
-proficredit.cz, 0
 profile.ir, 0
-profine-group.com, 0
 profitero.com, 0
-profitquery.com, 0
 profi.travel, 0
 profitserver.ru, 0
-profizoo.cz, 0
-profpoint.ru, 0
 proftpd.org, 0
 prog-8.com, 0
 progamer.ru, 0
-proginov.fr, 0
 proglas.cz, 0
 prognoznazavtra.ru, 0
-prognoz.ru, 0
-pro-gorod.ru, 0
 programcini.com, 0
-programmy.club, 0
-programster.org, 0
-progs-shool.ru, 0
-prohelvetia.ch, 0
 proimei.info, 0
-projectagora.com, 0
 projectfacts.de, 0
-projectfly.co.uk, 0
-projecthax.com, 0
-projectsatbangalore.com, 0
-projectsmd.in, 0
-proliancesurgeons.com, 0
-prologicwebdesign.com, 0
-promentconsulting.com, 0
-promodo.com, 0
 promo.it, 0
-promosigratis.net, 0
 promostore.de, 0
 promptcloud.com, 0
-pronetdigital.com.br, 0
 pronosticoextendido.net, 0
 prontotour.com, 0
 proofpoint.com, 0
-proofy.io, 0
-propertytorenovate.co.uk, 0
 propertywala.com, 0
-property.works, 0
 prophpbb.com, 0
 pro-porno.net, 0
 pro-psixology.ru, 0
@@ -11410,53 +6403,26 @@
 prospective.ch, 0
 prospero.ru, 0
 prostitutkifor.me, 0
-prostitutkixxx.org, 0
 prostovpn.org, 0
-prota4u.org, 0
-prota.info, 0
-prota.space, 0
-protect-software.com, 0
-protegetuordenador.com, 0
-protek.ru, 0
-protiprudu.org, 0
 protolabs.com, 0
 provadaordem.com.br, 0
-provectus.com, 0
 proviasnac.gob.pe, 0
-provincia.biella.it, 0
-provinciasondrio.gov.it, 0
-proweb.kz, 0
 proxmox.com, 0
 proxy-base.com, 0
-proxy-base.org, 0
 proxy-listen.de, 0
-proxylite.net, 0
-proxyssl.org, 0
-prsa.pl, 0
 prusa3d.com, 0
 prusa3d.cz, 0
-prusa3d.it, 0
 prusaprinters.org, 0
-przemekz.pl, 0
-psa-photo.org, 0
 psarips.com, 0
 psati.ru, 0
-psbl.org, 0
 ps-box.ru, 0
 psd1.org, 0
-psd2htmlconverter.com, 0
 psefan.com, 0
-psikologofisi.com, 0
-psim.us, 0
 pskovedu.ru, 0
 pskovline.ru, 0
-psmanaged.com, 0
-psne.jp, 0
 psnine.com, 0
 pspro.ir, 0
-pspx.ru, 0
 psru.ac.th, 0
-ps-sale.ru, 0
 pss.sk, 0
 p-stats.com, 0
 pstorage.space, 0
@@ -11467,242 +6433,135 @@
 psu.ru, 0
 psuti.ru, 0
 psy525.cn, 0
-psylab.cc, 0
-psysovet.ru, 0
-pszone.fr, 0
-pte.hu, 0
-pthor.ch, 0
-pti.org.br, 0
 ptsecurity.com, 0
-pttreader.com, 0
 ptyxjy.com, 0
 puahome.com, 0
-publbox.com, 0
-publiacqua.it, 0
 publiccloud.com.br, 0
 public-cyprus.com.cy, 0
 public.gr, 0
-publicitas.ch, 0
 publicitas.com, 0
 publicvm.com, 0
-publishernews.ru, 0
-pubprosud.fr, 0
 pub.ro, 0
 pubyun.com, 0
-puc.edu, 0
 puc-rio.br, 0
-pudding.cc, 0
 pudong.gov.cn, 0
 pu.edu.tw, 0
 puet.edu.ua, 0
-pullywood.com, 0
-pulsar.guru, 0
-pulsepad.com.ua, 0
 punchbaby.com, 0
 punjab.gov.pk, 0
 punto.ar, 0
 punycoder.com, 0
-purchasebear.com, 0
 purdue.edu, 0
-pure-ana.com, 0
-puredata.info, 0
 pureftpd.org, 0
 puregamemedia.fr, 0
-purepassion.ru, 0
-puretechltd.com, 0
-purgatoryresort.com, 0
 puritys.me, 0
 purnov.com, 0
-pushall.ru, 0
-pushclouds.cc, 0
 put.ac.ir, 0
-putanastars.net, 0
 putao.com, 0
-putihome.org, 0
-putler.com, 0
-puxbao.com, 0
 pvision.ru, 0
-pvr8.ir, 0
-pwlab.com, 0
 pwnz.org, 0
-pxgrids.com, 0
 pycon.org, 0
 pypa.io, 0
-pypi.org, 0
 pythian.com, 0
 pythonanywhere.com, 0
 python.org, 0
 pythontutor.com, 0
 pyw.cn, 0
-pyyx.com, 0
-pzacademy.com, 0
 pz.gov.ua, 0
 pzoom.com, 0
-pzu.com.ua, 0
 q1.com, 0
-q32.link, 0
 q4yy.com, 0
-q9tech.com, 0
 qapa.fr, 0
-qazit.com, 0
 qbear.ru, 0
-qbsw.sk, 0
-qc.to, 0
-qdac.cc, 0
 qdaily.com, 0
 qdcdc.com, 0
-qdealit.com, 0
-qdgjj.com, 0
-qdingzhi.com, 0
 qdu.edu.cn, 0
-qduoj.com, 0
 qdxin.cn, 0
-qeeka.com, 0
 qfang.com, 0
 qfiz.win, 0
 qhfz.edu.cn, 0
 qhimg.com, 0
 qhmsg.com, 0
-qiankunhaoche.com, 0
 qianmi.com, 0
 qianqian.com, 0
 qichacha.com, 0
 qichetong.com, 0
 qida.com, 0
-qidaile.com, 0
-qidapp.cn, 0
-qierukou.com, 0
-qietu.cn, 0
-qiezzi.com, 0
 qifu.me, 0
 qihoo.net, 0
 qihu.com, 0
-qijianvpnn.com, 0
-qikan.com, 0
 qikoo.com, 0
 qiku.com, 0
-qiling.org, 0
 qilong.com, 0
 qima-inc.com, 0
-qin27.com, 0
 qing5.com, 0
 qinggukeji.com, 0
-qingguo.com, 0
-qingk.cn, 0
 qingningzi.com, 0
 qingtaoke.com, 0
 qingting.fm, 0
-qingyunvpn.com, 0
 qingzhuyi.com, 0
 qinqinbaby.com, 0
 qinsmoon.com, 0
 qinzhou.gov.cn, 0
 qip.ru, 0
-qispine.com, 0
-qitt.ru, 0
 qiushibaike.com, 0
-qizhao.com, 0
 qlcl.edu.vn, 0
 qlean.ru, 0
 qlmoney.com, 0
-qls.com.au, 0
-qlu.edu.cn, 0
 qnapclub.it, 0
-qnap.community, 0
 qnbar.com, 0
-qnet.it, 0
 qnoddns.org.cn, 0
 qoop.me, 0
-qortex.com, 0
 qov.tw, 0
 qpolitical.com, 0
 qqyou.com, 0
-qrcb.com.cn, 0
 qrd.by, 0
-qrp-labs.com, 0
 qrserver.com, 0
-qrz.ru, 0
-qsban.cn, 0
 qsng.cn, 0
-qspfw.com, 0
 qsrmagazine.com, 0
-qswoo.com, 0
-qtdev.org, 0
-qtech.ru, 0
-qth.spb.ru, 0
 quadcept.com, 0
 qualaroo.com, 0
 qualiteconstruction.com, 0
-quality.co.jp, 0
-qualitytelecom.es, 0
 quankan.tv, 0
 quanmin.tv, 0
 queeky.com, 0
 queer.de, 0
 queezie.com, 0
-queisser.ru, 0
-quentrix.com, 0
 quepasada.cc, 0
-quepasanoticias.com, 0
-queromaisdicas.com.br, 0
 querylist.cc, 0
 questoria.ru, 0
 qugirl.com, 0
-quickchange.cc, 0
-quickclickhosting.com, 0
 quickim.co.il, 0
-quickmobile.com, 0
-quickqx.net, 0
 quicktickets.ru, 0
-quik.ru, 0
 quilt.idv.tw, 0
 quintagroup.com, 0
 quint.dk, 0
 quirinale.it, 0
 quitoque.fr, 0
 quizgroup.com, 0
-quizofkings.com, 0
 quizzclub.com, 0
 quji.com, 0
-qumaiyao.com, 0
-qumi.com, 0
 quna.com, 0
 qunar.com, 0
-qunar.it, 0
-qunarzz.com, 0
 qunhequnhe.com, 0
-qun.hk, 0
-qupai.me, 0
 qupeiyin.cn, 0
-qupeiyin.com, 0
 qutke.com, 0
-quumii.com, 0
 quyiyuan.com, 0
 quyundong.com, 0
 qxiazai.com, 0
 qycloud.com.cn, 0
 qycn.com, 0
 qydev.com, 0
-qyvideo.net, 0
 qzzn.com, 0
-r23.ru, 0
 r4ruby.com, 0
 r52.ru, 0
-r99.no, 0
 rabita.az, 0
-rabotakaliningrad.ru, 0
-rabota.tomsk.ru, 0
 racco.com.br, 0
 racedepartment.com, 0
 racefornuts.com, 0
-rachelcruze.com, 0
-rachum.com, 0
-radarservices.com, 0
 radec.com.mx, 0
 rad.eu, 0
 radia.sk, 0
-radicalphilosophy.com, 0
-radicasys.com, 0
 radicenter.eu, 0
 radikal.ru, 0
 radimrehurek.com, 0
@@ -11710,56 +6569,30 @@
 radinsan.com, 0
 radio1.si, 0
 radio5.com.pl, 0
-radioantena.si, 0
 radio.cn, 0
-radioheart.ru, 0
 radiojackie.com, 0
 radiola.audio, 0
-radiolan.sk, 0
 radiopotok.ru, 0
-radio-shop.ru, 0
-radioskonto.lv, 0
-radioson.ru, 0
-radiostudent.si, 0
-radiotrucker.com, 0
 radioweb.jp, 0
 rad-net.de, 0
 radom.pl, 0
 radpardazesh.com, 0
-raduga-ufa.ru, 0
-radver.ru, 0
-ra.ee, 0
-raf.edu.rs, 0
 ragan.com, 0
 ragazzeinvendita.com, 0
 rageline.com, 0
 rahvaraamat.ee, 0
-rahyarserver.com, 0
-raiffeisen.ru, 0
 rai.it, 0
-rails365.net, 0
 rainbow-ic.biz, 0
 rainfly.cn, 0
-rainintl.com, 0
-rainyman.net, 0
 rajagiritech.ac.in, 0
 rajax.me, 0
 rajveteranu.cz, 0
 rallets.com, 0
-ranbot.hk, 0
 rand.com, 0
 randymc.de, 0
 ranez.ru, 0
-rangde.org, 0
-raphaelhertzog.com, 0
 rapida.ru, 0
-rapidomaine.biz, 0
 rapidomaine.fr, 0
-rapidpich.ir, 0
-rapidshopper.ca, 0
-rapidsms.org, 0
-rapidswholesale.com, 0
-rapixel.com, 0
 rara.jp, 0
 raremaps.com, 0
 rare-technologies.com, 0
@@ -11769,425 +6602,231 @@
 rashtak.ir, 0
 raskesider.no, 0
 ratbv.ro, 0
-ratesphere.com, 0
-ratioform.de, 0
 ratowealth.com, 0
 ratpdev.com, 0
-raviplacement.com, 0
-ravnaqbank.uz, 0
 rayaneh.com, 0
-rayanpack.com, 0
 raybt.ru, 0
 rayshobby.net, 0
-rayvision.com, 0
-razumei.ru, 0
-rbauto.ru, 0
-rbc.ch, 0
 rbc.ua, 0
-rblive.de, 0
-rbrauto.ru, 0
 rbru.ac.th, 0
 rbt.asia, 0
 rcf.it, 0
 rcforum.ru, 0
 rcfp.org, 0
-rcitsakha.ru, 0
-rcntec.com, 0
 rcokoit.ru, 0
 rcscomponents.kiev.ua, 0
-rcsearch.ru, 0
-rc-sme.ru, 0
 rctw.net, 0
-rcxue.com, 0
 rd-forum.ru, 0
 rdf.ru, 0
 rdfzcygj.cn, 0
-rdrom.ru, 0
-rdrop.com, 0
-reachoutandread.org, 0
-readfree.me, 0
 readnotify.com, 0
 readovka.ru, 0
 reagent.com.cn, 0
-realblackfriday.ru, 0
 realestate.ru, 0
-realeyz.de, 0
 realfevr.com, 0
 realgreenled.com, 0
 realidadvenezolana.com, 0
-realistic.photos, 0
 realschulebayern.de, 0
 realsociedad.com, 0
-realtycalendar.ru, 0
 realtyvision.ru, 0
-realweb.ru, 0
-reasondigital.com, 0
-reber.com, 0
 rebex.net, 0
-rebooo.com, 0
-reca.ca, 0
-recaro-cs.com, 0
 rechargedeal.in, 0
-redbook.tw, 0
 redcafestore.com, 0
-redcom.ru, 0
-reddingo.com, 0
-redesul.com.br, 0
 red-gate.com, 0
-redhome.cc, 0
 redirectme.net, 0
-redmatter.com, 0
 rednager.xyz, 0
-rednoise.org, 0
 redserver.su, 0
 redshift3d.com, 0
-redsign.ru, 0
 redtubelive.com, 0
-redzoneaction.org, 0
-reedoun.com, 0
-reeleezee.nl, 0
 refdb.ru, 0
-reflexplanning.com, 0
 refog.com, 0
 reformagkh.ru, 0
 refurb.me, 0
-refurb-tracker.com, 0
 regard.ru, 0
 regel.it, 0
 regenbogen.com, 0
 regione.fvg.it, 0
 regione.puglia.it, 0
 regionoperator.ru, 0
-regionsanmartin.gob.pe, 0
 regiontrud.ru, 0
-registrodirecto.es, 0
-registru.md, 0
 registry.net.za, 0
 regruhosting.ru, 0
-regtaim.ru, 0
-rehau-portal.ru, 0
 reifensuche.com, 0
-reikartz.com, 0
 reimu.net, 0
 reincarnationics.com, 0
-reinforce.cn, 0
-reiseguiden.no, 0
 reisenthel.com, 0
 rekab.ir, 0
-rekini.lv, 0
-reklama-online.ru, 0
-relap.io, 0
 remediobarato.com, 0
-remisesetprivileges.fr, 0
-remont3.ru, 0
-remora.cx, 0
-remorques-discount.com, 0
 remotewebaccess.com, 0
 rem.uz, 0
 remzona.by, 0
-renate.cc, 0
 renault.ru, 0
-renderfarming.net, 0
 renderpeople.com, 0
-rendezvenyhelyszinek.hu, 0
-rendi.hu, 0
-renegades-ast.it, 0
-renegraeber.de, 0
 renhe.cn, 0
 renjk.com, 0
-rennsimulanten.de, 0
-renovolive.com, 0
 renren66.com, 0
 renren.com, 0
-renrencui.org, 0
 renshuu.org, 0
 rentacenter.com, 0
 rentalhomes.com, 0
-rentbay.co.za, 0
 rentbook.co.za, 0
-rentner-die-zocken.de, 0
-rentong.com.tw, 0
-renwey.com, 0
 repaik.com, 0
 repetiruem.ru, 0
-repetitors.info, 0
 replaymod.com, 0
 reportbee.com, 0
 reportermagazin.cz, 0
-reportuk.org, 0
-researchcatalogue.net, 0
 researchgateway.ac.nz, 0
 researchmfg.com, 0
 reseauenscene.fr, 0
 reseguiden.se, 0
-resertrip.com, 0
 reservationcounter.com, 0
 reska.co.id, 0
-res-mods.ru, 0
-resmush.it, 0
-resortragaz.ch, 0
 respondi.com, 0
 restate.ru, 0
-restore.com.ua, 0
 restore-iphone-data.com, 0
 resto.ru, 0
 restosducoeur.org, 0
-restostar.com, 0
-restr.net, 0
-resumegames.com, 0
-reteaste.tv, 0
-retently.com, 0
 retouch-weblab.com, 0
-retrojeans.com, 0
 retrovisionlatino.net, 0
 ret.ru, 0
-revda-info.ru, 0
 reveal-sound.com, 0
 revell.de, 0
-reverse4you.org, 0
 reviewtrackers.com, 0
-revision.co.zw, 0
 revistamoi.com, 0
-revizto.com, 0
 revolt.tv, 0
 rewriteim.jp, 0
-reyhansoft.com, 0
 rezeptwelt.de, 0
-rezo-zero.com, 0
 rfchost.com, 0
 rfei.ru, 0
-rfelements.com, 0
 rf.gd, 0
 rfgsi.com, 0
 rficb.ru, 0
 rfj.ch, 0
 rfmeteo.ru, 0
-rgsu.ru, 0
-rgtfo-me.it, 0
 rgups.ru, 0
-rgyan.com, 0
 rgz.one, 0
 rhbrasil.com.br, 0
 rhcloud.com, 0
 rhh520.cn, 0
-rhoen-klinikum-ag.com, 0
 ria.com, 0
-ricercare-imprese.it, 0
-ridero.eu, 0
 ridersdeal.com, 0
-riffle.be, 0
 riftcat.com, 0
-rigaskarte.info, 0
 rightathome.net, 0
 rightknights.com, 0
-right-to-love.name, 0
 rigol.com, 0
-rigpa.org, 0
-rii.kz, 0
 rijigu.com, 0
 rimi.lt, 0
-rincondelatecnologia.com, 0
-rings.ru, 0
 riolis.ru, 0
-ripn.net, 0
 ripost.hu, 0
-rippletek.com, 0
-risan-penza.ru, 0
 risda.gov.my, 0
 riseba.lv, 0
 risenenergy.com, 0
 rising-gods.de, 0
-risk.az, 0
-risparmiatelo.it, 0
 riss.ru, 0
-riteforge.com, 0
-ritehite.com, 0
 ritekit.com, 0
 rite.ly, 0
-ritepush.com, 0
-ritetag.com, 0
 ritlabs.com, 0
-ritmo.ir, 0
 ritmonexx.ru, 0
-rivalfox.com, 0
 rivalregions.com, 0
 rixcloud.com, 0
 rizhiyi.com, 0
 rjb.ch, 0
 rj.gov.br, 0
 rjh.com.cn, 0
-rk1.ru, 0
 rk.gov.ru, 0
 rkiau.ac.ir, 0
 rkomi.ru, 0
 rlp.de, 0
 rls.tv, 0
 rlu.ru, 0
-rmc.edu.my, 0
 rmis36.ru, 0
 rmu.edu, 0
 rmutsb.ac.th, 0
 rmutsv.ac.th, 0
-rnarod.su, 0
 rncb.ru, 0
 rn.gov.br, 0
-rnids.rs, 0
 rnp.br, 0
 rnz.de, 0
 roadoor.com, 0
-roadrules.com.ua, 0
-robfors.com, 0
-robodesk.biz, 0
-robofinist.ru, 0
-roboforex.ae, 0
-roboforex.co.id, 0
 roboforex.com, 0
 roboforex.ru, 0
-robom.ru, 0
-roboname.com, 0
-robot-trading.de, 0
 robrobinette.com, 0
 roche.com, 0
 roche.de, 0
-rock-chips.com, 0
 rocketbeans.tv, 0
-rocketchange.ru, 0
 rocket-exp.com, 0
-rockhard.de, 0
-roc.nl, 0
 rodina.tv, 0
 roebx.com, 0
-roederer.fr, 0
 rohan.co.uk, 0
-rohost.com, 0
-roidmi.com, 0
 roiland.com, 0
 roklen24.cz, 0
-rolecosplay.com, 0
-rolotec.ch, 0
-romana.ru, 0
 roman.com.tr, 0
-romanrm.net, 0
-romeo1052.net, 0
-romhacking.ru, 0
-romme-palast.de, 0
 ronasit.com, 0
 roncoo.com, 0
-ronc.ru, 0
 rongcapital.cn, 0
-ronghedai.com, 0
-rongkecloud.com, 0
-roninwear.com, 0
-root86.com, 0
-root9b.com, 0
 root.bg, 0
 root.cz, 0
-rootnerds.com, 0
-rootshell.be, 0
 roov.org, 0
 roowei.com, 0
-rooydad.org, 0
 rooyeshnews.com, 0
-ropestore.com.br, 0
 roposo.com, 0
 rosalab.ru, 0
 rosalinux.ru, 0
 rosan.com, 0
 rosario3.com, 0
-rosariocultura.gob.ar, 0
 rosario.gov.ar, 0
-roscadastr.com, 0
 roscosmos.ru, 0
 roseltorg.ru, 0
 rosen-group.com, 0
-rosinter.ru, 0
-rosix.ru, 0
-rosjb.com, 0
 roskazna.ru, 0
-roskonkursy.ru, 0
 rosminzdrav.ru, 0
-rosneft-lubricants.ru, 0
 rosrealt.ru, 0
-rosreestr.ru, 0
-rossia.org, 0
 rossiya-airlines.com, 0
 rossoverdi.com, 0
 rostec.ru, 0
-rosterbot.com, 0
 rostobr.ru, 0
 rostov-gorod.ru, 0
 rostrud.ru, 0
-roszavod.ru, 0
-rotfront.su, 0
-rot-weiss-erfurt.de, 0
-routdata.com, 0
-routemobile.com, 0
-routeradar.nl, 0
 routerclub.com, 0
 rouxa365.gr, 0
 royal-forest.org, 0
-royalkids.fr, 0
-royalquest.com, 0
 royalquest.ru, 0
 royalrobbins.com, 0
 royaninstitute.org, 0
 rozanehshop.ir, 0
 rozhlas.cz, 0
 rpg-city.de, 0
-rpicn.org, 0
 rpn.gov.ru, 0
-rp.ru, 0
-rpsofts.com, 0
-rqbao.com, 0
 rqnoj.cn, 0
 rrabbit.cc, 0
 rrc24.com, 0
-rrc.ru, 0
 rrjc.com, 0
-rscc.ru, 0
 rsc.org.uk, 0
 rsmu.ru, 0
-rsnet.ru, 0
-rs.ro, 0
 rsr-olymp.ru, 0
 rs.ru, 0
 rssi.ru, 0
 r-stahl.com, 0
-rst.com.pl, 0
 rstore.in, 0
-rtc.bt, 0
 rte.ie, 0
-rtfund.com, 0
 rt-mart.com.cn, 0
-rtn.ch, 0
-rtr.at, 0
 rt.ru, 0
 rt-thread.org, 0
 rtv.rs, 0
 rtvs.sk, 0
 ru.ac.bd, 0
 ruan8.com, 0
-ruanman.net, 0
 ruanmei.com, 0
 rubarius.ru, 0
-ruberi.ru, 0
-rubezh.ru, 0
 rubhoz.com, 0
-rubikscube.info, 0
 ru-board.com, 0
-rubot.ovh, 0
 ruby-china.org, 0
 ruby-doc.org, 0
 ruby-forum.com, 0
-rubygroupe.jp, 0
-rucountry.ru, 0
-rudnikov.com, 0
-rugion.ru, 0
 ruguoapp.com, 0
 ruijie.com.cn, 0
 ru.is, 0
 rukzakoff.ru, 0
-rula.net, 0
 rulaws.ru, 0
 rummycircle.com, 0
 runeapps.org, 0
@@ -12196,151 +6835,79 @@
 runivers.ru, 0
 runningquotient.com, 0
 ruonu.com, 0
-ruooo.com, 0
-rupar.puglia.it, 0
-rusanu.com, 0
 rusat.com, 0
 rusdosug.com, 0
-ruselectronics.ru, 0
 rusempire.ru, 0
 rusevik.ru, 0
 rusfolder.com, 0
-rusfont.ru, 0
 rushydro.ru, 0
-rushy.fr, 0
 rusnano.com, 0
-rusnavi.org, 0
 ruspo.ru, 0
-rusreinfo.ru, 0
 russian-belgium.be, 0
-russian.space, 0
 russkaja-ohota.ru, 0
-rust1.ru, 0
-rustelekom.net, 0
 rustest.ru, 0
 rusticae.es, 0
 rustorrents.info, 0
-rutracker.cr, 0
-rutracker.net, 0
-rutracker.org, 0
 ruvape.club, 0
 ruvr.ru, 0
-ruweber.ru, 0
-rvm.io, 0
 r-v-s.su, 0
 rvv.de, 0
 rwth-aachen.de, 0
-ryady.ru, 0
 rybbaby.com, 0
 rybnik.pl, 0
-rynek-rolny.pl, 0
 rz.com, 0
-rzd-bonus.ru, 0
 rzeszow.pl, 0
 rzgmu.ru, 0
 s1homes.com, 0
 s3d4.cn, 0
 s4yy.com, 0
-saafi.com, 0
 sabayon.org, 0
 sabbuy.com, 0
-sabinahuang.com, 0
 sac.net.cn, 0
-sac.org.ar, 0
-sad6sotok.ru, 0
-sadaf22.com, 0
-sadalestikls.lv, 0
 sadc.int, 0
 sadeco.ir, 0
-sadkomed.ru, 0
-sadlyunfriended.com, 0
-sadovnik.mobi, 0
 sa.edu.au, 0
-saemes.fr, 0
 saezlive.net, 0
 safariran.ir, 0
 safarme.com, 0
 safc.com, 0
-safe2choose.org, 0
-safebridge.net, 0
 safedog.cn, 0
-safegoldgroup.com, 0
-safelayer.com, 0
 safer-networking.org, 0
-saferoadplus.com, 0
-safetree.com.cn, 0
 safe-ws.eu, 0
-saguenay.ca, 0
 sahamyab.com, 0
-sa-help.com, 0
 sahra.org.za, 0
 saibaba.org, 0
-saicgmac.com, 0
 saic-gm.com, 0
 saicmaxus.com, 0
-sai.co.za, 0
-saihs.edu.tw, 0
 sailingworld.com, 0
-saimanet.kg, 0
-saimatelecom.kg, 0
 saintpaul.edu, 0
-saintsouth.net, 0
 saipujianshen.com, 0
 saitama-u.ac.jp, 0
 saitreport.ru, 0
 saix.net, 0
-sakhalinenergy.ru, 0
 sakhtafzarmag.com, 0
-sak.sk, 0
 sakura.ne.jp, 0
-salairemoyen.com, 0
-salam.sch.ir, 0
-salatigakota.go.id, 0
-saldocuentarut.com, 0
 saleshood.com, 0
-sallyq.com.tw, 0
-salmon.com, 0
-salomon.ro, 0
 salon24.pl, 0
-salongweb.com, 0
-salonwith.com, 0
 salto.bz, 0
 saltwatersportsman.com, 0
-saludnqn.gob.ar, 0
 salzburgerland.com, 0
-samaraintour.ru, 0
-sambaum.ch, 0
-samberi.com, 0
 samedi.de, 0
 samemes.com.br, 0
-samenblog.com, 0
 sameroom.io, 0
 samesound.ru, 0
-samgasu.ru, 0
-samgau.com, 0
 samgups.ru, 0
 samihost.com, 0
 samohodoff.ru, 0
-samo.ru, 0
-sa-mp-servers.com, 0
 samregion.ru, 0
 samsung-fun.ru, 0
 samuraj-cz.com, 0
-samvirkebryggeriet.no, 0
 sandai.net, 0
-sandbox-immobilienscout24.de, 0
-sanderstechnology.com, 0
-sandilands.info, 0
-sandino.net, 0
-sandpay.com.cn, 0
 sangfor.com, 0
 sangfor.com.cn, 0
 sangoma.com, 0
 sangon.com, 0
-sanistaal.com, 0
 sanjieke.cn, 0
-sankai.com, 0
-sanog.org, 0
 sanquan.com, 0
 sanstv.ru, 0
 santaclaus-embassy.com, 0
@@ -12349,114 +6916,60 @@
 sanwen8.cn, 0
 sanwen.net, 0
 sapagroup.com, 0
-sapient.com, 0
 sapo.pt, 0
 sarasavi.lk, 0
-sardex.net, 0
 sarnovosti.ru, 0
-saro.me, 0
-sarrc.ru, 0
 sarvserver.com, 0
 sarvssl.com, 0
 sasac.gov.cn, 0
 saschina.org, 0
-sasek.tv, 0
-saske.sk, 0
-saskialund.de, 0
-sata.direct, 0
 satc.edu.br, 0
-sat-chit-ananda.org, 0
-satellogic.com, 0
 satel.pl, 0
-satisfaction-fnac.com, 0
-satka74.ru, 0
-satlyk.org, 0
-sat-online.ch, 0
-satterley.com.au, 0
 saturn-r.ru, 0
 satway.ru, 0
-saucontds.com, 0
-saudubna.ru, 0
-savage.ru, 0
 savechange.ru, 0
-savehrolling.com, 0
-saverglass.com, 0
 saveur.com, 0
 savevpn.cc, 0
-savjee.be, 0
-sa-voice.com, 0
-savoir-inutile.com, 0
 savvytime.com, 0
-sayamatravel.com, 0
 saystory.co.kr, 0
 sbar.com.cn, 0
-sbarjatiya.com, 0
 sb-dji.com, 0
-sberbankaktivno.ru, 0
 sberbank-ast.ru, 0
 sberbank.ua, 0
-sberinsurance-online.ru, 0
-sbk-studio.de, 0
 sbras.ru, 0
 sbrf.com.ua, 0
 sbroker.de, 0
 sbro.me, 0
 sbsart.com, 0
 sbs.edu.cn, 0
-sbsub.com, 0
 sbwml.cn, 0
-sbx-media.com, 0
-scala-ffb.de, 0
 scalebay.ru, 0
-scaleforum.ru, 0
 scalp-trading.com, 0
-scam.su, 0
-scanadu.com, 0
-scanbot.io, 0
-scand.com, 0
-scbn.org, 0
 scenedownloads.pw, 0
 scga.gov.cn, 0
 sc.gov.cn, 0
-schaeferhunde.de, 0
-schaffenburg.org, 0
-schaffner.com, 0
-schafkopf-palast.de, 0
 schieb.de, 0
-schlemann.com, 0
 schneider-electric.cn, 0
 schneider-electric.com, 0
 schneidersladen.de, 0
-schnick-schnack-schnuck.net, 0
-schokokeks.org, 0
 school2100.com, 0
-schooldeskus.com, 0
 school.nz, 0
 schoolofhaskell.com, 0
 schoolpal.cn, 0
 school-scout.de, 0
 schoolsoft.com, 0
-schornsteinfabrik.de, 0
-schule.de, 0
 schullv.de, 0
 schul-webportal.de, 0
 schwarzkopf.de, 0
 schweizmobil.ch, 0
 sci99.com, 0
 science-education.ru, 0
-science.ma, 0
-scienceontheweb.net, 0
 scientificrussia.ru, 0
-scientology.net, 0
 sci-hub.ac, 0
 sci-nnov.ru, 0
-scloud.ru, 0
-scmcc.com.cn, 0
-sc-nm.si, 0
 scoffoni.net, 0
 scoop.co.nz, 0
 scoop.it, 0
-scoop.ng, 0
 scorecloud.com, 0
 scotthelme.co.uk, 0
 scottlogic.com, 0
@@ -12464,68 +6977,43 @@
 scout.org.hk, 0
 scoutwiki.org, 0
 scrabble-word-finder.com, 0
-scrcu.com.cn, 0
-screen9.com, 0
 screenbid.com, 0
 screencastify.com, 0
-screenshotlink.ru, 0
-screenstore.tk, 0
 scriptbuy.ir, 0
-scriptmania.com, 0
 scriptux.ir, 0
-scrunch.com, 0
 scryde.ru, 0
 scsb.com.tw, 0
-scs-laboutique.com, 0
 scssoft.com, 0
-sctu.edu.cn, 0
 sctv.com, 0
 scubadiving.com, 0
 scu.edu.cn, 0
 scut.edu.cn, 0
 sdada.edu.cn, 0
 sde.ru, 0
-sdewt.com, 0
-sdf.org, 0
 sdi.bg, 0
 sdk.cn, 0
 sdl.com, 0
-sdln.net, 0
 sdnu.edu.cn, 0
-sdska.ru, 0
 sdsmt.edu, 0
-sdsz.com.cn, 0
 sd.ua, 0
 sdu.edu.cn, 0
 sdvor.com, 0
-sdwfhrss.gov.cn, 0
-sdw.org, 0
-sd-xbmc.org, 0
 sdyunban.com, 0
-se7enkills.net, 0
 se7en.ws, 0
 seacadets.org, 0
-sea.com.ua, 0
 seafile.com, 0
-sea-group.org, 0
 seamwork.com, 0
 searates.com, 0
-searchanise.com, 0
-searchevolution.com, 0
 search-for-it.com, 0
-searchmedia.ws, 0
 searchx.ch, 0
 searu.org, 0
 seasiaconsulting.com, 0
 seasone.ru, 0
-seaters.com, 0
 seattle.gov, 0
 seatwave.com, 0
-seatwave.de, 0
 seatwave.es, 0
 seatwave.ie, 0
 seatwave.it, 0
-seayo.com, 0
 sebastian.expert, 0
 sebraemg.com.br, 0
 sec.gob.mx, 0
@@ -12534,47 +7022,26 @@
 second24.ru, 0
 secp.gov.pk, 0
 secpulse.com, 0
-secretescapes.com, 0
 secureauthservice.com, 0
-securehost.ir, 0
-securelink.be, 0
-securenowindia.com, 0
-secureordering.com, 0
-secureprofile.ru, 0
-securerwsoft.de, 0
 secureserver.net, 0
 securitasdirect.fr, 0
 securitythinkerz.com, 0
 secutix.com, 0
-secv.com, 0
 sec-wiki.com, 0
 secye.com, 0
-sedittyhair.com, 0
 sedmitza.ru, 0
-sedns.cn, 0
 seec.com.tw, 0
 seeed.cc, 0
-seeleit.com, 0
 seemallorca.com, 0
 seetv.tv, 0
 seeyon.com, 0
-seezislab.com, 0
 se.gov.br, 0
 seg-social.pt, 0
-segurancajato.com.br, 0
 seibert-media.net, 0
-seidal.com, 0
 seidensticker.com, 0
 seis.ac.cn, 0
 seiyon.net, 0
-sejdemse.net, 0
-sekorm.com, 0
-sektaschool.ru, 0
 seldatdirect.com, 0
-selectedrecs.com, 0
-selenic.com, 0
-selestial.com, 0
-selfhost.bz, 0
 selfhost.de, 0
 selfhost.eu, 0
 selfhtml.org, 0
@@ -12583,22 +7050,16 @@
 selfip.net, 0
 selfip.org, 0
 selfmadetrip.com, 0
-selfnation.ch, 0
-selfrance.org, 0
 sellercloud.com, 0
 sellercloudlocal.com, 0
 sellercube.com, 0
 sellerlabs.com, 0
 sellermania.com, 0
-seller-online.com, 0
 sellfile.ir, 0
 selpics.com, 0
 selzir.com, 0
-sem-bw.org, 0
 semesteratsea.org, 0
 semiaccurate.com, 0
-semicvetic.com, 0
-semilab.hu, 0
 seminuevos.com, 0
 semmel.de, 0
 sem-tem.ru, 0
@@ -12606,81 +7067,53 @@
 senai.br, 0
 sendpulse.com, 0
 sendsay.ru, 0
-sendsms.az, 0
-sendyit.com, 0
 sengled.com, 0
 sense.com, 0
-sensorika.uz, 0
-sensorytechnologies.com, 0
 sentres.com, 0
 seodollars.com, 0
 seofangfa.com, 0
 seolib.ru, 0
-seomon.com, 0
-seo-protools.com, 0
-seopult.pro, 0
 seopult.ru, 0
 seo-summary.de, 0
 seoul.co.kr, 0
 seo-united.de, 0
 seowhy.com, 0
 sepidwebhost.com, 0
-septgame.com, 0
-seresco.es, 0
 serg-casper.ru, 0
-sergeisokolov.com, 0
-serifgungor.com, 0
 serj.ws, 0
-sertification.org, 0
-servebbs.com, 0
 servebeer.com, 0
-serveftp.com, 0
 serveftp.net, 0
 serveftp.org, 0
 servegame.com, 0
 servehttp.com, 0
 servel.cl, 0
-serveminecraft.net, 0
-server4u.cz, 0
 server4you.de, 0
 server4you.net, 0
-serverdale.com, 0
 server-he.de, 0
 server.ir, 0
 serveriran.net, 0
-server-it.net, 0
-servernesia.com, 0
 servernews.ru, 0
 serveromat.com, 0
 serverprofi24.com, 0
 serverprofi24.de, 0
-serverprofi24.net, 0
 server-sponsoring.com, 0
 service-schematics.ru, 0
 servispckupka.cz, 0
 servisvk.ru, 0
 servyou.com.cn, 0
 sestosg.net, 0
-setca.org, 0
-setia.pl, 0
 setmore.com, 0
-setonhill.edu, 0
 setti.info, 0
 seu.edu.cn, 0
 se-unsa.org, 0
 sevaft.cn, 0
 sevastopol.press, 0
-sev-eishockey.de, 0
 seven-sky.net, 0
-severstalgroup.com, 0
-sevidi.ru, 0
 sevpolitforum.ru, 0
-sevsu.ru, 0
 sevt.cz, 0
 sexacg.com, 0
 sexchats.ru, 0
 sexhotgames.com, 0
-sexkompas.me, 0
 sexlikereal.com, 0
 seznamzbozi.cz, 0
 sfacg.com, 0
@@ -12688,24 +7121,16 @@
 sfe8.com, 0
 sfedu.ru, 0
 sf-express.com, 0
-sff.gr, 0
 sfgame.cz, 0
 sfgame.de, 0
 sfgame.es, 0
 sfgame.fr, 0
-sfgame.gr, 0
 sfgame.hu, 0
-sfgame.it, 0
 sfgame.net, 0
 sfgame.pl, 0
-sfgame.ru, 0
-sfgame.sk, 0
 sfgame.us, 0
-sfgame.web.tr, 0
 sf-helper.com, 0
 sflep.com, 0
-sf-misis.ru, 0
-sformat.ru, 0
 sfs.gov.ua, 0
 sfuh.tk, 0
 sfu-kras.ru, 0
@@ -12713,44 +7138,29 @@
 sfy.ru, 0
 sg-autorepondeur.com, 0
 sgcc.com.cn, 0
-sgcc.uz, 0
 sgd.de, 0
 sgeb.bg, 0
 sglgroup.com, 0
 sgmw.com.cn, 0
-sgroshi.com.ua, 0
 sguo.com, 0
 sg-video.com, 0
-sgyy.com.cn, 0
 shab.ch, 0
 shade3d.jp, 0
-shadeyouvpn.com, 0
-shadowcraft.ru, 0
 shadowfly.org, 0
 shadowpad.jp, 0
-shadowsky.site, 0
 shadowsock.club, 0
-shadowsocks.im, 0
 shahinsoft.ir, 0
 shahroodut.ac.ir, 0
-shairart.com, 0
-shallmap.com, 0
 shamana.co, 0
 shanbay.com, 0
 shandongair.com.cn, 0
 shanghaidisneyresort.com, 0
-shanghai-electric.com, 0
 shanghaitech.edu.cn, 0
 shantou.gov.cn, 0
 shaogood.com, 0
-shaozi.info, 0
 shapingrain.com, 0
-sharaland.ru, 0
-sharcnet.ca, 0
-shardsonline.com, 0
 sharedbox.com, 0
 shareinstock.com, 0
-shareitforpcdl.com, 0
 sharengo.it, 0
 sharepoint.cn, 0
 sharesdk.cn, 0
@@ -12758,89 +7168,48 @@
 shatel.ir, 0
 shatelland.com, 0
 shatura.com, 0
-shatura.ru, 0
 shayuvpnn.com, 0
 shdf.gov.cn, 0
-shd.ru, 0
 shebaoonline.com, 0
 sheedantivirus.ir, 0
 sheencity.com, 0
-shengcaijinrong.com, 0
-shengchifoundation.org, 0
-shengjingvip.com, 0
-shengri.cn, 0
 shengyeji.com, 0
 shenzhan.in, 0
-shenzhenware.com, 0
 shenzhong.net, 0
 sherbrooke.qc.ca, 0
 sheridanc.on.ca, 0
 sherlock-holm.es, 0
 sherweb.com, 0
-shetabha.com, 0
-shgb.gov.cn, 0
-shgcx.org, 0
 sh.gov.cn, 0
-shhyolkovo.ru, 0
 shiep.edu.cn, 0
 shiftelearning.com, 0
-shiftinglight.com, 0
 shiftphones.com, 0
 shikimori.org, 0
-shimadzu.com.cn, 0
 shina.ru, 0
-shineon.cc, 0
 shinezone.com, 0
-shintorg48.ru, 0
 shippable.com, 0
 shipxy.com, 0
-shiqichan.com, 0
-shiqichuban.com, 0
 shirazwebhost.com, 0
-shirazwebhost.ir, 0
 shitou.com, 0
-shlyahten.ru, 0
-shmarathon.com, 0
 shmh.gov.cn, 0
 shmtu.edu.cn, 0
 shmu.sk, 0
-shockmodels.su, 0
 shoe.org, 0
 shoessale.com.ua, 0
-shomaresaz.ir, 0
 shom.fr, 0
 shooshmall.com, 0
 shooter.cn, 0
-shoot-n-joy.ru, 0
 shopandroid.com, 0
 shop-apotheke.com, 0
-shopbuilder.cz, 0
-shopbuilder.hr, 0
 shopbuilder.ro, 0
-shopbuilder.sk, 0
-shopcar.ir, 0
-shopdutyfree.eu, 0
 shop.hu, 0
-shopinamerica.am, 0
-shoplex.com, 0
-shop-lining.com, 0
 shop-logistics.ru, 0
 shopmania.bg, 0
 shopmania.biz, 0
-shopmania.com, 0
-shopmania.com.br, 0
-shopmania.com.mx, 0
-shopmania.co.uk, 0
-shopmania.co.za, 0
-shopmania.de, 0
 shopmania.es, 0
-shopmania.fr, 0
-shopmania.hr, 0
 shopmania.hu, 0
 shopmania.in, 0
 shopmania.it, 0
-shopmania.nl, 0
-shopmania.pl, 0
 shopmania.pt, 0
 shopmania.ro, 0
 shopmania.rs, 0
@@ -12848,71 +7217,46 @@
 shopnctest.com, 0
 shopozz.ru, 0
 shoppal.in, 0
-shoptimize.in, 0
 shop.unas.hu, 0
 shopvote.de, 0
 shorten.id, 0
-short.id, 0
 shost.ca, 0
-shoujichahao.com, 0
-shoujiduoduo.com, 0
-shouqianba.com, 0
 shouqu.me, 0
 shoushang.com, 0
 shouyeren.org, 0
 showapi.com, 0
 showjet.ru, 0
-showpark.info, 0
 showradyo.com.tr, 0
-shox.hu, 0
-shpt188.com, 0
 shrinktheweb.com, 0
-shtorm.com, 0
 shtrih-m.ru, 0
-shtukishop.ru, 0
 shuaigay.top, 0
 shuax.com, 0
 shufe.edu.cn, 0
 shunde.gov.cn, 0
 shunwang.com, 0
 shunxingkeji.com, 0
-shupl.edu.cn, 0
-shurup.net.ua, 0
 shuxuejia.com, 0
-shwebook.com, 0
-shwilling.com, 0
 shyaway.com, 0
-shyling.com, 0
 siamchart.com, 0
 siaranku.com, 0
 sia.ru, 0
 siasun.com, 0
-siava.ru, 0
-siberianet.ru, 0
 sibername.com, 0
-sibintek.ru, 0
-sibpsa.ru, 0
 sibsau.ru, 0
 sibstrin.ru, 0
 sibsutis.ru, 0
-sibvaleo.tv, 0
 sicau.edu.cn, 0
 sickoo.com, 0
 sicofi.com.mx, 0
-sidechef.com, 0
 sidex.ru, 0
 sidsavara.com, 0
 siedlce.pl, 0
 siedle.de, 0
-sielok.hu, 0
-sigaretnik.ru, 0
 sigfox.com, 0
-sigmabeauty.com, 0
 sigmasport.com, 0
 signfiles.com, 0
 sigsiu.net, 0
 sihaidiaoyu.com, 0
-sikoauktioner.se, 0
 silagames.com, 0
 silamp.it, 0
 silextimes.com, 0
@@ -12920,26 +7264,14 @@
 silijiren.info, 0
 silk.co, 0
 silkenowak.de, 0
-sil.org.pg, 0
 siluyuncang.com, 0
-silverspoons.ru, 0
-sim-auf-reisen.de, 0
-simm.ac.cn, 0
-simpatias.org, 0
 simple-aja.info, 0
 simplefx.com, 0
-simplemachines.ru, 0
 simplementegenial.cc, 0
 simpleminecraft.ru, 0
-simplenetkeeper.com, 0
-simplesite.com, 0
-simpleso.gr, 0
 simple-talk.com, 0
-simplewebrtc.com, 0
 simplix.info, 0
-simplix.ks.ua, 0
 simplytest.me, 0
-simpress.com.br, 0
 simuwang.com, 0
 sinaapp.com, 0
 sina.com.cn, 0
@@ -12951,287 +7283,136 @@
 sininonton.com, 0
 sinochem.com, 0
 sinofsx.com, 0
-sinonimus.ru, 0
 sinopec.com, 0
-sinopharm.com, 0
 sinosig.com, 0
 sinosoft.info, 0
 sintagespareas.gr, 0
-sintek-nn.ru, 0
 sinyi.com.tw, 0
 sioeye.cn, 0
-sioeye.com, 0
 sipac.gov.cn, 0
 sipo.gov.cn, 0
-sipsolutions.net, 0
-sipwise.com, 0
 sirvoy.com, 0
-sisalu.com.br, 0
 si-shell.net, 0
-sistel.es, 0
-sistemagorod.ru, 0
-sistemdestekuzmani.com, 0
-sisustusweb.ee, 0
 site40.net, 0
 site88.net, 0
-siteclinic.ru, 0
-siteencore.com, 0
 siteguarding.com, 0
-sitelement.sk, 0
-siterobot.com, 0
-site.ua, 0
 sito.ir, 0
-situstarget.com, 0
-siwatcher.ru, 0
-siwe.com.cn, 0
 sixsenses.com, 0
-sixtea.com, 0
 sjcamhd.com, 0
-sjc.edu.hk, 0
-sjedu.cn, 0
 sjtu.cn, 0
 sjtu.edu.cn, 0
-sjz.io, 0
-sk3w.se, 0
 skalnik.pl, 0
 skat-palast.de, 0
-skat-ups.ru, 0
 skauting.cz, 0
 skbank.com.tw, 0
-skechers.cn, 0
 sketchengine.co.uk, 0
 sketchpark.ru, 0
-skierniewice.pl, 0
 skifmusic.ru, 0
 skinak.ir, 0
 skincrates.com, 0
-skinpay.com, 0
 skinrenewal.co.za, 0
-skiosvetimany.cz, 0
-skiprefer.com, 0
 sk.kz, 0
 skn1.com, 0
 sknt.ru, 0
-skobbler.com, 0
-skobeeff.ru, 0
 skoda.com.cn, 0
-skoda.lv, 0
 skokie68.org, 0
 skoltech.ru, 0
-skr.de, 0
 skritter.com, 0
-skrivanek.cz, 0
 sktelecom.com, 0
 skuonline.ru, 0
-sky4buy.com, 0
 skyany.com, 0
-skybuy.ru, 0
-skycenter.aero, 0
-skydreamer.fr, 0
-skydreamer.info, 0
-skyf-host.com, 0
-skyfox.org, 0
 skygear.ru, 0
 skyinsurance.co.uk, 0
-skyluxtravel.com, 0
-skynetonline.solutions, 0
 skyocean.com, 0
-skyprep.com, 0
-skyrim-online.com, 0
-skytells.net, 0
 skywayinvestgroup.com, 0
 slack.com, 0
 slack-files.com, 0
 slack-imgs.com, 0
 slack-redir.net, 0
-slacky.eu, 0
-slatarow.de, 0
 slaters.co.uk, 0
-slav-dom.ru, 0
-slavia.by, 0
-slavyansk2.ru, 0
 slavyanskaya-kultura.ru, 0
-sldc.eu, 0
-sleep-calculator.com, 0
 slevadne.cz, 0
-slevhouse.cz, 0
-slicedinvoices.com, 0
-slidego.com, 0
 slide-life.ru, 0
-slinuxer.com, 0
-slio.cn, 0
-slitheriogameplay.com, 0
-slotboss.co.uk, 0
-slotboss.se, 0
-sloty-besplatno.net, 0
 slovodel.com, 0
 slunecnice.cz, 0
-slv.cz, 0
-small.kz, 0
 smarket.net.cn, 0
-smarp.com, 0
-smarpshare.com, 0
 smartafisha.ru, 0
-smartapps.fr, 0
-smartdollar.com, 0
-smartdot.com, 0
-smartdrugsforcollege.com, 0
-smarterdeal.co.uk, 0
-smartflowsheet.com, 0
-smarthosts.org, 0
-smarthoverboarder.fr, 0
-smarthoverboarder.it, 0
 smartisan.com, 0
 smartjobboard.com, 0
-smartlab.co.za, 0
-smartland.am, 0
 smartlog.jp, 0
-smartmedia.ws, 0
-smartmetrics.co, 0
 smart.net.ly, 0
-smartnweb.de, 0
 smartserials.com, 0
-smarttbot.com, 0
 smarty.cz, 0
 smartytoys.ru, 0
 smash.com, 0
 sma.so, 0
 smasurf.com, 0
-smath.info, 0
-sm.de, 0
-smec-cn.com, 0
 smed.ru, 0
 smetnoedelo.ru, 0
-smeup.com, 0
-sm.gov.cn, 0
-sm.gov.ua, 0
 smh.re, 0
-smi2.ru, 0
 sm-komandor.ru, 0
-smmplanner.com, 0
 smokepack.ru, 0
 smokingirl.org, 0
 smoothscroll.net, 0
 smotreshka.tv, 0
 smotri.com, 0
-smotriuchis.ru, 0
 smow.de, 0
 smsbrana.cz, 0
-smsdengi.com, 0
-smshare.fr, 0
-smshosting.it, 0
 smsmoney.ee, 0
 smspinigai.lt, 0
-sms-track.ru, 0
-smstronic.com, 0
-smter.ru, 0
-sm.ua, 0
 smuc.ac.kr, 0
 smvdu.ac.in, 0
 smxe.cn, 0
-smydh.cn, 0
 smyl.es, 0
-snacksbazzar.com, 0
-snacktools.net, 0
-snaga.si, 0
-snap2sex.nl, 0
 snapapp.com, 0
-snapchatonlineloginz.com, 0
 snapgene.com, 0
 snappii.com, 0
 snh48.com, 0
-snips.ai, 0
-snoska.ru, 0
-snowsports.org, 0
-snowtrails.com, 0
-snpmarket.com, 0
-snptc.com, 0
-snrt.ma, 0
 snssdk.com, 0
 snu.ac.kr, 0
-snugr.be, 0
-snv.sk, 0
 soargames.com, 0
-sobi.pro, 0
-sobs.com.au, 0
 sobt5.org, 0
 sobug.com, 0
-soccer-plaza.jp, 0
-sociafluence.com, 0
-social-health.net, 0
-social-net.me, 0
 socialquantum.ru, 0
-socialssap.org, 0
-socialsweethearts.de, 0
-socialtheater.com, 0
 socialtools.ru, 0
-social-touch.com, 0
 societe.com, 0
-socionet.ru, 0
 so.com, 0
-sodrk.ru, 0
-soe.com.ua, 0
-sofa-framework.org, 0
-sofotos.org, 0
 softconf.com, 0
-softether.net, 0
 softkey.ru, 0
-softline.com.pl, 0
 softlinegroup.com, 0
 softmath.com, 0
-softonit.ru, 0
-softros.com, 0
 softserveinc.com, 0
-softwareschmiede.org, 0
-softwaresystems.com, 0
-software.travel, 0
-sog-ict.nl, 0
-sogo.com.tw, 0
 sogou.com, 0
 so.gov.pl, 0
 sohucs.com, 0
-soireejumpin.fr, 0
 soiro.ru, 0
 sojson.com, 0
 sojump.cn, 0
 sojump.com, 0
 sojump.hk, 0
-sokka.cn, 0
 sokolniki.com, 0
 sokolov.ru, 0
 soku.com, 0
 solarcentury.com, 0
 solarianprogrammer.com, 0
 solarmanpv.com, 0
-solax-portal.com, 0
 solestruck.com, 0
-solidapps.co.uk, 0
 solidot.org, 0
 solid-profit.com, 0
 soloaffitti.it, 0
-solonetwork.com.br, 0
 solvege.net, 0
-solvvy.com, 0
 somebox.ru, 0
-somitel.pt, 0
 somonair.com, 0
 sonapresse.com, 0
-songo.com, 0
 sonikelf.ru, 0
 sonnenstaatland.com, 0
 soonnet.org, 0
-soorati.com, 0
-soorensystem.ir, 0
 sopot.pl, 0
 soprasteria.com, 0
-soroki.com, 0
-sorucevapla.com, 0
 sorz.org, 0
 sosista.com, 0
 sosobta.cn, 0
 sosobtc.com, 0
-sosowifi.com, 0
-sos.pl, 0
 sostronk.com, 0
 sotel.de, 0
 soti.net, 0
@@ -13240,107 +7421,59 @@
 soujuw.com, 0
 soujuw.net, 0
 soulkeepers.eu, 0
-soundcloudgroups.com, 0
 soundcream.net, 0
 soundgasm.net, 0
-so-ups.ru, 0
 sourcefabric.org, 0
-sourceguardian.ir, 0
 soushiti.com, 0
-southernexposure.com, 0
-southernfund.com, 0
 southmoney.com, 0
 southplainscollege.edu, 0
-souyidai.com, 0
-souz-m.ru, 0
 sov5.com, 0
 sovkusom.ru, 0
 sovtime.ru, 0
 soyoung.com, 0
 sp2all.ru, 0
 sp2.org, 0
-spacebagel.com, 0
-spacedock.info, 0
 spaceinvasion.info, 0
 spacem.cn, 0
-spaceorigin.fr, 0
 spaces.ru, 0
-spaceweb.hu, 0
-spac.me, 0
 spagobi.org, 0
-spagoworld.org, 0
-spanishprograms.com, 0
-spankwiki.org, 0
 spankwirecams.com, 0
-spanwords.info, 0
-spar.ch, 0
-sparcs.org, 0
 spar-dich-schlau.de, 0
-sparinc.com, 0
 sparkasse-landshut.de, 0
 spark.ru, 0
-sparrowsms.com, 0
 spawtz.com, 0
-spaziorc.net, 0
-spbappo.ru, 0
 spbgasu.ru, 0
-spbgut.ru, 0
 spbstu.ru, 0
 spb.su, 0
 spbu.ru, 0
 spbvedomosti.ru, 0
 spca.org.hk, 0
-spddl.de, 0
 spdns.de, 0
 spdns.org, 0
-speak-up.com, 0
 specialist.ru, 0
 spec-komp.com, 0
-specregion.ru, 0
-speech-guru.com, 0
 speechpad.pw, 0
 speechpad.ru, 0
 speedify.com, 0
-speedinvoice3.net, 0
-speedx.co, 0
 speedyshare.com, 0
-speeed.cn, 0
 speiyou.cn, 0
 speiyou.com, 0
-sperasoft.com, 0
 spesifikasiharga.com, 0
-spfu.gov.ua, 0
 sp.gov.br, 0
 sphero.com, 0
-spi0n.com, 0
 spigit.com, 0
-spihk.com, 0
-spikcompany.ru, 0
-spiketime.de, 0
-spinbackup.com, 0
-spir.fr, 0
-spitalspiridon.ro, 0
-spi.uz, 0
 spk.ru, 0
-splatterladder.com, 0
-splento.com, 0
 spl.info, 0
 splio.com, 0
 splitmetrics.com, 0
-splius.lt, 0
 spoilertime.com, 0
 spolo.org, 0
 spongepowered.org, 0
 sponsorpay.com, 0
 sportbedarf.de, 0
 sportbro.cc, 0
-sportcity74.ru, 0
 sportdiver.com, 0
 sportfishingmag.com, 0
-sportfort.ru, 0
-sporthit.ru, 0
-sportourism.id, 0
-sportovnidum.cz, 0
 sportovnivozy.cz, 0
 sportplayer.io, 0
 sportrider.com, 0
@@ -13349,29 +7482,16 @@
 sportsbetting.ag, 0
 sportsbikeshop.co.uk, 0
 sportsboom.tv, 0
-sportse.ru, 0
 sportspar.de, 0
 sports.ru, 0
 sportvision.rs, 0
 spot.im, 0
-spotsoon.com, 0
 sprashivai.ru, 0
-spravka333333.ru, 0
 spravka-mdv.ru, 0
 spravkatver.ru, 0
-spray.pk, 0
-spring96.org, 0
 springstreetads.com, 0
 sprintground.com, 0
-sprintinet.ru, 0
 sprit.org, 0
-sprucemeadows.com, 0
-spruethmagers.com, 0
-sprut.ru, 0
-spsdmasna.cz, 0
-spsd.net, 0
-spsejecna.cz, 0
-spsostrov.cz, 0
 spsr.ru, 0
 spurssh.com, 0
 sputnikipogrom.com, 0
@@ -13381,228 +7501,128 @@
 sqli.com, 0
 sqlitebrowser.org, 0
 sqlservercentral.com, 0
-s-quad.com, 0
 squick.me, 0
-squidge.org, 0
-squiresgardencentres.co.uk, 0
 squirt.org, 0
-squnity.com, 0
-sqybus.fr, 0
 sram.com, 0
 srb2.org, 0
 srcf.net, 0
-srgame.cc, 0
-srh-hochschule-berlin.de, 0
-srlabs.de, 0
 srovnanicen.cz, 0
 srt.gob.ar, 0
 srvgame.ru, 0
 sscat.cn, 0
 ssdax.com, 0
 ssd-life.com, 0
-ssd-life.ru, 0
 sse.com.cn, 0
-sseinfo.com, 0
-ssh91.net, 0
 sshida.com, 0
 s-shot.ru, 0
-ssig33.com, 0
-ssjoy.org, 0
 ssjsq.net, 0
-sskaje.me, 0
-ssl-brn.de, 0
 ssllabs.com, 0
-sslpost.com, 0
 sslunblocker.com, 0
-ssm.gob.mx, 0
 ssmu.ru, 0
 ssn.gob.ar, 0
 ssorz.com, 0
-sspaas.com, 0
-sspanda.com, 0
 ssrj.com, 0
-ssr-russia.ru, 0
 ssspeed.net, 0
-sstl.co.uk, 0
-ssuu.org, 0
 ssvpn.vip, 0
 ssw.com.au, 0
 ss.wtf, 0
 stac.co.ao, 0
 stackage.org, 0
-stacktile.io, 0
 stadium.ru, 0
-stadtfeuerwehr-weiz.at, 0
-stadt-helmstedt.de, 0
 stadtmobil.de, 0
-stadttheater-giessen.de, 0
 staffpoint.fi, 0
-staforceteam.ru, 0
-stagend.com, 0
-stahl.de, 0
-stairways.com, 0
-stalcraft.ru, 0
 stalker.land, 0
-stalker-shop.ru, 0
-stamboomforum.nl, 0
 stample.co, 0
 stampsy.com, 0
-standa.lt, 0
-standardfacile.com, 0
 stanford.edu, 0
 stanfy.com, 0
 stanmus.ru, 0
 staradworld.com, 0
-staramba.com, 0
 staraya-moneta.ru, 0
 starchefs.com, 0
 star-citizens.de, 0
-starduster.me, 0
 starfandom.com, 0
-star-force.com, 0
 stargard.pl, 0
-stargatesys.com, 0
-starislandgames.com, 0
-starleaf.com, 0
 starline-online.ru, 0
-starlink.ru, 0
-starmediafilm.com, 0
-stars-cloud.com, 0
 starship.xyz, 0
-startcomca.com, 0
-startcom.org, 0
 startdedicated.com, 0
 startdedicated.de, 0
-startdedicated.net, 0
 startsearch.org, 0
 startsmile.ru, 0
 startssl.com, 0
 startss.today, 0
-startus.cc, 0
-state.ak.us, 0
 state-of-mind.de, 0
 state.or.us, 0
-statfuse.com, 0
 statgrad.org, 0
-status301.net, 0
-statusmoto.ru, 0
 stat.uz, 0
 staubli.com, 0
-stavregion.ru, 0
 stayfriends.de, 0
 stayge.net, 0
 stays.io, 0
 stb.com.mk, 0
 st-clair.net, 0
 stcn.com, 0
-stealthy.co, 0
-steam.az, 0
-steambroker.com, 0
-steammoney.com, 0
 steamrepcn.com, 0
 steam-trader.com, 0
 steelalborz.com, 0
-steelorse.com, 0
 stefanini.com, 0
 steinberg.de, 0
 steinberg.fr, 0
 steinberg.net, 0
 steinigke.de, 0
-stelderverspeek.com, 0
 stellenticket.de, 0
 stepan.com, 0
-stepclub.ru, 0
-stephencleary.com, 0
-stephenwebster.com, 0
-sterlinginfosystems.com, 0
-stetsom.com.br, 0
-stevecookhealth.com, 0
 stevejenkins.com, 0
 stewardship.com, 0
 stfalcon.com, 0
-stforex.com, 0
-sth.ac.at, 0
 stickyadstv.com, 0
 stiesia.ac.id, 0
 stirileprotv.ro, 0
 stiripesurse.ro, 0
 stis.ac.id, 0
-st-link.com.cn, 0
 stlouisfed.org, 0
 stluke.com.ph, 0
 sto.cc, 0
-stockfuse.com, 0
-stockinthechannel.com, 0
 stockinthechannel.co.uk, 0
 sto.cn, 0
 stolle.ru, 0
 stoloto.ru, 0
-stomatorg.ru, 0
 stom.ru, 0
 storeapps.org, 0
 storemags.com, 0
-storii.com, 0
 stormss.us, 0
-stormway.ru, 0
-stor.re, 0
-storymixmedia.com, 0
-storyworth.com, 0
 stradeanas.it, 0
-strafbuch.de, 0
 strangled.net, 0
 strategya.com, 0
 strategyanalytics.com, 0
-strategy-p.co.jp, 0
 stratoserver.net, 0
 stray.love, 0
 str.by, 0
-streamatehelp.com, 0
 streamatemodels.com, 0
 streamcatcher.de, 0
 streamcraft.net, 0
-streamenergybilling.com, 0
-streamify.me, 0
-streamingtank.com, 0
 streamjar.tv, 0
 streampub.net, 0
 streeetchypants.com, 0
-streetbank.com, 0
 streetmeatasia.com, 0
 strelkacard.ru, 0
 stressfree.pl, 0
-strmama.ru, 0
-stroeerdigitalpublishing.de, 0
-stroi-baza.ru, 0
-stroi-ka.by, 0
 stroitelstvosovety.ru, 0
-strollup.in, 0
 stronazen.pl, 0
-stronger.se, 0
 stroygigant.ru, 0
 stroylandiya.ru, 0
 stroysvoimirukami.ru, 0
 strunz.com, 0
-sts-niendorf.de, 0
-studierenplus.de, 0
-studio-fashion.com, 0
 studiorent.ru, 0
-studio-seo.org, 0
 studybay.com, 0
-studystays.com.au, 0
-stu.edu.vn, 0
 stuffio.com, 0
 stuq.org, 0
-sturmtools.ru, 0
 stusz.com, 0
-stuttcars.com, 0
 stylingandroid.com, 0
-stylished.de, 0
 su0.ru, 0
-suanfazu.com, 0
 subfactory.fr, 0
 sublinet.com, 0
 submail.cn, 0
-subnets.ru, 0
 suche6.ch, 0
 sudact.ru, 0
 suda.edu.cn, 0
@@ -13613,58 +7633,35 @@
 su.edu, 0
 sues.edu.cn, 0
 sufficientvelocity.com, 0
-suffieldacademy.org, 0
-sugon.com, 0
 suitaweb.net, 0
-suiyueyule.com, 0
-suketiawan.com, 0
-sukl.sk, 0
 sulinet.hu, 0
 sulrevendas.com.br, 0
-sumanet.cz, 0
 sumaou.com, 0
-sumavision.com, 0
 sumdu.edu.ua, 0
-summa-prefis.com, 0
 sumochka.com, 0
-sumpay.cn, 0
 sumtel.ru, 0
 sunagesh.com, 0
-sunallies.com, 0
 sunbox.cc, 0
 suncco.com, 0
-sundaynews.co.zw, 0
 sundray.com.cn, 0
 sundukup.ru, 0
 sunfar.com.tw, 0
 suninfo.com, 0
 suning.cn, 0
 suning.com, 0
-suninian.com, 0
-sunkei.edu.hk, 0
 sunland.org.cn, 0
 sunlands.com, 0
-sunmnet.com, 0
-sunny-dessous.de, 0
-sunnyos.com, 0
-sunrav.ru, 0
 sunrise74.com, 0
 sunshine-live.de, 0
 sunskypars.ir, 0
-suntech-power.com, 0
-suntektech.com, 0
 sunwenqi.cn, 0
 suonuo.net, 0
 supaprice.co.uk, 0
 supardi.net, 0
-supbiotech.fr, 0
-supcon.com, 0
 superb.net, 0
 superbotanik.net, 0
-super-cena.rs, 0
 superguiaargentina.com.ar, 0
 superhosting.cz, 0
-supermagnete.at, 0
 supermagnete.ch, 0
 supermagnete.de, 0
 supermagnete.es, 0
@@ -13672,94 +7669,50 @@
 supermagnete.it, 0
 supermap.com, 0
 supernano.com, 0
-superpedestrian.com, 0
 superphysique.org, 0
-supersoused.cz, 0
-supersyntages.gr, 0
-supertelahd.com, 0
-supertransporte.gov.co, 0
-supervia.com.br, 0
 super-warez.net, 0
-superweibu.com, 0
 supl.biz, 0
 suplementosbrasil.org, 0
 suppore.cn, 0
-sura.ru, 0
-surbtc.com, 0
-surebak.com, 0
 sureserver.com, 0
 suresupport.com, 0
-surfingbird.com, 0
-surfingbird.ru, 0
-surlybrewing.com, 0
-surong360.com, 0
-suroot.com, 0
-surpk.ru, 0
 surplussales.com, 0
-surprizim.net, 0
 surtime.com, 0
-surveylegend.com, 0
 survivaldub.com, 0
 sushishop.ru, 0
 sustc.edu.cn, 0
 sust.edu.cn, 0
 susu.ru, 0
 sut.ru, 0
-suuntoshop.ir, 0
 suwalki.pl, 0
 suwon.ac.kr, 0
-suws.org.uk, 0
-suxilog.com, 0
 suzlon.com, 0
 suzuki-china.com, 0
 sv98.de, 0
 svadbagolik.ru, 0
 svadebka.ws, 0
 svarecky-obchod.cz, 0
-svarforum.cz, 0
-svastour.ru, 0
-svcc.edu, 0
-sv.co, 0
 sven.de, 0
-svenskenergi.se, 0
 sverbihina.com, 0
 svetofor.info, 0
 svetosila.ru, 0
 s-vfu.ru, 0
-svgc.ru, 0
-svicenter.com, 0
 svijet-medija.hr, 0
-svirel.org, 0
 svlfg.de, 0
-svmed.spb.ru, 0
 svobodni.cz, 0
-svoy-golos.ru, 0
 svp-team.com, 0
-svsbb.sk, 0
 svyaznoy.ru, 0
-svyturioarena.lt, 0
 svzt.ru, 0
 swagbucks.com, 0
-swagelok.com.cn, 0
-swamiji.tv, 0
-swannetoscar.com, 0
 swan.sk, 0
 swcszx.com, 0
 sweatband.com, 0
-sweek.com, 0
 sweet211.ru, 0
-swfmax.com, 0
 swfr.de, 0
-swidnik.pl, 0
-swiftirc.net, 0
 swiftzer.net, 0
-swi.mx, 0
-swis.cn, 0
 swissgolden.com, 0
 swissmedical.com.ar, 0
-swjoy.com, 0
 swjtu.edu.cn, 0
-swoop.com, 0
 swpu.edu.cn, 0
 sws.cz, 0
 swsu.org, 0
@@ -13767,8 +7720,6 @@
 swu.edu.cn, 0
 swufe.edu.cn, 0
 swust.edu.cn, 0
-sxcert.com, 0
-sxchfz.com, 0
 sxe-injected.com, 0
 sxrczx.com, 0
 syau.edu.cn, 0
@@ -13776,45 +7727,31 @@
 sygic.com, 0
 sygnity.pl, 0
 syischina.com, 0
-symmetry.com, 0
 symphonic-net.com, 0
-symptoma.com, 0
 synchronkartei.de, 0
 synchronoss.com, 0
 syncis.com, 0
 syncthing.net, 0
 sync-video.com, 0
-syndriver.com, 0
 synergize.co, 0
 synevo.by, 0
-synlab.org.cn, 0
 synology.me, 0
-syronex.com, 0
 sysadmin.ru, 0
-sys-advisor.com, 0
 sys-con.com, 0
 sysfx.com, 0
 syslinux.org, 0
 syssel.net, 0
-systech.hu, 0
-systec.ru, 0
-systena.co.jp, 0
-systextil.com.br, 0
-systtech.ru, 0
 systutorials.com, 0
 sysucc.org.cn, 0
 sysu.edu.cn, 0
 sytes.net, 0
-syure.com, 0
 sz12333.gov.cn, 0
 sz189.cn, 0
 szaic.gov.cn, 0
 szamlakozpont.hu, 0
 szcredit.com.cn, 0
 szcredit.org.cn, 0
-szeged.hu, 0
 szft.gov.cn, 0
-szgaj.cn, 0
 szgalaxy.com, 0
 sz.gov.cn, 0
 szgs.gov.cn, 0
@@ -13827,56 +7764,38 @@
 szm.com, 0
 szmqs.gov.cn, 0
 szn-ural.ru, 0
-szone-online.net, 0
 szone-online.so, 0
-szpilot.com.cn, 0
-szrtc.cn, 0
-szsce.si, 0
 szscjg.gov.cn, 0
 szse.cn, 0
 szsi.gov.cn, 0
 szsti.gov.cn, 0
 sztb.gov.cn, 0
 szu.edu.cn, 0
-szvc.com.cn, 0
 szweb.cn, 0
 szweiflr.cn, 0
-sz-ybbs.ac.at, 0
 szybko.pl, 0
 szzfgjj.com, 0
 t2bot.ru, 0
-t2cksec.net, 0
 t4vps.eu, 0
 t4-wiki.de, 0
-table.co, 0
 tablepress.org, 0
 tabletki.ua, 0
-tablette-store.com, 0
 tabloidpulsa.co.id, 0
 tabnak.ir, 0
-tabris.ru, 0
 tabsbook.ru, 0
 tabstabs.com, 0
-tacr.cz, 0
 tactileo.fr, 0
 ta.de, 0
 tado.com, 0
-tagancity.ru, 0
-tagan.ru, 0
 tagplus.com.br, 0
 tagul.com, 0
 taifedu.gov.sa, 0
-taifungbank.com, 0
 tailtarget.com, 0
 taimen.com, 0
-taimyr24.ru, 0
 taipeifubon.com.tw, 0
-taipit.ru, 0
 taizhou.gov.cn, 0
 tajinfo.org, 0
 takcloud.com, 0
-takeeateasy.be, 0
-takeeateasy.fr, 0
 takibu.com, 0
 taknet.ir, 0
 takprosto.cc, 0
@@ -13884,164 +7803,86 @@
 taktaserver.ir, 0
 takufile.com, 0
 talicai.com, 0
-talkabroad.com, 0
-talkfunnel.com, 0
 talkingcoder.com, 0
 talkingdata.com, 0
-talkmate.com, 0
-taller.su, 0
 tallynine.com, 0
 talon.by, 0
 tamasha.ir, 0
-tamera.org, 0
-tamilrockers.in, 0
-tangrui.wang, 0
 tangtao.net.cn, 0
-tanteng.me, 0
 tanzpol.org, 0
-taobao-0.com, 0
-taobaokhv.ru, 0
 taoche.com, 0
 taocrm.com, 0
 taodaxiang.com, 0
 taofl.cn, 0
 taokezhushou.com, 0
 taomee.com, 0
-taoqian123.com, 0
 taoqueqiao.com, 0
-taoshijie.com, 0
 taotaosou.com, 0
-taozj.org, 0
-tapgerine.com, 0
-tapki.com, 0
-ta.pl, 0
 tapochek.net, 0
-tappx.com, 0
 tarelki.com.ua, 0
 targethunter.net, 0
-tarlogic.com, 0
-tarr.hu, 0
-taschibra.com.br, 0
 tas-ix.net, 0
 taskobox.com, 0
-taskrow.com, 0
-tasnim.co, 0
-tataelxsi.co.in, 0
 tatar-inform.ru, 0
 tatar.ru, 0
 tatenergosbyt.ru, 0
 tatler.ru, 0
 tatneft.ru, 0
 tattelecom.ru, 0
-tattoomaster-shop.ru, 0
-tatukgis.com, 0
-tauernspakaprun.com, 0
 tavanir.org.ir, 0
 taxfreeshops.jp, 0
-taximaxim.com, 0
 taxisaturn.ru, 0
-taxnet.ru, 0
-taxo-parei-sto-kranio.com, 0
-taydoo-photographic.de, 0
-tayfunozer.com, 0
 taylors.edu.my, 0
-tazablog.com, 0
-tazzobikes.com, 0
-tbsign.cn, 0
-tca.com.br, 0
-tcc-clan.de, 0
-tcc.com.ua, 0
-tcdn.co, 0
 tc.edu.tw, 0
 tcgolestan.ir, 0
 tchkcdn.com, 0
-tci-dm.jp, 0
 tcl.com, 0
 tclkuyu.com, 0
-tczew.pl, 0
-tdf.fr, 0
 tdk.com, 0
 tdmu.edu.ua, 0
 tdx.com.cn, 0
 tdyun.com, 0
-teacher-of-russia.ru, 0
 teachersammy.com, 0
 teachers.io, 0
-teachfirst.de, 0
 teachvideo.ru, 0
-team29.org, 0
 teambition.net, 0
-teammelli.ir, 0
 teamshub.com, 0
-teamspeak-connection.de, 0
 team-ulm.de, 0
-teamxlink.co.uk, 0
-teanazar.com, 0
 teasermedia.net, 0
-teatrviktuka.ru, 0
-tecadmin.net, 0
-tecart.de, 0
 teccart.qc.ca, 0
 techglimpse.com, 0
-techloop.io, 0
-techmart.ir, 0
-techmeme.com, 0
-techno4ever.fm, 0
-technoblood.com, 0
 technocity.ru, 0
-techno-co.ru, 0
 technodom.kz, 0
-techold.ru, 0
-tech-on-air.com, 0
 techprom.ru, 0
 techraptor.net, 0
 techshot.ir, 0
-techwarelabs.com, 0
 techytalk.info, 0
 tecnoandroid.it, 0
-tecnohardclan.com, 0
 tecnolegis.com, 0
 tecno-mobile.com, 0
-tecnova.com.br, 0
 tecpt.com, 0
-tecsanpedro.edu.mx, 0
 tedliou.com, 0
 tedox.de, 0
-teflexpress.co.uk, 0
-teg.cn, 0
-tehiku.nz, 0
-tehnika4u.ru, 0
 tehnocentr.ru, 0
 tehnoland.lv, 0
 tehnomaks.ru, 0
-tehnomarket-ural.ru, 0
-tehnomir.com.ua, 0
-tehnorama.ru, 0
 tehnosila.ru, 0
 tehnoskarb.com.ua, 0
 tehprime.ru, 0
 tehrannews.ir, 0
 tekirdagnethaber.com, 0
-tekken-net.kr, 0
-teknic.com, 0
-teknikbilimler.net, 0
-teknokrat.ac.id, 0
 teknomobil.org, 0
-teknostation.net, 0
 tekscan.com, 0
 tekzen.com.tr, 0
-telconet.net, 0
 tele2.kz, 0
 telecable.es, 0
 telecamera.ru, 0
 telecentro.com.ar, 0
 telecom.by, 0
-telecomjs.com, 0
 telecom.kz, 0
 telefen.com, 0
 telefonica.de, 0
 telegraf.uz, 0
-telegramfriends.com, 0
 telekarta.tv, 0
 telekom.com, 0
 telekritika.ua, 0
@@ -14050,18 +7891,14 @@
 telenet.ru, 0
 telenor.dk, 0
 teleos.ru, 0
-tele-plus.ru, 0
 teleport.org, 0
-teleschau.de, 0
 teletal.hu, 0
 teletrade-asia.com, 0
 teletrade-dj.com, 0
 teletrade.ru, 0
 telin.co.id, 0
 telkomsel.com, 0
-tellefsen.net, 0
 telonko.com, 0
-telsome.es, 0
 teltec.de, 0
 template-help.com, 0
 templatemonster.com, 0
@@ -14069,154 +7906,78 @@
 tempodisconti.it, 0
 temptationgifts.com, 0
 tencent.click, 0
-tendata.cn, 0
 tenddata.com, 0
 tenderplan.ru, 0
 tengrinews.kz, 0
-tennis-classim.net, 0
-tennisplayer.net, 0
-tenpointcrossbows.com, 0
-tensquaregames.com, 0
 tentorium.ru, 0
 tenvis.com, 0
-tera-byte.com, 0
-teralytics.net, 0
-teraserver.ir, 0
-tercihkitabevi.com, 0
-terema.com.br, 0
 teremok.ru, 0
 terra.im, 0
-terra.org, 0
 terrapinn.com, 0
-terredepeche.com, 0
 tesbuys.com, 0
 teshehui.com, 0
-tesli.com, 0
 tesoon.com, 0
 tesser.ru, 0
-testberichte.de, 0
-testdebit.info, 0
 testerhome.com, 0
 testforhost.com, 0
 testfreaks.com, 0
-test-hf.su, 0
-testkrok.org.ua, 0
-testomato.com, 0
 testvelocidad.eu, 0
 testwo.com, 0
-tetimes.com, 0
-tetranet.com.ua, 0
 tet.tv, 0
-teutloff-bs.de, 0
-texnoera.com, 0
 text-compare.com, 0
-textgears.com, 0
-textory.io, 0
 text.ru, 0
 tezign.com, 0
 tf2mart.net, 0
 tfb.ru, 0
-tfedu.net, 0
 tfm.ro, 0
 tfreeca2.com, 0
 tfshops.com, 0
-tfzq.com, 0
 tga-arsh.ir, 0
 tgl.ru, 0
 tgram.ru, 0
 th7.cn, 0
-thaiadpoint.com, 0
-thaibulksms.com, 0
-thaicsgo.com, 0
-thaigovno.com, 0
-thajsky-raj.cz, 0
 thalesgroup.com, 0
-thalia.hu, 0
 thali.ch, 0
 thanks-shine.com, 0
 thatvidieu.com, 0
 the5fire.com, 0
-thebeautyeffect.com, 0
-thebeautyplace.com, 0
-thebeerplanet.com.br, 0
 thebigchoice.com, 0
 thebigplans.ru, 0
 theblueprint.ru, 0
-thebreakroom.org, 0
-the-bride.ru, 0
-thecheat.co.kr, 0
 thecodecampus.de, 0
-thecoffeecompass.com, 0
-thecompletewebhosting.com, 0
 thecryptochat.net, 0
 thecus.com, 0
 thecustomizewindows.com, 0
-thedoschool.org, 0
-thedrakehotel.ca, 0
-theearthawaits.com, 0
-thefirstgive.com, 0
-thegeeksalive.com, 0
 theidentitypages.com, 0
 the-impish-ink.de, 0
-theindependentsf.com, 0
-thejesuitpost.org, 0
-thekcs.net, 0
 the-ken.com, 0
-thekua.com, 0
 thelibrarystore.com, 0
-thelife.com, 0
 thelongdark.ru, 0
 themaclife.com, 0
-themall.bg, 0
 themall.it, 0
 themefarmer.com, 0
 themient.com, 0
 themill.com, 0
 themusic.today, 0
-thenct.org.za, 0
 thenews.kz, 0
 theparkingspot.com, 0
-theprayerbook.info, 0
 theqarena.com, 0
 therange.co.uk, 0
-therealistictrader.com, 0
-therme.sk, 0
 thermomix.com, 0
-thesecretsofyoga.com, 0
-thesocietea.org, 0
-thesparxitsolutions.com, 0
 thestar.com.my, 0
 thestation.ru, 0
 thesycon.de, 0
 theteenboy.com, 0
-thewaiting-room.net, 0
 thewalrus.ru, 0
-thewatchtv.com, 0
-thewebtemplate.com, 0
-thg-kiel.de, 0
-thiememeulenhoff.nl, 0
-thinformatics.com, 0
 thinkingstorm.com, 0
 thinklocal.co.za, 0
-thinkmobiles.com, 0
-thinstuff.com, 0
 thirtymall.com, 0
 thisismyjam.com, 0
-thmmy.gr, 0
-thngs.co, 0
-thosmos.org, 0
 threema.ch, 0
 thruhere.net, 0
-thtf.com.cn, 0
-thuis.nl, 0
-thumbalizr.com, 0
 thumbnail-download.com, 0
-thunderforest.com, 0
 thunderquote.com, 0
-thunderstorm.pw, 0
 thus.ch, 0
-thuthuatvoz.com, 0
-ti8m.ch, 0
 tiancity.com, 0
 tianhong.cn, 0
 tianjinwe.com, 0
@@ -14225,243 +7986,153 @@
 tianti.io, 0
 tianyabagua.cn, 0
 tianyancha.com, 0
-tibame.com, 0
 ticka.it, 0
-tickeos.de, 0
 ticketflap.com, 0
 ticketgo.com.tw, 0
 tickets.az, 0
 tickets.com.tr, 0
-tickets.co.th, 0
 tickets.kz, 0
 tickets.pl, 0
 tickets.ru, 0
 tickets.ua, 0
 tickmill.com, 0
-tickmill.co.uk, 0
 ticp.net, 0
-ticsystem.co, 0
 ticwear.com, 0
 tidbits.com, 0
 tiendatiger.es, 0
-tienve.org, 0
 tierschutz-shop.de, 0
 tiff.net, 0
-tigase.org, 0
 tigergaming.com, 0
-tigra66.ru, 0
 tigrimigri.com, 0
-tilaa.com, 0
-tilab.com, 0
 timeface.cn, 0
-timeledger.com, 0
-timemanagement.es, 0
-time-master.ru, 0
 timepill.net, 0
 time.sc, 0
-timetoact.de, 0
-timetotrade.com, 0
-timios.com, 0
 timr.com, 0
 tingyun.com, 0
 tinkerpatch.com, 0
-tinned-software.net, 0
-tinohempel.de, 0
 tinper.org, 0
-tinycammonitor.com, 0
-tion.ru, 0
-tipdm.com, 0
 tiplanet.org, 0
 tipplap.hu, 0
 tipsport.sk, 0
 tiseagles.com, 0
-tiskarik.cz, 0
 tiss.edu, 0
-tiszacipo.hu, 0
 tita.com, 0
 titanic-magazin.de, 0
-titanix.net, 0
 titanpad.com, 0
-titans-servers.com, 0
 titrari.ro, 0
 titus.de, 0
 tixforgigs.com, 0
 tiyubisai.com, 0
 tizen.org, 0
-tjfdc.com.cn, 0
 tjms.jus.br, 0
-tjmt.jus.br, 0
 tjosm.com, 0
-tjournal.ru, 0
 tjpa.jus.br, 0
 tjto.jus.br, 0
 tju.edu.cn, 0
 tkbbank.ru, 0
-tk-chel.ru, 0
 tkgorod.ru, 0
 tl50.com, 0
-tlgrm.es, 0
 tlgrm.eu, 0
 tlgrm.ru, 0
 tlinx.cn, 0
 t-l.ru, 0
 tlushim.co.il, 0
-tmcaz.com, 0
 tmcnet.com, 0
 tmea.org, 0
 tmetric.com, 0
 tmg.nl, 0
-tmm-express.com, 0
 tmon.co.kr, 0
 tmoncorp.com, 0
 tmp.com, 0
-tmpyh.com, 0
 tmsf.com, 0
 tms.pl, 0
 tmweb.ru, 0
-tmy123.com, 0
 tn.edu.tw, 0
 tn.kz, 0
 tnpu.edu.ua, 0
-tns.lv, 0
 tns-ua.com, 0
 tntmusic.ru, 0
-tntrade.sk, 0
-tny.im, 0
 tobacco.com.cn, 0
 tobaccofreekids.org, 0
-tobem.jp, 0
 tobitcoin.biz, 0
 tochka.net, 0
-tocpeople.com, 0
 tode.cz, 0
 todoautos.com.pe, 0
-todogrowled.com, 0
 todojuguete.es, 0
 tofour.net, 0
-togas.com, 0
-togojoy.com, 0
 to.gov.br, 0
 tohkalove.com, 0
 toi-moi.com, 0
-toislam.ws, 0
-tokaweb.ir, 0
-tokheim.com, 0
-tokiohotel-fanclub.de, 0
-toko.edu.tw, 0
-tokotoukan.com, 0
 tokyo-city.ru, 0
 tokyo.jp, 0
 tokyonothot.com, 0
 tokyotower.co.jp, 0
-tolk-a.com, 0
-tol.org, 0
 tomato.it, 0
 tomica.ru, 0
-tomintech.ru, 0
-tomoon.cn, 0
 tom.ru, 0
-tomsarkgh.am, 0
 tomsk.gov.ru, 0
-ton.eu, 0
 tongbu.com, 0
 tongda2000.com, 0
 tonghuacun.com, 0
 tongji.cn, 0
 tongji.edu.cn, 0
-tonusclub.ru, 0
-tonyhead.com, 0
 tonytemplates.com, 0
 toobug.net, 0
 toontownrewritten.com, 0
 toorot.com, 0
 tootoo.cn, 0
-top1game.com, 0
 top54.city, 0
 top55.info, 0
 top-channel.tv, 0
 topchrono.biz, 0
 topease.net, 0
-topfiles.ws, 0
 tophouse.ru, 0
-topide.com, 0
-top-inspector.ru, 0
-topkeren.com, 0
-toplist.cz, 0
-toplist.sk, 0
-topmedia.uz, 0
-topmovies31.xyz, 0
 topschool.com, 0
-top-shop.ru, 0
 top.st, 0
 top-technologies.ru, 0
 topthink.com, 0
-topwatch.ru, 0
 topzone.pw, 0
 torah-box.com, 0
 torchystacos.com, 0
 toread.com.cn, 0
-torgpit.ru, 0
 torhub.net, 0
 torquato.de, 0
 torrentbit.net, 0
-torrento.org, 0
 torrentsafe.com, 0
 torrentsgame.net, 0
 torrent-tv.in.ua, 0
-torshovsport.no, 0
 torun.pl, 0
 tosunkaya.com, 0
-totalk12.com, 0
 totaltele.com, 0
-toteme.com, 0
 totheglory.im, 0
 totogaming.am, 0
-touch-device.ru, 0
-touhou-online.net, 0
 touki.ru, 0
-tour-box.ru, 0
 touricoholidays.com, 0
 tourismthailand.org, 0
 tourister.ru, 0
-tourolib.org, 0
 toutapprendre.com, 0
 toutemonannee.com, 0
 toutrix.com, 0
 touzi.com, 0
-tovid.io, 0
-towerhamlets.sch.uk, 0
-toyota.si, 0
-toyshop.cz, 0
 toysperiod.com, 0
-tpay.me, 0
 tpg.ua, 0
 tplaboratorioquimico.com, 0
 tplink.com, 0
-tp-link.com.cn, 0
 tpprf.ru, 0
 tproger.ru, 0
-tpsgv.be, 0
 tpu.ru, 0
 tq.cn, 0
 trabzonspor.org.tr, 0
-trackglobe.com, 0
 trackingmore.com, 0
 trackmanic.com, 0
-trackntrade.com, 0
 trackofthewolf.com, 0
 trackpadmagic.com, 0
 trackvia.com, 0
 tractorpoint.com, 0
-tracuuhoso.com, 0
 trade-groups.ru, 0
 trademachines.com, 0
 trademachines.de, 0
-trademachines.es, 0
 trademe.co.nz, 0
-traderacademy.ru, 0
-traderguide.in, 0
-tradesmax.com, 0
 tradesystemjp.com, 0
 traditio.wiki, 0
 tradzone.net, 0
@@ -14469,67 +8140,36 @@
 traffic.ru, 0
 trafficstore.com, 0
 traficantes.net, 0
-trafi.com, 0
-trailerloop.de, 0
 trainpix.org, 0
 tramitesadistancia.gob.ar, 0
-trandent.com, 0
 transantiago.cl, 0
-transelectrica.ro, 0
 transformaniatime.com, 0
-transformify.org, 0
-transgd.com.cn, 0
 transindex.ro, 0
-translatesong.com, 0
 transmissionbt.com, 0
-transparencytoolkit.org, 0
-transportes.gov.br, 0
-transposh.org, 0
-transvilles.com, 0
 trantect.com, 0
 travelata.ru, 0
 travelbook.de, 0
 travelclub.es, 0
 travelcodex.com, 0
-travelsim.com, 0
-travelsim.ua, 0
-traystatus.com, 0
-trc.com, 0
-tre-al.jus.br, 0
 treasury.govt.nz, 0
-treatstock.com, 0
 trecnutrition.com, 0
-trecone.com, 0
 treds.co.uk, 0
-trendmagazin.ch, 0
 trendsideas.com, 0
-trenino-rosso-bernina.it, 0
 treolan.ru, 0
 tresorit.com, 0
 tretyakovgallery.ru, 0
-trexle.com, 0
-trialssherpabot.net, 0
 trian.net, 0
-trianz.com, 0
 triblio.com, 0
 tribuna.com, 0
 trifork.com, 0
-trinitigame.com, 0
-trinitydesktop.org, 0
 trinity-parts.ru, 0
 trioo.com, 0
-tripinview.com, 0
-tripplus.cc, 0
 tripsecrets.ru, 0
 tripsta.com, 0
 tripsta.net, 0
 trishara.com, 0
-tritiumnet.org, 0
 triumf.ca, 0
 triya.ru, 0
-tri-z.ru, 0
-trkraduga.ru, 0
-troi.de, 0
 trojmiasto.pl, 0
 trollhattan.se, 0
 trovamoda.com, 0
@@ -14540,47 +8180,28 @@
 trt24.jus.br, 0
 trtworld.com, 0
 truba.com, 0
-trucksale.ru, 0
 trucnet.com, 0
 trud.bg, 0
 trueconf.com, 0
-truefitness.com, 0
 true.io, 0
-truelaunchbar.com, 0
-truffls.de, 0
-trusek.com, 0
 trus-tech.com, 0
-trust-holod.ru, 0
 trustie.net, 0
 trustpay.eu, 0
 trustutn.org, 0
-tryndex.kz, 0
-trystack.cn, 0
-trytek.ru, 0
-ts3.cloud, 0
-tsagi.ru, 0
 tsargrad.tv, 0
 tsb.kz, 0
-tsci.com.cn, 0
 ts-coach.com, 0
-tseaudio.com, 0
 tse.moe, 0
 tsemporium.com, 0
 tsf.org.tr, 0
-tsign.cn, 0
-tsinetwork.ca, 0
 tsinghua.edu.cn, 0
 ts.kg, 0
-tsk-praha.cz, 0
 tsn.at, 0
 tsn.ua, 0
 tspu.ru, 0
 tssgroup.sk, 0
-tstn.ru, 0
 tsu.ac.th, 0
 tsu.edu, 0
-ttdoc.cn, 0
-ttdyy.tv, 0
 tthd.org, 0
 ttkd.cn, 0
 ttkdex.com, 0
@@ -14588,70 +8209,41 @@
 ttl.tj, 0
 tts.lt, 0
 ttwanda.com, 0
-ttyplus.com, 0
 ttz.com, 0
 ttzx.tv, 0
 tuan800.com, 0
 tuanche.com, 0
-tuanimg.com, 0
 tuars.com, 0
 tubeadvertising.eu, 0
-tubemate-download.com, 0
-tubeshopitalia.it, 0
 tuchuang.org, 0
 tucson-club.ru, 0
 tudelft.nl, 0
-tudip.com, 0
-tudor.lu, 0
 tudou.com, 0
-tuggle.co, 0
 tugraz.at, 0
-tuhocmang.com, 0
 tuigirl.com, 0
 tuit.uz, 0
-tu.koszalin.pl, 0
-tularegion.org, 0
-tulipsport.com, 0
 tuliu.com, 0
 tulotero.es, 0
 tuluoluo.com, 0
-tumar.fm, 0
-tumba.ch, 0
-tumix.ru, 0
-tunayachting.com.tr, 0
-tuneeca.com, 0
 tunestotube.com, 0
-tungee.com, 0
 tuningblog.eu, 0
 tunisietelecom.tn, 0
 tuntron.com, 0
 tuputech.com, 0
-turboconsult.cz, 0
 turbojetbooking.com, 0
-turbo-tec.eu, 0
-turchese.it, 0
 turiba.lv, 0
 turkegitimsen.org.tr, 0
 turkiyeburslari.gov.tr, 0
 turkiye.gov.tr, 0
-turku.center, 0
 turris.cz, 0
 tursvodka.ru, 0
-turtleacademy.com, 0
-tusdk.com, 0
-tushev.org, 0
 tus.si, 0
 tusur.ru, 0
-tutanota.com, 0
 tutanota.de, 0
-tutor.cz, 0
-tuttocollezioni.com, 0
 tuttoformazione.com, 0
 tutuapp.com, 0
 tutuapp.vip, 0
-tu-varna.bg, 0
 tuv.com, 0
-tuwlab.com, 0
 tuxedocomputers.com, 0
 tv189.com, 0
 tv5.zp.ua, 0
@@ -14660,86 +8252,49 @@
 tvcom.cz, 0
 tvdom.tv, 0
 tvfeed.in, 0
-tvfinternational.com, 0
-tv-impulse.ru, 0
 tvk6.ru, 0
 tv-nasha.ru, 0
 tvoe.ru, 0
-tvoi-instrument.com, 0
-tvoysad.ru, 0
 tvpublica.com.ar, 0
-tvsale.ru, 0
 tvservice.org, 0
-tvtune.net, 0
 tw1.ru, 0
 twbbs.org, 0
 twc.edu.hk, 0
-tweakboxapp.com, 0
 tweepsmap.com, 0
-twgg.org, 0
 twgogo.org, 0
-twickets.co.uk, 0
 twicopy.org, 0
-twistedmatrix.com, 0
-twitteroauth.com, 0
 twomini.com, 0
 twotiger.com, 0
 twrx.ru, 0
-twt.de, 0
 twzoa.info, 0
-txhack.cn, 0
 txiaohe.cn, 0
-txslicai.com, 0
-txslicai.com.cn, 0
-txvpn.top, 0
-txvpn.wang, 0
 tyc.edu.tw, 0
 tychy.pl, 0
-tynsoe.org, 0
-tyntec.com, 0
-typcn.com, 0
 typecho.me, 0
-typecodes.com, 0
 typhon.net, 0
 typo3.org, 0
-typografos.gr, 0
-typtest.ru, 0
-tyresystem.de, 0
-tyr.gift, 0
 tysa.ru, 0
-tyumedia.ru, 0
 tzbao.com, 0
 tzit.cn, 0
 tzqby.xyz, 0
 tzrl.com, 0
 tzyee.com, 0
-u9yy.com, 0
 uabc.mx, 0
 uade.edu.ar, 0
-uaes.com, 0
-ua.fm, 0
 ua.gov.tr, 0
 uakino.net, 0
 ualinux.com, 0
-uama.com.cn, 0
-uamaster.com, 0
 uapa.ru, 0
-uapeer.eu, 0
 uatoday.tv, 0
 ubejournal.biz, 0
 uberchord.com, 0
-uberfacil.com, 0
 uberspace.de, 0
 ubiobio.cl, 0
-uboachan.net, 0
 ub.ua, 0
-ubuntu-gr.org, 0
 ubuntukylin.com, 0
 uc.ac.id, 0
 ucasal.edu.ar, 0
-ucbuyco.com, 0
 uc.cl, 0
-ucdok.com, 0
 uc.edu, 0
 uce.edu.ec, 0
 uchat.co.kr, 0
@@ -14747,7 +8302,6 @@
 uchil.net, 0
 uchiuroki.ru, 0
 uci.cu, 0
-uciran.ir, 0
 uclv.cu, 0
 uclv.edu.cu, 0
 ucoin.net, 0
@@ -14758,20 +8312,11 @@
 ucpaas.com, 0
 uc.pt, 0
 ucptt.com, 0
-ucw.cz, 0
-uczc.cn, 0
 udg.edu, 0
-udg.mx, 0
-udinra.com, 0
-udi.pl, 0
 udmprof.ru, 0
-u-doktora.ru, 0
-uds18.ru, 0
 uedsc.com, 0
-uef.edu.vn, 0
 ueh.edu.vn, 0
 uel.br, 0
-uelzener.de, 0
 uem.mz, 0
 ueq.com, 0
 uer.ca, 0
@@ -14780,19 +8325,12 @@
 uestc.edu.cn, 0
 ueuo.com, 0
 ufa1.ru, 0
-ufa.ie, 0
 ufanet.ru, 0
-ufcfan.org, 0
-ufg.br, 0
 ufh.com.cn, 0
-ufibox.com, 0
 ufight.gr, 0
 ufmg.br, 0
 ufms.br, 0
 ufmt.br, 0
-ufoots.com, 0
-ufosend.com, 0
-ufpa.br, 0
 ufpb.br, 0
 ufrr.br, 0
 ufs.br, 0
@@ -14801,35 +8339,19 @@
 uft.edu.br, 0
 ufu.br, 0
 ufvjm.edu.br, 0
-ugg2nd.de, 0
 ugirls.com, 0
 ugm.ac.id, 0
 ugmk-telecom.ru, 0
-ugranow.ru, 0
-ugx-mods.com, 0
-uhc.gg, 0
 uhdog.com, 0
-uhrforum.de, 0
 ui001.com, 0
-uia.org, 0
-uilim.ru, 0
 uji.es, 0
-ujipin.com, 0
 ujs.edu.cn, 0
-uk2group.com, 0
-ukbiz.top, 0
-ukc.gov.ua, 0
 ukdefencejournal.org.uk, 0
 ukim.edu.mk, 0
 ukim.mk, 0
-ukipme.com, 0
 u-kor.cn, 0
 ukravto.ua, 0
-ukrdc.net, 0
-ukrdomen.com, 0
-ukrmap.biz, 0
 ukrmedia.center, 0
-ukroboronprom.com.ua, 0
 ukrstat.gov.ua, 0
 ukrtelecom.ua, 0
 uk.to, 0
@@ -14839,26 +8361,18 @@
 ulpgc.es, 0
 ultiboss.jp, 0
 ultimate-community.de, 0
-ultimedecathlon.com, 0
 ultradox.com, 0
 ulugov.uz, 0
-ulyaoth.net, 0
 umail.uz, 0
-umanis.com, 0
 umantis.com, 0
 umbro.com.br, 0
 umc.br, 0
 umich.mx, 0
 uminho.pt, 0
-umkbw.de, 0
 umnieroditeli.ru, 0
-umpay.com, 0
-umukunzi.rw, 0
 umu.se, 0
-umweltinstitut.org, 0
 um.wroc.pl, 0
 unacar.mx, 0
-unachi.ac.pa, 0
 unam.edu.ar, 0
 unam.mx, 0
 unand.ac.id, 0
@@ -14867,23 +8381,16 @@
 unas.hu, 0
 unasus.gov.br, 0
 unblockall.com, 0
-unblockbook.biz, 0
-unblockcn.com, 0
 unca.edu, 0
 unctv.org, 0
-undelete-file.ru, 0
 undiksha.ac.id, 0
 undip.ac.id, 0
-undo.it, 0
 unecon.ru, 0
 uned.es, 0
 unesp.br, 0
 unet.by, 0
-unet.cz, 0
 unet.edu.ve, 0
 unexplainablestore.com, 0
-ung.si, 0
-uni-altai.ru, 0
 unian.info, 0
 unian.net, 0
 unian.ua, 0
@@ -14891,16 +8398,13 @@
 uni-augsburg.de, 0
 uniba.it, 0
 uniba.sk, 0
-unibratec.edu.br, 0
 unic.ac.cy, 0
 unicamp.br, 0
-unicard.ge, 0
 unic.edu.ru, 0
 unicef-irc.org, 0
 unicen.edu.ar, 0
 uniconf.ru, 0
 unideb.hu, 0
-unident.se, 0
 uni.edu.ni, 0
 unifemm.edu.br, 0
 unifenas.br, 0
@@ -14908,73 +8412,45 @@
 uniforminsignia.org, 0
 uni-frankfurt.de, 0
 uni-freiburg.de, 0
-unigroup.com.cn, 0
 uni-heidelberg.de, 0
 unihost.com, 0
 uni-kassel.de, 0
-unila.edu.mx, 0
 unilever.com, 0
-unilever.com.cn, 0
 uni-lj.si, 0
 unimagdalena.edu.co, 0
 uni-mainz.de, 0
 unimal.ac.id, 0
 uni-mb.si, 0
-unimedmaringa.com.br, 0
-unimednatal.com.br, 0
-unimedribeirao.net, 0
 unimedrio.com.br, 0
 unimontes.br, 0
 uni-mysore.ac.in, 0
-uni-net.com.tw, 0
 unionesarda.it, 0
 unionpay.com, 0
 unionpayintl.com, 0
 unipdu.ac.id, 0
 unipus.cn, 0
-uniqa.ro, 0
 unisi.it, 0
 uni-sofia.bg, 0
-unisonserver.com, 0
-unistroyrf.ru, 0
 unitbv.ro, 0
 unitconverterpro.com, 0
-unitech-mo.ru, 0
 unitedbank.cn, 0
 united-host.de, 0
-unitequipment.com, 0
 unitins.br, 0
-unitraklub.pl, 0
 unium.ru, 0
 univadis.de, 0
-univap.br, 0
-universal-job.ch, 0
 universal.se, 0
-universiada.eu, 0
 universitego.com, 0
-university.kg, 0
-universityofsantamonica.edu, 0
-universtudio.ru, 0
 univertv.org, 0
 uniview.com, 0
 univille.edu.br, 0
-uni-weimar.de, 0
-unix4lyfe.org, 0
 unixstorm.org, 0
 uniyar.ac.ru, 0
-unlimitedworld.de, 0
 unlp.edu.ar, 0
-unmo.ba, 0
-unode50.com, 0
 unoentrerios.com.ar, 0
-unpa.me, 0
 unq.edu.ar, 0
 unr.edu.ar, 0
-unrulydude.com, 0
-unsa.org, 0
 untan.ac.id, 0
 unternehmertum.de, 0
-untis.at, 0
 unybook.com, 0
 unyoo.com, 0
 unyp.cz, 0
@@ -14982,72 +8458,44 @@
 uooc.online, 0
 uop.edu.jo, 0
 uoradea.ro, 0
-up3d.com, 0
 upaep.mx, 0
-upagge.com, 0
 upaiyun.com, 0
 upb.edu.co, 0
 upc.edu.cn, 0
 upchina.com, 0
-upclinic.ru, 0
-upclve.com, 0
-upcomingcons.com, 0
-updressed.com, 0
 upendo.tv, 0
-upenny.cn, 0
 upessencia.com.br, 0
-upg-ploiesti.ro, 0
-upit.ro, 0
-uplab.ru, 0
 upla.cl, 0
 upl.uz, 0
-upm.my, 0
 upp.edu.mx, 0
 uprav.ru, 0
 uprm.edu, 0
-upromania.ro, 0
 upr.si, 0
-upservers.net, 0
 upsrv.ru, 0
 upward.org, 0
 upxin.net, 0
 uqer.io, 0
 uralairlines.ru, 0
-ural.net, 0
 uralplit.ru, 0
 uralpolit.ru, 0
-uran.ua, 0
 urban3p.ru, 0
 urbanterror.info, 0
 urbaonline.com, 0
-urbistat.it, 0
 urc.ac.ru, 0
-ur.de, 0
-ureport.in, 0
 urfu.ru, 0
-urgent-curier.ro, 0
 url.ph, 0
 url.tw, 0
 urmia.ir, 0
-urokidoma.org, 0
-ursprung.at, 0
-urssaf.fr, 0
 urss.ru, 0
-urwork.cn, 0
 usabilitytools.com, 0
-usa.cc, 0
 usach.cl, 0
 usaedu.net, 0
-usaip.eu, 0
 usc.edu, 0
-usc.edu.cn, 0
 useed.fr, 0
 usefulblogging.com, 0
-useley.com, 0
 usembassy.gov, 0
 usens.com, 0
 userbase.be, 0
-userful.com, 0
 usermd.net, 0
 users.pub, 0
 useso.com, 0
@@ -15056,27 +8504,18 @@
 uslugi.mosreg.ru, 0
 uspard.com, 0
 usp.br, 0
-usports.ru, 0
-ustalk.com, 0
 ustc.edu.cn, 0
 ustclug.org, 0
-ustcsoft.com, 0
 us.to, 0
 u-strasbg.fr, 0
-ustrotting.com, 0
 usu.edu, 0
 usuhs.edu, 0
 usurt.ru, 0
-usx.edu.cn, 0
-utags.edu.mx, 0
 utaipei.edu.tw, 0
 uta-net.com, 0
 utazom.com, 0
 utazzitthon.hu, 0
-utb.ru, 0
-utbs.ws, 0
 utgjiu.ro, 0
-uticanational.com, 0
 utmn.ru, 0
 utn.edu.ar, 0
 utorrent.info, 0
@@ -15088,26 +8527,16 @@
 utwente.nl, 0
 uulian.com, 0
 uuoobe.kr, 0
-uurun.com, 0
 uuu.com.tw, 0
 uvanet.br, 0
 uv.cl, 0
 uvm.cl, 0
-uwdress.com, 0
-uwebdesign.ru, 0
 uwec.edu, 0
 uwewe.com, 0
-uwm.edu.pl, 0
 uwow.biz, 0
-uwowhead.ru, 0
-uxiaor.com, 0
-uxin.com, 0
-uxinuxin.com, 0
-uxuejiaoyu.cc, 0
 uxuejiaoyu.com, 0
 uybor.uz, 0
 uyun.cn, 0
-uzasne-darky.cz, 0
 uzbekenergo.uz, 0
 uzcard.uz, 0
 uzer.me, 0
@@ -15115,145 +8544,73 @@
 uzfor.net, 0
 uzh.ch, 0
 uzinfocom.uz, 0
-uznature.uz, 0
 uztelecom.uz, 0
-uztor.net, 0
 v1.cn, 0
 v1game.cn, 0
 v1.ru, 0
-v1.spb.ru, 0
-v2v.net, 0
 v5cg.com, 0
 v5kf.com, 0
 vaecn.com, 0
-vagas.pro, 0
 vahdeals.com, 0
 vainahtelecom.ru, 0
-valahia.ro, 0
-vala-network.eu, 0
 valetudo.ru, 0
-vallexm.ru, 0
 valsun.cn, 0
 valuehost.ru, 0
-vam.ac.uk, 0
-vanet.eu.com, 0
 vanfun.com, 0
-vansfans.cn, 0
 vapez.ro, 0
 vapteke.ru, 0
 vardex.ru, 0
-variable.pp.ua, 0
-variety-store.ru, 0
 variflight.com, 0
-varton.ru, 0
 varus.ua, 0
 vasco.com, 0
-vasco.eu, 0
 vashgorod.ru, 0
-vatrus.info, 0
-vatti.com.cn, 0
 vavato.com, 0
-vavruska.info, 0
-v-avto.ru, 0
-vayaentradas.com, 0
 vaz.ru, 0
 vbg.de, 0
 vbill.cn, 0
-vbordele.org, 0
-vbs-hobby.fr, 0
-vbuddisme.ru, 0
-vbz.hr, 0
-vc4a.com, 0
 vc-enable.co.uk, 0
 vcfboard.com, 0
 vclhk.com, 0
 vc.ru, 0
-vctms.co.uk, 0
-vdongchina.com, 0
-vdv-kavkaz.ru, 0
-vedanta.org, 0
-veeam.com, 0
 veekn.com, 0
 veeseo.com, 0
-veeshop.ro, 0
 veestro.com, 0
-veganisme.org, 0
 vegeweb.org, 0
 vehicle-rent.com, 0
-vejska.cz, 0
-veka.ru, 0
-vekrosta.ru, 0
 velex.ir, 0
 velosite.ru, 0
-veloxnet.hu, 0
-venco.com.pl, 0
-vendev.info, 0
 vendor.kz, 0
-venetolavoro.it, 0
-venez.fr, 0
 venganzasdelpasado.com.ar, 0
-venompvp.org, 0
 vent-al.ru, 0
 vente-privee.com, 0
-vento.ru, 0
 venturesafrica.com, 0
-verbinet.com, 0
 verbraucherschutz.de, 0
-verbraucherzentrale.it, 0
-verespg.hu, 0
-vergleichen-und-sparen.de, 0
-vericant.com, 0
-verifiedinvesting.com, 0
 verifiedvolunteers.com, 0
-veripark.com, 0
-versand-status.de, 0
-version6.ru, 0
 verybank.ru, 0
 verycloud.cn, 0
 verygames.net, 0
 veschichka.com, 0
 vestacp.com, 0
 vesti.kz, 0
-vestiprim.ru, 0
 vestum.ru, 0
-vexer.ru, 0
 veyseloglu.az, 0
-vfavk.net, 0
-vfe.cc, 0
 vfl.ru, 0
-v-front.de, 0
-vgg.ru, 0
-vgn.at, 0
 vhall.com, 0
-vhod.cc, 0
 vhostgo.com, 0
-vhost.wf, 0
-viacep.com.br, 0
 via.de, 0
-viadurini.it, 0
-viaflats.com, 0
-viajas.com, 0
 viaprinto.de, 0
-vibease.com, 0
 vibus.de, 0
 vic.edu.au, 0
 vic.gov.au, 0
 vicp.cc, 0
 vicp.io, 0
 vicp.net, 0
-victorz.ru, 0
-vidanet.hu, 0
-vidapositiva.com, 0
-vide-greniers.org, 0
 videoboom.cc, 0
 videochaty.ru, 0
-videociety.de, 0
 videoforme.ru, 0
 videogamesawesome.com, 0
 videoigr.net, 0
-videojatekbolt.hu, 0
 videojj.com, 0
-videolist.am, 0
 video-nvidia.com, 0
 videoplusfrance.com, 0
 videoregforum.ru, 0
@@ -15262,46 +8619,26 @@
 videostir.com, 0
 videvo.net, 0
 vidido.ua, 0
-vidmatedownloadapp.com, 0
-vidonme.cn, 0
 vidown.cn, 0
 vidproxy.com, 0
 vidri.com.sv, 0
 vid.ru, 0
-viemar.com.br, 0
 vietget.net, 0
-vietmap.vn, 0
-vietpn.com, 0
 viewdns.net, 0
-viewlayer.cn, 0
 viewnetcam.com, 0
-vifnet.pl, 0
 vigodnee.ru, 0
-viis.lv, 0
 vikingco.com, 0
-vikingcruises.com, 0
 vikingrivercruises.com, 0
 vilavi.com, 0
 vilaviniteca.es, 0
 villacarte.com, 0
 villamariavivo.com, 0
-ville-courbevoie.fr, 0
-ville-gennevilliers.fr, 0
 vilniausenergija.lt, 0
-vilynx.com, 0
-vimcar.com, 0
-vimcar.de, 0
 vimentis.ch, 0
 vimp.com, 0
-vinamsolutions.com, 0
-vinastar.net, 0
-vincross.com, 0
-viniti.ru, 0
-vin.li, 0
 vipautoliker.com, 0
 vipbaiduyun.com, 0
 vipc.cn, 0
-v-ipc.ru, 0
 vipedp2.com, 0
 vipfreepremium.com, 0
 vipgaming.ru, 0
@@ -15310,88 +8647,49 @@
 vipmro.net, 0
 vipreading.com, 0
 vipshop.com, 0
-vipsmt.com, 0
-vipspravka.org, 0
-vipvpn.racing, 0
 vip-weapon.ru, 0
 vip-wifi.com, 0
 vipwifi.com, 0
 vira20.ir, 0
-virag.si, 0
 viral-alert.com, 0
 viralsection.com, 0
 virink.com, 0
-virnet.co.za, 0
 virten.net, 0
 virt-manager.org, 0
-virt-mir.ru, 0
 virtual-college.co.uk, 0
 virtuallyboring.com, 0
 virtualsoccer.ru, 0
 virtuemart.net, 0
 virtuosgames.com, 0
 virtuozzo.com, 0
-virus-removal-guide.com, 0
-virus-removal-guide.net, 0
-visaszales.lv, 0
-visicom.com, 0
 vision.com.tw, 0
-visitantalya.com, 0
 visitporno.net, 0
-vismedia.ru, 0
 vistula.edu.pl, 0
 visual3d.cn, 0
 visualead.com, 0
 visualwatermark.com, 0
 vitacom.ro, 0
 vitalia.cz, 0
-vitalitygames.com, 0
-vitamax.ru, 0
 vitaminking.com.au, 0
 vitek.ru, 0
-vitnik.com, 0
-vitreum.lv, 0
-viva.com.do, 0
 vivasexe.com, 0
-vivavivu.com, 0
-vivaxis.com, 0
 vivendi.com, 0
 viventor.com, 0
 vivo.xyz, 0
-vivt.ru, 0
 vizio.com, 0
 vizzlo.com, 0
-vjiangyin.net, 0
-vkernel.ro, 0
-v-key.com, 0
 vkfake.ru, 0
-vki.at, 0
 vkjust.com, 0
 vko.cn, 0
 vkonline.ru, 0
-vkreg.ru, 0
 vladislav.ua, 0
-vladis.ru, 0
 vladmama.ru, 0
-vlc.de, 0
-vlc-forum.de, 0
-vlion.cn, 0
-vludus.com, 0
 vluki.ru, 0
-vmcsubastas.com, 0
-vmmo.ru, 0
-vmoe.info, 0
-vmou.ac.in, 0
-vmovier.cc, 0
 vnc.biz, 0
-vn.cz, 0
 vnebo.mobi, 0
 vnet.cn, 0
 vnmu.edu.ua, 0
-vnutri.org, 0
-vobile.cn, 0
 voc.com.cn, 0
-vocier.com, 0
 vodafone.it, 0
 vodjk.com, 0
 vodokanal.kiev.ua, 0
@@ -15400,35 +8698,21 @@
 vogue.ru, 0
 voicecloud.cn, 0
 voiceofgreaterassam.com, 0
-voice-server.ru, 0
-voipgateapi.com, 0
-voipgate.com, 0
 volgadmin.ru, 0
-volga-dnepr.com, 0
 volganet.ru, 0
-volgaspot.ru, 0
 volksbuehne-berlin.de, 0
-volksschauspiele.de, 0
 volkswagen.de, 0
-volkszaehler.org, 0
-volleyball-verband.de, 0
 volnistye.ru, 0
 volnorez.com, 0
-volosfull.ru, 0
-voltmarket.ru, 0
-voltra.by, 0
 vonvon.me, 0
-vooc.net, 0
 voodoo.com, 0
 voodoo.community, 0
 voprosoff.net, 0
 voriginale.tv, 0
 vorlagen.de, 0
 vorwaerts.de, 0
-vorwerk.at, 0
 vorwerk.com, 0
 vorwerk.co.uk, 0
-vorwerk.cz, 0
 vorwerk.de, 0
 vorwerk.es, 0
 vorwerk.fr, 0
@@ -15437,101 +8721,53 @@
 votobo.com, 0
 votonia.ru, 0
 votrube.ru, 0
-voubs.bg, 0
 voxbone.com, 0
-voximplant.com, 0
 voxygen.fr, 0
 voyhoy.com, 0
 voz48.xyz, 0
-vp.gov.lv, 0
 vpndaquan.net.cn, 0
-vpngatecn.com, 0
-vpnhot.com, 0
-vpnmaster.cn, 0
 vpnme.me, 0
 vpnxx.net, 0
-vpo.ca, 0
 vpphoangha.vn, 0
 vprka.com, 0
 vps-10.com, 0
 vpsgroups.com, 0
-vpsi.cloud, 0
 vpsps.com, 0
 vpsville.ru, 0
 vqs.com, 0
 vrach42.ru, 0
-vrame.org, 0
 vrheads.com, 0
 vrn.ru, 0
 vrsa.lt, 0
-v-running.com, 0
 vsactivity.com, 0
 vsadu.ru, 0
-vsathletics.com, 0
 vsbt174.ru, 0
-vsdaria.com, 0
 vse.cz, 0
-vse.fm, 0
-vsehristiane.com, 0
 vsei.ua, 0
 vsekroham.ru, 0
-vseloterei.com, 0
 vsemayki.com, 0
-vsem.cz, 0
-vsemetri.com, 0
-vsepro1s.ru, 0
 vserpg.ru, 0
-vserver.de, 0
-vsesorta.ru, 0
 vsestudent.cz, 0
-vshabakeh.com, 0
-vsibiri.info, 0
-vsim.lt, 0
-vslg.cz, 0
-vslu.ru, 0
 vsopen.ru, 0
 vso-software.fr, 0
-vspp.cz, 0
 vsu.by, 0
 vsu.ru, 0
 vtambove.ru, 0
 vtb.az, 0
-vtb-bank.by, 0
-vtb-bank.kz, 0
-vtbnpf.ru, 0
 vtech.com, 0
 vtechda.com, 0
 vt.edu, 0
 vten.ru, 0
-vtkbank.ru, 0
 vtrhome.net, 0
-vtrois.com, 0
-vtrspeed.com, 0
-vtrspeed.net, 0
 vtrus.net, 0
-vttl.be, 0
 vtt.ru, 0
-vtverdohleb.org.ua, 0
-vucdjursland.dk, 0
 vucke.sk, 0
 vuze.camera, 0
-vv881.com, 0
 vvic.com, 0
 vvo.aero, 0
-vvoso.com, 0
 vvsu.ru, 0
-vvwall.com, 0
-vw-bus.ru, 0
 vwr.com, 0
 vxianchang.cn, 0
-vydy.net, 0
-vyos.io, 0
-vyos.net, 0
-vzlomcheats.com, 0
-vzlomcheatshack.com, 0
-vzlom-igr.com, 0
-w1.fi, 0
-w3cboy.com, 0
 w3template.ir, 0
 w69b.com, 0
 wacai.com, 0
@@ -15545,23 +8781,16 @@
 waiqin365.com, 0
 waitalone.cn, 0
 waitsun.com, 0
-waixingrenlc.com, 0
-wakeboardingmag.com, 0
 wakku.to, 0
 walatao.com, 0
-walibi.nl, 0
-walkclass.com, 0
 wallbox.ru, 0
-wall.cz, 0
 wallegro.ru, 0
 wallpai.com, 0
 wallpaperfusion.com, 0
 wallpapers.pub, 0
-wally.me, 0
 wan5d.com, 0
 wanadev.fr, 0
 wanchongchong.com, 0
-wancom.net.pk, 0
 wanderland.ch, 0
 wandoujia.com, 0
 wanfangdata.com.cn, 0
@@ -15570,9 +8799,6 @@
 wangfz.com, 0
 wang-guanjia.com, 0
 wanghailin.cn, 0
-wanghualang.com, 0
-wangjubao.com, 0
-wangjunfeng.com, 0
 wangye.org, 0
 wanhu.com.cn, 0
 wankr.com.cn, 0
@@ -15580,9 +8806,6 @@
 wanxiaohong.cn, 0
 wanzi.tv, 0
 waqu.com, 0
-warabi.or.jp, 0
-warcis.com, 0
-wardahshop.com, 0
 warez-bb.org, 0
 warlegend.net, 0
 warmen.cc, 0
@@ -15590,248 +8813,140 @@
 wartapost.com, 0
 warwick.ac.uk, 0
 wasai.org, 0
-washabich.de, 0
-wa-sta.net, 0
 wasu.com, 0
 watches.ru, 0
-watchhyper.com, 0
 watchrecon.com, 0
-waterskimag.com, 0
 watsons.com.tw, 0
 watsons.ua, 0
-watsupafrica.com, 0
 wave.io, 0
-waww.ir, 0
 waylens.com, 0
 waysofhistory.com, 0
 wazizu.com, 0
-wb21.com, 0
 wb-community.com, 0
 wb-fernstudium.de, 0
 wbiao.cn, 0
 wciu.com, 0
-wdj168.com, 0
 wdw88.com, 0
 wdwd.com, 0
 we7.cc, 0
 wealthnavi.com, 0
-wearemarketing.com, 0
 weaver.com.cn, 0
-web4008.com, 0
-web4.hu, 0
-webads.eu, 0
 webalfa.net, 0
-web-alpha.com, 0
 webanetlabs.net, 0
 webanketa.com, 0
 webartex.ru, 0
 webassign.com, 0
-webassign.net, 0
 webbankir.com, 0
 webb-site.com, 0
 webcamfuck.me, 0
 webceo.com, 0
-webdavsystem.com, 0
 webdesign.org, 0
 webd.pl, 0
-webdux.com, 0
 webeden.co.uk, 0
 webei.cn, 0
-web-entity.com, 0
 webernetz.net, 0
-web-experiment.info, 0
 webfoss.com, 0
 webfungame.com, 0
 webhop.me, 0
 webhop.net, 0
 webhostbox.net, 0
-webhostingdiscussion.net, 0
 webid-gateway.de, 0
-webid-solutions.de, 0
 webim.ru, 0
 webinar.fm, 0
-webin.info, 0
-weblap-keszites.co.hu, 0
 webmaster.kitchen, 0
-webmaster-ucoz.ru, 0
 weborama.com, 0
 weborama.fr, 0
 webpass.net, 0
-webpixeltechnologies.com, 0
 webplatform.org, 0
 webpro.co.jp, 0
 webptt.com, 0
-webraketa.com, 0
 web-republic.de, 0
 we.bs, 0
-webscore.ru, 0
 webseiten.cc, 0
-webseo.com, 0
 websequencediagrams.com, 0
-web-service4u.de, 0
-websistent.com, 0
 website.tk, 0
-websmsapp.com, 0
 webspacecontrol.com, 0
 webstarterz.com, 0
-webstrane.info, 0
-webstream.eu, 0
-webtatic.com, 0
-webtechub.com, 0
 webtemp.no, 0
 webterren.com, 0
 web-tinker.com, 0
 webtm.ru, 0
 webtransfer.com, 0
-webtre.com, 0
-webtrn.cn, 0
 webtropia.com, 0
 webuntis.com, 0
-weclassroom.com, 0
 weclick.ir, 0
-weco.net, 0
 weddywood.ru, 0
-wedgewoodbanquet.com, 0
 wednet.edu, 0
 wedos.com, 0
 wedos.net, 0
-weeaboo.com, 0
-weeazy.com, 0
 weekdone.com, 0
-weeker.jp, 0
-weflow.io, 0
 weibo.cn, 0
 weiboyi.com, 0
-weichai.com, 0
 weicps.cn, 0
-weidian.com, 0
-weiguda.com, 0
 weijuju.com, 0
 weimi.cc, 0
-weiosx.com, 0
 weiphone.com, 0
 weiphone.net, 0
 weismarkets.com, 0
 weitaming.com, 0
-weixinshu.com, 0
-weiyin.cc, 0
-wejherowo.pl, 0
 wek.ru, 0
 welcomechile.com, 0
-welcomeuruguay.com, 0
 welfulloutdoors.com, 0
 welian.com, 0
-welldonesoft.com, 0
 wellgames.com, 0
 wellingtoncdsb.ca, 0
-wellnessfitnessnutritionstore.com, 0
 welovedance.ru, 0
-wendashi.cc, 0
 wenidc.com, 0
-wenjf.com, 0
 wenjuan.com, 0
 wenjuan.net, 0
 wenming.cn, 0
-wenzelnet.de, 0
-wenzhanghui.com, 0
-werkswelt.de, 0
-weru.de, 0
-wesmirch.com, 0
 westcall.net, 0
-westcall.spb.ru, 0
 westend.hu, 0
 westhome.spb.ru, 0
 westland.ru, 0
 westsib.ru, 0
-westtown.edu, 0
 westwin.com, 0
-west.xyz, 0
-wettforum.info, 0
 wetu.com, 0
 weyes.cn, 0
-weyes.com.cn, 0
-wffuture.ru, 0
 wfu.edu, 0
 wg263.com, 0
-wget.ca, 0
 wghostk.com, 0
-wg-volunteers.ru, 0
-wgwinto.com, 0
 wh1.su, 0
-whalevpn.cc, 0
 whaley.cn, 0
 whaller.com, 0
-whatled.com, 0
 whatpulse.org, 0
-whatshelp.io, 0
 whhd.gov.cn, 0
-whir.net, 0
-whiskybase.com, 0
-whitelabelwebserver.com, 0
-whitetown.com, 0
-whmcsadmintheme.com, 0
 whnet.edu.cn, 0
-whois7.ru, 0
 wholikesu.net, 0
-whoneedstv.com, 0
-wh.to, 0
 whu.edu.cn, 0
-whyun.com, 0
 wiaa.com, 0
 wiair.com, 0
-wiconnect.fr, 0
 wicp.net, 0
 wicwuzhen.cn, 0
 wide.ad.jp, 0
 widoobiz.com, 0
 widuu.com, 0
-wienit.at, 0
-wifimapper.com, 0
 wifispc.com, 0
-wig-supplier.com, 0
 wigwam.com, 0
 wiidatabase.de, 0
-wiipu.com, 0
-wikem.org, 0
 wik-end.com, 0
 wiki8.com, 0
 wikiart.org, 0
 wikimart.ru, 0
-wikimonde.com, 0
 wikin.cn, 0
-wikiscan.org, 0
-wikishoper.ru, 0
 wikium.ru, 0
-wildbags.ru, 0
-wilddogapp.com, 0
 wildo.ru, 0
 williamlong.info, 0
-winasdaq.com, 0
-winbo.cn, 0
-winbo.top, 0
-wincatalog.com, 0
 wincomi.com, 0
-windobona.at, 0
-windows10screensavers.net, 0
 windowsazure.cn, 0
-windowsbox.hu, 0
 windowscentral.com, 0
 windowsforum.kr, 0
-windows-phone.su, 0
-windows-security.org, 0
-windows-soft.ru, 0
 windscribe.com, 0
-wineselectors.com.au, 0
 winesou.com, 0
 winestreet.ru, 0
 wingoads.com, 0
-wingroad.ru, 0
-wingsofart.ru, 0
 wingtech.com, 0
-winhelp.us, 0
 winhong.com, 0
-winneryun.com, 0
-winnetnews.com, 0
 winni.in, 0
 winployee.com, 0
 wintalent.cn, 0
@@ -15839,16 +8954,9 @@
 winyer.cn, 0
 wiscom.com.cn, 0
 wisconsinhistory.org, 0
-wise2c.com, 0
-wisecrm.com, 0
 wisemedia.cn, 0
 wisenjoy.com, 0
 wishmindr.com, 0
-withmybaby.com, 0
-wittur.com.cn, 0
-wittycircle.com, 0
-witze-charts.de, 0
-wizardfox.net, 0
 wizardofodds.com, 0
 wizardofvegas.com, 0
 wizzley.com, 0
@@ -15858,111 +8966,68 @@
 wko.at, 0
 wktk.so, 0
 wkzuche.com, 0
-wlcpu.com, 0
 wlwx.cn, 0
 wmasteru.org, 0
-wmd.ru, 0
-wmrs.ru, 0
-wm.ru, 0
 wmv-dresden.de, 0
 wnmu.edu, 0
-wnp.com.hk, 0
-woax-it.com, 0
-woca.club, 0
-wodzislaw.pl, 0
 wogibtswas.de, 0
 woheni.de, 0
-wolfpaulus.com, 0
 wolf.ua, 0
 wolterskluwer.de, 0
 womanadvice.ru, 0
 woman.ru, 0
 womenonweb.org, 0
-womenshairlossproject.com, 0
 wondershare.cn, 0
 wonsterscript.com, 0
 woodgears.ca, 0
-woodward.edu, 0
 wooplus.com, 0
 wordassociations.net, 0
-work28.com, 0
 workaround.org, 0
 workingmother.com, 0
-worklohas.com, 0
-work-microwave.com, 0
 workout-italia.it, 0
 worksection.com, 0
 work-way.com, 0
 worldcubeassociation.org, 0
 worldoftrucks.ru, 0
-worldserial.info, 0
 worldskills.ru, 0
 worldtravelserver.com, 0
-world-xxx.com, 0
 woshidai.com, 0
 wosign.com, 0
 wo.tc, 0
 wotcase.ru, 0
-wotreplays.ru, 0
-wots.com.ua, 0
-wovn.io, 0
 wowdsgn.com, 0
 wowgirls.com, 0
 wow-impulse.net, 0
 wowtrack.org, 0
-wowtv.sx, 0
-wowworks.ru, 0
 wowzonegc.ir, 0
 woyun.la, 0
-woy-wo.uz, 0
 wpcp.org, 0
 wpdesigner.ir, 0
-wpiao.cn, 0
 wpmayor.com, 0
-wppage.ru, 0
 wpscdn.cn, 0
 wps.cn, 0
 wp-statistics.com, 0
-wpweb.com, 0
 wpweixin.net, 0
-wpzhiku.com, 0
-wpzt.cn, 0
 wrealu24.pl, 0
 wrestling-infos.de, 0
 wroclaw.pl, 0
-wrps.org, 0
-wsdltophp.com, 0
 wsgf.org, 0
 wsgjp.com.cn, 0
 wsgvet.com, 0
-wsisp.net, 0
 wsloan.com, 0
 wsms.ru, 0
-wso.wroc.pl, 0
 wstvb.com, 0
-wszuie.pl, 0
-wtfismyip.com, 0
 wtigga.com, 0
-wtsolutions.cn, 0
 wtu.edu.cn, 0
 wuage.com, 0
-wuestenrot.sk, 0
-wug.cz, 0
-wulian.cc, 0
 wumart.com, 0
 wuminhao.com, 0
-wunderkarten.de, 0
 wunschimmo.de, 0
-wunschkuechen24.de, 0
 wusa5.com, 0
 wust.edu.cn, 0
 wusunyinyue.cn, 0
-wutnews.net, 0
 wuyatv.com, 0
-wuzhicms.com, 0
 wvo-dbg.de, 0
-wware.org, 0
-www.astrakhan.ru, 0
 www.chita.ru, 0
 www.gov.lk, 0
 www.uz, 0
@@ -15972,11 +9037,7 @@
 wxliu.com, 0
 wxrrd.com, 0
 wxwgood.com, 0
-wycliffe.org.au, 0
 wykxsw.com, 0
-wyscout.com, 0
-wzhrss.gov.cn, 0
-x25.pl, 0
 x431.com, 0
 x4jdm.com, 0
 x5aa.com, 0
@@ -15985,86 +9046,46 @@
 xaau.edu.cn, 0
 xacbank.com, 0
 xaecong.com, 0
-xakfor.net, 0
-xalapa.gob.mx, 0
-xalkiadakis.gr, 0
-xalqbank.az, 0
-xanlosch.de, 0
 xap.com, 0
 xarakiri.ru, 0
 xbls.ninja, 0
 xbmc-kodi.cz, 0
 xbpmo.com, 0
-xbsafe.cn, 0
 xchange.cc, 0
-xcloud.cc, 0
 xcloudgame.com, 0
 xd.com, 0
-xdevs.com, 0
 xdf.cn, 0
-x-diesel.com, 0
 xdjd.cn, 0
-xeenho.com, 0
-xenderdownloadapp.com, 0
 xenderdownloads.com, 0
 xenforo.rocks, 0
-xenics.com, 0
 xenos.org, 0
-xf315.org, 0
-xfce.org, 0
-xfile.ro, 0
 xfplay.com, 0
 xfsub.com, 0
-xfxb.net, 0
-xg1.li, 0
-xgate.com.hk, 0
-xgen.hu, 0
 xgimi.com, 0
 xgm.guru, 0
-xhecom.com, 0
-xhmart.com, 0
 xhu.edu.cn, 0
-xialuoli.com, 0
 xiamenair.com, 0
 xiangha.com, 0
-xiangjins.com, 0
-xiangta.cc, 0
-xiangzhan.com, 0
-xianrou.com, 0
 xianyugame.com, 0
-xiaobingss.com, 0
 xiaodao.la, 0
-xiaoduotech.com, 0
-xiaoheiban.cn, 0
 xiaoji001.com, 0
 xiaokakeji.com, 0
 xiaokaxiu.com, 0
-xiaolaoer.com, 0
-xiaomilaile.com, 0
 xiaomishu.com, 0
-xiaopinjuben.com, 0
 xiaoyaoji.com.cn, 0
 xiaoying.tv, 0
-xiaoyoucai.com, 0
 xiaozhu.com, 0
 xiaoz.me, 0
 xiashu.cc, 0
 xiazai3.net, 0
 xiazaidown.com, 0
-xibao100.com, 0
-xibaoxiao.com, 0
-xici.com, 0
 xici.net, 0
-xicp.cn, 0
 xicp.net, 0
 xidorn.com, 0
 ximalaya.com, 0
 xincheping.com, 0
-xinchou.com, 0
 xin.com, 0
-xinedome.de, 0
 xineurope.com, 0
-xinfuka.net, 0
 xingk.cc, 0
 xingshulin.com, 0
 xingyun.net, 0
@@ -16077,129 +9098,70 @@
 xiniugushi.com, 0
 xinmin.cn, 0
 xinqixi.com, 0
-xinshangshangxin.com, 0
-xinux.net, 0
 xinxindai.com, 0
 xiph.org, 0
 xitieba.com, 0
 xiu8.com, 0
 xiu.com, 0
 xixi123.com, 0
-xiyoucn.com, 0
 xizi.com, 0
-xjatc.com, 0
 xjnu.edu.cn, 0
-xjtag.com, 0
 xjtlu.edu.cn, 0
 xjtu.edu.cn, 0
 xju.edu.cn, 0
 xjy.cn, 0
 xkb.com.cn, 0
-xlm.pl, 0
-xl.pt, 0
-xlzd.me, 0
 xmcimg.com, 0
 xmeye.net, 0
 xmisp.com, 0
-xmjl.com, 0
-xmjydj.com, 0
 xmmandarinonline.com, 0
 xm-n-tax.gov.cn, 0
 xmp.net, 0
-xmpp.jp, 0
-xmpp.org, 0
 xmt.cn, 0
 xmusik.me, 0
 xmyuzhou.com.cn, 0
-xn--12c4db3b2bb9h.net, 0
 xn--1-btbl6aqcj8hc.xn--p1ai, 0
-xn--2i0b10rwthi7fqvp1hd.com, 0
 xn--41a.ws, 0
-xn------7cdbxfuat6afkbmmhefunjo4bs9u.xn--p1ai, 0
-xn----7sbabalf0fh7h4b.xn--p1ai, 0
 xn--80aaaac8algcbgbck3fl0q.xn--p1ai, 0
-xn--80aaej4apiv2bzg.xn--p1ai, 0
-xn--80abemlex2i.xn--p1ai, 0
-xn--80accn9dh.xn--90ais, 0
-xn--80aealaaatcuj2bbdbr2agjd6hzh.xn--p1ai, 0
-xn--80aeopmfjx.xn--80aswg, 0
 xn--80ahclcbajtrv5ae6c.xn--p1ai, 0
 xn----8sbbilafpyxcf8a.xn--p1ai, 0
-xn--90agc8a6d.xn--d1acj3b, 0
 xn--90agrrk8e.xn--p1ai, 0
-xn--b1a3bf.xn--p1ai, 0
-xn--b1acdcqi5ci.xn--p1ai, 0
-xn--c1acndtdamdoc1ib.xn--p1ai, 0
 xn--c1afjenhpy1e1a.xn--p1ai, 0
 xn--c1arjr.xn--p1ai, 0
-xn--c1avg.xn--p1ai, 0
-xn--d1acnqm.xn--j1amh, 0
 xn----dtbofgvdd5ah.xn--p1ai, 0
 xn--e1agfw6a0bt.xn--p1ai, 0
-xn--e1apcdqc2g.xn--p1ai, 0
 xn--f1ae4a2b.xn--p1ai, 0
 xn--i2ru8q2qg.com, 0
-xnw.com, 0
-xn----ymcba3adxu7lezvuj.sa.com, 0
-xocka.ru, 0
-x-omics.org, 0
 xopom.com, 0
 xosobinhduong.com.vn, 0
 xpg.com.br, 0
 xpir.ru, 0
-xpsss.com, 0
 xquartz.org, 0
 xrea.com, 0
-xrnm.com, 0
-xrule34.com, 0
 xs4all.nl, 0
-xsdzq.cn, 0
-xskygames.pl, 0
 xsph.ru, 0
 xssec.org, 0
 xsteach.com, 0
-xsunucu.com, 0
 xtbg.ac.cn, 0
 xtcrm.com, 0
 xtern.ru, 0
 xthor.bz, 0
 xtion.net, 0
 xtrade.com, 0
-xtrance.info, 0
-xtreme.pt, 0
-xtrim.ru, 0
-xtrlarge.com, 0
-xtronics.com, 0
-xuanlove.net, 0
-xuanruanjian.com, 0
 xuanwo.org, 0
 xubiji.com, 0
 xueda.com, 0
-xueshandai.com, 0
 xujc.com, 0
-xuni99.com, 0
 xunjiepdf.com, 0
 xunleiyy.com, 0
 xunyou.com, 0
-xura.com, 0
-xuri.me, 0
-xuulm.com, 0
-xuuue.cn, 0
-xvhost.com, 0
 xvid.com, 0
 xvideoslive.com, 0
-xwall.pro, 0
 xweb.cn, 0
-xwhosp.com.cn, 0
-xwiki.com, 0
-xwiki.org, 0
-xwis.net, 0
-xwjr.com, 0
 xwsd.com, 0
 xxshe.com, 0
 xxt.cn, 0
 xxx3tube.com, 0
-xxxooo.link, 0
 xyaz.cn, 0
 xydeyou.com, 0
 xyfunds.com.cn, 0
@@ -16207,8 +9169,6 @@
 xyu.tv, 0
 xyy001.com, 0
 xyzq.com.cn, 0
-xzcblog.com, 0
-xz.gov.cn, 0
 xzmc.edu.cn, 0
 xzn.ir, 0
 y3600.com, 0
@@ -16216,157 +9176,94 @@
 yabumi.cc, 0
 yachtbooker.com, 0
 yachtingmagazine.com, 0
-yachtsys.com, 0
-yaduo.com, 0
 yagla.ru, 0
 yaguo.ru, 0
-yahooeu.org, 0
 yahooeu.ru, 0
-yaidu.ru, 0
 yakitoriya.ru, 0
 yalova.edu.tr, 0
 yamaha-motor.co.th, 0
 yamobi.ru, 0
-yanagou.com, 0
 yanfabu.com, 0
-yangchangxi.com, 0
-yangcong345.com, 0
 yangshitianqi.com, 0
 yangtuner.com, 0
 yangzhou.gov.cn, 0
-yanimsoft.ir, 0
 yanke.info, 0
-yanny.link, 0
 yanue.net, 0
 yaociyuan.com, 0
-yaoex.com, 0
-yaomaitong.cn, 0
 yaostrov.ru, 0
 yaou369.com, 0
 yaozh.com, 0
-ya-pluss.ru, 0
-yarcom.ru, 0
-yar-edudep.ru, 0
-yarik-sat.ru, 0
-yastaff.ru, 0
 yat-net.com, 0
 yatong.info, 0
 yatta.de, 0
 yavix.ru, 0
 yavuz-selim.com, 0
 yazuo.com, 0
-ybook.vn, 0
 ybren.com, 0
-ybtcard.com, 0
 ybu.edu.cn, 0
 yburlan.ru, 0
 ycgame.com, 0
-ydidc.top, 0
 ydniu.com, 0
-ydy7.com, 0
 ydybt.net, 0
 yeahka.com, 0
 yealink.com, 0
 yeastar.com, 0
-yeeyi.com, 0
 yeezon.com, 0
 yeezyboost750sale.net, 0
-yeezytrainers.net, 0
-yeint.ru, 0
-yellowdog.co, 0
-yephy.com, 0
-yepster.me, 0
 yerevan.am, 0
-yeshigeek.com, 0
 yesilgazete.org, 0
 yesmywine.com, 0
-yestae.com, 0
 yeti.com, 0
-yfcloud.com, 0
 yfdxs.com, 0
 ygopro.co, 0
-ygqq.com, 0
 ygyhg.com, 0
-yhcd.net, 0
 yht.co.jp, 0
-yhz66.com, 0
-yibei.com, 0
 yibizi.com, 0
 yicai.com, 0
 yiche.com, 0
-yicp.io, 0
 yidai.com, 0
 yidianda.com, 0
 yifile.com, 0
-yifufaka.com, 0
 yigoonet.com, 0
 yiguo.com, 0
 yihu.cn, 0
 yiiframework.com.ua, 0
-yijiakan.com, 0
-yikuaiqu.com, 0
-yilingshop.com, 0
-yilingsj.com, 0
-yilushang.net, 0
-yiminbang.com, 0
 yimishiji.com, 0
 yimu100.com, 0
 yingxiong.com, 0
-yingyanso.com, 0
 yinhu.com, 0
 yiqifa.com, 0
 yiqiniu.com, 0
-yiran.com, 0
-yishu.com, 0
-yisi148.com, 0
 yiso.me, 0
 yit.com, 0
 yithemes.com, 0
 yiyult.com, 0
-yiyunbaby.cn, 0
 yizhihongxing.com, 0
 yjc.ir, 0
-yjk.im, 0
 yjsnpi.nu, 0
 ylc.edu.tw, 0
-ylsoftware.com, 0
-ymanz.com, 0
 ymg360.com, 0
-ymq365.com, 0
 ynairport.com, 0
-ynet.com, 0
-ynet.sk, 0
 yngou.com, 0
 yngs.gov.cn, 0
 ynjy.cn, 0
-ynlib.cn, 0
 ynnu.edu.cn, 0
 ynot.com, 0
-ynszlyy.com, 0
 ynu.edu.cn, 0
-yo-ad.cn, 0
 yoga.com, 0
-yoga-masters.com, 0
 yohotour.com, 0
 yokogawa.com, 0
 yoncu.com, 0
 yongche.org, 0
-yonghappy.com, 0
 yonghui.cn, 0
 yongjinbao.com.cn, 0
 yonyou.com, 0
-yonyouup.com, 0
-yoochoose.com, 0
-yoochoose.net, 0
 yooooo.us, 0
 yooread.com, 0
-yooz.fr, 0
 yotuku.cn, 0
-youchew.net, 0
 youdao.com, 0
 youdian.in, 0
 yougou.com, 0
-youguoquan.com, 0
 youhack.ru, 0
 youhaosuda.com, 0
 youhaovip.com, 0
@@ -16374,200 +9271,121 @@
 youidraw.com, 0
 youjizzlive.com, 0
 youkeshu.com, 0
-youkeyun.com, 0
 youku.com, 0
 you-mp3.net, 0
 youngwriterssociety.com, 0
-youread.me, 0
 yourmechanic.com, 0
 your-pictionary.com, 0
-yoursafe.cn, 0
 your-server.de, 0
-yourski.ru, 0
 yourtion.com, 0
 youscan.io, 0
 youss.co, 0
 youtubers.me, 0
 youwager.eu, 0
 youweather.com, 0
-youxia.org, 0
 youxi.com, 0
 youxiniao.com, 0
-youyuanapp.com, 0
 youzhuan.com, 0
 yovole.com, 0
 yoya.com, 0
 yoyi.com.cn, 0
-yoytourdumonde.fr, 0
-ypc.edu.cn, 0
 yper.co, 0
-ypfbtransporte.com, 0
 ypmate.com, 0
-ypt.or.id, 0
 yq24.net, 0
-yrce.cn, 0
-yrom.net, 0
 ys137.com, 0
 ys7.com, 0
-yscredit.com, 0
 ysepay.com, 0
-ysmu.ru, 0
-ysn.ru, 0
 ysu.edu.cn, 0
 ytdestek.com, 0
 ytvpn.net.cn, 0
 yu0123456.com, 0
-yuadon.com, 0
 yuanbao365.com, 0
 yuanlai521.com, 0
-yubaibaii.com, 0
 yueing.org, 0
-yuejiadai.com, 0
-yueus.com, 0
 yuewen.com, 0
-yufan.me, 0
 yugcontract.ua, 0
 yugiohcardmarket.eu, 0
 yugiohgameonline.com.br, 0
-yuhong.com.cn, 0
 yui-nya.com, 0
 yulong.com, 0
 yumama.com, 0
 yunaq.com, 0
-yunaw.com, 0
 yunbore.com, 0
 yuncaijing.com, 0
 yundun.cn, 0
 yundun.com, 0
 yuneec.cn, 0
 yunhou.com, 0
-yunifang.com, 0
-yunjiazheng.com, 0
 yunjiweidian.com, 0
 yunpan.cn, 0
 yunserver.com, 0
 yunshanmeicai.com, 0
 yuntech.edu.tw, 0
-yuntoo.com, 0
 yunyichong.com, 0
 yunyuejuan.net, 0
 yunyy.cc, 0
 yunzhijia.com, 0
 yusen-logistics.com, 0
-yushuangqi.com, 0
-yusupov-palace.ru, 0
 yutong.com, 0
 yuuby.com, 0
-yuugames.com.cn, 0
-yuying360.com, 0
-yuyue.com.cn, 0
 yuzhoutuofu.com, 0
-ywhuo.com, 0
 ywtywt.com, 0
-ywu.cn, 0
 yxlady.com, 0
-yxsvpn.com, 0
 yy4480.org, 0
 yy6080.org, 0
-yybei.cn, 0
-yywkt.org, 0
-yznu.cn, 0
 z0download.com, 0
 z3news.com, 0
 zaba.hr, 0
 zabedu.ru, 0
-zabi.cz, 0
-zaixiaoren.com, 0
-zajecaronline.com, 0
 zakka.com.tw, 0
 zakonyprolidi.cz, 0
 zakopane.pl, 0
-zamel.pl, 0
 zampdsp.com, 0
-zankhakasia.ru, 0
 zaodula.com, 0
 zaoshu.io, 0
 zapable.com, 0
 zap-hosting.com, 0
 za.pl, 0
-zap.md, 0
-zapr.in, 0
-zapster.it, 0
 zapster.ru, 0
 zapto.org, 0
-zarayef.com, 0
 zarfund.com, 0
-zargaripour.com, 0
 zarinp.al, 0
-zarovi.cz, 0
-zarulem.by, 0
 zastavok.net, 0
-zatlanka.cz, 0
 zatunen.com, 0
-zavod.co.rs, 0
 zaymer.ru, 0
 zaymiprosto.ru, 0
 zbgl.net, 0
 zbj.com, 0
-zbytb.com, 0
-zc8hr.com, 0
-zcckj.com, 0
 zcmu.edu.cn, 0
 zczj.com, 0
 zdfans.com, 0
-zdomo.com, 0
-zdorov.li, 0
-zdraivery.ru, 0
 zdrav26.ru, 0
-zdrav36.ru, 0
-zdrav.spb.ru, 0
 zdrojak.cz, 0
 zdsoft.com, 0
-zdw.krakow.pl, 0
 ze.am, 0
-zebrablinds.ca, 0
 zebraboss.com, 0
-zeeandco.co.uk, 0
-zeemono.com, 0
-zeitnitz.eu, 0
 zelenaya.net, 0
 zelluloza.ru, 0
 zen.co.uk, 0
 zenden.ru, 0
-zendmin.com, 0
 zeneakademia.hu, 0
 zengram.ru, 0
 zenhotels.com, 0
 zenitel.com, 0
-zenius.net, 0
 zenmate.com, 0
 zenpage.cn, 0
-zenserv.fr, 0
 zentaizone.com, 0
 zephyrproject.org, 0
-zepire.com, 0
 zepo.ir, 0
 zerobest.net, 0
-zerohour-productions.net, 0
-zero.kz, 0
-zetail.com.tw, 0
-zetes.com, 0
-zeto.com.ua, 0
 zfilm-hd.net, 0
-zf-projects.ru, 0
-zgboke.com, 0
 zggtxhw.com, 0
-zgny.com.cn, 0
 zgpingshu.com, 0
 zh30.com, 0
 zhacker.net, 0
-zhaishuge.com, 0
 zhanad.com, 0
 zhangge.net, 0
-zhangziran.com, 0
 zhaodl.xyz, 0
-zhaoj.in, 0
-zhaokeli.com, 0
 zhaopin.com, 0
 zhaorannote.cn, 0
 zhaoshangdai.com, 0
@@ -16578,21 +9396,12 @@
 zhenai.com, 0
 zhenfund.com, 0
 zhengjie.com, 0
-zhengxianjun.com, 0
-zhibs.net, 0
-zhidx.com, 0
 zhihedongfang.com, 0
-zhiku8.com, 0
-zhimei360.com, 0
-zhique.com, 0
 zhisheji.com, 0
-zhitanska.com, 0
 zhitouwang.cn, 0
 zhiwei.li, 0
 zhiwo.com, 0
-zhiyanblog.com, 0
 zhizaoyun.com, 0
-zhizishe.com, 0
 zhiziyun.com, 0
 zhizuobiao.com, 0
 zhjtong.com, 0
@@ -16600,52 +9409,36 @@
 zhongan.com, 0
 zhonganonline.com, 0
 zhongguowangshi.com, 0
-zhongjiu.cn, 0
 zhongye.net, 0
 zhongziso.com, 0
-zhou92.com, 0
-zhoulujun.cn, 0
 zhovner.com, 0
 zhuang.ba, 0
 zhuankezhijia.com, 0
 zhuanyejun.com, 0
-zhuanyejun.net, 0
 zhuatieba.com, 0
 zhubaoleyuan.com, 0
-zhufaner.com, 0
-zhujike.com, 0
 zhujiwu.me, 0
 zhuna.cn, 0
 zhushou001.com, 0
 zhuwei.me, 0
 zhuzi.me, 0
 zhyk.ru, 0
-ziferblat.net, 0
 zige.la, 0
 ziguangcn.com, 0
-zigzag.kr, 0
-zijilai.com.cn, 0
 zik.ua, 0
-zilanhua.com, 0
 zilingo.com, 0
-zinceuro.sk, 0
-zionrd.com, 0
 zip-anime.xyz, 0
-zip-area.com, 0
 zipbob.net, 0
 zip.ch, 0
 ziping.ir, 0
 zipy.co.il, 0
 zitian.cn, 0
-ziwork.com, 0
-ziy.cc, 0
 ziyonet.uz, 0
 ziyoufang.com, 0
 ziyuanmao.com, 0
 zj.com, 0
 zjds.gov.cn, 0
 zjjt365.com, 0
-zjjw.com, 0
 zjmax.com, 0
 zjport.gov.cn, 0
 zjsafety.gov.cn, 0
@@ -16655,103 +9448,59 @@
 zju.tools, 0
 zjzwfw.gov.cn, 0
 zkteco.com, 0
-zkungfu.com, 0
-zlatmax.ru, 0
 zlavadna.sk, 0
 zlfund.cn, 0
-zlqh.com, 0
 zlx3323.top, 0
 zm123.com, 0
-zmap.io, 0
 zmirrordemo.com, 0
 zmodo.com, 0
-znakomstva.ru, 0
 znaxyar.ru, 0
 znds.com, 0
-znojmo.cz, 0
 zntec.cn, 0
-zockerbuden.community, 0
-zoc-max.sk, 0
 zodgame.us, 0
-zodio.com, 0
 zol.com.cn, 0
-zomake.com, 0
 zomro.com, 0
 zonakz.net, 0
 zonazvuka.ru, 0
 zone-game.info, 0
-zoobax.com, 0
-zoo-bazar.com, 0
 zoodshoor.com, 0
 zoo.gr, 0
-zoolnews.com, 0
 zoomlion.com, 0
 zoomsquare.com, 0
-zoomsquare.de, 0
 zoossoft.cn, 0
 zori.pt, 0
 zor.uz, 0
-zoublog.com, 0
-zoznamrealit.sk, 0
-zoznamtovaru.sk, 0
 z-payment.com, 0
-z-payment.info, 0
 zph.com.cn, 0
-zproxy.de, 0
-zpua.com.ua, 0
 zqgame.com, 0
 zqu.edu.cn, 0
 zqzhibo.com, 0
-zrbao.com, 0
-zrss.si, 0
 zryhyy.com.cn, 0
-zsben.cz, 0
 zsedu.net, 0
 zs.gov.cn, 0
 zsnet.com, 0
-zsnso.ru, 0
 zt.com, 0
 ztedevice.com, 0
-z-telecom.net, 0
-z-terra.ru, 0
 ztgame.com, 0
 ztmao.com, 0
 ztm.poznan.pl, 0
-ztydata.cn, 0
 zuadr.com, 0
-zuanbank.com, 0
 zu.edu.ua, 0
-zug4.me, 0
 zugunder.com, 0
 zuimc.com, 0
 zun.com, 0
 zupoec.com, 0
-zurich.at, 0
 zust.edu.cn, 0
 zveronline.ru, 0
-zvuk.me, 0
-zwettl.at, 0
-zwwysoft.com, 0
-zxcnw.com, 0
-zxc.science, 0
 zxdl.pw, 0
-zxerp.com, 0
 zx-pk.ru, 0
 zxtsg.com, 0
-zxzxzx.info, 0
-zy127.com, 0
 zycao.com, 0
-zychal.net, 0
 zyctd.com, 0
-zye.cc, 0
 zygames.com, 0
-zylsl.com, 0
-zyns.com, 0
 zype.com, 0
 zyq108.com, 0
-zyxel.by, 0
 zyxr.com, 0
-zzidc.com, 0
 zz.vc, 0
 zzy.cn, 0
 zzz.com.ua, 0
diff --git a/net/disk_cache/cache_util.cc b/net/disk_cache/cache_util.cc
index 51ec95b..b71c1b46 100644
--- a/net/disk_cache/cache_util.cc
+++ b/net/disk_cache/cache_util.cc
@@ -12,8 +12,8 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/task_scheduler/post_task.h"
 #include "base/threading/thread_restrictions.h"
-#include "base/threading/worker_pool.h"
 
 namespace {
 
@@ -136,8 +136,13 @@
     return false;
   }
 
-  base::WorkerPool::PostTask(
-      FROM_HERE, base::Bind(&CleanupCallback, path, name_str), true);
+  base::PostTaskWithTraits(
+      FROM_HERE, base::TaskTraits()
+                     .MayBlock()
+                     .WithPriority(base::TaskPriority::BACKGROUND)
+                     .WithShutdownBehavior(
+                         base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
+      base::Bind(&CleanupCallback, path, name_str));
   return true;
 }
 
diff --git a/net/http2/hpack/decoder/hpack_block_decoder_test.cc b/net/http2/hpack/decoder/hpack_block_decoder_test.cc
index 566963d..37e33da 100644
--- a/net/http2/hpack/decoder/hpack_block_decoder_test.cc
+++ b/net/http2/hpack/decoder/hpack_block_decoder_test.cc
@@ -90,8 +90,7 @@
         HpackEntryType::kIndexedLiteralHeader, false, "custom-key", false,
         "custom-header"));
   };
-  EXPECT_TRUE(
-      DecodeHpackExampleAndValidateSeveralWays(R"(
+  const char hpack_example[] = R"(
       40                                      | == Literal indexed ==
       0a                                      |   Literal name (len = 10)
       6375 7374 6f6d 2d6b 6579                | custom-key
@@ -99,8 +98,9 @@
       6375 7374 6f6d 2d68 6561 6465 72        | custom-header
                                               | -> custom-key:
                                               |   custom-header
-      )",
-                                               ValidateDoneAndEmpty(do_check)));
+      )";
+  EXPECT_TRUE(DecodeHpackExampleAndValidateSeveralWays(
+      hpack_example, ValidateDoneAndEmpty(do_check)));
   EXPECT_TRUE(do_check());
 }
 
@@ -110,16 +110,16 @@
     VERIFY_AND_RETURN_SUCCESS(collector_.ValidateSoleLiteralValueHeader(
         HpackEntryType::kUnindexedLiteralHeader, 4, false, "/sample/path"));
   };
-  EXPECT_TRUE(
-      DecodeHpackExampleAndValidateSeveralWays(R"(
+  const char hpack_example[] = R"(
       04                                      | == Literal not indexed ==
                                               |   Indexed name (idx = 4)
                                               |     :path
       0c                                      |   Literal value (len = 12)
       2f73 616d 706c 652f 7061 7468           | /sample/path
                                               | -> :path: /sample/path
-      )",
-                                               ValidateDoneAndEmpty(do_check)));
+      )";
+  EXPECT_TRUE(DecodeHpackExampleAndValidateSeveralWays(
+      hpack_example, ValidateDoneAndEmpty(do_check)));
   EXPECT_TRUE(do_check());
 }
 
@@ -130,16 +130,16 @@
         HpackEntryType::kNeverIndexedLiteralHeader, false, "password", false,
         "secret"));
   };
-  EXPECT_TRUE(
-      DecodeHpackExampleAndValidateSeveralWays(R"(
+  const char hpack_example[] = R"(
       10                                      | == Literal never indexed ==
       08                                      |   Literal name (len = 8)
       7061 7373 776f 7264                     | password
       06                                      |   Literal value (len = 6)
       7365 6372 6574                          | secret
                                               | -> password: secret
-      )",
-                                               ValidateDoneAndEmpty(do_check)));
+      )";
+  EXPECT_TRUE(DecodeHpackExampleAndValidateSeveralWays(
+      hpack_example, ValidateDoneAndEmpty(do_check)));
   EXPECT_TRUE(do_check());
 }
 
@@ -148,13 +148,13 @@
   NoArgValidator do_check = [this]() {
     VERIFY_AND_RETURN_SUCCESS(collector_.ValidateSoleIndexedHeader(2));
   };
-  EXPECT_TRUE(
-      DecodeHpackExampleAndValidateSeveralWays(R"(
+  const char hpack_example[] = R"(
       82                                      | == Indexed - Add ==
                                               |   idx = 2
                                               | -> :method: GET
-      )",
-                                               ValidateDoneAndEmpty(do_check)));
+      )";
+  EXPECT_TRUE(DecodeHpackExampleAndValidateSeveralWays(
+      hpack_example, ValidateDoneAndEmpty(do_check)));
   EXPECT_TRUE(do_check());
 }
 // http://httpwg.org/specs/rfc7541.html#rfc.section.C.3.1
diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc
index cc842818..501eeb0 100644
--- a/net/nqe/network_quality_estimator.cc
+++ b/net/nqe/network_quality_estimator.cc
@@ -20,6 +20,7 @@
 #include "base/rand_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
@@ -154,12 +155,12 @@
   return metric;
 }
 
-void RecordRTTAccuracy(const char* prefix,
+void RecordRTTAccuracy(base::StringPiece prefix,
                        int32_t metric,
                        base::TimeDelta measuring_duration,
                        base::TimeDelta observed_rtt) {
   const std::string histogram_name =
-      base::StringPrintf("%s.EstimatedObservedDiff.%s.%d.%s", prefix,
+      base::StringPrintf("%s.EstimatedObservedDiff.%s.%d.%s", prefix.data(),
                          metric >= 0 ? "Positive" : "Negative",
                          static_cast<int32_t>(measuring_duration.InSeconds()),
                          GetHistogramSuffixObservedRTT(observed_rtt));
@@ -345,6 +346,9 @@
   // remain in sync with the suffixes specified in
   // tools/metrics/histograms/histograms.xml.
   accuracy_recording_intervals_.push_back(base::TimeDelta::FromSeconds(15));
+
+  for (int i = 0; i < STATISTIC_LAST; ++i)
+    http_rtt_at_last_main_frame_[i] = nqe::internal::InvalidRTT();
 }
 
 void NetworkQualityEstimator::ObtainOperatingParams(
@@ -425,6 +429,13 @@
     effective_connection_type_at_last_main_frame_ = effective_connection_type_;
     estimated_quality_at_last_main_frame_ = network_quality_;
 
+    // Record the HTTP at the last main frame for experimental statistics.
+    for (int i = 0; i < STATISTIC_LAST; ++i) {
+      http_rtt_at_last_main_frame_[i] = GetRTTEstimateInternal(
+          disallowed_observation_sources_for_http_, base::TimeTicks(),
+          static_cast<Statistic>(i), 50);
+    }
+
     // Post the tasks which will run in the future and record the estimation
     // accuracy based on the observations received between now and the time of
     // task execution. Posting the task at different intervals makes it
@@ -515,6 +526,25 @@
     return;
 
   base::TimeDelta recent_http_rtt;
+
+  // Record the HTTP prediction accuracy for experimental statistics.
+  for (int i = 0; i < STATISTIC_LAST; ++i) {
+    recent_http_rtt = GetRTTEstimateInternal(
+        disallowed_observation_sources_for_http_, last_main_frame_request_,
+        static_cast<Statistic>(i), 50);
+    if (recent_http_rtt != nqe::internal::InvalidRTT() &&
+        http_rtt_at_last_main_frame_[i] != nqe::internal::InvalidRTT()) {
+      int estimated_observed_diff_milliseconds =
+          http_rtt_at_last_main_frame_[i].InMilliseconds() -
+          recent_http_rtt.InMilliseconds();
+
+      std::string histogram_name =
+          base::StringPrintf("NQE.%s.Accuracy.HttpRTT", GetNameForStatistic(i));
+      RecordRTTAccuracy(histogram_name, estimated_observed_diff_milliseconds,
+                        measuring_duration, recent_http_rtt);
+    }
+  }
+
   if (!GetRecentHttpRTT(last_main_frame_request_, &recent_http_rtt))
     recent_http_rtt = nqe::internal::InvalidRTT();
 
@@ -850,6 +880,10 @@
   if (!ReadCachedNetworkQualityEstimate())
     AddDefaultEstimates();
   estimated_quality_at_last_main_frame_ = nqe::internal::NetworkQuality();
+
+  for (int i = 0; i < STATISTIC_LAST; ++i)
+    http_rtt_at_last_main_frame_[i] = nqe::internal::InvalidRTT();
+
   throughput_analyzer_->OnConnectionTypeChanged();
   MaybeComputeEffectiveConnectionType();
 }
@@ -908,8 +942,9 @@
     // Add the remaining percentile values.
     static const int kPercentiles[] = {0, 10, 90, 100};
     for (size_t i = 0; i < arraysize(kPercentiles); ++i) {
-      rtt = GetRTTEstimateInternal(disallowed_observation_sources_for_http_,
-                                   base::TimeTicks(), kPercentiles[i]);
+      rtt = GetRTTEstimateInternal(
+          disallowed_observation_sources_for_http_, base::TimeTicks(),
+          base::Optional<Statistic>(), kPercentiles[i]);
 
       rtt_percentile = GetHistogram(
           "RTT.Percentile" + base::IntToString(kPercentiles[i]) + ".",
@@ -927,9 +962,9 @@
     // Add the remaining percentile values.
     static const int kPercentiles[] = {0, 10, 90, 100};
     for (size_t i = 0; i < arraysize(kPercentiles); ++i) {
-      rtt =
-          GetRTTEstimateInternal(disallowed_observation_sources_for_transport_,
-                                 base::TimeTicks(), kPercentiles[i]);
+      rtt = GetRTTEstimateInternal(
+          disallowed_observation_sources_for_transport_, base::TimeTicks(),
+          base::Optional<Statistic>(), kPercentiles[i]);
 
       transport_rtt_percentile = GetHistogram(
           "TransportRTT.Percentile" + base::IntToString(kPercentiles[i]) + ".",
@@ -1010,6 +1045,16 @@
 
   effective_connection_type_histogram->Add(
       effective_connection_type_at_last_main_frame_);
+
+  // Record the HTTP RTT at the main frames for experimental statistics.
+  for (int i = 0; i < STATISTIC_LAST; ++i) {
+    if (http_rtt_at_last_main_frame_[i] != nqe::internal::InvalidRTT()) {
+      base::HistogramBase* rtt_histogram = base::Histogram::FactoryGet(
+          base::StringPrintf("NQE.%s.MainFrame.RTT", GetNameForStatistic(i)), 1,
+          10 * 1000, 50, base::HistogramBase::kUmaTargetedHistogramFlag);
+      rtt_histogram->Add(http_rtt_at_last_main_frame_[i].InMilliseconds());
+    }
+  }
 }
 
 void NetworkQualityEstimator::ComputeEffectiveConnectionType() {
@@ -1285,7 +1330,7 @@
     base::TimeDelta* rtt) const {
   DCHECK(thread_checker_.CalledOnValidThread());
   *rtt = GetRTTEstimateInternal(disallowed_observation_sources_for_http_,
-                                start_time, 50);
+                                start_time, base::Optional<Statistic>(), 50);
   return (*rtt != nqe::internal::InvalidRTT());
 }
 
@@ -1294,7 +1339,7 @@
     base::TimeDelta* rtt) const {
   DCHECK(thread_checker_.CalledOnValidThread());
   *rtt = GetRTTEstimateInternal(disallowed_observation_sources_for_transport_,
-                                start_time, 50);
+                                start_time, base::Optional<Statistic>(), 50);
   return (*rtt != nqe::internal::InvalidRTT());
 }
 
@@ -1309,19 +1354,46 @@
 base::TimeDelta NetworkQualityEstimator::GetRTTEstimateInternal(
     const std::vector<NetworkQualityObservationSource>&
         disallowed_observation_sources,
-    const base::TimeTicks& start_time,
+    base::TimeTicks start_time,
+    const base::Optional<Statistic>& statistic,
     int percentile) const {
   DCHECK(thread_checker_.CalledOnValidThread());
 
   // RTT observations are sorted by duration from shortest to longest, thus
   // a higher percentile RTT will have a longer RTT than a lower percentile.
   base::TimeDelta rtt = nqe::internal::InvalidRTT();
-  if (!rtt_observations_.GetPercentile(start_time, signal_strength_dbm_, &rtt,
-                                       percentile,
-                                       disallowed_observation_sources)) {
-    return nqe::internal::InvalidRTT();
+
+  if (!statistic) {
+    // Use default statistic algorithm.
+    if (!rtt_observations_.GetPercentile(start_time, signal_strength_dbm_, &rtt,
+                                         percentile,
+                                         disallowed_observation_sources)) {
+      return nqe::internal::InvalidRTT();
+    }
+    return rtt;
   }
-  return rtt;
+
+  switch (statistic.value()) {
+    case STATISTIC_LAST:
+      NOTREACHED();
+      return nqe::internal::InvalidRTT();
+    case STATISTIC_WEIGHTED_AVERAGE:
+      if (!rtt_observations_.GetWeightedAverage(
+              start_time, signal_strength_dbm_, disallowed_observation_sources,
+              &rtt)) {
+        return nqe::internal::InvalidRTT();
+      }
+      return rtt;
+    case STATISTIC_UNWEIGHTED_AVERAGE:
+      if (!rtt_observations_.GetUnweightedAverage(
+              start_time, signal_strength_dbm_, disallowed_observation_sources,
+              &rtt)) {
+        return nqe::internal::InvalidRTT();
+      }
+      return rtt;
+  }
+  NOTREACHED();
+  return nqe::internal::InvalidRTT();
 }
 
 int32_t NetworkQualityEstimator::GetDownlinkThroughputKbpsEstimateInternal(
@@ -1730,4 +1802,19 @@
   ComputeEffectiveConnectionType();
 }
 
+const char* NetworkQualityEstimator::GetNameForStatistic(int i) const {
+  Statistic statistic = static_cast<Statistic>(i);
+  switch (statistic) {
+    case STATISTIC_WEIGHTED_AVERAGE:
+      return "WeightedAverage";
+    case STATISTIC_UNWEIGHTED_AVERAGE:
+      return "UnweightedAverage";
+    case STATISTIC_LAST:
+      NOTREACHED();
+      return "";
+  }
+  NOTREACHED();
+  return "";
+}
+
 }  // namespace net
diff --git a/net/nqe/network_quality_estimator.h b/net/nqe/network_quality_estimator.h
index e003654b..696e9b0 100644
--- a/net/nqe/network_quality_estimator.h
+++ b/net/nqe/network_quality_estimator.h
@@ -17,6 +17,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
+#include "base/optional.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "net/base/net_export.h"
@@ -320,6 +321,15 @@
       bool add_default_platform_observations,
       const NetLogWithSource& net_log);
 
+  // Different experimental statistic algorithms that can be used for computing
+  // the predictions.
+  enum Statistic {
+    STATISTIC_WEIGHTED_AVERAGE = 0,
+    STATISTIC_UNWEIGHTED_AVERAGE = 1,
+    // Last statistic. Not to be used.
+    STATISTIC_LAST = 2
+  };
+
   // NetworkChangeNotifier::ConnectionTypeObserver implementation:
   void OnConnectionTypeChanged(
       NetworkChangeNotifier::ConnectionType type) override;
@@ -385,6 +395,27 @@
   void OnUpdatedRTTAvailable(SocketPerformanceWatcherFactory::Protocol protocol,
                              const base::TimeDelta& rtt);
 
+  // Returns an estimate of network quality at the specified |percentile|.
+  // |disallowed_observation_sources| is the list of observation sources that
+  // should be excluded when computing the percentile.
+  // Only the observations later than |start_time| are taken into account.
+  // |percentile| must be between 0 and 100 (both inclusive) with higher
+  // percentiles indicating less performant networks. For example, if
+  // |percentile| is 90, then the network is expected to be faster than the
+  // returned estimate with 0.9 probability. Similarly, network is expected to
+  // be slower than the returned estimate with 0.1 probability. |statistic|
+  // is the statistic that should be used for computing the estimate. If unset,
+  // the default statistic is used. Virtualized for testing.
+  virtual base::TimeDelta GetRTTEstimateInternal(
+      const std::vector<NetworkQualityObservationSource>&
+          disallowed_observation_sources,
+      base::TimeTicks start_time,
+      const base::Optional<Statistic>& statistic,
+      int percentile) const;
+  int32_t GetDownlinkThroughputKbpsEstimateInternal(
+      const base::TimeTicks& start_time,
+      int percentile) const;
+
  private:
   FRIEND_TEST_ALL_PREFIXES(NetworkQualityEstimatorTest,
                            AdaptiveRecomputationEffectiveConnectionType);
@@ -483,24 +514,6 @@
   // current connection type to the observation buffer.
   void AddDefaultEstimates();
 
-  // Returns an estimate of network quality at the specified |percentile|.
-  // |disallowed_observation_sources| is the list of observation sources that
-  // should be excluded when computing the percentile.
-  // Only the observations later than |start_time| are taken into account.
-  // |percentile| must be between 0 and 100 (both inclusive) with higher
-  // percentiles indicating less performant networks. For example, if
-  // |percentile| is 90, then the network is expected to be faster than the
-  // returned estimate with 0.9 probability. Similarly, network is expected to
-  // be slower than the returned estimate with 0.1 probability.
-  base::TimeDelta GetRTTEstimateInternal(
-      const std::vector<NetworkQualityObservationSource>&
-          disallowed_observation_sources,
-      const base::TimeTicks& start_time,
-      int percentile) const;
-  int32_t GetDownlinkThroughputKbpsEstimateInternal(
-      const base::TimeTicks& start_time,
-      int percentile) const;
-
   // Returns the current network ID checking by calling the platform APIs.
   // Virtualized for testing.
   virtual nqe::internal::NetworkID GetCurrentNetworkID() const;
@@ -606,6 +619,8 @@
       const nqe::internal::NetworkID& network_id,
       const nqe::internal::CachedNetworkQuality& cached_network_quality);
 
+  const char* GetNameForStatistic(int i) const;
+
   // Determines if the requests to local host can be used in estimating the
   // network quality. Set to true only for tests.
   bool use_localhost_requests_;
@@ -689,6 +704,10 @@
   nqe::internal::NetworkQuality estimated_quality_at_last_main_frame_;
   EffectiveConnectionType effective_connection_type_at_last_main_frame_;
 
+  // Estimated RTT at HTTP layer when the last main frame transaction was
+  // started. Computed using different statistics.
+  base::TimeDelta http_rtt_at_last_main_frame_[STATISTIC_LAST];
+
   // Estimated network quality obtained from external estimate provider when the
   // external estimate provider was last queried.
   nqe::internal::NetworkQuality external_estimate_provider_quality_;
diff --git a/net/nqe/network_quality_estimator_test_util.cc b/net/nqe/network_quality_estimator_test_util.cc
index 000df14..dc8e28b 100644
--- a/net/nqe/network_quality_estimator_test_util.cc
+++ b/net/nqe/network_quality_estimator_test_util.cc
@@ -182,6 +182,19 @@
                                                                   kbps);
 }
 
+base::TimeDelta TestNetworkQualityEstimator::GetRTTEstimateInternal(
+    const std::vector<NetworkQualityObservationSource>&
+        disallowed_observation_sources,
+    base::TimeTicks start_time,
+    const base::Optional<NetworkQualityEstimator::Statistic>& statistic,
+    int percentile) const {
+  if (rtt_estimate_internal_)
+    return rtt_estimate_internal_.value();
+
+  return NetworkQualityEstimator::GetRTTEstimateInternal(
+      disallowed_observation_sources, start_time, statistic, percentile);
+}
+
 void TestNetworkQualityEstimator::SetAccuracyRecordingIntervals(
     const std::vector<base::TimeDelta>& accuracy_recording_intervals) {
   accuracy_recording_intervals_set_ = true;
diff --git a/net/nqe/network_quality_estimator_test_util.h b/net/nqe/network_quality_estimator_test_util.h
index 64770daf5f..4718a477 100644
--- a/net/nqe/network_quality_estimator_test_util.h
+++ b/net/nqe/network_quality_estimator_test_util.h
@@ -168,6 +168,20 @@
   bool GetRecentDownlinkThroughputKbps(const base::TimeTicks& start_time,
                                        int32_t* kbps) const override;
 
+  // Returns the recent HTTP RTT value that was set using
+  // |set_rtt_estimate_internal|. If it has not been set, then the base
+  // implementation is called.
+  base::TimeDelta GetRTTEstimateInternal(
+      const std::vector<NetworkQualityObservationSource>&
+          disallowed_observation_sources,
+      base::TimeTicks start_time,
+      const base::Optional<NetworkQualityEstimator::Statistic>& statistic,
+      int percentile) const override;
+
+  void set_rtt_estimate_internal(base::TimeDelta value) {
+    rtt_estimate_internal_ = value;
+  }
+
   void SetAccuracyRecordingIntervals(
       const std::vector<base::TimeDelta>& accuracy_recording_intervals);
 
@@ -234,6 +248,9 @@
   base::Optional<int32_t> start_time_null_downlink_throughput_kbps_;
   base::Optional<int32_t> recent_downlink_throughput_kbps_;
 
+  // If set, GetRTTEstimateInternal() would return the set value.
+  base::Optional<base::TimeDelta> rtt_estimate_internal_;
+
   double rand_double_;
 
   LocalHttpTestServer embedded_test_server_;
diff --git a/net/nqe/network_quality_estimator_unittest.cc b/net/nqe/network_quality_estimator_unittest.cc
index 55e3825..4c68ae0 100644
--- a/net/nqe/network_quality_estimator_unittest.cc
+++ b/net/nqe/network_quality_estimator_unittest.cc
@@ -18,6 +18,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_samples.h"
+#include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/test/histogram_tester.h"
@@ -300,6 +301,8 @@
 
   // Verify that metrics are logged correctly on main-frame requests.
   histogram_tester.ExpectTotalCount("NQE.MainFrame.RTT.Percentile50", 1);
+  histogram_tester.ExpectTotalCount("NQE.WeightedAverage.MainFrame.RTT", 1);
+  histogram_tester.ExpectTotalCount("NQE.UnweightedAverage.MainFrame.RTT", 1);
   histogram_tester.ExpectTotalCount("NQE.MainFrame.RTT.Percentile50.Unknown",
                                     1);
   histogram_tester.ExpectTotalCount("NQE.MainFrame.TransportRTT.Percentile50",
@@ -546,8 +549,7 @@
   context.set_network_quality_estimator(&estimator);
   context.Init();
 
-  // Push more observations than the maximum buffer size.
-  const size_t kMaxObservations = 1000;
+  const size_t kMaxObservations = 10;
   for (size_t i = 0; i < kMaxObservations; ++i) {
     std::unique_ptr<URLRequest> request(context.CreateRequest(
         estimator.GetEchoURL(), DEFAULT_PRIORITY, &test_delegate));
@@ -579,8 +581,9 @@
       NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC);
 
   EXPECT_EQ(nqe::internal::InvalidRTT(),
-            estimator.GetRTTEstimateInternal(disallowed_observation_sources,
-                                             base::TimeTicks(), 100));
+            estimator.GetRTTEstimateInternal(
+                disallowed_observation_sources, base::TimeTicks(),
+                base::Optional<NetworkQualityEstimator::Statistic>(), 100));
   EXPECT_EQ(nqe::internal::kInvalidThroughput,
             estimator.GetDownlinkThroughputKbpsEstimateInternal(
                 base::TimeTicks(), 100));
@@ -590,8 +593,7 @@
   context.set_network_quality_estimator(&estimator);
   context.Init();
 
-  // Number of observations are more than the maximum buffer size.
-  for (size_t i = 0; i < 1000U; ++i) {
+  for (size_t i = 0; i < 10U; ++i) {
     std::unique_ptr<URLRequest> request(context.CreateRequest(
         estimator.GetEchoURL(), DEFAULT_PRIORITY, &test_delegate));
     request->Start();
@@ -603,8 +605,9 @@
     EXPECT_GT(estimator.GetDownlinkThroughputKbpsEstimateInternal(
                   base::TimeTicks(), i),
               0);
-    EXPECT_LT(estimator.GetRTTEstimateInternal(disallowed_observation_sources,
-                                               base::TimeTicks(), i),
+    EXPECT_LT(estimator.GetRTTEstimateInternal(
+                  disallowed_observation_sources, base::TimeTicks(),
+                  base::Optional<NetworkQualityEstimator::Statistic>(), i),
               base::TimeDelta::Max());
 
     if (i != 0) {
@@ -614,11 +617,30 @@
                 estimator.GetDownlinkThroughputKbpsEstimateInternal(
                     base::TimeTicks(), i - 1));
 
+      // Weighted average statistic should be computed correctly.
+      EXPECT_NE(nqe::internal::InvalidRTT(),
+                estimator.GetRTTEstimateInternal(
+                    disallowed_observation_sources, base::TimeTicks(),
+                    NetworkQualityEstimator::STATISTIC_WEIGHTED_AVERAGE, i));
+
+      // Weighted average statistic should disregard the value of the percentile
+      // argument.
+      EXPECT_EQ(
+          estimator.GetRTTEstimateInternal(
+              disallowed_observation_sources, base::TimeTicks(),
+              NetworkQualityEstimator::STATISTIC_WEIGHTED_AVERAGE, i),
+          estimator.GetRTTEstimateInternal(
+              disallowed_observation_sources, base::TimeTicks(),
+              NetworkQualityEstimator::STATISTIC_WEIGHTED_AVERAGE, i - 1));
+
       // RTT percentiles are in increasing order.
-      EXPECT_GE(estimator.GetRTTEstimateInternal(disallowed_observation_sources,
-                                                 base::TimeTicks(), i),
-                estimator.GetRTTEstimateInternal(disallowed_observation_sources,
-                                                 base::TimeTicks(), i - 1));
+      EXPECT_GE(
+          estimator.GetRTTEstimateInternal(
+              disallowed_observation_sources, base::TimeTicks(),
+              base::Optional<NetworkQualityEstimator::Statistic>(), i),
+          estimator.GetRTTEstimateInternal(
+              disallowed_observation_sources, base::TimeTicks(),
+              base::Optional<NetworkQualityEstimator::Statistic>(), i - 1));
     }
   }
 }
@@ -2299,6 +2321,7 @@
       // Network was predicted to be slow and actually was slow.
       estimator.set_start_time_null_http_rtt(test.rtt);
       estimator.set_recent_http_rtt(test.recent_rtt);
+      estimator.set_rtt_estimate_internal(test.recent_rtt);
       estimator.set_start_time_null_transport_rtt(test.rtt);
       estimator.set_recent_transport_rtt(test.recent_rtt);
       estimator.set_start_time_null_downlink_throughput_kbps(
@@ -2394,6 +2417,21 @@
               rtt_sign_suffix_with_zero_samples + "." + interval_value +
               ".300_620",
           0);
+
+      // All samples are recorded in bucket 0 because recent HTTP RTT and
+      // HTTP RTT are equal when weighted or unweighted average algorithms are
+      // used.
+      histogram_tester.ExpectUniqueSample(
+          "NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff."
+          "Positive." +
+              interval_value + ".300_620",
+          0, 1);
+      histogram_tester.ExpectUniqueSample(
+          "NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff."
+          "Positive." +
+              interval_value + ".300_620",
+          0, 1);
+
       histogram_tester.ExpectUniqueSample(
           "NQE.Accuracy.TransportRTT.EstimatedObservedDiff." +
               rtt_sign_suffix_with_one_sample + "." + interval_value +
diff --git a/net/quic/core/congestion_control/windowed_filter.h b/net/quic/core/congestion_control/windowed_filter.h
index 4511649..0d56cfd 100644
--- a/net/quic/core/congestion_control/windowed_filter.h
+++ b/net/quic/core/congestion_control/windowed_filter.h
@@ -90,7 +90,14 @@
     if (Compare()(new_sample, estimates_[1].sample)) {
       estimates_[1] = Sample(new_sample, new_time);
       estimates_[2] = estimates_[1];
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-overflow"
+#endif
     } else if (Compare()(new_sample, estimates_[2].sample)) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
       estimates_[2] = Sample(new_sample, new_time);
     }
 
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc
index 69c4a21..9315364 100644
--- a/net/socket/ssl_client_socket_impl.cc
+++ b/net/socket/ssl_client_socket_impl.cc
@@ -481,33 +481,33 @@
 
 scoped_refptr<X509Certificate>
 SSLClientSocketImpl::PeerCertificateChain::AsOSChain() const {
-  // DER-encode the chain and convert to a platform certificate handle.
-  std::vector<std::string> chain;
-  chain.reserve(sk_X509_num(openssl_chain_.get()));
-  for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) {
-    X509* x = sk_X509_value(openssl_chain_.get(), i);
-    // Note: This intentionally avoids using x509_util::GetDER(), which may
-    // cache the encoded DER on |x|, as |x| is shared with the underlying
-    // socket (SSL*) this chain belongs to. As the DER will only be used
-    // once in //net, within this code, this avoids needlessly caching
-    // additional data. See https://crbug.com/642082
-    int len = i2d_X509(x, nullptr);
-    if (len < 0)
-      return nullptr;
-    std::string cert;
-    uint8_t* ptr = reinterpret_cast<uint8_t*>(base::WriteInto(&cert, len + 1));
-    len = i2d_X509(x, &ptr);
-    if (len < 0) {
-      NOTREACHED();
-      return nullptr;
-    }
-    chain.push_back(std::move(cert));
+#if defined(USE_OPENSSL_CERTS)
+  // When OSCertHandle is typedef'ed to X509, this implementation does a short
+  // cut to avoid converting back and forth between DER and the X509 struct.
+  X509Certificate::OSCertHandles intermediates;
+  for (size_t i = 1; i < sk_X509_num(openssl_chain_.get()); ++i) {
+    X509* cert = sk_X509_value(openssl_chain_.get(), i);
+    DCHECK(cert->buf);
+    intermediates.push_back(cert);
   }
-  std::vector<base::StringPiece> stringpiece_chain;
-  for (const auto& cert : chain)
-    stringpiece_chain.push_back(cert);
 
-  return X509Certificate::CreateFromDERCertChain(stringpiece_chain);
+  X509* leaf = sk_X509_value(openssl_chain_.get(), 0);
+  DCHECK(leaf->buf);
+  return X509Certificate::CreateFromHandle(leaf, intermediates);
+#else
+  // Convert the certificate chains to a platform certificate handle.
+  std::vector<base::StringPiece> der_chain;
+  der_chain.reserve(sk_X509_num(openssl_chain_.get()));
+  for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) {
+    X509* cert = sk_X509_value(openssl_chain_.get(), i);
+    DCHECK(cert->buf);
+    base::StringPiece der;
+    if (!x509_util::GetDER(cert, &der))
+      return nullptr;
+    der_chain.push_back(der);
+  }
+  return X509Certificate::CreateFromDERCertChain(der_chain);
+#endif
 }
 
 // static
diff --git a/remoting/host/security_key/fake_security_key_ipc_server.cc b/remoting/host/security_key/fake_security_key_ipc_server.cc
index 561ed31..e47ff23 100644
--- a/remoting/host/security_key/fake_security_key_ipc_server.cc
+++ b/remoting/host/security_key/fake_security_key_ipc_server.cc
@@ -130,7 +130,7 @@
 
   ipc_server_map_[connection_id] = fake_ipc_server->AsWeakPtr();
 
-  return fake_ipc_server;
+  return std::move(fake_ipc_server);
 }
 
 base::WeakPtr<FakeSecurityKeyIpcServer>
diff --git a/skia/ext/skia_utils_base.cc b/skia/ext/skia_utils_base.cc
index c56730b..041c4c7 100644
--- a/skia/ext/skia_utils_base.cc
+++ b/skia/ext/skia_utils_base.cc
@@ -2,10 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "skia/ext/skia_utils_base.h"
+
 #include <stdint.h>
 
-#include "skia/ext/skia_utils_base.h"
-#include "third_party/skia/include/core/SkFontLCDConfig.h"
+#include "base/pickle.h"
 
 namespace skia {
 
@@ -76,30 +77,4 @@
          pickle->WriteUInt16(style.slant());
 }
 
-SkPixelGeometry ComputeDefaultPixelGeometry() {
-  SkFontLCDConfig::LCDOrder order = SkFontLCDConfig::GetSubpixelOrder();
-  if (SkFontLCDConfig::kNONE_LCDOrder == order) {
-    return kUnknown_SkPixelGeometry;
-  }
-
-  // Bit0 is RGB(0), BGR(1)
-  // Bit1 is H(0), V(1)
-  const SkPixelGeometry gGeo[] = {
-    kRGB_H_SkPixelGeometry,
-    kBGR_H_SkPixelGeometry,
-    kRGB_V_SkPixelGeometry,
-    kBGR_V_SkPixelGeometry,
-  };
-  int index = 0;
-  if (SkFontLCDConfig::kBGR_LCDOrder == order) {
-    index |= 1;
-  }
-  if (SkFontLCDConfig::kVertical_LCDOrientation ==
-      SkFontLCDConfig::GetSubpixelOrientation()) {
-    index |= 2;
-  }
-  return gGeo[index];
-}
-
 }  // namespace skia
-
diff --git a/skia/ext/skia_utils_base.h b/skia/ext/skia_utils_base.h
index 6af5cf74..82da02b2 100644
--- a/skia/ext/skia_utils_base.h
+++ b/skia/ext/skia_utils_base.h
@@ -5,9 +5,12 @@
 #ifndef SKIA_EXT_SKIA_UTILS_BASE_H_
 #define SKIA_EXT_SKIA_UTILS_BASE_H_
 
-#include "base/pickle.h"
 #include "third_party/skia/include/ports/SkFontConfigInterface.h"
-#include "third_party/skia/include/core/SkSurfaceProps.h"
+
+namespace base {
+class Pickle;
+class PickleIterator;
+}
 
 namespace skia {
 
@@ -35,10 +38,6 @@
 // Return true if str can be written into the request pickle.
 SK_API bool WriteSkFontStyle(base::Pickle* pickle, SkFontStyle style);
 
-// Determine the default pixel geometry (for LCD) by querying the font host
-SK_API SkPixelGeometry ComputeDefaultPixelGeometry();
-
 }  // namespace skia
 
 #endif  // SKIA_EXT_SKIA_UTILS_BASE_H_
-
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 770e11d..4f74778b 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -1201,6 +1201,9 @@
         "test": "chrome_junit_tests"
       },
       {
+        "test": "components_gcm_driver_junit_tests"
+      },
+      {
         "test": "components_invalidation_impl_junit_tests"
       },
       {
@@ -2445,6 +2448,9 @@
         "test": "chrome_junit_tests"
       },
       {
+        "test": "components_gcm_driver_junit_tests"
+      },
+      {
         "test": "components_invalidation_impl_junit_tests"
       },
       {
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index c5a6d2c..fd088c3 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -320,6 +320,10 @@
     "label": "//components:components_browsertests",
     "type": "windowed_test_launcher",
   },
+  "components_gcm_driver_junit_tests": {
+    "label": "//components/gcm_driver/android:components_gcm_driver_junit_tests",
+    "type": "junit_test",
+  },
   "components_invalidation_impl_junit_tests": {
     "label": "//components/invalidation/impl:components_invalidation_impl_junit_tests",
     "type": "junit_test",
diff --git a/testing/buildbot/manage.py b/testing/buildbot/manage.py
index 3312cdd..3c617688 100755
--- a/testing/buildbot/manage.py
+++ b/testing/buildbot/manage.py
@@ -160,6 +160,7 @@
 
   # These are listed in Builders that are skipped for other reasons.
   'chrome_junit_tests',
+  'components_gcm_driver_junit_tests',
   'components_invalidation_impl_junit_tests',
   'components_policy_junit_tests',
   'components_variations_junit_tests',
diff --git a/testing/libfuzzer/tests/fuzzer_launcher_test.cc b/testing/libfuzzer/tests/fuzzer_launcher_test.cc
index 625a821..bd7cbc3 100644
--- a/testing/libfuzzer/tests/fuzzer_launcher_test.cc
+++ b/testing/libfuzzer/tests/fuzzer_launcher_test.cc
@@ -23,7 +23,8 @@
     exe_path.DirName().Append("check_fuzzer_config.py").value();
 
   std::string output;
-  base::CommandLine cmd({{launcher_path, "test_dict_only.options"}});
+  base::CommandLine cmd(
+      std::vector<std::string>({launcher_path, "test_dict_only.options"}));
   bool success = base::GetAppOutputAndError(cmd, &output);
   EXPECT_TRUE(success);
   std::vector<std::string> fuzzer_args = base::SplitString(
@@ -43,7 +44,8 @@
     exe_path.DirName().Append("check_fuzzer_config.py").value();
 
   std::string output;
-  base::CommandLine cmd({{launcher_path, "test_config_only.options"}});
+  base::CommandLine cmd(
+      std::vector<std::string>({launcher_path, "test_config_only.options"}));
   bool success = base::GetAppOutputAndError(cmd, &output);
   EXPECT_TRUE(success);
   std::vector<std::string> fuzzer_args = base::SplitString(
@@ -64,7 +66,8 @@
     exe_path.DirName().Append("check_fuzzer_config.py").value();
 
   std::string output;
-  base::CommandLine cmd({{launcher_path, "test_config_and_dict.options"}});
+  base::CommandLine cmd(std::vector<std::string>(
+      {launcher_path, "test_config_and_dict.options"}));
   bool success = base::GetAppOutputAndError(cmd, &output);
   EXPECT_TRUE(success);
   std::vector<std::string> fuzzer_args = base::SplitString(
@@ -87,8 +90,8 @@
     exe_path.DirName().Append("check_fuzzer_config.py").value();
 
   std::string output;
-  base::CommandLine cmd(
-      {{launcher_path, "test_config_and_seed_corpus.options"}});
+  base::CommandLine cmd(std::vector<std::string>(
+      {launcher_path, "test_config_and_seed_corpus.options"}));
   bool success = base::GetAppOutputAndError(cmd, &output);
   EXPECT_TRUE(success);
   std::vector<std::string> fuzzer_args = base::SplitString(
@@ -103,8 +106,8 @@
   launcher_path =
     exe_path.DirName().Append("check_seed_corpus_archive.py").value();
 
-  cmd = base::CommandLine(
-      {{launcher_path, "test_config_and_seed_corpus_seed_corpus.zip"}});
+  cmd = base::CommandLine(std::vector<std::string>(
+      {launcher_path, "test_config_and_seed_corpus_seed_corpus.zip"}));
   success = base::GetAppOutputAndError(cmd, &output);
   EXPECT_TRUE(success);
   std::vector<std::string> seed_corpus_info = base::SplitString(
@@ -123,8 +126,8 @@
     exe_path.DirName().Append("check_fuzzer_config.py").value();
 
   std::string output;
-  base::CommandLine cmd(
-      {{launcher_path, "test_config_and_seed_corpuses.options"}});
+  base::CommandLine cmd(std::vector<std::string>(
+      {launcher_path, "test_config_and_seed_corpuses.options"}));
   bool success = base::GetAppOutputAndError(cmd, &output);
   EXPECT_TRUE(success);
   std::vector<std::string> fuzzer_args = base::SplitString(
@@ -139,8 +142,8 @@
   launcher_path =
     exe_path.DirName().Append("check_seed_corpus_archive.py").value();
 
-  cmd = base::CommandLine(
-      {{launcher_path, "test_config_and_seed_corpuses_seed_corpus.zip"}});
+  cmd = base::CommandLine(std::vector<std::string>(
+      {launcher_path, "test_config_and_seed_corpuses_seed_corpus.zip"}));
   success = base::GetAppOutputAndError(cmd, &output);
   EXPECT_TRUE(success);
   std::vector<std::string> seed_corpus_info = base::SplitString(
@@ -159,7 +162,8 @@
     exe_path.DirName().Append("check_fuzzer_config.py").value();
 
   std::string output;
-  base::CommandLine cmd({{launcher_path, "test_dict_from_subdir.options"}});
+  base::CommandLine cmd(std::vector<std::string>(
+      {launcher_path, "test_dict_from_subdir.options"}));
   bool success = base::GetAppOutputAndError(cmd, &output);
   EXPECT_TRUE(success);
   std::vector<std::string> fuzzer_args = base::SplitString(
diff --git a/third_party/WebKit/LayoutTests/editing/deleting/delete-block-merge-contents-010.html b/third_party/WebKit/LayoutTests/editing/deleting/delete-block-merge-contents-010.html
index 99122ff9..52f83d5 100644
--- a/third_party/WebKit/LayoutTests/editing/deleting/delete-block-merge-contents-010.html
+++ b/third_party/WebKit/LayoutTests/editing/deleting/delete-block-merge-contents-010.html
@@ -1,45 +1,59 @@
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
 <script>
+test(() => assert_selection(
+  [
+    '<div contenteditable>',
+      'One',
+      '<div>',
+        '|Two<br>',
+        '<div>Three<br></div>',
+      '</div>',
+      'Four',
+    '</div>'
+  ].join(''),
+  'delete',
+  [
+    '<div contenteditable>',
+      'One|Two',
+      '<div>',
+        '<div>Three<br></div>',
+      '</div>',
+      'Four',
+    '</div>'
+  ].join('')), 'First merge');
 
-function editingTest() {
-    for (i = 0; i < 4; i++)
-        moveSelectionForwardByCharacterCommand();    
-    deleteCommand();
-    for (i = 0; i < 4; i++)
-        moveSelectionForwardByCharacterCommand();    
-    deleteCommand();
-    for (i = 0; i < 6; i++)
-        moveSelectionForwardByCharacterCommand();    
-    deleteCommand();
-}
+test(() => assert_selection(
+  [
+    '<div contenteditable>',
+      'OneTwo',
+      '<div>',
+        '<div>|Three<br></div>',
+      '</div>',
+      'Four',
+    '</div>'
+  ].join(''),
+  'delete',
+  [
+    '<div contenteditable>',
+      'OneTwo|Three<br>',
+      'Four',
+    '</div>'
+  ].join('')), 'Second merge');
 
+test(() => assert_selection(
+  [
+    '<div contenteditable>',
+      'OneTwoThree<br>',
+      '|Four',
+    '</div>'
+  ].join(''),
+  'delete',
+  [
+    '<div contenteditable>',
+      'OneTwoThree|Four',
+    '</div>'
+  ].join('')), 'Third merge');
 </script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-<div contenteditable id="root" class="editing">
-<div id="test">
-One 
-<div>Two<br><div>Three<br></div></div>
-Four
-</div>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-text-at-tabspan-002.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-text-at-tabspan-002.html
index 325c68bf0..65c3adc 100644
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-text-at-tabspan-002.html
+++ b/third_party/WebKit/LayoutTests/editing/inserting/insert-text-at-tabspan-002.html
@@ -1,35 +1,24 @@
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
 <script>
-
-function editingTest() {
-    for (i = 0; i < 2; i++)
-	    moveSelectionForwardByCharacterCommand();
-    typeCharacterCommand();
-}
-
+test(() => assert_selection(
+  [
+    '<div contenteditable>',
+      'a',
+      '<span class="Apple-tab-span" style="white-space:pre">	|		</span>',
+      'z',
+    '</div>'
+  ].join(''),
+  'insertText x',
+  [
+    '<div contenteditable>',
+      'a',
+      '<span class="Apple-tab-span" style="white-space:pre">	</span>',
+      'x|',
+      '<span class="Apple-tab-span" style="white-space:pre">		</span>',
+      'z',
+    '</div>'
+  ].join('')), 'Insert text in tabspan');
 </script>
-
-<title>Editing Test</title> 
-</head> 
-<body style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; ">
-<div contenteditable id="root" class="editing">
-<span id="test">a<span class="Apple-tab-span" style="white-space:pre">			</span>z</span>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002-expected.txt b/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002-expected.txt
deleted file mode 100644
index f265278..0000000
--- a/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002-expected.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-
-You should see a\tax\t\tz below:
-| "
-"
-| <span>
-|   id="test"
-|   "a"
-|   <span>
-|     class="Apple-tab-span"
-|     style="white-space:pre"
-|     "	"
-|   "ax<#selection-caret>"
-|   <span>
-|     class="Apple-tab-span"
-|     style="white-space:pre"
-|     "		"
-|   "z"
-| "
-"
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002.html b/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002.html
index b2b847b2..679908e 100644
--- a/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002.html
+++ b/third_party/WebKit/LayoutTests/editing/pasteboard/paste-text-at-tabspan-002.html
@@ -1,29 +1,33 @@
-<!DOCTYPE html>
-<html>
-<body style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; ">
-<div contenteditable id="root" style="border: 2px solid red; padding: 12px; font-size: 24px">
-<span id="test">a<span class="Apple-tab-span" style="white-space:pre">			</span>z</span>
-</div>
-<script src="../editing.js"></script>
-<script src="../../resources/dump-as-markup.js"></script>
+<!doctype html>
+<head>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
 <script>
+test(() => {
+  assert_not_equals(window.internals, undefined,
+                    'This test requires clipboard access');
 
-var test = document.getElementById('test');
-test.focus();
-window.getSelection().collapse(test, 0);
-
-if (window.testRunner)
-    testRunner.dumpEditingCallbacks();
-
-extendSelectionForwardByCharacterCommand();
-copyCommand();
-for (i = 0; i < 2; i++)
-	moveSelectionForwardByCharacterCommand();
-pasteCommand();
-typeCharacterCommand();
-
-Markup.dump('root', 'You should see a\\tax\\t\\tz below');
-
+  assert_selection(
+    [
+      '<div contenteditable>',
+        'a',
+        '<span class="Apple-tab-span" style="white-space:pre">	|		</span>',
+        'z',
+      '</div>'
+    ].join(''),
+    selection => {
+      selection.setClipboardData('a');
+      selection.document.execCommand('paste');
+    },
+    [
+      '<div contenteditable>',
+        'a',
+        '<span class="Apple-tab-span" style="white-space:pre">	</span>',
+        'a|',
+        '<span class="Apple-tab-span" style="white-space:pre">		</span>',
+        'z',
+      '</div>'
+    ].join(''));
+}, 'Paste text in tabspan');
 </script>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/pasting-object.html b/third_party/WebKit/LayoutTests/editing/pasteboard/pasting-object.html
index 05fe9f1..bff2f4c 100644
--- a/third_party/WebKit/LayoutTests/editing/pasteboard/pasting-object.html
+++ b/third_party/WebKit/LayoutTests/editing/pasteboard/pasting-object.html
@@ -1,19 +1,15 @@
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
 <script>
-if (window.testRunner)
-     testRunner.dumpEditingCallbacks();
-</script>
-<body>
-<p>This tests for a bug where attachments dragged into Mail documents blew all content after the position being pasted into.  You should see "Hello[black box] World!" below.</p>
-<div id="test" contenteditable="true">Hello World!</div>
-</body>
-
-<script>
-if (window.internals)
-    internals.settings.setEditingBehavior('mac');
-var s = window.getSelection();
-s.collapse(document.getElementById("test"), 0);
-
-s.modify("move", "forward", "word");
-
-document.execCommand("InsertHTML", false, "<object style='border: 1px solid #aaa;'></object>");
+test(() => assert_selection(
+  '<div contenteditable>Hello| World!</div>',
+  'insertHTML <object style="border: 1px solid #aaa;"></object>',
+  [
+    '<div contenteditable>',
+      'Hello<object style="border: 1px solid #aaa;"></object>|\u00A0World!',
+    '</div>'
+  ].join('')),
+  'Paste object');
 </script>
diff --git a/third_party/WebKit/LayoutTests/editing/style/bold_italic_linebreak.html b/third_party/WebKit/LayoutTests/editing/style/bold_italic_linebreak.html
new file mode 100644
index 0000000..537b68bd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/editing/style/bold_italic_linebreak.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../assert_selection.js"></script>
+<script>
+test(() => assert_selection(
+  [
+    '<div contenteditable>',
+      'here is <i>^some</i> text<br>',
+      'here| is some more text',
+    '</div>'
+  ].join(''),
+  'bold',
+  [
+    '<div contenteditable>',
+      'here is <b><i>^some</i> text<br>',
+      'here|</b> is some more text',
+    '</div>'
+  ].join('')), 'Bold with itatic and line break');
+</script>
diff --git a/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix-expected.txt b/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix-expected.txt
deleted file mode 100644
index 1a5be74..0000000
--- a/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix-expected.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-here is some text
-here is some more text
-execBoldCommand: <span id="test">here is <b><i>some</i> text<br>here</b> is some more text</span>
diff --git a/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix.html b/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix.html
deleted file mode 100644
index 8d47caa93..0000000
--- a/third_party/WebKit/LayoutTests/editing/style/style-3690704-fix.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<html> 
-<head>
-<style>
-.editing { 
-    border: 2px solid red; 
-    padding: 12px; 
-    font-size: 24px; 
-}
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
-<script>
-
-function editingTest() {
-    for (i = 0; i < 8; i++) {
-        moveSelectionForwardByCharacterCommand();
-    }
-    for (i = 0; i < 14; i++) {
-        extendSelectionForwardByCharacterCommand();
-    }
-    execBoldCommand();
-}
-
-</script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-<div contenteditable id="root" class="editing">
-<span id="test">here is <i>some</i> text<br>here is some more text</span>
-</div>
-
-<script>
-runDumpAsTextEditingTest(true);
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/style/style-boundary-005.html b/third_party/WebKit/LayoutTests/editing/style/style-boundary-005.html
deleted file mode 100644
index 845fee1..0000000
--- a/third_party/WebKit/LayoutTests/editing/style/style-boundary-005.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<html> 
-<head>
-
-<style>
-.editing { 
-    border: 2px solid red; 
-}
-.explanation { 
-    border: 2px solid blue; 
-    padding: 12px; 
-    font-size: 24px; 
-    margin-bottom: 24px;
-}
-.scenario { margin-bottom: 16px;}
-.scenario:first-line { font-weight: bold; margin-bottom: 16px;}
-.expected-results:first-line { font-weight: bold }
-</style>
-<script src=../editing.js language="JavaScript" type="text/JavaScript" ></script>
-
-<script>
-if (window.internals)
-    internals.settings.setEditingBehavior('mac');
-
-function editingTest() {
-    moveSelectionForwardByLineCommand();
-    boldCommand();
-    typeCharacterCommand(' ');
-    typeCharacterCommand('f');
-    typeCharacterCommand('o');
-    typeCharacterCommand('u');
-    typeCharacterCommand('r');
-    moveSelectionBackwardByLineCommand();
-    extendSelectionForwardByWordCommand();
-    copyCommand();
-    moveSelectionForwardByWordCommand();
-    moveSelectionForwardByWordCommand();
-    moveSelectionForwardByWordCommand();
-    pasteCommand();
-}
-
-</script>
-
-<title>Editing Test</title> 
-</head> 
-<body>
-
-<div class="explanation">
-<div class="scenario">
-Tests: 
-<br>
-Pasting at style boundary does not crash or produce empty style span(s).
-</div>
-<div class="expected-results">
-Expected Results:
-<br>
-Should see this content in the red box below:
-<br><div>one two three <b>four</b>one</div>
-</div>
-</div>
-
-<div contenteditable id="root">
-<div id="test" class="editing">one two three</div>
-</div>
-
-<script>
-runEditingTest();
-</script>
-
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/style/style_boundary.html b/third_party/WebKit/LayoutTests/editing/style/style_boundary.html
index ec063ff..57ecf59e 100644
--- a/third_party/WebKit/LayoutTests/editing/style/style_boundary.html
+++ b/third_party/WebKit/LayoutTests/editing/style/style_boundary.html
@@ -61,4 +61,25 @@
             '</div>'
         ].join('')),
         'B element should not spread beyond DIV');
+
+    test(() => {
+      assert_not_equals(window.internals, undefined,
+                        'This test requires clipboard access');
+
+      assert_selection(
+        [
+            '<div contenteditable>',
+                'one two three<b>\u00A0four|</b>',
+            '</div>'
+        ].join(''),
+        selection => {
+          selection.setClipboardData('one');
+          selection.document.execCommand('paste');
+        },
+        [
+            '<div contenteditable>',
+                'one two three<b>\u00A0four</b>one|',
+            '</div>'
+        ].join(''));
+    }, 'Pasting at style boundary does not crash or produce empty style span(s)');
 </script>
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/coverage-test.js b/third_party/WebKit/LayoutTests/inspector/coverage/coverage-test.js
index 38e24885..1f0b4947 100644
--- a/third_party/WebKit/LayoutTests/inspector/coverage/coverage-test.js
+++ b/third_party/WebKit/LayoutTests/inspector/coverage/coverage-test.js
@@ -2,8 +2,21 @@
 
 InspectorTest.preloadModule("coverage");
 
-InspectorTest.sourceDecorated = async function(source) {
+InspectorTest.startCoverage = function()
+{
+    UI.viewManager.showView("coverage");
+    var coverageView = self.runtime.sharedInstance(Coverage.CoverageView);
+    coverageView._startRecording();
+}
 
+InspectorTest.stopCoverage = function()
+{
+    var coverageView = self.runtime.sharedInstance(Coverage.CoverageView);
+    return coverageView._stopRecording();
+}
+
+InspectorTest.sourceDecorated = async function(source)
+{
     await UI.inspectorView.showPanel("sources");
     var decoratePromise = InspectorTest.addSnifferPromise(Coverage.CoverageView.LineDecorator.prototype, "decorate");
     await new Promise(fulfill => InspectorTest.showScriptSource(source, fulfill));
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view.html b/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view.html
index 22f232b..f11289e 100644
--- a/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view.html
+++ b/third_party/WebKit/LayoutTests/inspector/coverage/coverage-view.html
@@ -2,38 +2,28 @@
 <head>
 <script src="../../http/tests/inspector/inspector-test.js"></script>
 <script src="../../http/tests/inspector/elements-test.js"></script>
+<script src="coverage-test.js"></script>
 <script src="resources/coverage.js"></script>
 
 <link rel="stylesheet" type="text/css" href="resources/highlight-in-source.css">
 
 <script>
-
-var initialize_CoverageTest = function() {
-    InspectorTest.preloadModule("coverage");
-}
-
 async function test()
 {
-    var coverageView = self.runtime.sharedInstance(Coverage.CoverageView);
-    InspectorTest.addSniffer(coverageView._listView, "update", displayResults);
-
-    UI.viewManager.showView("coverage");
-    coverageView._toggleRecording(true);
+    InspectorTest.startCoverage();
     await InspectorTest.evaluateInPagePromise("performActions()");
-    coverageView._toggleRecording(false);
+    await InspectorTest.stopCoverage();
 
-    function displayResults()
-    {
-        var dataGrid = coverageView._listView._dataGrid;
-        for (var child of dataGrid.rootNode().children) {
-            var data = child._coverageInfo;
-            var url = InspectorTest.formatters.formatAsURL(data.url);
-            if (url.endsWith("-test.js") || url.endsWith(".html"))
-                continue;
-            InspectorTest.addResult(`${url} used: ${data.usedSize} unused: ${data.unusedSize} total: ${data.size}`);
-        }
-        InspectorTest.completeTest();
+    var coverageView = self.runtime.sharedInstance(Coverage.CoverageView);
+    var dataGrid = coverageView._listView._dataGrid;
+    for (var child of dataGrid.rootNode().children) {
+        var data = child._coverageInfo;
+        var url = InspectorTest.formatters.formatAsURL(data.url);
+        if (url.endsWith("-test.js") || url.endsWith(".html"))
+            continue;
+        InspectorTest.addResult(`${url} used: ${data.usedSize} unused: ${data.unusedSize} total: ${data.size}`);
     }
+    InspectorTest.completeTest();
 }
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter.html b/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter.html
index 135fde3..a50976a 100644
--- a/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter.html
+++ b/third_party/WebKit/LayoutTests/inspector/coverage/decorations-after-inplace-formatter.html
@@ -3,67 +3,36 @@
 <script src="../../http/tests/inspector/inspector-test.js"></script>
 <script src="../../http/tests/inspector/debugger-test.js"></script>
 <script src="../../http/tests/inspector/sources-test.js"></script>
+<script src="coverage-test.js"></script>
 
 <link rel="stylesheet" type="text/css" href="resources/decorations-after-inplace-formatter.css">
+
 <script>
-
-var initialize_CoverageTest = function() {
-    InspectorTest.preloadModule("coverage");
-}
-
-function test()
+async function test()
 {
-    var scriptFormatter;
+    InspectorTest.startCoverage();
+    await InspectorTest.evaluateInPagePromise("performActions()");
+    await InspectorTest.stopCoverage();
+    await UI.inspectorView.showPanel("sources");
+    var formatter = await inplaceFormatter();
+    await InspectorTest.sourceDecorated("decorations-after-inplace-formatter.css");
+    var decoratorPromise = InspectorTest.addSnifferPromise(Coverage.CoverageView.LineDecorator.prototype, "decorate");
+    formatter._formatSourceInPlace();
+    await decoratorPromise;
 
-    var tracker = self.runtime.sharedInstance(Coverage.CoverageView);
-    InspectorTest.addSniffer(Coverage.CoverageView.prototype, "_updateGutter", onTracingFinished);
+    var lines = Array.prototype.map.call(document.querySelectorAll(".text-editor-coverage-unused-marker"),
+                                         e => e.parentElement.previousSibling.textContent);
+    InspectorTest.addResult("Formatted line numbers of rules that were not used:");
+    InspectorTest.addResult(lines);
+    InspectorTest.completeTest();
 
-    tracker._toggleRecording(true);
-    UI.viewManager.showView("coverage");
-    tracker._toggleRecording(false);
-
-    function onTracingFinished()
+    async function inplaceFormatter()
     {
-        UI.inspectorView.showPanel("sources").then(formatterSetup);
-    }
-    function formatterSetup()
-    {
-        inplaceFormatter().then(function(sf) {
-            scriptFormatter = sf;
-            showSource();
-        });
-    }
-    function showSource()
-    {
-        InspectorTest.addSniffer(Coverage.CoverageView.LineDecorator.prototype, "decorate", formatSource);
-        InspectorTest.showScriptSource("decorations-after-inplace-formatter.css");
-    }
-
-    function formatSource(frame) 
-    {
-        InspectorTest.addSniffer(Coverage.CoverageView.LineDecorator.prototype, "decorate", uiSourceCodeScriptFormatted);
-        scriptFormatter._formatSourceInPlace();
-    }
-
-    function uiSourceCodeScriptFormatted()
-    {
-        var lines = Array.prototype.map.call(document.querySelectorAll(".text-editor-coverage-unused-marker"),
-                                                e => e.parentElement.previousSibling.textContent);
-
-        InspectorTest.addResult("Formatted line numbers of rules that were not used:");
-        InspectorTest.addResult(lines);   
-        InspectorTest.completeTest();
-    }
-
-    function inplaceFormatter()
-    {
-        return self.runtime.allInstances(Sources.SourcesView.EditorAction).then(function(editorActions) {
-            for (var i = 0; i < editorActions.length; ++i) {
-                if (editorActions[i] instanceof Sources.InplaceFormatterEditorAction)
-                    return editorActions[i];
-            }
-            return null;
-        });
+        var editorActions = await self.runtime.allInstances(Sources.SourcesView.EditorAction);
+        for (var i = 0; i < editorActions.length; ++i) {
+            if (editorActions[i] instanceof Sources.InplaceFormatterEditorAction)
+                return editorActions[i];
+        }
     }
 }
 </script>
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/gutter-css.html b/third_party/WebKit/LayoutTests/inspector/coverage/gutter-css.html
index 5e47ec8..95df6a4 100644
--- a/third_party/WebKit/LayoutTests/inspector/coverage/gutter-css.html
+++ b/third_party/WebKit/LayoutTests/inspector/coverage/gutter-css.html
@@ -14,12 +14,9 @@
 
 async function test()
 {
-    var coverageView = self.runtime.sharedInstance(Coverage.CoverageView);
-
-    coverageView._toggleRecording(true);
-    UI.viewManager.showView("coverage");
-    coverageView._toggleRecording(false);
-    await InspectorTest.addSnifferPromise(Coverage.CoverageView.prototype, "_updateGutter");
+    InspectorTest.startCoverage();
+    await InspectorTest.evaluateInPagePromise("performActions()");
+    await InspectorTest.stopCoverage();
     await InspectorTest.sourceDecorated("highlight-in-source.css");
 
     var lines = Array.prototype.map.call(document.querySelectorAll(".text-editor-coverage-unused-marker"),
diff --git a/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js.html b/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js.html
index c72a3524..cc11606 100644
--- a/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js.html
+++ b/third_party/WebKit/LayoutTests/inspector/coverage/gutter-js.html
@@ -10,13 +10,9 @@
 
 async function test()
 {
-    var coverageView = self.runtime.sharedInstance(Coverage.CoverageView);
-
-    UI.viewManager.showView("coverage");
-    coverageView._toggleRecording(true);
+    InspectorTest.startCoverage();
     await InspectorTest.evaluateInPagePromise("performActions()");
-    coverageView._toggleRecording(false);
-    await InspectorTest.addSnifferPromise(Coverage.CoverageView.prototype, "_updateGutter");
+    await InspectorTest.stopCoverage();
     await InspectorTest.sourceDecorated("coverage.js");
 
     var lines = Array.prototype.map.call(document.querySelectorAll(".text-editor-coverage-unused-marker"),
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.png
deleted file mode 100644
index 77bbb7a..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.txt
deleted file mode 100644
index 2b7a67f1..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/deleting/delete-block-merge-contents-010-expected.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutBlockFlow {DIV} at (14,14) size 756x28
-          LayoutText {#text} at (0,0) size 140x27
-            text run at (0,0) width 140: "OneTwoThree"
-          LayoutText {#text} at (139,0) size 46x27
-            text run at (139,0) width 46: "Four"
-caret: position 12 of child 0 {#text} of child 1 {DIV} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.png
deleted file mode 100644
index f093785a..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.txt
deleted file mode 100644
index 7c98246..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/inserting/insert-text-at-tabspan-002-expected.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 155x27
-          LayoutText {#text} at (14,14) size 11x27
-            text run at (14,14) width 11: "a"
-          LayoutInline {SPAN} at (0,0) size 37x27
-            LayoutText {#text} at (25,14) size 37x27
-              text run at (25,14) width 37: "\x{9}"
-          LayoutText {#text} at (62,14) size 12x27
-            text run at (62,14) width 12: "x"
-          LayoutInline {SPAN} at (0,0) size 84x27
-            LayoutText {#text} at (74,14) size 84x27
-              text run at (74,14) width 84: "\x{9}\x{9}"
-          LayoutText {#text} at (158,14) size 11x27
-            text run at (158,14) width 11: "z"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 2 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.png
deleted file mode 100644
index 57dc868..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.txt
deleted file mode 100644
index ee800d6d..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/pasteboard/pasting-object-expected.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 757x39
-          text run at (0,0) width 757: "This tests for a bug where attachments dragged into Mail documents blew all content after the position being pasted into."
-          text run at (0,20) width 316: "You should see \"Hello[black box] World!\" below."
-      LayoutBlockFlow {DIV} at (0,56) size 784x157
-        LayoutText {#text} at (0,137) size 35x19
-          text run at (0,137) width 35: "Hello"
-        LayoutText {#text} at (337,137) size 48x19
-          text run at (337,137) width 48: " World!"
-layer at (43,64) size 302x152
-  LayoutEmbeddedObject {OBJECT} at (35,0) size 302x152 [border: (1px solid #AAAAAA)]
-caret: position 1 of child 1 {OBJECT} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.png
deleted file mode 100644
index c9ed79c..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.txt
deleted file mode 100644
index ef6ce29..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/style/style-boundary-005-expected.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x182 [border: (2px solid #0000FF)]
-        LayoutBlockFlow {DIV} at (14,14) size 756x55
-          LayoutText {#text} at (0,0) size 65x26
-            text run at (0,0) width 65: "Tests: "
-          LayoutBR {BR} at (0,0) size 0x0
-          LayoutText {#text} at (0,27) size 698x27
-            text run at (0,27) width 698: "Pasting at style boundary does not crash or produce empty style span(s)."
-        LayoutBlockFlow {DIV} at (14,85) size 756x83
-          LayoutBlockFlow (anonymous) at (0,0) size 756x55
-            LayoutText {#text} at (0,0) size 189x26
-              text run at (0,0) width 189: "Expected Results: "
-            LayoutBR {BR} at (189,21) size 0x0
-            LayoutText {#text} at (0,27) size 442x27
-              text run at (0,27) width 442: "Should see this content in the red box below: "
-            LayoutBR {BR} at (442,48) size 0x0
-          LayoutBlockFlow {DIV} at (0,55) size 756x28
-            LayoutText {#text} at (0,0) size 138x27
-              text run at (0,0) width 138: "one two three "
-            LayoutInline {B} at (0,0) size 44x26
-              LayoutText {#text} at (138,0) size 44x26
-                text run at (138,0) width 44: "four"
-            LayoutText {#text} at (182,0) size 35x27
-              text run at (182,0) width 35: "one"
-      LayoutBlockFlow {DIV} at (0,206) size 784x24
-        LayoutBlockFlow {DIV} at (0,0) size 784x24 [border: (2px solid #FF0000)]
-          LayoutText {#text} at (2,2) size 86x19
-            text run at (2,2) width 86: "one two three"
-          LayoutInline {B} at (0,0) size 33x19
-            LayoutText {#text} at (88,2) size 33x19
-              text run at (88,2) width 33: " four"
-          LayoutText {#text} at (121,2) size 23x19
-            text run at (121,2) width 23: "one"
-caret: position 3 of child 2 {#text} of child 1 {DIV} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.png
deleted file mode 100644
index eb796c7..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.txt
deleted file mode 100644
index 356dcdb2..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/deleting/delete-block-merge-contents-010-expected.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutBlockFlow {DIV} at (14,14) size 756x28
-          LayoutText {#text} at (0,0) size 139x28
-            text run at (0,0) width 139: "OneTwoThree"
-          LayoutText {#text} at (138,0) size 46x28
-            text run at (138,0) width 46: "Four"
-caret: position 12 of child 0 {#text} of child 1 {DIV} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.png
deleted file mode 100644
index 64e74769..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.txt
deleted file mode 100644
index 670c1761..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/inserting/insert-text-at-tabspan-002-expected.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 155x28
-          LayoutText {#text} at (14,14) size 11x28
-            text run at (14,14) width 11: "a"
-          LayoutInline {SPAN} at (0,0) size 38x28
-            LayoutText {#text} at (24,14) size 38x28
-              text run at (24,14) width 38: "\x{9}"
-          LayoutText {#text} at (62,14) size 12x28
-            text run at (62,14) width 12: "x"
-          LayoutInline {SPAN} at (0,0) size 84x28
-            LayoutText {#text} at (74,14) size 84x28
-              text run at (74,14) width 84: "\x{9}\x{9}"
-          LayoutText {#text} at (158,14) size 11x28
-            text run at (158,14) width 11: "z"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 2 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.png
deleted file mode 100644
index 3b69247..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.txt
deleted file mode 100644
index 12ea543..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/pasteboard/pasting-object-expected.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 775x36
-          text run at (0,0) width 775: "This tests for a bug where attachments dragged into Mail documents blew all content after the position being pasted into."
-          text run at (0,18) width 318: "You should see \"Hello[black box] World!\" below."
-      LayoutBlockFlow {DIV} at (0,52) size 784x156
-        LayoutText {#text} at (0,138) size 36x18
-          text run at (0,138) width 36: "Hello"
-        LayoutText {#text} at (337,138) size 50x18
-          text run at (337,138) width 50: " World!"
-layer at (44,60) size 302x152
-  LayoutEmbeddedObject {OBJECT} at (35.55,0) size 302x152 [border: (1px solid #AAAAAA)]
-caret: position 1 of child 1 {OBJECT} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.png
deleted file mode 100644
index 8afe3ec7..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.txt
deleted file mode 100644
index dcce3b3..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/style/style-boundary-005-expected.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x184 [border: (2px solid #0000FF)]
-        LayoutBlockFlow {DIV} at (14,14) size 756x56
-          LayoutText {#text} at (0,0) size 66x28
-            text run at (0,0) width 66: "Tests: "
-          LayoutBR {BR} at (0,0) size 0x0
-          LayoutText {#text} at (0,28) size 694x28
-            text run at (0,28) width 694: "Pasting at style boundary does not crash or produce empty style span(s)."
-        LayoutBlockFlow {DIV} at (14,86) size 756x84
-          LayoutBlockFlow (anonymous) at (0,0) size 756x56
-            LayoutText {#text} at (0,0) size 190x28
-              text run at (0,0) width 190: "Expected Results: "
-            LayoutBR {BR} at (189,22) size 1x0
-            LayoutText {#text} at (0,28) size 438x28
-              text run at (0,28) width 438: "Should see this content in the red box below: "
-            LayoutBR {BR} at (437,50) size 1x0
-          LayoutBlockFlow {DIV} at (0,56) size 756x28
-            LayoutText {#text} at (0,0) size 137x28
-              text run at (0,0) width 137: "one two three "
-            LayoutInline {B} at (0,0) size 45x28
-              LayoutText {#text} at (136,0) size 45x28
-                text run at (136,0) width 45: "four"
-            LayoutText {#text} at (180,0) size 36x28
-              text run at (180,0) width 36: "one"
-      LayoutBlockFlow {DIV} at (0,208) size 784x22
-        LayoutBlockFlow {DIV} at (0,0) size 784x22 [border: (2px solid #FF0000)]
-          LayoutText {#text} at (2,2) size 88x18
-            text run at (2,2) width 88: "one two three"
-          LayoutInline {B} at (0,0) size 34x18
-            LayoutText {#text} at (89,2) size 34x18
-              text run at (89,2) width 34: " four"
-          LayoutText {#text} at (122,2) size 24x18
-            text run at (122,2) width 24: "one"
-caret: position 3 of child 2 {#text} of child 1 {DIV} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.png
deleted file mode 100644
index a0733d9..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.txt
deleted file mode 100644
index d948065..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/deleting/delete-block-merge-contents-010-expected.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x55 [border: (2px solid #FF0000)]
-        LayoutBlockFlow {DIV} at (14,14) size 756x27
-          LayoutText {#text} at (0,0) size 139x26
-            text run at (0,0) width 139: "OneTwoThree"
-          LayoutText {#text} at (138,0) size 46x26
-            text run at (138,0) width 46: "Four"
-caret: position 12 of child 0 {#text} of child 1 {DIV} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.png
deleted file mode 100644
index 738d306..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.txt
deleted file mode 100644
index 15cb964..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/inserting/insert-text-at-tabspan-002-expected.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x55 [border: (2px solid #FF0000)]
-        LayoutInline {SPAN} at (0,0) size 155x26
-          LayoutText {#text} at (14,14) size 11x26
-            text run at (14,14) width 11: "a"
-          LayoutInline {SPAN} at (0,0) size 38x26
-            LayoutText {#text} at (24,14) size 38x26
-              text run at (24,14) width 38: "\x{9}"
-          LayoutText {#text} at (62,14) size 12x26
-            text run at (62,14) width 12: "x"
-          LayoutInline {SPAN} at (0,0) size 84x26
-            LayoutText {#text} at (74,14) size 84x26
-              text run at (74,14) width 84: "\x{9}\x{9}"
-          LayoutText {#text} at (158,14) size 11x26
-            text run at (158,14) width 11: "z"
-        LayoutText {#text} at (0,0) size 0x0
-caret: position 1 of child 2 {#text} of child 1 {SPAN} of child 1 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.png
deleted file mode 100644
index 06a5ce8a5..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.txt
deleted file mode 100644
index 542955d..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/pasteboard/pasting-object-expected.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 775x35
-          text run at (0,0) width 775: "This tests for a bug where attachments dragged into Mail documents blew all content after the position being pasted into."
-          text run at (0,18) width 318: "You should see \"Hello[black box] World!\" below."
-      LayoutBlockFlow {DIV} at (0,52) size 784x156
-        LayoutText {#text} at (0,138) size 36x17
-          text run at (0,138) width 36: "Hello"
-        LayoutText {#text} at (337,138) size 50x17
-          text run at (337,138) width 50: " World!"
-layer at (44,60) size 302x152
-  LayoutEmbeddedObject {OBJECT} at (35.55,0) size 302x152 [border: (1px solid #AAAAAA)]
-caret: position 1 of child 1 {OBJECT} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.png
deleted file mode 100644
index b4b87f43..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.txt
deleted file mode 100644
index ac86bb5..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/style/style-boundary-005-expected.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification
-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {DIV} at (0,0) size 784x179 [border: (2px solid #0000FF)]
-        LayoutBlockFlow {DIV} at (14,14) size 756x54
-          LayoutText {#text} at (0,0) size 66x26
-            text run at (0,0) width 66: "Tests: "
-          LayoutBR {BR} at (0,0) size 0x0
-          LayoutText {#text} at (0,27) size 694x26
-            text run at (0,27) width 694: "Pasting at style boundary does not crash or produce empty style span(s)."
-        LayoutBlockFlow {DIV} at (14,84) size 756x81
-          LayoutBlockFlow (anonymous) at (0,0) size 756x54
-            LayoutText {#text} at (0,0) size 190x26
-              text run at (0,0) width 190: "Expected Results: "
-            LayoutBR {BR} at (189,21) size 1x0
-            LayoutText {#text} at (0,27) size 438x26
-              text run at (0,27) width 438: "Should see this content in the red box below: "
-            LayoutBR {BR} at (437,48) size 1x0
-          LayoutBlockFlow {DIV} at (0,54) size 756x27
-            LayoutText {#text} at (0,0) size 137x26
-              text run at (0,0) width 137: "one two three "
-            LayoutInline {B} at (0,0) size 45x26
-              LayoutText {#text} at (136,0) size 45x26
-                text run at (136,0) width 45: "four"
-            LayoutText {#text} at (180,0) size 36x26
-              text run at (180,0) width 36: "one"
-      LayoutBlockFlow {DIV} at (0,203) size 784x22
-        LayoutBlockFlow {DIV} at (0,0) size 784x22 [border: (2px solid #FF0000)]
-          LayoutText {#text} at (2,2) size 88x17
-            text run at (2,2) width 88: "one two three"
-          LayoutInline {B} at (0,0) size 34x17
-            LayoutText {#text} at (89,2) size 34x17
-              text run at (89,2) width 34: " four"
-          LayoutText {#text} at (122,2) size 24x17
-            text run at (122,2) width 24: "one"
-caret: position 3 of child 2 {#text} of child 1 {DIV} of child 3 {DIV} of body
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn
index af3524a1..2c49d32 100644
--- a/third_party/WebKit/Source/core/BUILD.gn
+++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -1298,6 +1298,8 @@
     "layout/compositing/CompositingReasonFinderTest.cpp",
     "layout/line/InlineBoxTest.cpp",
     "layout/line/InlineTextBoxTest.cpp",
+    "layout/ng/geometry/ng_logical_offset_test.cc",
+    "layout/ng/geometry/ng_physical_rect_test.cc",
     "layout/ng/ng_absolute_utils_test.cc",
     "layout/ng/ng_block_child_iterator_test.cc",
     "layout/ng/ng_block_layout_algorithm_test.cc",
diff --git a/third_party/WebKit/Source/core/css/MediaValues.cpp b/third_party/WebKit/Source/core/css/MediaValues.cpp
index 4b00df2f..c35e294 100644
--- a/third_party/WebKit/Source/core/css/MediaValues.cpp
+++ b/third_party/WebKit/Source/core/css/MediaValues.cpp
@@ -9,7 +9,6 @@
 #include "core/css/MediaValuesDynamic.h"
 #include "core/dom/Document.h"
 #include "core/dom/Element.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/FrameView.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/Settings.h"
@@ -46,8 +45,8 @@
 }
 
 int MediaValues::calculateDeviceWidth(LocalFrame* frame) {
-  ASSERT(frame && frame->view() && frame->settings() && frame->host());
-  blink::WebScreenInfo screenInfo = frame->host()->chromeClient().screenInfo();
+  DCHECK(frame && frame->view() && frame->settings() && frame->page());
+  blink::WebScreenInfo screenInfo = frame->page()->chromeClient().screenInfo();
   int deviceWidth = screenInfo.rect.width;
   if (frame->settings()->getReportScreenSizeInPhysicalPixelsQuirk())
     deviceWidth = lroundf(deviceWidth * screenInfo.deviceScaleFactor);
@@ -55,8 +54,8 @@
 }
 
 int MediaValues::calculateDeviceHeight(LocalFrame* frame) {
-  ASSERT(frame && frame->view() && frame->settings() && frame->host());
-  blink::WebScreenInfo screenInfo = frame->host()->chromeClient().screenInfo();
+  DCHECK(frame && frame->view() && frame->settings() && frame->page());
+  blink::WebScreenInfo screenInfo = frame->page()->chromeClient().screenInfo();
   int deviceHeight = screenInfo.rect.height;
   if (frame->settings()->getReportScreenSizeInPhysicalPixelsQuirk())
     deviceHeight = lroundf(deviceHeight * screenInfo.deviceScaleFactor);
@@ -75,17 +74,17 @@
 int MediaValues::calculateColorBitsPerComponent(LocalFrame* frame) {
   ASSERT(frame && frame->page() && frame->page()->mainFrame());
   if (!frame->page()->mainFrame()->isLocalFrame() ||
-      frame->host()->chromeClient().screenInfo().isMonochrome)
+      frame->page()->chromeClient().screenInfo().isMonochrome)
     return 0;
-  return frame->host()->chromeClient().screenInfo().depthPerComponent;
+  return frame->page()->chromeClient().screenInfo().depthPerComponent;
 }
 
 int MediaValues::calculateMonochromeBitsPerComponent(LocalFrame* frame) {
   ASSERT(frame && frame->page() && frame->page()->mainFrame());
   if (!frame->page()->mainFrame()->isLocalFrame() ||
-      !frame->host()->chromeClient().screenInfo().isMonochrome)
+      !frame->page()->chromeClient().screenInfo().isMonochrome)
     return 0;
-  return frame->host()->chromeClient().screenInfo().depthPerComponent;
+  return frame->page()->chromeClient().screenInfo().depthPerComponent;
 }
 
 int MediaValues::calculateDefaultFontSize(LocalFrame* frame) {
@@ -142,14 +141,14 @@
 }
 
 DisplayShape MediaValues::calculateDisplayShape(LocalFrame* frame) {
-  DCHECK(frame && frame->host());
-  return frame->host()->chromeClient().screenInfo().displayShape;
+  DCHECK(frame && frame->page());
+  return frame->page()->chromeClient().screenInfo().displayShape;
 }
 
 ColorSpaceGamut MediaValues::calculateColorGamut(LocalFrame* frame) {
-  DCHECK(frame && frame->host());
+  DCHECK(frame && frame->page());
   return ColorSpaceUtilities::getColorSpaceGamut(
-      frame->host()->chromeClient().screenInfo());
+      frame->page()->chromeClient().screenInfo());
 }
 
 bool MediaValues::computeLengthImpl(double value,
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 39cc41e..8a5abde 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -2525,9 +2525,8 @@
   if (m_focusedElement.get()) {
     Element* oldFocusedElement = m_focusedElement;
     m_focusedElement = nullptr;
-    if (frameHost())
-      frameHost()->chromeClient().focusedNodeChanged(oldFocusedElement,
-                                                     nullptr);
+    if (page())
+      page()->chromeClient().focusedNodeChanged(oldFocusedElement, nullptr);
   }
   m_sequentialFocusNavigationStartingPoint = nullptr;
 
@@ -3574,7 +3573,7 @@
 
 void Document::updateViewportDescription() {
   if (frame() && frame()->isMainFrame()) {
-    frameHost()->chromeClient().dispatchViewportPropertiesDidChange(
+    page()->chromeClient().dispatchViewportPropertiesDidChange(
         viewportDescription());
   }
 }
@@ -4139,9 +4138,10 @@
                                            newFocusedElement);
   }
 
-  if (!focusChangeBlocked && frameHost())
-    frameHost()->chromeClient().focusedNodeChanged(oldFocusedElement,
-                                                   m_focusedElement.get());
+  if (!focusChangeBlocked && page()) {
+    page()->chromeClient().focusedNodeChanged(oldFocusedElement,
+                                              m_focusedElement.get());
+  }
 
 SetFocusedElementDone:
   updateStyleAndLayoutTree();
diff --git a/third_party/WebKit/Source/core/editing/InputMethodController.cpp b/third_party/WebKit/Source/core/editing/InputMethodController.cpp
index be4e5a0..0647e19 100644
--- a/third_party/WebKit/Source/core/editing/InputMethodController.cpp
+++ b/third_party/WebKit/Source/core/editing/InputMethodController.cpp
@@ -35,6 +35,8 @@
 #include "core/editing/Editor.h"
 #include "core/editing/commands/TypingCommand.h"
 #include "core/editing/markers/DocumentMarkerController.h"
+#include "core/editing/state_machines/BackwardCodePointStateMachine.h"
+#include "core/editing/state_machines/ForwardCodePointStateMachine.h"
 #include "core/events/CompositionEvent.h"
 #include "core/frame/LocalFrame.h"
 #include "core/html/HTMLInputElement.h"
@@ -185,6 +187,75 @@
   return element->fastGetAttribute(HTMLNames::inputmodeAttr).lower();
 }
 
+constexpr int invalidDeletionLength = -1;
+constexpr bool isInvalidDeletionLength(const int length) {
+  return length == invalidDeletionLength;
+}
+
+int calculateBeforeDeletionLengthsInCodePoints(
+    const String& text,
+    const int beforeLengthInCodePoints,
+    const int selectionStart) {
+  DCHECK_GE(beforeLengthInCodePoints, 0);
+  DCHECK_GE(selectionStart, 0);
+  DCHECK_LE(selectionStart, static_cast<int>(text.length()));
+
+  const UChar* uText = text.characters16();
+  BackwardCodePointStateMachine backwardMachine;
+  int counter = beforeLengthInCodePoints;
+  int deletionStart = selectionStart;
+  while (counter > 0 && deletionStart > 0) {
+    const TextSegmentationMachineState state =
+        backwardMachine.feedPrecedingCodeUnit(uText[deletionStart - 1]);
+    // According to Android's InputConnection spec, we should do nothing if
+    // |text| has invalid surrogate pair in the deletion range.
+    if (state == TextSegmentationMachineState::Invalid)
+      return invalidDeletionLength;
+
+    if (backwardMachine.atCodePointBoundary())
+      --counter;
+    --deletionStart;
+  }
+  if (!backwardMachine.atCodePointBoundary())
+    return invalidDeletionLength;
+
+  const int offset = backwardMachine.getBoundaryOffset();
+  DCHECK_EQ(-offset, selectionStart - deletionStart);
+  return -offset;
+}
+
+int calculateAfterDeletionLengthsInCodePoints(const String& text,
+                                              const int afterLengthInCodePoints,
+                                              const int selectionEnd) {
+  DCHECK_GE(afterLengthInCodePoints, 0);
+  DCHECK_GE(selectionEnd, 0);
+  const int length = text.length();
+  DCHECK_LE(selectionEnd, length);
+
+  const UChar* uText = text.characters16();
+  ForwardCodePointStateMachine forwardMachine;
+  int counter = afterLengthInCodePoints;
+  int deletionEnd = selectionEnd;
+  while (counter > 0 && deletionEnd < length) {
+    const TextSegmentationMachineState state =
+        forwardMachine.feedFollowingCodeUnit(uText[deletionEnd]);
+    // According to Android's InputConnection spec, we should do nothing if
+    // |text| has invalid surrogate pair in the deletion range.
+    if (state == TextSegmentationMachineState::Invalid)
+      return invalidDeletionLength;
+
+    if (forwardMachine.atCodePointBoundary())
+      --counter;
+    ++deletionEnd;
+  }
+  if (!forwardMachine.atCodePointBoundary())
+    return invalidDeletionLength;
+
+  const int offset = forwardMachine.getBoundaryOffset();
+  DCHECK_EQ(offset, deletionEnd - selectionEnd);
+  return offset;
+}
+
 }  // anonymous namespace
 
 InputMethodController* InputMethodController::create(LocalFrame& frame) {
@@ -904,6 +975,47 @@
   setSelectionOffsets(PlainTextRange(selectionStart, selectionEnd));
 }
 
+void InputMethodController::deleteSurroundingTextInCodePoints(int before,
+                                                              int after) {
+  DCHECK_GE(before, 0);
+  DCHECK_GE(after, 0);
+  if (!editor().canEdit())
+    return;
+  const PlainTextRange selectionOffsets(getSelectionOffsets());
+  if (selectionOffsets.isNull())
+    return;
+  Element* const rootEditableElement =
+      frame().selection().rootEditableElementOrDocumentElement();
+  if (!rootEditableElement)
+    return;
+
+  const TextIteratorBehavior& behavior =
+      TextIteratorBehavior::Builder()
+          .setEmitsObjectReplacementCharacter(true)
+          .build();
+  const String& text = plainText(
+      EphemeralRange::rangeOfContents(*rootEditableElement), behavior);
+
+  // 8-bit characters are Latin-1 characters, so the deletion lengths are
+  // trivial.
+  if (text.is8Bit())
+    return deleteSurroundingText(before, after);
+
+  const int selectionStart = static_cast<int>(selectionOffsets.start());
+  const int selectionEnd = static_cast<int>(selectionOffsets.end());
+
+  const int beforeLength =
+      calculateBeforeDeletionLengthsInCodePoints(text, before, selectionStart);
+  if (isInvalidDeletionLength(beforeLength))
+    return;
+  const int afterLength =
+      calculateAfterDeletionLengthsInCodePoints(text, after, selectionEnd);
+  if (isInvalidDeletionLength(afterLength))
+    return;
+
+  return deleteSurroundingText(beforeLength, afterLength);
+}
+
 WebTextInputInfo InputMethodController::textInputInfo() const {
   WebTextInputInfo info;
   if (!isAvailable())
diff --git a/third_party/WebKit/Source/core/editing/InputMethodController.h b/third_party/WebKit/Source/core/editing/InputMethodController.h
index 035b9cd..36ad6116 100644
--- a/third_party/WebKit/Source/core/editing/InputMethodController.h
+++ b/third_party/WebKit/Source/core/editing/InputMethodController.h
@@ -101,6 +101,7 @@
                                          int end,
                                          size_t textLength) const;
   void deleteSurroundingText(int before, int after);
+  void deleteSurroundingTextInCodePoints(int before, int after);
   WebTextInputInfo textInputInfo() const;
   WebTextInputType textInputType() const;
 
diff --git a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
index 322e836..03f0071 100644
--- a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
+++ b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
@@ -746,6 +746,125 @@
   EXPECT_EQ(2u, controller().getSelectionOffsets().end());
 }
 
+TEST_F(InputMethodControllerTest,
+       DeleteSurroundingTextInCodePointsWithMultiCodeTextOnTheLeft) {
+  HTMLInputElement* input =
+      toHTMLInputElement(insertHTMLElement("<input id='sample'>", "sample"));
+
+  // 'a' + "black star" + SPACE + "trophy" + SPACE + composed text (U+0E01
+  // "ka kai" + U+0E49 "mai tho").
+  // A "black star" is 1 grapheme cluster. It has 1 code point, and its length
+  // is 1 (abbreviated as [1,1,1]). A "trophy": [1,1,2]. The composed text:
+  // [1,2,2].
+  input->setValue(String::fromUTF8(
+      "a\xE2\x98\x85 \xF0\x9F\x8F\x86 \xE0\xB8\x81\xE0\xB9\x89"));
+  document().updateStyleAndLayout();
+  // The cursor is at the end of the text.
+  controller().setEditableSelectionOffsets(PlainTextRange(8, 8));
+
+  controller().deleteSurroundingTextInCodePoints(2, 0);
+  EXPECT_STREQ("a\xE2\x98\x85 \xF0\x9F\x8F\x86 ", input->value().utf8().data());
+  controller().deleteSurroundingTextInCodePoints(4, 0);
+  EXPECT_STREQ("a", input->value().utf8().data());
+
+  // 'a' + "black star" + SPACE + "trophy" + SPACE + composed text
+  input->setValue(String::fromUTF8(
+      "a\xE2\x98\x85 \xF0\x9F\x8F\x86 \xE0\xB8\x81\xE0\xB9\x89"));
+  document().updateStyleAndLayout();
+  // The cursor is at the end of the text.
+  controller().setEditableSelectionOffsets(PlainTextRange(8, 8));
+
+  // TODO(yabinh): We should only delete 1 code point instead of the entire
+  // grapheme cluster (2 code points). The root cause is that we adjust the
+  // selection by grapheme cluster in deleteSurroundingText().
+  controller().deleteSurroundingTextInCodePoints(1, 0);
+  EXPECT_STREQ("a\xE2\x98\x85 \xF0\x9F\x8F\x86 ", input->value().utf8().data());
+}
+
+TEST_F(InputMethodControllerTest,
+       DeleteSurroundingTextInCodePointsWithMultiCodeTextOnTheRight) {
+  HTMLInputElement* input =
+      toHTMLInputElement(insertHTMLElement("<input id='sample'>", "sample"));
+
+  // 'a' + "black star" + SPACE + "trophy" + SPACE + composed text
+  input->setValue(String::fromUTF8(
+      "a\xE2\x98\x85 \xF0\x9F\x8F\x86 \xE0\xB8\x81\xE0\xB9\x89"));
+  document().updateStyleAndLayout();
+  controller().setEditableSelectionOffsets(PlainTextRange(0, 0));
+
+  controller().deleteSurroundingTextInCodePoints(0, 5);
+  EXPECT_STREQ("\xE0\xB8\x81\xE0\xB9\x89", input->value().utf8().data());
+
+  controller().deleteSurroundingTextInCodePoints(0, 1);
+  // TODO(yabinh): Same here. We should only delete 1 code point.
+  EXPECT_STREQ("", input->value().utf8().data());
+}
+
+TEST_F(InputMethodControllerTest,
+       DeleteSurroundingTextInCodePointsWithMultiCodeTextOnBothSides) {
+  HTMLInputElement* input =
+      toHTMLInputElement(insertHTMLElement("<input id='sample'>", "sample"));
+
+  // 'a' + "black star" + SPACE + "trophy" + SPACE + composed text
+  input->setValue(String::fromUTF8(
+      "a\xE2\x98\x85 \xF0\x9F\x8F\x86 \xE0\xB8\x81\xE0\xB9\x89"));
+  document().updateStyleAndLayout();
+  controller().setEditableSelectionOffsets(PlainTextRange(3, 3));
+  controller().deleteSurroundingTextInCodePoints(2, 2);
+  EXPECT_STREQ("a\xE0\xB8\x81\xE0\xB9\x89", input->value().utf8().data());
+}
+
+TEST_F(InputMethodControllerTest, DeleteSurroundingTextInCodePointsWithImage) {
+  Element* div = insertHTMLElement(
+      "<div id='sample' contenteditable>aaa"
+      "<img src='empty.png'>bbb</div>",
+      "sample");
+
+  controller().setEditableSelectionOffsets(PlainTextRange(4, 4));
+  controller().deleteSurroundingTextInCodePoints(1, 1);
+  EXPECT_STREQ("aaabb", div->innerText().utf8().data());
+  EXPECT_EQ(3u, controller().getSelectionOffsets().start());
+  EXPECT_EQ(3u, controller().getSelectionOffsets().end());
+}
+
+TEST_F(InputMethodControllerTest,
+       DeleteSurroundingTextInCodePointsWithInvalidSurrogatePair) {
+  HTMLInputElement* input =
+      toHTMLInputElement(insertHTMLElement("<input id='sample'>", "sample"));
+
+  // 'a' + high surrogate of "trophy" + "black star" + low surrogate of "trophy"
+  // + SPACE
+  const UChar uText[] = {'a', 0xD83C, 0x2605, 0xDFC6, ' ', '\0'};
+  const String& text = String(uText);
+
+  input->setValue(text);
+  document().updateStyleAndLayout();
+  // The invalid high surrogate is encoded as '\xED\xA0\xBC', and invalid low
+  // surrogate is encoded as '\xED\xBF\x86'.
+  EXPECT_STREQ("a\xED\xA0\xBC\xE2\x98\x85\xED\xBF\x86 ",
+               input->value().utf8().data());
+
+  controller().setEditableSelectionOffsets(PlainTextRange(5, 5));
+  // Delete a SPACE.
+  controller().deleteSurroundingTextInCodePoints(1, 0);
+  EXPECT_STREQ("a\xED\xA0\xBC\xE2\x98\x85\xED\xBF\x86",
+               input->value().utf8().data());
+  // Do nothing since there is an invalid surrogate in the requested range.
+  controller().deleteSurroundingTextInCodePoints(2, 0);
+  EXPECT_STREQ("a\xED\xA0\xBC\xE2\x98\x85\xED\xBF\x86",
+               input->value().utf8().data());
+
+  controller().setEditableSelectionOffsets(PlainTextRange(0, 0));
+  // Delete 'a'.
+  controller().deleteSurroundingTextInCodePoints(0, 1);
+  EXPECT_STREQ("\xED\xA0\xBC\xE2\x98\x85\xED\xBF\x86",
+               input->value().utf8().data());
+  // Do nothing since there is an invalid surrogate in the requested range.
+  controller().deleteSurroundingTextInCodePoints(0, 2);
+  EXPECT_STREQ("\xED\xA0\xBC\xE2\x98\x85\xED\xBF\x86",
+               input->value().utf8().data());
+}
+
 TEST_F(InputMethodControllerTest, SetCompositionForInputWithNewCaretPositions) {
   HTMLInputElement* input =
       toHTMLInputElement(insertHTMLElement("<input id='sample'>", "sample"));
diff --git a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
index a3f78b1f..756813b 100644
--- a/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
+++ b/third_party/WebKit/Source/core/editing/commands/EditorCommand.cpp
@@ -52,7 +52,6 @@
 #include "core/editing/serializers/Serialization.h"
 #include "core/editing/spellcheck/SpellChecker.h"
 #include "core/events/Event.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/FrameView.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/Settings.h"
@@ -63,6 +62,7 @@
 #include "core/layout/LayoutBox.h"
 #include "core/page/ChromeClient.h"
 #include "core/page/EditorClient.h"
+#include "core/page/Page.h"
 #include "platform/Histogram.h"
 #include "platform/KillRing.h"
 #include "platform/UserGestureIndicator.h"
@@ -1546,10 +1546,10 @@
                          Event*,
                          EditorCommandSource,
                          const String&) {
-  FrameHost* host = frame.host();
-  if (!host)
+  Page* page = frame.page();
+  if (!page)
     return false;
-  return host->chromeClient().print(&frame);
+  return page->chromeClient().print(&frame);
 }
 
 static bool executeRedo(LocalFrame& frame,
diff --git a/third_party/WebKit/Source/core/frame/BarProp.cpp b/third_party/WebKit/Source/core/frame/BarProp.cpp
index e403c7c..95c97573 100644
--- a/third_party/WebKit/Source/core/frame/BarProp.cpp
+++ b/third_party/WebKit/Source/core/frame/BarProp.cpp
@@ -28,9 +28,9 @@
 
 #include "core/frame/BarProp.h"
 
-#include "core/frame/FrameHost.h"
 #include "core/frame/LocalFrame.h"
 #include "core/page/ChromeClient.h"
+#include "core/page/Page.h"
 
 namespace blink {
 
@@ -44,19 +44,19 @@
 bool BarProp::visible() const {
   if (!frame())
     return false;
-  DCHECK(frame()->host());
+  DCHECK(frame()->page());
 
   switch (m_type) {
     case Locationbar:
     case Personalbar:
     case Toolbar:
-      return frame()->host()->chromeClient().toolbarsVisible();
+      return frame()->page()->chromeClient().toolbarsVisible();
     case Menubar:
-      return frame()->host()->chromeClient().menubarVisible();
+      return frame()->page()->chromeClient().menubarVisible();
     case Scrollbars:
-      return frame()->host()->chromeClient().scrollbarsVisible();
+      return frame()->page()->chromeClient().scrollbarsVisible();
     case Statusbar:
-      return frame()->host()->chromeClient().statusbarVisible();
+      return frame()->page()->chromeClient().statusbarVisible();
   }
 
   NOTREACHED();
diff --git a/third_party/WebKit/Source/core/frame/BrowserControls.cpp b/third_party/WebKit/Source/core/frame/BrowserControls.cpp
index 88ed3d4..762ebc7 100644
--- a/third_party/WebKit/Source/core/frame/BrowserControls.cpp
+++ b/third_party/WebKit/Source/core/frame/BrowserControls.cpp
@@ -4,11 +4,13 @@
 
 #include "core/frame/BrowserControls.h"
 
+#include <algorithm>  // for std::min and std::max
+
 #include "core/frame/FrameHost.h"
 #include "core/frame/VisualViewport.h"
 #include "core/page/ChromeClient.h"
+#include "core/page/Page.h"
 #include "platform/geometry/FloatSize.h"
-#include <algorithm>  // for std::min and std::max
 
 namespace blink {
 
@@ -86,7 +88,7 @@
     return;
 
   m_shownRatio = shownRatio;
-  m_frameHost->chromeClient().didUpdateBrowserControls();
+  m_frameHost->page().chromeClient().didUpdateBrowserControls();
 }
 
 void BrowserControls::updateConstraintsAndState(
@@ -123,7 +125,7 @@
 
   m_height = height;
   m_shrinkViewport = shrinkViewport;
-  m_frameHost->chromeClient().didUpdateBrowserControls();
+  m_frameHost->page().chromeClient().didUpdateBrowserControls();
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp b/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp
index 527414b..a9b0fc8 100644
--- a/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp
+++ b/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp
@@ -213,19 +213,19 @@
     bool hasActiveHandlers) {
   switch (handlerClass) {
     case ScrollEvent:
-      m_frameHost->chromeClient().setHasScrollEventHandlers(frame,
-                                                            hasActiveHandlers);
+      m_frameHost->page().chromeClient().setHasScrollEventHandlers(
+          frame, hasActiveHandlers);
       break;
     case WheelEventBlocking:
     case WheelEventPassive:
-      m_frameHost->chromeClient().setEventListenerProperties(
+      m_frameHost->page().chromeClient().setEventListenerProperties(
           frame, WebEventListenerClass::MouseWheel,
           webEventListenerProperties(hasEventHandlers(WheelEventBlocking),
                                      hasEventHandlers(WheelEventPassive)));
       break;
     case TouchStartOrMoveEventBlocking:
     case TouchStartOrMoveEventPassive:
-      m_frameHost->chromeClient().setEventListenerProperties(
+      m_frameHost->page().chromeClient().setEventListenerProperties(
           frame, WebEventListenerClass::TouchStartOrMove,
           webEventListenerProperties(
               hasEventHandlers(TouchStartOrMoveEventBlocking),
@@ -233,7 +233,7 @@
       break;
     case TouchEndOrCancelEventBlocking:
     case TouchEndOrCancelEventPassive:
-      m_frameHost->chromeClient().setEventListenerProperties(
+      m_frameHost->page().chromeClient().setEventListenerProperties(
           frame, WebEventListenerClass::TouchEndOrCancel,
           webEventListenerProperties(
               hasEventHandlers(TouchEndOrCancelEventBlocking),
diff --git a/third_party/WebKit/Source/core/frame/FrameHost.cpp b/third_party/WebKit/Source/core/frame/FrameHost.cpp
index 104d7b1..af75ed7 100644
--- a/third_party/WebKit/Source/core/frame/FrameHost.cpp
+++ b/third_party/WebKit/Source/core/frame/FrameHost.cpp
@@ -74,14 +74,6 @@
   return *m_page;
 }
 
-ChromeClient& FrameHost::chromeClient() {
-  return m_page->chromeClient();
-}
-
-const ChromeClient& FrameHost::chromeClient() const {
-  return m_page->chromeClient();
-}
-
 UseCounter& FrameHost::useCounter() {
   return m_page->useCounter();
 }
diff --git a/third_party/WebKit/Source/core/frame/FrameHost.h b/third_party/WebKit/Source/core/frame/FrameHost.h
index f9471fd..e04f2b9 100644
--- a/third_party/WebKit/Source/core/frame/FrameHost.h
+++ b/third_party/WebKit/Source/core/frame/FrameHost.h
@@ -74,9 +74,6 @@
   Page& page();
   const Page& page() const;
 
-  ChromeClient& chromeClient();
-  const ChromeClient& chromeClient() const;
-
   UseCounter& useCounter();
   const UseCounter& useCounter() const;
 
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp
index a2e0bdb..ab03ea6 100644
--- a/third_party/WebKit/Source/core/frame/FrameView.cpp
+++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
@@ -4020,7 +4020,7 @@
 void FrameView::didChangeScrollOffset() {
   frame().loader().client()->didChangeScrollOffset();
   if (frame().isMainFrame())
-    frame().host()->chromeClient().mainFrameScrollOffsetChanged();
+    frame().page()->chromeClient().mainFrameScrollOffsetChanged();
 }
 
 void FrameView::clearScrollAnchor() {
@@ -4935,7 +4935,7 @@
   // The compositor will "defer commits" for the main frame until we
   // explicitly request them.
   if (frame().isMainFrame())
-    frame().host()->chromeClient().beginLifecycleUpdates();
+    frame().page()->chromeClient().beginLifecycleUpdates();
 }
 
 void FrameView::setInitialViewportSize(const IntSize& viewportSize) {
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
index ff0d2e0..7182d79 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -537,11 +537,11 @@
 int LocalDOMWindow::orientation() const {
   ASSERT(RuntimeEnabledFeatures::orientationEventEnabled());
 
-  if (!frame() || !frame()->host())
+  if (!frame() || !frame()->page())
     return 0;
 
   int orientation =
-      frame()->host()->chromeClient().screenInfo().orientationAngle;
+      frame()->page()->chromeClient().screenInfo().orientationAngle;
   // For backward compatibility, we want to return a value in the range of
   // [-90; 180] instead of [0; 360[ because window.orientation used to behave
   // like that in WebKit (this is a WebKit proprietary API).
@@ -704,8 +704,8 @@
   if (!frame())
     return;
 
-  FrameHost* host = frame()->host();
-  if (!host)
+  Page* page = frame()->page();
+  if (!page)
     return;
 
   if (scriptState &&
@@ -722,7 +722,7 @@
                                      UseCounter::CrossOriginWindowPrint);
 
   m_shouldPrintWhenFinishedLoading = false;
-  host->chromeClient().print(frame());
+  page->chromeClient().print(frame());
 }
 
 void LocalDOMWindow::stop() {
@@ -771,14 +771,14 @@
 
   document()->updateStyleAndLayoutTree();
 
-  FrameHost* host = frame()->host();
-  if (!host)
+  Page* page = frame()->page();
+  if (!page)
     return;
 
   UseCounter::countCrossOriginIframe(*document(),
                                      UseCounter::CrossOriginWindowAlert);
 
-  host->chromeClient().openJavaScriptAlert(frame(), message);
+  page->chromeClient().openJavaScriptAlert(frame(), message);
 }
 
 bool LocalDOMWindow::confirm(ScriptState* scriptState, const String& message) {
@@ -821,14 +821,14 @@
 
   document()->updateStyleAndLayoutTree();
 
-  FrameHost* host = frame()->host();
-  if (!host)
+  Page* page = frame()->page();
+  if (!page)
     return false;
 
   UseCounter::countCrossOriginIframe(*document(),
                                      UseCounter::CrossOriginWindowConfirm);
 
-  return host->chromeClient().openJavaScriptConfirm(frame(), message);
+  return page->chromeClient().openJavaScriptConfirm(frame(), message);
 }
 
 String LocalDOMWindow::prompt(ScriptState* scriptState,
@@ -873,12 +873,12 @@
 
   document()->updateStyleAndLayoutTree();
 
-  FrameHost* host = frame()->host();
-  if (!host)
+  Page* page = frame()->page();
+  if (!page)
     return String();
 
   String returnValue;
-  if (host->chromeClient().openJavaScriptPrompt(frame(), message, defaultValue,
+  if (page->chromeClient().openJavaScriptPrompt(frame(), message, defaultValue,
                                                 returnValue))
     return returnValue;
 
@@ -1098,11 +1098,11 @@
   if (!frame())
     return;
 
-  FrameHost* host = frame()->host();
-  if (!host)
+  Page* page = frame()->page();
+  if (!page)
     return;
 
-  host->chromeClient().setStatusbarText(m_status);
+  page->chromeClient().setStatusbarText(m_status);
 }
 
 void LocalDOMWindow::setDefaultStatus(const String& string) {
@@ -1111,11 +1111,11 @@
   if (!frame())
     return;
 
-  FrameHost* host = frame()->host();
-  if (!host)
+  Page* page = frame()->page();
+  if (!page)
     return;
 
-  host->chromeClient().setStatusbarText(m_defaultStatus);
+  page->chromeClient().setStatusbarText(m_defaultStatus);
 }
 
 Document* LocalDOMWindow::document() const {
@@ -1288,58 +1288,58 @@
   if (!frame() || !frame()->isMainFrame())
     return;
 
-  FrameHost* host = frame()->host();
-  if (!host)
+  Page* page = frame()->page();
+  if (!page)
     return;
 
-  IntRect windowRect = host->chromeClient().rootWindowRect();
+  IntRect windowRect = page->chromeClient().rootWindowRect();
   windowRect.saturatedMove(x, y);
   // Security check (the spec talks about UniversalBrowserWrite to disable this
   // check...)
-  host->chromeClient().setWindowRectWithAdjustment(windowRect, *frame());
+  page->chromeClient().setWindowRectWithAdjustment(windowRect, *frame());
 }
 
 void LocalDOMWindow::moveTo(int x, int y) const {
   if (!frame() || !frame()->isMainFrame())
     return;
 
-  FrameHost* host = frame()->host();
-  if (!host)
+  Page* page = frame()->page();
+  if (!page)
     return;
 
-  IntRect windowRect = host->chromeClient().rootWindowRect();
+  IntRect windowRect = page->chromeClient().rootWindowRect();
   windowRect.setLocation(IntPoint(x, y));
   // Security check (the spec talks about UniversalBrowserWrite to disable this
   // check...)
-  host->chromeClient().setWindowRectWithAdjustment(windowRect, *frame());
+  page->chromeClient().setWindowRectWithAdjustment(windowRect, *frame());
 }
 
 void LocalDOMWindow::resizeBy(int x, int y) const {
   if (!frame() || !frame()->isMainFrame())
     return;
 
-  FrameHost* host = frame()->host();
-  if (!host)
+  Page* page = frame()->page();
+  if (!page)
     return;
 
-  IntRect fr = host->chromeClient().rootWindowRect();
+  IntRect fr = page->chromeClient().rootWindowRect();
   IntSize dest = fr.size() + IntSize(x, y);
   IntRect update(fr.location(), dest);
-  host->chromeClient().setWindowRectWithAdjustment(update, *frame());
+  page->chromeClient().setWindowRectWithAdjustment(update, *frame());
 }
 
 void LocalDOMWindow::resizeTo(int width, int height) const {
   if (!frame() || !frame()->isMainFrame())
     return;
 
-  FrameHost* host = frame()->host();
-  if (!host)
+  Page* page = frame()->page();
+  if (!page)
     return;
 
-  IntRect fr = host->chromeClient().rootWindowRect();
+  IntRect fr = page->chromeClient().rootWindowRect();
   IntSize dest = IntSize(width, height);
   IntRect update(fr.location(), dest);
-  host->chromeClient().setWindowRectWithAdjustment(update, *frame());
+  page->chromeClient().setWindowRectWithAdjustment(update, *frame());
 }
 
 int LocalDOMWindow::requestAnimationFrame(FrameRequestCallback* callback) {
diff --git a/third_party/WebKit/Source/core/frame/Navigator.cpp b/third_party/WebKit/Source/core/frame/Navigator.cpp
index 14c6ec1d..117da44 100644
--- a/third_party/WebKit/Source/core/frame/Navigator.cpp
+++ b/third_party/WebKit/Source/core/frame/Navigator.cpp
@@ -25,13 +25,13 @@
 
 #include "bindings/core/v8/ScriptController.h"
 #include "core/dom/Document.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/NavigatorID.h"
 #include "core/frame/Settings.h"
 #include "core/loader/CookieJar.h"
 #include "core/loader/FrameLoader.h"
 #include "core/page/ChromeClient.h"
+#include "core/page/Page.h"
 #include "platform/Language.h"
 
 namespace blink {
@@ -76,12 +76,12 @@
 Vector<String> Navigator::languages() {
   Vector<String> languages;
 
-  if (!frame() || !frame()->host()) {
+  if (!frame() || !frame()->page()) {
     languages.push_back(defaultLanguage());
     return languages;
   }
 
-  String acceptLanguages = frame()->host()->chromeClient().acceptLanguages();
+  String acceptLanguages = frame()->page()->chromeClient().acceptLanguages();
   acceptLanguages.split(',', languages);
 
   // Sanitizing tokens. We could do that more extensively but we should assume
diff --git a/third_party/WebKit/Source/core/frame/Screen.cpp b/third_party/WebKit/Source/core/frame/Screen.cpp
index 530c0bb..d61ba45 100644
--- a/third_party/WebKit/Source/core/frame/Screen.cpp
+++ b/third_party/WebKit/Source/core/frame/Screen.cpp
@@ -28,7 +28,6 @@
 
 #include "core/frame/Screen.h"
 
-#include "core/frame/FrameHost.h"
 #include "core/frame/FrameView.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/Settings.h"
@@ -68,17 +67,17 @@
 }
 
 unsigned Screen::colorDepth() const {
-  if (!frame() || !frame()->host())
+  if (!frame() || !frame()->page())
     return 0;
   return static_cast<unsigned>(
-      frame()->host()->chromeClient().screenInfo().depth);
+      frame()->page()->chromeClient().screenInfo().depth);
 }
 
 unsigned Screen::pixelDepth() const {
   if (!frame())
     return 0;
   return static_cast<unsigned>(
-      frame()->host()->chromeClient().screenInfo().depth);
+      frame()->page()->chromeClient().screenInfo().depth);
 }
 
 int Screen::availLeft() const {
diff --git a/third_party/WebKit/Source/core/frame/VisualViewport.cpp b/third_party/WebKit/Source/core/frame/VisualViewport.cpp
index d8fa942e..9be42a68 100644
--- a/third_party/WebKit/Source/core/frame/VisualViewport.cpp
+++ b/third_party/WebKit/Source/core/frame/VisualViewport.cpp
@@ -254,7 +254,7 @@
   if (scale != m_scale) {
     m_scale = scale;
     valuesChanged = true;
-    frameHost().chromeClient().pageScaleFactorChanged();
+    frameHost().page().chromeClient().pageScaleFactorChanged();
     enqueueResizeEvent();
   }
 
@@ -296,8 +296,8 @@
                                               const FloatPoint& anchor) {
   const float oldPageScale = scale();
   const float newPageScale =
-      frameHost().chromeClient().clampPageScaleFactorToLimits(magnifyDelta *
-                                                              oldPageScale);
+      frameHost().page().chromeClient().clampPageScaleFactorToLimits(
+          magnifyDelta * oldPageScale);
   if (newPageScale == oldPageScale)
     return false;
   if (!mainFrame() || !mainFrame()->view())
@@ -502,7 +502,7 @@
 }
 
 HostWindow* VisualViewport::getHostWindow() const {
-  return &frameHost().chromeClient();
+  return &frameHost().page().chromeClient();
 }
 
 bool VisualViewport::shouldUseIntegerScrollOffset() const {
diff --git a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
index 09b1894..7250165 100644
--- a/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLAnchorElement.cpp
@@ -27,7 +27,6 @@
 #include "core/editing/EditingUtilities.h"
 #include "core/events/KeyboardEvent.h"
 #include "core/events/MouseEvent.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/LocalFrameClient.h"
 #include "core/frame/Settings.h"
 #include "core/frame/UseCounter.h"
@@ -37,6 +36,7 @@
 #include "core/loader/FrameLoadRequest.h"
 #include "core/loader/PingLoader.h"
 #include "core/page/ChromeClient.h"
+#include "core/page/Page.h"
 #include "platform/network/NetworkHints.h"
 #include "platform/weborigin/SecurityPolicy.h"
 #include "public/platform/WebNavigationHintType.h"
@@ -177,7 +177,7 @@
   if (isFocusable() && Element::supportsFocus())
     return HTMLElement::isKeyboardFocusable();
 
-  if (isLink() && !document().frameHost()->chromeClient().tabsToLinks())
+  if (isLink() && !document().page()->chromeClient().tabsToLinks())
     return false;
   return HTMLElement::isKeyboardFocusable();
 }
diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
index b520cb0..5b1e0afa 100644
--- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
@@ -42,7 +42,6 @@
 #include "core/dom/ExceptionCode.h"
 #include "core/dom/TaskRunnerHelper.h"
 #include "core/fileapi/File.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/ImageBitmap.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/Settings.h"
@@ -1450,7 +1449,7 @@
   // frame-less HTML canvas's document is reparenting under another frame.
   // See crbug.com/683172.
   if (frame) {
-    layerTreeView = frame->host()->chromeClient().getWebLayerTreeView(frame);
+    layerTreeView = frame->page()->chromeClient().getWebLayerTreeView(frame);
     m_surfaceLayerBridge =
         WTF::wrapUnique(new CanvasSurfaceLayerBridge(this, layerTreeView));
     // Creates a placeholder layer first before Surface is created.
diff --git a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
index 50a1339..c0e8404 100644
--- a/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLInputElement.cpp
@@ -50,7 +50,6 @@
 #include "core/events/MouseEvent.h"
 #include "core/events/ScopedEventQueue.h"
 #include "core/frame/Deprecation.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/FrameView.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/UseCounter.h"
@@ -70,6 +69,7 @@
 #include "core/layout/LayoutObject.h"
 #include "core/layout/LayoutTheme.h"
 #include "core/page/ChromeClient.h"
+#include "core/page/Page.h"
 #include "platform/Language.h"
 #include "platform/RuntimeEnabledFeatures.h"
 #include "platform/text/PlatformLocale.h"
@@ -338,7 +338,7 @@
 
   LocalFrame* frame = document().frame();
   frame->spellChecker().didEndEditingOnTextField(this);
-  frame->host()->chromeClient().didEndEditingOnTextField(*this);
+  frame->page()->chromeClient().didEndEditingOnTextField(*this);
 }
 
 void HTMLInputElement::handleFocusEvent(Element* oldFocusedElement,
diff --git a/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp b/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp
index fe352c53..63e0e8c 100644
--- a/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp
@@ -49,7 +49,6 @@
 #include "core/events/KeyboardEvent.h"
 #include "core/events/MouseEvent.h"
 #include "core/events/ScopedEventQueue.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/FrameView.h"
 #include "core/frame/LocalFrame.h"
 #include "core/html/FormData.h"
@@ -1921,7 +1920,7 @@
 void HTMLSelectElement::showPopup() {
   if (popupIsVisible())
     return;
-  if (document().frameHost()->chromeClient().hasOpenedPopup())
+  if (document().page()->chromeClient().hasOpenedPopup())
     return;
   if (!layoutObject() || !layoutObject()->isMenuList())
     return;
@@ -1929,7 +1928,7 @@
     return;
 
   if (!m_popup)
-    m_popup = document().frameHost()->chromeClient().openPopupMenu(
+    m_popup = document().page()->chromeClient().openPopupMenu(
         *document().frame(), *this);
   m_popupIsVisible = true;
   observeTreeMutation();
diff --git a/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp b/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp
index a3d83420..c85a2a35 100644
--- a/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLTextAreaElement.cpp
@@ -39,7 +39,6 @@
 #include "core/editing/spellcheck/SpellChecker.h"
 #include "core/events/BeforeTextInsertedEvent.h"
 #include "core/events/Event.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/UseCounter.h"
 #include "core/html/FormData.h"
@@ -49,6 +48,7 @@
 #include "core/html/shadow/TextControlInnerElements.h"
 #include "core/layout/LayoutTextControlMultiLine.h"
 #include "core/page/ChromeClient.h"
+#include "core/page/Page.h"
 #include "platform/text/PlatformLocale.h"
 #include "wtf/StdLibExtras.h"
 #include "wtf/text/StringBuilder.h"
@@ -300,7 +300,7 @@
   calculateAndAdjustDirectionality();
 
   DCHECK(document().isActive());
-  document().frameHost()->chromeClient().didChangeValueInTextField(*this);
+  document().page()->chromeClient().didChangeValueInTextField(*this);
 }
 
 void HTMLTextAreaElement::handleBeforeTextInsertedEvent(
diff --git a/third_party/WebKit/Source/core/html/forms/ChooserOnlyTemporalInputTypeView.cpp b/third_party/WebKit/Source/core/html/forms/ChooserOnlyTemporalInputTypeView.cpp
index 26e8be5d..b163f9a 100644
--- a/third_party/WebKit/Source/core/html/forms/ChooserOnlyTemporalInputTypeView.cpp
+++ b/third_party/WebKit/Source/core/html/forms/ChooserOnlyTemporalInputTypeView.cpp
@@ -28,10 +28,10 @@
 #include "bindings/core/v8/ExceptionState.h"
 #include "core/dom/Document.h"
 #include "core/dom/shadow/ShadowRoot.h"
-#include "core/frame/FrameHost.h"
 #include "core/html/HTMLDivElement.h"
 #include "core/html/HTMLInputElement.h"
 #include "core/page/ChromeClient.h"
+#include "core/page/Page.h"
 #include "platform/UserGestureIndicator.h"
 
 namespace blink {
@@ -73,7 +73,7 @@
   if (!element().setupDateTimeChooserParameters(parameters))
     return;
   m_dateTimeChooser =
-      element().document().frameHost()->chromeClient().openDateTimeChooser(
+      element().document().page()->chromeClient().openDateTimeChooser(
           this, parameters);
 }
 
diff --git a/third_party/WebKit/Source/core/html/forms/InputType.cpp b/third_party/WebKit/Source/core/html/forms/InputType.cpp
index c833c9c..5f1485d 100644
--- a/third_party/WebKit/Source/core/html/forms/InputType.cpp
+++ b/third_party/WebKit/Source/core/html/forms/InputType.cpp
@@ -28,6 +28,8 @@
 
 #include "core/html/forms/InputType.h"
 
+#include <memory>
+
 #include "bindings/core/v8/ExceptionMessages.h"
 #include "bindings/core/v8/ExceptionState.h"
 #include "core/InputTypeNames.h"
@@ -37,7 +39,6 @@
 #include "core/events/KeyboardEvent.h"
 #include "core/events/ScopedEventQueue.h"
 #include "core/fileapi/FileList.h"
-#include "core/frame/FrameHost.h"
 #include "core/html/FormData.h"
 #include "core/html/HTMLFormElement.h"
 #include "core/html/HTMLInputElement.h"
@@ -68,12 +69,12 @@
 #include "core/html/parser/HTMLParserIdioms.h"
 #include "core/inspector/ConsoleMessage.h"
 #include "core/layout/LayoutTheme.h"
+#include "core/page/Page.h"
 #include "platform/RuntimeEnabledFeatures.h"
 #include "platform/json/JSONValues.h"
 #include "platform/text/PlatformLocale.h"
 #include "platform/text/TextBreakIterator.h"
 #include "wtf/PtrUtil.h"
-#include <memory>
 
 namespace blink {
 
@@ -430,8 +431,8 @@
 }
 
 ChromeClient* InputType::chromeClient() const {
-  if (FrameHost* host = element().document().frameHost())
-    return &host->chromeClient();
+  if (Page* page = element().document().page())
+    return &page->chromeClient();
   return nullptr;
 }
 
diff --git a/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp b/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp
index 5bd3ebd..1893fdf 100644
--- a/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp
+++ b/third_party/WebKit/Source/core/html/forms/TextFieldInputType.cpp
@@ -40,7 +40,6 @@
 #include "core/events/BeforeTextInsertedEvent.h"
 #include "core/events/KeyboardEvent.h"
 #include "core/events/TextEvent.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/LocalFrame.h"
 #include "core/html/FormData.h"
 #include "core/html/HTMLInputElement.h"
@@ -50,6 +49,7 @@
 #include "core/layout/LayoutTextControlSingleLine.h"
 #include "core/layout/LayoutTheme.h"
 #include "core/page/ChromeClient.h"
+#include "core/page/Page.h"
 #include "core/paint/PaintLayer.h"
 #include "platform/EventDispatchForbiddenScope.h"
 #include "wtf/text/WTFString.h"
@@ -86,7 +86,7 @@
       return;
     HTMLInputElement* host = hostInput();
     if (host && !host->isDisabledOrReadOnly()) {
-      document().frameHost()->chromeClient().openTextDataListChooser(*host);
+      document().page()->chromeClient().openTextDataListChooser(*host);
       event->setDefaultHandled();
     }
   }
diff --git a/third_party/WebKit/Source/core/layout/BUILD.gn b/third_party/WebKit/Source/core/layout/BUILD.gn
index d69ef7283..cea809c 100644
--- a/third_party/WebKit/Source/core/layout/BUILD.gn
+++ b/third_party/WebKit/Source/core/layout/BUILD.gn
@@ -280,6 +280,18 @@
     "line/RootInlineBox.cpp",
     "line/TrailingObjects.cpp",
     "line/TrailingObjects.h",
+    "ng/geometry/ng_logical_offset.cc",
+    "ng/geometry/ng_logical_offset.h",
+    "ng/geometry/ng_logical_size.cc",
+    "ng/geometry/ng_logical_size.h",
+    "ng/geometry/ng_physical_location.cc",
+    "ng/geometry/ng_physical_location.h",
+    "ng/geometry/ng_physical_offset.cc",
+    "ng/geometry/ng_physical_offset.h",
+    "ng/geometry/ng_physical_rect.cc",
+    "ng/geometry/ng_physical_rect.h",
+    "ng/geometry/ng_physical_size.cc",
+    "ng/geometry/ng_physical_size.h",
     "ng/layout_ng_block_flow.cc",
     "ng/layout_ng_block_flow.h",
     "ng/ng_absolute_utils.cc",
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.cc
new file mode 100644
index 0000000..5c7edf0b
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.cc
@@ -0,0 +1,109 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/layout/ng/geometry/ng_logical_offset.h"
+
+#include "core/layout/ng/geometry/ng_physical_offset.h"
+#include "core/layout/ng/geometry/ng_physical_size.h"
+#include "wtf/text/WTFString.h"
+
+namespace blink {
+
+NGPhysicalOffset NGLogicalOffset::ConvertToPhysical(
+    NGWritingMode mode,
+    TextDirection direction,
+    NGPhysicalSize outer_size,
+    NGPhysicalSize inner_size) const {
+  switch (mode) {
+    case kHorizontalTopBottom:
+      if (direction == TextDirection::kLtr)
+        return NGPhysicalOffset(inline_offset, block_offset);
+      else
+        return NGPhysicalOffset(
+            outer_size.width - inline_offset - inner_size.width, block_offset);
+    case kVerticalRightLeft:
+    case kSidewaysRightLeft:
+      if (direction == TextDirection::kLtr)
+        return NGPhysicalOffset(
+            outer_size.width - block_offset - inner_size.width, inline_offset);
+      else
+        return NGPhysicalOffset(
+            outer_size.width - block_offset - inner_size.width,
+            outer_size.height - inline_offset - inner_size.height);
+    case kVerticalLeftRight:
+      if (direction == TextDirection::kLtr)
+        return NGPhysicalOffset(block_offset, inline_offset);
+      else
+        return NGPhysicalOffset(
+            block_offset,
+            outer_size.height - inline_offset - inner_size.height);
+    case kSidewaysLeftRight:
+      if (direction == TextDirection::kLtr)
+        return NGPhysicalOffset(
+            block_offset,
+            outer_size.height - inline_offset - inner_size.height);
+      else
+        return NGPhysicalOffset(block_offset, inline_offset);
+    default:
+      ASSERT_NOT_REACHED();
+      return NGPhysicalOffset();
+  }
+}
+
+bool NGLogicalOffset::operator==(const NGLogicalOffset& other) const {
+  return std::tie(other.inline_offset, other.block_offset) ==
+         std::tie(inline_offset, block_offset);
+}
+
+NGLogicalOffset NGLogicalOffset::operator+(const NGLogicalOffset& other) const {
+  NGLogicalOffset result;
+  result.inline_offset = this->inline_offset + other.inline_offset;
+  result.block_offset = this->block_offset + other.block_offset;
+  return result;
+}
+
+NGLogicalOffset& NGLogicalOffset::operator+=(const NGLogicalOffset& other) {
+  *this = *this + other;
+  return *this;
+}
+
+bool NGLogicalOffset::operator>(const NGLogicalOffset& other) const {
+  return inline_offset > other.inline_offset &&
+         block_offset > other.block_offset;
+}
+
+bool NGLogicalOffset::operator>=(const NGLogicalOffset& other) const {
+  return inline_offset >= other.inline_offset &&
+         block_offset >= other.block_offset;
+}
+
+bool NGLogicalOffset::operator<(const NGLogicalOffset& other) const {
+  return inline_offset < other.inline_offset &&
+         block_offset < other.block_offset;
+}
+
+bool NGLogicalOffset::operator<=(const NGLogicalOffset& other) const {
+  return inline_offset <= other.inline_offset &&
+         block_offset <= other.block_offset;
+}
+
+NGLogicalOffset NGLogicalOffset::operator-(const NGLogicalOffset& other) const {
+  return NGLogicalOffset{this->inline_offset - other.inline_offset,
+                         this->block_offset - other.block_offset};
+}
+
+NGLogicalOffset& NGLogicalOffset::operator-=(const NGLogicalOffset& other) {
+  *this = *this - other;
+  return *this;
+}
+
+String NGLogicalOffset::ToString() const {
+  return String::format("%dx%d", inline_offset.toInt(), block_offset.toInt());
+}
+
+std::ostream& operator<<(std::ostream& os, const NGLogicalOffset& value) {
+  return os << value.ToString();
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.h
new file mode 100644
index 0000000..c27a569
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset.h
@@ -0,0 +1,61 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NGLogicalOffset_h
+#define NGLogicalOffset_h
+
+#include "core/CoreExport.h"
+#include "core/layout/ng/ng_writing_mode.h"
+#include "platform/LayoutUnit.h"
+#include "platform/text/TextDirection.h"
+
+namespace blink {
+
+struct NGPhysicalOffset;
+struct NGPhysicalSize;
+
+// NGLogicalOffset is the position of a rect (typically a fragment) relative to
+// its parent rect in the logical coordinate system.
+struct CORE_EXPORT NGLogicalOffset {
+  NGLogicalOffset() {}
+  NGLogicalOffset(LayoutUnit inline_offset, LayoutUnit block_offset)
+      : inline_offset(inline_offset), block_offset(block_offset) {}
+
+  LayoutUnit inline_offset;
+  LayoutUnit block_offset;
+
+  // Converts a logical offset to a physical offset. See:
+  // https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical
+  // PhysicalOffset will be the physical top left point of the rectangle
+  // described by offset + inner_size. Setting inner_size to 0,0 will return
+  // the same point.
+  // @param outer_size the size of the rect (typically a fragment).
+  // @param inner_size the size of the inner rect (typically a child fragment).
+  NGPhysicalOffset ConvertToPhysical(NGWritingMode,
+                                     TextDirection,
+                                     NGPhysicalSize outer_size,
+                                     NGPhysicalSize inner_size) const;
+
+  bool operator==(const NGLogicalOffset& other) const;
+
+  NGLogicalOffset operator+(const NGLogicalOffset& other) const;
+  NGLogicalOffset& operator+=(const NGLogicalOffset& other);
+
+  NGLogicalOffset operator-(const NGLogicalOffset& other) const;
+  NGLogicalOffset& operator-=(const NGLogicalOffset& other);
+
+  bool operator>(const NGLogicalOffset& other) const;
+  bool operator>=(const NGLogicalOffset& other) const;
+
+  bool operator<(const NGLogicalOffset& other) const;
+  bool operator<=(const NGLogicalOffset& other) const;
+
+  String ToString() const;
+};
+
+CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGLogicalOffset&);
+
+}  // namespace blink
+
+#endif  // NGLogicalOffset_h
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset_test.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset_test.cc
new file mode 100644
index 0000000..cce157a
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_offset_test.cc
@@ -0,0 +1,74 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/layout/ng/geometry/ng_logical_offset.h"
+#include "core/layout/ng/geometry/ng_physical_offset.h"
+#include "core/layout/ng/geometry/ng_physical_size.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+
+namespace {
+
+TEST(NGGeometryUnitsTest, ConvertLogicalOffsetToPhysicalOffset) {
+  NGLogicalOffset logical_offset(LayoutUnit(20), LayoutUnit(30));
+  NGPhysicalSize outer_size(LayoutUnit(300), LayoutUnit(400));
+  NGPhysicalSize inner_size(LayoutUnit(5), LayoutUnit(65));
+  NGPhysicalOffset offset;
+
+  offset = logical_offset.ConvertToPhysical(
+      kHorizontalTopBottom, TextDirection::kLtr, outer_size, inner_size);
+  EXPECT_EQ(LayoutUnit(20), offset.left);
+  EXPECT_EQ(LayoutUnit(30), offset.top);
+
+  offset = logical_offset.ConvertToPhysical(
+      kHorizontalTopBottom, TextDirection::kRtl, outer_size, inner_size);
+  EXPECT_EQ(LayoutUnit(275), offset.left);
+  EXPECT_EQ(LayoutUnit(30), offset.top);
+
+  offset = logical_offset.ConvertToPhysical(
+      kVerticalRightLeft, TextDirection::kLtr, outer_size, inner_size);
+  EXPECT_EQ(LayoutUnit(265), offset.left);
+  EXPECT_EQ(LayoutUnit(20), offset.top);
+
+  offset = logical_offset.ConvertToPhysical(
+      kVerticalRightLeft, TextDirection::kRtl, outer_size, inner_size);
+  EXPECT_EQ(LayoutUnit(265), offset.left);
+  EXPECT_EQ(LayoutUnit(315), offset.top);
+
+  offset = logical_offset.ConvertToPhysical(
+      kSidewaysRightLeft, TextDirection::kLtr, outer_size, inner_size);
+  EXPECT_EQ(LayoutUnit(265), offset.left);
+  EXPECT_EQ(LayoutUnit(20), offset.top);
+
+  offset = logical_offset.ConvertToPhysical(
+      kSidewaysRightLeft, TextDirection::kRtl, outer_size, inner_size);
+  EXPECT_EQ(LayoutUnit(265), offset.left);
+  EXPECT_EQ(LayoutUnit(315), offset.top);
+
+  offset = logical_offset.ConvertToPhysical(
+      kVerticalLeftRight, TextDirection::kLtr, outer_size, inner_size);
+  EXPECT_EQ(LayoutUnit(30), offset.left);
+  EXPECT_EQ(LayoutUnit(20), offset.top);
+
+  offset = logical_offset.ConvertToPhysical(
+      kVerticalLeftRight, TextDirection::kRtl, outer_size, inner_size);
+  EXPECT_EQ(LayoutUnit(30), offset.left);
+  EXPECT_EQ(LayoutUnit(315), offset.top);
+
+  offset = logical_offset.ConvertToPhysical(
+      kSidewaysLeftRight, TextDirection::kLtr, outer_size, inner_size);
+  EXPECT_EQ(LayoutUnit(30), offset.left);
+  EXPECT_EQ(LayoutUnit(315), offset.top);
+
+  offset = logical_offset.ConvertToPhysical(
+      kSidewaysLeftRight, TextDirection::kRtl, outer_size, inner_size);
+  EXPECT_EQ(LayoutUnit(30), offset.left);
+  EXPECT_EQ(LayoutUnit(20), offset.top);
+}
+
+}  // namespace
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.cc
new file mode 100644
index 0000000..bdfd7ad
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.cc
@@ -0,0 +1,26 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/layout/ng/geometry/ng_logical_size.h"
+
+#include "core/layout/ng/geometry/ng_physical_size.h"
+#include "platform/text/TextDirection.h"
+
+namespace blink {
+
+NGPhysicalSize NGLogicalSize::ConvertToPhysical(NGWritingMode mode) const {
+  return mode == kHorizontalTopBottom ? NGPhysicalSize(inline_size, block_size)
+                                      : NGPhysicalSize(block_size, inline_size);
+}
+
+bool NGLogicalSize::operator==(const NGLogicalSize& other) const {
+  return std::tie(other.inline_size, other.block_size) ==
+         std::tie(inline_size, block_size);
+}
+
+std::ostream& operator<<(std::ostream& stream, const NGLogicalSize& value) {
+  return stream << value.inline_size << "x" << value.block_size;
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.h
new file mode 100644
index 0000000..2102165
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_logical_size.h
@@ -0,0 +1,38 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NGLogicalSize_h
+#define NGLogicalSize_h
+
+#include "core/CoreExport.h"
+#include "core/layout/ng/ng_writing_mode.h"
+#include "platform/LayoutUnit.h"
+
+namespace blink {
+
+struct NGPhysicalSize;
+
+// NGLogicalSize is the size of rect (typically a fragment) in the logical
+// coordinate system.
+struct CORE_EXPORT NGLogicalSize {
+  NGLogicalSize() {}
+  NGLogicalSize(LayoutUnit inline_size, LayoutUnit block_size)
+      : inline_size(inline_size), block_size(block_size) {}
+
+  LayoutUnit inline_size;
+  LayoutUnit block_size;
+
+  NGPhysicalSize ConvertToPhysical(NGWritingMode mode) const;
+  bool operator==(const NGLogicalSize& other) const;
+
+  bool IsEmpty() const {
+    return inline_size == LayoutUnit() || block_size == LayoutUnit();
+  }
+};
+
+CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGLogicalSize&);
+
+}  // namespace blink
+
+#endif  // NGLogicalSize_h
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.cc
new file mode 100644
index 0000000..20b916c
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.cc
@@ -0,0 +1,19 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/layout/ng/geometry/ng_physical_location.h"
+
+#include "wtf/text/WTFString.h"
+
+namespace blink {
+
+bool NGPhysicalLocation::operator==(const NGPhysicalLocation& other) const {
+  return other.left == left && other.top == top;
+}
+
+String NGPhysicalLocation::ToString() const {
+  return String::format("%dx%d", left.toInt(), top.toInt());
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.h
new file mode 100644
index 0000000..2b40c5e8
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_location.h
@@ -0,0 +1,34 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NGPhysicalLocation_h
+#define NGPhysicalLocation_h
+
+#include "core/CoreExport.h"
+
+#include "platform/LayoutUnit.h"
+
+namespace blink {
+
+// NGPhysicalLocation is the position of a rect (typically a fragment) relative
+// to the root document.
+struct CORE_EXPORT NGPhysicalLocation {
+  NGPhysicalLocation() {}
+  NGPhysicalLocation(LayoutUnit left, LayoutUnit top) : left(left), top(top) {}
+  LayoutUnit left;
+  LayoutUnit top;
+
+  bool operator==(const NGPhysicalLocation& other) const;
+
+  String ToString() const;
+};
+
+CORE_EXPORT inline std::ostream& operator<<(std::ostream& os,
+                                            const NGPhysicalLocation& value) {
+  return os << value.ToString();
+}
+
+}  // namespace blink
+
+#endif  // NGPhysicalLocation_h
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.cc
new file mode 100644
index 0000000..9ccba021
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.cc
@@ -0,0 +1,43 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/layout/ng/geometry/ng_physical_offset.h"
+
+#include "wtf/text/WTFString.h"
+
+namespace blink {
+
+NGPhysicalOffset NGPhysicalOffset::operator+(
+    const NGPhysicalOffset& other) const {
+  return NGPhysicalOffset{this->left + other.left, this->top + other.top};
+}
+
+NGPhysicalOffset& NGPhysicalOffset::operator+=(const NGPhysicalOffset& other) {
+  *this = *this + other;
+  return *this;
+}
+
+NGPhysicalOffset NGPhysicalOffset::operator-(
+    const NGPhysicalOffset& other) const {
+  return NGPhysicalOffset{this->left - other.left, this->top - other.top};
+}
+
+NGPhysicalOffset& NGPhysicalOffset::operator-=(const NGPhysicalOffset& other) {
+  *this = *this - other;
+  return *this;
+}
+
+bool NGPhysicalOffset::operator==(const NGPhysicalOffset& other) const {
+  return other.left == left && other.top == top;
+}
+
+String NGPhysicalOffset::ToString() const {
+  return String::format("%dx%d", left.toInt(), top.toInt());
+}
+
+std::ostream& operator<<(std::ostream& os, const NGPhysicalOffset& value) {
+  return os << value.ToString();
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.h
new file mode 100644
index 0000000..5c4818cc
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.h
@@ -0,0 +1,38 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NGPhysicalOffset_h
+#define NGPhysicalOffset_h
+
+#include "core/CoreExport.h"
+
+#include "platform/LayoutUnit.h"
+
+namespace blink {
+
+// NGPhysicalOffset is the position of a rect (typically a fragment) relative to
+// its parent rect in the physical coordinate system.
+struct CORE_EXPORT NGPhysicalOffset {
+  NGPhysicalOffset() {}
+  NGPhysicalOffset(LayoutUnit left, LayoutUnit top) : left(left), top(top) {}
+
+  LayoutUnit left;
+  LayoutUnit top;
+
+  NGPhysicalOffset operator+(const NGPhysicalOffset& other) const;
+  NGPhysicalOffset& operator+=(const NGPhysicalOffset& other);
+
+  NGPhysicalOffset operator-(const NGPhysicalOffset& other) const;
+  NGPhysicalOffset& operator-=(const NGPhysicalOffset& other);
+
+  bool operator==(const NGPhysicalOffset& other) const;
+
+  String ToString() const;
+};
+
+CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGPhysicalOffset&);
+
+}  // namespace blink
+
+#endif  // NGPhysicalOffset_h
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.cc
new file mode 100644
index 0000000..e91c5c45
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.cc
@@ -0,0 +1,36 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/layout/ng/geometry/ng_physical_rect.h"
+
+#include "wtf/text/WTFString.h"
+
+namespace blink {
+
+NGPixelSnappedPhysicalRect NGPhysicalRect::SnapToDevicePixels() const {
+  NGPixelSnappedPhysicalRect snappedRect;
+  snappedRect.left = roundToInt(location.left);
+  snappedRect.top = roundToInt(location.top);
+  snappedRect.width = snapSizeToPixel(size.width, location.left);
+  snappedRect.height = snapSizeToPixel(size.height, location.top);
+
+  return snappedRect;
+}
+
+bool NGPhysicalRect::operator==(const NGPhysicalRect& other) const {
+  return other.location == location && other.size == size;
+}
+
+String NGPhysicalRect::ToString() const {
+  return String::format("%s,%s %sx%s", location.left.toString().ascii().data(),
+                        location.top.toString().ascii().data(),
+                        size.width.toString().ascii().data(),
+                        size.height.toString().ascii().data());
+}
+
+std::ostream& operator<<(std::ostream& os, const NGPhysicalRect& value) {
+  return os << value.ToString();
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.h
new file mode 100644
index 0000000..fc90621e
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect.h
@@ -0,0 +1,47 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NGPhysicalRect_h
+#define NGPhysicalRect_h
+
+#include "core/CoreExport.h"
+#include "core/layout/ng/geometry/ng_physical_location.h"
+#include "core/layout/ng/geometry/ng_physical_size.h"
+#include "platform/LayoutUnit.h"
+
+namespace blink {
+
+// NGPixelSnappedPhysicalRect is the position and size of a rect relative to the
+// root document snapped to device pixels.
+struct CORE_EXPORT NGPixelSnappedPhysicalRect {
+  int top;
+  int left;
+  int width;
+  int height;
+};
+
+// NGPhysicalRect is the position and size of a rect (typically a fragment)
+// relative to the root document.
+struct CORE_EXPORT NGPhysicalRect {
+  NGPhysicalRect();
+  NGPhysicalRect(const NGPhysicalLocation& location, const NGPhysicalSize& size)
+      : location(location), size(size) {}
+
+  NGPhysicalLocation Location() const { return location; }
+  NGPhysicalSize Size() const { return size; }
+  NGPixelSnappedPhysicalRect SnapToDevicePixels() const;
+
+  NGPhysicalLocation location;
+  NGPhysicalSize size;
+
+  bool operator==(const NGPhysicalRect& other) const;
+
+  String ToString() const;
+};
+
+CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGPhysicalRect&);
+
+}  // namespace blink
+
+#endif  // NGPhysicalRect_h
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect_test.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect_test.cc
new file mode 100644
index 0000000..8a224a6
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_rect_test.cc
@@ -0,0 +1,49 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/layout/ng/geometry/ng_physical_rect.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+
+namespace {
+
+TEST(NGGeometryUnitsTest, SnapToDevicePixels) {
+  NGPhysicalRect rect(NGPhysicalLocation(LayoutUnit(4.5), LayoutUnit(9.5)),
+                      NGPhysicalSize(LayoutUnit(10.5), LayoutUnit(11.5)));
+  NGPixelSnappedPhysicalRect snappedRect = rect.SnapToDevicePixels();
+  EXPECT_EQ(5, snappedRect.left);
+  EXPECT_EQ(10, snappedRect.top);
+  EXPECT_EQ(10, snappedRect.width);
+  EXPECT_EQ(11, snappedRect.height);
+
+  rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(4), LayoutUnit(9)),
+                        NGPhysicalSize(LayoutUnit(10.5), LayoutUnit(11.5)));
+  snappedRect = rect.SnapToDevicePixels();
+  EXPECT_EQ(4, snappedRect.left);
+  EXPECT_EQ(9, snappedRect.top);
+  EXPECT_EQ(11, snappedRect.width);
+  EXPECT_EQ(12, snappedRect.height);
+
+  rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(1.3), LayoutUnit(1.6)),
+                        NGPhysicalSize(LayoutUnit(5.8), LayoutUnit(4.3)));
+  snappedRect = rect.SnapToDevicePixels();
+  EXPECT_EQ(1, snappedRect.left);
+  EXPECT_EQ(2, snappedRect.top);
+  EXPECT_EQ(6, snappedRect.width);
+  EXPECT_EQ(4, snappedRect.height);
+
+  rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(1.6), LayoutUnit(1.3)),
+                        NGPhysicalSize(LayoutUnit(5.8), LayoutUnit(4.3)));
+  snappedRect = rect.SnapToDevicePixels();
+  EXPECT_EQ(2, snappedRect.left);
+  EXPECT_EQ(1, snappedRect.top);
+  EXPECT_EQ(5, snappedRect.width);
+  EXPECT_EQ(5, snappedRect.height);
+}
+
+}  // namespace
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.cc
new file mode 100644
index 0000000..798362b
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.cc
@@ -0,0 +1,29 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/layout/ng/geometry/ng_physical_size.h"
+
+#include "core/layout/ng/geometry/ng_logical_size.h"
+#include "wtf/text/WTFString.h"
+
+namespace blink {
+
+bool NGPhysicalSize::operator==(const NGPhysicalSize& other) const {
+  return std::tie(other.width, other.height) == std::tie(width, height);
+}
+
+NGLogicalSize NGPhysicalSize::ConvertToLogical(NGWritingMode mode) const {
+  return mode == kHorizontalTopBottom ? NGLogicalSize(width, height)
+                                      : NGLogicalSize(height, width);
+}
+
+String NGPhysicalSize::ToString() const {
+  return String::format("%dx%d", width.toInt(), height.toInt());
+}
+
+std::ostream& operator<<(std::ostream& os, const NGPhysicalSize& value) {
+  return os << value.ToString();
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.h
new file mode 100644
index 0000000..a6f75a8
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_size.h
@@ -0,0 +1,37 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NGPhysicalSize_h
+#define NGPhysicalSize_h
+
+#include "core/CoreExport.h"
+#include "core/layout/ng/ng_writing_mode.h"
+#include "platform/LayoutUnit.h"
+
+namespace blink {
+
+struct NGLogicalSize;
+
+// NGPhysicalSize is the size of a rect (typically a fragment) in the physical
+// coordinate system.
+struct CORE_EXPORT NGPhysicalSize {
+  NGPhysicalSize() {}
+  NGPhysicalSize(LayoutUnit width, LayoutUnit height)
+      : width(width), height(height) {}
+
+  LayoutUnit width;
+  LayoutUnit height;
+
+  NGLogicalSize ConvertToLogical(NGWritingMode mode) const;
+
+  bool operator==(const NGPhysicalSize& other) const;
+
+  String ToString() const;
+};
+
+CORE_EXPORT std::ostream& operator<<(std::ostream&, const NGPhysicalSize&);
+
+}  // namespace blink
+
+#endif  // NGPhysicalSize_h
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_units.cc b/third_party/WebKit/Source/core/layout/ng/ng_units.cc
index b77f9b3..4eafda9c 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_units.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_units.cc
@@ -16,24 +16,6 @@
   return min_content == other.min_content && max_content == other.max_content;
 }
 
-NGPhysicalSize NGLogicalSize::ConvertToPhysical(NGWritingMode mode) const {
-  return mode == kHorizontalTopBottom ? NGPhysicalSize(inline_size, block_size)
-                                      : NGPhysicalSize(block_size, inline_size);
-}
-
-bool NGLogicalSize::operator==(const NGLogicalSize& other) const {
-  return std::tie(other.inline_size, other.block_size) ==
-         std::tie(inline_size, block_size);
-}
-
-bool NGPhysicalSize::operator==(const NGPhysicalSize& other) const {
-  return std::tie(other.width, other.height) == std::tie(width, height);
-}
-
-NGLogicalSize NGPhysicalSize::ConvertToLogical(NGWritingMode mode) const {
-  return mode == kHorizontalTopBottom ? NGLogicalSize(width, height)
-                                      : NGLogicalSize(height, width);
-}
 
 bool NGLogicalRect::IsEmpty() const {
   // TODO(layout-dev): equality check shouldn't allocate an object each time.
@@ -59,131 +41,6 @@
                         size.block_size.toString().ascii().data());
 }
 
-NGPixelSnappedPhysicalRect NGPhysicalRect::SnapToDevicePixels() const {
-  NGPixelSnappedPhysicalRect snappedRect;
-  snappedRect.left = roundToInt(location.left);
-  snappedRect.top = roundToInt(location.top);
-  snappedRect.width = snapSizeToPixel(size.width, location.left);
-  snappedRect.height = snapSizeToPixel(size.height, location.top);
-
-  return snappedRect;
-}
-
-NGPhysicalOffset NGLogicalOffset::ConvertToPhysical(
-    NGWritingMode mode,
-    TextDirection direction,
-    NGPhysicalSize outer_size,
-    NGPhysicalSize inner_size) const {
-  switch (mode) {
-    case kHorizontalTopBottom:
-      if (direction == TextDirection::kLtr)
-        return NGPhysicalOffset(inline_offset, block_offset);
-      else
-        return NGPhysicalOffset(
-            outer_size.width - inline_offset - inner_size.width, block_offset);
-    case kVerticalRightLeft:
-    case kSidewaysRightLeft:
-      if (direction == TextDirection::kLtr)
-        return NGPhysicalOffset(
-            outer_size.width - block_offset - inner_size.width, inline_offset);
-      else
-        return NGPhysicalOffset(
-            outer_size.width - block_offset - inner_size.width,
-            outer_size.height - inline_offset - inner_size.height);
-    case kVerticalLeftRight:
-      if (direction == TextDirection::kLtr)
-        return NGPhysicalOffset(block_offset, inline_offset);
-      else
-        return NGPhysicalOffset(
-            block_offset,
-            outer_size.height - inline_offset - inner_size.height);
-    case kSidewaysLeftRight:
-      if (direction == TextDirection::kLtr)
-        return NGPhysicalOffset(
-            block_offset,
-            outer_size.height - inline_offset - inner_size.height);
-      else
-        return NGPhysicalOffset(block_offset, inline_offset);
-    default:
-      ASSERT_NOT_REACHED();
-      return NGPhysicalOffset();
-  }
-}
-
-bool NGLogicalOffset::operator==(const NGLogicalOffset& other) const {
-  return std::tie(other.inline_offset, other.block_offset) ==
-         std::tie(inline_offset, block_offset);
-}
-
-NGLogicalOffset NGLogicalOffset::operator+(const NGLogicalOffset& other) const {
-  NGLogicalOffset result;
-  result.inline_offset = this->inline_offset + other.inline_offset;
-  result.block_offset = this->block_offset + other.block_offset;
-  return result;
-}
-
-NGLogicalOffset& NGLogicalOffset::operator+=(const NGLogicalOffset& other) {
-  *this = *this + other;
-  return *this;
-}
-
-bool NGLogicalOffset::operator>(const NGLogicalOffset& other) const {
-  return inline_offset > other.inline_offset &&
-         block_offset > other.block_offset;
-}
-
-bool NGLogicalOffset::operator>=(const NGLogicalOffset& other) const {
-  return inline_offset >= other.inline_offset &&
-         block_offset >= other.block_offset;
-}
-
-bool NGLogicalOffset::operator<(const NGLogicalOffset& other) const {
-  return inline_offset < other.inline_offset &&
-         block_offset < other.block_offset;
-}
-
-bool NGLogicalOffset::operator<=(const NGLogicalOffset& other) const {
-  return inline_offset <= other.inline_offset &&
-         block_offset <= other.block_offset;
-}
-
-NGLogicalOffset NGLogicalOffset::operator-(const NGLogicalOffset& other) const {
-  return NGLogicalOffset{this->inline_offset - other.inline_offset,
-                         this->block_offset - other.block_offset};
-}
-
-NGLogicalOffset& NGLogicalOffset::operator-=(const NGLogicalOffset& other) {
-  *this = *this - other;
-  return *this;
-}
-
-String NGLogicalOffset::ToString() const {
-  return String::format("%dx%d", inline_offset.toInt(), block_offset.toInt());
-}
-
-NGPhysicalOffset NGPhysicalOffset::operator+(
-    const NGPhysicalOffset& other) const {
-  return NGPhysicalOffset{this->left + other.left, this->top + other.top};
-}
-
-NGPhysicalOffset& NGPhysicalOffset::operator+=(const NGPhysicalOffset& other) {
-  *this = *this + other;
-  return *this;
-}
-
-NGPhysicalOffset NGPhysicalOffset::operator-(
-    const NGPhysicalOffset& other) const {
-  return NGPhysicalOffset{this->left - other.left, this->top - other.top};
-}
-
-NGPhysicalOffset& NGPhysicalOffset::operator-=(const NGPhysicalOffset& other) {
-  *this = *this - other;
-  return *this;
-}
-
-bool NGPhysicalOffset::operator==(const NGPhysicalOffset& other) const {
-  return other.left == left && other.top == top;
-}
 
 bool NGBoxStrut::IsEmpty() const {
   return *this == NGBoxStrut();
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_units.h b/third_party/WebKit/Source/core/layout/ng/ng_units.h
index 53b898a..58c9257 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_units.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_units.h
@@ -6,6 +6,12 @@
 #define NGUnits_h
 
 #include "core/CoreExport.h"
+#include "core/layout/ng/geometry/ng_logical_offset.h"
+#include "core/layout/ng/geometry/ng_logical_size.h"
+#include "core/layout/ng/geometry/ng_physical_location.h"
+#include "core/layout/ng/geometry/ng_physical_offset.h"
+#include "core/layout/ng/geometry/ng_physical_rect.h"
+#include "core/layout/ng/geometry/ng_physical_size.h"
 #include "core/layout/ng/ng_writing_mode.h"
 #include "platform/LayoutUnit.h"
 #include "platform/text/TextDirection.h"
@@ -13,11 +19,7 @@
 
 namespace blink {
 
-class LayoutUnit;
-struct NGPhysicalOffset;
-struct NGPhysicalSize;
 struct NGBoxStrut;
-struct NGPixelSnappedPhysicalRect;
 
 #define NGSizeIndefinite LayoutUnit(-1)
 
@@ -33,143 +35,6 @@
   return stream << "(" << value.min_content << ", " << value.max_content << ")";
 }
 
-struct NGLogicalSize {
-  NGLogicalSize() {}
-  NGLogicalSize(LayoutUnit inline_size, LayoutUnit block_size)
-      : inline_size(inline_size), block_size(block_size) {}
-
-  LayoutUnit inline_size;
-  LayoutUnit block_size;
-
-  NGPhysicalSize ConvertToPhysical(NGWritingMode mode) const;
-  bool operator==(const NGLogicalSize& other) const;
-
-  bool IsEmpty() const {
-    return inline_size == LayoutUnit() || block_size == LayoutUnit();
-  }
-};
-
-inline std::ostream& operator<<(std::ostream& stream,
-                                const NGLogicalSize& value) {
-  return stream << value.inline_size << "x" << value.block_size;
-}
-
-// NGLogicalOffset is the position of a rect (typically a fragment) relative to
-// its parent rect in the logical coordinate system.
-struct NGLogicalOffset {
-  NGLogicalOffset() {}
-  NGLogicalOffset(LayoutUnit inline_offset, LayoutUnit block_offset)
-      : inline_offset(inline_offset), block_offset(block_offset) {}
-
-  LayoutUnit inline_offset;
-  LayoutUnit block_offset;
-
-  // Converts a logical offset to a physical offset. See:
-  // https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical
-  // PhysicalOffset will be the physical top left point of the rectangle
-  // described by offset + inner_size. Setting inner_size to 0,0 will return
-  // the same point.
-  // @param outer_size the size of the rect (typically a fragment).
-  // @param inner_size the size of the inner rect (typically a child fragment).
-  CORE_EXPORT NGPhysicalOffset
-  ConvertToPhysical(NGWritingMode,
-                    TextDirection,
-                    NGPhysicalSize outer_size,
-                    NGPhysicalSize inner_size) const;
-
-  bool operator==(const NGLogicalOffset& other) const;
-
-  NGLogicalOffset operator+(const NGLogicalOffset& other) const;
-  NGLogicalOffset& operator+=(const NGLogicalOffset& other);
-
-  NGLogicalOffset operator-(const NGLogicalOffset& other) const;
-  NGLogicalOffset& operator-=(const NGLogicalOffset& other);
-
-  bool operator>(const NGLogicalOffset& other) const;
-  bool operator>=(const NGLogicalOffset& other) const;
-
-  bool operator<(const NGLogicalOffset& other) const;
-  bool operator<=(const NGLogicalOffset& other) const;
-
-  String ToString() const;
-};
-
-CORE_EXPORT inline std::ostream& operator<<(std::ostream& os,
-                                            const NGLogicalOffset& value) {
-  return os << value.ToString();
-}
-
-// NGPhysicalOffset is the position of a rect (typically a fragment) relative to
-// its parent rect in the physical coordinate system.
-struct CORE_EXPORT NGPhysicalOffset {
-  NGPhysicalOffset() {}
-  NGPhysicalOffset(LayoutUnit left, LayoutUnit top) : left(left), top(top) {}
-
-  LayoutUnit left;
-  LayoutUnit top;
-
-  NGPhysicalOffset operator+(const NGPhysicalOffset& other) const;
-  NGPhysicalOffset& operator+=(const NGPhysicalOffset& other);
-
-  NGPhysicalOffset operator-(const NGPhysicalOffset& other) const;
-  NGPhysicalOffset& operator-=(const NGPhysicalOffset& other);
-
-  bool operator==(const NGPhysicalOffset& other) const;
-
-  String ToString() const {
-    return String::format("%dx%d", left.toInt(), top.toInt());
-  }
-};
-
-CORE_EXPORT inline std::ostream& operator<<(std::ostream& os,
-                                            const NGPhysicalOffset& value) {
-  return os << value.ToString();
-}
-
-struct CORE_EXPORT NGPhysicalSize {
-  NGPhysicalSize() {}
-  NGPhysicalSize(LayoutUnit width, LayoutUnit height)
-      : width(width), height(height) {}
-
-  LayoutUnit width;
-  LayoutUnit height;
-
-  NGLogicalSize ConvertToLogical(NGWritingMode mode) const;
-
-  bool operator==(const NGPhysicalSize& other) const;
-
-  String ToString() const {
-    return String::format("%dx%d", width.toInt(), height.toInt());
-  }
-};
-
-inline std::ostream& operator<<(std::ostream& stream,
-                                const NGPhysicalSize& value) {
-  return stream << value.ToString();
-}
-
-// NGPhysicalLocation is the position of a rect (typically a fragment) relative
-// to the root document.
-struct NGPhysicalLocation {
-  NGPhysicalLocation() {}
-  NGPhysicalLocation(LayoutUnit left, LayoutUnit top) : left(left), top(top) {}
-  LayoutUnit left;
-  LayoutUnit top;
-};
-
-struct CORE_EXPORT NGPhysicalRect {
-  NGPhysicalRect();
-  NGPhysicalRect(const NGPhysicalLocation& location, const NGPhysicalSize& size)
-      : location(location), size(size) {}
-
-  NGPhysicalLocation Location() const { return location; }
-  NGPhysicalSize Size() const { return size; }
-  NGPixelSnappedPhysicalRect SnapToDevicePixels() const;
-
-  NGPhysicalLocation location;
-  NGPhysicalSize size;
-};
-
 // TODO(glebl): move to a separate file in layout/ng/units.
 struct CORE_EXPORT NGLogicalRect {
   NGLogicalRect() {}
@@ -262,12 +127,6 @@
   void Add(const NGExclusion& exclusion);
 };
 
-struct NGPixelSnappedPhysicalRect {
-  int top;
-  int left;
-  int width;
-  int height;
-};
 
 // Struct to store physical dimensions, independent of writing mode and
 // direction.
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_units_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_units_test.cc
index bf6684ac..cd9b9318 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_units_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_units_test.cc
@@ -10,63 +10,6 @@
 
 namespace {
 
-TEST(NGUnitsTest, ConvertLogicalOffsetToPhysicalOffset) {
-  NGLogicalOffset logical_offset(LayoutUnit(20), LayoutUnit(30));
-  NGPhysicalSize outer_size(LayoutUnit(300), LayoutUnit(400));
-  NGPhysicalSize inner_size(LayoutUnit(5), LayoutUnit(65));
-  NGPhysicalOffset offset;
-
-  offset = logical_offset.ConvertToPhysical(
-      kHorizontalTopBottom, TextDirection::kLtr, outer_size, inner_size);
-  EXPECT_EQ(LayoutUnit(20), offset.left);
-  EXPECT_EQ(LayoutUnit(30), offset.top);
-
-  offset = logical_offset.ConvertToPhysical(
-      kHorizontalTopBottom, TextDirection::kRtl, outer_size, inner_size);
-  EXPECT_EQ(LayoutUnit(275), offset.left);
-  EXPECT_EQ(LayoutUnit(30), offset.top);
-
-  offset = logical_offset.ConvertToPhysical(
-      kVerticalRightLeft, TextDirection::kLtr, outer_size, inner_size);
-  EXPECT_EQ(LayoutUnit(265), offset.left);
-  EXPECT_EQ(LayoutUnit(20), offset.top);
-
-  offset = logical_offset.ConvertToPhysical(
-      kVerticalRightLeft, TextDirection::kRtl, outer_size, inner_size);
-  EXPECT_EQ(LayoutUnit(265), offset.left);
-  EXPECT_EQ(LayoutUnit(315), offset.top);
-
-  offset = logical_offset.ConvertToPhysical(
-      kSidewaysRightLeft, TextDirection::kLtr, outer_size, inner_size);
-  EXPECT_EQ(LayoutUnit(265), offset.left);
-  EXPECT_EQ(LayoutUnit(20), offset.top);
-
-  offset = logical_offset.ConvertToPhysical(
-      kSidewaysRightLeft, TextDirection::kRtl, outer_size, inner_size);
-  EXPECT_EQ(LayoutUnit(265), offset.left);
-  EXPECT_EQ(LayoutUnit(315), offset.top);
-
-  offset = logical_offset.ConvertToPhysical(
-      kVerticalLeftRight, TextDirection::kLtr, outer_size, inner_size);
-  EXPECT_EQ(LayoutUnit(30), offset.left);
-  EXPECT_EQ(LayoutUnit(20), offset.top);
-
-  offset = logical_offset.ConvertToPhysical(
-      kVerticalLeftRight, TextDirection::kRtl, outer_size, inner_size);
-  EXPECT_EQ(LayoutUnit(30), offset.left);
-  EXPECT_EQ(LayoutUnit(315), offset.top);
-
-  offset = logical_offset.ConvertToPhysical(
-      kSidewaysLeftRight, TextDirection::kLtr, outer_size, inner_size);
-  EXPECT_EQ(LayoutUnit(30), offset.left);
-  EXPECT_EQ(LayoutUnit(315), offset.top);
-
-  offset = logical_offset.ConvertToPhysical(
-      kSidewaysLeftRight, TextDirection::kRtl, outer_size, inner_size);
-  EXPECT_EQ(LayoutUnit(30), offset.left);
-  EXPECT_EQ(LayoutUnit(20), offset.top);
-}
-
 // Ideally, this would be tested by NGBoxStrut::ConvertToPhysical, but
 // this has not been implemented yet.
 TEST(NGUnitsTest, ConvertPhysicalStrutToLogical) {
@@ -116,40 +59,6 @@
   EXPECT_EQ(LayoutUnit(200), sizes.ShrinkToFit(LayoutUnit(100)));
 }
 
-TEST(NGUnitsTest, SnapToDevicePixels) {
-  NGPhysicalRect rect(NGPhysicalLocation(LayoutUnit(4.5), LayoutUnit(9.5)),
-                      NGPhysicalSize(LayoutUnit(10.5), LayoutUnit(11.5)));
-  NGPixelSnappedPhysicalRect snappedRect = rect.SnapToDevicePixels();
-  EXPECT_EQ(5, snappedRect.left);
-  EXPECT_EQ(10, snappedRect.top);
-  EXPECT_EQ(10, snappedRect.width);
-  EXPECT_EQ(11, snappedRect.height);
-
-  rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(4), LayoutUnit(9)),
-                        NGPhysicalSize(LayoutUnit(10.5), LayoutUnit(11.5)));
-  snappedRect = rect.SnapToDevicePixels();
-  EXPECT_EQ(4, snappedRect.left);
-  EXPECT_EQ(9, snappedRect.top);
-  EXPECT_EQ(11, snappedRect.width);
-  EXPECT_EQ(12, snappedRect.height);
-
-  rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(1.3), LayoutUnit(1.6)),
-                        NGPhysicalSize(LayoutUnit(5.8), LayoutUnit(4.3)));
-  snappedRect = rect.SnapToDevicePixels();
-  EXPECT_EQ(1, snappedRect.left);
-  EXPECT_EQ(2, snappedRect.top);
-  EXPECT_EQ(6, snappedRect.width);
-  EXPECT_EQ(4, snappedRect.height);
-
-  rect = NGPhysicalRect(NGPhysicalLocation(LayoutUnit(1.6), LayoutUnit(1.3)),
-                        NGPhysicalSize(LayoutUnit(5.8), LayoutUnit(4.3)));
-  snappedRect = rect.SnapToDevicePixels();
-  EXPECT_EQ(2, snappedRect.left);
-  EXPECT_EQ(1, snappedRect.top);
-  EXPECT_EQ(5, snappedRect.width);
-  EXPECT_EQ(5, snappedRect.height);
-}
-
 }  // namespace
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/page/CreateWindow.cpp b/third_party/WebKit/Source/core/page/CreateWindow.cpp
index 0945a6c4..0d649a0d 100644
--- a/third_party/WebKit/Source/core/page/CreateWindow.cpp
+++ b/third_party/WebKit/Source/core/page/CreateWindow.cpp
@@ -28,7 +28,6 @@
 
 #include "core/dom/Document.h"
 #include "core/frame/FrameClient.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/Settings.h"
 #include "core/inspector/ConsoleMessage.h"
@@ -56,11 +55,11 @@
     if (Frame* frame =
             lookupFrame.findFrameForNavigation(frameName, activeFrame)) {
       if (frameName != "_self") {
-        if (FrameHost* host = frame->host()) {
-          if (host == activeFrame.host())
-            frame->page()->focusController().setFocusedFrame(frame);
+        if (Page* page = frame->page()) {
+          if (page == activeFrame.page())
+            page->focusController().setFocusedFrame(frame);
           else
-            host->chromeClient().focus();
+            page->chromeClient().focus();
         }
       }
       return frame;
@@ -74,15 +73,14 @@
                               const WindowFeatures& features,
                               NavigationPolicy policy,
                               bool& created) {
-  FrameHost* oldHost = openerFrame.host();
-  if (!oldHost)
+  Page* oldPage = openerFrame.page();
+  if (!oldPage)
     return nullptr;
 
-  Page* page = oldHost->chromeClient().createWindow(&openerFrame, request,
+  Page* page = oldPage->chromeClient().createWindow(&openerFrame, request,
                                                     features, policy);
   if (!page)
     return nullptr;
-  FrameHost* host = &page->frameHost();
 
   ASSERT(page->mainFrame());
   LocalFrame& frame = *toLocalFrame(page->mainFrame());
@@ -90,14 +88,14 @@
   if (request.frameName() != "_blank")
     frame.tree().setName(request.frameName());
 
-  host->chromeClient().setWindowFeatures(features);
+  page->chromeClient().setWindowFeatures(features);
 
   // 'x' and 'y' specify the location of the window, while 'width' and 'height'
   // specify the size of the viewport. We can only resize the window, so adjust
   // for the difference between the window size and the viewport size.
 
-  IntRect windowRect = host->chromeClient().rootWindowRect();
-  IntSize viewportSize = host->chromeClient().pageRect().size();
+  IntRect windowRect = page->chromeClient().rootWindowRect();
+  IntSize viewportSize = page->chromeClient().pageRect().size();
 
   if (features.xSet)
     windowRect.setX(features.x);
@@ -110,8 +108,8 @@
     windowRect.setHeight(features.height +
                          (windowRect.height() - viewportSize.height()));
 
-  host->chromeClient().setWindowRectWithAdjustment(windowRect, frame);
-  host->chromeClient().show(policy);
+  page->chromeClient().setWindowRectWithAdjustment(windowRect, frame);
+  page->chromeClient().show(policy);
 
   if (openerFrame.document()->isSandboxed(
           SandboxPropagatesToAuxiliaryBrowsingContexts))
diff --git a/third_party/WebKit/Source/core/page/NetworkStateNotifier.h b/third_party/WebKit/Source/core/page/NetworkStateNotifier.h
index c0bf4b6..9a04c7c 100644
--- a/third_party/WebKit/Source/core/page/NetworkStateNotifier.h
+++ b/third_party/WebKit/Source/core/page/NetworkStateNotifier.h
@@ -44,6 +44,15 @@
   USING_FAST_MALLOC(NetworkStateNotifier);
 
  public:
+  struct NetworkState {
+    static const int kInvalidMaxBandwidth = -1;
+    bool onLineInitialized = false;
+    bool onLine = true;
+    bool connectionInitialized = false;
+    WebConnectionType type = WebConnectionTypeOther;
+    double maxBandwidthMbps = kInvalidMaxBandwidth;
+  };
+
   class NetworkStateObserver {
    public:
     // Will be called on the task runner that is passed in add*Observer.
@@ -129,16 +138,6 @@
     Vector<size_t> zeroedObservers;  // Indices in observers that are 0.
   };
 
-  struct NetworkState {
-    static const int kInvalidMaxBandwidth = -1;
-    bool onLineInitialized = false;
-    bool onLine = true;
-    bool connectionInitialized = false;
-    WebConnectionType type = WebConnectionTypeOther;
-    double maxBandwidthMbps = kInvalidMaxBandwidth;
-  };
-  friend CrossThreadCopier<NetworkStateNotifier::NetworkState>;
-
   // This helper scope issues required notifications when mutating the state if
   // something has changed.  It's only possible to mutate the state on the main
   // thread.  Note that ScopedNotifier must be destroyed when not holding a lock
diff --git a/third_party/WebKit/Source/core/page/Page.h b/third_party/WebKit/Source/core/page/Page.h
index ee746b9..53fbb15 100644
--- a/third_party/WebKit/Source/core/page/Page.h
+++ b/third_party/WebKit/Source/core/page/Page.h
@@ -119,6 +119,7 @@
 
   static void platformColorsChanged();
 
+  // TODO(sashab): Remove this.
   FrameHost& frameHost() const { return *m_frameHost; }
 
   void setNeedsRecalcStyleInAllFrames();
diff --git a/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp b/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp
index 270b7c55..412c44b 100644
--- a/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp
+++ b/third_party/WebKit/Source/core/page/scrolling/TopDocumentRootScrollerController.cpp
@@ -198,7 +198,7 @@
     return;
 
   // Let the compositor-side counterpart know about this change.
-  m_frameHost->chromeClient().registerViewportLayers();
+  m_frameHost->page().chromeClient().registerViewportLayers();
 }
 
 void TopDocumentRootScrollerController::didDisposeScrollableArea(
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerClipperTest.cpp b/third_party/WebKit/Source/core/paint/PaintLayerClipperTest.cpp
index ca5eb027..9f5199c 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerClipperTest.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerClipperTest.cpp
@@ -40,7 +40,7 @@
 
 INSTANTIATE_TEST_CASE_P(All,
                         PaintLayerClipperTest,
-                        ::testing::ValuesIn({false, true}));
+                        ::testing::ValuesIn(std::vector<bool>{false, true}));
 
 TEST_P(PaintLayerClipperTest, LayoutSVGRoot) {
   setBodyInnerHTML(
diff --git a/third_party/WebKit/Source/core/svg/SVGAElement.cpp b/third_party/WebKit/Source/core/svg/SVGAElement.cpp
index a3283c6..a4e7c547 100644
--- a/third_party/WebKit/Source/core/svg/SVGAElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGAElement.cpp
@@ -30,7 +30,6 @@
 #include "core/editing/EditingUtilities.h"
 #include "core/events/KeyboardEvent.h"
 #include "core/events/MouseEvent.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/LocalFrame.h"
 #include "core/html/HTMLAnchorElement.h"
 #include "core/html/HTMLFormElement.h"
@@ -199,7 +198,7 @@
 bool SVGAElement::isKeyboardFocusable() const {
   if (isFocusable() && Element::supportsFocus())
     return SVGElement::isKeyboardFocusable();
-  if (isLink() && !document().frameHost()->chromeClient().tabsToLinks())
+  if (isLink() && !document().page()->chromeClient().tabsToLinks())
     return false;
   return SVGElement::isKeyboardFocusable();
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageView.js b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageView.js
index e8dee8b..5c40b1e 100644
--- a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageView.js
+++ b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageView.js
@@ -21,10 +21,9 @@
     var toolbarContainer = this.contentElement.createChild('div', 'coverage-toolbar-container');
     var topToolbar = new UI.Toolbar('coverage-toolbar', toolbarContainer);
 
-    this._recordButton =
-        new UI.ToolbarToggle(Common.UIString('Start recording'), 'largeicon-resume', 'largeicon-pause');
-    this._recordButton.addEventListener(UI.ToolbarButton.Events.Click, () => this._toggleRecording(!this._isRecording));
-    topToolbar.appendToolbarItem(this._recordButton);
+    this._toggleRecordAction =
+        /** @type {!UI.Action }*/ (UI.actionRegistry.action('coverage.toggle-recording'));
+    topToolbar.appendToolbarItem(UI.Toolbar.createActionButton(this._toggleRecordAction));
 
     var clearButton = new UI.ToolbarButton(Common.UIString('Clear all'), 'largeicon-clear');
     clearButton.addEventListener(UI.ToolbarButton.Events.Click, this._reset.bind(this));
@@ -36,8 +35,6 @@
 
     this._statusToolbarElement = this.contentElement.createChild('div', 'coverage-toolbar-summary');
     this._statusMessageElement = this._statusToolbarElement.createChild('div', 'coverage-message');
-
-    this._isRecording = false;
   }
 
   _reset() {
@@ -52,17 +49,10 @@
     this._statusMessageElement.textContent = '';
   }
 
-  /**
-   * @param {boolean} enable
-   */
-  _toggleRecording(enable) {
-    if (enable === this._isRecording)
-      return;
+  _toggleRecording() {
+    var enable = !this._toggleRecordAction.toggled();
 
-    this._isRecording = enable;
-    this._recordButton.setToggled(this._isRecording);
-
-    if (this._isRecording)
+    if (enable)
       this._startRecording();
     else
       this._stopRecording();
@@ -76,7 +66,7 @@
     var cssModel = mainTarget.model(SDK.CSSModel);
     if (!cssModel)
       return;
-    this._recordButton.setTitle(Common.UIString('Stop recording'));
+    this._toggleRecordAction.setToggled(true);
     cssModel.startRuleUsageTracking();
     mainTarget.profilerAgent().startPreciseCoverage();
 
@@ -84,7 +74,7 @@
   }
 
   async _stopRecording() {
-    this._recordButton.setTitle(Common.UIString('Start recording'));
+    this._toggleRecordAction.setToggled(false);
     this._progressElement.textContent = Common.UIString('Fetching results...');
 
     var cssCoverageInfoPromise = this._stopCSSCoverage();
@@ -353,3 +343,23 @@
 };
 
 Coverage.CoverageView.LineDecorator.type = 'coverage';
+
+/**
+ * @implements {UI.ActionDelegate}
+ */
+Coverage.CoverageView.RecordActionDelegate = class {
+  /**
+   * @override
+   * @param {!UI.Context} context
+   * @param {string} actionId
+   * @return {boolean}
+   */
+  handleAction(context, actionId) {
+    var coverageViewId = 'coverage';
+    UI.viewManager.showView(coverageViewId)
+        .then(() => UI.viewManager.view(coverageViewId).widget())
+        .then(widget => /** @type !Coverage.CoverageView} */ (widget)._toggleRecording());
+
+    return true;
+  }
+};
\ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage/module.json b/third_party/WebKit/Source/devtools/front_end/coverage/module.json
index 2998cd7..f1e0575 100644
--- a/third_party/WebKit/Source/devtools/front_end/coverage/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/coverage/module.json
@@ -14,6 +14,26 @@
             "type": "@SourceFrame.UISourceCodeFrame.LineDecorator",
             "className": "Coverage.CoverageView.LineDecorator",
             "decoratorType": "coverage"
+        },
+        {
+            "type": "@UI.ActionDelegate",
+            "actionId": "coverage.toggle-recording",
+            "iconClass": "largeicon-start-recording",
+            "toggledIconClass": "largeicon-stop-recording",
+            "toggleWithRedColor": true,
+            "className": "Coverage.CoverageView.RecordActionDelegate",
+            "category": "Performance",
+            "experiment": "cssTrackerPanel",
+            "options": [
+                {
+                    "value": true,
+                    "title": "Instrument coverage"
+                },
+                {
+                    "value": false,
+                    "title": "Stop instrumenting coverage and show results"
+                }
+            ]
         }
     ],
     "dependencies": [
diff --git a/third_party/WebKit/Source/devtools/front_end/main/Main.js b/third_party/WebKit/Source/devtools/front_end/main/Main.js
index 142b6f77..12c82662e 100644
--- a/third_party/WebKit/Source/devtools/front_end/main/Main.js
+++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -99,7 +99,7 @@
     Runtime.experiments.register('blackboxJSFramesOnTimeline', 'Blackbox JavaScript frames on Timeline', true);
     Runtime.experiments.register('continueToLocationMarkers', 'Continue to location markers', true);
     Runtime.experiments.register('colorContrastRatio', 'Contrast ratio line in color picker', true);
-    Runtime.experiments.register('cssTrackerPanel', 'Panel that tracks the usage of CSS rules.');
+    Runtime.experiments.register('cssTrackerPanel', 'Coverage support');
     Runtime.experiments.register('emptySourceMapAutoStepping', 'Empty sourcemap auto-stepping');
     Runtime.experiments.register('inputEventsOnTimelineOverview', 'Input events on Timeline overview', true);
     Runtime.experiments.register('liveSASS', 'Live SASS');
diff --git a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationControllerImpl.cpp b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationControllerImpl.cpp
index d5eb971..54a4376d 100644
--- a/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationControllerImpl.cpp
+++ b/third_party/WebKit/Source/modules/screen_orientation/ScreenOrientationControllerImpl.cpp
@@ -7,7 +7,6 @@
 #include "core/dom/Document.h"
 #include "core/dom/TaskRunnerHelper.h"
 #include "core/events/Event.h"
-#include "core/frame/FrameHost.h"
 #include "core/frame/FrameView.h"
 #include "core/frame/LocalFrame.h"
 #include "core/page/ChromeClient.h"
@@ -85,8 +84,8 @@
 void ScreenOrientationControllerImpl::updateOrientation() {
   DCHECK(m_orientation);
   DCHECK(frame());
-  DCHECK(frame()->host());
-  ChromeClient& chromeClient = frame()->host()->chromeClient();
+  DCHECK(frame()->page());
+  ChromeClient& chromeClient = frame()->page()->chromeClient();
   WebScreenInfo screenInfo = chromeClient.screenInfo();
   WebScreenOrientationType orientationType = screenInfo.orientationType;
   if (orientationType == WebScreenOrientationUndefined) {
@@ -120,12 +119,12 @@
     return;
 
   DCHECK(frame());
-  DCHECK(frame()->host());
+  DCHECK(frame()->page());
 
   // The orientation type and angle are tied in a way that if the angle has
   // changed, the type must have changed.
   unsigned short currentAngle =
-      frame()->host()->chromeClient().screenInfo().orientationAngle;
+      frame()->page()->chromeClient().screenInfo().orientationAngle;
 
   // FIXME: sendOrientationChangeEvent() currently send an event all the
   // children of the frame, so it should only be called on the frame on
diff --git a/third_party/WebKit/Source/web/InspectorOverlay.cpp b/third_party/WebKit/Source/web/InspectorOverlay.cpp
index b7d9e4c..8faf981d 100644
--- a/third_party/WebKit/Source/web/InspectorOverlay.cpp
+++ b/third_party/WebKit/Source/web/InspectorOverlay.cpp
@@ -395,7 +395,7 @@
   FrameView* view = m_frameImpl->frameView();
   LocalFrame* frame = m_frameImpl->frame();
   if (view && frame)
-    frame->host()->chromeClient().scheduleAnimation(view);
+    frame->page()->chromeClient().scheduleAnimation(view);
 }
 
 void InspectorOverlay::rebuildOverlayPage() {
@@ -495,7 +495,7 @@
   LocalFrame* frame = m_frameImpl->frame();
   if (!frame)
     return 1.0f;
-  return frame->host()->chromeClient().windowToViewportScalar(1.0f);
+  return frame->page()->chromeClient().windowToViewportScalar(1.0f);
 }
 
 Page* InspectorOverlay::overlayPage() {
@@ -510,7 +510,7 @@
   fillWithEmptyClients(pageClients);
   DCHECK(!m_overlayChromeClient);
   m_overlayChromeClient = InspectorOverlayChromeClient::create(
-      m_frameImpl->frame()->host()->chromeClient(), *this);
+      m_frameImpl->frame()->page()->chromeClient(), *this);
   pageClients.chromeClient = m_overlayChromeClient.get();
   m_overlayPage = Page::create(pageClients);
 
@@ -594,7 +594,7 @@
                        m_frameImpl->frame()->host()->visualViewport().scale());
 
   IntRect viewportInScreen =
-      m_frameImpl->frame()->host()->chromeClient().viewportToScreen(
+      m_frameImpl->frame()->page()->chromeClient().viewportToScreen(
           IntRect(IntPoint(), viewportSize), m_frameImpl->frame()->view());
   resetData->setObject("viewportSize",
                        buildObjectForSize(viewportInScreen.size()));
diff --git a/third_party/WebKit/Source/web/WebInputEventConversion.cpp b/third_party/WebKit/Source/web/WebInputEventConversion.cpp
index 4c58568..f1a7f26 100644
--- a/third_party/WebKit/Source/web/WebInputEventConversion.cpp
+++ b/third_party/WebKit/Source/web/WebInputEventConversion.cpp
@@ -75,8 +75,7 @@
                                            .visualViewport()
                                            .visibleRect()
                                            .location());
-      overscrollOffset =
-          rootView->page()->frameHost().chromeClient().elasticOverscroll();
+      overscrollOffset = rootView->page()->chromeClient().elasticOverscroll();
     }
   }
   return FloatPoint(
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
index 2a170a5..a95f10f 100644
--- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
+++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
@@ -1296,6 +1296,22 @@
   frame()->inputMethodController().deleteSurroundingText(before, after);
 }
 
+void WebLocalFrameImpl::deleteSurroundingTextInCodePoints(int before,
+                                                          int after) {
+  TRACE_EVENT0("blink", "WebLocalFrameImpl::deleteSurroundingTextInCodePoints");
+  if (WebPlugin* plugin = focusedPluginIfInputMethodSupported()) {
+    plugin->deleteSurroundingTextInCodePoints(before, after);
+    return;
+  }
+
+  // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets
+  // needs to be audited.  See http://crbug.com/590369 for more details.
+  frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets();
+
+  frame()->inputMethodController().deleteSurroundingTextInCodePoints(before,
+                                                                     after);
+}
+
 void WebLocalFrameImpl::setCaretVisible(bool visible) {
   frame()->selection().setCaretVisible(visible);
 }
diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.h b/third_party/WebKit/Source/web/WebLocalFrameImpl.h
index 6765b0c..68980612 100644
--- a/third_party/WebKit/Source/web/WebLocalFrameImpl.h
+++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.h
@@ -202,6 +202,7 @@
       const WebVector<WebCompositionUnderline>& underlines) override;
   void extendSelectionAndDelete(int before, int after) override;
   void deleteSurroundingText(int before, int after) override;
+  void deleteSurroundingTextInCodePoints(int before, int after) override;
   void setCaretVisible(bool) override;
   int printBegin(const WebPrintParams&,
                  const WebNode& constrainToNode) override;
diff --git a/third_party/WebKit/Source/web/tests/data/input_field_populated.html b/third_party/WebKit/Source/web/tests/data/input_field_populated.html
index 15c4b0e5..ba540cb 100644
--- a/third_party/WebKit/Source/web/tests/data/input_field_populated.html
+++ b/third_party/WebKit/Source/web/tests/data/input_field_populated.html
@@ -1,5 +1,7 @@
 <input id="sample" value='0123456789abcdefghijklmnopqrstuvwxyz'/>
 <div id="inputEvent">none</div>
+<!- "ab" + trophy + space + "cdef" + trophy + space + "gh">
+<input id="sample2" value='ab&#x1f3c6; cdef&#x1f3c6; gh'/>
 <script>
 document.getElementById('sample').addEventListener('input', function() {
     document.getElementById('inputEvent').textContent = 'got';
diff --git a/third_party/WebKit/public/web/WebLocalFrame.h b/third_party/WebKit/public/web/WebLocalFrame.h
index 7f51aa1..6d1beee 100644
--- a/third_party/WebKit/public/web/WebLocalFrame.h
+++ b/third_party/WebKit/public/web/WebLocalFrame.h
@@ -340,8 +340,15 @@
   // Replaces the selection with the input string.
   virtual void replaceSelection(const WebString&) = 0;
   // Deletes text before and after the current cursor position, excluding the
-  // selection.
+  // selection. The lengths are supplied in UTF-16 Code Unit, not in code points
+  // or in glyphs.
   virtual void deleteSurroundingText(int before, int after) = 0;
+  // A variant of deleteSurroundingText(int, int). Major differences are:
+  // 1. The lengths are supplied in code points, not in UTF-16 Code Unit or in
+  // glyphs.
+  // 2. This method does nothing if there are one or more invalid surrogate
+  // pairs in the requested range.
+  virtual void deleteSurroundingTextInCodePoints(int before, int after) = 0;
 
   virtual void extractSmartClipData(WebRect rectInViewport,
                                     WebString& clipText,
diff --git a/third_party/WebKit/public/web/WebPlugin.h b/third_party/WebKit/public/web/WebPlugin.h
index c57596b..8d2078b 100644
--- a/third_party/WebKit/public/web/WebPlugin.h
+++ b/third_party/WebKit/public/web/WebPlugin.h
@@ -195,8 +195,14 @@
   // before and after the selection or caret.
   virtual void extendSelectionAndDelete(int before, int after) {}
   // Deletes text before and after the current cursor position, excluding the
-  // selection.
+  // selection. The lengths are supplied in UTF-16 Code Unit, not in code points
+  // or in glyphs.
   virtual void deleteSurroundingText(int before, int after) {}
+  // Deletes text before and after the current cursor position, excluding the
+  // selection. The lengths are supplied in code points, not in UTF-16 Code Unit
+  // or in glyphs. Do nothing if there are one or more invalid surrogate pairs
+  // in the requested range.
+  virtual void deleteSurroundingTextInCodePoints(int before, int after) {}
   // If the given position is over a link, returns the absolute url.
   // Otherwise an empty url is returned.
   virtual WebURL linkAtPosition(const WebPoint& position) const {
diff --git a/third_party/polymer/v1_0/bower.json b/third_party/polymer/v1_0/bower.json
index d87760d..977ad9d 100644
--- a/third_party/polymer/v1_0/bower.json
+++ b/third_party/polymer/v1_0/bower.json
@@ -5,7 +5,7 @@
     "font-roboto": "PolymerElements/font-roboto#1.0.1",
     "iron-a11y-announcer": "PolymerElements/iron-a11y-announcer#1.0.5",
     "iron-a11y-keys-behavior": "PolymerElements/iron-a11y-keys-behavior#1.1.9",
-    "iron-a11y-keys": "PolymerElements/iron-a11y-keys#1.0.6",
+    "iron-a11y-keys": "PolymerElements/iron-a11y-keys#1.0.7",
     "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#1.0.13",
     "iron-behaviors": "PolymerElements/iron-behaviors#1.0.17",
     "iron-checked-element-behavior": "PolymerElements/iron-checked-element-behavior#1.0.5",
@@ -60,7 +60,7 @@
     "paper-toggle-button": "PolymerElements/paper-toggle-button#1.3.0",
     "paper-toolbar": "PolymerElements/paper-toolbar#1.1.6",
     "paper-tooltip": "PolymerElements/paper-tooltip#1.1.3",
-    "polymer": "Polymer/polymer#1.6.1",
+    "polymer": "Polymer/polymer#1.8.1",
     "web-animations-js": "web-animations/web-animations-js#2.2.2"
   }
 }
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json
index 79c18c5..b8221fe 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-a11y-keys",
-  "version": "1.0.6",
+  "version": "1.0.7",
   "description": "A basic element implementation of iron-a11y-keys-behavior, matching the legacy core-a11y-keys.",
   "keywords": [
     "web-components",
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys-extracted.js b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys-extracted.js
index 46f0ffc..eff16dd 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys-extracted.js
@@ -97,7 +97,7 @@
                     on-keys-pressed="increment"></iron-a11y-keys>
     <iron-a11y-keys target="[[target]]" keys="home"
                     on-keys-pressed="setMin"></iron-a11y-keys>
-    <iron-a11y-keys target=""[[target]] keys="end"
+    <iron-a11y-keys target="[[target]]" keys="end"
                     on-keys-pressed="setMax"></iron-a11y-keys>
 
 The `target` properties must evaluate to a node. See the basic usage
diff --git a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys.html b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys.html
index 0952980..d82c9f3 100644
--- a/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys.html
+++ b/third_party/polymer/v1_0/components-chromium/iron-a11y-keys/iron-a11y-keys.html
@@ -1,11 +1,11 @@
 <!--
 @license
 Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
-This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE
-The complete set of authors may be found at http://polymer.github.io/AUTHORS
-The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
 Code distributed by Google as part of the polymer project is also
-subject to an additional IP rights grant found at http://polymer.github.io/PATENTS
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 --><html><head><link rel="import" href="../polymer/polymer.html">
 <link rel="import" href="../iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
 
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/bower.json b/third_party/polymer/v1_0/components-chromium/polymer/bower.json
index f0b22f0..41962a4 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/bower.json
+++ b/third_party/polymer/v1_0/components-chromium/polymer/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "polymer",
-  "version": "1.6.1",
+  "version": "1.8.1",
   "main": [
     "polymer.html",
     "polymer-mini.html",
@@ -25,7 +25,7 @@
     "url": "https://github.com/Polymer/polymer.git"
   },
   "dependencies": {
-    "webcomponentsjs": "^0.7.20"
+    "webcomponentsjs": "^0.7.24"
   },
   "devDependencies": {
     "web-component-tester": "*",
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js
index cc3286d..0a223a3 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-extracted.js
@@ -1,9 +1,11 @@
+(function () {
 Polymer.nar = [];
+var disableUpgradeEnabled = Polymer.Settings.disableUpgradeEnabled;
 Polymer.Annotations = {
-parseAnnotations: function (template) {
+parseAnnotations: function (template, stripWhiteSpace) {
 var list = [];
 var content = template._content || template.content;
-this._parseNodeAnnotations(content, list, template.hasAttribute('strip-whitespace'));
+this._parseNodeAnnotations(content, list, stripWhiteSpace || template.hasAttribute('strip-whitespace'));
 return list;
 },
 _parseNodeAnnotations: function (node, list, stripWhiteSpace) {
@@ -114,7 +116,10 @@
 while (node) {
 var next = node.nextSibling;
 if (node.localName === 'template' && !node.hasAttribute('preserve-content')) {
-this._parseTemplate(node, i, list, annote);
+this._parseTemplate(node, i, list, annote, stripWhiteSpace);
+}
+if (node.localName == 'slot') {
+node = this._replaceSlotWithContent(node);
 }
 if (node.nodeType === Node.TEXT_NODE) {
 var n = next;
@@ -141,9 +146,26 @@
 }
 }
 },
-_parseTemplate: function (node, index, list, parent) {
+_replaceSlotWithContent: function (slot) {
+var content = slot.ownerDocument.createElement('content');
+while (slot.firstChild) {
+content.appendChild(slot.firstChild);
+}
+var attrs = slot.attributes;
+for (var i = 0; i < attrs.length; i++) {
+var attr = attrs[i];
+content.setAttribute(attr.name, attr.value);
+}
+var name = slot.getAttribute('name');
+if (name) {
+content.setAttribute('select', '[slot=\'' + name + '\']');
+}
+slot.parentNode.replaceChild(content, slot);
+return content;
+},
+_parseTemplate: function (node, index, list, parent, stripWhiteSpace) {
 var content = document.createDocumentFragment();
-content._notes = this.parseAnnotations(node);
+content._notes = this.parseAnnotations(node, stripWhiteSpace);
 content.appendChild(node.content);
 list.push({
 bindings: Polymer.nar,
@@ -188,6 +210,9 @@
 if (node.localName === 'input' && origName === 'value') {
 node.setAttribute(origName, '');
 }
+if (disableUpgradeEnabled && origName === 'disable-upgrade$') {
+node.setAttribute(name, '');
+}
 node.removeAttribute(origName);
 var propertyName = Polymer.CaseMap.dashToCamelCase(name);
 if (kind === 'property') {
@@ -215,7 +240,8 @@
 return root;
 }
 }
-};(function () {
+};
+}());(function () {
 function resolveCss(cssText, ownerDocument) {
 return cssText.replace(CSS_URL_RX, function (m, pre, url, post) {
 return pre + '\'' + resolve(url.replace(/["']/g, ''), ownerDocument) + '\'' + post;
@@ -255,7 +281,7 @@
 return resolve(url, tempDoc);
 }
 function getUrlResolver(ownerDocument) {
-return ownerDocument.__urlResolver || (ownerDocument.__urlResolver = ownerDocument.createElement('a'));
+return ownerDocument.body.__urlResolver || (ownerDocument.body.__urlResolver = ownerDocument.createElement('a'));
 }
 var CSS_URL_RX = /(url\()([^)]*)(\))/g;
 var URL_ATTRS = {
@@ -274,7 +300,30 @@
 resolveAttrs: resolveAttrs,
 resolveUrl: resolveUrl
 };
-}());Polymer.Base._addFeature({
+}());Polymer.Path = {
+root: function (path) {
+var dotIndex = path.indexOf('.');
+if (dotIndex === -1) {
+return path;
+}
+return path.slice(0, dotIndex);
+},
+isDeep: function (path) {
+return path.indexOf('.') !== -1;
+},
+isAncestor: function (base, path) {
+return base.indexOf(path + '.') === 0;
+},
+isDescendant: function (base, path) {
+return path.indexOf(base + '.') === 0;
+},
+translate: function (base, newBase, path) {
+return newBase + path.slice(base.length);
+},
+matches: function (base, wildcard, path) {
+return base === path || this.isAncestor(base, path) || Boolean(wildcard) && this.isDescendant(base, path);
+}
+};Polymer.Base._addFeature({
 _prepAnnotations: function () {
 if (!this._template) {
 this._notes = [];
@@ -304,7 +353,7 @@
 if (signature) {
 p.signature = signature;
 } else {
-p.model = this._modelForPath(p.value);
+p.model = Polymer.Path.root(p.value);
 }
 }
 }
@@ -475,8 +524,10 @@
 var bl = hbl.get(target);
 if (!bl) {
 bl = {};
+if (!Polymer.Settings.isIE || target != window) {
 hbl.set(target, bl);
 }
+}
 var key = this._boundListenerKey(eventName, methodName);
 bl[key] = handler;
 },
@@ -548,6 +599,19 @@
 return false;
 }
 }();
+var SUPPORTS_PASSIVE = false;
+(function () {
+try {
+var opts = Object.defineProperty({}, 'passive', {
+get: function () {
+SUPPORTS_PASSIVE = true;
+}
+});
+window.addEventListener('test', null, opts);
+window.removeEventListener('test', null, opts);
+} catch (e) {
+}
+}());
 var IS_TOUCH_ONLY = navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/);
 var mouseCanceller = function (mouseEvent) {
 var sc = mouseEvent.sourceCapabilities;
@@ -567,8 +631,9 @@
 }
 };
 function setupTeardownMouseCanceller(setup) {
-for (var i = 0, en; i < MOUSE_EVENTS.length; i++) {
-en = MOUSE_EVENTS[i];
+var events = IS_TOUCH_ONLY ? ['click'] : MOUSE_EVENTS;
+for (var i = 0, en; i < events.length; i++) {
+en = events[i];
 if (setup) {
 document.addEventListener(en, mouseCanceller, true);
 } else {
@@ -576,10 +641,7 @@
 }
 }
 }
-function ignoreMouse() {
-if (IS_TOUCH_ONLY) {
-return;
-}
+function ignoreMouse(ev) {
 if (!POINTERSTATE.mouse.mouseIgnoreJob) {
 setupTeardownMouseCanceller(true);
 }
@@ -588,6 +650,7 @@
 POINTERSTATE.mouse.target = null;
 POINTERSTATE.mouse.mouseIgnoreJob = null;
 };
+POINTERSTATE.mouse.target = Polymer.dom(ev).rootTarget;
 POINTERSTATE.mouse.mouseIgnoreJob = Polymer.Debounce(POINTERSTATE.mouse.mouseIgnoreJob, unset, MOUSE_TIMEOUT);
 }
 function hasLeftMouseButton(ev) {
@@ -654,6 +717,7 @@
 stateObj.movefn = null;
 stateObj.upfn = null;
 }
+document.addEventListener('touchend', ignoreMouse, SUPPORTS_PASSIVE ? { passive: true } : false);
 var Gestures = {
 gestures: {},
 recognizers: [],
@@ -703,10 +767,6 @@
 Gestures.handleTouchAction(ev);
 }
 }
-if (type === 'touchend') {
-POINTERSTATE.mouse.target = Polymer.dom(ev).rootTarget;
-ignoreMouse();
-}
 }
 }
 handled = ev[HANDLED_OBJ];
@@ -772,7 +832,7 @@
 }
 for (var i = 0, dep, gd; i < deps.length; i++) {
 dep = deps[i];
-if (IS_TOUCH_ONLY && MOUSE_EVENTS.indexOf(dep) > -1) {
+if (IS_TOUCH_ONLY && MOUSE_EVENTS.indexOf(dep) > -1 && dep !== 'click') {
 continue;
 }
 gd = gobj[dep];
@@ -1322,20 +1382,22 @@
 var cached = list[link.href];
 var imprt = cached || link;
 var self = this;
-if (onload) {
 var loadListener = function (e) {
 e.target.__firedLoad = true;
 e.target.removeEventListener('load', loadListener);
+e.target.removeEventListener('error', errorListener);
 return onload.call(self, e);
 };
-imprt.addEventListener('load', loadListener);
-}
-if (onerror) {
 var errorListener = function (e) {
 e.target.__firedError = true;
+e.target.removeEventListener('load', loadListener);
 e.target.removeEventListener('error', errorListener);
 return onerror.call(self, e);
 };
+if (onload) {
+imprt.addEventListener('load', loadListener);
+}
+if (onerror) {
 imprt.addEventListener('error', errorListener);
 }
 if (cached) {
@@ -1396,7 +1458,7 @@
 this.fire(event, { value: value }, {
 bubbles: false,
 cancelable: false,
-_useCache: true
+_useCache: Polymer.Settings.eventDataCache || !Polymer.Settings.isIE
 });
 },
 _propertySetter: function (property, value, effects, fromAbove) {
@@ -1431,7 +1493,7 @@
 },
 _clearPath: function (path) {
 for (var prop in this.__data__) {
-if (prop.indexOf(path + '.') === 0) {
+if (Polymer.Path.isDescendant(path, prop)) {
 this.__data__[prop] = undefined;
 }
 }
@@ -1508,7 +1570,7 @@
 if (!model._bindListeners) {
 model._bindListeners = [];
 }
-var fn = this._notedListenerFactory(property, path, this._isStructured(path), negated);
+var fn = this._notedListenerFactory(property, path, Polymer.Path.isDeep(path), negated);
 var eventName = event || Polymer.CaseMap.camelToDashCase(property) + '-changed';
 model._bindListeners.push({
 index: index,
@@ -1518,16 +1580,14 @@
 event: eventName
 });
 },
-_isStructured: function (path) {
-return path.indexOf('.') > 0;
-},
 _isEventBogus: function (e, target) {
 return e.path && e.path[0] !== target;
 },
 _notedListenerFactory: function (property, path, isStructured, negated) {
 return function (target, value, targetPath) {
 if (targetPath) {
-this._notifyPath(this._fixPath(path, property, targetPath), value);
+var newPath = Polymer.Path.translate(property, path, targetPath);
+this._notifyPath(newPath, value);
 } else {
 value = target[property];
 if (negated) {
@@ -1558,7 +1618,7 @@
 return context._notifyListener(changedFn, e);
 });
 }
-};Polymer.Base.extend(Polymer.Bind, {
+};Polymer.Base.mixin(Polymer.Bind, {
 _shouldAddListener: function (effect) {
 return effect.name && effect.kind != 'attribute' && effect.kind != 'text' && !effect.isCompound && effect.parts[0].mode === '{';
 },
@@ -1649,7 +1709,7 @@
 return;
 }
 if (arg.wildcard) {
-var matches = path.indexOf(name + '.') === 0;
+var matches = Polymer.Path.isAncestor(path, name);
 values[i] = {
 path: matches ? path : name,
 value: matches ? value : v,
@@ -1876,8 +1936,8 @@
 break;
 }
 if (!a.literal) {
-a.model = this._modelForPath(arg);
-a.structured = arg.indexOf('.') > 0;
+a.model = Polymer.Path.root(arg);
+a.structured = Polymer.Path.isDeep(arg);
 if (a.structured) {
 a.wildcard = arg.slice(-2) == '.*';
 if (a.wildcard) {
@@ -1904,7 +1964,7 @@
 if (pinfo && pinfo.readOnly) {
 return;
 }
-this.__setProperty(property, value, false, node);
+this.__setProperty(property, value, Polymer.Settings.suppressBindingNotifications, node);
 }
 },
 _computeFinalAnnotationValue: function (node, property, value, info) {
@@ -1933,6 +1993,7 @@
 }
 });(function () {
 var usePolyfillProto = Polymer.Settings.usePolyfillProto;
+var avoidInstanceProperties = Boolean(Object.getOwnPropertyDescriptor(document.documentElement, 'properties'));
 Polymer.Base._addFeature({
 _setupConfigure: function (initialConfig) {
 this._config = {};
@@ -1970,7 +2031,7 @@
 for (var i = 0; i < this.behaviors.length; i++) {
 this._configureProperties(this.behaviors[i].properties, config);
 }
-this._configureProperties(this.properties, config);
+this._configureProperties(avoidInstanceProperties ? this.__proto__.properties : this.properties, config);
 this.mixin(config, this._aboveConfig);
 this._config = config;
 if (this._clients && this._clients.length) {
@@ -2067,6 +2128,7 @@
 });
 }());(function () {
 'use strict';
+var Path = Polymer.Path;
 Polymer.Base._addFeature({
 notifyPath: function (path, value, fromAbove) {
 var info = {};
@@ -2174,7 +2236,7 @@
 return prop;
 },
 _pathEffector: function (path, value) {
-var model = this._modelForPath(path);
+var model = Path.root(path);
 var fx$ = this._propertyEffects && this._propertyEffects[model];
 if (fx$) {
 for (var i = 0, fx; i < fx$.length && (fx = fx$[i]); i++) {
@@ -2189,35 +2251,31 @@
 }
 },
 _annotationPathEffect: function (path, value, effect) {
-if (effect.value === path || effect.value.indexOf(path + '.') === 0) {
+if (Path.matches(effect.value, false, path)) {
 Polymer.Bind._annotationEffect.call(this, path, value, effect);
-} else if (path.indexOf(effect.value + '.') === 0 && !effect.negate) {
+} else if (!effect.negate && Path.isDescendant(effect.value, path)) {
 var node = this._nodes[effect.index];
 if (node && node._notifyPath) {
-var p = this._fixPath(effect.name, effect.value, path);
-node._notifyPath(p, value, true);
+var newPath = Path.translate(effect.value, effect.name, path);
+node._notifyPath(newPath, value, true);
 }
 }
 },
 _complexObserverPathEffect: function (path, value, effect) {
-if (this._pathMatchesEffect(path, effect)) {
+if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) {
 Polymer.Bind._complexObserverEffect.call(this, path, value, effect);
 }
 },
 _computePathEffect: function (path, value, effect) {
-if (this._pathMatchesEffect(path, effect)) {
+if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) {
 Polymer.Bind._computeEffect.call(this, path, value, effect);
 }
 },
 _annotatedComputationPathEffect: function (path, value, effect) {
-if (this._pathMatchesEffect(path, effect)) {
+if (Path.matches(effect.trigger.name, effect.trigger.wildcard, path)) {
 Polymer.Bind._annotatedComputationEffect.call(this, path, value, effect);
 }
 },
-_pathMatchesEffect: function (path, effect) {
-var effectArg = effect.trigger.name;
-return effectArg == path || effectArg.indexOf(path + '.') === 0 || effect.trigger.wildcard && path.indexOf(effectArg + '.') === 0;
-},
 linkPaths: function (to, from) {
 this._boundPaths = this._boundPaths || {};
 if (from) {
@@ -2234,18 +2292,15 @@
 _notifyBoundPaths: function (path, value) {
 for (var a in this._boundPaths) {
 var b = this._boundPaths[a];
-if (path.indexOf(a + '.') == 0) {
-this._notifyPath(this._fixPath(b, a, path), value);
-} else if (path.indexOf(b + '.') == 0) {
-this._notifyPath(this._fixPath(a, b, path), value);
+if (Path.isDescendant(a, path)) {
+this._notifyPath(Path.translate(a, b, path), value);
+} else if (Path.isDescendant(b, path)) {
+this._notifyPath(Path.translate(b, a, path), value);
 }
 }
 },
-_fixPath: function (property, root, path) {
-return property + path.slice(root.length);
-},
 _notifyPathUp: function (path, value) {
-var rootName = this._modelForPath(path);
+var rootName = Path.root(path);
 var dashCaseName = Polymer.CaseMap.camelToDashCase(rootName);
 var eventName = dashCaseName + this._EVENT_CHANGED;
 this.fire(eventName, {
@@ -2253,13 +2308,9 @@
 value: value
 }, {
 bubbles: false,
-_useCache: true
+_useCache: Polymer.Settings.eventDataCache || !Polymer.Settings.isIE
 });
 },
-_modelForPath: function (path) {
-var dot = path.indexOf('.');
-return dot < 0 ? path : path.slice(0, dot);
-},
 _EVENT_CHANGED: '-changed',
 notifySplices: function (path, splices) {
 var info = {};
@@ -2365,8 +2416,6 @@
 _complexObserverPathEffect: Polymer.Base._complexObserverPathEffect,
 _annotatedComputationPathEffect: Polymer.Base._annotatedComputationPathEffect,
 _computePathEffect: Polymer.Base._computePathEffect,
-_modelForPath: Polymer.Base._modelForPath,
-_pathMatchesEffect: Polymer.Base._pathMatchesEffect,
 _notifyBoundPaths: Polymer.Base._notifyBoundPaths,
 _getPathParts: Polymer.Base._getPathParts
 });
@@ -2660,7 +2709,9 @@
 for (var i = 0, e; i < e$.length; i++) {
 e = e$[i];
 if (e.localName === 'template') {
+if (!e.hasAttribute('preserve-content')) {
 cssText += this.cssFromElement(e);
+}
 } else {
 if (e.localName === 'style') {
 var include = e.getAttribute(this.INCLUDE_ATTR);
@@ -2677,6 +2728,37 @@
 }
 return cssText;
 },
+styleIncludesToTemplate: function (targetTemplate) {
+var styles = targetTemplate.content.querySelectorAll('style[include]');
+for (var i = 0, s; i < styles.length; i++) {
+s = styles[i];
+s.parentNode.insertBefore(this._includesToFragment(s.getAttribute('include')), s);
+}
+},
+_includesToFragment: function (styleIncludes) {
+var includeArray = styleIncludes.trim().split(' ');
+var frag = document.createDocumentFragment();
+for (var i = 0; i < includeArray.length; i++) {
+var t = Polymer.DomModule.import(includeArray[i], 'template');
+if (t) {
+this._addStylesToFragment(frag, t.content);
+}
+}
+return frag;
+},
+_addStylesToFragment: function (frag, source) {
+var s$ = source.querySelectorAll('style');
+for (var i = 0, s; i < s$.length; i++) {
+s = s$[i];
+var include = s.getAttribute('include');
+if (include) {
+frag.appendChild(this._includesToFragment(include));
+}
+if (s.textContent) {
+frag.appendChild(s.cloneNode(true));
+}
+}
+},
 isTargetedBuild: function (buildType) {
 return settings.useNativeShadow ? buildType === 'shadow' : buildType === 'shady';
 },
@@ -2787,9 +2869,21 @@
 var styles = element._styles;
 var cssText = '';
 var cssBuildType = element.__cssBuild;
+var passthrough = settings.useNativeShadow || cssBuildType === 'shady';
+var cb;
+if (passthrough) {
+var self = this;
+cb = function (rule) {
+rule.selector = self._slottedToContent(rule.selector);
+rule.selector = rule.selector.replace(ROOT, ':host > *');
+if (callback) {
+callback(rule);
+}
+};
+}
 for (var i = 0, l = styles.length, s; i < l && (s = styles[i]); i++) {
 var rules = styleUtil.rulesForStyle(s);
-cssText += settings.useNativeShadow || cssBuildType === 'shady' ? styleUtil.toCssText(rules, callback) : this.css(rules, element.is, element.extends, callback, element._scopeCssViaAttr) + '\n\n';
+cssText += passthrough ? styleUtil.toCssText(rules, cb) : this.css(rules, element.is, element.extends, callback, element._scopeCssViaAttr) + '\n\n';
 }
 return cssText.trim();
 },
@@ -2837,6 +2931,8 @@
 var hostContext = false;
 var self = this;
 selector = selector.trim();
+selector = this._slottedToContent(selector);
+selector = selector.replace(ROOT, ':host > *');
 selector = selector.replace(CONTENT_START, HOST + ' $1');
 selector = selector.replace(SIMPLE_SELECTOR_SEP, function (m, c, s) {
 if (!stop) {
@@ -2915,13 +3011,14 @@
 }
 },
 normalizeRootSelector: function (rule) {
-if (rule.selector === ROOT) {
-rule.selector = 'html';
-}
+rule.selector = rule.selector.replace(ROOT, 'html');
 },
 _transformDocumentSelector: function (selector) {
 return selector.match(SCOPE_JUMP) ? this._transformComplexSelector(selector, SCOPE_DOC_SELECTOR) : this._transformSimpleSelector(selector.trim(), SCOPE_DOC_SELECTOR);
 },
+_slottedToContent: function (cssText) {
+return cssText.replace(SLOTTED_PAREN, CONTENT + '> $1');
+},
 SCOPE_NAME: 'style-scope'
 };
 var SCOPE_NAME = api.SCOPE_NAME;
@@ -2943,6 +3040,7 @@
 var CLASS = 'class';
 var CONTENT_START = new RegExp('^(' + CONTENT + ')');
 var SELECTOR_NO_MATCH = 'should_not_match';
+var SLOTTED_PAREN = /(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/g;
 return api;
 }();Polymer.StyleExtends = function () {
 var styleUtil = Polymer.StyleUtil;
@@ -3120,7 +3218,7 @@
 return prefix + out.join('; ') + ';';
 }
 function fixVars(matchText, varA, varB) {
-return 'var(' + varA + ',' + 'var(' + varB + '));';
+return 'var(' + varA + ',' + 'var(' + varB + '))';
 }
 function atApplyToCssProperties(mixinName, fallbacks) {
 mixinName = mixinName.replace(APPLY_NAME_CLEAN, '');
@@ -3181,20 +3279,28 @@
 _separator: MIXIN_VAR_SEP,
 transform: function (styles, elementProto) {
 this.__currentElementProto = elementProto;
-styleUtil.forRulesInStyles(styles, this._boundTransformRule);
+styleUtil.forRulesInStyles(styles, this._boundFindDefinitions);
+styleUtil.forRulesInStyles(styles, this._boundFindApplications);
+if (elementProto) {
 elementProto.__applyShimInvalid = false;
+}
 this.__currentElementProto = null;
 },
-transformRule: function (rule) {
-rule.cssText = this.transformCssText(rule.parsedCssText);
+_findDefinitions: function (rule) {
+var cssText = rule.parsedCssText;
+cssText = cssText.replace(BAD_VAR, fixVars);
+cssText = cssText.replace(VAR_ASSIGN, produceCssProperties);
+rule.cssText = cssText;
 if (rule.selector === ':root') {
 rule.selector = ':host > *';
 }
 },
-transformCssText: function (cssText) {
-cssText = cssText.replace(BAD_VAR, fixVars);
-cssText = cssText.replace(VAR_ASSIGN, produceCssProperties);
-return consumeCssProperties(cssText);
+_findApplications: function (rule) {
+rule.cssText = consumeCssProperties(rule.cssText);
+},
+transformRule: function (rule) {
+this._findDefinitions(rule);
+this._findApplications(rule);
 },
 _getInitialValueForProperty: function (property) {
 if (!this._measureElement) {
@@ -3206,6 +3312,8 @@
 }
 };
 ApplyShim._boundTransformRule = ApplyShim.transformRule.bind(ApplyShim);
+ApplyShim._boundFindDefinitions = ApplyShim._findDefinitions.bind(ApplyShim);
+ApplyShim._boundFindApplications = ApplyShim._findApplications.bind(ApplyShim);
 return ApplyShim;
 }();(function () {
 var prepElement = Polymer.Base._prepElement;
@@ -3235,6 +3343,9 @@
 if (this._template) {
 var hasTargetedCssBuild = styleUtil.isTargetedBuild(this.__cssBuild);
 if (settings.useNativeCSSProperties && this.__cssBuild === 'shadow' && hasTargetedCssBuild) {
+if (settings.preserveStyleIncludes) {
+styleUtil.styleIncludesToTemplate(this._template);
+}
 return;
 }
 this._styles = this._styles || this._collectStyles();
@@ -3516,6 +3627,10 @@
 key: o
 };
 },
+_rootSelector: /:root|:host\s*>\s*\*/,
+_checkRoot: function (hostScope, selector) {
+return Boolean(selector.match(this._rootSelector)) || hostScope === 'html' && selector.indexOf('html') > -1;
+},
 whenHostOrRootRule: function (scope, rule, style, callback) {
 if (!rule.propertyInfo) {
 self.decorateRule(rule);
@@ -3525,17 +3640,13 @@
 }
 var hostScope = scope.is ? styleTransformer._calcHostScope(scope.is, scope.extends) : 'html';
 var parsedSelector = rule.parsedSelector;
-var isRoot = parsedSelector === ':root';
-var isHost = parsedSelector.indexOf(':host') === 0;
+var isRoot = this._checkRoot(hostScope, parsedSelector);
+var isHost = !isRoot && parsedSelector.indexOf(':host') === 0;
 var cssBuild = scope.__cssBuild || style.__cssBuild;
 if (cssBuild === 'shady') {
-isRoot = parsedSelector === hostScope + ' > *.' + hostScope || parsedSelector.indexOf('html') !== -1;
+isRoot = parsedSelector === hostScope + ' > *.' + hostScope || parsedSelector.indexOf('html') > -1;
 isHost = !isRoot && parsedSelector.indexOf(hostScope) === 0;
 }
-if (cssBuild === 'shadow') {
-isRoot = parsedSelector === ':host > *' || parsedSelector === 'html';
-isHost = isHost && !isRoot;
-}
 if (!isRoot && !isHost) {
 return;
 }
@@ -3546,6 +3657,9 @@
 }
 selectorToMatch = rule.transformedSelector || rule.parsedSelector;
 }
+if (isRoot && hostScope === 'html') {
+selectorToMatch = rule.transformedSelector || rule.parsedSelector;
+}
 callback({
 selector: selectorToMatch,
 isHost: isHost,
@@ -3650,6 +3764,9 @@
 style = styleUtil.applyCss(cssText, selector, null, element._scopeStyle);
 }
 } else if (!style.parentNode) {
+if (IS_IE && cssText.indexOf('@media') > -1) {
+style.textContent = cssText;
+}
 styleUtil.applyStyle(style, null, element._scopeStyle);
 }
 }
@@ -3660,9 +3777,6 @@
 }
 element._customStyle = style;
 }
-if (IS_IE) {
-style.textContent = style.textContent;
-}
 return style;
 },
 mixinCustomStyle: function (props, customStyle) {
@@ -3809,6 +3923,9 @@
 },
 customStyle: null,
 getComputedStyleValue: function (property) {
+if (!nativeVariables && !this._styleProperties) {
+this._computeStyleProperties();
+}
 return !nativeVariables && this._styleProperties && this._styleProperties[property] || getComputedStyle(this).getPropertyValue(property);
 },
 _setupStyleProperties: function () {
@@ -3993,7 +4110,9 @@
 }());Polymer.Base._addFeature({
 _registerFeatures: function () {
 this._prepIs();
+if (this.factoryImpl) {
 this._prepConstructor();
+}
 this._prepStyles();
 },
 _finishRegisterFeatures: function () {
@@ -4013,7 +4132,7 @@
 },
 _initFeatures: function () {
 this._setupGestures();
-this._setupConfigure();
+this._setupConfigure(this.__data__);
 this._setupStyleProperties();
 this._setupDebouncers();
 this._setupShady();
@@ -4105,10 +4224,10 @@
 if (!targetedBuild) {
 styleUtil.forEachRule(styleRules, function (rule) {
 styleTransformer.documentRule(rule);
-if (settings.useNativeCSSProperties && !buildType) {
-applyShim.transformRule(rule);
-}
 });
+if (settings.useNativeCSSProperties && !buildType) {
+applyShim.transform([e]);
+}
 }
 if (settings.useNativeCSSProperties) {
 e.textContent = styleUtil.toCssText(styleRules);
@@ -4279,6 +4398,8 @@
 effect: { event: Polymer.CaseMap.camelToDashCase(parentProp) + '-changed' }
 }
 ];
+proto._propertyEffects = proto._propertyEffects || {};
+proto._propertyEffects[parentProp] = effects;
 Polymer.Bind._createAccessors(proto, parentProp, effects);
 }
 }
@@ -4320,12 +4441,17 @@
 }
 for (var i = 0, n; i < n$.length && (n = n$[i]); i++) {
 var val = template[n];
+if (val && n == '_propertyEffects') {
+var pe = Polymer.Base.mixin({}, val);
+template._propertyEffects = Polymer.Base.mixin(pe, proto._propertyEffects);
+} else {
 var pd = Object.getOwnPropertyDescriptor(proto, n);
 Object.defineProperty(template, n, pd);
 if (val !== undefined) {
 template._propertySetter(n, val);
 }
 }
+}
 },
 _showHideChildren: function (hidden) {
 },
@@ -4335,8 +4461,7 @@
 },
 _notifyPathUpImpl: function (path, value) {
 var dataHost = this.dataHost;
-var dot = path.indexOf('.');
-var root = dot < 0 ? path : path.slice(0, dot);
+var root = Polymer.Path.root(path);
 dataHost._forwardInstancePath.call(dataHost, this, path, value);
 if (root in dataHost._parentProps) {
 dataHost._templatized._notifyPath(dataHost._parentPropPrefix + path, value);
@@ -4346,7 +4471,7 @@
 if (this._forwardParentPath) {
 if (path.indexOf(this._parentPropPrefix) === 0) {
 var subPath = path.substring(this._parentPropPrefix.length);
-var model = this._modelForPath(subPath);
+var model = Polymer.Path.root(subPath);
 if (model in this._parentProps) {
 this._forwardParentPath(subPath, value);
 }
@@ -4592,7 +4717,7 @@
 delay: Number,
 renderedItemCount: {
 type: Number,
-notify: true,
+notify: !Polymer.Settings.suppressTemplateNotifications,
 readOnly: true
 },
 initialCount: {
@@ -4603,6 +4728,7 @@
 type: Number,
 value: 20
 },
+notifyDomChange: { type: Boolean },
 _targetFrameTime: {
 type: Number,
 computed: '_computeFrameTime(targetFramerate)'
@@ -4770,7 +4896,9 @@
 }
 this._pool.length = 0;
 this._setRenderedItemCount(this._instances.length);
+if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) {
 this.fire('dom-change');
+}
 this._tryRenderChunk();
 },
 _applyFullRefresh: function () {
@@ -4966,6 +5094,7 @@
 },
 _showHideChildren: function (hidden) {
 for (var i = 0; i < this._instances.length; i++) {
+if (!this._instances[i].isPlaceholder)
 this._instances[i]._showHideChildren(hidden);
 }
 },
@@ -5134,7 +5263,8 @@
 type: Boolean,
 value: false,
 observer: '_queueRender'
-}
+},
+notifyDomChange: { type: Boolean }
 },
 behaviors: [Polymer.Templatizer],
 _queueRender: function () {
@@ -5167,7 +5297,9 @@
 this._showHideChildren();
 }
 if (this.if != this._lastIf) {
+if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) {
 this.fire('dom-change');
+}
 this._lastIf = this.if;
 }
 },
@@ -5222,6 +5354,7 @@
 }
 });Polymer({
 is: 'dom-bind',
+properties: { notifyDomChange: { type: Boolean } },
 extends: 'template',
 _template: null,
 created: function () {
@@ -5302,6 +5435,8 @@
 this._children = Polymer.TreeApi.arrayCopyChildNodes(this.root);
 }
 this._insertChildren();
+if (!Polymer.Settings.suppressTemplateNotifications || this.notifyDomChange) {
 this.fire('dom-change');
 }
+}
 });
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js
index d7766c5..40fa73f 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-micro-extracted.js
@@ -32,6 +32,7 @@
 settings.usePolyfillProto = !settings.useNativeCustomElements && !Object.__proto__;
 settings.hasNativeCSSProperties = !navigator.userAgent.match('AppleWebKit/601') && window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)');
 settings.useNativeCSSProperties = settings.hasNativeCSSProperties && settings.lazyRegister && settings.useNativeCSSProperties;
+settings.isIE = navigator.userAgent.match('Trident');
 return settings;
 }()
 };(function () {
@@ -43,15 +44,15 @@
 if (!prototype) {
 prototype = {};
 }
-var factory = desugar(prototype);
-prototype = factory.prototype;
+prototype = desugar(prototype);
+var customCtor = prototype === prototype.constructor.prototype ? prototype.constructor : null;
 var options = { prototype: prototype };
 if (prototype.extends) {
 options.extends = prototype.extends;
 }
 Polymer.telemetry._registrate(prototype);
-document.registerElement(prototype.is, options);
-return factory;
+var ctor = document.registerElement(prototype.is, options);
+return customCtor || ctor;
 };
 var desugar = function (prototype) {
 var base = Polymer.Base;
@@ -60,14 +61,20 @@
 }
 prototype = Polymer.Base.chainObject(prototype, base);
 prototype.registerCallback();
-return prototype.constructor;
+return prototype;
 };
 if (userPolymer) {
 for (var i in userPolymer) {
 Polymer[i] = userPolymer[i];
 }
 }
-Polymer.Class = desugar;
+Polymer.Class = function (prototype) {
+if (!prototype.factoryImpl) {
+prototype.factoryImpl = function () {
+};
+}
+return desugar(prototype).constructor;
+};
 }());
 Polymer.telemetry = {
 registrations: [],
@@ -85,7 +92,7 @@
 enumerable: true,
 configurable: true,
 get: function () {
-return (document._currentScript || document.currentScript).ownerDocument;
+return (document._currentScript || document.currentScript || {}).ownerDocument;
 }
 });Polymer.RenderStatus = {
 _ready: false,
@@ -164,7 +171,7 @@
 Polymer.Base = {
 __isPolymerInstance__: true,
 _addFeature: function (feature) {
-this.extend(this, feature);
+this.mixin(this, feature);
 },
 registerCallback: function () {
 if (settings.lazyRegister === 'max') {
@@ -173,7 +180,15 @@
 }
 } else {
 this._desugarBehaviors();
-this._doBehavior('beforeRegister');
+for (var i = 0, b; i < this.behaviors.length; i++) {
+b = this.behaviors[i];
+if (b.beforeRegister) {
+b.beforeRegister.call(this);
+}
+}
+if (this.beforeRegister) {
+this.beforeRegister();
+}
 }
 this._registerFeatures();
 if (!settings.lazyRegister) {
@@ -181,12 +196,33 @@
 }
 },
 createdCallback: function () {
+if (settings.disableUpgradeEnabled) {
+if (this.hasAttribute('disable-upgrade')) {
+this._propertySetter = disableUpgradePropertySetter;
+this._configValue = null;
+this.__data__ = {};
+return;
+} else {
+this.__hasInitialized = true;
+}
+}
+this.__initialize();
+},
+__initialize: function () {
 if (!this.__hasRegisterFinished) {
 this._ensureRegisterFinished(this.__proto__);
 }
 Polymer.telemetry.instanceCount++;
 this.root = this;
-this._doBehavior('created');
+for (var i = 0, b; i < this.behaviors.length; i++) {
+b = this.behaviors[i];
+if (b.created) {
+b.created.call(this);
+}
+}
+if (this.created) {
+this.created();
+}
 this._initFeatures();
 },
 ensureRegisterFinished: function () {
@@ -196,13 +232,26 @@
 if (proto.__hasRegisterFinished !== proto.is || !proto.is) {
 if (settings.lazyRegister === 'max') {
 proto._desugarBehaviors();
-proto._doBehaviorOnly('beforeRegister');
+for (var i = 0, b; i < proto.behaviors.length; i++) {
+b = proto.behaviors[i];
+if (b.beforeRegister) {
+b.beforeRegister.call(proto);
+}
+}
 }
 proto.__hasRegisterFinished = proto.is;
 if (proto._finishRegisterFeatures) {
 proto._finishRegisterFeatures();
 }
-proto._doBehavior('registered');
+for (var j = 0, pb; j < proto.behaviors.length; j++) {
+pb = proto.behaviors[j];
+if (pb.registered) {
+pb.registered.call(proto);
+}
+}
+if (proto.registered) {
+proto.registered();
+}
 if (settings.usePolyfillProto && proto !== this) {
 proto.extend(this, proto);
 }
@@ -212,23 +261,43 @@
 var self = this;
 Polymer.RenderStatus.whenReady(function () {
 self.isAttached = true;
-self._doBehavior('attached');
+for (var i = 0, b; i < self.behaviors.length; i++) {
+b = self.behaviors[i];
+if (b.attached) {
+b.attached.call(self);
+}
+}
+if (self.attached) {
+self.attached();
+}
 });
 },
 detachedCallback: function () {
 var self = this;
 Polymer.RenderStatus.whenReady(function () {
 self.isAttached = false;
-self._doBehavior('detached');
+for (var i = 0, b; i < self.behaviors.length; i++) {
+b = self.behaviors[i];
+if (b.detached) {
+b.detached.call(self);
+}
+}
+if (self.detached) {
+self.detached();
+}
 });
 },
 attributeChangedCallback: function (name, oldValue, newValue) {
 this._attributeChangedImpl(name);
-this._doBehavior('attributeChanged', [
-name,
-oldValue,
-newValue
-]);
+for (var i = 0, b; i < this.behaviors.length; i++) {
+b = this.behaviors[i];
+if (b.attributeChanged) {
+b.attributeChanged.call(this, name, oldValue, newValue);
+}
+}
+if (this.attributeChanged) {
+this.attributeChanged(name, oldValue, newValue);
+}
 },
 _attributeChangedImpl: function (name) {
 this._setAttributeToProperty(this, name);
@@ -299,6 +368,23 @@
 return object;
 };
 Polymer.Base = Polymer.Base.chainObject(Polymer.Base, HTMLElement.prototype);
+Polymer.BaseDescriptors = {};
+var disableUpgradePropertySetter;
+if (settings.disableUpgradeEnabled) {
+disableUpgradePropertySetter = function (property, value) {
+this.__data__[property] = value;
+};
+var origAttributeChangedCallback = Polymer.Base.attributeChangedCallback;
+Polymer.Base.attributeChangedCallback = function (name, oldValue, newValue) {
+if (!this.__hasInitialized && name === 'disable-upgrade') {
+this.__hasInitialized = true;
+this._propertySetter = Polymer.Bind._modelApi._propertySetter;
+this._configValue = Polymer.Base._configValue;
+this.__initialize();
+}
+origAttributeChangedCallback.call(this, name, oldValue, newValue);
+};
+}
 if (window.CustomElements) {
 Polymer.instanceof = CustomElements.instanceof;
 } else {
@@ -320,8 +406,7 @@
 return document.createElement('dom-module');
 };
 DomModule.prototype = Object.create(HTMLElement.prototype);
-Polymer.Base.extend(DomModule.prototype, {
-constructor: DomModule,
+Polymer.Base.mixin(DomModule.prototype, {
 createdCallback: function () {
 this.register();
 },
@@ -347,6 +432,11 @@
 }
 }
 });
+Object.defineProperty(DomModule.prototype, 'constructor', {
+value: DomModule,
+configurable: true,
+writable: true
+});
 var cePolyfill = window.CustomElements && !CustomElements.useNative;
 document.registerElement('dom-module', DomModule);
 function forceDomModulesUpgrade() {
@@ -411,11 +501,16 @@
 },
 _mixinBehavior: function (b) {
 var n$ = Object.getOwnPropertyNames(b);
+var useAssignment = b._noAccessors;
 for (var i = 0, n; i < n$.length && (n = n$[i]); i++) {
 if (!Polymer.Base._behaviorProperties[n] && !this.hasOwnProperty(n)) {
+if (useAssignment) {
+this[n] = b[n];
+} else {
 this.copyOwnProperty(n, b, this);
 }
 }
+}
 },
 _prepBehaviors: function () {
 this._prepFlattenedBehaviors(this.behaviors);
@@ -426,23 +521,6 @@
 }
 this._prepBehavior(this);
 },
-_doBehavior: function (name, args) {
-for (var i = 0; i < this.behaviors.length; i++) {
-this._invokeBehavior(this.behaviors[i], name, args);
-}
-this._invokeBehavior(this, name, args);
-},
-_doBehaviorOnly: function (name, args) {
-for (var i = 0; i < this.behaviors.length; i++) {
-this._invokeBehavior(this.behaviors[i], name, args);
-}
-},
-_invokeBehavior: function (b, name, args) {
-var fn = b[name];
-if (fn) {
-fn.apply(this, args || Polymer.nar);
-}
-},
 _marshalBehaviors: function () {
 for (var i = 0; i < this.behaviors.length; i++) {
 this._marshalBehavior(this.behaviors[i]);
@@ -461,7 +539,8 @@
 attached: true,
 detached: true,
 attributeChanged: true,
-ready: true
+ready: true,
+_noAccessors: true
 };Polymer.Base._addFeature({
 _getExtendedPrototype: function (tag) {
 return this._getExtendedNativePrototype(tag);
@@ -470,8 +549,14 @@
 _getExtendedNativePrototype: function (tag) {
 var p = this._nativePrototypes[tag];
 if (!p) {
-var np = this.getNativePrototype(tag);
-p = this.extend(Object.create(np), Polymer.Base);
+p = Object.create(this.getNativePrototype(tag));
+var p$ = Object.getOwnPropertyNames(Polymer.Base);
+for (var i = 0, n; i < p$.length && (n = p$[i]); i++) {
+if (!Polymer.BaseDescriptors[n]) {
+p[n] = Polymer.Base[n];
+}
+}
+Object.defineProperties(p, Polymer.BaseDescriptors);
 this._nativePrototypes[tag] = p;
 }
 return p;
@@ -507,7 +592,6 @@
 }
 });Polymer.nob = Object.create(null);
 Polymer.Base._addFeature({
-properties: {},
 getPropertyInfo: function (property) {
 var info = this._getPropertyInfo(property, this.properties);
 if (!info) {
@@ -564,7 +648,17 @@
 }
 }
 }
-});Polymer.CaseMap = {
+});
+(function () {
+var propertiesDesc = {
+configurable: true,
+writable: true,
+enumerable: true,
+value: {}
+};
+Polymer.BaseDescriptors.properties = propertiesDesc;
+Object.defineProperty(Polymer.Base, 'properties', propertiesDesc);
+}());Polymer.CaseMap = {
 _caseMap: {},
 _rx: {
 dashToCamel: /-[a-z]/g,
@@ -688,7 +782,7 @@
 return value != null ? value : undefined;
 }
 }
-});Polymer.version = "1.6.1";Polymer.Base._addFeature({
+});Polymer.version = "1.8.1";Polymer.Base._addFeature({
 _registerFeatures: function () {
 this._prepIs();
 this._prepBehaviors();
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js
index daebde9..143aa7a3 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini-extracted.js
@@ -73,7 +73,15 @@
 this._finishDistribute();
 },
 _readySelf: function () {
-this._doBehavior('ready');
+for (var i = 0, b; i < this.behaviors.length; i++) {
+b = this.behaviors[i];
+if (b.ready) {
+b.ready.call(this);
+}
+}
+if (this.ready) {
+this.ready();
+}
 this._readied = true;
 if (this._attachedPending) {
 this._attachedPending = false;
@@ -686,7 +694,7 @@
 }
 var nativeCloneNode = Element.prototype.cloneNode;
 var nativeImportNode = Document.prototype.importNode;
-Polymer.Base.extend(DomApi.prototype, {
+Polymer.Base.mixin(DomApi.prototype, {
 _lazyDistribute: function (host) {
 if (host.shadyRoot && host.shadyRoot._distributionClean) {
 host.shadyRoot._distributionClean = false;
@@ -1150,7 +1158,7 @@
 if (!Settings.useShadow) {
 return;
 }
-Polymer.Base.extend(DomApi.prototype, {
+Polymer.Base.mixin(DomApi.prototype, {
 querySelectorAll: function (selector) {
 return TreeApi.arrayCopy(this.node.querySelectorAll(selector));
 },
@@ -1260,7 +1268,7 @@
 'nextElementSibling',
 'previousElementSibling'
 ]);
-}());Polymer.Base.extend(Polymer.dom, {
+}());Polymer.Base.mixin(Polymer.dom, {
 _flushGuard: 0,
 _FLUSH_MAX: 100,
 _needsTakeRecords: !Polymer.Settings.useNativeCustomElements,
@@ -1561,7 +1569,7 @@
 if (Settings.useShadow) {
 var baseSetup = DomApi.EffectiveNodesObserver.prototype._setup;
 var baseCleanup = DomApi.EffectiveNodesObserver.prototype._cleanup;
-Polymer.Base.extend(DomApi.EffectiveNodesObserver.prototype, {
+Polymer.Base.mixin(DomApi.EffectiveNodesObserver.prototype, {
 _setup: function () {
 if (!this._observer) {
 var self = this;
@@ -1623,7 +1631,7 @@
 DomApi.EffectiveNodesObserver.call(this, domApi);
 };
 DomApi.DistributedNodesObserver.prototype = Object.create(DomApi.EffectiveNodesObserver.prototype);
-Polymer.Base.extend(DomApi.DistributedNodesObserver.prototype, {
+Polymer.Base.mixin(DomApi.DistributedNodesObserver.prototype, {
 _setup: function () {
 },
 _cleanup: function () {
@@ -1635,7 +1643,7 @@
 }
 });
 if (Settings.useShadow) {
-Polymer.Base.extend(DomApi.DistributedNodesObserver.prototype, {
+Polymer.Base.mixin(DomApi.DistributedNodesObserver.prototype, {
 _setup: function () {
 if (!this._observer) {
 var root = this.domApi.getOwnerRoot();
@@ -1713,10 +1721,6 @@
 }
 this.shadyRoot.host = this;
 },
-get domHost() {
-var root = Polymer.dom(this).getOwnerRoot();
-return root && root.host;
-},
 distributeContent: function (updateInsertionPoints) {
 if (this.shadyRoot) {
 this.shadyRoot._invalidInsertionPoints = this.shadyRoot._invalidInsertionPoints || updateInsertionPoints;
@@ -1903,6 +1907,15 @@
 _elementRemove: function () {
 }
 });
+var domHostDesc = {
+get: function () {
+var root = Polymer.dom(this).getOwnerRoot();
+return root && root.host;
+},
+configurable: true
+};
+Object.defineProperty(Polymer.Base, 'domHost', domHostDesc);
+Polymer.BaseDescriptors.domHost = domHostDesc;
 function distributeNodeInto(child, insertionPoint) {
 insertionPoint._distributedNodes.push(child);
 var points = child._destinationInsertionPoints;
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html
index 176bf18..d54c449 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer-mini.html
@@ -6,8 +6,4 @@
 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
 Code distributed by Google as part of the polymer project is also
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head><link rel="import" href="polymer-micro.html">
-
-
-
-</head><body><script src="polymer-mini-extracted.js"></script></body></html>
\ No newline at end of file
+--><html><head><link rel="import" href="polymer-micro.html"></head><body><script src="polymer-mini-extracted.js"></script></body></html>
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components-chromium/polymer/polymer.html b/third_party/polymer/v1_0/components-chromium/polymer/polymer.html
index cac2179..9b7a70e 100644
--- a/third_party/polymer/v1_0/components-chromium/polymer/polymer.html
+++ b/third_party/polymer/v1_0/components-chromium/polymer/polymer.html
@@ -14,8 +14,4 @@
 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
 Code distributed by Google as part of the polymer project is also
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
---><html><head><link rel="import" href="polymer-mini.html">
-
-
-
-</head><body><script src="polymer-extracted.js"></script></body></html>
\ No newline at end of file
+--><html><head><link rel="import" href="polymer-mini.html"></head><body><script src="polymer-extracted.js"></script></body></html>
\ No newline at end of file
diff --git a/third_party/polymer/v1_0/components_summary.txt b/third_party/polymer/v1_0/components_summary.txt
index 6523c2b..a4e7b0be 100644
--- a/third_party/polymer/v1_0/components_summary.txt
+++ b/third_party/polymer/v1_0/components_summary.txt
@@ -12,9 +12,9 @@
 
 Name: iron-a11y-keys
 Repository: https://github.com/PolymerElements/iron-a11y-keys.git
-Tree: v1.0.6
-Revision: aa9374f069b942dfabcaabb587cbb00b0dd28c63
-Tree link: https://github.com/PolymerElements/iron-a11y-keys/tree/v1.0.6
+Tree: v1.0.7
+Revision: 7830e675c3d0df6e7a7377d64fc3d6e6ae0e65a5
+Tree link: https://github.com/PolymerElements/iron-a11y-keys/tree/v1.0.7
 
 Name: iron-a11y-keys-behavior
 Repository: https://github.com/PolymerElements/iron-a11y-keys-behavior.git
@@ -348,7 +348,7 @@
 
 Name: polymer
 Repository: https://github.com/Polymer/polymer.git
-Tree: v1.6.1
-Revision: 1f197d9d7874b1e5808b2a5c26f34446a7d912fc
-Tree link: https://github.com/Polymer/polymer/tree/v1.6.1
+Tree: v1.8.1
+Revision: d89302fc3755b04ad4171f431e719a08b5b816f3
+Tree link: https://github.com/Polymer/polymer/tree/v1.8.1
 
diff --git a/third_party/polymer/v1_0/reproduce.sh b/third_party/polymer/v1_0/reproduce.sh
index 8051243..3781a057 100755
--- a/third_party/polymer/v1_0/reproduce.sh
+++ b/third_party/polymer/v1_0/reproduce.sh
@@ -80,6 +80,10 @@
 # a Polymer issue and/or pull request to minimize these patches.
 patch -p1 --forward -r - < chromium.patch
 
+# Undo any changes in paper-ripple, since Chromium's implementation is a fork of
+# the original paper-ripple.
+git checkout -- components-chromium/paper-ripple/*
+
 new=$(git status --porcelain components-chromium | grep '^??' | \
       cut -d' ' -f2 | egrep '\.(html|js|css)$' || true)
 
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 359d0e7..e18b6f4 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -19295,6 +19295,15 @@
   <summary>Updates grouped by Extension::HistogramType.</summary>
 </histogram>
 
+<histogram name="Extensions.WebRequestAction" enum="RequestAction">
+  <owner>karandeepb@chromium.org</owner>
+  <summary>
+    Counts the number of times an action is requested by extensions as part of
+    the Web Request API. For a given web request stage, multiple actions may be
+    logged.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.WebRequestEventFoundFrame" units="boolean">
   <owner>rdevlin.cronin@chromium.org</owner>
   <summary>
@@ -41889,6 +41898,56 @@
   </summary>
 </histogram>
 
+<histogram name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff"
+    units="ms">
+  <owner>tbansal@chromium.org</owner>
+  <owner>bengr@chromium.org</owner>
+  <summary>
+    Records the difference between the estimated HTTP RTT and the observed HTTP
+    RTT. HTTP RTT estimated by the network quality estimator at the time of
+    navigation start is compared with the HTTP RTT observed during the specified
+    time interval following the start of the navigation. Both the estimated and
+    the observed RTT are computed using average algorithm that assigns equal
+    weight to all observations.
+  </summary>
+</histogram>
+
+<histogram name="NQE.UnweightedAverage.MainFrame.RTT" units="ms">
+  <owner>bengr@chromium.org</owner>
+  <owner>tbansal@chromium.org</owner>
+  <summary>
+    Rough estimate of the computed round trip time at the URLRequest layer
+    computed using average algorithm that assigns equal weight to all
+    observations.
+
+    This metric is recorded on main-frame requests.
+  </summary>
+</histogram>
+
+<histogram name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff"
+    units="ms">
+  <owner>tbansal@chromium.org</owner>
+  <owner>bengr@chromium.org</owner>
+  <summary>
+    Records the difference between the estimated HTTP RTT and the observed HTTP
+    RTT. HTTP RTT estimated by the network quality estimator at the time of
+    navigation start is compared with the HTTP RTT observed during the specified
+    time interval following the start of the navigation. Both the estimated and
+    the observed RTT are computed using weighted average algorithm.
+  </summary>
+</histogram>
+
+<histogram name="NQE.WeightedAverage.MainFrame.RTT" units="ms">
+  <owner>bengr@chromium.org</owner>
+  <owner>tbansal@chromium.org</owner>
+  <summary>
+    Rough estimate of the computed round trip time at the URLRequest layer
+    computed using weighted average algorithm.
+
+    This metric is recorded on main-frame requests.
+  </summary>
+</histogram>
+
 <histogram name="ntp.searchurls.total">
   <obsolete>
     Deprecated 04/2016 as doesn't have data nor owner.
@@ -56212,6 +56271,15 @@
   </summary>
 </histogram>
 
+<histogram name="ResourceScheduler.NumSkippedScans.ScheduleStart"
+    units="requests">
+  <owner>csharrison@chromium.org</owner>
+  <summary>
+    The number of LoadAnyStartablePendingRequests scans that were skipped due to
+    smarter task scheduling around reprioritization.
+  </summary>
+</histogram>
+
 <histogram name="ResourceScheduler.RequestTimeDeferred.Active">
   <obsolete>
     Deprecated 1/2016
@@ -105671,6 +105739,14 @@
   </int>
 </enum>
 
+<enum name="RequestAction" type="int">
+  <int value="0" label="CANCEL"/>
+  <int value="1" label="REDIRECT"/>
+  <int value="2" label="MODIFY_REQUEST_HEADERS"/>
+  <int value="3" label="MODIFY_RESPONSE_HEADERS"/>
+  <int value="4" label="SET_AUTH_CREDENTIALS"/>
+</enum>
+
 <enum name="RequestedImageMimeType" type="int">
   <int value="0" label="Png"/>
   <int value="1" label="Jpeg"/>
@@ -117393,6 +117469,10 @@
   <affected-histogram name="NQE.Accuracy.TransportRTT.EstimatedObservedDiff"/>
   <affected-histogram
       name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff"/>
+  <affected-histogram
+      name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff"/>
+  <affected-histogram
+      name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="NQE.Accuracy.Metric.AccuracyRecordingIntervals"
@@ -117431,6 +117511,14 @@
       name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Negative"/>
   <affected-histogram
       name="NQE.ExternalEstimateProvider.RTT.Accuracy.EstimatedObservedDiff.Positive"/>
+  <affected-histogram
+      name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Negative"/>
+  <affected-histogram
+      name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Positive"/>
+  <affected-histogram
+      name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Negative"/>
+  <affected-histogram
+      name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Positive"/>
 </histogram_suffixes>
 
 <histogram_suffixes
@@ -117607,6 +117695,14 @@
       Deprecated 01/2017.
     </obsolete>
   </affected-histogram>
+  <affected-histogram
+      name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Negative.15"/>
+  <affected-histogram
+      name="NQE.UnweightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Positive.15"/>
+  <affected-histogram
+      name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Negative.15"/>
+  <affected-histogram
+      name="NQE.WeightedAverage.Accuracy.HttpRTT.EstimatedObservedDiff.Positive.15"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="NQE.DifferentPercentiles" separator=".">
diff --git a/ui/arc/notification/arc_custom_notification_item.h b/ui/arc/notification/arc_custom_notification_item.h
index 404a0cd..eecfe3f 100644
--- a/ui/arc/notification/arc_custom_notification_item.h
+++ b/ui/arc/notification/arc_custom_notification_item.h
@@ -36,6 +36,7 @@
       mojom::ArcNotificationDataPtr data) override;
 
   void CloseFromCloseButton();
+  void OpenSettingsFromSettingsButton();
 
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
diff --git a/ui/arc/notification/arc_custom_notification_view.cc b/ui/arc/notification/arc_custom_notification_view.cc
index a761c46d..1846796 100644
--- a/ui/arc/notification/arc_custom_notification_view.cc
+++ b/ui/arc/notification/arc_custom_notification_view.cc
@@ -26,6 +26,7 @@
 #include "ui/views/border.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/focus/focus_manager.h"
+#include "ui/views/layout/box_layout.h"
 #include "ui/views/painter.h"
 #include "ui/views/widget/root_view.h"
 #include "ui/views/widget/widget.h"
@@ -43,8 +44,8 @@
   void OnEvent(ui::Event* event) override {
     // Do not forward event targeted to the floating close button so that
     // keyboard press and tap are handled properly.
-    if (owner_->floating_close_button_widget_ && event->target() &&
-        owner_->floating_close_button_widget_->GetNativeWindow() ==
+    if (owner_->floating_control_buttons_widget_ && event->target() &&
+        owner_->floating_control_buttons_widget_->GetNativeWindow() ==
             event->target()) {
       return;
     }
@@ -157,15 +158,15 @@
       : owner_(owner) {}
 
   bool IsCloseButtonFocused() const override {
-    if (owner_->floating_close_button_ == nullptr)
+    if (owner_->close_button_ == nullptr)
       return false;
-    return owner_->floating_close_button_->HasFocus();
+    return owner_->close_button_->HasFocus();
   }
 
   void RequestFocusOnCloseButton() override {
-    if (owner_->floating_close_button_)
-      owner_->floating_close_button_->RequestFocus();
-    owner_->UpdateCloseButtonVisiblity();
+    if (owner_->close_button_)
+      owner_->close_button_->RequestFocus();
+    owner_->UpdateControlButtonsVisiblity();
   }
 
   bool IsPinned() const override {
@@ -178,9 +179,9 @@
   DISALLOW_COPY_AND_ASSIGN(ContentViewDelegate);
 };
 
-class ArcCustomNotificationView::CloseButton : public views::ImageButton {
+class ArcCustomNotificationView::ControlButton : public views::ImageButton {
  public:
-  explicit CloseButton(ArcCustomNotificationView* owner)
+  explicit ControlButton(ArcCustomNotificationView* owner)
       : views::ImageButton(owner), owner_(owner) {
     set_background(
         views::Background::CreateSolidBackground(SK_ColorTRANSPARENT));
@@ -195,22 +196,17 @@
         message_center::kControlButtonPaddingFromBorder,
         message_center::kControlButtonPaddingFromBorder));
 
-    SetImage(views::CustomButton::STATE_NORMAL, message_center::GetCloseIcon());
     set_animate_on_state_change(false);
-    SetAccessibleName(l10n_util::GetStringUTF16(
-        IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME));
-    SetTooltipText(l10n_util::GetStringUTF16(
-        IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_TOOLTIP));
   }
 
   void OnFocus() override {
     views::ImageButton::OnFocus();
-    owner_->UpdateCloseButtonVisiblity();
+    owner_->UpdateControlButtonsVisiblity();
   }
 
   void OnBlur() override {
     views::ImageButton::OnBlur();
-    owner_->UpdateCloseButtonVisiblity();
+    owner_->UpdateControlButtonsVisiblity();
   }
 
  private:
@@ -254,28 +250,50 @@
   return base::MakeUnique<ArcCustomNotificationView::ContentViewDelegate>(this);
 }
 
-void ArcCustomNotificationView::CreateFloatingCloseButton() {
+void ArcCustomNotificationView::CreateFloatingControlButtons() {
   // Floating close button is a transient child of |surface_| and also part
   // of the hosting widget's focus chain. It could only be created when both
   // are present.
   if (!surface_ || !GetWidget())
     return;
 
-  floating_close_button_ = new CloseButton(this);
+  // Creates the control_buttons_view_, which collects all control buttons into
+  // a horizontal box.
+  control_buttons_view_ = new views::View();
+  control_buttons_view_->SetLayoutManager(
+      new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
+
+  settings_button_ = new ControlButton(this);
+  settings_button_->SetImage(views::CustomButton::STATE_NORMAL,
+                             message_center::GetSettingsIcon());
+  settings_button_->SetAccessibleName(l10n_util::GetStringUTF16(
+      IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME));
+  settings_button_->SetTooltipText(l10n_util::GetStringUTF16(
+      IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME));
+  control_buttons_view_->AddChildView(settings_button_);
+
+  close_button_ = new ControlButton(this);
+  close_button_->SetImage(views::CustomButton::STATE_NORMAL,
+                          message_center::GetCloseIcon());
+  close_button_->SetAccessibleName(l10n_util::GetStringUTF16(
+      IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME));
+  close_button_->SetTooltipText(l10n_util::GetStringUTF16(
+      IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_TOOLTIP));
+  control_buttons_view_->AddChildView(close_button_);
 
   views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL);
   params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
   params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
   params.parent = surface_->window();
 
-  floating_close_button_widget_.reset(new views::Widget);
-  floating_close_button_widget_->Init(params);
-  floating_close_button_widget_->SetContentsView(floating_close_button_);
+  floating_control_buttons_widget_.reset(new views::Widget);
+  floating_control_buttons_widget_->Init(params);
+  floating_control_buttons_widget_->SetContentsView(control_buttons_view_);
 
   // Put the close button into the focus chain.
-  floating_close_button_widget_->SetFocusTraversableParent(
+  floating_control_buttons_widget_->SetFocusTraversableParent(
       GetWidget()->GetFocusTraversable());
-  floating_close_button_widget_->SetFocusTraversableParentView(this);
+  floating_control_buttons_widget_->SetFocusTraversableParentView(this);
 
   Layout();
 }
@@ -284,8 +302,8 @@
   if (surface_ == surface)
     return;
 
-  // Reset |floating_close_button_widget_| when |surface_| is changed.
-  floating_close_button_widget_.reset();
+  // Reset |floating_control_buttons_widget_| when |surface_| is changed.
+  floating_control_buttons_widget_.reset();
 
   if (surface_ && surface_->window()) {
     surface_->window()->RemoveObserver(this);
@@ -320,30 +338,30 @@
   SetPreferredSize(preferred_size);
 }
 
-void ArcCustomNotificationView::UpdateCloseButtonVisiblity() {
-  if (!surface_ || !floating_close_button_widget_)
+void ArcCustomNotificationView::UpdateControlButtonsVisiblity() {
+  if (!surface_ || !floating_control_buttons_widget_)
     return;
 
   const bool target_visiblity =
       surface_->window()->GetBoundsInScreen().Contains(
           display::Screen::GetScreen()->GetCursorScreenPoint()) ||
-      floating_close_button_->HasFocus();
-  if (target_visiblity == floating_close_button_widget_->IsVisible())
+      close_button_->HasFocus() || settings_button_->HasFocus();
+  if (target_visiblity == floating_control_buttons_widget_->IsVisible())
     return;
 
   if (target_visiblity)
-    floating_close_button_widget_->Show();
+    floating_control_buttons_widget_->Show();
   else
-    floating_close_button_widget_->Hide();
+    floating_control_buttons_widget_->Hide();
 }
 
 void ArcCustomNotificationView::UpdatePinnedState() {
   DCHECK(item_);
 
-  if (item_->pinned() && floating_close_button_widget_) {
-    floating_close_button_widget_.reset();
-  } else if (!item_->pinned() && !floating_close_button_widget_) {
-    CreateFloatingCloseButton();
+  if (item_->pinned() && floating_control_buttons_widget_) {
+    floating_control_buttons_widget_.reset();
+  } else if (!item_->pinned() && !floating_control_buttons_widget_) {
+    CreateFloatingControlButtons();
   }
 }
 
@@ -429,16 +447,18 @@
   // be positioned without the need to consider the transform.
   surface_->window()->children()[0]->SetTransform(transform);
 
-  if (!floating_close_button_widget_)
+  if (!floating_control_buttons_widget_)
     return;
 
-  gfx::Rect close_button_bounds(floating_close_button_->GetPreferredSize());
-  close_button_bounds.set_x(contents_bounds.right() -
-                            close_button_bounds.width());
-  close_button_bounds.set_y(contents_bounds.y());
-  floating_close_button_widget_->SetBounds(close_button_bounds);
+  gfx::Rect control_buttons_bounds(contents_bounds);
+  const int buttons_width = close_button_->GetPreferredSize().width() +
+                            settings_button_->GetPreferredSize().width();
+  control_buttons_bounds.set_x(control_buttons_bounds.right() - buttons_width);
+  control_buttons_bounds.set_height(close_button_->GetPreferredSize().height());
+  control_buttons_bounds.set_width(buttons_width);
+  floating_control_buttons_widget_->SetBounds(control_buttons_bounds);
 
-  UpdateCloseButtonVisiblity();
+  UpdateControlButtonsVisiblity();
 
   ash::wm::SnapWindowToPixelBoundary(surface_->window());
 }
@@ -471,11 +491,11 @@
 }
 
 void ArcCustomNotificationView::OnMouseEntered(const ui::MouseEvent&) {
-  UpdateCloseButtonVisiblity();
+  UpdateControlButtonsVisiblity();
 }
 
 void ArcCustomNotificationView::OnMouseExited(const ui::MouseEvent&) {
-  UpdateCloseButtonVisiblity();
+  UpdateControlButtonsVisiblity();
 }
 
 void ArcCustomNotificationView::OnFocus() {
@@ -491,17 +511,20 @@
 }
 
 views::FocusTraversable* ArcCustomNotificationView::GetFocusTraversable() {
-  if (floating_close_button_widget_)
+  if (floating_control_buttons_widget_)
     return static_cast<views::internal::RootView*>(
-        floating_close_button_widget_->GetRootView());
+        floating_control_buttons_widget_->GetRootView());
   return nullptr;
 }
 
 void ArcCustomNotificationView::ButtonPressed(views::Button* sender,
                                               const ui::Event& event) {
-  if (item_ && !item_->pinned() && sender == floating_close_button_) {
+  if (item_ && !item_->pinned() && sender == close_button_) {
     item_->CloseFromCloseButton();
   }
+  if (item_ && settings_button_ && sender == settings_button_) {
+    item_->OpenSettings();
+  }
 }
 
 void ArcCustomNotificationView::OnWindowBoundsChanged(
diff --git a/ui/arc/notification/arc_custom_notification_view.h b/ui/arc/notification/arc_custom_notification_view.h
index 7eae001..41c5347a 100644
--- a/ui/arc/notification/arc_custom_notification_view.h
+++ b/ui/arc/notification/arc_custom_notification_view.h
@@ -43,14 +43,15 @@
 
  private:
   class ContentViewDelegate;
-  class CloseButton;
+  class ControlButton;
   class EventForwarder;
+  class SettingsButton;
   class SlideHelper;
 
-  void CreateFloatingCloseButton();
+  void CreateFloatingControlButtons();
   void SetSurface(exo::NotificationSurface* surface);
   void UpdatePreferredSize();
-  void UpdateCloseButtonVisiblity();
+  void UpdateControlButtonsVisiblity();
   void UpdatePinnedState();
   void UpdateSnapshot();
   void AttachSurface();
@@ -101,13 +102,15 @@
   // when a slide is in progress and restore the surface when it finishes.
   std::unique_ptr<SlideHelper> slide_helper_;
 
-  // A close button on top of NotificationSurface. Needed because the
+  // A control buttons on top of NotificationSurface. Needed because the
   // aura::Window of NotificationSurface is added after hosting widget's
-  // RootView thus standard notification close button is always below
+  // RootView thus standard notification control buttons are always below
   // it.
-  std::unique_ptr<views::Widget> floating_close_button_widget_;
+  std::unique_ptr<views::Widget> floating_control_buttons_widget_;
 
-  views::ImageButton* floating_close_button_ = nullptr;
+  views::View* control_buttons_view_ = nullptr;
+  views::ImageButton* close_button_ = nullptr;
+  views::ImageButton* settings_button_ = nullptr;
 
   // Protects from call loops between Layout and OnWindowBoundsChanged.
   bool in_layout_ = false;
diff --git a/ui/gfx/buffer_types.h b/ui/gfx/buffer_types.h
index 7e1a157a..575ae7f 100644
--- a/ui/gfx/buffer_types.h
+++ b/ui/gfx/buffer_types.h
@@ -40,6 +40,7 @@
 enum class BufferUsage {
   GPU_READ,
   SCANOUT,
+  SCANOUT_CPU_READ_WRITE,
   GPU_READ_CPU_READ_WRITE,
   // TODO(reveman): Merge this with GPU_READ_CPU_READ_WRITE when SurfaceTexture
   // backed buffers are single buffered and support it.
diff --git a/ui/gfx/mojo/buffer_types.mojom b/ui/gfx/mojo/buffer_types.mojom
index 0a05c651..b7fb7e0 100644
--- a/ui/gfx/mojo/buffer_types.mojom
+++ b/ui/gfx/mojo/buffer_types.mojom
@@ -30,6 +30,7 @@
 enum BufferUsage {
   GPU_READ,
   SCANOUT,
+  SCANOUT_CPU_READ_WRITE,
   GPU_READ_CPU_READ_WRITE,
   GPU_READ_CPU_READ_WRITE_PERSISTENT,
 
diff --git a/ui/gfx/mojo/buffer_types_struct_traits.h b/ui/gfx/mojo/buffer_types_struct_traits.h
index 3716a61f4..17b73a7 100644
--- a/ui/gfx/mojo/buffer_types_struct_traits.h
+++ b/ui/gfx/mojo/buffer_types_struct_traits.h
@@ -115,6 +115,8 @@
         return gfx::mojom::BufferUsage::GPU_READ;
       case gfx::BufferUsage::SCANOUT:
         return gfx::mojom::BufferUsage::SCANOUT;
+      case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
+        return gfx::mojom::BufferUsage::SCANOUT_CPU_READ_WRITE;
       case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
         return gfx::mojom::BufferUsage::GPU_READ_CPU_READ_WRITE;
       case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
@@ -132,6 +134,9 @@
       case gfx::mojom::BufferUsage::SCANOUT:
         *out = gfx::BufferUsage::SCANOUT;
         return true;
+      case gfx::mojom::BufferUsage::SCANOUT_CPU_READ_WRITE:
+        *out = gfx::BufferUsage::SCANOUT_CPU_READ_WRITE;
+        return true;
       case gfx::mojom::BufferUsage::GPU_READ_CPU_READ_WRITE:
         *out = gfx::BufferUsage::GPU_READ_CPU_READ_WRITE;
         return true;
diff --git a/ui/message_center/BUILD.gn b/ui/message_center/BUILD.gn
index 93641278..08aff8c 100644
--- a/ui/message_center/BUILD.gn
+++ b/ui/message_center/BUILD.gn
@@ -11,6 +11,8 @@
   icon_directory = "vector_icons"
 
   icons = [
+    "notification_settings_button.1x.icon",
+    "notification_settings_button.icon",
     "notification_close_button.1x.icon",
     "notification_close_button.icon",
   ]
diff --git a/ui/message_center/message_center_style.cc b/ui/message_center/message_center_style.cc
index 9183d69..020073a5 100644
--- a/ui/message_center/message_center_style.cc
+++ b/ui/message_center/message_center_style.cc
@@ -45,4 +45,9 @@
                                gfx::kChromeIconGrey);
 }
 
+gfx::ImageSkia GetSettingsIcon() {
+  return gfx::CreateVectorIcon(kNotificationSettingsButtonIcon,
+                               gfx::kChromeIconGrey);
+}
+
 }  // namespace message_center
diff --git a/ui/message_center/message_center_style.h b/ui/message_center/message_center_style.h
index d3f52e5b..9484f8c 100644
--- a/ui/message_center/message_center_style.h
+++ b/ui/message_center/message_center_style.h
@@ -143,6 +143,7 @@
 
 // Icons.
 MESSAGE_CENTER_EXPORT gfx::ImageSkia GetCloseIcon();
+MESSAGE_CENTER_EXPORT gfx::ImageSkia GetSettingsIcon();
 
 // Around notifications ////////////////////////////////////////////////////////
 
diff --git a/ui/message_center/vector_icons/notification_settings_button.1x.icon b/ui/message_center/vector_icons/notification_settings_button.1x.icon
new file mode 100644
index 0000000..d999691
--- /dev/null
+++ b/ui/message_center/vector_icons/notification_settings_button.1x.icon
@@ -0,0 +1,54 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 12,
+MOVE_TO, 9.82f, 6.49f,
+CUBIC_TO, 9.84f, 6.33f, 9.85f, 6.17f, 9.85f, 6,
+CUBIC_TO, 9.85f, 5.84f, 9.84f, 5.67f, 9.82f, 5.51f,
+LINE_TO, 10.9f, 4.68f,
+CUBIC_TO, 11, 4.61f, 11.03f, 4.47f, 10.97f, 4.37f,
+LINE_TO, 9.94f, 2.63f,
+CUBIC_TO, 9.87f, 2.53f, 9.74f, 2.48f, 9.62f, 2.53f,
+LINE_TO, 8.34f, 3.03f,
+CUBIC_TO, 8.08f, 2.83f, 7.79f, 2.66f, 7.48f, 2.54f,
+LINE_TO, 7.28f, 1.21f,
+CUBIC_TO, 7.26f, 1.09f, 7.15f, 1, 7.03f, 1,
+LINE_TO, 4.97f, 1,
+CUBIC_TO, 4.84f, 1, 4.74f, 1.09f, 4.72f, 1.21f,
+LINE_TO, 4.52f, 2.54f,
+CUBIC_TO, 4.21f, 2.66f, 3.92f, 2.83f, 3.66f, 3.03f,
+LINE_TO, 2.38f, 2.53f,
+CUBIC_TO, 2.26f, 2.48f, 2.13f, 2.53f, 2.06f, 2.63f,
+LINE_TO, 1.03f, 4.37f,
+CUBIC_TO, 0.97f, 4.47f, 1, 4.61f, 1.1f, 4.68f,
+LINE_TO, 2.18f, 5.51f,
+CUBIC_TO, 2.16f, 5.67f, 2.14f, 5.84f, 2.14f, 6,
+CUBIC_TO, 2.14f, 6.17f, 2.16f, 6.33f, 2.18f, 6.49f,
+LINE_TO, 1.1f, 7.32f,
+CUBIC_TO, 1, 7.39f, 0.97f, 7.53f, 1.03f, 7.64f,
+LINE_TO, 2.06f, 9.37f,
+CUBIC_TO, 2.13f, 9.48f, 2.26f, 9.52f, 2.38f, 9.48f,
+LINE_TO, 3.66f, 8.97f,
+CUBIC_TO, 3.92f, 9.17f, 4.21f, 9.34f, 4.52f, 9.47f,
+LINE_TO, 4.72f, 10.79f,
+CUBIC_TO, 4.74f, 10.91f, 4.84f, 11, 4.97f, 11,
+LINE_TO, 7.03f, 11,
+CUBIC_TO, 7.15f, 11, 7.26f, 10.91f, 7.28f, 10.79f,
+LINE_TO, 7.47f, 9.47f,
+CUBIC_TO, 7.79f, 9.34f, 8.08f, 9.17f, 8.34f, 8.97f,
+LINE_TO, 9.62f, 9.48f,
+CUBIC_TO, 9.74f, 9.52f, 9.87f, 9.48f, 9.94f, 9.37f,
+LINE_TO, 10.96f, 7.64f,
+CUBIC_TO, 11.03f, 7.53f, 11, 7.39f, 10.9f, 7.32f,
+LINE_TO, 9.82f, 6.49f,
+LINE_TO, 9.82f, 6.49f,
+CLOSE,
+MOVE_TO, 6, 7.5f,
+CUBIC_TO, 5.17f, 7.5f, 4.5f, 6.83f, 4.5f, 6,
+CUBIC_TO, 4.5f, 5.17f, 5.17f, 4.5f, 6, 4.5f,
+CUBIC_TO, 6.83f, 4.5f, 7.5f, 5.17f, 7.5f, 6,
+CUBIC_TO, 7.5f, 6.83f, 6.83f, 7.5f, 6, 7.5f,
+LINE_TO, 6, 7.5f,
+CLOSE,
+END
diff --git a/ui/message_center/vector_icons/notification_settings_button.icon b/ui/message_center/vector_icons/notification_settings_button.icon
new file mode 100644
index 0000000..ae7e26a
--- /dev/null
+++ b/ui/message_center/vector_icons/notification_settings_button.icon
@@ -0,0 +1,54 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 24,
+MOVE_TO, 19.63f, 12.98f,
+CUBIC_TO, 19.68f, 12.66f, 19.71f, 12.33f, 19.71f, 12,
+CUBIC_TO, 19.71f, 11.67f, 19.68f, 11.35f, 19.63f, 11.03f,
+LINE_TO, 21.81f, 9.37f,
+CUBIC_TO, 22, 9.22f, 22.06f, 8.95f, 21.93f, 8.73f,
+LINE_TO, 19.88f, 5.27f,
+CUBIC_TO, 19.75f, 5.05f, 19.48f, 4.96f, 19.25f, 5.05f,
+LINE_TO, 16.69f, 6.06f,
+CUBIC_TO, 16.16f, 5.66f, 15.58f, 5.33f, 14.95f, 5.07f,
+LINE_TO, 14.57f, 2.42f,
+CUBIC_TO, 14.52f, 2.19f, 14.31f, 2, 14.05f, 2,
+LINE_TO, 9.94f, 2,
+CUBIC_TO, 9.68f, 2, 9.47f, 2.19f, 9.43f, 2.42f,
+LINE_TO, 9.05f, 5.07f,
+CUBIC_TO, 8.42f, 5.33f, 7.84f, 5.66f, 7.31f, 6.06f,
+LINE_TO, 4.75f, 5.05f,
+CUBIC_TO, 4.52f, 4.97f, 4.25f, 5.05f, 4.12f, 5.27f,
+LINE_TO, 2.07f, 8.73f,
+CUBIC_TO, 1.94f, 8.95f, 2, 9.22f, 2.19f, 9.37f,
+LINE_TO, 4.36f, 11.03f,
+CUBIC_TO, 4.32f, 11.35f, 4.29f, 11.67f, 4.29f, 12,
+CUBIC_TO, 4.29f, 12.33f, 4.32f, 12.66f, 4.36f, 12.98f,
+LINE_TO, 2.19f, 14.63f,
+CUBIC_TO, 2, 14.78f, 1.94f, 15.05f, 2.07f, 15.27f,
+LINE_TO, 4.12f, 18.74f,
+CUBIC_TO, 4.25f, 18.95f, 4.52f, 19.04f, 4.75f, 18.95f,
+LINE_TO, 7.31f, 17.95f,
+CUBIC_TO, 7.84f, 18.34f, 8.42f, 18.68f, 9.05f, 18.93f,
+LINE_TO, 9.43f, 21.58f,
+CUBIC_TO, 9.47f, 21.82f, 9.68f, 22, 9.94f, 22,
+LINE_TO, 14.05f, 22,
+CUBIC_TO, 14.31f, 22, 14.52f, 21.82f, 14.56f, 21.58f,
+LINE_TO, 14.95f, 18.93f,
+CUBIC_TO, 15.57f, 18.68f, 16.15f, 18.35f, 16.68f, 17.95f,
+LINE_TO, 19.24f, 18.95f,
+CUBIC_TO, 19.47f, 19.04f, 19.74f, 18.95f, 19.87f, 18.74f,
+LINE_TO, 21.93f, 15.27f,
+CUBIC_TO, 22.05f, 15.06f, 22, 14.79f, 21.8f, 14.63f,
+LINE_TO, 19.63f, 12.98f,
+LINE_TO, 19.63f, 12.98f,
+CLOSE,
+MOVE_TO, 12, 15,
+CUBIC_TO, 10.34f, 15, 9, 13.66f, 9, 12,
+CUBIC_TO, 9, 10.34f, 10.34f, 9, 12, 9,
+CUBIC_TO, 13.66f, 9, 15, 10.34f, 15, 12,
+CUBIC_TO, 15, 13.66f, 13.66f, 15, 12, 15,
+LINE_TO, 12, 15,
+CLOSE,
+END
diff --git a/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc b/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc
index 6199e36f..3fd704d 100644
--- a/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc
+++ b/ui/ozone/platform/drm/client_native_pixmap_factory_gbm.cc
@@ -57,6 +57,11 @@
       case gfx::BufferUsage::SCANOUT:
         return format == gfx::BufferFormat::BGRX_8888 ||
                format == gfx::BufferFormat::RGBX_8888;
+      case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
+        return format == gfx::BufferFormat::BGRX_8888 ||
+               format == gfx::BufferFormat::BGRA_8888 ||
+               format == gfx::BufferFormat::RGBX_8888 ||
+               format == gfx::BufferFormat::RGBA_8888;
       case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
       case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT: {
 #if defined(OS_CHROMEOS)
@@ -82,6 +87,7 @@
       gfx::BufferUsage usage) override {
     DCHECK(!handle.fds.empty());
     switch (usage) {
+      case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
       case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
       case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
 #if defined(OS_CHROMEOS)
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.cc b/ui/ozone/platform/drm/gpu/drm_thread.cc
index 479e1a2d..8faec76 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread.cc
+++ b/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -117,6 +117,9 @@
     case gfx::BufferUsage::SCANOUT:
       flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING;
       break;
+    case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE:
+      flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_LINEAR;
+      break;
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE:
     case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT:
       flags = GBM_BO_USE_LINEAR;
diff --git a/ui/views/examples/examples_window.h b/ui/views/examples/examples_window.h
index 431b95e..804252fc 100644
--- a/ui/views/examples/examples_window.h
+++ b/ui/views/examples/examples_window.h
@@ -9,13 +9,12 @@
 #include <vector>
 
 #include "ui/gfx/native_widget_types.h"
+#include "ui/views/examples/example_base.h"
 #include "ui/views/examples/views_examples_export.h"
 
 namespace views {
 namespace examples {
 
-class ExampleBase;
-
 enum Operation {
   DO_NOTHING_ON_CLOSE = 0,
   QUIT_ON_CLOSE,
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
index e1b6710..4753be75 100644
--- a/ui/views/view_unittest.cc
+++ b/ui/views/view_unittest.cc
@@ -4833,14 +4833,14 @@
   std::unique_ptr<View> view = NewView();
   view->SetVisible(false);
   EXPECT_EQ(view.get(), view_visibility_changed());
-  EXPECT_EQ(false, view->visible());
+  EXPECT_FALSE(view->visible());
 }
 
 TEST_F(ViewObserverTest, ViewEnabledChanged) {
   std::unique_ptr<View> view = NewView();
   view->SetEnabled(false);
   EXPECT_EQ(view.get(), view_enabled_changed());
-  EXPECT_EQ(false, view->enabled());
+  EXPECT_FALSE(view->enabled());
 }
 
 TEST_F(ViewObserverTest, ViewBoundsChanged) {