diff --git a/DEPS b/DEPS
index 5977187..d4af38e1 100644
--- a/DEPS
+++ b/DEPS
@@ -105,11 +105,11 @@
   # 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': '032f2756df640c217690be4cd6ad3ec84093700d',
+  'skia_revision': 'ba651682ae856b40f5b79187025d13faab844183',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '949f77f4a144d0167cf046d76f8da0ca7d318f49',
+  'v8_revision': '2cefd9836f16a76645d9cc0500f013d0cc444353',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -117,7 +117,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '5476e805a321d786f8b6a003ab95b1bee0c30964',
+  'angle_revision': '78df3362ac219aab600a15b29290f39d36337bc4',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -129,7 +129,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': '39cf6a765ae349242289ec3287eaf4d6c5fd57f8',
+  'pdfium_revision': 'be4e055bce62c9af26461f435704b9aa086f6fc4',
   # 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.
@@ -165,7 +165,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': 'de52d9ad295ecc6401de6d7cc3b468a0e8292308',
+  'catapult_revision': '4fc4281d2152a36762a0bf47ba76bf8d4a6ee234',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -213,7 +213,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'spv_tools_revision': '497958d899c3f5fb4a4bda1a942c6fd7c0132ba6',
+  'spv_tools_revision': '03cbf33a695ec84d41a68333920864876fca18d9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -595,7 +595,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '39be1c969580eea5b7d66fc258174da505cb11ce',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'f75ce5a16f8960d270ea784418191c698460d1bf',
       'condition': 'checkout_linux',
   },
 
@@ -620,7 +620,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '2fb6310237302dd249452470fcddeaaf2eb3941d',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '71e3be7a50c21faeee91ed99a8d5addfb7594e7c',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1106,7 +1106,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6d2f3f4cb8bac1f7c4a945c73d07a33df74f22f9',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'a1134509c91d8e38635f8800347d50ddeb22def6',
+    Var('webrtc_git') + '/src.git' + '@' + 'ef8a3eb5221c491807457e6e1e55beeb6a94140d',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1137,7 +1137,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@263549ba0d66a016ca4fe4d8a8eabc1e799b8e02',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@37377c3e485a3167b07937568060815767bad55e',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_autofill_client.cc b/android_webview/browser/aw_autofill_client.cc
index 4c9dbc2..9c4d06d 100644
--- a/android_webview/browser/aw_autofill_client.cc
+++ b/android_webview/browser/aw_autofill_client.cc
@@ -76,6 +76,10 @@
   return nullptr;
 }
 
+autofill::StrikeDatabase* AwAutofillClient::GetStrikeDatabase() {
+  return nullptr;
+}
+
 ukm::UkmRecorder* AwAutofillClient::GetUkmRecorder() {
   return nullptr;
 }
diff --git a/android_webview/browser/aw_autofill_client.h b/android_webview/browser/aw_autofill_client.h
index 311542f..5d7fcb0 100644
--- a/android_webview/browser/aw_autofill_client.h
+++ b/android_webview/browser/aw_autofill_client.h
@@ -23,6 +23,7 @@
 class FormStructure;
 class MigratableCreditCard;
 class PersonalDataManager;
+class StrikeDatabase;
 }
 
 namespace content {
@@ -63,6 +64,7 @@
   PrefService* GetPrefs() override;
   syncer::SyncService* GetSyncService() override;
   identity::IdentityManager* GetIdentityManager() override;
+  autofill::StrikeDatabase* GetStrikeDatabase() override;
   ukm::UkmRecorder* GetUkmRecorder() override;
   ukm::SourceId GetUkmSourceId() override;
   autofill::AddressNormalizer* GetAddressNormalizer() override;
diff --git a/android_webview/browser/aw_permission_manager.cc b/android_webview/browser/aw_permission_manager.cc
index 249176a1..3a101d39 100644
--- a/android_webview/browser/aw_permission_manager.cc
+++ b/android_webview/browser/aw_permission_manager.cc
@@ -325,6 +325,7 @@
       case PermissionType::CLIPBOARD_READ:
       case PermissionType::CLIPBOARD_WRITE:
       case PermissionType::PAYMENT_HANDLER:
+      case PermissionType::BACKGROUND_FETCH:
         NOTIMPLEMENTED() << "RequestPermissions is not implemented for "
                          << static_cast<int>(permissions[i]);
         pending_request_raw->SetPermissionStatus(permissions[i],
@@ -516,6 +517,7 @@
       case PermissionType::CLIPBOARD_READ:
       case PermissionType::CLIPBOARD_WRITE:
       case PermissionType::PAYMENT_HANDLER:
+      case PermissionType::BACKGROUND_FETCH:
         NOTIMPLEMENTED() << "CancelPermission not implemented for "
                          << static_cast<int>(permission);
         break;
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 7758983..cca5da8 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -188,6 +188,10 @@
     "assistant/model/assistant_ui_model_observer.h",
     "assistant/ui/assistant_container_view.cc",
     "assistant/ui/assistant_container_view.h",
+    "assistant/ui/assistant_container_view_animator.cc",
+    "assistant/ui/assistant_container_view_animator.h",
+    "assistant/ui/assistant_container_view_animator_legacy_impl.cc",
+    "assistant/ui/assistant_container_view_animator_legacy_impl.h",
     "assistant/ui/assistant_main_view.cc",
     "assistant/ui/assistant_main_view.h",
     "assistant/ui/assistant_mini_view.cc",
diff --git a/ash/assistant/assistant_interaction_controller.cc b/ash/assistant/assistant_interaction_controller.cc
index a70d5c0..7a98f83 100644
--- a/ash/assistant/assistant_interaction_controller.cc
+++ b/ash/assistant/assistant_interaction_controller.cc
@@ -4,6 +4,9 @@
 
 #include "ash/assistant/assistant_interaction_controller.h"
 
+#include <map>
+#include <utility>
+
 #include "ash/assistant/assistant_controller.h"
 #include "ash/assistant/assistant_screen_context_controller.h"
 #include "ash/assistant/assistant_ui_controller.h"
@@ -85,7 +88,8 @@
 void AssistantInteractionController::OnDeepLinkReceived(
     assistant::util::DeepLinkType type,
     const std::map<std::string, std::string>& params) {
-  using namespace assistant::util;
+  using assistant::util::DeepLinkType;
+  using assistant::util::DeepLinkParam;
 
   if (type == DeepLinkType::kWhatsOnMyScreen) {
     StartScreenContextInteraction();
@@ -426,6 +430,7 @@
             l10n_util::GetStringUTF8(IDS_ASH_ASSISTANT_ERROR_GENERIC)));
   }
 
+  model_.pending_response()->set_has_tts(true);
   // We have an agreement with the server that TTS will always be the last part
   // of an interaction to be processed. To be timely in updating UI, we use
   // this as an opportunity to finalize the Assistant response and update the
diff --git a/ash/assistant/model/assistant_response.h b/ash/assistant/model/assistant_response.h
index e597b586..10131026 100644
--- a/ash/assistant/model/assistant_response.h
+++ b/ash/assistant/model/assistant_response.h
@@ -43,9 +43,15 @@
   // Returns all suggestions belongs to the response, mapped to a unique id.
   std::map<int, const AssistantSuggestion*> GetSuggestions() const;
 
+  // Get/Set if the current server response has TTS. This can only be reliably
+  // checked after the response is finalized for obvious reasons.
+  bool has_tts() const { return has_tts_; }
+  void set_has_tts(bool has_tts) { has_tts_ = has_tts; }
+
  private:
   std::vector<std::unique_ptr<AssistantUiElement>> ui_elements_;
   std::vector<AssistantSuggestionPtr> suggestions_;
+  bool has_tts_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(AssistantResponse);
 };
diff --git a/ash/assistant/ui/assistant_container_view.cc b/ash/assistant/ui/assistant_container_view.cc
index 9ac84b58..ce975fca 100644
--- a/ash/assistant/ui/assistant_container_view.cc
+++ b/ash/assistant/ui/assistant_container_view.cc
@@ -9,25 +9,23 @@
 #include "ash/assistant/assistant_controller.h"
 #include "ash/assistant/assistant_ui_controller.h"
 #include "ash/assistant/model/assistant_ui_model.h"
+#include "ash/assistant/ui/assistant_container_view_animator.h"
 #include "ash/assistant/ui/assistant_main_view.h"
 #include "ash/assistant/ui/assistant_mini_view.h"
 #include "ash/assistant/ui/assistant_ui_constants.h"
 #include "ash/assistant/ui/assistant_web_view.h"
 #include "ash/shell.h"
 #include "base/logging.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_targeter.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
-#include "ui/gfx/animation/slide_animation.h"
 #include "ui/gfx/animation/tween.h"
 #include "ui/views/bubble/bubble_border.h"
 #include "ui/views/bubble/bubble_frame_view.h"
 #include "ui/views/layout/layout_manager.h"
 #include "ui/views/view.h"
-#include "ui/wm/core/shadow_types.h"
 
 namespace ash {
 
@@ -35,10 +33,6 @@
 
 // Appearance.
 constexpr SkColor kBackgroundColor = SK_ColorWHITE;
-constexpr int kMiniUiCornerRadiusDip = 24;
-
-// Animation.
-constexpr int kResizeAnimationDurationMs = 250;
 
 // Window properties.
 DEFINE_UI_CLASS_PROPERTY_KEY(bool, kOnlyAllowMouseClickEvents, false);
@@ -145,16 +139,6 @@
   DISALLOW_COPY_AND_ASSIGN(AssistantContainerLayout);
 };
 
-int GetCompositorFrameNumber(ui::Layer* layer) {
-  ui::Compositor* compositor = layer->GetCompositor();
-  return compositor ? compositor->activated_frame_count() : 0;
-}
-
-float GetCompositorRefreshRate(ui::Layer* layer) {
-  ui::Compositor* compositor = layer->GetCompositor();
-  return compositor ? compositor->refresh_rate() : 60.0f;
-}
-
 }  // namespace
 
 // AssistantContainerView ------------------------------------------------------
@@ -162,9 +146,11 @@
 AssistantContainerView::AssistantContainerView(
     AssistantController* assistant_controller)
     : assistant_controller_(assistant_controller),
-      animation_start_frame_number_(0) {
-  set_accept_events(true);
+      animator_(
+          AssistantContainerViewAnimator::Create(assistant_controller_, this)) {
   UpdateAnchor();
+
+  set_accept_events(true);
   set_close_on_deactivate(false);
   set_color(kBackgroundColor);
   set_margins(gfx::Insets());
@@ -180,18 +166,17 @@
           ? kMiniUiCornerRadiusDip
           : kCornerRadiusDip);
 
-  // Update the initial shadow layer with correct corner radius.
-  UpdateShadow();
-
-  // Add the shadow layer on top of the non-client view layer.
-  shadow_layer_.SetFillsBoundsOpaquely(false);
+  // Initialize non-client view layer.
   GetBubbleFrameView()->SetPaintToLayer();
   GetBubbleFrameView()->layer()->SetFillsBoundsOpaquely(false);
-  GetBubbleFrameView()->layer()->Add(&shadow_layer_);
 
   // The AssistantController owns the view hierarchy to which
   // AssistantContainerView belongs so is guaranteed to outlive it.
   assistant_controller_->ui_controller()->AddModelObserver(this);
+
+  // Initialize |animator_| only after AssistantContainerView has been
+  // fully constructed to give it a chance to perform additional initialization.
+  animator_->Init();
 }
 
 AssistantContainerView::~AssistantContainerView() {
@@ -212,54 +197,17 @@
       std::make_unique<AssistantContainerEventTargeter>());
 }
 
+int AssistantContainerView::GetDialogButtons() const {
+  return ui::DIALOG_BUTTON_NONE;
+}
+
 void AssistantContainerView::ChildPreferredSizeChanged(views::View* child) {
   PreferredSizeChanged();
 }
 
-void AssistantContainerView::PreferredSizeChanged() {
-  if (!GetWidget())
-    return;
-
-  const bool visible =
-      assistant_controller_->ui_controller()->model()->visibility() ==
-      AssistantVisibility::kVisible;
-
-  // Calculate the target radius value with or without animation.
-  radius_end_ = assistant_controller_->ui_controller()->model()->ui_mode() ==
-                        AssistantUiMode::kMiniUi
-                    ? kMiniUiCornerRadiusDip
-                    : kCornerRadiusDip;
-
-  // When visible, size changes are animated.
-  if (visible) {
-    resize_animation_ = std::make_unique<gfx::SlideAnimation>(this);
-    resize_animation_->SetSlideDuration(kResizeAnimationDurationMs);
-
-    // Cache start and end animation values.
-    resize_start_ = gfx::SizeF(size());
-    resize_end_ = gfx::SizeF(GetPreferredSize());
-
-    radius_start_ =
-        GetBubbleFrameView()->bubble_border()->GetBorderCornerRadius();
-
-    animation_start_frame_number_ = GetCompositorFrameNumber(layer());
-
-    // Start animation.
-    resize_animation_->Show();
-    return;
-  }
-
-  // Clear any existing animation.
-  resize_animation_.reset();
-
-  // Update corner radius value without animation.
-  GetBubbleFrameView()->bubble_border()->SetCornerRadius(radius_end_);
-
-  SizeToContents();
-}
-
-int AssistantContainerView::GetDialogButtons() const {
-  return ui::DIALOG_BUTTON_NONE;
+void AssistantContainerView::SizeToContents() {
+  // We override this method to increase its visibility.
+  views::BubbleDialogDelegateView::SizeToContents();
 }
 
 void AssistantContainerView::OnBeforeBubbleWidgetInit(
@@ -270,20 +218,13 @@
   params->keep_on_top = true;
 }
 
-void AssistantContainerView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
-  // Update the shadow layer when resizing the window.
-  UpdateShadow();
-
-  SchedulePaint();
-}
-
 void AssistantContainerView::Init() {
   SetLayoutManager(std::make_unique<AssistantContainerLayout>());
 
-  // We need to paint to our own layer so we can clip child layers.
+  // We paint to our own layer. Some implementations of |animator_| mask to
+  // bounds to clip child layers.
   SetPaintToLayer();
   layer()->SetFillsBoundsOpaquely(false);
-  layer()->SetMasksToBounds(true);
 
   // Main view.
   assistant_main_view_ = new AssistantMainView(assistant_controller_);
@@ -358,85 +299,25 @@
     const gfx::Rect& usable_work_area) {
   UpdateAnchor();
 
-  // Call PreferredSizeChanged() to update animation params to avoid
-  // undesired effects (e.g., resize animation of Assistant UI when
-  // zooming in/out the screen).
+  // Call PreferredSizeChanged() to update animation params to avoid undesired
+  // effects (e.g. resize animation of Assistant UI when zooming in/out screen).
   PreferredSizeChanged();
 }
 
-// TODO(dmblack): Improve performance of this animation using transformations
-// for GPU acceleration. Lower spec hardware may struggle with numerous layouts.
-void AssistantContainerView::AnimationProgressed(
-    const gfx::Animation* animation) {
-  if (!GetWidget())
-    return;
+SkColor AssistantContainerView::GetBackgroundColor() const {
+  return kBackgroundColor;
+}
 
-  // Retrieve current bounds.
-  gfx::Rect bounds = GetWidget()->GetWindowBoundsInScreen();
+int AssistantContainerView::GetCornerRadius() const {
+  return GetBubbleFrameView()->bubble_border()->GetBorderCornerRadius();
+}
 
-  // Our view is horizontally centered and bottom aligned. As such, we should
-  // retain the same |center_x| and |bottom| positions after resizing.
-  const int bottom = bounds.bottom();
-  const int center_x = bounds.CenterPoint().x();
-
-  // Interpolate size at our current animation value.
-  const gfx::SizeF size = gfx::Tween::SizeValueBetween(
-      animation->GetCurrentValue(), resize_start_, resize_end_);
-
-  // Use our interpolated size.
-  bounds.set_size(gfx::Size(size.width(), size.height()));
-
-  // Maintain original |center_x| and |bottom| positions.
-  DCHECK_GT(center_x - (bounds.width() / 2), 0);
-  DCHECK_GT(bottom - bounds.height(), 0);
-  bounds.set_x(center_x - (bounds.width() / 2));
-  bounds.set_y(bottom - bounds.height());
-
-  // Interpolate the correct radius.
-  const int corner_radius = gfx::Tween::LinearIntValueBetween(
-      animation->GetCurrentValue(), radius_start_, radius_end_);
-
-  // Clip round corners on child views by directly changing the non-client
-  // view corner radius of this bubble widget.
+void AssistantContainerView::SetCornerRadius(int corner_radius) {
   GetBubbleFrameView()->bubble_border()->SetCornerRadius(corner_radius);
-
-  GetWidget()->SetBounds(bounds);
 }
 
-void AssistantContainerView::AnimationEnded(const gfx::Animation* animation) {
-  const int ideal_frames = GetCompositorRefreshRate(layer()) *
-                           kResizeAnimationDurationMs /
-                           base::Time::kMillisecondsPerSecond;
-
-  const int actual_frames =
-      GetCompositorFrameNumber(layer()) - animation_start_frame_number_;
-  if (actual_frames <= 0)
-    return;
-
-  int smoothness = 100;
-  // The |actual_frames| could be |ideal_frames| + 1. The reason could be that
-  // the animation timer is running with interval of 0.016666 s, which could
-  // animate one more frame than expected due to rounding error.
-  if (ideal_frames > actual_frames)
-    smoothness = 100 * actual_frames / ideal_frames;
-
-  UMA_HISTOGRAM_PERCENTAGE("Assistant.ContainerView.Resize.AnimationSmoothness",
-                           smoothness);
-}
-
-void AssistantContainerView::UpdateShadow() {
-  // Initialize shadow parameters in painting.
-  gfx::ShadowValues shadow_values =
-      gfx::ShadowValue::MakeMdShadowValues(wm::kShadowElevationActiveWindow);
-
-  const int corner_radius =
-      GetBubbleFrameView()->bubble_border()->GetBorderCornerRadius();
-  border_shadow_delegate_ = std::make_unique<views::BorderShadowLayerDelegate>(
-      shadow_values, GetLocalBounds(), SK_ColorWHITE, corner_radius);
-
-  shadow_layer_.set_delegate(border_shadow_delegate_.get());
-  shadow_layer_.SetBounds(
-      gfx::ToEnclosingRect(border_shadow_delegate_->GetPaintedBounds()));
+ui::Layer* AssistantContainerView::GetNonClientViewLayer() {
+  return GetBubbleFrameView()->layer();
 }
 
 }  // namespace ash
diff --git a/ash/assistant/ui/assistant_container_view.h b/ash/assistant/ui/assistant_container_view.h
index acd7a4e..8ab627e 100644
--- a/ash/assistant/ui/assistant_container_view.h
+++ b/ash/assistant/ui/assistant_container_view.h
@@ -9,29 +9,22 @@
 
 #include "ash/assistant/model/assistant_ui_model_observer.h"
 #include "base/macros.h"
-#include "ui/compositor/layer.h"
-#include "ui/gfx/animation/animation_delegate.h"
-#include "ui/views/animation/ink_drop_painted_layer_delegates.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
 
 namespace aura {
 class Window;
 }  // namespace aura
 
-namespace gfx {
-class SlideAnimation;
-}  // namespace gfx
-
 namespace ash {
 
+class AssistantContainerViewAnimator;
 class AssistantController;
 class AssistantMainView;
 class AssistantMiniView;
 class AssistantWebView;
 
 class AssistantContainerView : public views::BubbleDialogDelegateView,
-                               public AssistantUiModelObserver,
-                               public gfx::AnimationDelegate {
+                               public AssistantUiModelObserver {
  public:
   explicit AssistantContainerView(AssistantController* assistant_controller);
   ~AssistantContainerView() override;
@@ -46,10 +39,9 @@
   void AddedToWidget() override;
   int GetDialogButtons() const override;
   void ChildPreferredSizeChanged(views::View* child) override;
-  void PreferredSizeChanged() override;
+  void SizeToContents() override;
   void OnBeforeBubbleWidgetInit(views::Widget::InitParams* params,
                                 views::Widget* widget) const override;
-  void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
   void Init() override;
   void RequestFocus() override;
 
@@ -57,40 +49,27 @@
   void OnUiModeChanged(AssistantUiMode ui_mode) override;
   void OnUsableWorkAreaChanged(const gfx::Rect& usable_work_area) override;
 
-  // gfx::AnimationDelegate:
-  void AnimationProgressed(const gfx::Animation* animation) override;
-  void AnimationEnded(const gfx::Animation* animation) override;
+  // Returns background color.
+  SkColor GetBackgroundColor() const;
+
+  // Returns/sets corner radius.
+  int GetCornerRadius() const;
+  void SetCornerRadius(int corner_radius);
+
+  // Returns the layer for the non-client view.
+  ui::Layer* GetNonClientViewLayer();
 
  private:
   // Update anchor rect with respect to the current usable work area.
   void UpdateAnchor();
 
-  // Update the shadow layer.
-  void UpdateShadow();
-
   AssistantController* const assistant_controller_;  // Owned by Shell.
 
   AssistantMainView* assistant_main_view_;  // Owned by view hierarchy.
   AssistantMiniView* assistant_mini_view_;  // Owned by view hierarchy.
   AssistantWebView* assistant_web_view_;    // Owned by view hierarchy.
 
-  std::unique_ptr<gfx::SlideAnimation> resize_animation_;
-  gfx::SizeF resize_start_;
-  gfx::SizeF resize_end_;
-
-  // Cache the corner radius start value.
-  int radius_start_ = 0;
-
-  // Cache the corner radius target value.
-  int radius_end_ = 0;
-
-  // ui::LayerDelegate to paint rounded rectangle with shadow.
-  std::unique_ptr<views::BorderShadowLayerDelegate> border_shadow_delegate_;
-
-  // This layer shows a rounded rectangle with drop shadow.
-  ui::Layer shadow_layer_;
-
-  int animation_start_frame_number_ = 0;
+  std::unique_ptr<AssistantContainerViewAnimator> animator_;
 
   DISALLOW_COPY_AND_ASSIGN(AssistantContainerView);
 };
diff --git a/ash/assistant/ui/assistant_container_view_animator.cc b/ash/assistant/ui/assistant_container_view_animator.cc
new file mode 100644
index 0000000..cdbd76c
--- /dev/null
+++ b/ash/assistant/ui/assistant_container_view_animator.cc
@@ -0,0 +1,65 @@
+// Copyright 2018 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 "ash/assistant/ui/assistant_container_view_animator.h"
+
+#include "ash/assistant/assistant_controller.h"
+#include "ash/assistant/ui/assistant_container_view.h"
+#include "ash/assistant/ui/assistant_container_view_animator_legacy_impl.h"
+
+namespace ash {
+
+AssistantContainerViewAnimator::AssistantContainerViewAnimator(
+    AssistantController* assistant_controller,
+    AssistantContainerView* assistant_container_view)
+    : assistant_controller_(assistant_controller),
+      assistant_container_view_(assistant_container_view) {
+  static_cast<views::View*>(assistant_container_view_)->AddObserver(this);
+}
+
+AssistantContainerViewAnimator::~AssistantContainerViewAnimator() {
+  static_cast<views::View*>(assistant_container_view_)->RemoveObserver(this);
+}
+
+// static
+std::unique_ptr<AssistantContainerViewAnimator>
+AssistantContainerViewAnimator::Create(
+    AssistantController* assistant_controller,
+    AssistantContainerView* assistant_container_view) {
+  // TODO(wutao): Conditionally provide an alternative implementation.
+  return std::make_unique<AssistantContainerViewAnimatorLegacyImpl>(
+      assistant_controller, assistant_container_view);
+}
+
+void AssistantContainerViewAnimator::Init() {}
+
+void AssistantContainerViewAnimator::OnBoundsChanged() {}
+
+void AssistantContainerViewAnimator::OnPreferredSizeChanged() {
+  if (assistant_container_view_->GetWidget())
+    assistant_container_view_->SizeToContents();
+}
+
+void AssistantContainerViewAnimator::OnViewBoundsChanged(views::View* view) {
+  OnBoundsChanged();
+}
+
+void AssistantContainerViewAnimator::OnViewPreferredSizeChanged(
+    views::View* view) {
+  if (!assistant_container_view_->GetWidget())
+    return;
+
+  const gfx::Size preferred_size =
+      assistant_container_view_->GetPreferredSize();
+
+  // We currently over-trigger OnViewPreferredSizeChanged. Until that can be
+  // addressed we filter out events that are superfluous.
+  if (preferred_size == last_preferred_size_)
+    return;
+
+  last_preferred_size_ = preferred_size;
+  OnPreferredSizeChanged();
+}
+
+}  // namespace ash
diff --git a/ash/assistant/ui/assistant_container_view_animator.h b/ash/assistant/ui/assistant_container_view_animator.h
new file mode 100644
index 0000000..e2a5cb1
--- /dev/null
+++ b/ash/assistant/ui/assistant_container_view_animator.h
@@ -0,0 +1,69 @@
+// Copyright 2018 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 ASH_ASSISTANT_UI_ASSISTANT_CONTAINER_VIEW_ANIMATOR_H_
+#define ASH_ASSISTANT_UI_ASSISTANT_CONTAINER_VIEW_ANIMATOR_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/views/view_observer.h"
+
+namespace views {
+class View;
+}  // namespace views
+
+namespace ash {
+
+class AssistantContainerView;
+class AssistantController;
+
+// The AssistantContainerViewAnimator is the class responsible for smoothly
+// animating bound changes for the AssistantContainerView.
+class AssistantContainerViewAnimator : public views::ViewObserver {
+ public:
+  ~AssistantContainerViewAnimator() override;
+
+  // Returns a newly created instance of an AssistantContainerViewAnimator.
+  static std::unique_ptr<AssistantContainerViewAnimator> Create(
+      AssistantController* assistant_controller,
+      AssistantContainerView* assistant_container_view);
+
+  // Invoked when AssistantContainerView has been fully constructed to give the
+  // AssistantContainerViewAnimator an opportunity to perform initialization.
+  virtual void Init();
+
+ protected:
+  AssistantContainerViewAnimator(
+      AssistantController* assistant_controller,
+      AssistantContainerView* assistant_container_view);
+
+  // Invoked when AssistantContainerView's bounds have changed.
+  virtual void OnBoundsChanged();
+
+  // Invoked when AssistantContainerView's preferred size has changed.
+  virtual void OnPreferredSizeChanged();
+
+  AssistantController* const assistant_controller_;  // Owned by Shell.
+
+  // Owned by view hierarchy.
+  AssistantContainerView* const assistant_container_view_;
+
+ private:
+  // views::Observer:
+  void OnViewBoundsChanged(views::View* view) override;
+  void OnViewPreferredSizeChanged(views::View* view) override;
+
+  // Cached value of AssistantContainerView's last preferred size. We currently
+  // over-trigger the OnViewPreferredSizeChanged event so this is used to filter
+  // out superfluous calls.
+  gfx::Size last_preferred_size_;
+
+  DISALLOW_COPY_AND_ASSIGN(AssistantContainerViewAnimator);
+};
+
+}  // namespace ash
+
+#endif  // ASH_ASSISTANT_UI_ASSISTANT_CONTAINER_VIEW_ANIMATOR_H_
diff --git a/ash/assistant/ui/assistant_container_view_animator_legacy_impl.cc b/ash/assistant/ui/assistant_container_view_animator_legacy_impl.cc
new file mode 100644
index 0000000..f4d6fa6
--- /dev/null
+++ b/ash/assistant/ui/assistant_container_view_animator_legacy_impl.cc
@@ -0,0 +1,176 @@
+// Copyright 2018 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 "ash/assistant/ui/assistant_container_view_animator_legacy_impl.h"
+
+#include "ash/assistant/assistant_controller.h"
+#include "ash/assistant/assistant_ui_controller.h"
+#include "ash/assistant/ui/assistant_container_view.h"
+#include "ash/assistant/ui/assistant_ui_constants.h"
+#include "base/metrics/histogram_macros.h"
+#include "ui/gfx/animation/slide_animation.h"
+#include "ui/views/animation/ink_drop_painted_layer_delegates.h"
+#include "ui/wm/core/shadow_types.h"
+
+namespace ash {
+
+namespace {
+
+// Animation.
+constexpr int kAnimationDurationMs = 250;
+
+// Helpers ---------------------------------------------------------------------
+
+int GetCompositorFrameNumber(ui::Layer* layer) {
+  ui::Compositor* compositor = layer->GetCompositor();
+  return compositor ? compositor->activated_frame_count() : 0;
+}
+
+float GetCompositorRefreshRate(ui::Layer* layer) {
+  ui::Compositor* compositor = layer->GetCompositor();
+  return compositor ? compositor->refresh_rate() : 60.0f;
+}
+
+}  // namespace
+
+// AssistantContainerViewAnimatorLegacyImpl ------------------------------------
+
+AssistantContainerViewAnimatorLegacyImpl::
+    AssistantContainerViewAnimatorLegacyImpl(
+        AssistantController* assistant_controller,
+        AssistantContainerView* assistant_container_view)
+    : AssistantContainerViewAnimator(assistant_controller,
+                                     assistant_container_view) {}
+
+AssistantContainerViewAnimatorLegacyImpl::
+    ~AssistantContainerViewAnimatorLegacyImpl() = default;
+
+void AssistantContainerViewAnimatorLegacyImpl::Init() {
+  // Initialize background layer.
+  background_layer_.SetFillsBoundsOpaquely(false);
+  UpdateBackground();
+
+  // Add background layer to the non-client view layer.
+  assistant_container_view_->GetNonClientViewLayer()->Add(&background_layer_);
+
+  // The AssistantContainerView layer masks to bounds to ensure clipping of
+  // child layers during animation.
+  assistant_container_view_->layer()->SetMasksToBounds(true);
+}
+
+void AssistantContainerViewAnimatorLegacyImpl::OnBoundsChanged() {
+  UpdateBackground();
+  assistant_container_view_->SchedulePaint();
+}
+
+void AssistantContainerViewAnimatorLegacyImpl::OnPreferredSizeChanged() {
+  if (!assistant_container_view_->GetWidget())
+    return;
+
+  end_radius_ = assistant_controller_->ui_controller()->model()->ui_mode() ==
+                        AssistantUiMode::kMiniUi
+                    ? kMiniUiCornerRadiusDip
+                    : kCornerRadiusDip;
+
+  const bool visible =
+      assistant_controller_->ui_controller()->model()->visibility() ==
+      AssistantVisibility::kVisible;
+
+  // When visible, size changes are animated.
+  if (visible) {
+    animation_ = std::make_unique<gfx::SlideAnimation>(this);
+    animation_->SetSlideDuration(kAnimationDurationMs);
+
+    // Cache start and end animation values.
+    start_size_ = gfx::SizeF(assistant_container_view_->size());
+    end_size_ = gfx::SizeF(assistant_container_view_->GetPreferredSize());
+    start_radius_ = assistant_container_view_->GetCornerRadius();
+
+    // Cache start frame number for measuring animation smoothness.
+    start_frame_number_ =
+        GetCompositorFrameNumber(assistant_container_view_->layer());
+
+    // Start animation.
+    animation_->Show();
+    return;
+  }
+
+  // Clear any existing animation.
+  animation_.reset();
+
+  // Update corner radius and resize without animation.
+  assistant_container_view_->SetCornerRadius(end_radius_);
+  assistant_container_view_->SizeToContents();
+}
+
+void AssistantContainerViewAnimatorLegacyImpl::AnimationProgressed(
+    const gfx::Animation* animation) {
+  if (!assistant_container_view_->GetWidget())
+    return;
+
+  // Retrieve current bounds.
+  gfx::Rect bounds =
+      assistant_container_view_->GetWidget()->GetWindowBoundsInScreen();
+
+  // Our view is horizontally centered and bottom aligned. As such, we should
+  // retain the same |center_x| and |bottom| positions after resizing.
+  const int bottom = bounds.bottom();
+  const int center_x = bounds.CenterPoint().x();
+
+  // Interpolate size at our current animation value.
+  const gfx::SizeF size = gfx::Tween::SizeValueBetween(
+      animation->GetCurrentValue(), start_size_, end_size_);
+
+  // Use our interpolated size.
+  bounds.set_size(gfx::Size(size.width(), size.height()));
+
+  // Maintain original |center_x| and |bottom| positions.
+  bounds.set_x(center_x - (bounds.width() / 2));
+  bounds.set_y(bottom - bounds.height());
+
+  // Interpolate the correct corner radius.
+  const int corner_radius = gfx::Tween::LinearIntValueBetween(
+      animation->GetCurrentValue(), start_radius_, end_radius_);
+
+  // Update corner radius and bounds.
+  assistant_container_view_->SetCornerRadius(corner_radius);
+  assistant_container_view_->GetWidget()->SetBounds(bounds);
+}
+
+void AssistantContainerViewAnimatorLegacyImpl::AnimationEnded(
+    const gfx::Animation* animation) {
+  const int ideal_frames =
+      GetCompositorRefreshRate(assistant_container_view_->layer()) *
+      kAnimationDurationMs / base::Time::kMillisecondsPerSecond;
+
+  const int actual_frames =
+      GetCompositorFrameNumber(assistant_container_view_->layer()) -
+      start_frame_number_;
+
+  if (actual_frames <= 0)
+    return;
+
+  // The |actual_frames| could be |ideal_frames| + 1. The reason could be that
+  // the animation timer is running with interval of 0.016666 sec, which could
+  // animate one more frame than expected due to rounding error.
+  const int smoothness = std::min(100 * actual_frames / ideal_frames, 100);
+  UMA_HISTOGRAM_PERCENTAGE("Assistant.ContainerView.Resize.AnimationSmoothness",
+                           smoothness);
+}
+
+void AssistantContainerViewAnimatorLegacyImpl::UpdateBackground() {
+  gfx::ShadowValues shadow_values =
+      gfx::ShadowValue::MakeMdShadowValues(wm::kShadowElevationActiveWindow);
+
+  shadow_delegate_ = std::make_unique<views::BorderShadowLayerDelegate>(
+      shadow_values, assistant_container_view_->GetLocalBounds(),
+      assistant_container_view_->GetBackgroundColor(),
+      assistant_container_view_->GetCornerRadius());
+
+  background_layer_.set_delegate(shadow_delegate_.get());
+  background_layer_.SetBounds(
+      gfx::ToEnclosingRect(shadow_delegate_->GetPaintedBounds()));
+}
+
+}  // namespace ash
diff --git a/ash/assistant/ui/assistant_container_view_animator_legacy_impl.h b/ash/assistant/ui/assistant_container_view_animator_legacy_impl.h
new file mode 100644
index 0000000..4154c11
--- /dev/null
+++ b/ash/assistant/ui/assistant_container_view_animator_legacy_impl.h
@@ -0,0 +1,69 @@
+// Copyright 2018 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 ASH_ASSISTANT_UI_ASSISTANT_CONTAINER_VIEW_ANIMATOR_LEGACY_IMPL_H_
+#define ASH_ASSISTANT_UI_ASSISTANT_CONTAINER_VIEW_ANIMATOR_LEGACY_IMPL_H_
+
+#include <memory>
+
+#include "ash/assistant/ui/assistant_container_view_animator.h"
+#include "base/macros.h"
+#include "ui/compositor/layer.h"
+#include "ui/gfx/animation/animation_delegate.h"
+#include "ui/gfx/geometry/size_f.h"
+
+namespace gfx {
+class SlideAnimation;
+}  // namespace gfx
+
+namespace views {
+class BorderShadowLayerDelegate;
+}  // namespace views
+
+namespace ash {
+
+// The AssistantContainerViewAnimatorLegacyImpl is an implementation of
+// AssistantContainerViewAnimator that performs rebounding of
+// AssistantContainerView at each frame in its resize animation. As such, it is
+// not very performant and we are working to deprecate this implementation.
+class AssistantContainerViewAnimatorLegacyImpl
+    : public AssistantContainerViewAnimator,
+      public gfx::AnimationDelegate {
+ public:
+  AssistantContainerViewAnimatorLegacyImpl(
+      AssistantController* assistant_controller,
+      AssistantContainerView* assistant_container_view);
+
+  ~AssistantContainerViewAnimatorLegacyImpl() override;
+
+  // AssistantContainerViewAnimator:
+  void Init() override;
+  void OnBoundsChanged() override;
+  void OnPreferredSizeChanged() override;
+
+  // gfx::AnimationDelegate:
+  void AnimationProgressed(const gfx::Animation* animation) override;
+  void AnimationEnded(const gfx::Animation* animation) override;
+
+ private:
+  void UpdateBackground();
+
+  // Background/shadow.
+  ui::Layer background_layer_;
+  std::unique_ptr<views::BorderShadowLayerDelegate> shadow_delegate_;
+
+  // Animation.
+  std::unique_ptr<gfx::SlideAnimation> animation_;
+  gfx::SizeF start_size_;
+  gfx::SizeF end_size_;
+  int start_radius_ = 0;
+  int end_radius_ = 0;
+  int start_frame_number_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(AssistantContainerViewAnimatorLegacyImpl);
+};
+
+}  // namespace ash
+
+#endif  // ASH_ASSISTANT_UI_ASSISTANT_CONTAINER_VIEW_ANIMATOR_LEGACY_IMPL_H_
diff --git a/ash/assistant/ui/assistant_ui_constants.h b/ash/assistant/ui/assistant_ui_constants.h
index 5e90db6e..66c1771d 100644
--- a/ash/assistant/ui/assistant_ui_constants.h
+++ b/ash/assistant/ui/assistant_ui_constants.h
@@ -16,6 +16,7 @@
 
 // Appearance.
 constexpr int kCornerRadiusDip = 20;
+constexpr int kMiniUiCornerRadiusDip = 24;
 constexpr int kMaxHeightDip = 640;
 constexpr int kPaddingDip = 14;
 constexpr int kPreferredWidthDip = 640;
diff --git a/ash/assistant/ui/main_stage/ui_element_container_view.cc b/ash/assistant/ui/main_stage/ui_element_container_view.cc
index 2931870..62a71104 100644
--- a/ash/assistant/ui/main_stage/ui_element_container_view.cc
+++ b/ash/assistant/ui/main_stage/ui_element_container_view.cc
@@ -414,8 +414,12 @@
 
   // Let screen reader read the query result.
   // NOTE: this won't read webview result, which will be triggered with HTML
-  // ARIA.
-  NotifyAccessibilityEvent(ax::mojom::Event::kAlert, true);
+  // ARIA. Also we don't read when there is a TTS response already to avoid
+  // speaking over the server response.
+  const AssistantResponse* response =
+      assistant_controller_->interaction_controller()->model()->response();
+  if (!response->has_tts())
+    NotifyAccessibilityEvent(ax::mojom::Event::kAlert, true);
 }
 
 bool UiElementContainerView::OnAllUiElementsExitAnimationEnded(
diff --git a/ash/display/touch_calibrator_controller_unittest.cc b/ash/display/touch_calibrator_controller_unittest.cc
index f50c6d1..d0f2e53f 100644
--- a/ash/display/touch_calibrator_controller_unittest.cc
+++ b/ash/display/touch_calibrator_controller_unittest.cc
@@ -152,12 +152,12 @@
         ui::ET_TOUCH_PRESSED, location, ui::EventTimeForNow(),
         ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 12, 1.0f,
                            1.0f, 0.0f),
-        0, 0.0f);
+        0);
     ui::TouchEvent release_touch_event(
         ui::ET_TOUCH_RELEASED, location, ui::EventTimeForNow(),
         ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 12, 1.0f,
                            1.0f, 0.0f),
-        0, 0.0f);
+        0);
 
     press_touch_event.set_source_device_id(touch_device_id);
     release_touch_event.set_source_device_id(touch_device_id);
diff --git a/ash/events/event_rewriter_controller.cc b/ash/events/event_rewriter_controller.cc
index a5b87dc..4c4edce 100644
--- a/ash/events/event_rewriter_controller.cc
+++ b/ash/events/event_rewriter_controller.cc
@@ -89,6 +89,10 @@
   spoken_feedback_event_rewriter_->set_capture_all_keys(capture);
 }
 
+void EventRewriterController::SetSendMouseEventsToDelegate(bool value) {
+  spoken_feedback_event_rewriter_->set_send_mouse_events(value);
+}
+
 void EventRewriterController::OnHostInitialized(aura::WindowTreeHost* host) {
   for (const auto& rewriter : rewriters_)
     host->GetEventSource()->AddEventRewriter(rewriter.get());
diff --git a/ash/events/event_rewriter_controller.h b/ash/events/event_rewriter_controller.h
index 9b3c52ae..684aaf9 100644
--- a/ash/events/event_rewriter_controller.h
+++ b/ash/events/event_rewriter_controller.h
@@ -48,6 +48,7 @@
   void OnUnhandledSpokenFeedbackEvent(
       std::unique_ptr<ui::Event> event) override;
   void CaptureAllKeysForSpokenFeedback(bool capture) override;
+  void SetSendMouseEventsToDelegate(bool value) override;
 
   // aura::EnvObserver:
   void OnWindowInitialized(aura::Window* window) override {}
diff --git a/ash/events/spoken_feedback_event_rewriter.cc b/ash/events/spoken_feedback_event_rewriter.cc
index 6128e7b3..9581001 100644
--- a/ash/events/spoken_feedback_event_rewriter.cc
+++ b/ash/events/spoken_feedback_event_rewriter.cc
@@ -40,28 +40,34 @@
 ui::EventRewriteStatus SpokenFeedbackEventRewriter::RewriteEvent(
     const ui::Event& event,
     std::unique_ptr<ui::Event>* new_event) {
-  if (!delegate_.is_bound() || !event.IsKeyEvent())
+  if (!delegate_.is_bound() ||
+      !Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled())
     return ui::EVENT_REWRITE_CONTINUE;
 
-  if (!Shell::Get()->accessibility_controller()->IsSpokenFeedbackEnabled())
-    return ui::EVENT_REWRITE_CONTINUE;
+  if (event.IsKeyEvent()) {
+    const ui::KeyEvent* key_event = event.AsKeyEvent();
 
-  const ui::KeyEvent* key_event = event.AsKeyEvent();
+    bool capture = capture_all_keys_;
 
-  bool capture = capture_all_keys_;
+    // Always capture the Search key.
+    capture |= key_event->IsCommandDown();
 
-  // Always capture the Search key.
-  capture |= key_event->IsCommandDown();
+    // Don't capture tab as it gets consumed by Blink so never comes back
+    // unhandled. In third_party/WebKit/Source/core/input/EventHandler.cpp, a
+    // default tab handler consumes tab even when no focusable nodes are found;
+    // it sets focus to Chrome and eats the event.
+    if (key_event->GetDomKey() == ui::DomKey::TAB)
+      capture = false;
 
-  // Don't capture tab as it gets consumed by Blink so never comes back
-  // unhandled. In third_party/WebKit/Source/core/input/EventHandler.cpp, a
-  // default tab handler consumes tab even when no focusable nodes are found; it
-  // sets focus to Chrome and eats the event.
-  if (key_event->GetDomKey() == ui::DomKey::TAB)
-    capture = false;
+    delegate_->DispatchKeyEventToChromeVox(ui::Event::Clone(event), capture);
+    return capture ? ui::EVENT_REWRITE_DISCARD : ui::EVENT_REWRITE_CONTINUE;
+  }
 
-  delegate_->DispatchKeyEventToChromeVox(ui::Event::Clone(event), capture);
-  return capture ? ui::EVENT_REWRITE_DISCARD : ui::EVENT_REWRITE_CONTINUE;
+  if (send_mouse_events_ && event.IsMouseEvent()) {
+    delegate_->DispatchMouseEventToChromeVox(ui::Event::Clone(event));
+  }
+
+  return ui::EVENT_REWRITE_CONTINUE;
 }
 
 ui::EventRewriteStatus SpokenFeedbackEventRewriter::NextDispatchEvent(
diff --git a/ash/events/spoken_feedback_event_rewriter.h b/ash/events/spoken_feedback_event_rewriter.h
index 3bc7e61..7834256 100644
--- a/ash/events/spoken_feedback_event_rewriter.h
+++ b/ash/events/spoken_feedback_event_rewriter.h
@@ -31,6 +31,7 @@
   void OnUnhandledSpokenFeedbackEvent(std::unique_ptr<ui::Event> event) const;
 
   void set_capture_all_keys(bool value) { capture_all_keys_ = value; }
+  void set_send_mouse_events(bool value) { send_mouse_events_ = value; }
 
  private:
   // ui::EventRewriter:
@@ -44,6 +45,9 @@
   // The delegate used to send key events to the ChromeVox extension.
   mojom::SpokenFeedbackEventRewriterDelegatePtr delegate_;
 
+  // Whether to send mouse events to the ChromeVox extension.
+  bool send_mouse_events_ = false;
+
   // Whether to capture all keys.
   bool capture_all_keys_ = false;
 
diff --git a/ash/events/spoken_feedback_event_rewriter_unittest.cc b/ash/events/spoken_feedback_event_rewriter_unittest.cc
index 647cb69..da990537 100644
--- a/ash/events/spoken_feedback_event_rewriter_unittest.cc
+++ b/ash/events/spoken_feedback_event_rewriter_unittest.cc
@@ -77,6 +77,11 @@
       captured_event_count_++;
   }
 
+  void DispatchMouseEventToChromeVox(
+      std::unique_ptr<ui::Event> event) override {
+    recorded_event_count_++;
+  }
+
   // The binding that backs the interface pointer held by the event rewriter.
   mojo::Binding<ash::mojom::SpokenFeedbackEventRewriterDelegate> binding_;
 
diff --git a/ash/login/ui/lock_window.cc b/ash/login/ui/lock_window.cc
index 0389ae0..84e3a73 100644
--- a/ash/login/ui/lock_window.cc
+++ b/ash/login/ui/lock_window.cc
@@ -30,16 +30,16 @@
   // login/lock content. See crbug.com/363635.
   keyboard::mojom::KeyboardConfig config =
       keyboard::KeyboardController::Get()->keyboard_config();
-  config.overscroll_override =
-      keyboard::mojom::KeyboardOverscrollOverride::kDisabled;
+  config.overscroll_behavior =
+      keyboard::mojom::KeyboardOverscrollBehavior::kDisabled;
   keyboard::KeyboardController::Get()->UpdateKeyboardConfig(config);
 }
 
 LockWindow::~LockWindow() {
   keyboard::mojom::KeyboardConfig config =
       keyboard::KeyboardController::Get()->keyboard_config();
-  config.overscroll_override =
-      keyboard::mojom::KeyboardOverscrollOverride::kNone;
+  config.overscroll_behavior =
+      keyboard::mojom::KeyboardOverscrollBehavior::kDefault;
   keyboard::KeyboardController::Get()->UpdateKeyboardConfig(config);
 
   // We need to destroy the root view before destroying |data_dispatcher_|
diff --git a/ash/magnifier/magnification_controller.cc b/ash/magnifier/magnification_controller.cc
index 7fd58fe..80bbab7c 100644
--- a/ash/magnifier/magnification_controller.cc
+++ b/ash/magnifier/magnification_controller.cc
@@ -176,9 +176,9 @@
   // so it needs to be disabled when magnification is enabled.
   // TODO(spqchan): Fix the keyboard overscroll issues.
   auto config = keyboard::KeyboardController::Get()->keyboard_config();
-  config.overscroll_override =
-      is_enabled_ ? keyboard::mojom::KeyboardOverscrollOverride::kDisabled
-                  : keyboard::mojom::KeyboardOverscrollOverride::kNone;
+  config.overscroll_behavior =
+      is_enabled_ ? keyboard::mojom::KeyboardOverscrollBehavior::kDisabled
+                  : keyboard::mojom::KeyboardOverscrollBehavior::kDefault;
   keyboard::KeyboardController::Get()->UpdateKeyboardConfig(config);
 }
 
diff --git a/ash/public/interfaces/event_rewriter_controller.mojom b/ash/public/interfaces/event_rewriter_controller.mojom
index e51d39e..09b3de1 100644
--- a/ash/public/interfaces/event_rewriter_controller.mojom
+++ b/ash/public/interfaces/event_rewriter_controller.mojom
@@ -12,6 +12,9 @@
   // the rewriter discarded the event, false if the rewriter continues event
   // propagation.
   DispatchKeyEventToChromeVox(ui.mojom.Event event, bool capture);
+
+  // Used to send mouse events to the ChromeVox extension.
+  DispatchMouseEventToChromeVox(ui.mojom.Event event);
 };
 
 // Allows clients to toggle some event rewriting behavior.
@@ -34,4 +37,7 @@
 
   // Discards key events and sends to spoken feedback when true.
   CaptureAllKeysForSpokenFeedback(bool capture);
+
+  // Sends mouse events to ChromeVox when true.
+  SetSendMouseEventsToDelegate(bool value);
 };
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index 825f76c..b65a406 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -21,6 +21,7 @@
 <translation id="1270290102613614947">Skjermtastaturet er deaktivert</translation>
 <translation id="1272079795634619415">Stopp</translation>
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
+<translation id="1289185460362160437">Kom tilbake <ph name="COME_BACK_DAY_OF_WEEK" /> <ph name="COME_BACK_TIME" />.</translation>
 <translation id="1290331692326790741">Svakt signal</translation>
 <translation id="1293264513303784526">USB-C-enhet (porten på venstre side)</translation>
 <translation id="1294929383540927798">Endre innstillingene for varsler på låseskjermen</translation>
@@ -98,6 +99,7 @@
 <translation id="2501920221385095727">Trege taster</translation>
 <translation id="2509468283778169019">Caps Lock er på</translation>
 <translation id="2532589005999780174">Høykontrastmodus</translation>
+<translation id="255671100581129685">Google-assistenten er ikke tilgjengelig i offentlige økter.</translation>
 <translation id="2575685495496069081">Multipålogging er slått av</translation>
 <translation id="2582112259361606227">Start på nytt for å oppdatere</translation>
 <translation id="2597972630681408282">Nattlys: <ph name="NIGHT_LIGHT_STATUS" /></translation>
@@ -128,6 +130,7 @@
 <translation id="3000461861112256445">Monolyd</translation>
 <translation id="3009178788565917040">Utdata</translation>
 <translation id="3019353588588144572">Tid som gjenstår til batteriet er fulladet – <ph name="TIME_REMAINING" /></translation>
+<translation id="3055162170959710888">Du har brukt denne enheten i <ph name="USED_TIME" /> i dag</translation>
 <translation id="3077734595579995578">shift</translation>
 <translation id="3081696990447829002">Vis menyen</translation>
 <translation id="3087734570205094154">Bunn</translation>
@@ -213,6 +216,7 @@
 <translation id="4659419629803378708">ChromeVox er slått på</translation>
 <translation id="4734965478015604180">Horisontal</translation>
 <translation id="476166673298332917">Administratoren av denne enheten har tilgang til all aktivitet, inkludert passord og kommunikasjon.</translation>
+<translation id="4774338217796918551">Kom tilbake i morgen <ph name="COME_BACK_TIME" />.</translation>
 <translation id="4776917500594043016">Passord for <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="4778095205580009397">Google-assistenten er ikke tilgjengelig under demonstrasjonsøkter.</translation>
 <translation id="479989351350248267">søk</translation>
@@ -227,6 +231,7 @@
 <translation id="4918086044614829423">Godta</translation>
 <translation id="4924411785043111640">Start på nytt og tilbakestill</translation>
 <translation id="4961318399572185831">Cast skjermen</translation>
+<translation id="5030687792513154421">Tiden er ute</translation>
 <translation id="5083553833479578423">Lås opp flere Assistent-funksjoner.</translation>
 <translation id="5136175204352732067">Et annet tastatur er koblet til</translation>
 <translation id="5168181903108465623">Cast-enheter er tilgjengelige</translation>
@@ -356,6 +361,7 @@
 <translation id="7510334386202674593">Ctrl+Shift+L</translation>
 <translation id="7526573455193969409">Nettverket kan være overvåket</translation>
 <translation id="7536035074519304529">IP-adresse: <ph name="ADDRESS" /></translation>
+<translation id="7548434653388805669">Nå er det sengetid</translation>
 <translation id="7561014039265304140"><ph name="DISPLAY_NAME" /> støtter ikke <ph name="SPECIFIED_RESOLUTION" />. Oppløsningen ble endret til <ph name="FALLBACK_RESOLUTION" /></translation>
 <translation id="7562368315689366235">Emoji-palett</translation>
 <translation id="7564874036684306347">Flytting av vinduer til et annet skrivebord kan føre til uventet atferd. Følgende varsler, vinduer og dialogbokser kan bli delt mellom skrivebordene.</translation>
@@ -398,12 +404,14 @@
 <translation id="8152119955266188852">Du trykket på snarveien for lupen for hele skjermen. Vil du slå den på?</translation>
 <translation id="8190698733819146287">Tilpass språk og inndata</translation>
 <translation id="8192202700944119416">Varsler er skjult.</translation>
+<translation id="8236042855478648955">På tide med en pause</translation>
 <translation id="8261506727792406068">Slett</translation>
 <translation id="8297006494302853456">Svak</translation>
 <translation id="8308637677604853869">Forrige meny</translation>
 <translation id="8341451174107936385"><ph name="UNLOCK_MORE_FEATURES" /><ph name="GET_STARTED" /></translation>
 <translation id="8351131234907093545">Opprett et notat</translation>
 <translation id="8392451568018454956">Alternativmenyen for <ph name="USER_EMAIL_ADDRESS" /></translation>
+<translation id="8394567579869570560">Forelderen din har låst denne enheten</translation>
 <translation id="8406981827175133772">Lupe for hele skjermen</translation>
 <translation id="8425213833346101688">Endre</translation>
 <translation id="8427213022735114808">Diktat sender stemmen din til Google for å muliggjøre stemmestyrt skriving i alle tekstfelt.</translation>
@@ -459,6 +467,7 @@
 <translation id="9201131092683066720">Batteriet er <ph name="PERCENTAGE" /> % fullt</translation>
 <translation id="9210037371811586452">Avslutter enhetlig skrivebordsmodus</translation>
 <translation id="9215934040295798075">Velg bakgrunn</translation>
+<translation id="921989828232331238">Forelderen din har låst enheten din for dagen</translation>
 <translation id="923686485342484400">Trykk på Control+Shift+Q to ganger for å logge av.</translation>
 <translation id="938963181863597773">Hva er i kalenderen min?</translation>
 <translation id="945522503751344254">Gi tilbakemelding</translation>
diff --git a/ash/system/status_area_widget_test_api.cc b/ash/system/status_area_widget_test_api.cc
index 55ac9b83..5a0e8a7 100644
--- a/ash/system/status_area_widget_test_api.cc
+++ b/ash/system/status_area_widget_test_api.cc
@@ -38,7 +38,7 @@
   // a bare bones event to perform the action.
   ui::TouchEvent event(
       ui::ET_TOUCH_PRESSED, gfx::Point(), base::TimeTicks::Now(),
-      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH), 0, 0.0f);
+      ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH), 0);
   widget_->select_to_speak_tray_->PerformAction(event);
   std::move(callback).Run();
 }
diff --git a/ash/wm/lock_layout_manager_unittest.cc b/ash/wm/lock_layout_manager_unittest.cc
index 00639bf..c512d1e 100644
--- a/ash/wm/lock_layout_manager_unittest.cc
+++ b/ash/wm/lock_layout_manager_unittest.cc
@@ -106,10 +106,10 @@
     DCHECK_EQ(show, keyboard->IsKeyboardVisible());
   }
 
-  void SetKeyboardOverscrollOverride(
-      keyboard::mojom::KeyboardOverscrollOverride overscroll_override) {
+  void SetKeyboardOverscrollBehavior(
+      keyboard::mojom::KeyboardOverscrollBehavior overscroll_behavior) {
     auto config = keyboard::KeyboardController::Get()->keyboard_config();
-    config.overscroll_override = overscroll_override;
+    config.overscroll_behavior = overscroll_behavior;
     keyboard::KeyboardController::Get()->UpdateKeyboardConfig(config);
   }
 };
@@ -240,8 +240,8 @@
   // When virtual keyboard overscroll is enabled keyboard bounds should not
   // affect window bounds.
   keyboard::KeyboardController* keyboard = keyboard::KeyboardController::Get();
-  SetKeyboardOverscrollOverride(
-      keyboard::mojom::KeyboardOverscrollOverride::kEnabled);
+  SetKeyboardOverscrollBehavior(
+      keyboard::mojom::KeyboardOverscrollBehavior::kEnabled);
   ShowKeyboard(true);
   EXPECT_EQ(screen_bounds.ToString(), window->GetBoundsInScreen().ToString());
   gfx::Rect keyboard_bounds = keyboard->visual_bounds_in_screen();
@@ -251,10 +251,10 @@
   // When keyboard is hidden make sure that rotating the screen gives 100% of
   // screen size to window.
   // Repro steps for http://crbug.com/401667:
-  // 1. Set up login screen defaults: VK override disabled
+  // 1. Set up login screen defaults: VK overscroll disabled
   // 2. Show/hide keyboard, make sure that no stale keyboard bounds are cached.
-  SetKeyboardOverscrollOverride(
-      keyboard::mojom::KeyboardOverscrollOverride::kDisabled);
+  SetKeyboardOverscrollBehavior(
+      keyboard::mojom::KeyboardOverscrollBehavior::kDisabled);
   ShowKeyboard(true);
   ShowKeyboard(false);
   display_manager()->SetDisplayRotation(
@@ -269,8 +269,8 @@
 
   // When virtual keyboard overscroll is disabled keyboard bounds do
   // affect window bounds.
-  SetKeyboardOverscrollOverride(
-      keyboard::mojom::KeyboardOverscrollOverride::kDisabled);
+  SetKeyboardOverscrollBehavior(
+      keyboard::mojom::KeyboardOverscrollBehavior::kDisabled);
   ShowKeyboard(true);
 
   primary_display = display::Screen::GetScreen()->GetPrimaryDisplay();
@@ -281,8 +281,8 @@
   EXPECT_EQ(target_bounds.ToString(), window->GetBoundsInScreen().ToString());
   ShowKeyboard(false);
 
-  SetKeyboardOverscrollOverride(
-      keyboard::mojom::KeyboardOverscrollOverride::kNone);
+  SetKeyboardOverscrollBehavior(
+      keyboard::mojom::KeyboardOverscrollBehavior::kDefault);
 
   keyboard->SetContainerType(keyboard::ContainerType::FLOATING,
                              base::nullopt /* target_bounds */,
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 0a48a16d..43056d2d 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1056,6 +1056,7 @@
     "win/wait_chain.h",
     "win/win_util.cc",
     "win/win_util.h",
+    "win/wincrypt_shim.h",
     "win/windows_defines.inc",
     "win/windows_types.h",
     "win/windows_undefines.inc",
@@ -2459,7 +2460,6 @@
     "task/task_scheduler/service_thread_unittest.cc",
     "task/task_scheduler/task_scheduler_impl_unittest.cc",
     "task/task_scheduler/task_tracker_unittest.cc",
-    "task/task_scheduler/task_unittest.cc",
     "task/task_scheduler/test_task_factory.cc",
     "task/task_scheduler/test_task_factory.h",
     "task/task_scheduler/test_utils.cc",
diff --git a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
index cb4589b..e9dd36d3 100644
--- a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
+++ b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
@@ -13,12 +13,14 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.content.res.ColorStateList;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.content.res.Resources.NotFoundException;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.graphics.ColorFilter;
+import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.LayerDrawable;
@@ -33,6 +35,8 @@
 import android.os.UserManager;
 import android.provider.Settings;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.widget.ImageViewCompat;
 import android.text.Html;
 import android.text.Spanned;
 import android.view.View;
@@ -40,6 +44,7 @@
 import android.view.WindowManager;
 import android.view.inputmethod.InputMethodSubtype;
 import android.view.textclassifier.TextClassifier;
+import android.widget.ImageView;
 import android.widget.TextView;
 
 import java.io.File;
@@ -469,6 +474,17 @@
         }
     }
 
+    public static void setImageTintList(
+            @NonNull ImageView view, @Nullable ColorStateList tintList) {
+        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
+            // Work around broken workaround in ImageViewCompat, see https://crbug.com/891609#c3.
+            if (tintList != null && view.getImageTintMode() == null) {
+                view.setImageTintMode(PorterDuff.Mode.SRC_IN);
+            }
+        }
+        ImageViewCompat.setImageTintList(view, tintList);
+    }
+
     /**
      * @see android.content.res.Resources#getDrawableForDensity(int id, int density).
      */
diff --git a/base/debug/activity_analyzer.cc b/base/debug/activity_analyzer.cc
index d787829..e82ef3d 100644
--- a/base/debug/activity_analyzer.cc
+++ b/base/debug/activity_analyzer.cc
@@ -118,8 +118,7 @@
   // Map the file read-write so it can guarantee consistency between
   // the analyzer and any trackers that my still be active.
   std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
-  mmfile->Initialize(file_path, MemoryMappedFile::READ_WRITE);
-  if (!mmfile->IsValid()) {
+  if (!mmfile->Initialize(file_path, MemoryMappedFile::READ_WRITE)) {
     LogAnalyzerCreationError(kInvalidMemoryMappedFile);
     return nullptr;
   }
diff --git a/base/debug/elf_reader_linux_unittest.cc b/base/debug/elf_reader_linux_unittest.cc
index 5510418..2c15299 100644
--- a/base/debug/elf_reader_linux_unittest.cc
+++ b/base/debug/elf_reader_linux_unittest.cc
@@ -55,7 +55,7 @@
 
   // Memory map the so file and use it to test reading so name.
   MemoryMappedFile file;
-  file.Initialize(FilePath(filename));
+  ASSERT_TRUE(file.Initialize(FilePath(filename)));
   const void* addr = file.data();
 #endif
 
diff --git a/base/files/memory_mapped_file.h b/base/files/memory_mapped_file.h
index 04f4336..1f73bcc 100644
--- a/base/files/memory_mapped_file.h
+++ b/base/files/memory_mapped_file.h
@@ -69,8 +69,8 @@
   // to a valid memory mapped file then this method will fail and return
   // false. If it cannot open the file, the file does not exist, or the
   // memory mapping fails, it will return false.
-  bool Initialize(const FilePath& file_name, Access access);
-  bool Initialize(const FilePath& file_name) {
+  WARN_UNUSED_RESULT bool Initialize(const FilePath& file_name, Access access);
+  WARN_UNUSED_RESULT bool Initialize(const FilePath& file_name) {
     return Initialize(file_name, READ_ONLY);
   }
 
@@ -79,8 +79,8 @@
   // of |file| and closes it when done. |file| must have been opened with
   // permissions suitable for |access|. If the memory mapping fails, it will
   // return false.
-  bool Initialize(File file, Access access);
-  bool Initialize(File file) {
+  WARN_UNUSED_RESULT bool Initialize(File file, Access access);
+  WARN_UNUSED_RESULT bool Initialize(File file) {
     return Initialize(std::move(file), READ_ONLY);
   }
 
@@ -88,8 +88,10 @@
   // |access| are allowed. If READ_WRITE_EXTEND is specified then |region|
   // provides the maximum size of the file. If the memory mapping fails, it
   // return false.
-  bool Initialize(File file, const Region& region, Access access);
-  bool Initialize(File file, const Region& region) {
+  WARN_UNUSED_RESULT bool Initialize(File file,
+                                     const Region& region,
+                                     Access access);
+  WARN_UNUSED_RESULT bool Initialize(File file, const Region& region) {
     return Initialize(std::move(file), region, READ_ONLY);
   }
 
diff --git a/base/files/memory_mapped_file_unittest.cc b/base/files/memory_mapped_file_unittest.cc
index b7acc61..3d0cfc4 100644
--- a/base/files/memory_mapped_file_unittest.cc
+++ b/base/files/memory_mapped_file_unittest.cc
@@ -63,7 +63,7 @@
   const size_t kFileSize = 68 * 1024;
   CreateTemporaryTestFile(kFileSize);
   MemoryMappedFile map;
-  map.Initialize(temp_file_path());
+  ASSERT_TRUE(map.Initialize(temp_file_path()));
   ASSERT_EQ(kFileSize, map.length());
   ASSERT_TRUE(map.data() != nullptr);
   EXPECT_TRUE(map.IsValid());
@@ -74,7 +74,8 @@
   const size_t kFileSize = 68 * 1024;
   CreateTemporaryTestFile(kFileSize);
   MemoryMappedFile map;
-  map.Initialize(File(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ));
+  ASSERT_TRUE(map.Initialize(
+      File(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ)));
   ASSERT_EQ(kFileSize, map.length());
   ASSERT_TRUE(map.data() != nullptr);
   EXPECT_TRUE(map.IsValid());
@@ -85,7 +86,7 @@
   const size_t kFileSize = 127;
   CreateTemporaryTestFile(kFileSize);
   MemoryMappedFile map;
-  map.Initialize(temp_file_path());
+  ASSERT_TRUE(map.Initialize(temp_file_path()));
   ASSERT_EQ(kFileSize, map.length());
   ASSERT_TRUE(map.data() != nullptr);
   EXPECT_TRUE(map.IsValid());
@@ -98,7 +99,8 @@
   MemoryMappedFile map;
 
   File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
-  map.Initialize(std::move(file), MemoryMappedFile::Region::kWholeFile);
+  ASSERT_TRUE(
+      map.Initialize(std::move(file), MemoryMappedFile::Region::kWholeFile));
   ASSERT_EQ(kFileSize, map.length());
   ASSERT_TRUE(map.data() != nullptr);
   EXPECT_TRUE(map.IsValid());
@@ -113,7 +115,7 @@
 
   File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
   MemoryMappedFile::Region region = {0, kPartialSize};
-  map.Initialize(std::move(file), region);
+  ASSERT_TRUE(map.Initialize(std::move(file), region));
   ASSERT_EQ(kPartialSize, map.length());
   ASSERT_TRUE(map.data() != nullptr);
   EXPECT_TRUE(map.IsValid());
@@ -129,7 +131,7 @@
 
   File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
   MemoryMappedFile::Region region = {kOffset, kPartialSize};
-  map.Initialize(std::move(file), region);
+  ASSERT_TRUE(map.Initialize(std::move(file), region));
   ASSERT_EQ(kPartialSize, map.length());
   ASSERT_TRUE(map.data() != nullptr);
   EXPECT_TRUE(map.IsValid());
@@ -146,7 +148,7 @@
 
   File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
   MemoryMappedFile::Region region = {kOffset, kPartialSize};
-  map.Initialize(std::move(file), region);
+  ASSERT_TRUE(map.Initialize(std::move(file), region));
   ASSERT_EQ(kPartialSize, map.length());
   ASSERT_TRUE(map.data() != nullptr);
   EXPECT_TRUE(map.IsValid());
@@ -163,7 +165,7 @@
 
   File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
   MemoryMappedFile::Region region = {kOffset, kPartialSize};
-  map.Initialize(std::move(file), region);
+  ASSERT_TRUE(map.Initialize(std::move(file), region));
   ASSERT_EQ(kPartialSize, map.length());
   ASSERT_TRUE(map.data() != nullptr);
   EXPECT_TRUE(map.IsValid());
@@ -176,7 +178,7 @@
 
   {
     MemoryMappedFile map;
-    map.Initialize(temp_file_path(), MemoryMappedFile::READ_WRITE);
+    ASSERT_TRUE(map.Initialize(temp_file_path(), MemoryMappedFile::READ_WRITE));
     ASSERT_EQ(kFileSize, map.length());
     ASSERT_TRUE(map.data() != nullptr);
     EXPECT_TRUE(map.IsValid());
@@ -211,8 +213,8 @@
               File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE);
     MemoryMappedFile::Region region = {0, kFileSize + kFileExtend};
     MemoryMappedFile map;
-    map.Initialize(std::move(file), region,
-                   MemoryMappedFile::READ_WRITE_EXTEND);
+    ASSERT_TRUE(map.Initialize(std::move(file), region,
+                               MemoryMappedFile::READ_WRITE_EXTEND));
     EXPECT_EQ(kFileSize + kFileExtend, map.length());
     ASSERT_TRUE(map.data() != nullptr);
     EXPECT_TRUE(map.IsValid());
diff --git a/base/metrics/bucket_ranges.cc b/base/metrics/bucket_ranges.cc
index 39b37932..2723c3e 100644
--- a/base/metrics/bucket_ranges.cc
+++ b/base/metrics/bucket_ranges.cc
@@ -74,7 +74,8 @@
 // the CRC correct for big-endian vs little-ending calculations.  All we need is
 // a nice hash, that tends to depend on all the bits of the sample, with very
 // little chance of changes in one place impacting changes in another place.
-static uint32_t Crc32(uint32_t sum, HistogramBase::Sample value) {
+// Temporary non-static for https://crbug.com/836238
+/*static*/ uint32_t Crc32(uint32_t sum, HistogramBase::Sample value) {
   union {
     HistogramBase::Sample range;
     unsigned char bytes[sizeof(HistogramBase::Sample)];
diff --git a/base/metrics/bucket_ranges.h b/base/metrics/bucket_ranges.h
index 1b6d069b..476d2df 100644
--- a/base/metrics/bucket_ranges.h
+++ b/base/metrics/bucket_ranges.h
@@ -99,6 +99,7 @@
 //////////////////////////////////////////////////////////////////////////////
 // Expose only for test.
 BASE_EXPORT extern const uint32_t kCrcTable[256];
+uint32_t Crc32(uint32_t sum, HistogramBase::Sample value);
 
 }  // namespace base
 
diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc
index bf7d7c9e..919dad6 100644
--- a/base/metrics/histogram.cc
+++ b/base/metrics/histogram.cc
@@ -465,6 +465,16 @@
   Sample current = minimum;
   ranges->set_range(bucket_index, current);
   size_t bucket_count = ranges->bucket_count();
+
+  // Temporary for https://crbug.com/836238
+  uint32_t checksum = static_cast<uint32_t>(bucket_count + 1);
+  checksum = Crc32(checksum, 0);
+  checksum = Crc32(checksum, current);
+  debug::Alias(&minimum);
+  debug::Alias(&maximum);
+  debug::Alias(&bucket_count);
+  debug::Alias(&checksum);
+
   while (bucket_count > ++bucket_index) {
     double log_current;
     log_current = log(static_cast<double>(current));
@@ -479,9 +489,12 @@
     else
       ++current;  // Just do a narrow bucket, and keep trying.
     ranges->set_range(bucket_index, current);
+    checksum = Crc32(checksum, current);
   }
   ranges->set_range(ranges->bucket_count(), HistogramBase::kSampleType_MAX);
   ranges->ResetChecksum();
+  checksum = Crc32(checksum, HistogramBase::kSampleType_MAX);
+  CHECK_EQ(checksum, ranges->checksum());
 }
 
 // static
@@ -1094,7 +1107,7 @@
 
 const std::string LinearHistogram::GetAsciiBucketRange(uint32_t i) const {
   int range = ranges(i);
-  auto it = bucket_description_.find(range);
+  BucketDescriptionMap::const_iterator it = bucket_description_.find(range);
   if (it == bucket_description_.end())
     return Histogram::GetAsciiBucketRange(i);
   return it->second;
@@ -1111,13 +1124,33 @@
   double min = minimum;
   double max = maximum;
   size_t bucket_count = ranges->bucket_count();
+
+  // Temporary for https://crbug.com/836238
+  bool is_enum = (minimum == 1 &&
+                  static_cast<Sample>(bucket_count) == maximum - minimum + 2);
+  uint32_t checksum = static_cast<uint32_t>(bucket_count + 1);
+  checksum = Crc32(checksum, 0);
+  debug::Alias(&minimum);
+  debug::Alias(&maximum);
+  debug::Alias(&min);
+  debug::Alias(&max);
+  debug::Alias(&bucket_count);
+  debug::Alias(&checksum);
+  debug::Alias(&is_enum);
+
   for (size_t i = 1; i < bucket_count; ++i) {
     double linear_range =
         (min * (bucket_count - 1 - i) + max * (i - 1)) / (bucket_count - 2);
-    ranges->set_range(i, static_cast<Sample>(linear_range + 0.5));
+    uint32_t range = static_cast<Sample>(linear_range + 0.5);
+    if (is_enum)
+      CHECK_EQ(static_cast<uint32_t>(i), range);
+    ranges->set_range(i, range);
+    checksum = Crc32(checksum, range);
   }
   ranges->set_range(ranges->bucket_count(), HistogramBase::kSampleType_MAX);
   ranges->ResetChecksum();
+  checksum = Crc32(checksum, HistogramBase::kSampleType_MAX);
+  CHECK_EQ(checksum, ranges->checksum());
 }
 
 // static
diff --git a/base/metrics/persistent_histogram_allocator.cc b/base/metrics/persistent_histogram_allocator.cc
index cb01c410..2f96a6b 100644
--- a/base/metrics/persistent_histogram_allocator.cc
+++ b/base/metrics/persistent_histogram_allocator.cc
@@ -687,14 +687,15 @@
                  File::FLAG_READ | File::FLAG_WRITE);
 
   std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
+  bool success = false;
   if (exists) {
     size = saturated_cast<size_t>(file.GetLength());
-    mmfile->Initialize(std::move(file), MemoryMappedFile::READ_WRITE);
+    success = mmfile->Initialize(std::move(file), MemoryMappedFile::READ_WRITE);
   } else {
-    mmfile->Initialize(std::move(file), {0, size},
-                       MemoryMappedFile::READ_WRITE_EXTEND);
+    success = mmfile->Initialize(std::move(file), {0, size},
+                                 MemoryMappedFile::READ_WRITE_EXTEND);
   }
-  if (!mmfile->IsValid() ||
+  if (!success ||
       !FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, true)) {
     return false;
   }
@@ -844,9 +845,8 @@
       return false;
 
     MemoryMappedFile mmfile;
-    mmfile.Initialize(std::move(spare_file), {0, size},
-                      MemoryMappedFile::READ_WRITE_EXTEND);
-    success = mmfile.IsValid();
+    success = mmfile.Initialize(std::move(spare_file), {0, size},
+                                MemoryMappedFile::READ_WRITE_EXTEND);
   }
 
   if (success)
diff --git a/base/metrics/persistent_memory_allocator_unittest.cc b/base/metrics/persistent_memory_allocator_unittest.cc
index 75e4faa..c1a6984 100644
--- a/base/metrics/persistent_memory_allocator_unittest.cc
+++ b/base/metrics/persistent_memory_allocator_unittest.cc
@@ -747,7 +747,7 @@
   }
 
   std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
-  mmfile->Initialize(file_path);
+  ASSERT_TRUE(mmfile->Initialize(file_path));
   EXPECT_TRUE(mmfile->IsValid());
   const size_t mmlength = mmfile->length();
   EXPECT_GE(meminfo1.total, mmlength);
@@ -805,9 +805,9 @@
   // Map it as an extendable read/write file and append to it.
   {
     std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
-    mmfile->Initialize(
+    ASSERT_TRUE(mmfile->Initialize(
         File(file_path, File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE),
-        region, MemoryMappedFile::READ_WRITE_EXTEND);
+        region, MemoryMappedFile::READ_WRITE_EXTEND));
     FilePersistentMemoryAllocator allocator(std::move(mmfile), region.size, 0,
                                             "", false);
     EXPECT_EQ(static_cast<size_t>(before_size), allocator.used());
@@ -824,9 +824,9 @@
   // Verify that it's still an acceptable file.
   {
     std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
-    mmfile->Initialize(
+    ASSERT_TRUE(mmfile->Initialize(
         File(file_path, File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE),
-        region, MemoryMappedFile::READ_WRITE_EXTEND);
+        region, MemoryMappedFile::READ_WRITE_EXTEND));
     EXPECT_TRUE(FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, true));
     EXPECT_TRUE(
         FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, false));
@@ -869,7 +869,7 @@
         read_only ? MemoryMappedFile::READ_ONLY : MemoryMappedFile::READ_WRITE;
 
     mmfile.reset(new MemoryMappedFile());
-    mmfile->Initialize(File(file_path, file_flags), map_access);
+    ASSERT_TRUE(mmfile->Initialize(File(file_path, file_flags), map_access));
     EXPECT_EQ(filesize, mmfile->length());
     if (FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, read_only)) {
       // Make sure construction doesn't crash. It will, however, cause
@@ -911,7 +911,7 @@
     ASSERT_TRUE(PathExists(file_path));
 
     mmfile.reset(new MemoryMappedFile());
-    mmfile->Initialize(File(file_path, file_flags), map_access);
+    ASSERT_TRUE(mmfile->Initialize(File(file_path, file_flags), map_access));
     EXPECT_EQ(filesize, mmfile->length());
     if (FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, read_only)) {
       // Make sure construction doesn't crash. It will, however, cause
@@ -967,12 +967,12 @@
       SCOPED_TRACE(StringPrintf("read_only=%s", read_only ? "true" : "false"));
 
       std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
-      mmfile->Initialize(
+      ASSERT_TRUE(mmfile->Initialize(
           File(file_path, File::FLAG_OPEN |
                               (read_only ? File::FLAG_READ
                                          : File::FLAG_READ | File::FLAG_WRITE)),
           read_only ? MemoryMappedFile::READ_ONLY
-                    : MemoryMappedFile::READ_WRITE);
+                    : MemoryMappedFile::READ_WRITE));
       ASSERT_TRUE(
           FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, read_only));
 
diff --git a/base/task/task_scheduler/delayed_task_manager_unittest.cc b/base/task/task_scheduler/delayed_task_manager_unittest.cc
index 4f1b6a9..1ea05f99 100644
--- a/base/task/task_scheduler/delayed_task_manager_unittest.cc
+++ b/base/task/task_scheduler/delayed_task_manager_unittest.cc
@@ -37,8 +37,7 @@
 Task ConstructMockedTask(testing::StrictMock<MockTask>& mock_task,
                          TimeTicks now,
                          TimeDelta delay) {
-  Task task = Task(FROM_HERE, BindOnce(&MockTask::Run, Unretained(&mock_task)),
-                   TaskTraits(), delay);
+  Task task(FROM_HERE, BindOnce(&MockTask::Run, Unretained(&mock_task)), delay);
   // The constructor of Task computes |delayed_run_time| by adding |delay| to
   // the real time. Recompute it by adding |delay| to the given |now| (usually
   // mock time).
diff --git a/base/task/task_scheduler/priority_queue_unittest.cc b/base/task/task_scheduler/priority_queue_unittest.cc
index f8a5212..4d77916 100644
--- a/base/task/task_scheduler/priority_queue_unittest.cc
+++ b/base/task/task_scheduler/priority_queue_unittest.cc
@@ -57,28 +57,24 @@
 
 TEST(TaskSchedulerPriorityQueueTest, PushPopPeek) {
   // Create test sequences.
-  scoped_refptr<Sequence> sequence_a(new Sequence);
-  sequence_a->PushTask(Task(FROM_HERE, DoNothing(),
-                            TaskTraits(TaskPriority::USER_VISIBLE),
-                            TimeDelta()));
+  scoped_refptr<Sequence> sequence_a =
+      MakeRefCounted<Sequence>(TaskTraits(TaskPriority::USER_VISIBLE));
+  sequence_a->PushTask(Task(FROM_HERE, DoNothing(), TimeDelta()));
   SequenceSortKey sort_key_a = sequence_a->GetSortKey();
 
-  scoped_refptr<Sequence> sequence_b(new Sequence);
-  sequence_b->PushTask(Task(FROM_HERE, DoNothing(),
-                            TaskTraits(TaskPriority::USER_BLOCKING),
-                            TimeDelta()));
+  scoped_refptr<Sequence> sequence_b =
+      MakeRefCounted<Sequence>(TaskTraits(TaskPriority::USER_BLOCKING));
+  sequence_b->PushTask(Task(FROM_HERE, DoNothing(), TimeDelta()));
   SequenceSortKey sort_key_b = sequence_b->GetSortKey();
 
-  scoped_refptr<Sequence> sequence_c(new Sequence);
-  sequence_c->PushTask(Task(FROM_HERE, DoNothing(),
-                            TaskTraits(TaskPriority::USER_BLOCKING),
-                            TimeDelta()));
+  scoped_refptr<Sequence> sequence_c =
+      MakeRefCounted<Sequence>(TaskTraits(TaskPriority::USER_BLOCKING));
+  sequence_c->PushTask(Task(FROM_HERE, DoNothing(), TimeDelta()));
   SequenceSortKey sort_key_c = sequence_c->GetSortKey();
 
-  scoped_refptr<Sequence> sequence_d(new Sequence);
-  sequence_d->PushTask(Task(FROM_HERE, DoNothing(),
-                            TaskTraits(TaskPriority::BEST_EFFORT),
-                            TimeDelta()));
+  scoped_refptr<Sequence> sequence_d =
+      MakeRefCounted<Sequence>(TaskTraits(TaskPriority::BEST_EFFORT));
+  sequence_d->PushTask(Task(FROM_HERE, DoNothing(), TimeDelta()));
   SequenceSortKey sort_key_d = sequence_d->GetSortKey();
 
   // Create a PriorityQueue and a Transaction.
diff --git a/base/task/task_scheduler/scheduler_single_thread_task_runner_manager.cc b/base/task/task_scheduler/scheduler_single_thread_task_runner_manager.cc
index f7882167..ffea4d9d 100644
--- a/base/task/task_scheduler/scheduler_single_thread_task_runner_manager.cc
+++ b/base/task/task_scheduler/scheduler_single_thread_task_runner_manager.cc
@@ -16,6 +16,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/atomic_flag.h"
 #include "base/task/task_scheduler/delayed_task_manager.h"
+#include "base/task/task_scheduler/priority_queue.h"
 #include "base/task/task_scheduler/scheduler_worker.h"
 #include "base/task/task_scheduler/sequence.h"
 #include "base/task/task_scheduler/task.h"
@@ -102,24 +103,19 @@
   }
 
   scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override {
-    AutoSchedulerLock auto_lock(sequence_lock_);
-    bool has_work = has_work_;
-    has_work_ = false;
-    return has_work ? sequence_ : nullptr;
+    std::unique_ptr<PriorityQueue::Transaction> transaction(
+        priority_queue_.BeginTransaction());
+    return transaction->IsEmpty() ? nullptr : transaction->PopSequence();
   }
 
   void DidRunTask() override {}
 
   void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override {
-    AutoSchedulerLock auto_lock(sequence_lock_);
-    // We've shut down, so no-op this work request. Any sequence cleanup will
-    // occur in the caller's context.
-    if (!sequence_)
-      return;
-
-    DCHECK_EQ(sequence, sequence_);
-    DCHECK(!has_work_);
-    has_work_ = true;
+    DCHECK(sequence);
+    const SequenceSortKey sequence_sort_key = sequence->GetSortKey();
+    std::unique_ptr<PriorityQueue::Transaction> transaction(
+        priority_queue_.BeginTransaction());
+    transaction->Push(std::move(sequence), sequence_sort_key);
   }
 
   TimeDelta GetSleepTimeout() override { return TimeDelta::Max(); }
@@ -130,27 +126,7 @@
     return thread_ref_checker_.IsCurrentThreadSameAsSetThread();
   }
 
-  void OnMainExit(SchedulerWorker* /* worker */) override {
-    // Move |sequence_| to |local_sequence| so that if we have the last
-    // reference to the sequence we don't destroy it (and its tasks) within
-    // |sequence_lock_|.
-    scoped_refptr<Sequence> local_sequence;
-    {
-      AutoSchedulerLock auto_lock(sequence_lock_);
-      // To reclaim skipped tasks on shutdown, we null out the sequence to allow
-      // the tasks to destroy themselves.
-      local_sequence = std::move(sequence_);
-    }
-  }
-
-  // SchedulerWorkerDelegate:
-
-  // Consumers should release their sequence reference as soon as possible to
-  // ensure timely cleanup for general shutdown.
-  scoped_refptr<Sequence> sequence() {
-    AutoSchedulerLock auto_lock(sequence_lock_);
-    return sequence_;
-  }
+  void OnMainExit(SchedulerWorker* /* worker */) override {}
 
  private:
   const std::string thread_name_;
@@ -161,11 +137,7 @@
   // OnMainEntry() and OnCanScheduleSequence() (called when a sequence held up
   // by WillScheduleSequence() in PostTaskNow() can be scheduled).
   SchedulerWorker* worker_ = nullptr;
-
-  // Synchronizes access to |sequence_| and |has_work_|.
-  SchedulerLock sequence_lock_;
-  scoped_refptr<Sequence> sequence_ = new Sequence;
-  bool has_work_ = false;
+  PriorityQueue priority_queue_;
 
   AtomicThreadRefChecker thread_ref_checker_;
 
@@ -248,8 +220,9 @@
                                    DispatchMessage(&msg);
                                  },
                                  std::move(msg)),
-                             TaskTraits(MayBlock()), TimeDelta());
-      if (task_tracker_->WillPostTask(&pump_message_task)) {
+                             TimeDelta());
+      if (task_tracker_->WillPostTask(&pump_message_task,
+                                      TaskShutdownBehavior::SKIP_ON_SHUTDOWN)) {
         bool was_empty =
             message_pump_sequence_->PushTask(std::move(pump_message_task));
         DCHECK(was_empty) << "GetWorkFromWindowsMessageQueue() does not expect "
@@ -261,7 +234,8 @@
   }
 
   bool get_work_first_ = true;
-  const scoped_refptr<Sequence> message_pump_sequence_ = new Sequence;
+  const scoped_refptr<Sequence> message_pump_sequence_ =
+      MakeRefCounted<Sequence>(TaskTraits(MayBlock()));
   const TrackedRef<TaskTracker> task_tracker_;
   std::unique_ptr<win::ScopedCOMInitializer> scoped_com_initializer_;
 
@@ -283,9 +257,9 @@
       SchedulerWorker* worker,
       SingleThreadTaskRunnerThreadMode thread_mode)
       : outer_(outer),
-        traits_(traits),
         worker_(worker),
-        thread_mode_(thread_mode) {
+        thread_mode_(thread_mode),
+        sequence_(MakeRefCounted<Sequence>(traits)) {
     DCHECK(outer_);
     DCHECK(worker_);
   }
@@ -297,11 +271,13 @@
     if (!g_manager_is_alive)
       return false;
 
-    Task task(from_here, std::move(closure), traits_, delay);
+    Task task(from_here, std::move(closure), delay);
     task.single_thread_task_runner_ref = this;
 
-    if (!outer_->task_tracker_->WillPostTask(&task))
+    if (!outer_->task_tracker_->WillPostTask(
+            &task, sequence_->traits().shutdown_behavior())) {
       return false;
+    }
 
     if (task.delayed_run_time.is_null()) {
       PostTaskNow(std::move(task));
@@ -354,18 +330,11 @@
   }
 
   void PostTaskNow(Task task) {
-    scoped_refptr<Sequence> sequence = GetDelegate()->sequence();
-    // If |sequence| is null, then the thread is effectively gone (either
-    // shutdown or joined).
-    if (!sequence)
-      return;
-
-    const bool sequence_was_empty = sequence->PushTask(std::move(task));
+    const bool sequence_was_empty = sequence_->PushTask(std::move(task));
     if (sequence_was_empty) {
-      sequence = outer_->task_tracker_->WillScheduleSequence(
-          std::move(sequence), GetDelegate());
-      if (sequence) {
-        GetDelegate()->ReEnqueueSequence(std::move(sequence));
+      if (outer_->task_tracker_->WillScheduleSequence(sequence_,
+                                                      GetDelegate())) {
+        GetDelegate()->ReEnqueueSequence(sequence_);
         worker_->WakeUp();
       }
     }
@@ -376,9 +345,9 @@
   }
 
   SchedulerSingleThreadTaskRunnerManager* const outer_;
-  const TaskTraits traits_;
   SchedulerWorker* const worker_;
   const SingleThreadTaskRunnerThreadMode thread_mode_;
+  const scoped_refptr<Sequence> sequence_;
 
   DISALLOW_COPY_AND_ASSIGN(SchedulerSingleThreadTaskRunner);
 };
diff --git a/base/task/task_scheduler/scheduler_worker_pool.cc b/base/task/task_scheduler/scheduler_worker_pool.cc
index 0b497650..90cc13a2 100644
--- a/base/task/task_scheduler/scheduler_worker_pool.cc
+++ b/base/task/task_scheduler/scheduler_worker_pool.cc
@@ -62,8 +62,8 @@
 
     // Post the task as part of a one-off single-task Sequence.
     return worker_pool_->PostTaskWithSequence(
-        Task(from_here, std::move(closure), traits_, delay),
-        MakeRefCounted<Sequence>());
+        Task(from_here, std::move(closure), delay),
+        MakeRefCounted<Sequence>(traits_));
   }
 
   bool RunsTasksInCurrentSequence() const override {
@@ -87,7 +87,7 @@
   // TODO(robliao): Find a concrete way to manage |worker_pool|'s memory.
   SchedulerSequencedTaskRunner(const TaskTraits& traits,
                                SchedulerWorkerPool* worker_pool)
-      : traits_(traits), worker_pool_(worker_pool) {
+      : sequence_(MakeRefCounted<Sequence>(traits)), worker_pool_(worker_pool) {
     DCHECK(worker_pool_);
   }
 
@@ -98,7 +98,7 @@
     if (!g_active_pools_count)
       return false;
 
-    Task task(from_here, std::move(closure), traits_, delay);
+    Task task(from_here, std::move(closure), delay);
     task.sequenced_task_runner_ref = this;
 
     // Post the task as part of |sequence_|.
@@ -120,9 +120,7 @@
   ~SchedulerSequencedTaskRunner() override = default;
 
   // Sequence for all Tasks posted through this TaskRunner.
-  const scoped_refptr<Sequence> sequence_ = MakeRefCounted<Sequence>();
-
-  const TaskTraits traits_;
+  const scoped_refptr<Sequence> sequence_;
   SchedulerWorkerPool* const worker_pool_;
 
   DISALLOW_COPY_AND_ASSIGN(SchedulerSequencedTaskRunner);
@@ -145,8 +143,10 @@
   DCHECK(task.task);
   DCHECK(sequence);
 
-  if (!task_tracker_->WillPostTask(&task))
+  if (!task_tracker_->WillPostTask(&task,
+                                   sequence->traits().shutdown_behavior())) {
     return false;
+  }
 
   if (task.delayed_run_time.is_null()) {
     PostTaskWithSequenceNow(std::move(task), std::move(sequence));
diff --git a/base/task/task_scheduler/scheduler_worker_unittest.cc b/base/task/task_scheduler/scheduler_worker_unittest.cc
index 8c7b3ea9..efe25f2 100644
--- a/base/task/task_scheduler/scheduler_worker_unittest.cc
+++ b/base/task/task_scheduler/scheduler_worker_unittest.cc
@@ -180,13 +180,14 @@
       }
 
       // Create a Sequence with TasksPerSequence() Tasks.
-      scoped_refptr<Sequence> sequence(new Sequence);
+      scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>(TaskTraits());
       for (size_t i = 0; i < outer_->TasksPerSequence(); ++i) {
         Task task(FROM_HERE,
                   BindOnce(&TaskSchedulerWorkerTest::RunTaskCallback,
                            Unretained(outer_)),
-                  TaskTraits(), TimeDelta());
-        EXPECT_TRUE(outer_->task_tracker_.WillPostTask(&task));
+                  TimeDelta());
+        EXPECT_TRUE(outer_->task_tracker_.WillPostTask(
+            &task, sequence->traits().shutdown_behavior()));
         sequence->PushTask(std::move(task));
       }
 
@@ -440,7 +441,8 @@
     }
 
     controls_->work_requested_ = true;
-    scoped_refptr<Sequence> sequence(new Sequence);
+    scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>(TaskTraits(
+        WithBaseSyncPrimitives(), TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
     Task task(
         FROM_HERE,
         BindOnce(
@@ -450,9 +452,9 @@
             },
             Unretained(&controls_->work_processed_),
             Unretained(&controls_->work_running_)),
-        {WithBaseSyncPrimitives(), TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
         TimeDelta());
-    EXPECT_TRUE(task_tracker_->WillPostTask(&task));
+    EXPECT_TRUE(task_tracker_->WillPostTask(
+        &task, sequence->traits().shutdown_behavior()));
     sequence->PushTask(std::move(task));
     sequence =
         task_tracker_->WillScheduleSequence(std::move(sequence), nullptr);
diff --git a/base/task/task_scheduler/sequence.cc b/base/task/task_scheduler/sequence.cc
index 6bb04b2..885bd92a 100644
--- a/base/task/task_scheduler/sequence.cc
+++ b/base/task/task_scheduler/sequence.cc
@@ -6,13 +6,14 @@
 
 #include <utility>
 
+#include "base/critical_closure.h"
 #include "base/logging.h"
 #include "base/time/time.h"
 
 namespace base {
 namespace internal {
 
-Sequence::Sequence() = default;
+Sequence::Sequence(const TaskTraits& traits) : traits_(traits) {}
 
 bool Sequence::PushTask(Task task) {
   // Use CHECK instead of DCHECK to crash earlier. See http://crbug.com/711167
@@ -21,8 +22,12 @@
   DCHECK(task.sequenced_time.is_null());
   task.sequenced_time = base::TimeTicks::Now();
 
+  task.task =
+      traits_.shutdown_behavior() == TaskShutdownBehavior::BLOCK_SHUTDOWN
+          ? MakeCriticalClosure(std::move(task.task))
+          : std::move(task.task);
+
   AutoSchedulerLock auto_lock(lock_);
-  ++num_tasks_per_priority_[static_cast<int>(task.traits.priority())];
   queue_.push(std::move(task));
 
   // Return true if the sequence was empty before the push.
@@ -34,10 +39,6 @@
   DCHECK(!queue_.empty());
   DCHECK(queue_.front().task);
 
-  const int priority_index = static_cast<int>(queue_.front().traits.priority());
-  DCHECK_GT(num_tasks_per_priority_[priority_index], 0U);
-  --num_tasks_per_priority_[priority_index];
-
   return std::move(queue_.front());
 }
 
@@ -50,28 +51,17 @@
 }
 
 SequenceSortKey Sequence::GetSortKey() const {
-  TaskPriority priority = TaskPriority::LOWEST;
   base::TimeTicks next_task_sequenced_time;
 
   {
     AutoSchedulerLock auto_lock(lock_);
     DCHECK(!queue_.empty());
 
-    // Find the highest task priority in the sequence.
-    const int highest_priority_index = static_cast<int>(TaskPriority::HIGHEST);
-    const int lowest_priority_index = static_cast<int>(TaskPriority::LOWEST);
-    for (int i = highest_priority_index; i > lowest_priority_index; --i) {
-      if (num_tasks_per_priority_[i] > 0) {
-        priority = static_cast<TaskPriority>(i);
-        break;
-      }
-    }
-
     // Save the sequenced time of the next task in the sequence.
     next_task_sequenced_time = queue_.front().sequenced_time;
   }
 
-  return SequenceSortKey(priority, next_task_sequenced_time);
+  return SequenceSortKey(traits_.priority(), next_task_sequenced_time);
 }
 
 Sequence::~Sequence() = default;
diff --git a/base/task/task_scheduler/sequence.h b/base/task/task_scheduler/sequence.h
index 14dd42ad..6aab70c 100644
--- a/base/task/task_scheduler/sequence.h
+++ b/base/task/task_scheduler/sequence.h
@@ -16,6 +16,7 @@
 #include "base/task/task_scheduler/scheduler_lock.h"
 #include "base/task/task_scheduler/sequence_sort_key.h"
 #include "base/task/task_scheduler/task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/sequence_local_storage_map.h"
 
 namespace base {
@@ -41,7 +42,8 @@
 // This class is thread-safe.
 class BASE_EXPORT Sequence : public RefCountedThreadSafe<Sequence> {
  public:
-  Sequence();
+  // |traits| is metadata that applies to all Tasks in the Sequence.
+  explicit Sequence(const TaskTraits& traits);
 
   // Adds |task| in a new slot at the end of the Sequence. Returns true if the
   // Sequence was empty before this operation.
@@ -74,6 +76,9 @@
     return &sequence_local_storage_;
   }
 
+  // Returns the TaskTraits for all Tasks in the Sequence.
+  TaskTraits traits() const { return traits_; }
+
  private:
   friend class RefCountedThreadSafe<Sequence>;
   ~Sequence();
@@ -86,13 +91,12 @@
   // Queue of tasks to execute.
   base::queue<Task> queue_;
 
-  // Number of tasks contained in the Sequence for each priority.
-  size_t num_tasks_per_priority_[static_cast<int>(TaskPriority::HIGHEST) + 1] =
-      {};
-
   // Holds data stored through the SequenceLocalStorageSlot API.
   SequenceLocalStorageMap sequence_local_storage_;
 
+  // The TaskTraits of all Tasks in the Sequence.
+  const TaskTraits traits_;
+
   DISALLOW_COPY_AND_ASSIGN(Sequence);
 };
 
diff --git a/base/task/task_scheduler/sequence_unittest.cc b/base/task/task_scheduler/sequence_unittest.cc
index 324784b3..469da6cc 100644
--- a/base/task/task_scheduler/sequence_unittest.cc
+++ b/base/task/task_scheduler/sequence_unittest.cc
@@ -26,7 +26,7 @@
 
 Task CreateTask(MockTask* mock_task) {
   return Task(FROM_HERE, BindOnce(&MockTask::Run, Unretained(mock_task)),
-              {TaskPriority::BEST_EFFORT}, TimeDelta());
+              TimeDelta());
 }
 
 void ExpectMockTask(MockTask* mock_task, Task* task) {
@@ -44,7 +44,8 @@
   testing::StrictMock<MockTask> mock_task_d;
   testing::StrictMock<MockTask> mock_task_e;
 
-  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>();
+  scoped_refptr<Sequence> sequence =
+      MakeRefCounted<Sequence>(TaskTraits(TaskPriority::BEST_EFFORT));
 
   // Push task A in the sequence. PushTask() should return true since it's the
   // first task->
@@ -94,12 +95,12 @@
   EXPECT_TRUE(sequence->Pop());
 }
 
-// Verifies the sort key of a sequence that contains one BEST_EFFORT task.
+// Verifies the sort key of a BEST_EFFORT sequence that contains one task.
 TEST(TaskSchedulerSequenceTest, GetSortKeyBestEffort) {
-  // Create a sequence with a BEST_EFFORT task.
-  Task best_effort_task(FROM_HERE, DoNothing(), {TaskPriority::BEST_EFFORT},
-                        TimeDelta());
-  scoped_refptr<Sequence> best_effort_sequence = MakeRefCounted<Sequence>();
+  // Create a BEST_EFFORT sequence with a task.
+  Task best_effort_task(FROM_HERE, DoNothing(), TimeDelta());
+  scoped_refptr<Sequence> best_effort_sequence =
+      MakeRefCounted<Sequence>(TaskTraits(TaskPriority::BEST_EFFORT));
   best_effort_sequence->PushTask(std::move(best_effort_task));
 
   // Get the sort key.
@@ -120,12 +121,12 @@
 }
 
 // Same as TaskSchedulerSequenceTest.GetSortKeyBestEffort, but with a
-// USER_VISIBLE task.
+// USER_VISIBLE sequence.
 TEST(TaskSchedulerSequenceTest, GetSortKeyForeground) {
-  // Create a sequence with a USER_VISIBLE task.
-  Task foreground_task(FROM_HERE, DoNothing(), {TaskPriority::USER_VISIBLE},
-                       TimeDelta());
-  scoped_refptr<Sequence> foreground_sequence = MakeRefCounted<Sequence>();
+  // Create a USER_VISIBLE sequence with a task.
+  Task foreground_task(FROM_HERE, DoNothing(), TimeDelta());
+  scoped_refptr<Sequence> foreground_sequence =
+      MakeRefCounted<Sequence>(TaskTraits(TaskPriority::USER_VISIBLE));
   foreground_sequence->PushTask(std::move(foreground_task));
 
   // Get the sort key.
@@ -147,8 +148,8 @@
 // Verify that a DCHECK fires if Pop() is called on a sequence whose front slot
 // isn't empty.
 TEST(TaskSchedulerSequenceTest, PopNonEmptyFrontSlot) {
-  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>();
-  sequence->PushTask(Task(FROM_HERE, DoNothing(), TaskTraits(), TimeDelta()));
+  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>(TaskTraits());
+  sequence->PushTask(Task(FROM_HERE, DoNothing(), TimeDelta()));
 
   EXPECT_DCHECK_DEATH({ sequence->Pop(); });
 }
@@ -156,8 +157,8 @@
 // Verify that a DCHECK fires if TakeTask() is called on a sequence whose front
 // slot is empty.
 TEST(TaskSchedulerSequenceTest, TakeEmptyFrontSlot) {
-  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>();
-  sequence->PushTask(Task(FROM_HERE, DoNothing(), TaskTraits(), TimeDelta()));
+  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>(TaskTraits());
+  sequence->PushTask(Task(FROM_HERE, DoNothing(), TimeDelta()));
 
   EXPECT_TRUE(sequence->TakeTask());
   EXPECT_DCHECK_DEATH({ sequence->TakeTask(); });
@@ -165,7 +166,7 @@
 
 // Verify that a DCHECK fires if TakeTask() is called on an empty sequence.
 TEST(TaskSchedulerSequenceTest, TakeEmptySequence) {
-  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>();
+  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>(TaskTraits());
   EXPECT_DCHECK_DEATH({ sequence->TakeTask(); });
 }
 
diff --git a/base/task/task_scheduler/task.cc b/base/task/task_scheduler/task.cc
index 978d013..3ccf460 100644
--- a/base/task/task_scheduler/task.cc
+++ b/base/task/task_scheduler/task.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/atomic_sequence_num.h"
-#include "base/critical_closure.h"
 
 namespace base {
 namespace internal {
@@ -18,25 +17,11 @@
 
 }  // namespace
 
-Task::Task(const Location& posted_from,
-           OnceClosure task,
-           const TaskTraits& traits,
-           TimeDelta delay)
-    : PendingTask(
-          posted_from,
-          traits.shutdown_behavior() == TaskShutdownBehavior::BLOCK_SHUTDOWN
-              ? MakeCriticalClosure(std::move(task))
-              : std::move(task),
-          delay.is_zero() ? TimeTicks() : TimeTicks::Now() + delay,
-          Nestable::kNonNestable),
-      // Prevent a delayed BLOCK_SHUTDOWN task from blocking shutdown before it
-      // starts running by changing its shutdown behavior to SKIP_ON_SHUTDOWN.
-      traits(
-          (!delay.is_zero() &&
-           traits.shutdown_behavior() == TaskShutdownBehavior::BLOCK_SHUTDOWN)
-              ? TaskTraits::Override(traits,
-                                     {TaskShutdownBehavior::SKIP_ON_SHUTDOWN})
-              : traits),
+Task::Task(const Location& posted_from, OnceClosure task, TimeDelta delay)
+    : PendingTask(posted_from,
+                  std::move(task),
+                  delay.is_zero() ? TimeTicks() : TimeTicks::Now() + delay,
+                  Nestable::kNonNestable),
       delay(delay) {
   // TaskScheduler doesn't use |sequence_num| but tracing (toplevel.flow) relies
   // on it being unique. While this subtle dependency is a bit overreaching,
@@ -51,7 +36,6 @@
 // this case.
 Task::Task(Task&& other) noexcept
     : PendingTask(std::move(other)),
-      traits(other.traits),
       delay(other.delay),
       sequenced_time(other.sequenced_time),
       sequenced_task_runner_ref(std::move(other.sequenced_task_runner_ref)),
diff --git a/base/task/task_scheduler/task.h b/base/task/task_scheduler/task.h
index 5764e2e..e4d9c7f2 100644
--- a/base/task/task_scheduler/task.h
+++ b/base/task/task_scheduler/task.h
@@ -13,7 +13,6 @@
 #include "base/pending_task.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/task_traits.h"
 #include "base/time/time.h"
 
 namespace base {
@@ -23,13 +22,9 @@
 // profiling inherited from PendingTask.
 struct BASE_EXPORT Task : public PendingTask {
   // |posted_from| is the site the task was posted from. |task| is the closure
-  // to run. |traits_in| is metadata about the task. |delay| is a delay that
-  // must expire before the Task runs. If |delay| is non-zero and the shutdown
-  // behavior in |traits| is BLOCK_SHUTDOWN, the shutdown behavior is
-  // automatically adjusted to SKIP_ON_SHUTDOWN.
+  // to run. |delay| is a delay that must expire before the Task runs.
   Task(const Location& posted_from,
        OnceClosure task,
-       const TaskTraits& traits,
        TimeDelta delay);
 
   // Task is move-only to avoid mistakes that cause reference counts to be
@@ -40,9 +35,6 @@
 
   Task& operator=(Task&& other);
 
-  // The TaskTraits of this task.
-  TaskTraits traits;
-
   // The delay that must expire before the task runs.
   TimeDelta delay;
 
diff --git a/base/task/task_scheduler/task_scheduler_impl.cc b/base/task/task_scheduler/task_scheduler_impl.cc
index c6f55aac..06226b9 100644
--- a/base/task/task_scheduler/task_scheduler_impl.cc
+++ b/base/task/task_scheduler/task_scheduler_impl.cc
@@ -184,9 +184,8 @@
   // Post |task| as part of a one-off single-task Sequence.
   const TaskTraits new_traits = SetUserBlockingPriorityIfNeeded(traits);
   return GetWorkerPoolForTraits(new_traits)
-      ->PostTaskWithSequence(
-          Task(from_here, std::move(task), new_traits, delay),
-          MakeRefCounted<Sequence>());
+      ->PostTaskWithSequence(Task(from_here, std::move(task), delay),
+                             MakeRefCounted<Sequence>(new_traits));
 }
 
 scoped_refptr<TaskRunner> TaskSchedulerImpl::CreateTaskRunnerWithTraits(
diff --git a/base/task/task_scheduler/task_tracker.cc b/base/task/task_scheduler/task_tracker.cc
index bff6391..dd328eb 100644
--- a/base/task/task_scheduler/task_tracker.cc
+++ b/base/task/task_scheduler/task_tracker.cc
@@ -158,6 +158,18 @@
   return std::numeric_limits<int>::max();
 }
 
+// Returns shutdown behavior based on |traits|; returns SKIP_ON_SHUTDOWN if
+// shutdown behavior is BLOCK_SHUTDOWN and |is_delayed|, because delayed tasks
+// are not allowed to block shutdown.
+TaskShutdownBehavior GetEffectiveShutdownBehavior(const TaskTraits& traits,
+                                                  bool is_delayed) {
+  const TaskShutdownBehavior shutdown_behavior = traits.shutdown_behavior();
+  if (shutdown_behavior == TaskShutdownBehavior::BLOCK_SHUTDOWN && is_delayed) {
+    return TaskShutdownBehavior::SKIP_ON_SHUTDOWN;
+  }
+  return shutdown_behavior;
+}
+
 }  // namespace
 
 // Atomic internal state used by TaskTracker. Sequential consistency shouldn't
@@ -429,10 +441,13 @@
   }
 }
 
-bool TaskTracker::WillPostTask(Task* task) {
+bool TaskTracker::WillPostTask(Task* task,
+                               TaskShutdownBehavior shutdown_behavior) {
+  DCHECK(task);
   DCHECK(task->task);
 
-  if (!BeforePostTask(task->traits.shutdown_behavior()))
+  if (!BeforePostTask(GetEffectiveShutdownBehavior(shutdown_behavior,
+                                                   !task->delay.is_zero())))
     return false;
 
   if (task->delayed_run_time.is_null())
@@ -453,6 +468,7 @@
 scoped_refptr<Sequence> TaskTracker::WillScheduleSequence(
     scoped_refptr<Sequence> sequence,
     CanScheduleSequenceObserver* observer) {
+  DCHECK(sequence);
   const SequenceSortKey sort_key = sequence->GetSortKey();
   const int priority_index = static_cast<int>(sort_key.priority());
 
@@ -483,22 +499,23 @@
   // TODO(fdoray): Support TakeTask() returning null. https://crbug.com/783309
   DCHECK(task);
 
-  const TaskShutdownBehavior shutdown_behavior =
-      task->traits.shutdown_behavior();
-  const TaskPriority task_priority = task->traits.priority();
-  const bool can_run_task = BeforeRunTask(shutdown_behavior);
-  const bool is_delayed = !task->delayed_run_time.is_null();
+  const TaskShutdownBehavior effective_shutdown_behavior =
+      GetEffectiveShutdownBehavior(sequence->traits().shutdown_behavior(),
+                                   !task->delay.is_zero());
+
+  const bool can_run_task = BeforeRunTask(effective_shutdown_behavior);
 
   RunOrSkipTask(std::move(task.value()), sequence.get(), can_run_task);
   if (can_run_task) {
     IncrementNumTasksRun();
-    AfterRunTask(shutdown_behavior);
+    AfterRunTask(effective_shutdown_behavior);
   }
 
-  if (!is_delayed)
+  if (task->delayed_run_time.is_null())
     DecrementNumIncompleteUndelayedTasks();
 
   const bool sequence_is_empty_after_pop = sequence->Pop();
+  const TaskPriority priority = sequence->traits().priority();
 
   // Never reschedule a Sequence emptied by Pop(). The contract is such that
   // next poster to make it non-empty is responsible to schedule it.
@@ -508,7 +525,7 @@
   // Allow |sequence| to be rescheduled only if its next task is set to run
   // earlier than the earliest currently preempted sequence
   return ManageSequencesAfterRunningTask(std::move(sequence), observer,
-                                         task_priority);
+                                         priority);
 }
 
 bool TaskTracker::HasShutdownStarted() const {
@@ -572,17 +589,18 @@
 void TaskTracker::RunOrSkipTask(Task task,
                                 Sequence* sequence,
                                 bool can_run_task) {
-  RecordLatencyHistogram(LatencyHistogramType::TASK_LATENCY, task.traits,
+  DCHECK(sequence);
+  RecordLatencyHistogram(LatencyHistogramType::TASK_LATENCY, sequence->traits(),
                          task.sequenced_time);
 
   const bool previous_singleton_allowed =
       ThreadRestrictions::SetSingletonAllowed(
-          task.traits.shutdown_behavior() !=
+          sequence->traits().shutdown_behavior() !=
           TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN);
   const bool previous_io_allowed =
-      ThreadRestrictions::SetIOAllowed(task.traits.may_block());
+      ThreadRestrictions::SetIOAllowed(sequence->traits().may_block());
   const bool previous_wait_allowed = ThreadRestrictions::SetWaitAllowed(
-      task.traits.with_base_sync_primitives());
+      sequence->traits().with_base_sync_primitives());
 
   {
     const SequenceToken& sequence_token = sequence->token();
@@ -590,7 +608,8 @@
     ScopedSetSequenceTokenForCurrentThread
         scoped_set_sequence_token_for_current_thread(sequence_token);
     ScopedSetTaskPriorityForCurrentThread
-        scoped_set_task_priority_for_current_thread(task.traits.priority());
+        scoped_set_task_priority_for_current_thread(
+            sequence->traits().priority());
     ScopedSetSequenceLocalStorageMapForCurrentThread
         scoped_set_sequence_local_storage_map_for_current_thread(
             sequence->sequence_local_storage());
@@ -620,7 +639,7 @@
       // http://crbug.com/652692 is resolved.
       TRACE_EVENT1("task_scheduler", "TaskTracker::RunTask", "task_info",
                    std::make_unique<TaskTracingInfo>(
-                       task.traits, execution_mode, sequence_token));
+                       sequence->traits(), execution_mode, sequence_token));
 
       {
         // Put this in its own scope so it preceeds rather than overlaps with
@@ -768,8 +787,9 @@
   return subtle::Acquire_Load(&num_incomplete_undelayed_tasks_) != 0;
 }
 
-bool TaskTracker::BeforePostTask(TaskShutdownBehavior shutdown_behavior) {
-  if (shutdown_behavior == TaskShutdownBehavior::BLOCK_SHUTDOWN) {
+bool TaskTracker::BeforePostTask(
+    TaskShutdownBehavior effective_shutdown_behavior) {
+  if (effective_shutdown_behavior == TaskShutdownBehavior::BLOCK_SHUTDOWN) {
     // BLOCK_SHUTDOWN tasks block shutdown between the moment they are posted
     // and the moment they complete their execution.
     const bool shutdown_started = state_->IncrementNumTasksBlockingShutdown();
@@ -819,8 +839,9 @@
   return !state_->HasShutdownStarted();
 }
 
-bool TaskTracker::BeforeRunTask(TaskShutdownBehavior shutdown_behavior) {
-  switch (shutdown_behavior) {
+bool TaskTracker::BeforeRunTask(
+    TaskShutdownBehavior effective_shutdown_behavior) {
+  switch (effective_shutdown_behavior) {
     case TaskShutdownBehavior::BLOCK_SHUTDOWN: {
       // The number of tasks blocking shutdown has been incremented when the
       // task was posted.
@@ -863,9 +884,10 @@
   return false;
 }
 
-void TaskTracker::AfterRunTask(TaskShutdownBehavior shutdown_behavior) {
-  if (shutdown_behavior == TaskShutdownBehavior::BLOCK_SHUTDOWN ||
-      shutdown_behavior == TaskShutdownBehavior::SKIP_ON_SHUTDOWN) {
+void TaskTracker::AfterRunTask(
+    TaskShutdownBehavior effective_shutdown_behavior) {
+  if (effective_shutdown_behavior == TaskShutdownBehavior::BLOCK_SHUTDOWN ||
+      effective_shutdown_behavior == TaskShutdownBehavior::SKIP_ON_SHUTDOWN) {
     const bool shutdown_started_and_no_tasks_block_shutdown =
         state_->DecrementNumTasksBlockingShutdown();
     if (shutdown_started_and_no_tasks_block_shutdown)
@@ -912,11 +934,16 @@
 
     --preemption_state_[priority_index].current_scheduled_sequences;
 
+    const bool can_schedule_sequence =
+        preemption_state_[priority_index].current_scheduled_sequences <
+        preemption_state_[priority_index].max_scheduled_sequences;
+
     if (just_ran_sequence) {
-      if (preemption_state_[priority_index].preempted_sequences.empty() ||
-          preemption_state_[priority_index]
-                  .preempted_sequences.top()
-                  .next_task_sequenced_time > next_task_sequenced_time) {
+      if (can_schedule_sequence &&
+          (preemption_state_[priority_index].preempted_sequences.empty() ||
+           preemption_state_[priority_index]
+                   .preempted_sequences.top()
+                   .next_task_sequenced_time > next_task_sequenced_time)) {
         ++preemption_state_[priority_index].current_scheduled_sequences;
         return just_ran_sequence;
       }
@@ -925,7 +952,8 @@
           std::move(just_ran_sequence), next_task_sequenced_time, observer);
     }
 
-    if (!preemption_state_[priority_index].preempted_sequences.empty()) {
+    if (can_schedule_sequence &&
+        !preemption_state_[priority_index].preempted_sequences.empty()) {
       sequence_to_schedule =
           GetPreemptedSequenceToScheduleLockRequired(task_priority);
     }
diff --git a/base/task/task_scheduler/task_tracker.h b/base/task/task_scheduler/task_tracker.h
index c06c5b0..75f7a2e 100644
--- a/base/task/task_scheduler/task_tracker.h
+++ b/base/task/task_scheduler/task_tracker.h
@@ -129,10 +129,11 @@
   // FlushAsyncForTesting() may be pending at any given time.
   void FlushAsyncForTesting(OnceClosure flush_callback);
 
-  // Informs this TaskTracker that |task| is about to be posted. Returns true if
-  // this operation is allowed (|task| should be posted if-and-only-if it is).
-  // This method may also modify metadata on |task| if desired.
-  bool WillPostTask(Task* task);
+  // Informs this TaskTracker that |task| from a |shutdown_behavior| sequence
+  // is about to be posted. Returns true if this operation is allowed (|task|
+  // should be posted if-and-only-if it is). This method may also modify
+  // metadata on |task| if desired.
+  bool WillPostTask(Task* task, TaskShutdownBehavior shutdown_behavior);
 
   // Informs this TaskTracker that |sequence| is about to be scheduled. If this
   // returns |sequence|, it is expected that RunAndPopNextTask() will soon be
@@ -292,17 +293,17 @@
   // Called before WillPostTask() informs the tracing system that a task has
   // been posted. Updates |num_tasks_blocking_shutdown_| if necessary and
   // returns true if the current shutdown state allows the task to be posted.
-  bool BeforePostTask(TaskShutdownBehavior shutdown_behavior);
+  bool BeforePostTask(TaskShutdownBehavior effective_shutdown_behavior);
 
-  // Called before a task with |shutdown_behavior| is run by RunTask(). Updates
-  // |num_tasks_blocking_shutdown_| if necessary and returns true if the current
-  // shutdown state allows the task to be run.
-  bool BeforeRunTask(TaskShutdownBehavior shutdown_behavior);
+  // Called before a task with |effective_shutdown_behavior| is run by
+  // RunTask(). Updates |num_tasks_blocking_shutdown_| if necessary and returns
+  // true if the current shutdown state allows the task to be run.
+  bool BeforeRunTask(TaskShutdownBehavior effective_shutdown_behavior);
 
-  // Called after a task with |shutdown_behavior| has been run by RunTask().
-  // Updates |num_tasks_blocking_shutdown_| and signals |shutdown_cv_| if
-  // necessary.
-  void AfterRunTask(TaskShutdownBehavior shutdown_behavior);
+  // Called after a task with |effective_shutdown_behavior| has been run by
+  // RunTask(). Updates |num_tasks_blocking_shutdown_| and signals
+  // |shutdown_cv_| if necessary.
+  void AfterRunTask(TaskShutdownBehavior effective_shutdown_behavior);
 
   // Called when the number of tasks blocking shutdown becomes zero after
   // shutdown has started.
diff --git a/base/task/task_scheduler/task_tracker_posix_unittest.cc b/base/task/task_scheduler/task_tracker_posix_unittest.cc
index 15ddb21..2d1cf021 100644
--- a/base/task/task_scheduler/task_tracker_posix_unittest.cc
+++ b/base/task/task_scheduler/task_tracker_posix_unittest.cc
@@ -56,11 +56,12 @@
   bool did_run = false;
   Task task(FROM_HERE,
             Bind([](bool* did_run) { *did_run = true; }, Unretained(&did_run)),
-            TaskTraits(), TimeDelta());
+            TimeDelta());
+  TaskTraits default_traits = {};
 
-  EXPECT_TRUE(tracker_.WillPostTask(&task));
+  EXPECT_TRUE(tracker_.WillPostTask(&task, default_traits.shutdown_behavior()));
 
-  auto sequence = test::CreateSequenceWithTask(std::move(task));
+  auto sequence = test::CreateSequenceWithTask(std::move(task), default_traits);
   EXPECT_EQ(sequence, tracker_.WillScheduleSequence(sequence, nullptr));
   // Expect RunAndPopNextTask to return nullptr since |sequence| is empty after
   // popping a task from it.
@@ -77,13 +78,14 @@
   Task task(FROM_HERE,
             Bind(IgnoreResult(&FileDescriptorWatcher::WatchReadable), fds[0],
                  DoNothing()),
-            TaskTraits(), TimeDelta());
+            TimeDelta());
+  TaskTraits default_traits = {};
   // FileDescriptorWatcher::WatchReadable needs a SequencedTaskRunnerHandle.
   task.sequenced_task_runner_ref = MakeRefCounted<NullTaskRunner>();
 
-  EXPECT_TRUE(tracker_.WillPostTask(&task));
+  EXPECT_TRUE(tracker_.WillPostTask(&task, default_traits.shutdown_behavior()));
 
-  auto sequence = test::CreateSequenceWithTask(std::move(task));
+  auto sequence = test::CreateSequenceWithTask(std::move(task), default_traits);
   EXPECT_EQ(sequence, tracker_.WillScheduleSequence(sequence, nullptr));
   // Expect RunAndPopNextTask to return nullptr since |sequence| is empty after
   // popping a task from it.
diff --git a/base/task/task_scheduler/task_tracker_unittest.cc b/base/task/task_scheduler/task_tracker_unittest.cc
index 994515c31..5cedb17 100644
--- a/base/task/task_scheduler/task_tracker_unittest.cc
+++ b/base/task/task_scheduler/task_tracker_unittest.cc
@@ -88,12 +88,14 @@
 
   ThreadPostingAndRunningTask(TaskTracker* tracker,
                               Task* task,
+                              const TaskTraits& traits,
                               Action action,
                               bool expect_post_succeeds)
       : SimpleThread("ThreadPostingAndRunningTask"),
         tracker_(tracker),
-        owned_task_(FROM_HERE, OnceClosure(), TaskTraits(), TimeDelta()),
+        owned_task_(FROM_HERE, OnceClosure(), TimeDelta()),
         task_(task),
+        traits_(traits),
         action_(action),
         expect_post_succeeds_(expect_post_succeeds) {
     EXPECT_TRUE(task_);
@@ -105,12 +107,14 @@
 
   ThreadPostingAndRunningTask(TaskTracker* tracker,
                               Task task,
+                              const TaskTraits& traits,
                               Action action,
                               bool expect_post_succeeds)
       : SimpleThread("ThreadPostingAndRunningTask"),
         tracker_(tracker),
         owned_task_(std::move(task)),
         task_(&owned_task_),
+        traits_(traits),
         action_(action),
         expect_post_succeeds_(expect_post_succeeds) {
     EXPECT_TRUE(owned_task_.task);
@@ -120,7 +124,8 @@
   void Run() override {
     bool post_succeeded = true;
     if (action_ == Action::WILL_POST || action_ == Action::WILL_POST_AND_RUN) {
-      post_succeeded = tracker_->WillPostTask(task_);
+      post_succeeded =
+          tracker_->WillPostTask(task_, traits_.shutdown_behavior());
       EXPECT_EQ(expect_post_succeeds_, post_succeeded);
     }
     if (post_succeeded &&
@@ -130,7 +135,7 @@
       testing::StrictMock<MockCanScheduleSequenceObserver>
           never_notified_observer;
       auto sequence = tracker_->WillScheduleSequence(
-          test::CreateSequenceWithTask(std::move(owned_task_)),
+          test::CreateSequenceWithTask(std::move(owned_task_), traits_),
           &never_notified_observer);
       ASSERT_TRUE(sequence);
       // Expect RunAndPopNextTask to return nullptr since |sequence| is empty
@@ -143,6 +148,7 @@
   TaskTracker* const tracker_;
   Task owned_task_;
   Task* task_;
+  const TaskTraits traits_;
   const Action action_;
   const bool expect_post_succeeds_;
 
@@ -167,17 +173,17 @@
  protected:
   TaskSchedulerTaskTrackerTest() = default;
 
-  // Creates a task with |shutdown_behavior|.
-  Task CreateTask(TaskShutdownBehavior shutdown_behavior) {
+  // Creates a task.
+  Task CreateTask() {
     return Task(
         FROM_HERE,
         Bind(&TaskSchedulerTaskTrackerTest::RunTaskCallback, Unretained(this)),
-        TaskTraits(shutdown_behavior), TimeDelta());
+        TimeDelta());
   }
 
-  void DispatchAndRunTaskWithTracker(Task task) {
+  void DispatchAndRunTaskWithTracker(Task task, const TaskTraits& traits) {
     auto sequence = tracker_.WillScheduleSequence(
-        test::CreateSequenceWithTask(std::move(task)),
+        test::CreateSequenceWithTask(std::move(task), traits),
         &never_notified_observer_);
     ASSERT_TRUE(sequence);
     tracker_.RunAndPopNextTask(std::move(sequence), &never_notified_observer_);
@@ -280,15 +286,15 @@
 }  // namespace
 
 TEST_P(TaskSchedulerTaskTrackerTest, WillPostAndRunBeforeShutdown) {
-  Task task(CreateTask(GetParam()));
+  Task task(CreateTask());
 
   // Inform |task_tracker_| that |task| will be posted.
-  EXPECT_TRUE(tracker_.WillPostTask(&task));
+  EXPECT_TRUE(tracker_.WillPostTask(&task, GetParam()));
 
   // Run the task.
   EXPECT_EQ(0U, NumTasksExecuted());
 
-  DispatchAndRunTaskWithTracker(std::move(task));
+  DispatchAndRunTaskWithTracker(std::move(task), GetParam());
   EXPECT_EQ(1U, NumTasksExecuted());
 
   // Shutdown() shouldn't block.
@@ -310,14 +316,15 @@
             task_barrier->Wait();
           },
           Unretained(&task_running), Unretained(&task_barrier)),
-      TaskTraits(WithBaseSyncPrimitives(), GetParam()), TimeDelta());
+      TimeDelta());
 
   // Inform |task_tracker_| that |blocked_task| will be posted.
-  EXPECT_TRUE(tracker_.WillPostTask(&blocked_task));
+  EXPECT_TRUE(tracker_.WillPostTask(&blocked_task, GetParam()));
 
   // Create a thread to run the task. Wait until the task starts running.
   ThreadPostingAndRunningTask thread_running_task(
       &tracker_, std::move(blocked_task),
+      TaskTraits(WithBaseSyncPrimitives(), GetParam()),
       ThreadPostingAndRunningTask::Action::RUN, false);
   thread_running_task.Start();
   task_running.Wait();
@@ -344,13 +351,14 @@
 
 TEST_P(TaskSchedulerTaskTrackerTest, WillPostBeforeShutdownRunDuringShutdown) {
   // Inform |task_tracker_| that a task will be posted.
-  Task task(CreateTask(GetParam()));
-  EXPECT_TRUE(tracker_.WillPostTask(&task));
+  Task task(CreateTask());
+  EXPECT_TRUE(tracker_.WillPostTask(&task, GetParam()));
 
   // Inform |task_tracker_| that a BLOCK_SHUTDOWN task will be posted just to
   // block shutdown.
-  Task block_shutdown_task(CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
-  EXPECT_TRUE(tracker_.WillPostTask(&block_shutdown_task));
+  Task block_shutdown_task(CreateTask());
+  EXPECT_TRUE(tracker_.WillPostTask(&block_shutdown_task,
+                                    TaskShutdownBehavior::BLOCK_SHUTDOWN));
 
   // Call Shutdown() asynchronously.
   CallShutdownAsync();
@@ -361,20 +369,21 @@
   EXPECT_EQ(0U, NumTasksExecuted());
   const bool should_run = GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN;
 
-  DispatchAndRunTaskWithTracker(std::move(task));
+  DispatchAndRunTaskWithTracker(std::move(task), GetParam());
   EXPECT_EQ(should_run ? 1U : 0U, NumTasksExecuted());
   VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS();
 
   // Unblock shutdown by running the remaining BLOCK_SHUTDOWN task.
-  DispatchAndRunTaskWithTracker(std::move(block_shutdown_task));
+  DispatchAndRunTaskWithTracker(std::move(block_shutdown_task),
+                                TaskShutdownBehavior::BLOCK_SHUTDOWN);
   EXPECT_EQ(should_run ? 2U : 1U, NumTasksExecuted());
   WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
 }
 
 TEST_P(TaskSchedulerTaskTrackerTest, WillPostBeforeShutdownRunAfterShutdown) {
   // Inform |task_tracker_| that a task will be posted.
-  Task task(CreateTask(GetParam()));
-  EXPECT_TRUE(tracker_.WillPostTask(&task));
+  Task task(CreateTask());
+  EXPECT_TRUE(tracker_.WillPostTask(&task, GetParam()));
 
   // Call Shutdown() asynchronously.
   CallShutdownAsync();
@@ -384,7 +393,7 @@
     VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS();
 
     // Run the task to unblock shutdown.
-    DispatchAndRunTaskWithTracker(std::move(task));
+    DispatchAndRunTaskWithTracker(std::move(task), GetParam());
     EXPECT_EQ(1U, NumTasksExecuted());
     WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
 
@@ -395,7 +404,7 @@
     WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
 
     // The task shouldn't be allowed to run after shutdown.
-    DispatchAndRunTaskWithTracker(std::move(task));
+    DispatchAndRunTaskWithTracker(std::move(task), GetParam());
     EXPECT_EQ(0U, NumTasksExecuted());
   }
 }
@@ -403,8 +412,9 @@
 TEST_P(TaskSchedulerTaskTrackerTest, WillPostAndRunDuringShutdown) {
   // Inform |task_tracker_| that a BLOCK_SHUTDOWN task will be posted just to
   // block shutdown.
-  Task block_shutdown_task(CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
-  EXPECT_TRUE(tracker_.WillPostTask(&block_shutdown_task));
+  Task block_shutdown_task(CreateTask());
+  EXPECT_TRUE(tracker_.WillPostTask(&block_shutdown_task,
+                                    TaskShutdownBehavior::BLOCK_SHUTDOWN));
 
   // Call Shutdown() asynchronously.
   CallShutdownAsync();
@@ -412,24 +422,25 @@
 
   if (GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN) {
     // Inform |task_tracker_| that a BLOCK_SHUTDOWN task will be posted.
-    Task task(CreateTask(GetParam()));
-    EXPECT_TRUE(tracker_.WillPostTask(&task));
+    Task task(CreateTask());
+    EXPECT_TRUE(tracker_.WillPostTask(&task, GetParam()));
 
     // Run the BLOCK_SHUTDOWN task.
     EXPECT_EQ(0U, NumTasksExecuted());
-    DispatchAndRunTaskWithTracker(std::move(task));
+    DispatchAndRunTaskWithTracker(std::move(task), GetParam());
     EXPECT_EQ(1U, NumTasksExecuted());
   } else {
     // It shouldn't be allowed to post a non BLOCK_SHUTDOWN task.
-    Task task(CreateTask(GetParam()));
-    EXPECT_FALSE(tracker_.WillPostTask(&task));
+    Task task(CreateTask());
+    EXPECT_FALSE(tracker_.WillPostTask(&task, GetParam()));
 
     // Don't try to run the task, because it wasn't allowed to be posted.
   }
 
   // Unblock shutdown by running |block_shutdown_task|.
   VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS();
-  DispatchAndRunTaskWithTracker(std::move(block_shutdown_task));
+  DispatchAndRunTaskWithTracker(std::move(block_shutdown_task),
+                                TaskShutdownBehavior::BLOCK_SHUTDOWN);
   EXPECT_EQ(GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN ? 2U : 1U,
             NumTasksExecuted());
   WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
@@ -438,10 +449,10 @@
 TEST_P(TaskSchedulerTaskTrackerTest, WillPostAfterShutdown) {
   tracker_.Shutdown();
 
-  Task task(CreateTask(GetParam()));
+  Task task(CreateTask());
 
   // |task_tracker_| shouldn't allow a task to be posted after shutdown.
-  EXPECT_FALSE(tracker_.WillPostTask(&task));
+  EXPECT_FALSE(tracker_.WillPostTask(&task, GetParam()));
 }
 
 // Verify that BLOCK_SHUTDOWN and SKIP_ON_SHUTDOWN tasks can
@@ -451,8 +462,8 @@
       (GetParam() != TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN);
 
   Task task(FROM_HERE, BindOnce(&ThreadRestrictions::AssertSingletonAllowed),
-            TaskTraits(GetParam()), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(&task));
+            TimeDelta());
+  EXPECT_TRUE(tracker_.WillPostTask(&task, GetParam()));
 
   // Set the singleton allowed bit to the opposite of what it is expected to be
   // when |tracker| runs |task| to verify that |tracker| actually sets the
@@ -461,9 +472,10 @@
 
   // Running the task should fail iff the task isn't allowed to use singletons.
   if (can_use_singletons) {
-    DispatchAndRunTaskWithTracker(std::move(task));
+    DispatchAndRunTaskWithTracker(std::move(task), GetParam());
   } else {
-    EXPECT_DCHECK_DEATH({ DispatchAndRunTaskWithTracker(std::move(task)); });
+    EXPECT_DCHECK_DEATH(
+        { DispatchAndRunTaskWithTracker(std::move(task), GetParam()); });
   }
 }
 
@@ -476,9 +488,12 @@
                              // Shouldn't fail.
                              AssertBlockingAllowed();
                            }),
-                           TaskTraits(MayBlock(), GetParam()), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(&task_with_may_block));
-  DispatchAndRunTaskWithTracker(std::move(task_with_may_block));
+                           TimeDelta());
+  TaskTraits traits_with_may_block = TaskTraits(MayBlock(), GetParam());
+  EXPECT_TRUE(tracker_.WillPostTask(&task_with_may_block,
+                                    traits_with_may_block.shutdown_behavior()));
+  DispatchAndRunTaskWithTracker(std::move(task_with_may_block),
+                                traits_with_may_block);
 
   // Set the IO allowed bit. Expect TaskTracker to unset it before running a
   // task without the MayBlock() trait.
@@ -486,15 +501,19 @@
   Task task_without_may_block(
       FROM_HERE,
       Bind([]() { EXPECT_DCHECK_DEATH({ AssertBlockingAllowed(); }); }),
-      TaskTraits(GetParam()), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(&task_without_may_block));
-  DispatchAndRunTaskWithTracker(std::move(task_without_may_block));
+      TimeDelta());
+  TaskTraits traits_without_may_block = TaskTraits(GetParam());
+  EXPECT_TRUE(tracker_.WillPostTask(
+      &task_without_may_block, traits_without_may_block.shutdown_behavior()));
+  DispatchAndRunTaskWithTracker(std::move(task_without_may_block),
+                                traits_without_may_block);
 }
 
 static void RunTaskRunnerHandleVerificationTask(TaskTracker* tracker,
-                                                Task verify_task) {
+                                                Task verify_task,
+                                                TaskTraits traits) {
   // Pretend |verify_task| is posted to respect TaskTracker's contract.
-  EXPECT_TRUE(tracker->WillPostTask(&verify_task));
+  EXPECT_TRUE(tracker->WillPostTask(&verify_task, traits.shutdown_behavior()));
 
   // Confirm that the test conditions are right (no TaskRunnerHandles set
   // already).
@@ -503,7 +522,7 @@
 
   testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer;
   auto sequence = tracker->WillScheduleSequence(
-      test::CreateSequenceWithTask(std::move(verify_task)),
+      test::CreateSequenceWithTask(std::move(verify_task), traits),
       &never_notified_observer);
   ASSERT_TRUE(sequence);
   tracker->RunAndPopNextTask(std::move(sequence), &never_notified_observer);
@@ -521,10 +540,10 @@
 TEST_P(TaskSchedulerTaskTrackerTest, TaskRunnerHandleIsNotSetOnParallel) {
   // Create a task that will verify that TaskRunnerHandles are not set in its
   // scope per no TaskRunner ref being set to it.
-  Task verify_task(FROM_HERE, BindOnce(&VerifyNoTaskRunnerHandle),
-                   TaskTraits(GetParam()), TimeDelta());
+  Task verify_task(FROM_HERE, BindOnce(&VerifyNoTaskRunnerHandle), TimeDelta());
 
-  RunTaskRunnerHandleVerificationTask(&tracker_, std::move(verify_task));
+  RunTaskRunnerHandleVerificationTask(&tracker_, std::move(verify_task),
+                                      TaskTraits(GetParam()));
 }
 
 static void VerifySequencedTaskRunnerHandle(
@@ -544,10 +563,11 @@
   Task verify_task(FROM_HERE,
                    BindOnce(&VerifySequencedTaskRunnerHandle,
                             Unretained(test_task_runner.get())),
-                   TaskTraits(GetParam()), TimeDelta());
+                   TimeDelta());
   verify_task.sequenced_task_runner_ref = test_task_runner;
 
-  RunTaskRunnerHandleVerificationTask(&tracker_, std::move(verify_task));
+  RunTaskRunnerHandleVerificationTask(&tracker_, std::move(verify_task),
+                                      TaskTraits(GetParam()));
 }
 
 static void VerifyThreadTaskRunnerHandle(
@@ -569,24 +589,23 @@
   Task verify_task(FROM_HERE,
                    BindOnce(&VerifyThreadTaskRunnerHandle,
                             Unretained(test_task_runner.get())),
-                   TaskTraits(GetParam()), TimeDelta());
+                   TimeDelta());
   verify_task.single_thread_task_runner_ref = test_task_runner;
 
-  RunTaskRunnerHandleVerificationTask(&tracker_, std::move(verify_task));
+  RunTaskRunnerHandleVerificationTask(&tracker_, std::move(verify_task),
+                                      TaskTraits(GetParam()));
 }
 
 TEST_P(TaskSchedulerTaskTrackerTest, FlushPendingDelayedTask) {
-  Task delayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                    TimeDelta::FromDays(1));
-  tracker_.WillPostTask(&delayed_task);
+  Task delayed_task(FROM_HERE, DoNothing(), TimeDelta::FromDays(1));
+  tracker_.WillPostTask(&delayed_task, GetParam());
   // FlushForTesting() should return even if the delayed task didn't run.
   tracker_.FlushForTesting();
 }
 
 TEST_P(TaskSchedulerTaskTrackerTest, FlushAsyncForTestingPendingDelayedTask) {
-  Task delayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                    TimeDelta::FromDays(1));
-  tracker_.WillPostTask(&delayed_task);
+  Task delayed_task(FROM_HERE, DoNothing(), TimeDelta::FromDays(1));
+  tracker_.WillPostTask(&delayed_task, GetParam());
   // FlushAsyncForTesting() should callback even if the delayed task didn't run.
   bool called_back = false;
   tracker_.FlushAsyncForTesting(
@@ -596,9 +615,8 @@
 }
 
 TEST_P(TaskSchedulerTaskTrackerTest, FlushPendingUndelayedTask) {
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(&undelayed_task);
+  Task undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&undelayed_task, GetParam());
 
   // FlushForTesting() shouldn't return before the undelayed task runs.
   CallFlushFromAnotherThread();
@@ -606,14 +624,13 @@
   VERIFY_ASYNC_FLUSH_IN_PROGRESS();
 
   // FlushForTesting() should return after the undelayed task runs.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
+  DispatchAndRunTaskWithTracker(std::move(undelayed_task), GetParam());
   WAIT_FOR_ASYNC_FLUSH_RETURNED();
 }
 
 TEST_P(TaskSchedulerTaskTrackerTest, FlushAsyncForTestingPendingUndelayedTask) {
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(&undelayed_task);
+  Task undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&undelayed_task, GetParam());
 
   // FlushAsyncForTesting() shouldn't callback before the undelayed task runs.
   WaitableEvent event;
@@ -623,14 +640,13 @@
   EXPECT_FALSE(event.IsSignaled());
 
   // FlushAsyncForTesting() should callback after the undelayed task runs.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
+  DispatchAndRunTaskWithTracker(std::move(undelayed_task), GetParam());
   event.Wait();
 }
 
 TEST_P(TaskSchedulerTaskTrackerTest, PostTaskDuringFlush) {
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(&undelayed_task);
+  Task undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&undelayed_task, GetParam());
 
   // FlushForTesting() shouldn't return before the undelayed task runs.
   CallFlushFromAnotherThread();
@@ -638,26 +654,24 @@
   VERIFY_ASYNC_FLUSH_IN_PROGRESS();
 
   // Simulate posting another undelayed task.
-  Task other_undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                            TimeDelta());
-  tracker_.WillPostTask(&other_undelayed_task);
+  Task other_undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&other_undelayed_task, GetParam());
 
   // Run the first undelayed task.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
+  DispatchAndRunTaskWithTracker(std::move(undelayed_task), GetParam());
 
   // FlushForTesting() shouldn't return before the second undelayed task runs.
   PlatformThread::Sleep(TestTimeouts::tiny_timeout());
   VERIFY_ASYNC_FLUSH_IN_PROGRESS();
 
   // FlushForTesting() should return after the second undelayed task runs.
-  DispatchAndRunTaskWithTracker(std::move(other_undelayed_task));
+  DispatchAndRunTaskWithTracker(std::move(other_undelayed_task), GetParam());
   WAIT_FOR_ASYNC_FLUSH_RETURNED();
 }
 
 TEST_P(TaskSchedulerTaskTrackerTest, PostTaskDuringFlushAsyncForTesting) {
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(&undelayed_task);
+  Task undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&undelayed_task, GetParam());
 
   // FlushAsyncForTesting() shouldn't callback before the undelayed task runs.
   WaitableEvent event;
@@ -667,12 +681,11 @@
   EXPECT_FALSE(event.IsSignaled());
 
   // Simulate posting another undelayed task.
-  Task other_undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                            TimeDelta());
-  tracker_.WillPostTask(&other_undelayed_task);
+  Task other_undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&other_undelayed_task, GetParam());
 
   // Run the first undelayed task.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
+  DispatchAndRunTaskWithTracker(std::move(undelayed_task), GetParam());
 
   // FlushAsyncForTesting() shouldn't callback before the second undelayed task
   // runs.
@@ -681,18 +694,16 @@
 
   // FlushAsyncForTesting() should callback after the second undelayed task
   // runs.
-  DispatchAndRunTaskWithTracker(std::move(other_undelayed_task));
+  DispatchAndRunTaskWithTracker(std::move(other_undelayed_task), GetParam());
   event.Wait();
 }
 
 TEST_P(TaskSchedulerTaskTrackerTest, RunDelayedTaskDuringFlush) {
   // Simulate posting a delayed and an undelayed task.
-  Task delayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                    TimeDelta::FromDays(1));
-  tracker_.WillPostTask(&delayed_task);
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(&undelayed_task);
+  Task delayed_task(FROM_HERE, DoNothing(), TimeDelta::FromDays(1));
+  tracker_.WillPostTask(&delayed_task, GetParam());
+  Task undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&undelayed_task, GetParam());
 
   // FlushForTesting() shouldn't return before the undelayed task runs.
   CallFlushFromAnotherThread();
@@ -700,7 +711,7 @@
   VERIFY_ASYNC_FLUSH_IN_PROGRESS();
 
   // Run the delayed task.
-  DispatchAndRunTaskWithTracker(std::move(delayed_task));
+  DispatchAndRunTaskWithTracker(std::move(delayed_task), GetParam());
 
   // FlushForTesting() shouldn't return since there is still a pending undelayed
   // task.
@@ -708,7 +719,7 @@
   VERIFY_ASYNC_FLUSH_IN_PROGRESS();
 
   // Run the undelayed task.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
+  DispatchAndRunTaskWithTracker(std::move(undelayed_task), GetParam());
 
   // FlushForTesting() should now return.
   WAIT_FOR_ASYNC_FLUSH_RETURNED();
@@ -716,12 +727,10 @@
 
 TEST_P(TaskSchedulerTaskTrackerTest, RunDelayedTaskDuringFlushAsyncForTesting) {
   // Simulate posting a delayed and an undelayed task.
-  Task delayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                    TimeDelta::FromDays(1));
-  tracker_.WillPostTask(&delayed_task);
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(&undelayed_task);
+  Task delayed_task(FROM_HERE, DoNothing(), TimeDelta::FromDays(1));
+  tracker_.WillPostTask(&delayed_task, GetParam());
+  Task undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&undelayed_task, GetParam());
 
   // FlushAsyncForTesting() shouldn't callback before the undelayed task runs.
   WaitableEvent event;
@@ -731,7 +740,7 @@
   EXPECT_FALSE(event.IsSignaled());
 
   // Run the delayed task.
-  DispatchAndRunTaskWithTracker(std::move(delayed_task));
+  DispatchAndRunTaskWithTracker(std::move(delayed_task), GetParam());
 
   // FlushAsyncForTesting() shouldn't callback since there is still a pending
   // undelayed task.
@@ -739,7 +748,7 @@
   EXPECT_FALSE(event.IsSignaled());
 
   // Run the undelayed task.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
+  DispatchAndRunTaskWithTracker(std::move(undelayed_task), GetParam());
 
   // FlushAsyncForTesting() should now callback.
   event.Wait();
@@ -750,9 +759,8 @@
     return;
 
   // Simulate posting a task.
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(&undelayed_task);
+  Task undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&undelayed_task, GetParam());
 
   // Shutdown() should return immediately since there are no pending
   // BLOCK_SHUTDOWN tasks.
@@ -768,9 +776,8 @@
     return;
 
   // Simulate posting a task.
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(&undelayed_task);
+  Task undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&undelayed_task, GetParam());
 
   // Shutdown() should return immediately since there are no pending
   // BLOCK_SHUTDOWN tasks.
@@ -790,9 +797,8 @@
     return;
 
   // Simulate posting a task.
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(&undelayed_task);
+  Task undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&undelayed_task, GetParam());
 
   // FlushForTesting() shouldn't return before the undelayed task runs or
   // shutdown completes.
@@ -813,9 +819,8 @@
     return;
 
   // Simulate posting a task.
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(&undelayed_task);
+  Task undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&undelayed_task, GetParam());
 
   // FlushAsyncForTesting() shouldn't callback before the undelayed task runs or
   // shutdown completes.
@@ -835,9 +840,8 @@
 }
 
 TEST_P(TaskSchedulerTaskTrackerTest, DoublePendingFlushAsyncForTestingFails) {
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(&undelayed_task);
+  Task undelayed_task(FROM_HERE, DoNothing(), TimeDelta());
+  tracker_.WillPostTask(&undelayed_task, GetParam());
 
   // FlushAsyncForTesting() shouldn't callback before the undelayed task runs.
   bool called_back = false;
@@ -848,6 +852,18 @@
   EXPECT_DCHECK_DEATH({ tracker_.FlushAsyncForTesting(BindOnce([]() {})); });
 }
 
+// Verify that a delayed task does not block shutdown, regardless of its
+// shutdown behavior.
+TEST_P(TaskSchedulerTaskTrackerTest, DelayedTasksDoNotBlockShutdown) {
+  // Simulate posting a delayed task.
+  Task delayed_task(FROM_HERE, DoNothing(), TimeDelta::FromDays(1));
+  EXPECT_TRUE(tracker_.WillPostTask(&delayed_task, GetParam()));
+
+  // Since the delayed task doesn't block shutdown, a call to Shutdown() should
+  // not hang.
+  tracker_.Shutdown();
+}
+
 INSTANTIATE_TEST_CASE_P(
     ContinueOnShutdown,
     TaskSchedulerTaskTrackerTest,
@@ -872,12 +888,11 @@
 // Verify that SequenceToken::GetForCurrentThread() returns the Sequence's token
 // when a Task runs.
 TEST_F(TaskSchedulerTaskTrackerTest, CurrentSequenceToken) {
-  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>();
+  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>(TaskTraits());
 
   const SequenceToken sequence_token = sequence->token();
-  Task task(FROM_HERE, Bind(&ExpectSequenceToken, sequence_token), TaskTraits(),
-            TimeDelta());
-  tracker_.WillPostTask(&task);
+  Task task(FROM_HERE, Bind(&ExpectSequenceToken, sequence_token), TimeDelta());
+  tracker_.WillPostTask(&task, sequence->traits().shutdown_behavior());
 
   sequence->PushTask(std::move(task));
 
@@ -895,17 +910,20 @@
 
   for (size_t i = 0; i < kLoadTestNumIterations; ++i) {
     threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
+        &tracker_, CreateTask(),
+        TaskTraits(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
         ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true));
     threads.back()->Start();
 
     threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN),
+        &tracker_, CreateTask(),
+        TaskTraits(TaskShutdownBehavior::SKIP_ON_SHUTDOWN),
         ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true));
     threads.back()->Start();
 
     threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN),
+        &tracker_, CreateTask(),
+        TaskTraits(TaskShutdownBehavior::BLOCK_SHUTDOWN),
         ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true));
     threads.back()->Start();
   }
@@ -927,28 +945,32 @@
   std::vector<Task> tasks_skip_on_shutdown;
   std::vector<Task> tasks_block_shutdown;
   for (size_t i = 0; i < kLoadTestNumIterations; ++i) {
-    tasks_continue_on_shutdown.push_back(
-        CreateTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
-    tasks_skip_on_shutdown.push_back(
-        CreateTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
-    tasks_block_shutdown.push_back(
-        CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
+    tasks_continue_on_shutdown.push_back(CreateTask());
+    tasks_skip_on_shutdown.push_back(CreateTask());
+    tasks_block_shutdown.push_back(CreateTask());
   }
 
+  TaskTraits traits_continue_on_shutdown =
+      TaskTraits(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN);
+  TaskTraits traits_skip_on_shutdown =
+      TaskTraits(TaskShutdownBehavior::SKIP_ON_SHUTDOWN);
+  TaskTraits traits_block_shutdown =
+      TaskTraits(TaskShutdownBehavior::BLOCK_SHUTDOWN);
+
   std::vector<std::unique_ptr<ThreadPostingAndRunningTask>> post_threads;
   for (size_t i = 0; i < kLoadTestNumIterations; ++i) {
     post_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, &tasks_continue_on_shutdown[i],
+        &tracker_, &tasks_continue_on_shutdown[i], traits_continue_on_shutdown,
         ThreadPostingAndRunningTask::Action::WILL_POST, true));
     post_threads.back()->Start();
 
     post_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, &tasks_skip_on_shutdown[i],
+        &tracker_, &tasks_skip_on_shutdown[i], traits_skip_on_shutdown,
         ThreadPostingAndRunningTask::Action::WILL_POST, true));
     post_threads.back()->Start();
 
     post_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, &tasks_block_shutdown[i],
+        &tracker_, &tasks_block_shutdown[i], traits_block_shutdown,
         ThreadPostingAndRunningTask::Action::WILL_POST, true));
     post_threads.back()->Start();
   }
@@ -964,16 +986,18 @@
   for (size_t i = 0; i < kLoadTestNumIterations; ++i) {
     run_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
         &tracker_, std::move(tasks_continue_on_shutdown[i]),
-        ThreadPostingAndRunningTask::Action::RUN, false));
+        traits_continue_on_shutdown, ThreadPostingAndRunningTask::Action::RUN,
+        false));
     run_threads.back()->Start();
 
     run_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
         &tracker_, std::move(tasks_skip_on_shutdown[i]),
-        ThreadPostingAndRunningTask::Action::RUN, false));
+        traits_skip_on_shutdown, ThreadPostingAndRunningTask::Action::RUN,
+        false));
     run_threads.back()->Start();
 
     run_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, std::move(tasks_block_shutdown[i]),
+        &tracker_, std::move(tasks_block_shutdown[i]), traits_block_shutdown,
         ThreadPostingAndRunningTask::Action::RUN, false));
     run_threads.back()->Start();
   }
@@ -990,8 +1014,9 @@
 TEST_F(TaskSchedulerTaskTrackerTest, LoadWillPostAndRunDuringShutdown) {
   // Inform |task_tracker_| that a BLOCK_SHUTDOWN task will be posted just to
   // block shutdown.
-  Task block_shutdown_task(CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
-  EXPECT_TRUE(tracker_.WillPostTask(&block_shutdown_task));
+  Task block_shutdown_task(CreateTask());
+  EXPECT_TRUE(tracker_.WillPostTask(&block_shutdown_task,
+                                    TaskShutdownBehavior::BLOCK_SHUTDOWN));
 
   // Call Shutdown() asynchronously.
   CallShutdownAsync();
@@ -1001,17 +1026,20 @@
 
   for (size_t i = 0; i < kLoadTestNumIterations; ++i) {
     threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
+        &tracker_, CreateTask(),
+        TaskTraits(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
         ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, false));
     threads.back()->Start();
 
     threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN),
+        &tracker_, CreateTask(),
+        TaskTraits(TaskShutdownBehavior::SKIP_ON_SHUTDOWN),
         ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, false));
     threads.back()->Start();
 
     threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN),
+        &tracker_, CreateTask(),
+        TaskTraits(TaskShutdownBehavior::BLOCK_SHUTDOWN),
         ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true));
     threads.back()->Start();
   }
@@ -1026,7 +1054,9 @@
   VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS();
 
   // Unblock shutdown by running |block_shutdown_task|.
-  DispatchAndRunTaskWithTracker(std::move(block_shutdown_task));
+  DispatchAndRunTaskWithTracker(
+      std::move(block_shutdown_task),
+      TaskTraits(TaskShutdownBehavior::BLOCK_SHUTDOWN));
   EXPECT_EQ(kLoadTestNumIterations + 1, NumTasksExecuted());
   WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
 }
@@ -1035,13 +1065,16 @@
 // when it can be rescheduled.
 TEST_F(TaskSchedulerTaskTrackerTest,
        RunAndPopNextTaskReturnsSequenceToReschedule) {
-  Task task_1(FROM_HERE, DoNothing(), TaskTraits(), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(&task_1));
-  Task task_2(FROM_HERE, DoNothing(), TaskTraits(), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(&task_2));
+  TaskTraits default_traits = {};
+  Task task_1(FROM_HERE, DoNothing(), TimeDelta());
+  EXPECT_TRUE(
+      tracker_.WillPostTask(&task_1, default_traits.shutdown_behavior()));
+  Task task_2(FROM_HERE, DoNothing(), TimeDelta());
+  EXPECT_TRUE(
+      tracker_.WillPostTask(&task_2, default_traits.shutdown_behavior()));
 
   scoped_refptr<Sequence> sequence =
-      test::CreateSequenceWithTask(std::move(task_1));
+      test::CreateSequenceWithTask(std::move(task_1), default_traits);
   sequence->PushTask(std::move(task_2));
   EXPECT_EQ(sequence, tracker_.WillScheduleSequence(sequence, nullptr));
 
@@ -1057,12 +1090,13 @@
   // tasks and scheduling the associated sequences. This should succeed.
   std::vector<scoped_refptr<Sequence>> scheduled_sequences;
   testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer;
+  TaskTraits best_effort_traits = TaskTraits(TaskPriority::BEST_EFFORT);
   for (int i = 0; i < max_num_scheduled_best_effort_sequences; ++i) {
-    Task task(FROM_HERE, DoNothing(), TaskTraits(TaskPriority::BEST_EFFORT),
-              TimeDelta());
-    EXPECT_TRUE(tracker.WillPostTask(&task));
+    Task task(FROM_HERE, DoNothing(), TimeDelta());
+    EXPECT_TRUE(
+        tracker.WillPostTask(&task, best_effort_traits.shutdown_behavior()));
     scoped_refptr<Sequence> sequence =
-        test::CreateSequenceWithTask(std::move(task));
+        test::CreateSequenceWithTask(std::move(task), best_effort_traits);
     EXPECT_EQ(sequence,
               tracker.WillScheduleSequence(sequence, &never_notified_observer));
     scheduled_sequences.push_back(std::move(sequence));
@@ -1082,10 +1116,11 @@
         FROM_HERE,
         BindOnce([](bool* extra_task_did_run) { *extra_task_did_run = true; },
                  Unretained(extra_tasks_did_run.back().get())),
-        TaskTraits(TaskPriority::BEST_EFFORT), TimeDelta());
-    EXPECT_TRUE(tracker.WillPostTask(&extra_task));
-    extra_sequences.push_back(
-        test::CreateSequenceWithTask(std::move(extra_task)));
+        TimeDelta());
+    EXPECT_TRUE(tracker.WillPostTask(&extra_task,
+                                     best_effort_traits.shutdown_behavior()));
+    extra_sequences.push_back(test::CreateSequenceWithTask(
+        std::move(extra_task), best_effort_traits));
     extra_observers.push_back(
         std::make_unique<
             testing::StrictMock<MockCanScheduleSequenceObserver>>());
@@ -1155,10 +1190,12 @@
 // WillScheduleSequence() returning sequence.
 TEST_F(TaskSchedulerTaskTrackerTest,
        WillScheduleSequenceWithScopedExecutionFence) {
-  Task task_a(FROM_HERE, DoNothing(), TaskTraits(), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(&task_a));
+  TaskTraits default_traits = {};
+  Task task_a(FROM_HERE, DoNothing(), TimeDelta());
+  EXPECT_TRUE(
+      tracker_.WillPostTask(&task_a, default_traits.shutdown_behavior()));
   scoped_refptr<Sequence> sequence_a =
-      test::CreateSequenceWithTask(std::move(task_a));
+      test::CreateSequenceWithTask(std::move(task_a), default_traits);
   testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer;
   EXPECT_EQ(sequence_a, tracker_.WillScheduleSequence(
                             sequence_a, &never_notified_observer));
@@ -1168,10 +1205,11 @@
   tracker_.SetExecutionFenceEnabled(true);
   bool task_b_1_did_run = false;
   Task task_b_1(FROM_HERE, BindOnce(&SetBool, Unretained(&task_b_1_did_run)),
-                TaskTraits(), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(&task_b_1));
+                TimeDelta());
+  EXPECT_TRUE(
+      tracker_.WillPostTask(&task_b_1, default_traits.shutdown_behavior()));
   scoped_refptr<Sequence> sequence_b =
-      test::CreateSequenceWithTask(std::move(task_b_1));
+      test::CreateSequenceWithTask(std::move(task_b_1), default_traits);
   testing::StrictMock<MockCanScheduleSequenceObserver> observer_b_1;
   EXPECT_EQ(0, tracker_.GetPreemptedSequenceCountForTesting(
                    TaskPriority::BEST_EFFORT));
@@ -1181,12 +1219,14 @@
 
   bool task_b_2_did_run = false;
   Task task_b_2(FROM_HERE, BindOnce(&SetBool, Unretained(&task_b_2_did_run)),
-                TaskTraits(TaskPriority::BEST_EFFORT), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(&task_b_2));
+                TimeDelta());
+  TaskTraits best_effort_traits = TaskTraits(TaskPriority::BEST_EFFORT);
+  EXPECT_TRUE(
+      tracker_.WillPostTask(&task_b_2, best_effort_traits.shutdown_behavior()));
   sequence_b->PushTask(std::move(task_b_2));
   testing::StrictMock<MockCanScheduleSequenceObserver> observer_b_2;
   EXPECT_EQ(nullptr, tracker_.WillScheduleSequence(sequence_b, &observer_b_2));
-  // The TaskPriority of a sequence is the highest priority of among its tasks.
+  // The TaskPriority of the Sequence is unchanged by posting new tasks to it.
   EXPECT_EQ(2, tracker_.GetPreemptedSequenceCountForTesting(
                    TaskPriority::USER_VISIBLE));
 
@@ -1194,10 +1234,11 @@
   // when the ScopedExecutionFence is enabled.
   bool task_c_did_run = false;
   Task task_c(FROM_HERE, BindOnce(&SetBool, Unretained(&task_c_did_run)),
-              TaskTraits(TaskPriority::BEST_EFFORT), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(&task_c));
+              TimeDelta());
+  EXPECT_TRUE(
+      tracker_.WillPostTask(&task_c, best_effort_traits.shutdown_behavior()));
   scoped_refptr<Sequence> sequence_c =
-      test::CreateSequenceWithTask(std::move(task_c));
+      test::CreateSequenceWithTask(std::move(task_c), best_effort_traits);
   testing::StrictMock<MockCanScheduleSequenceObserver> observer_c;
   EXPECT_EQ(nullptr, tracker_.WillScheduleSequence(sequence_c, &observer_c));
   EXPECT_EQ(1, tracker_.GetPreemptedSequenceCountForTesting(
@@ -1235,10 +1276,11 @@
 
   // Verify that WillScheduleSequence() returns the sequence when the
   // ScopedExecutionFence isn't enabled.
-  Task task_d(FROM_HERE, DoNothing(), TaskTraits(), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(&task_d));
+  Task task_d(FROM_HERE, DoNothing(), TimeDelta());
+  EXPECT_TRUE(
+      tracker_.WillPostTask(&task_d, default_traits.shutdown_behavior()));
   scoped_refptr<Sequence> sequence_d =
-      test::CreateSequenceWithTask(std::move(task_d));
+      test::CreateSequenceWithTask(std::move(task_d), default_traits);
   EXPECT_EQ(sequence_d, tracker_.WillScheduleSequence(
                             sequence_d, &never_notified_observer));
 }
@@ -1252,15 +1294,17 @@
   constexpr int kMaxNumScheduledBestEffortSequences = 1;
   TaskTracker tracker("Test", kMaxNumScheduledBestEffortSequences);
   testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer;
+  TaskTraits best_effort_traits = TaskTraits(TaskPriority::BEST_EFFORT);
 
   // Simulate posting a best-effort task and scheduling the associated sequence.
   // This should succeed.
   bool task_a_1_did_run = false;
   Task task_a_1(FROM_HERE, BindOnce(&SetBool, Unretained(&task_a_1_did_run)),
-                TaskTraits(TaskPriority::BEST_EFFORT), TimeDelta());
-  EXPECT_TRUE(tracker.WillPostTask(&task_a_1));
+                TimeDelta());
+  EXPECT_TRUE(
+      tracker.WillPostTask(&task_a_1, best_effort_traits.shutdown_behavior()));
   scoped_refptr<Sequence> sequence_a =
-      test::CreateSequenceWithTask(std::move(task_a_1));
+      test::CreateSequenceWithTask(std::move(task_a_1), best_effort_traits);
   EXPECT_EQ(sequence_a,
             tracker.WillScheduleSequence(sequence_a, &never_notified_observer));
 
@@ -1269,10 +1313,11 @@
   // sequences that can be scheduled concurrently is already reached.
   bool task_b_1_did_run = false;
   Task task_b_1(FROM_HERE, BindOnce(&SetBool, Unretained(&task_b_1_did_run)),
-                TaskTraits(TaskPriority::BEST_EFFORT), TimeDelta());
-  EXPECT_TRUE(tracker.WillPostTask(&task_b_1));
+                TimeDelta());
+  EXPECT_TRUE(
+      tracker.WillPostTask(&task_b_1, best_effort_traits.shutdown_behavior()));
   scoped_refptr<Sequence> sequence_b =
-      test::CreateSequenceWithTask(std::move(task_b_1));
+      test::CreateSequenceWithTask(std::move(task_b_1), best_effort_traits);
   testing::StrictMock<MockCanScheduleSequenceObserver> task_b_1_observer;
   EXPECT_FALSE(tracker.WillScheduleSequence(sequence_b, &task_b_1_observer));
 
@@ -1283,8 +1328,9 @@
   // Post an extra best-effort task in |sequence_a|.
   bool task_a_2_did_run = false;
   Task task_a_2(FROM_HERE, BindOnce(&SetBool, Unretained(&task_a_2_did_run)),
-                TaskTraits(TaskPriority::BEST_EFFORT), TimeDelta());
-  EXPECT_TRUE(tracker.WillPostTask(&task_a_2));
+                TimeDelta());
+  EXPECT_TRUE(
+      tracker.WillPostTask(&task_a_2, best_effort_traits.shutdown_behavior()));
   sequence_a->PushTask(std::move(task_a_2));
 
   // Run the first task in |sequence_a|. RunAndPopNextTask() should return
@@ -1324,12 +1370,12 @@
   std::vector<scoped_refptr<Sequence>> preempted_sequences;
   for (int i = 0; i < 3; ++i) {
     Task task(FROM_HERE, DoNothing(),
-              TaskTraits(TaskPriority::BEST_EFFORT,
-                         TaskShutdownBehavior::BLOCK_SHUTDOWN),
               TimeDelta());
-    EXPECT_TRUE(tracker.WillPostTask(&task));
-    scoped_refptr<Sequence> sequence =
-        test::CreateSequenceWithTask(std::move(task));
+    EXPECT_TRUE(
+        tracker.WillPostTask(&task, TaskShutdownBehavior::BLOCK_SHUTDOWN));
+    scoped_refptr<Sequence> sequence = test::CreateSequenceWithTask(
+        std::move(task), TaskTraits(TaskPriority::BEST_EFFORT,
+                                    TaskShutdownBehavior::BLOCK_SHUTDOWN));
     EXPECT_FALSE(tracker.WillScheduleSequence(sequence, &observer));
     preempted_sequences.push_back(std::move(sequence));
 
@@ -1369,12 +1415,15 @@
         FROM_HERE, Bind([]() {
           EXPECT_DCHECK_DEATH({ internal::AssertBaseSyncPrimitivesAllowed(); });
         }),
-        TaskTraits(), TimeDelta());
-    EXPECT_TRUE(task_tracker->WillPostTask(&task_without_sync_primitives));
+        TimeDelta());
+    TaskTraits default_traits = {};
+    EXPECT_TRUE(task_tracker->WillPostTask(&task_without_sync_primitives,
+                                           default_traits.shutdown_behavior()));
     testing::StrictMock<MockCanScheduleSequenceObserver>
         never_notified_observer;
     auto sequence_without_sync_primitives = task_tracker->WillScheduleSequence(
-        test::CreateSequenceWithTask(std::move(task_without_sync_primitives)),
+        test::CreateSequenceWithTask(std::move(task_without_sync_primitives),
+                                     default_traits),
         &never_notified_observer);
     ASSERT_TRUE(sequence_without_sync_primitives);
     task_tracker->RunAndPopNextTask(std::move(sequence_without_sync_primitives),
@@ -1388,10 +1437,15 @@
           // Shouldn't fail.
           internal::AssertBaseSyncPrimitivesAllowed();
         }),
-        TaskTraits(WithBaseSyncPrimitives()), TimeDelta());
-    EXPECT_TRUE(task_tracker->WillPostTask(&task_with_sync_primitives));
+        TimeDelta());
+    TaskTraits traits_with_sync_primitives =
+        TaskTraits(WithBaseSyncPrimitives());
+    EXPECT_TRUE(task_tracker->WillPostTask(
+        &task_with_sync_primitives,
+        traits_with_sync_primitives.shutdown_behavior()));
     auto sequence_with_sync_primitives = task_tracker->WillScheduleSequence(
-        test::CreateSequenceWithTask(std::move(task_with_sync_primitives)),
+        test::CreateSequenceWithTask(std::move(task_with_sync_primitives),
+                                     traits_with_sync_primitives),
         &never_notified_observer);
     ASSERT_TRUE(sequence_with_sync_primitives);
     task_tracker->RunAndPopNextTask(std::move(sequence_with_sync_primitives),
@@ -1460,13 +1514,13 @@
        "UserBlockingTaskPriority_MayBlock"}};
 
   for (const auto& test : kTests) {
-    Task task(FROM_HERE, DoNothing(), test.traits, TimeDelta());
-    ASSERT_TRUE(tracker.WillPostTask(&task));
+    Task task(FROM_HERE, DoNothing(), TimeDelta());
+    ASSERT_TRUE(tracker.WillPostTask(&task, test.traits.shutdown_behavior()));
 
     HistogramTester tester;
 
     auto sequence = tracker.WillScheduleSequence(
-        test::CreateSequenceWithTask(std::move(task)),
+        test::CreateSequenceWithTask(std::move(task), test.traits),
         &never_notified_observer);
     ASSERT_TRUE(sequence);
     tracker.RunAndPopNextTask(std::move(sequence), &never_notified_observer);
diff --git a/base/task/task_scheduler/task_unittest.cc b/base/task/task_scheduler/task_unittest.cc
deleted file mode 100644
index 21f26a55..0000000
--- a/base/task/task_scheduler/task_unittest.cc
+++ /dev/null
@@ -1,60 +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.
-
-#include "base/task/task_scheduler/task.h"
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/location.h"
-#include "base/task/task_traits.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-// Verify that the shutdown behavior of a BLOCK_SHUTDOWN delayed task is
-// adjusted to SKIP_ON_SHUTDOWN. The shutown behavior of other delayed tasks
-// should not change.
-TEST(TaskSchedulerTaskTest, ShutdownBehaviorChangeWithDelay) {
-  Task continue_on_shutdown(FROM_HERE, DoNothing(),
-                            {TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
-                            TimeDelta::FromSeconds(1));
-  EXPECT_EQ(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN,
-            continue_on_shutdown.traits.shutdown_behavior());
-
-  Task skip_on_shutdown(FROM_HERE, DoNothing(),
-                        {TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
-                        TimeDelta::FromSeconds(1));
-  EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
-            skip_on_shutdown.traits.shutdown_behavior());
-
-  Task block_shutdown(FROM_HERE, DoNothing(),
-                      {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-                      TimeDelta::FromSeconds(1));
-  EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
-            block_shutdown.traits.shutdown_behavior());
-}
-
-// Verify that the shutdown behavior of undelayed tasks is not adjusted.
-TEST(TaskSchedulerTaskTest, NoShutdownBehaviorChangeNoDelay) {
-  Task continue_on_shutdown(FROM_HERE, DoNothing(),
-                            {TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
-                            TimeDelta());
-  EXPECT_EQ(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN,
-            continue_on_shutdown.traits.shutdown_behavior());
-
-  Task skip_on_shutdown(FROM_HERE, DoNothing(),
-                        {TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, TimeDelta());
-  EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
-            skip_on_shutdown.traits.shutdown_behavior());
-
-  Task block_shutdown(FROM_HERE, DoNothing(),
-                      {TaskShutdownBehavior::BLOCK_SHUTDOWN}, TimeDelta());
-  EXPECT_EQ(TaskShutdownBehavior::BLOCK_SHUTDOWN,
-            block_shutdown.traits.shutdown_behavior());
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task/task_scheduler/test_utils.cc b/base/task/task_scheduler/test_utils.cc
index 2ae3363..e1c82b6c 100644
--- a/base/task/task_scheduler/test_utils.cc
+++ b/base/task/task_scheduler/test_utils.cc
@@ -16,8 +16,9 @@
 MockSchedulerWorkerObserver::MockSchedulerWorkerObserver() = default;
 MockSchedulerWorkerObserver::~MockSchedulerWorkerObserver() = default;
 
-scoped_refptr<Sequence> CreateSequenceWithTask(Task task) {
-  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>();
+scoped_refptr<Sequence> CreateSequenceWithTask(Task task,
+                                               const TaskTraits& traits) {
+  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>(traits);
   sequence->PushTask(std::move(task));
   return sequence;
 }
diff --git a/base/task/task_scheduler/test_utils.h b/base/task/task_scheduler/test_utils.h
index e678a43..30ef299 100644
--- a/base/task/task_scheduler/test_utils.h
+++ b/base/task/task_scheduler/test_utils.h
@@ -8,6 +8,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/task/task_scheduler/scheduler_worker_observer.h"
 #include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
@@ -35,8 +36,10 @@
 // parametrize relevant task_scheduler tests.
 enum class ExecutionMode { PARALLEL, SEQUENCED, SINGLE_THREADED };
 
-// Creates a Sequence and pushes |task| to it. Returns that sequence.
-scoped_refptr<Sequence> CreateSequenceWithTask(Task task);
+// Creates a Sequence with given |traits| and pushes |task| to it. Returns that
+// Sequence.
+scoped_refptr<Sequence> CreateSequenceWithTask(Task task,
+                                               const TaskTraits& traits);
 
 // Creates a TaskRunner that posts tasks to |worker_pool| with the
 // |execution_mode| execution mode and the WithBaseSyncPrimitives() trait.
diff --git a/base/test/launcher/test_launcher.cc b/base/test/launcher/test_launcher.cc
index c3bbd2a..c2a62de3 100644
--- a/base/test/launcher/test_launcher.cc
+++ b/base/test/launcher/test_launcher.cc
@@ -364,6 +364,21 @@
                                      base::File::FLAG_DELETE_ON_CLOSE))
                       .release()});
 
+  // The test launcher can use a shared data directory for providing tests with
+  // files deployed at runtime. The files are located under the directory
+  // "/data/shared". They will be mounted at "/test-shared" under the child
+  // process' namespace.
+  const base::FilePath kSharedDataSourcePath("/data/shared");
+  const base::FilePath kSharedDataTargetPath("/test-shared");
+  if (base::PathExists(kSharedDataSourcePath)) {
+    zx::handle shared_directory_handle = base::fuchsia::GetHandleFromFile(
+        base::File(kSharedDataSourcePath,
+                   base::File::FLAG_OPEN | base::File::FLAG_READ |
+                       base::File::FLAG_DELETE_ON_CLOSE));
+    new_options.paths_to_transfer.push_back(
+        {kSharedDataTargetPath, shared_directory_handle.release()});
+  }
+
 #endif  // defined(OS_FUCHSIA)
 
 #if defined(OS_LINUX)
diff --git a/base/trace_event/cfi_backtrace_android_unittest.cc b/base/trace_event/cfi_backtrace_android_unittest.cc
index fdca674..4f21091d 100644
--- a/base/trace_event/cfi_backtrace_android_unittest.cc
+++ b/base/trace_event/cfi_backtrace_android_unittest.cc
@@ -88,7 +88,7 @@
       WriteFile(temp_path, reinterpret_cast<char*>(input), sizeof(input)));
 
   unwinder->cfi_mmap_.reset(new MemoryMappedFile());
-  unwinder->cfi_mmap_->Initialize(temp_path);
+  ASSERT_TRUE(unwinder->cfi_mmap_->Initialize(temp_path));
   unwinder->ParseCFITables();
 
   CFIBacktraceAndroid::CFIRow cfi_row = {0};
diff --git a/crypto/wincrypt_shim.h b/base/win/wincrypt_shim.h
similarity index 88%
rename from crypto/wincrypt_shim.h
rename to base/win/wincrypt_shim.h
index dcfd4ad..ba94a87 100644
--- a/crypto/wincrypt_shim.h
+++ b/base/win/wincrypt_shim.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CRYPTO_WINCRYPT_SHIM_H_
-#define CRYPTO_WINCRYPT_SHIM_H_
+#ifndef BASE_WIN_WINCRYPT_SHIM_H_
+#define BASE_WIN_WINCRYPT_SHIM_H_
 
 // wincrypt.h defines macros which conflict with OpenSSL's types. This header
 // includes wincrypt and undefines the OpenSSL macros which conflict. Any
@@ -22,4 +22,4 @@
 #define WINCRYPT_X509_EXTENSIONS ((LPCSTR) 5)
 #define WINCRYPT_X509_NAME ((LPCSTR) 7)
 
-#endif  // CRYPTO_WINCRYPT_SHIM_H_
+#endif  // BASE_WIN_WINCRYPT_SHIM_H_
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 2c04eb98..0f7a6b4 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -2028,11 +2028,7 @@
     if (is_win) {
       # Favor speed over size, /O2 must be before the common flags. The GYP
       # build also specifies /Ot, /Oi, and /GF, but these are implied by /O2.
-      if (optimize_for_fuzzing) {
-        cflags = [ "/O1" ] + common_optimize_on_cflags
-      } else {
-        cflags = [ "/O2" ] + common_optimize_on_cflags
-      }
+      cflags = [ "/O2" ] + common_optimize_on_cflags
 
       if (is_official_build) {
         if (!is_clang) {
@@ -2079,11 +2075,7 @@
     if (is_win) {
       # Favor speed over size, /O2 must be before the common flags. The GYP
       # build also specifies /Ot, /Oi, and /GF, but these are implied by /O2.
-      if (optimize_for_fuzzing) {
-        cflags = [ "/O1" ] + common_optimize_on_cflags
-      } else {
-        cflags = [ "/O2" ] + common_optimize_on_cflags
-      }
+      cflags = [ "/O2" ] + common_optimize_on_cflags
 
       # TODO(thakis): Remove is_clang here, https://crbug.com/598772
       if (is_official_build && !is_clang) {
@@ -2106,11 +2098,7 @@
 }
 
 config("optimize_fuzzing") {
-  if (is_win) {
-    cflags = [ "/O1" ] + common_optimize_on_cflags
-  } else {
-    cflags = [ "-O1" ] + common_optimize_on_cflags
-  }
+  cflags = [ "-O1" ] + common_optimize_on_cflags
   ldflags = common_optimize_on_ldflags
   visibility = [ ":default_optimization" ]
 }
@@ -2125,6 +2113,8 @@
   } else if (is_debug) {
     configs = [ ":no_optimize" ]
   } else if (optimize_for_fuzzing) {
+    assert(!is_win, "Fuzzing optimize level not supported on Windows")
+
     # Coverage build is quite slow. Using "optimize_for_fuzzing" makes it even
     # slower as it uses "-O1" instead of "-O3". Prevent that from happening.
     assert(!use_clang_coverage,
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 02e84682..009b0fee 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-f6aecda1ac4ac27a062cfb98ce0b9da3e9a8b00b
\ No newline at end of file
+e2c36387bb98e7464542f787d3961381074d7824
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 69474418..44a4987 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-75b5a9dd299fb05296c9ca03af2e878e12ed1d98
\ No newline at end of file
+c7c355bcc1488b0a7e708ccb7fc11200fe6b3e24
\ No newline at end of file
diff --git a/build/fuchsia/net_test_server.py b/build/fuchsia/net_test_server.py
index 2849c44..a72703d 100644
--- a/build/fuchsia/net_test_server.py
+++ b/build/fuchsia/net_test_server.py
@@ -130,6 +130,7 @@
   }))
 
   config_file.flush()
-  target.PutFile(config_file.name, '/data/net-test-server-config')
+  target.RunCommand(['mkdir /data/shared'])
+  target.PutFile(config_file.name, '/data/shared/net-test-server-config')
 
   return spawning_server
diff --git a/build/linux/sysroot_scripts/packagelist.sid.amd64 b/build/linux/sysroot_scripts/packagelist.sid.amd64
index 8b55aa1..5b11066e 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.amd64
+++ b/build/linux/sysroot_scripts/packagelist.sid.amd64
@@ -1,126 +1,126 @@
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2_1.1.6-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2-dev_1.1.6-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.28.1-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.28.1-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.26.2-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.26.2-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.28.0-3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.28.0-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.30.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.30.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.30.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.30.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.30.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.30.0-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/a/attr/libattr1_2.4.47-2+b2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.3-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.4-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-client3_0.7-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-common3_0.7-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth3_5.50-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth-dev_5.50-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi0.6_5.6-5_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi-dev_5.6-5_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.10-3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.10-3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.10-3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.10-3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.3.3-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.12-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.12-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.12-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.12-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.4.3-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2_2.2.8-5_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2-dev_2.2.8-5_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2_2.2.8-5_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2-dev_2.2.8-5_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-3_1.12.10-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_1.12.10-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.170-0.5_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf-dev_0.170-0.5_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.6-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.6-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.0-5_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.0-5_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6-dev_2.8.1-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi0_1.0.5-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi-dev_1.0.5-3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libasan3_6.4.0-20_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-20_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-20_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libcilkrts5_7.3.0-28_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libubsan0_7.3.0-28_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libitm1_8.2.0-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/liblsan0_8.2.0-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libmpx2_8.2.0-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libquadmath0_8.2.0-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libtsan0_8.2.0-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.36.12-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.36.12-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.56.1-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.56.1-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-5_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-5_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libasan3_6.4.0-22_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-22_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-22_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libcilkrts5_7.3.0-29_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libubsan0_7.3.0-29_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libitm1_8.2.0-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/liblsan0_8.2.0-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libmpx2_8.2.0-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libquadmath0_8.2.0-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libtsan0_8.2.0-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.38.0+dfsg-6_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.38.0+dfsg-6_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.58.1-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.58.1-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-6_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-6_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/g/gmp/libgmp10_6.1.2+dfsg-3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1+b1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-0_1.8.2-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-dev_1.8.2-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.11-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.11-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.12-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.12-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.32-3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.22.30-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.22.30-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.24.1-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.1-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-0_3.91.2-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-dev_3.91.2-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.8.8-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.8.8-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.8.8-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.8.8-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.9.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.9.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.9.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.9.0-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git161113-5_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu57_57.1-9_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu60_60.2-6_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/j/json-glib/libjson-glib-1.0-0_1.4.2-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/k/keyutils/libkeyutils1_1.5.9-9.3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-6_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-6_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-6_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-6_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-7_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/liba/libasyncns/libasyncns0_0.8-6_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libb/libbsd/libbsd0_0.9.1-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap2_2.25-1.2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap-dev_2.25-1.2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libd/libdatrie/libdatrie1_0.2.12-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_16.04.1+18.04.20171206-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_16.04.1+18.04.20171206-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_16.04.1+18.04.20171206-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_16.04.1+18.04.20171206-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.93-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.93-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.93-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-intel1_2.4.93-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.93-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.93-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.4.3-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.4.3-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr490+repack1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr490+repack1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr490+repack1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr490+repack1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.94-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.94-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.94-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-intel1_2.4.94-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.94-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.94-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.5.2-0.3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.5.2-0.3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libe/libevent/libevent-2.1-6_2.1.8-stable-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi6_3.2.1-8_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-6_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-7_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.2.1-8_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20_1.8.3-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.3-1_amd64.deb
@@ -138,10 +138,10 @@
 http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-dev_1.32-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libice/libice6_1.0.9-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidl/libidl-2-0_0.8.14-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.4-2.2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.5-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidn/libidn11_1.33-2.2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-3+b1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-3+b1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-4_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_1.5.2-2+b1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_1.5.2-2+b1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp1_1.7.4-3_amd64.deb
@@ -158,18 +158,18 @@
 http://ftp.us.debian.org/debian/pool/main/libs/libselinux/libselinux1_2.8-1+b1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsm/libsm6_1.2.2-1+b3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsndfile/libsndfile1_1.0.28-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.62.2-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.62.2-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.64.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.64.1-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libtasn1-6/libtasn1-6_4.13-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libthai/libthai0_0.1.28-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-2.1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libu/libunistring/libunistring2_0.9.10-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.2.0-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.2.0-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.2.0-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.2.0-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.2.0-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.2.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.3.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.3.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.3.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.3.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.3.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.3.0-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.6-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.6-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx5_1.7.0-3_amd64.deb
@@ -178,24 +178,26 @@
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.1-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.1-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.5-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.5-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.5-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.5-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.6-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.6-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.6-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.6-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau6_1.0.8-1+b2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau-dev_1.0.8-1+b2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0-dev_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite1_0.4.4-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.4-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor1_1.1.15-1_amd64.deb
@@ -210,10 +212,10 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi6_1.7.9-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi-dev_1.7.9-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.3-1+b3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.3-1+b3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.0-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.4-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.2-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.2-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2_2.9.4+dfsg1-7+b1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2-dev_2.9.4+dfsg1-7+b1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_amd64.deb
@@ -223,49 +225,50 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.32-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.32-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.3-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.3-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt-dev_1.1.5-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst6_1.2.3-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.17.17-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.18.10-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/l/lz4/liblz4-1_1.8.2-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/l/lzo2/liblzo2-2_2.10-0.1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.6-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.6-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.6-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.6-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.6-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.6-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.6-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.6-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.6-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.8-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.8-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.8-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.8-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.8-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.8-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.8-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.8-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.8-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip1_1.1-8+b1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip-dev_1.1-8+b1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libhogweed4_3.4-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libnettle6_3.4-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.19-3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.19-3_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.38-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.38-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.20-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.20-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.39-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.39-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2o-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0h-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0h-4_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.1-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.1-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.3~beta+20180518-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.3~beta+20180518-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.13-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.14-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g_1.1.8-3.8_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g-dev_1.1.8-3.8_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-3_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5+b2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci3_3.5.2-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci-dev_3.5.2-1_amd64.deb
@@ -279,33 +282,34 @@
 http://ftp.us.debian.org/debian/pool/main/p/pipewire/libspa-lib-0.1-dev_0.2.3-3_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-0_0.34.0-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-dev_0.34.0-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.0-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.0-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.0-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180701+dfsg-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180701+dfsg-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.2-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.2-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.2-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180901+dfsg-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180901+dfsg-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/shared-mime-info/shared-mime-info_1.10-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-6_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-6_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-6_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.24.0-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-7_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-7_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-7_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.25.2-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-10_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-10_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/t/tcp-wrappers/libwrap0_7.6.q-27_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/t/tiff/libtiff5_4.0.9-6_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound2_1.7.3-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound8_1.8.0-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.32.1-0.1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.32.1-0.1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.32.1-0.1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.32.1-0.1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/v/vulkan/libvulkan1_1.1.73+dfsg-1_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.15.0-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.15.0-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.15.0-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.15.0-2_amd64.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.15.0-2_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.16.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.16.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.16.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.16.0-1_amd64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.16.0-1_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland-protocols/wayland-protocols_1.16-1_all.deb
 http://ftp.us.debian.org/debian/pool/main/x/xft/libxft2_2.3.2-2_amd64.deb
 http://ftp.us.debian.org/debian/pool/main/x/xorgproto/x11proto-composite-dev_2018.4-4_all.deb
diff --git a/build/linux/sysroot_scripts/packagelist.sid.arm b/build/linux/sysroot_scripts/packagelist.sid.arm
index 2beae8e..c6c86be2 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.arm
+++ b/build/linux/sysroot_scripts/packagelist.sid.arm
@@ -1,124 +1,124 @@
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2_1.1.6-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2-dev_1.1.6-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.28.1-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.28.1-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.26.2-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.26.2-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.28.0-3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.28.0-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.30.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.30.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.30.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.30.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.30.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.30.0-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/a/attr/libattr1_2.4.47-2+b2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.3-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.4-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-client3_0.7-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-common3_0.7-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth3_5.50-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth-dev_5.50-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi0.6_5.6-5_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi-dev_5.6-5_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.10-3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.10-3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.10-3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.10-3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.3.3-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.12-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.12-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.12-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.12-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.4.3-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2_2.2.8-5_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2-dev_2.2.8-5_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2_2.2.8-5_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2-dev_2.2.8-5_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-3_1.12.10-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_1.12.10-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.170-0.5_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf-dev_0.170-0.5_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.6-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.6-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.0-5_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.0-5_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6-dev_2.8.1-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi0_1.0.5-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi-dev_1.0.5-3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libasan3_6.4.0-20_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-20_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-20_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libubsan0_7.3.0-28_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-4_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-4_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-4_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-4_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.36.12-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.36.12-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.56.1-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.56.1-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-5_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-5_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libasan3_6.4.0-22_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-22_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-22_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libubsan0_7.3.0-29_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.38.0+dfsg-6_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.38.0+dfsg-6_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.58.1-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.58.1-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-6_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-6_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/g/gmp/libgmp10_6.1.2+dfsg-3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1+b1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-0_1.8.2-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-dev_1.8.2-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.11-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.11-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.12-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.12-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.32-3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.22.30-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.22.30-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.24.1-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.1-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-0_3.91.2-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-dev_3.91.2-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.8.8-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.8.8-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.8.8-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.8.8-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.9.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.9.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.9.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.9.0-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git161113-5_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu57_57.1-9_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu60_60.2-6_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/j/json-glib/libjson-glib-1.0-0_1.4.2-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/k/keyutils/libkeyutils1_1.5.9-9.3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-6_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-6_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-6_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-6_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-7_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/liba/libasyncns/libasyncns0_0.8-6_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libb/libbsd/libbsd0_0.9.1-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap2_2.25-1.2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap-dev_2.25-1.2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libd/libdatrie/libdatrie1_0.2.12-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_16.04.1+18.04.20171206-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_16.04.1+18.04.20171206-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_16.04.1+18.04.20171206-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_16.04.1+18.04.20171206-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.93-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.93-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.93-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-etnaviv1_2.4.93-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-exynos1_2.4.93-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-freedreno1_2.4.93-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.93-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-omap1_2.4.93-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.93-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-tegra0_2.4.93-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.4.3-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.4.3-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr490+repack1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr490+repack1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr490+repack1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr490+repack1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.94-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.94-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.94-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-etnaviv1_2.4.94-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-exynos1_2.4.94-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-freedreno1_2.4.94-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.94-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-omap1_2.4.94-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.94-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-tegra0_2.4.94-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.5.2-0.3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.5.2-0.3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libe/libevent/libevent-2.1-6_2.1.8-stable-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi6_3.2.1-8_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-6_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-7_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.2.1-8_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20_1.8.3-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.3-1_armhf.deb
@@ -136,10 +136,10 @@
 http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-dev_1.32-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libice/libice6_1.0.9-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidl/libidl-2-0_0.8.14-4_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.4-2.2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.5-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidn/libidn11_1.33-2.2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-3+b1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-3+b1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-4_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_1.5.2-2+b1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_1.5.2-2+b1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp1_1.7.4-3_armhf.deb
@@ -156,18 +156,18 @@
 http://ftp.us.debian.org/debian/pool/main/libs/libselinux/libselinux1_2.8-1+b1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsm/libsm6_1.2.2-1+b3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsndfile/libsndfile1_1.0.28-4_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.62.2-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.62.2-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.64.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.64.0-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libtasn1-6/libtasn1-6_4.13-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libthai/libthai0_0.1.28-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-2.1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libu/libunistring/libunistring2_0.9.10-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.2.0-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.2.0-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.2.0-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.2.0-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.2.0-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.2.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.3.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.3.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.3.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.3.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.3.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.3.0-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.6-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.6-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx5_1.7.0-3_armhf.deb
@@ -176,24 +176,26 @@
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.1-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.1-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.5-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.5-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.5-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.5-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.6-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.6-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.6-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.6-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau6_1.0.8-1+b2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau-dev_1.0.8-1+b2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0-dev_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite1_0.4.4-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.4-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor1_1.1.15-1_armhf.deb
@@ -208,10 +210,10 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi6_1.7.9-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi-dev_1.7.9-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.3-1+b3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.3-1+b3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.0-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.4-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.2-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.2-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2_2.9.4+dfsg1-7+b1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2-dev_2.9.4+dfsg1-7+b1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_armhf.deb
@@ -221,49 +223,50 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.32-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.32-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.3-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.3-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt-dev_1.1.5-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst6_1.2.3-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.17.17-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.18.6-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/l/lz4/liblz4-1_1.8.2-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/l/lzo2/liblzo2-2_2.10-0.1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.6-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.6-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.6-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.6-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.6-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.6-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.6-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.6-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.6-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.8-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.8-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.8-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.8-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.8-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.8-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.8-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.8-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.8-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip1_1.1-8+b1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip-dev_1.1-8+b1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libhogweed4_3.4-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libnettle6_3.4-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.19-3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.19-3_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.38-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.38-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.20-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.20-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.39-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.39-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2o-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0h-4_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0h-4_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.1-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.1-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.3~beta+20180518-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.3~beta+20180518-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.13-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.14-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g_1.1.8-3.8_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g-dev_1.1.8-3.8_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-3_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5+b2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci3_3.5.2-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci-dev_3.5.2-1_armhf.deb
@@ -277,33 +280,34 @@
 http://ftp.us.debian.org/debian/pool/main/p/pipewire/libspa-lib-0.1-dev_0.2.3-3_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-0_0.34.0-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-dev_0.34.0-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.0-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.0-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.0-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180701+dfsg-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180701+dfsg-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.2-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.2-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.2-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180901+dfsg-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180901+dfsg-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/shared-mime-info/shared-mime-info_1.10-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-6_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-6_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-6_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.24.0-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-7_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-7_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-7_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.25.2-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-10_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-10_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-10_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/t/tcp-wrappers/libwrap0_7.6.q-27_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/t/tiff/libtiff5_4.0.9-6_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound2_1.7.3-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound8_1.8.0-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.32.1-0.1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.32.1-0.1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.32.1-0.1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.32.1-0.1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/v/vulkan/libvulkan1_1.1.73+dfsg-1_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.15.0-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.15.0-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.15.0-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.15.0-2_armhf.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.15.0-2_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.16.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.16.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.16.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.16.0-1_armhf.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.16.0-1_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland-protocols/wayland-protocols_1.16-1_all.deb
 http://ftp.us.debian.org/debian/pool/main/x/xft/libxft2_2.3.2-2_armhf.deb
 http://ftp.us.debian.org/debian/pool/main/x/xorgproto/x11proto-composite-dev_2018.4-4_all.deb
diff --git a/build/linux/sysroot_scripts/packagelist.sid.arm64 b/build/linux/sysroot_scripts/packagelist.sid.arm64
index d343c9a..2ad21f5 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.arm64
+++ b/build/linux/sysroot_scripts/packagelist.sid.arm64
@@ -1,123 +1,124 @@
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2_1.1.6-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2-dev_1.1.6-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.28.1-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.28.1-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.26.2-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.26.2-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.28.0-3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.28.0-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.30.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.30.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.30.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.30.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.30.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.30.0-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/a/attr/libattr1_2.4.47-2+b2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.3-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.4-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-client3_0.7-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-common3_0.7-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth3_5.50-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth-dev_5.50-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi0.6_5.6-5_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi-dev_5.6-5_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.10-3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.10-3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.10-3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.10-3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.3.3-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.12-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.12-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.12-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.12-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.4.3-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2_2.2.8-5_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2-dev_2.2.8-5_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2_2.2.8-5_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2-dev_2.2.8-5_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-3_1.12.10-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_1.12.10-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.170-0.5_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf-dev_0.170-0.5_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.6-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.6-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.0-5_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.0-5_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6-dev_2.8.1-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi0_1.0.5-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi-dev_1.0.5-3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libasan3_6.4.0-20_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-20_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-20_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libubsan0_7.3.0-28_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-4_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-4_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-4_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libitm1_8.2.0-4_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-4_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.36.12-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.36.12-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.56.1-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.56.1-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-5_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-5_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libasan3_6.4.0-22_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-22_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-22_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libubsan0_7.3.0-29_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libitm1_8.2.0-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.38.0+dfsg-6_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.38.0+dfsg-6_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.58.1-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.58.1-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-6_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-6_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/g/gmp/libgmp10_6.1.2+dfsg-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/g/gmp/libgmp10_6.1.2+dfsg-3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1+b1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-0_1.8.2-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-dev_1.8.2-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.11-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.11-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.12-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.12-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.32-3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.22.30-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.22.30-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.24.1-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.1-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-0_3.91.2-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-dev_3.91.2-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.8.8-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.8.8-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.8.8-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.8.8-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.9.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.9.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.9.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.9.0-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git161113-5_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu57_57.1-9_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu60_60.2-6_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/j/json-glib/libjson-glib-1.0-0_1.4.2-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/k/keyutils/libkeyutils1_1.5.9-9.3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-6_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-6_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-6_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-6_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-7_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/liba/libasyncns/libasyncns0_0.8-6_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libb/libbsd/libbsd0_0.9.1-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap2_2.25-1.2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap-dev_2.25-1.2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libd/libdatrie/libdatrie1_0.2.12-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_16.04.1+18.04.20171206-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_16.04.1+18.04.20171206-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_16.04.1+18.04.20171206-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_16.04.1+18.04.20171206-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.93-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.93-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.93-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-freedreno1_2.4.93-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.93-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.93-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-tegra0_2.4.93-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.4.3-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.4.3-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr490+repack1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr490+repack1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr490+repack1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr490+repack1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.94-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.94-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.94-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-etnaviv1_2.4.94-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-freedreno1_2.4.94-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.94-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.94-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-tegra0_2.4.94-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.5.2-0.3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.5.2-0.3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libe/libevent/libevent-2.1-6_2.1.8-stable-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi6_3.2.1-8_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-6_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-7_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.2.1-8_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20_1.8.3-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.3-1_arm64.deb
@@ -135,10 +136,10 @@
 http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-dev_1.32-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libice/libice6_1.0.9-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidl/libidl-2-0_0.8.14-4_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.4-2.2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.5-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidn/libidn11_1.33-2.2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-3+b1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-3+b1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-4_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_1.5.2-2+b1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_1.5.2-2+b1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp1_1.7.4-3_arm64.deb
@@ -155,19 +156,19 @@
 http://ftp.us.debian.org/debian/pool/main/libs/libselinux/libselinux1_2.8-1+b1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsm/libsm6_1.2.2-1+b3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsndfile/libsndfile1_1.0.28-4_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.62.2-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.62.2-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.64.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.64.1-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libtasn1-6/libtasn1-6_4.13-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libthai/libthai0_0.1.28-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libthai/libthai0_0.1.28-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-2.1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libu/libunistring/libunistring2_0.9.10-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.2.0-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.2.0-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.2.0-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.2.0-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.2.0-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.2.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.3.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.3.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.3.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.3.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.3.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.3.0-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.6-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.6-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx5_1.7.0-3_arm64.deb
@@ -176,24 +177,26 @@
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.1-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.1-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.5-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.5-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.5-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.5-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.6-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.6-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.6-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.6-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau6_1.0.8-1+b2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau-dev_1.0.8-1+b2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0-dev_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite1_0.4.4-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.4-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor1_1.1.15-1_arm64.deb
@@ -208,10 +211,10 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi6_1.7.9-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi-dev_1.7.9-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.3-1+b3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.3-1+b3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.0-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.4-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.2-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.2-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2_2.9.4+dfsg1-7+b1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2-dev_2.9.4+dfsg1-7+b1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_arm64.deb
@@ -221,49 +224,50 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.32-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.32-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.3-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.3-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt-dev_1.1.5-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst6_1.2.3-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.17.17-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.18.6-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/l/lz4/liblz4-1_1.8.2-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/l/lzo2/liblzo2-2_2.10-0.1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.6-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.6-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.6-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.6-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.6-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.6-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.6-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.6-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.6-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.8-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.8-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.8-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.8-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.8-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.8-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.8-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.8-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.8-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip1_1.1-8+b1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip-dev_1.1-8+b1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libhogweed4_3.4-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libnettle6_3.4-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.19-3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.19-3_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.38-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.38-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.20-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.20-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.39-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.39-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2o-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0h-4_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0h-4_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.1-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.1-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.3~beta+20180518-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.3~beta+20180518-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.13-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.14-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g_1.1.8-3.8_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g-dev_1.1.8-3.8_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-3_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5+b2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci3_3.5.2-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci-dev_3.5.2-1_arm64.deb
@@ -277,33 +281,34 @@
 http://ftp.us.debian.org/debian/pool/main/p/pipewire/libspa-lib-0.1-dev_0.2.3-3_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-0_0.34.0-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-dev_0.34.0-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.0-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.0-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.0-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180701+dfsg-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180701+dfsg-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.2-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.2-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.2-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180901+dfsg-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180901+dfsg-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/shared-mime-info/shared-mime-info_1.10-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-6_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-6_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-6_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.24.0-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-7_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-7_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-7_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.25.2-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-10_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-10_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-10_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/t/tcp-wrappers/libwrap0_7.6.q-27_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/t/tiff/libtiff5_4.0.9-6_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound2_1.7.3-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound8_1.8.0-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.32.1-0.1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.32.1-0.1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.32.1-0.1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.32.1-0.1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/v/vulkan/libvulkan1_1.1.73+dfsg-1_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.15.0-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.15.0-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.15.0-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.15.0-2_arm64.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.15.0-2_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.16.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.16.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.16.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.16.0-1_arm64.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.16.0-1_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland-protocols/wayland-protocols_1.16-1_all.deb
 http://ftp.us.debian.org/debian/pool/main/x/xft/libxft2_2.3.2-2_arm64.deb
 http://ftp.us.debian.org/debian/pool/main/x/xorgproto/x11proto-composite-dev_2018.4-4_all.deb
diff --git a/build/linux/sysroot_scripts/packagelist.sid.i386 b/build/linux/sysroot_scripts/packagelist.sid.i386
index 6364fd6..dee9a841 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.i386
+++ b/build/linux/sysroot_scripts/packagelist.sid.i386
@@ -1,124 +1,124 @@
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2_1.1.6-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2-dev_1.1.6-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.28.1-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.28.1-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.26.2-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.26.2-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.28.0-3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.28.0-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.30.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.30.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.30.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.30.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.30.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.30.0-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/a/attr/libattr1_2.4.47-2+b2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.3-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.4-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-client3_0.7-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-common3_0.7-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth3_5.50-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth-dev_5.50-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi0.6_5.6-5_i386.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi-dev_5.6-5_i386.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.10-3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.10-3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.10-3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.10-3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.3.3-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.12-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.12-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.12-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.12-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.4.3-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2_2.2.8-5_i386.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2-dev_2.2.8-5_i386.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2_2.2.8-5_i386.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2-dev_2.2.8-5_i386.deb
-http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-3_1.12.10-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_1.12.10-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.170-0.5_i386.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf-dev_0.170-0.5_i386.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.6-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.6-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.0-5_i386.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.0-5_i386.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6-dev_2.8.1-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi0_1.0.5-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi-dev_1.0.5-3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libasan3_6.4.0-20_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-20_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-20_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libcilkrts5_7.3.0-28_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libubsan0_7.3.0-28_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-4_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-4_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-4_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libitm1_8.2.0-4_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libmpx2_8.2.0-4_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libquadmath0_8.2.0-4_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-4_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.36.12-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.36.12-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.56.1-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.56.1-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-5_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-5_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libasan3_6.4.0-22_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-22_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-22_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libcilkrts5_7.3.0-29_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-7/libubsan0_7.3.0-29_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libitm1_8.2.0-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libmpx2_8.2.0-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libquadmath0_8.2.0-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.38.0+dfsg-6_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.38.0+dfsg-6_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.58.1-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.58.1-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-6_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-6_i386.deb
 http://ftp.us.debian.org/debian/pool/main/g/gmp/libgmp10_6.1.2+dfsg-3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1+b1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-0_1.8.2-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-dev_1.8.2-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.11-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.11-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.12-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.12-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.32-3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.22.30-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.22.30-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.24.1-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.1-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-0_3.91.2-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-dev_3.91.2-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.8.8-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.8.8-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.8.8-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.8.8-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.9.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.9.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.9.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.9.0-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git161113-5_i386.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu57_57.1-9_i386.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu60_60.2-6_i386.deb
 http://ftp.us.debian.org/debian/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/j/json-glib/libjson-glib-1.0-0_1.4.2-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/k/keyutils/libkeyutils1_1.5.9-9.3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-6_i386.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-6_i386.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-6_i386.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-6_i386.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-7_i386.deb
 http://ftp.us.debian.org/debian/pool/main/liba/libasyncns/libasyncns0_0.8-6_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libb/libbsd/libbsd0_0.9.1-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap2_2.25-1.2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap-dev_2.25-1.2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libd/libdatrie/libdatrie1_0.2.12-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_16.04.1+18.04.20171206-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_16.04.1+18.04.20171206-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_16.04.1+18.04.20171206-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_16.04.1+18.04.20171206-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.93-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.93-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.93-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-intel1_2.4.93-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.93-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.93-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.4.3-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.4.3-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr490+repack1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr490+repack1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr490+repack1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr490+repack1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.94-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.94-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.94-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-intel1_2.4.94-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.94-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.94-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.5.2-0.3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.5.2-0.3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libe/libevent/libevent-2.1-6_2.1.8-stable-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi6_3.2.1-8_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-6_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-7_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.2.1-8_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20_1.8.3-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.3-1_i386.deb
@@ -136,10 +136,10 @@
 http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-dev_1.32-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libice/libice6_1.0.9-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidl/libidl-2-0_0.8.14-4_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.4-2.2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.5-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidn/libidn11_1.33-2.2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-3+b1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-3+b1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-4_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_1.5.2-2+b1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_1.5.2-2+b1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp1_1.7.4-3_i386.deb
@@ -156,18 +156,18 @@
 http://ftp.us.debian.org/debian/pool/main/libs/libselinux/libselinux1_2.8-1+b1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsm/libsm6_1.2.2-1+b3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsndfile/libsndfile1_1.0.28-4_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.62.2-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.62.2-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.64.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.64.1-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libtasn1-6/libtasn1-6_4.13-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libthai/libthai0_0.1.28-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-2.1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libu/libunistring/libunistring2_0.9.10-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.2.0-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.2.0-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.2.0-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.2.0-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.2.0-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.2.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.3.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.3.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.3.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.3.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.3.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.3.0-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.6-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.6-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx5_1.7.0-3_i386.deb
@@ -176,24 +176,26 @@
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.1-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.1-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.5-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.5-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.5-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.5-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.6-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.6-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.6-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.6-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau6_1.0.8-1+b2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau-dev_1.0.8-1+b2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0-dev_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite1_0.4.4-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.4-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor1_1.1.15-1_i386.deb
@@ -208,10 +210,10 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi6_1.7.9-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi-dev_1.7.9-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.3-1+b3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.3-1+b3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.0-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.4-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.2-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.2-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2_2.9.4+dfsg1-7+b1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2-dev_2.9.4+dfsg1-7+b1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_i386.deb
@@ -221,49 +223,50 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.32-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.32-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.3-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.3-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt-dev_1.1.5-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst6_1.2.3-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.17.17-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.18.10-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/l/lz4/liblz4-1_1.8.2-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/l/lzo2/liblzo2-2_2.10-0.1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.6-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.6-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.6-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.6-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.6-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.6-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.6-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.6-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.6-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.8-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.8-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.8-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.8-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.8-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.8-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.8-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.8-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.8-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip1_1.1-8+b1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip-dev_1.1-8+b1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libhogweed4_3.4-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libnettle6_3.4-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.19-3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.19-3_i386.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.38-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.38-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.20-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.20-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.39-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.39-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2o-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0h-4_i386.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0h-4_i386.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.1-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.1-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.3~beta+20180518-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.3~beta+20180518-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_i386.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_i386.deb
-http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.13-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.14-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g_1.1.8-3.8_i386.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g-dev_1.1.8-3.8_i386.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-3_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5+b2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci3_3.5.2-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci-dev_3.5.2-1_i386.deb
@@ -277,33 +280,34 @@
 http://ftp.us.debian.org/debian/pool/main/p/pipewire/libspa-lib-0.1-dev_0.2.3-3_i386.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-0_0.34.0-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-dev_0.34.0-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.0-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.0-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.0-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180701+dfsg-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180701+dfsg-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.2-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.2-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.2-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180901+dfsg-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180901+dfsg-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/shared-mime-info/shared-mime-info_1.10-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-6_i386.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-6_i386.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-6_i386.deb
-http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.24.0-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-7_i386.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-7_i386.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-7_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.25.2-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-10_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-10_i386.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-10_i386.deb
 http://ftp.us.debian.org/debian/pool/main/t/tcp-wrappers/libwrap0_7.6.q-27_i386.deb
 http://ftp.us.debian.org/debian/pool/main/t/tiff/libtiff5_4.0.9-6_i386.deb
-http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound2_1.7.3-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound8_1.8.0-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.32.1-0.1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.32.1-0.1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.32.1-0.1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.32.1-0.1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/v/vulkan/libvulkan1_1.1.73+dfsg-1_i386.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.15.0-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.15.0-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.15.0-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.15.0-2_i386.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.15.0-2_i386.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.16.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.16.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.16.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.16.0-1_i386.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.16.0-1_i386.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland-protocols/wayland-protocols_1.16-1_all.deb
 http://ftp.us.debian.org/debian/pool/main/x/xft/libxft2_2.3.2-2_i386.deb
 http://ftp.us.debian.org/debian/pool/main/x/xorgproto/x11proto-composite-dev_2018.4-4_all.deb
diff --git a/build/linux/sysroot_scripts/packagelist.sid.mips64el b/build/linux/sysroot_scripts/packagelist.sid.mips64el
index fdb7b7e..825d387 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.mips64el
+++ b/build/linux/sysroot_scripts/packagelist.sid.mips64el
@@ -1,117 +1,117 @@
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2_1.1.6-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2-dev_1.1.6-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.28.1-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.28.1-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.26.2-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.26.2-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.28.0-3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.28.0-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.30.0-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.30.0-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.30.0-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.30.0-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.30.0-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.30.0-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/a/attr/libattr1_2.4.47-2+b2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.3-1+b1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.4-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-client3_0.7-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-common3_0.7-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth3_5.50-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth-dev_5.50-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi0.6_5.6-5_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi-dev_5.6-5_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.10-3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.10-3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.10-3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.10-3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.3.3-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.12-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.12-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.12-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.12-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.4.3-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2_2.2.8-5_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2-dev_2.2.8-5_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2_2.2.8-5_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2-dev_2.2.8-5_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-3_1.12.10-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_1.12.10-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.170-0.5_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf-dev_0.170-0.5_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.6-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.6-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.0-5_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.0-5_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6-dev_2.8.1-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi0_1.0.5-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi-dev_1.0.5-3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-20_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-20_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-4_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-4_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-4_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-4_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.36.12-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.36.12-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.56.1-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.56.1-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-5_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-5_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-22_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-22_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-7_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-7_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-7_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-7_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.38.0+dfsg-6_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.38.0+dfsg-6_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.58.1-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.58.1-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-6_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-6_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/g/gmp/libgmp10_6.1.2+dfsg-3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1+b1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1+b1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1+b1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1+b1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1+b1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-0_1.8.2-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-dev_1.8.2-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.11-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.11-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.32-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.22.30-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.22.30-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.12-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.12-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.32-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.24.1-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.1-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-0_3.91.2-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-dev_3.91.2-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.8.8-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.8.8-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.8.8-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.8.8-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.9.0-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.9.0-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.9.0-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.9.0-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git161113-5_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu57_57.1-9_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu60_60.2-6_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/j/json-glib/libjson-glib-1.0-0_1.4.2-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/k/keyutils/libkeyutils1_1.5.9-9.3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-6_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-6_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-6_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-6_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-7_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-7_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-7_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-7_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/liba/libasyncns/libasyncns0_0.8-6_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libb/libbsd/libbsd0_0.9.1-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap2_2.25-1.2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap-dev_2.25-1.2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libd/libdatrie/libdatrie1_0.2.12-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_16.04.1+18.04.20171206-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_16.04.1+18.04.20171206-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_16.04.1+18.04.20171206-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_16.04.1+18.04.20171206-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.93-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.93-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.93-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.93-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.93-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.4.3-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.4.3-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr490+repack1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr490+repack1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr490+repack1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr490+repack1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.94-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.94-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.94-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.94-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.94-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.5.2-0.3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.5.2-0.3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libe/libevent/libevent-2.1-6_2.1.8-stable-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi6_3.2.1-8_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-6_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-7_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.2.1-8_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20_1.8.3-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.3-1_mips64el.deb
@@ -129,10 +129,10 @@
 http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-dev_1.32-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libice/libice6_1.0.9-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidl/libidl-2-0_0.8.14-4_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.4-2.2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.5-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidn/libidn11_1.33-2.2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-3+b1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-3+b1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-4_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_1.5.2-2+b1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_1.5.2-2+b1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp1_1.7.4-3_mips64el.deb
@@ -149,18 +149,18 @@
 http://ftp.us.debian.org/debian/pool/main/libs/libselinux/libselinux1_2.8-1+b1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsm/libsm6_1.2.2-1+b3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsndfile/libsndfile1_1.0.28-4+b1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.62.2-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.62.2-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.64.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.64.1-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libtasn1-6/libtasn1-6_4.13-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libthai/libthai0_0.1.28-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-2.1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libu/libunistring/libunistring2_0.9.10-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.2.0-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.2.0-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.2.0-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.2.0-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.2.0-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.2.0-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.3.0-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.3.0-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.3.0-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.3.0-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.3.0-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.3.0-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.6-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.6-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx5_1.7.0-3_mips64el.deb
@@ -169,24 +169,26 @@
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.1-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.1-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.5-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.5-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.5-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.5-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.6-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.6-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.6-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.6-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau6_1.0.8-1+b2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau-dev_1.0.8-1+b2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0-dev_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite1_0.4.4-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.4-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor1_1.1.15-1_mips64el.deb
@@ -201,10 +203,10 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi6_1.7.9-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi-dev_1.7.9-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.3-1+b3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.3-1+b3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.0-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.0-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.4-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.2-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.2-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2_2.9.4+dfsg1-7+b1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2-dev_2.9.4+dfsg1-7+b1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_mips64el.deb
@@ -214,49 +216,50 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.32-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.32-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.3-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.3-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt-dev_1.1.5-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst6_1.2.3-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.17.17-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.18.8-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/l/lz4/liblz4-1_1.8.2-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/l/lzo2/liblzo2-2_2.10-0.1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.6-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.6-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.6-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.6-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.6-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.6-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.6-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.6-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.6-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.8-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.8-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.8-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.8-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.8-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.8-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.8-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.8-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.8-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip1_1.1-8+b1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip-dev_1.1-8+b1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libhogweed4_3.4-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libnettle6_3.4-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.19-3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.19-3_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.38-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.38-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.20-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.20-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.39-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.39-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2o-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0h-4_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0h-4_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.1-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.1-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.3~beta+20180518-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.3~beta+20180518-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.13-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.14-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g_1.1.8-3.8_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g-dev_1.1.8-3.8_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-3_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5+b2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci3_3.5.2-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci-dev_3.5.2-1_mips64el.deb
@@ -270,33 +273,34 @@
 http://ftp.us.debian.org/debian/pool/main/p/pipewire/libspa-lib-0.1-dev_0.2.3-3_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-0_0.34.0-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-dev_0.34.0-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.0-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.0-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.0-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180701+dfsg-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180701+dfsg-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.2-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.2-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.2-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180901+dfsg-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180901+dfsg-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/s/shared-mime-info/shared-mime-info_1.10-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-6_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-6_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-6_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.24.0-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-7_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-7_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-7_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.25.2-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-10_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-10_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-10_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/t/tcp-wrappers/libwrap0_7.6.q-27_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/t/tiff/libtiff5_4.0.9-6_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound2_1.7.3-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound8_1.8.0-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.32.1-0.1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.32.1-0.1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.32.1-0.1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.32.1-0.1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/v/vulkan/libvulkan1_1.1.73+dfsg-1_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.15.0-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.15.0-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.15.0-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.15.0-2_mips64el.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.15.0-2_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.16.0-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.16.0-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.16.0-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.16.0-1_mips64el.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.16.0-1_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland-protocols/wayland-protocols_1.16-1_all.deb
 http://ftp.us.debian.org/debian/pool/main/x/xft/libxft2_2.3.2-2_mips64el.deb
 http://ftp.us.debian.org/debian/pool/main/x/xorgproto/x11proto-composite-dev_2018.4-4_all.deb
diff --git a/build/linux/sysroot_scripts/packagelist.sid.mipsel b/build/linux/sysroot_scripts/packagelist.sid.mipsel
index 28d444e..8317793 100644
--- a/build/linux/sysroot_scripts/packagelist.sid.mipsel
+++ b/build/linux/sysroot_scripts/packagelist.sid.mipsel
@@ -1,117 +1,117 @@
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2_1.1.6-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/a/alsa-lib/libasound2-dev_1.1.6-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.28.1-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.28.1-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.26.2-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.26.2-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.28.0-3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.28.0-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-0_2.30.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/atk1.0/libatk1.0-dev_2.30.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.30.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.30.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-0_2.30.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/at-spi2-core/libatspi2.0-dev_2.30.0-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/a/attr/libattr1_2.4.47-2+b2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.3-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/a/audit/libaudit1_2.8.4-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-client3_0.7-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/a/avahi/libavahi-common3_0.7-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth3_5.50-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/b/bluez/libbluetooth-dev_5.50-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi0.6_5.6-5_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/b/brltty/libbrlapi-dev_5.6-5_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.10-3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.10-3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.10-3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.10-3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.3.3-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2_1.15.12-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo2-dev_1.15.12-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-gobject2_1.15.12-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/c/cairo/libcairo-script-interpreter2_1.15.12-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/c/colord/libcolord2_1.4.3-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2_2.2.8-5_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcups2-dev_2.2.8-5_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2_2.2.8-5_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/c/cups/libcupsimage2-dev_2.2.8-5_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-3_1.12.10-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/d/dbus/libdbus-1-dev_1.12.10-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/comerr-dev_2.1-1.44.4-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/e/e2fsprogs/libcom-err2_1.44.4-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf1_0.170-0.5_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/e/elfutils/libelf-dev_0.170-0.5_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1_2.2.6-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/e/expat/libexpat1-dev_2.2.6-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac8_1.3.2-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/f/flac/libflac-dev_1.3.2-3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.0-5_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.0-5_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_2.13.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6_2.8.1-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/f/freetype/libfreetype6-dev_2.8.1-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi0_1.0.5-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/f/fribidi/libfribidi-dev_1.0.5-3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-20_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-20_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-4_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-4_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-4_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-4_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.36.12-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.36.12-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.56.1-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.56.1-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-5_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-5_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libgcc-6-dev_6.4.0-22_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-6/libstdc++-6-dev_6.4.0-22_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libatomic1_8.2.0-7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgcc1_8.2.0-7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libgomp1_8.2.0-7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gcc-8/libstdc++6_8.2.0-7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-0_2.38.0+dfsg-6_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-dev_2.38.0+dfsg-6_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.58.1-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/glib2.0/libglib2.0-dev_2.58.1-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6_2.27-6_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/glibc/libc6-dev_2.27-6_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/g/gmp/libgmp10_6.1.2+dfsg-3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls28-dev_3.5.19-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls30_3.5.19-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-dane0_3.5.19-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutls-openssl27_3.5.19-1+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gnutls28/libgnutlsxx28_3.5.19-1+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-0_1.8.2-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/g/graphene/libgraphene-1.0-dev_1.8.2-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.11-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.11-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.32-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.22.30-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.22.30-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-3_1.3.12-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/graphite2/libgraphite2-dev_1.3.12-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.32-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-0_3.24.1-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.1-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-0_3.91.2-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/g/gtk+4.0/libgtk-4-dev_3.91.2-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.8.8-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.8.8-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.8.8-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.8.8-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz0b_1.9.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-dev_1.9.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-gobject0_1.9.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/h/harfbuzz/libharfbuzz-icu0_1.9.0-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git161113-5_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu57_57.1-9_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/i/icu/libicu60_60.2-6_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/j/json-glib/libjson-glib-1.0-0_1.4.2-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/k/keyutils/libkeyutils1_1.5.9-9.3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-6_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-6_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-6_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-6_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/krb5-multidev_1.16.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssapi-krb5-2_1.16.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libgssrpc4_1.16.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libk5crypto3_1.16.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5clnt-mit11_1.16.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkadm5srv-mit11_1.16.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkdb5-9_1.16.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-3_1.16.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5-dev_1.16.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/k/krb5/libkrb5support0_1.16.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator1_0.4.92-7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-1_0.4.92-7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator3-dev_0.4.92-7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/liba/libappindicator/libappindicator-dev_0.4.92-7_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/liba/libasyncns/libasyncns0_0.8-6_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libb/libbsd/libbsd0_0.9.1-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap2_2.25-1.2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap2/libcap-dev_2.25-1.2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libd/libdatrie/libdatrie1_0.2.12-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_16.04.1+18.04.20171206-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_16.04.1+18.04.20171206-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_16.04.1+18.04.20171206-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_16.04.1+18.04.20171206-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.93-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.93-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.93-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.93-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.93-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.4.3-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.4.3-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr490+repack1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr490+repack1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr490+repack1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdbusmenu/libdbusmenu-gtk4_18.10.20180917~bzr490+repack1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm2_2.4.94-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.94-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-dev_2.4.94-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-nouveau2_2.4.94-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libd/libdrm/libdrm-radeon1_2.4.94-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy0_1.5.2-0.3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libe/libepoxy/libepoxy-dev_1.5.2-0.3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libe/libevent/libevent-2.1-6_2.1.8-stable-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi6_3.2.1-8_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-6_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi7_3.3~rc0-7_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libf/libffi/libffi-dev_3.2.1-8_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20_1.8.3-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.3-1_mipsel.deb
@@ -129,10 +129,10 @@
 http://ftp.us.debian.org/debian/pool/main/libg/libgpg-error/libgpg-error-dev_1.32-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libice/libice6_1.0.9-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.4-2.2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libidn2/libidn2-0_2.0.5-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libi/libidn/libidn11_1.33-2.2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-3+b1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-3+b1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator3-7_0.5.0-4_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libi/libindicator/libindicator7_0.5.0-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_1.5.2-2+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_1.5.2-2+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libj/libjsoncpp/libjsoncpp1_1.7.4-3_mipsel.deb
@@ -149,18 +149,18 @@
 http://ftp.us.debian.org/debian/pool/main/libs/libselinux/libselinux1_2.8-1+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsm/libsm6_1.2.2-1+b3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libs/libsndfile/libsndfile1_1.0.28-4_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.62.2-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.62.2-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup2.4-1_2.64.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libs/libsoup2.4/libsoup-gnome2.4-1_2.64.0-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libtasn1-6/libtasn1-6_4.13-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libt/libthai/libthai0_0.1.28-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-2.1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libu/libunistring/libunistring2_0.9.10-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.2.0-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.2.0-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.2.0-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.2.0-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.2.0-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.2.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva2_2.3.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-dev_2.3.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-drm2_2.3.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-glx2_2.3.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-wayland2_2.3.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libv/libva/libva-x11-2_2.3.0-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbis0a_1.3.6-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvorbis/libvorbisenc2_1.3.6-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libv/libvpx/libvpx5_1.7.0-3_mipsel.deb
@@ -169,24 +169,26 @@
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp-dev_0.6.1-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebpmux3_0.6.1-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.5-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.5-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.5-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.5-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-6_1.6.6-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-dev_1.6.6-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb1_1.6.6-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libx11/libx11-xcb-dev_1.6.6-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau6_1.0.8-1+b2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxau/libxau-dev_1.0.8-1+b2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb1-dev_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri2-0-dev_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-dri3-0_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-glx0-dev_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-present0_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-render0-dev_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-shm0-dev_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-sync1_1.13-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxcb/libxcb-xfixes0_1.13-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite1_0.4.4-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcomposite/libxcomposite-dev_0.4.4-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxcursor/libxcursor1_1.1.15-1_mipsel.deb
@@ -201,10 +203,10 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxfixes/libxfixes-dev_5.0.3-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi6_1.7.9-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxi/libxi-dev_1.7.9-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.3-1+b3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.3-1+b3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.0-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama1_1.1.4-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxinerama/libxinerama-dev_1.1.4-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon0_0.8.2-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxkbcommon/libxkbcommon-dev_0.8.2-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2_2.9.4+dfsg1-7+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxml2/libxml2-dev_2.9.4+dfsg1-7+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_mipsel.deb
@@ -214,49 +216,50 @@
 http://ftp.us.debian.org/debian/pool/main/libx/libxshmfence/libxshmfence1_1.3-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1.1_1.1.32-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxslt/libxslt1-dev_1.1.32-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.2-1+b2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.2-1+b2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss1_1.2.3-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxss/libxss-dev_1.2.3-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt6_1.1.5-1+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxt/libxt-dev_1.1.5-1+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst6_1.2.3-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxtst/libxtst-dev_1.2.3-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.17.17-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/l/lcms2/liblcms2-2_2.9-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/l/linux/linux-libc-dev_4.18.8-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/l/lz4/liblz4-1_1.8.2-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/l/lzo2/liblzo2-2_2.10-0.1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.6-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.6-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.6-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.6-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.6-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.6-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.6-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.6-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.6-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa_18.1.8-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libegl1-mesa-dev_18.1.8-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm1_18.1.8-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgbm-dev_18.1.8-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-dev_18.1.8-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libgl1-mesa-glx_18.1.8-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libglapi-mesa_18.1.8-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/libwayland-egl1-mesa_18.1.8-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/m/mesa/mesa-common-dev_18.1.8-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip1_1.1-8+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/m/minizip/libminizip-dev_1.1-8+b1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libhogweed4_3.4-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/n/nettle/libnettle6_3.4-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.19-3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.19-3_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.38-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.38-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4_4.20-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/n/nspr/libnspr4-dev_4.20-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3_3.39-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/n/nss/libnss3-dev_3.39-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/o/openssl1.0/libssl1.0.2_1.0.2o-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.0h-4_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.0h-4_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.1-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/o/openssl/libssl-dev_1.1.1-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus0_1.3~beta+20180518-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/o/opus/libopus-dev_1.3~beta+20180518-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit-2-0_2.14.19-4_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/o/orbit2/liborbit2_2.14.19-4_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.13-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/p11-kit/libp11-kit0_0.23.14-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g_1.1.8-3.8_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/p/pam/libpam0g-dev_1.1.8-3.8_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango-1.0-0_1.42.4-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpango1.0-dev_1.42.4-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangocairo-1.0-0_1.42.4-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoft2-1.0-0_1.42.4-3_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pango1.0/libpangoxft-1.0-0_1.42.4-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5+b2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci3_3.5.2-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/p/pciutils/libpci-dev_3.5.2-1_mipsel.deb
@@ -270,33 +273,34 @@
 http://ftp.us.debian.org/debian/pool/main/p/pipewire/libspa-lib-0.1-dev_0.2.3-3_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-0_0.34.0-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/p/pixman/libpixman-1-dev_0.34.0-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.0-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.0-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.0-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180701+dfsg-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180701+dfsg-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse0_12.2-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-dev_12.2-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/p/pulseaudio/libpulse-mainloop-glib0_12.2-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-4_20180901+dfsg-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/r/re2/libre2-dev_20180901+dfsg-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/shared-mime-info/shared-mime-info_1.10-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy1v5_1.1.7-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/s/snappy/libsnappy-dev_1.1.7-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd2_0.8.8-6_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/libspeechd-dev_0.8.8-6_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/s/speech-dispatcher/speech-dispatcher_0.8.8-6_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.24.0-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-7_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-7_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-7_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.25.2-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libsystemd0_239-10_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev1_239-10_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/s/systemd/libudev-dev_239-10_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/t/tcp-wrappers/libwrap0_7.6.q-27_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/t/tiff/libtiff5_4.0.9-6_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound2_1.7.3-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/u/unbound/libunbound8_1.8.0-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libblkid1_2.32.1-0.1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libmount1_2.32.1-0.1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/libuuid1_2.32.1-0.1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/u/util-linux/uuid-dev_2.32.1-0.1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/v/vulkan/libvulkan1_1.1.73+dfsg-1_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.15.0-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.15.0-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.15.0-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.15.0-2_mipsel.deb
-http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.15.0-2_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-client0_1.16.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-cursor0_1.16.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-dev_1.16.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-egl1_1.16.0-1_mipsel.deb
+http://ftp.us.debian.org/debian/pool/main/w/wayland/libwayland-server0_1.16.0-1_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/w/wayland-protocols/wayland-protocols_1.16-1_all.deb
 http://ftp.us.debian.org/debian/pool/main/x/xft/libxft2_2.3.2-2_mipsel.deb
 http://ftp.us.debian.org/debian/pool/main/x/xorgproto/x11proto-composite-dev_2018.4-4_all.deb
diff --git a/build/linux/sysroot_scripts/sysroot-creator-sid.sh b/build/linux/sysroot_scripts/sysroot-creator-sid.sh
index a7bab40..86efd2a 100755
--- a/build/linux/sysroot_scripts/sysroot-creator-sid.sh
+++ b/build/linux/sysroot_scripts/sysroot-creator-sid.sh
@@ -253,7 +253,7 @@
   libtiff5
   libudev-dev
   libudev1
-  libunbound2
+  libunbound8
   libunistring2
   libuuid1
   libva-dev
@@ -285,8 +285,10 @@
   libxau-dev
   libxau6
   libxcb-dri2-0
+  libxcb-dri2-0-dev
   libxcb-dri3-0
   libxcb-glx0
+  libxcb-glx0-dev
   libxcb-present0
   libxcb-render0
   libxcb-render0-dev
@@ -330,9 +332,11 @@
   libxt6
   libxtst-dev
   libxtst6
+  libxxf86vm-dev
   libxxf86vm1
   linux-libc-dev
   mesa-common-dev
+  shared-mime-info
   speech-dispatcher
   uuid-dev
   wayland-protocols
@@ -379,6 +383,7 @@
 
 DEBIAN_PACKAGES_ARM64="
   libasan3
+  libdrm-etnaviv1
   libdrm-freedreno1
   libdrm-tegra0
   libgmp10
diff --git a/build/linux/sysroot_scripts/sysroots.json b/build/linux/sysroot_scripts/sysroots.json
index c65e69b2..c19a8447 100644
--- a/build/linux/sysroot_scripts/sysroots.json
+++ b/build/linux/sysroot_scripts/sysroots.json
@@ -1,37 +1,37 @@
 {
     "sid_amd64": {
-        "Revision": "2abe7ab2252a37b3c5a400c5c2d7052b43b4d924",
-        "Sha1Sum": "815a8c22f8657fe57d02e2c2d893bcdc25a243cf",
+        "Revision": "5758428cde52994cc3e383e603fbd88fe321d42c",
+        "Sha1Sum": "e7c53f04bd88d29d075bfd1f62b073aeb69cbe09",
         "SysrootDir": "debian_sid_amd64-sysroot",
         "Tarball": "debian_sid_amd64_sysroot.tar.xz"
     },
     "sid_arm": {
-        "Revision": "2abe7ab2252a37b3c5a400c5c2d7052b43b4d924",
-        "Sha1Sum": "b732cc2c870314130b767557b34764f8dd0a3df8",
+        "Revision": "5758428cde52994cc3e383e603fbd88fe321d42c",
+        "Sha1Sum": "ef5c4f84bcafb7a3796d36bb1db7826317dde51c",
         "SysrootDir": "debian_sid_arm-sysroot",
         "Tarball": "debian_sid_arm_sysroot.tar.xz"
     },
     "sid_arm64": {
-        "Revision": "2abe7ab2252a37b3c5a400c5c2d7052b43b4d924",
-        "Sha1Sum": "c68b2062879db201c4047d03c016227d3d1e7b35",
+        "Revision": "5758428cde52994cc3e383e603fbd88fe321d42c",
+        "Sha1Sum": "953c2471bc7e71a788309f6c2d2003e8b703305d",
         "SysrootDir": "debian_sid_arm64-sysroot",
         "Tarball": "debian_sid_arm64_sysroot.tar.xz"
     },
     "sid_i386": {
-        "Revision": "2abe7ab2252a37b3c5a400c5c2d7052b43b4d924",
-        "Sha1Sum": "8fa6886026aed66e5c3056a1498490d23ccc9ae1",
+        "Revision": "5758428cde52994cc3e383e603fbd88fe321d42c",
+        "Sha1Sum": "9e6279438ece6fb42b5333ca90d5e9d0c188a403",
         "SysrootDir": "debian_sid_i386-sysroot",
         "Tarball": "debian_sid_i386_sysroot.tar.xz"
     },
     "sid_mips": {
-        "Revision": "2abe7ab2252a37b3c5a400c5c2d7052b43b4d924",
-        "Sha1Sum": "791ebb865df4c107d94e6e365ed7a9bcf191509a",
+        "Revision": "5758428cde52994cc3e383e603fbd88fe321d42c",
+        "Sha1Sum": "958731a68a169631c0450efb15410ccc4135ef2a",
         "SysrootDir": "debian_sid_mips-sysroot",
         "Tarball": "debian_sid_mips_sysroot.tar.xz"
     },
     "sid_mips64el": {
-        "Revision": "2abe7ab2252a37b3c5a400c5c2d7052b43b4d924",
-        "Sha1Sum": "313505573e6d06e127b5acd9509781d4d6e5ad9b",
+        "Revision": "5758428cde52994cc3e383e603fbd88fe321d42c",
+        "Sha1Sum": "51ca1f4092ac76ad1a1da953f0f3ce1aea947a42",
         "SysrootDir": "debian_sid_mips64el-sysroot",
         "Tarball": "debian_sid_mips64el_sysroot.tar.xz"
     }
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedBasicLogging.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedBasicLogging.java
index c0f4410..2dc65503 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedBasicLogging.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedBasicLogging.java
@@ -7,6 +7,8 @@
 import com.google.android.libraries.feed.host.logging.BasicLoggingApi;
 import com.google.android.libraries.feed.host.logging.ContentLoggingData;
 
+import org.chromium.chrome.browser.profiles.Profile;
+
 /**
  * Implementation of {@link BasicLoggingApi} that log actions performed on the Feed.
  */
@@ -15,33 +17,64 @@
 
     /**
      * Creates a {@link FeedBasicLogging} for accessing native logging logic.
+     *
+     * @param profile {@link Profile} of the user we are rendering the Feed for.
      */
-    public FeedBasicLogging() {
-        mFeedLoggingBridge = new FeedLoggingBridge();
+    public FeedBasicLogging(Profile profile) {
+        mFeedLoggingBridge = new FeedLoggingBridge(profile);
     }
 
     @Override
-    public void onContentViewed(ContentLoggingData data) {}
+    public void onContentViewed(ContentLoggingData data) {
+        mFeedLoggingBridge.onContentViewed(data.getPositionInStream(),
+                data.getPublishedTimeSeconds(), data.getTimeContentBecameAvailable(),
+                data.getScore());
+    }
+
     @Override
-    public void onContentDismissed(ContentLoggingData data) {}
+    public void onContentDismissed(ContentLoggingData data) {
+        mFeedLoggingBridge.onContentDismissed(data.getRepresentationUri());
+    }
+
     @Override
-    public void onContentClicked(ContentLoggingData data) {}
+    public void onContentClicked(ContentLoggingData data) {
+        mFeedLoggingBridge.onContentClicked(
+                data.getPositionInStream(), data.getPublishedTimeSeconds(), data.getScore());
+    }
+
     @Override
-    public void onClientAction(ContentLoggingData data, int actionType) {}
+    public void onClientAction(ContentLoggingData data, int actionType) {
+        mFeedLoggingBridge.onClientAction(actionType);
+    }
+
     @Override
-    public void onContentContextMenuOpened(ContentLoggingData data) {}
+    public void onContentContextMenuOpened(ContentLoggingData data) {
+        mFeedLoggingBridge.onContentContextMenuOpened(
+                data.getPositionInStream(), data.getPublishedTimeSeconds(), data.getScore());
+    }
+
     @Override
-    public void onMoreButtonViewed(int position) {}
+    public void onMoreButtonViewed(int position) {
+        mFeedLoggingBridge.onMoreButtonViewed(position);
+    }
+
     @Override
-    public void onMoreButtonClicked(int position) {}
+    public void onMoreButtonClicked(int position) {
+        mFeedLoggingBridge.onMoreButtonClicked(position);
+    }
 
     @Override
     public void onOpenedWithContent(int timeToPopulateMs, int contentCount) {
-        mFeedLoggingBridge.onOpenedWithContent(contentCount);
+        mFeedLoggingBridge.onOpenedWithContent(timeToPopulateMs, contentCount);
     }
 
     @Override
-    public void onOpenedWithNoImmediateContent() {}
+    public void onOpenedWithNoImmediateContent() {
+        mFeedLoggingBridge.onOpenedWithNoImmediateContent();
+    }
+
     @Override
-    public void onOpenedWithNoContent() {}
+    public void onOpenedWithNoContent() {
+        mFeedLoggingBridge.onOpenedWithNoContent();
+    }
 }
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedLoggingBridge.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedLoggingBridge.java
index fcf034a6..15c97296 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedLoggingBridge.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedLoggingBridge.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.feed;
 
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.chrome.browser.profiles.Profile;
 
 /**
  * Provides access to native implementation of feed logging.
@@ -16,9 +17,11 @@
     /**
      * Creates a {@link FeedLoggingBridge} for accessing native feed logging
      * implementation for the current user, and initial native side bridge.
+     *
+     * @param profile {@link Profile} of the user we are rendering the Feed for.
      */
-    public FeedLoggingBridge() {
-        mNativeFeedLoggingBridge = nativeInit();
+    public FeedLoggingBridge(Profile profile) {
+        mNativeFeedLoggingBridge = nativeInit(profile);
     }
 
     /** Cleans up native half of this bridge. */
@@ -28,12 +31,73 @@
         mNativeFeedLoggingBridge = 0;
     }
 
-    public void onOpenedWithContent(int contentCount) {
+    public void onContentViewed(
+            int position, long publishedTimeSeconds, long timeContentBecameAvailable, float score) {
         assert mNativeFeedLoggingBridge != 0;
-        nativeOnOpenedWithContent(mNativeFeedLoggingBridge, contentCount);
+        nativeOnContentViewed(mNativeFeedLoggingBridge, position, publishedTimeSeconds,
+                timeContentBecameAvailable, score);
     }
 
-    private native long nativeInit();
+    public void onContentDismissed(String uri) {
+        assert mNativeFeedLoggingBridge != 0;
+        nativeOnContentDismissed(mNativeFeedLoggingBridge, uri);
+    }
+
+    public void onContentClicked(int position, long publishedTimeSeconds, float score) {
+        assert mNativeFeedLoggingBridge != 0;
+        nativeOnContentClicked(mNativeFeedLoggingBridge, position, publishedTimeSeconds, score);
+    }
+
+    public void onClientAction(int actionType) {
+        assert mNativeFeedLoggingBridge != 0;
+        nativeOnClientAction(mNativeFeedLoggingBridge, actionType);
+    }
+
+    public void onContentContextMenuOpened(int position, long publishedTimeSeconds, float score) {
+        assert mNativeFeedLoggingBridge != 0;
+        nativeOnContentContextMenuOpened(
+                mNativeFeedLoggingBridge, position, publishedTimeSeconds, score);
+    }
+
+    public void onMoreButtonViewed(int position) {
+        assert mNativeFeedLoggingBridge != 0;
+        nativeOnMoreButtonViewed(mNativeFeedLoggingBridge, position);
+    }
+
+    public void onMoreButtonClicked(int position) {
+        assert mNativeFeedLoggingBridge != 0;
+        nativeOnMoreButtonClicked(mNativeFeedLoggingBridge, position);
+    }
+
+    public void onOpenedWithContent(int timeToPopulateMs, int contentCount) {
+        assert mNativeFeedLoggingBridge != 0;
+        nativeOnOpenedWithContent(mNativeFeedLoggingBridge, timeToPopulateMs, contentCount);
+    }
+
+    public void onOpenedWithNoImmediateContent() {
+        assert mNativeFeedLoggingBridge != 0;
+        nativeOnOpenedWithNoImmediateContent(mNativeFeedLoggingBridge);
+    }
+
+    public void onOpenedWithNoContent() {
+        assert mNativeFeedLoggingBridge != 0;
+        nativeOnOpenedWithNoContent(mNativeFeedLoggingBridge);
+    }
+
+    private native long nativeInit(Profile profile);
     private native void nativeDestroy(long nativeFeedLoggingBridge);
-    private native void nativeOnOpenedWithContent(long nativeFeedLoggingBridge, int contentCount);
+    private native void nativeOnContentViewed(long nativeFeedLoggingBridge, int position,
+            long publishedTimeSeconds, long timeContentBecameAvailable, float score);
+    private native void nativeOnContentDismissed(long nativeFeedLoggingBridge, String uri);
+    private native void nativeOnContentClicked(
+            long nativeFeedLoggingBridge, int position, long publishedTimeSeconds, float score);
+    private native void nativeOnClientAction(long nativeFeedLoggingBridge, int actionType);
+    private native void nativeOnContentContextMenuOpened(
+            long nativeFeedLoggingBridge, int position, long publishedTimeSeconds, float score);
+    private native void nativeOnMoreButtonViewed(long nativeFeedLoggingBridge, int position);
+    private native void nativeOnMoreButtonClicked(long nativeFeedLoggingBridge, int position);
+    private native void nativeOnOpenedWithContent(
+            long nativeFeedLoggingBridge, int timeToPopulateMs, int contentCount);
+    private native void nativeOnOpenedWithNoImmediateContent(long nativeFeedLoggingBridge);
+    private native void nativeOnOpenedWithNoContent(long nativeFeedLoggingBridge);
 }
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java
index d9047ef..2972be0c 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedNewTabPage.java
@@ -319,7 +319,7 @@
                                 new BasicStreamConfiguration(),
                                 new BasicCardConfiguration(activity.getResources(), mUiConfig),
                                 new BasicSnackbarApi(mNewTabPageManager.getSnackbarManager()),
-                                new FeedBasicLogging(), offlineIndicator)
+                                new FeedBasicLogging(profile), offlineIndicator)
                         .build();
 
         mStream = streamScope.getStream();
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml
index bd9fe551..54986fc 100644
--- a/chrome/android/java/res/values/colors.xml
+++ b/chrome/android/java/res/values/colors.xml
@@ -142,8 +142,7 @@
     <color name="locationbar_light_selection_color">#CC5595FE</color>
     <color name="locationbar_status_offline_color">@color/modern_grey_900</color>
     <color name="locationbar_status_offline_color_light">@android:color/white</color>
-    <color name="locationbar_status_preview_color">@color/modern_blue_300</color>
-    <color name="locationbar_status_preview_color_light">@color/modern_blue_600</color>
+    <color name="locationbar_status_preview_color">@color/modern_blue_600</color>
     <color name="locationbar_status_separator_color">@color/black_alpha_24</color>
     <color name="locationbar_status_separator_color_light">#3DFFFFFF</color>
     <color name="omnibox_focused_fading_background_color">@color/black_alpha_65</color>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
index 7fe8a16..4f4599a23 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
@@ -27,7 +27,6 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.widget.ControlContainer;
 import org.chromium.content_public.browser.WebContents;
@@ -246,16 +245,14 @@
                 .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
 
-    /** Launches a background DNS query for a given URL if the data reduction proxy is not in use.
+    /** Launches a background DNS query for a given URL.
      *
      * @param context The Application context.
      * @param url URL from which the domain to query is extracted.
      */
     public void maybePrefetchDnsForUrlInBackground(Context context, String url) {
         ThreadUtils.assertOnUiThread();
-        if (!DataReductionProxySettings.isEnabledBeforeNativeLoad(context)) {
             prefetchDnsForUrlInBackground(url);
-        }
     }
 
     /**
@@ -282,10 +279,7 @@
         Uri uri = Uri.parse(url);
         if (uri == null) return;
         String scheme = uri.normalizeScheme().getScheme();
-        boolean isHttp = UrlConstants.HTTP_SCHEME.equals(scheme);
-        if (!isHttp && !UrlConstants.HTTPS_SCHEME.equals(scheme)) return;
-        // HTTP connections will not be used when the data reduction proxy is enabled.
-        if (DataReductionProxySettings.getInstance().isDataReductionProxyEnabled() && isHttp) {
+        if (!UrlConstants.HTTP_SCHEME.equals(scheme) && !UrlConstants.HTTPS_SCHEME.equals(scheme)) {
             return;
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
index e6d2716..d366028 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
@@ -10,7 +10,6 @@
 import android.animation.ObjectAnimator;
 import android.graphics.drawable.Drawable;
 import android.support.annotation.IntDef;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageButton;
 import android.text.TextUtils;
@@ -23,6 +22,7 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper;
 import org.chromium.chrome.browser.widget.ViewHighlighter;
@@ -289,7 +289,7 @@
 
         // The checkbox must be tinted to make Android consistently style it across OS versions.
         // http://crbug.com/571445
-        ImageViewCompat.setImageTintList(button,
+        ApiCompatibilityUtils.setImageTintList(button,
                 AppCompatResources.getColorStateList(button.getContext(), R.color.checkbox_tint));
 
         setupMenuButton(button, item);
@@ -303,7 +303,7 @@
         item.getIcon().setLevel(currentLevel);
 
         if (item.isChecked()) {
-            ImageViewCompat.setImageTintList(button,
+            ApiCompatibilityUtils.setImageTintList(button,
                     AppCompatResources.getColorStateList(
                             button.getContext(), R.color.blue_mode_tint));
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuIconRowFooter.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuIconRowFooter.java
index 3a681f5..4000e47 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuIconRowFooter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuIconRowFooter.java
@@ -5,13 +5,13 @@
 package org.chromium.chrome.browser.appmenu;
 
 import android.content.Context;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageButton;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.LinearLayout;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.bookmarks.BookmarkBridge;
@@ -103,7 +103,7 @@
         if (currentTab.getBookmarkId() != Tab.INVALID_BOOKMARK_ID) {
             mBookmarkButton.setImageResource(R.drawable.btn_star_filled);
             mBookmarkButton.setContentDescription(mActivity.getString(R.string.edit_bookmark));
-            ImageViewCompat.setImageTintList(mBookmarkButton,
+            ApiCompatibilityUtils.setImageTintList(mBookmarkButton,
                     AppCompatResources.getColorStateList(getContext(), R.color.blue_mode_tint));
         } else {
             mBookmarkButton.setImageResource(R.drawable.btn_star);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier2.java b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier2.java
index dbfc06c..987b1ab 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier2.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier2.java
@@ -240,7 +240,7 @@
                 getDownloadNotificationService().notifyDownloadPaused(info.getContentId(),
                         info.getFileName(), true, false, info.isOffTheRecord(),
                         info.getIsTransient(), info.getIcon(), info.getOriginalUrl(),
-                        info.getShouldPromoteOrigin(), false, false, info.getPendingState());
+                        info.getShouldPromoteOrigin(), false, true, info.getPendingState());
                 break;
             case NotificationType.SUCCEEDED:
                 final int notificationId =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsViewHolder.java
index 029bcd6..c838e5c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsViewHolder.java
@@ -5,7 +5,6 @@
 
 import android.content.res.ColorStateList;
 import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.widget.AppCompatImageView;
 import android.support.v7.widget.RecyclerView.ViewHolder;
 import android.view.LayoutInflater;
@@ -13,6 +12,8 @@
 import android.view.ViewGroup;
 import android.widget.TextView;
 
+import org.chromium.base.ApiCompatibilityUtils;
+
 /** The {@link ViewHolder} responsible for reflecting a {@link Chip} to a {@link View}. */
 public class ChipsViewHolder extends ViewHolder {
     private final int mTextStartPaddingWithIconPx;
@@ -29,7 +30,7 @@
         mImage = (AppCompatImageView) itemView.findViewById(org.chromium.chrome.R.id.icon);
 
         ColorStateList textColors = mText.getTextColors();
-        if (textColors != null) ImageViewCompat.setImageTintList(mImage, textColors);
+        if (textColors != null) ApiCompatibilityUtils.setImageTintList(mImage, textColors);
 
         mTextStartPaddingWithIconPx = mText.getResources().getDimensionPixelSize(
                 org.chromium.chrome.R.dimen.chip_icon_padding);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadItemView.java
index 894ac5c..c089b23 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadItemView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadItemView.java
@@ -11,7 +11,6 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.view.MarginLayoutParamsCompat;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageButton;
 import android.text.TextUtils;
@@ -21,6 +20,7 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
@@ -349,7 +349,7 @@
             mIconView.getBackground().setLevel(
                     getResources().getInteger(R.integer.list_item_level_selected));
             mIconView.setImageDrawable(mCheckDrawable);
-            ImageViewCompat.setImageTintList(mIconView, mCheckedIconForegroundColorList);
+            ApiCompatibilityUtils.setImageTintList(mIconView, mCheckedIconForegroundColorList);
             mCheckDrawable.start();
         } else if (mThumbnailBitmap != null) {
             assert !mThumbnailBitmap.isRecycled();
@@ -358,13 +358,13 @@
                     Bitmap.createScaledBitmap(mThumbnailBitmap, mIconSize, mIconSize, false),
                     getResources().getDimensionPixelSize(
                             R.dimen.list_item_start_icon_corner_radius)));
-            ImageViewCompat.setImageTintList(mIconView, null);
+            ApiCompatibilityUtils.setImageTintList(mIconView, null);
         } else {
             mIconView.setBackgroundResource(mIconBackgroundResId);
             mIconView.getBackground().setLevel(
                     getResources().getInteger(R.integer.list_item_level_default));
             mIconView.setImageResource(mIconResId);
-            ImageViewCompat.setImageTintList(mIconView, mIconForegroundColorList);
+            ApiCompatibilityUtils.setImageTintList(mIconView, mIconForegroundColorList);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java
index 0ae7e87..484833f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OfflineGroupHeaderView.java
@@ -7,7 +7,6 @@
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.ColorStateList;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageView;
 import android.text.format.DateUtils;
@@ -16,6 +15,7 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.browser.download.DownloadUtils;
 import org.chromium.chrome.browser.download.ui.DownloadHistoryAdapter.SubsectionHeader;
 import org.chromium.chrome.browser.download.ui.DownloadItemSelectionDelegate.SubsectionHeaderSelectionObserver;
@@ -117,7 +117,7 @@
                     getResources().getInteger(R.integer.list_item_level_selected));
 
             mIconImageView.setImageDrawable(mCheckDrawable);
-            ImageViewCompat.setImageTintList(mIconImageView, mCheckedIconForegroundColorList);
+            ApiCompatibilityUtils.setImageTintList(mIconImageView, mCheckedIconForegroundColorList);
             mCheckDrawable.start();
         } else {
             mIconImageView.setBackgroundResource(mIconBackgroundResId);
@@ -125,7 +125,7 @@
                     getResources().getInteger(R.integer.list_item_level_default));
 
             mIconImageView.setImageResource(R.drawable.ic_chrome);
-            ImageViewCompat.setImageTintList(mIconImageView, mIconForegroundColorList);
+            ApiCompatibilityUtils.setImageTintList(mIconImageView, mIconForegroundColorList);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBackgroundTask.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBackgroundTask.java
index c4c2b87f..2fefb64a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBackgroundTask.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBackgroundTask.java
@@ -65,8 +65,8 @@
         }
 
         mTaskFinishedCallback = callback;
-        ExploreSitesBridge.updateCatalogFromNetwork(
-                getProfile(), (ignored) -> mTaskFinishedCallback.taskFinished(false));
+        ExploreSitesBridge.updateCatalogFromNetwork(getProfile(), false /*isImmediateFetch*/,
+                (ignored) -> mTaskFinishedCallback.taskFinished(false));
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java
index 97b4f2d..35a00985 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java
@@ -48,8 +48,8 @@
      * Causes a network request for updating the catalog.
      */
     public static void updateCatalogFromNetwork(
-            Profile profile, Callback<Boolean> finishedCallback) {
-        nativeUpdateCatalogFromNetwork(profile, finishedCallback);
+            Profile profile, boolean isImmediateFetch, Callback<Boolean> finishedCallback) {
+        nativeUpdateCatalogFromNetwork(profile, isImmediateFetch, finishedCallback);
     }
 
     /**
@@ -73,5 +73,5 @@
             Profile profile, int siteID, Callback<Bitmap> callback);
 
     private static native void nativeUpdateCatalogFromNetwork(
-            Profile profile, Callback<Boolean> callback);
+            Profile profile, boolean isImmediateFetch, Callback<Boolean> callback);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesSection.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesSection.java
index b573acc..d5799a5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesSection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesSection.java
@@ -121,8 +121,8 @@
      */
     private void gotEspCatalog(List<ExploreSitesCategory> categoryList) {
         if (categoryList == null || categoryList.size() == 0) {
-            ExploreSitesBridge.updateCatalogFromNetwork(
-                    mProfile, (Boolean success) -> { updateCategoryIcons(); });
+            ExploreSitesBridge.updateCatalogFromNetwork(mProfile, true /*isImmediateFetch*/,
+                    (Boolean success) -> { updateCategoryIcons(); });
         }
         // Initialize with defaults right away.
         initializeCategoryTiles(categoryList);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java
index 1e67f33..dff6104 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java
@@ -78,28 +78,6 @@
     private Callback<List<DataReductionDataUseItem>> mQueryDataUsageCallback;
 
     /**
-     * Returns whether the data reduction proxy is enabled.
-     *
-     * The knowledge of the data reduction proxy status is needed before the
-     * native library is loaded.
-     *
-     * Note that the returned value can be out-of-date if the Data Reduction
-     * Proxy is enabled/disabled from the native side without going through the
-     * UI. The discrepancy will however be fixed at the next launch, so the
-     * value returned here can be wrong (both false-positive and false-negative)
-     * right after such a change.
-     *
-     * @param context The application context.
-     * @return Whether the data reduction proxy is enabled.
-     */
-    public static boolean isEnabledBeforeNativeLoad(Context context) {
-        // TODO(lizeb): Add a listener for the native preference change to keep
-        // both in sync and avoid the false-positives and false-negatives.
-        return ContextUtils.getAppSharedPreferences().getBoolean(
-            DATA_REDUCTION_ENABLED_PREF, false);
-    }
-
-    /**
      * Handles calls for data reduction proxy initialization that need to happen after the native
      * library has been loaded.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index dd32575..4a377a3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -21,7 +21,6 @@
 import android.support.annotation.Nullable;
 import android.support.v4.view.MarginLayoutParamsCompat;
 import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageButton;
 import android.text.TextUtils;
@@ -764,7 +763,7 @@
         } else {
             // ImageView#setImageResource is no-op if given resource is the current one.
             mSecurityButton.setImageResource(id);
-            ImageViewCompat.setImageTintList(
+            ApiCompatibilityUtils.setImageTintList(
                     mSecurityButton, mToolbarDataProvider.getSecurityIconColorStateList());
         }
 
@@ -1434,8 +1433,8 @@
         if (updateUseDarkColors()) updateSecurityIcon();
         int id = mUseDarkColors ? R.color.dark_mode_tint : R.color.light_mode_tint;
         ColorStateList colorStateList = AppCompatResources.getColorStateList(getContext(), id);
-        ImageViewCompat.setImageTintList(mMicButton, colorStateList);
-        ImageViewCompat.setImageTintList(mDeleteButton, colorStateList);
+        ApiCompatibilityUtils.setImageTintList(mMicButton, colorStateList);
+        ApiCompatibilityUtils.setImageTintList(mDeleteButton, colorStateList);
 
         setNavigationButtonType(mNavigationButtonType);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java
index 03e48c5..6751e54 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java
@@ -16,7 +16,6 @@
 import android.os.SystemClock;
 import android.support.annotation.Nullable;
 import android.support.v4.text.BidiFormatter;
-import android.support.v4.widget.ImageViewCompat;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.view.View;
@@ -252,7 +251,7 @@
         } else {
             mThumbnailView.setImageResource(R.drawable.ic_snippet_thumbnail_placeholder);
         }
-        if (!mIsContextual) ImageViewCompat.setImageTintList(mThumbnailView, null);
+        if (!mIsContextual) ApiCompatibilityUtils.setImageTintList(mThumbnailView, null);
 
         // Fetch thumbnail for the current article.
         mImageFetcher.makeArticleThumbnailRequest(
@@ -301,7 +300,7 @@
         mThumbnailView.setScaleType(ImageView.ScaleType.CENTER_CROP);
         mThumbnailView.setBackground(null);
         mThumbnailView.setImageDrawable(thumbnail);
-        if (!mIsContextual) ImageViewCompat.setImageTintList(mThumbnailView, null);
+        if (!mIsContextual) ApiCompatibilityUtils.setImageTintList(mThumbnailView, null);
     }
 
     private void setThumbnailFromFileType(@DownloadFilter.Type int fileType) {
@@ -314,7 +313,7 @@
         mThumbnailView.setImageResource(
                 DownloadUtils.getIconResId(fileType, DownloadUtils.IconSize.DP_36));
         if (!mIsContextual) {
-            ImageViewCompat.setImageTintList(mThumbnailView, iconForegroundColorList);
+            ApiCompatibilityUtils.setImageTintList(mThumbnailView, iconForegroundColorList);
         }
     }
 
@@ -344,7 +343,7 @@
 
         mThumbnailView.setScaleType(ImageView.ScaleType.CENTER_CROP);
         mThumbnailView.setBackground(null);
-        if (!mIsContextual) ImageViewCompat.setImageTintList(mThumbnailView, null);
+        if (!mIsContextual) ApiCompatibilityUtils.setImageTintList(mThumbnailView, null);
         int duration = (int) (FADE_IN_ANIMATION_TIME_MS
                 * ChromeAnimation.Animation.getAnimationMultiplier());
         if (duration == 0) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
index 799c412d..f73b4eb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
@@ -23,7 +23,6 @@
 import android.support.annotation.Nullable;
 import android.support.v4.text.BidiFormatter;
 import android.support.v4.view.MarginLayoutParamsCompat;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.widget.AppCompatImageButton;
 import android.text.SpannableString;
 import android.text.TextUtils;
@@ -504,7 +503,7 @@
 
     private void updateButtonsTint() {
         if (getMenuButton() != null) {
-            ImageViewCompat.setImageTintList(
+            ApiCompatibilityUtils.setImageTintList(
                     getMenuButton(), mUseDarkColors ? mDarkModeTint : mLightModeTint);
         }
         updateButtonTint(mCloseButton);
@@ -551,7 +550,7 @@
         } else {
             // ImageView#setImageResource is no-op if given resource is the current one.
             mSecurityButton.setImageResource(securityIconResource);
-            ImageViewCompat.setImageTintList(
+            ApiCompatibilityUtils.setImageTintList(
                     mSecurityButton, getToolbarDataProvider().getSecurityIconColorStateList());
             mAnimDelegate.showSecurityButton();
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoToggleTabLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoToggleTabLayout.java
index 946a274..182290a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoToggleTabLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IncognitoToggleTabLayout.java
@@ -7,11 +7,11 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.support.design.widget.TabLayout;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageView;
 import android.util.AttributeSet;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
@@ -110,14 +110,15 @@
         final boolean isIncognitoSelected = mTabModelSelector.isIncognitoSelected();
         if (isIncognitoSelected) {
             setSelectedTabIndicatorColor(mTabIconSelectedLightColor.getDefaultColor());
-            ImageViewCompat.setImageTintList(mStandardButtonIcon, mTabIconLightColor);
+            ApiCompatibilityUtils.setImageTintList(mStandardButtonIcon, mTabIconLightColor);
             mTabSwitcherDrawable.setTint(mTabIconLightColor);
-            ImageViewCompat.setImageTintList(mIncognitoButtonIcon, mTabIconSelectedLightColor);
+            ApiCompatibilityUtils.setImageTintList(
+                    mIncognitoButtonIcon, mTabIconSelectedLightColor);
         } else {
             setSelectedTabIndicatorColor(mTabIconSelectedDarkColor.getDefaultColor());
-            ImageViewCompat.setImageTintList(mStandardButtonIcon, mTabIconSelectedDarkColor);
+            ApiCompatibilityUtils.setImageTintList(mStandardButtonIcon, mTabIconSelectedDarkColor);
             mTabSwitcherDrawable.setTint(mTabIconSelectedDarkColor);
-            ImageViewCompat.setImageTintList(mIncognitoButtonIcon, mTabIconDarkColor);
+            ApiCompatibilityUtils.setImageTintList(mIncognitoButtonIcon, mTabIconDarkColor);
         }
         // Ensure the tab in tab layout is correctly selected when tab switcher is
         // first opened.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java
index b93bafd39..628051c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/MenuButton.java
@@ -6,12 +6,12 @@
 
 import android.content.Context;
 import android.content.res.ColorStateList;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.widget.AppCompatImageButton;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.FrameLayout;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
 
 /**
@@ -71,6 +71,6 @@
      *                 tinted).
      */
     void setTint(ColorStateList tintList) {
-        ImageViewCompat.setImageTintList(mMenuImageButton, tintList);
+        ApiCompatibilityUtils.setImageTintList(mMenuImageButton, tintList);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java
index a1dd15c9..6fd3c365 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java
@@ -110,9 +110,9 @@
     @ColorRes
     default int getVerboseStatusTextColor(Resources res, boolean useDarkColors) {
         if (isPreview()) {
-            return ApiCompatibilityUtils.getColor(res,
-                    useDarkColors ? R.color.locationbar_status_preview_color
-                                  : R.color.locationbar_status_preview_color_light);
+            // There will never be a Preview in Incognito and the site theme color is not used. So
+            // ignore useDarkColors.
+            return ApiCompatibilityUtils.getColor(res, R.color.locationbar_status_preview_color);
         }
 
         if (isOfflinePage()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java
index 935ea8c..bf8267a5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java
@@ -397,6 +397,11 @@
         if (isIncognito() || needLightIcon) {
             // For a dark theme color, use light icons.
             list = AppCompatResources.getColorStateList(mContext, R.color.light_mode_tint);
+        } else if (isPreview()) {
+            // There will never be a preview in incognito. Always use the darker color rather than
+            // incorporating with the block above.
+            list = AppCompatResources.getColorStateList(
+                    mContext, R.color.locationbar_status_preview_color);
         } else if (!hasTab() || isUsingBrandColor()
                 || ChromeFeatureList.isEnabled(
                            ChromeFeatureList.OMNIBOX_HIDE_SCHEME_IN_STEADY_STATE)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
index e3ace30..c4e955c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
@@ -30,7 +30,6 @@
 import android.support.v4.graphics.drawable.DrawableCompat;
 import android.support.v4.view.ViewCompat;
 import android.support.v4.view.animation.FastOutSlowInInterpolator;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.graphics.drawable.DrawableWrapper;
 import android.support.v7.widget.AppCompatImageButton;
 import android.util.AttributeSet;
@@ -1722,7 +1721,7 @@
         mHomeButton.setVisibility(
                 urlHasFocus() || isTabSwitcherAnimationRunning() ? INVISIBLE : VISIBLE);
         ColorStateList tintList = mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint;
-        ImageViewCompat.setImageTintList(mHomeButton, tintList);
+        ApiCompatibilityUtils.setImageTintList(mHomeButton, tintList);
         mBrowsingModeViews.add(mHomeButton);
     }
 
@@ -2577,13 +2576,13 @@
 
         if (getMenuButton() != null) {
             ColorStateList tintList = mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint;
-            ImageViewCompat.setImageTintList(getMenuButton(), tintList);
+            ApiCompatibilityUtils.setImageTintList(getMenuButton(), tintList);
         }
 
         updateModernLocationBarColor(getLocationBarColorForToolbarColor(currentPrimaryColor));
         if (mExperimentalButton != null) {
             ColorStateList tintList = mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint;
-            ImageViewCompat.setImageTintList(mExperimentalButton, tintList);
+            ApiCompatibilityUtils.setImageTintList(mExperimentalButton, tintList);
         }
 
         setMenuButtonHighlightDrawable(mHighlightingMenu);
@@ -2592,7 +2591,7 @@
         }
         ColorStateList tint = mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint;
         if (mIsHomeButtonEnabled && mHomeButton != null) {
-            ImageViewCompat.setImageTintList(mHomeButton, tint);
+            ApiCompatibilityUtils.setImageTintList(mHomeButton, tint);
         }
 
         mLocationBar.updateVisualsForState();
@@ -2714,7 +2713,7 @@
         mExperimentalButton.setImageResource(drawableResId);
         mExperimentalButton.setContentDescription(
                 getContext().getResources().getString(contentDescriptionResId));
-        ImageViewCompat.setImageTintList(
+        ApiCompatibilityUtils.setImageTintList(
                 mExperimentalButton, mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint);
 
         if (mTabSwitcherState == STATIC_TAB) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java
index 4626f83..62121876e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarTablet.java
@@ -11,7 +11,6 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageButton;
 import android.util.AttributeSet;
@@ -19,6 +18,7 @@
 import android.view.View.OnClickListener;
 import android.widget.ImageButton;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.StrictModeContext;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
@@ -383,15 +383,15 @@
             setBackgroundColor(color);
             getProgressBar().setThemeColor(color, isIncognito());
 
-            ImageViewCompat.setImageTintList(
+            ApiCompatibilityUtils.setImageTintList(
                     getMenuButton(), incognito ? mLightModeTint : mDarkModeTint);
-            ImageViewCompat.setImageTintList(
+            ApiCompatibilityUtils.setImageTintList(
                     mHomeButton, incognito ? mLightModeTint : mDarkModeTint);
-            ImageViewCompat.setImageTintList(
+            ApiCompatibilityUtils.setImageTintList(
                     mBackButton, incognito ? mLightModeTint : mDarkModeTint);
-            ImageViewCompat.setImageTintList(
+            ApiCompatibilityUtils.setImageTintList(
                     mForwardButton, incognito ? mLightModeTint : mDarkModeTint);
-            ImageViewCompat.setImageTintList(
+            ApiCompatibilityUtils.setImageTintList(
                     mSaveOfflineButton, incognito ? mLightModeTint : mDarkModeTint);
             if (incognito) {
                 mLocationBar.getContainerView().getBackground().setAlpha(
@@ -477,7 +477,7 @@
             mReloadButton.setContentDescription(getContext().getString(
                     R.string.accessibility_btn_refresh));
         }
-        ImageViewCompat.setImageTintList(
+        ApiCompatibilityUtils.setImageTintList(
                 mReloadButton, isIncognito() ? mLightModeTint : mDarkModeTint);
         mReloadButton.setEnabled(!mIsInTabSwitcherMode);
     }
@@ -487,7 +487,7 @@
         if (isBookmarked) {
             mBookmarkButton.setImageResource(R.drawable.btn_star_filled);
             // Non-incognito mode shows a blue filled star.
-            ImageViewCompat.setImageTintList(mBookmarkButton,
+            ApiCompatibilityUtils.setImageTintList(mBookmarkButton,
                     isIncognito() ? mLightModeTint
                                   : AppCompatResources.getColorStateList(
                                             getContext(), R.color.blue_mode_tint));
@@ -495,7 +495,7 @@
                     R.string.edit_bookmark));
         } else {
             mBookmarkButton.setImageResource(R.drawable.btn_star);
-            ImageViewCompat.setImageTintList(
+            ApiCompatibilityUtils.setImageTintList(
                     mBookmarkButton, isIncognito() ? mLightModeTint : mDarkModeTint);
             mBookmarkButton.setContentDescription(getContext().getString(
                     R.string.accessibility_menu_bookmark));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java
index c34dbe1..0b73d5e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelListItem.java
@@ -13,7 +13,6 @@
 import android.content.res.ColorStateList;
 import android.graphics.Bitmap;
 import android.os.Handler;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageButton;
 import android.support.v7.widget.AppCompatImageView;
@@ -312,13 +311,13 @@
             mFaviconView.getBackground().setLevel(mIncognitoLevel);
             ApiCompatibilityUtils.setTextAppearance(mTitleView, R.style.WhiteTitle1);
             ApiCompatibilityUtils.setTextAppearance(mDescriptionView, R.style.WhiteBody);
-            ImageViewCompat.setImageTintList(mCloseButton, mLightCloseIconColor);
+            ApiCompatibilityUtils.setImageTintList(mCloseButton, mLightCloseIconColor);
         } else {
             setBackgroundResource(R.color.modern_primary_color);
             mFaviconView.getBackground().setLevel(mDefaultLevel);
             ApiCompatibilityUtils.setTextAppearance(mTitleView, R.style.BlackTitle1);
             ApiCompatibilityUtils.setTextAppearance(mDescriptionView, R.style.BlackBody);
-            ImageViewCompat.setImageTintList(mCloseButton, mDarkCloseIconColor);
+            ApiCompatibilityUtils.setImageTintList(mCloseButton, mDarkCloseIconColor);
         }
 
         if (TextUtils.isEmpty(url)) {
@@ -334,11 +333,11 @@
             Bitmap bitmap = mTab.getFavicon();
             if (bitmap != null) {
                 // Don't tint favicon bitmaps.
-                ImageViewCompat.setImageTintList(mFaviconView, null);
+                ApiCompatibilityUtils.setImageTintList(mFaviconView, null);
                 mFaviconView.setImageBitmap(bitmap);
             } else {
                 mFaviconView.setImageResource(R.drawable.ic_globe_24dp);
-                ImageViewCompat.setImageTintList(mFaviconView, mDarkIconColor);
+                ApiCompatibilityUtils.setImageTintList(mFaviconView, mDarkIconColor);
             }
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java
index d5f2c78..6da3227 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.support.design.widget.TabLayout;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageView;
 import android.util.AttributeSet;
@@ -179,15 +178,16 @@
                     getResources(), R.color.incognito_modern_primary_color));
             mStackButtonWrapper.setSelectedTabIndicatorColor(
                     mTabIconSelectedLightColor.getDefaultColor());
-            ImageViewCompat.setImageTintList(mStandardButtonIcon, mTabIconLightColor);
-            ImageViewCompat.setImageTintList(mIncognitoButtonIcon, mTabIconSelectedLightColor);
+            ApiCompatibilityUtils.setImageTintList(mStandardButtonIcon, mTabIconLightColor);
+            ApiCompatibilityUtils.setImageTintList(
+                    mIncognitoButtonIcon, mTabIconSelectedLightColor);
         } else {
             setBackgroundColor(
                     ApiCompatibilityUtils.getColor(getResources(), R.color.modern_primary_color));
             mStackButtonWrapper.setSelectedTabIndicatorColor(
                     mTabIconSelectedDarkColor.getDefaultColor());
-            ImageViewCompat.setImageTintList(mStandardButtonIcon, mTabIconSelectedDarkColor);
-            ImageViewCompat.setImageTintList(mIncognitoButtonIcon, mTabIconDarkColor);
+            ApiCompatibilityUtils.setImageTintList(mStandardButtonIcon, mTabIconSelectedDarkColor);
+            ApiCompatibilityUtils.setImageTintList(mIncognitoButtonIcon, mTabIconDarkColor);
         }
         // Ensure the tab in tab layout is correctly selected when tab switcher is
         // first opened.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java
index 0685416..ac057f4e4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/findinpage/FindToolbarPhone.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.graphics.Color;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.util.AttributeSet;
 import android.view.View;
@@ -49,17 +48,17 @@
             setBackgroundColor(ColorUtils.getDefaultThemeColor(getResources(), true));
             ColorStateList white =
                     AppCompatResources.getColorStateList(getContext(), R.color.light_mode_tint);
-            ImageViewCompat.setImageTintList(mFindNextButton, white);
-            ImageViewCompat.setImageTintList(mFindPrevButton, white);
-            ImageViewCompat.setImageTintList(mCloseFindButton, white);
+            ApiCompatibilityUtils.setImageTintList(mFindNextButton, white);
+            ApiCompatibilityUtils.setImageTintList(mFindPrevButton, white);
+            ApiCompatibilityUtils.setImageTintList(mCloseFindButton, white);
             queryTextColorId = R.color.find_in_page_query_white_color;
         } else {
             setBackgroundColor(Color.WHITE);
             ColorStateList dark =
                     AppCompatResources.getColorStateList(getContext(), R.color.dark_mode_tint);
-            ImageViewCompat.setImageTintList(mFindNextButton, dark);
-            ImageViewCompat.setImageTintList(mFindPrevButton, dark);
-            ImageViewCompat.setImageTintList(mCloseFindButton, dark);
+            ApiCompatibilityUtils.setImageTintList(mFindNextButton, dark);
+            ApiCompatibilityUtils.setImageTintList(mFindPrevButton, dark);
+            ApiCompatibilityUtils.setImageTintList(mCloseFindButton, dark);
             queryTextColorId = R.color.default_text_color;
         }
         mFindQuery.setTextColor(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java
index f932324..65ef1d7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/incognitotoggle/IncognitoToggleButton.java
@@ -6,12 +6,12 @@
 
 import android.content.Context;
 import android.support.annotation.StringRes;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageButton;
 import android.util.AttributeSet;
 import android.view.View;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
@@ -74,7 +74,7 @@
      */
     protected void setImage(boolean isIncognitoSelected) {
         setImageResource(R.drawable.incognito_simple);
-        ImageViewCompat.setImageTintList(this,
+        ApiCompatibilityUtils.setImageTintList(this,
                 AppCompatResources.getColorStateList(getContext(),
                         isIncognitoSelected ? R.color.white_mode_tint : R.color.dark_mode_tint));
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableItemView.java
index 55f827ab..7c195856 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableItemView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/selection/SelectableItemView.java
@@ -10,12 +10,12 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
 import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
-import android.support.v4.widget.ImageViewCompat;
 import android.support.v7.content.res.AppCompatResources;
 import android.support.v7.widget.AppCompatImageView;
 import android.util.AttributeSet;
 import android.widget.TextView;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.widget.TintedDrawable;
 
@@ -59,7 +59,7 @@
 
         if (mIconView != null) {
             mIconView.setBackgroundResource(R.drawable.list_item_icon_modern_bg);
-            ImageViewCompat.setImageTintList(mIconView, getDefaultIconTint());
+            ApiCompatibilityUtils.setImageTintList(mIconView, getDefaultIconTint());
         }
     }
 
@@ -83,12 +83,12 @@
         if (isChecked()) {
             mIconView.getBackground().setLevel(mSelectedLevel);
             mIconView.setImageDrawable(mCheckDrawable);
-            ImageViewCompat.setImageTintList(mIconView, mIconColorList);
+            ApiCompatibilityUtils.setImageTintList(mIconView, mIconColorList);
             mCheckDrawable.start();
         } else {
             mIconView.getBackground().setLevel(mDefaultLevel);
             mIconView.setImageDrawable(mIconDrawable);
-            ImageViewCompat.setImageTintList(mIconView, getDefaultIconTint());
+            ApiCompatibilityUtils.setImageTintList(mIconView, getDefaultIconTint());
         }
     }
 
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
index 4acdc6d..fbb8680f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">ማደስ አቁም</translation>
 <translation id="4915549754973153784">መሣሪያዎችን እየቃኙ ሳሉ <ph name="BEGIN_LINK" />እገዛን ያግኙ<ph name="END_LINK" />…</translation>
 <translation id="4943872375798546930">ውጤቶች የሉም</translation>
-<translation id="4956460920135325549">ቀላል ገጹ በGoogle ተልኳል።</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> ማያ ገጽዎን እያጋራ ነው</translation>
 <translation id="4961334780091921942">የእርስዎ የይለፍ ቃላት፣ ታሪክ እና ተጨማሪ ነገሮች በሁሉም መሣሪያዎችዎ ላይ</translation>
 <translation id="4961700429721424617">በ<ph name="MANAGED_DOMAIN" /> ከሚተዳደር መለያ ዘግተው እየወጡ ነው። ይሄ የChrome ውሂብዎን ከዚህ መሣሪያ ይሰርዘዋል፣ ነገር ግን ውሂብዎ አሁንም በእርስዎ የGoogle መለያ ውስጥ እንዳለ ይቀራል።</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
index c2559135..0320674c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -487,7 +487,6 @@
 <translation id="4913169188695071480">إيقاف التحديث</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />الحصول على مساعدة<ph name="END_LINK" /> أثناء البحث عن الأجهزة…</translation>
 <translation id="4943872375798546930">لا نتائج</translation>
-<translation id="4956460920135325549">‏نسخة بسيطة مقدمَّة من Google</translation>
 <translation id="4958708863221495346">يشارك <ph name="URL_OF_THE_CURRENT_TAB" /> شاشتك</translation>
 <translation id="4961334780091921942">كلمات المرور والسجلّ والمزيد على كل الأجهزة</translation>
 <translation id="4961700429721424617">‏أنت بصدد الخروج من حساب تتم إدارته من خلال <ph name="MANAGED_DOMAIN" />. سيؤدي ذلك إلى حذف بيانات Chrome من هذا الجهاز، ولكن ستظل البيانات في حسابك في Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
index 9b4cfc80..23517d2e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Спиране на опресняването</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Получете помощ<ph name="END_LINK" />, докато се сканира за устройства…</translation>
 <translation id="4943872375798546930">Няма резултати</translation>
-<translation id="4956460920135325549">Олекотена страница, предоставена от Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> споделя екрана ви</translation>
 <translation id="4961334780091921942">Вашите пароли, история и др. на всички устройства</translation>
 <translation id="4961700429721424617">Излизате от профил, управляван от <ph name="MANAGED_DOMAIN" />. Данните ви в Chrome ще се изтрият от това устройство, но ще останат в профила ви в Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
index 72c2791..6c99f92 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Deixa d'actualitzar</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obtén ajuda<ph name="END_LINK" /> mentre se cerquen dispositius…</translation>
 <translation id="4943872375798546930">No hi ha resultats</translation>
-<translation id="4956460920135325549">Pàgina en mode bàsic oferida per Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> comparteix la teva pantalla</translation>
 <translation id="4961334780091921942">Les contrasenyes, l'historial i altres elements en tots els dispositius</translation>
 <translation id="4961700429721424617">Estàs tancant la sessió d'un compte gestionat per <ph name="MANAGED_DOMAIN" />. Se suprimiran les teves dades de Chrome en aquest dispositiu, però continuaran al teu compte de Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
index 094d472..7052c24 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Zastavit obnovování</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Nápověda<ph name="END_LINK" /> k vyhledávání zařízení…</translation>
 <translation id="4943872375798546930">Žádné výsledky</translation>
-<translation id="4956460920135325549">Zjednodušená stránka je poskytována společností Google.</translation>
 <translation id="4958708863221495346">Stránka <ph name="URL_OF_THE_CURRENT_TAB" /> sdílí vaši obrazovku</translation>
 <translation id="4961334780091921942">Vaše hesla, historie a další údaje na všech zařízeních</translation>
 <translation id="4961700429721424617">Odhlašujete se z účtu, který je spravován doménou <ph name="MANAGED_DOMAIN" />. Touto akcí svá data prohlížeče Chrome smažete z tohoto zařízení, ve vašem účtu Google však zůstanou.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
index ad2de58..c382f3e1 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Stop med at opdatere</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Få hjælp<ph name="END_LINK" />, mens der scannes efter enheder…</translation>
 <translation id="4943872375798546930">Ingen resultater</translation>
-<translation id="4956460920135325549">Lite-side leveret af Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> deler din skærm</translation>
 <translation id="4961334780091921942">Dine adgangskoder, din historik og meget mere på alle enheder</translation>
 <translation id="4961700429721424617">Du er ved at logge ud af en konto, der administreres af <ph name="MANAGED_DOMAIN" />. Denne handling sletter dine Chrome-data fra denne enhed, men dine data forbliver på din Google-konto.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
index 183da705..02cccfed 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Aktualisierung anhalten</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Hilfe aufrufen<ph name="END_LINK" />, während nach Geräten gesucht wird…</translation>
 <translation id="4943872375798546930">Keine Ergebnisse</translation>
-<translation id="4956460920135325549">Lite-Modus-Seite von Google bereitgestellt.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> hat Ihren Bildschirm freigegeben</translation>
 <translation id="4961334780091921942">Ihre Passwörter, Ihr Verlauf und mehr auf allen Geräten</translation>
 <translation id="4961700429721424617">Sie melden sich von einem Konto ab, das von <ph name="MANAGED_DOMAIN" /> verwaltet wird. Dadurch werden Ihre Chrome-Daten von diesem Gerät gelöscht, bleiben jedoch in Ihrem Google-Konto erhalten.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
index b5b0ac42d..3d6c4a3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Διακοπή ανανέωσης</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Λήψη βοήθειας<ph name="END_LINK" /> κατά τη σάρωση για συσκευές…</translation>
 <translation id="4943872375798546930">Δεν υπάρχουν αποτελέσματα</translation>
-<translation id="4956460920135325549">Σελίδα Lite από την Google.</translation>
 <translation id="4958708863221495346">Η καρτέλα <ph name="URL_OF_THE_CURRENT_TAB" /> μοιράζεται την οθόνη σας.</translation>
 <translation id="4961334780091921942">Οι κωδικοί πρόσβασης, το ιστορικό και πολλά άλλα σε όλες τις συσκευές</translation>
 <translation id="4961700429721424617">Πρόκειται να αποσυνδεθείτε από έναν λογαριασμό του οποίου η διαχείριση γίνεται από <ph name="MANAGED_DOMAIN" />. Αυτή η ενέργεια θα διαγράψει τα δεδομένα σας στο Chrome από αυτήν τη συσκευή, αλλά θα διατηρηθούν στον Λογαριασμό σας Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
index 160c5d3..fb7a18f9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Stop refreshing</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Get help<ph name="END_LINK" /> while scanning for devices…</translation>
 <translation id="4943872375798546930">No results</translation>
-<translation id="4956460920135325549">Lite page delivered by Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> is sharing your screen</translation>
 <translation id="4961334780091921942">Your passwords, history &amp; more on all devices</translation>
 <translation id="4961700429721424617">You are signing out of an account managed by <ph name="MANAGED_DOMAIN" />. This will delete your Chrome data from this device, but your data will remain in your Google account.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
index 158e69b..738b18c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Detener actualización</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /> mientras se buscan dispositivos…</translation>
 <translation id="4943872375798546930">Sin resultados</translation>
-<translation id="4956460920135325549">Google proporcionó la página básica.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> está compartiendo tu pantalla</translation>
 <translation id="4961334780091921942">Tus contraseñas, historial y más en todos los dispositivos</translation>
 <translation id="4961700429721424617">Estás saliendo de una cuenta administrada por <ph name="MANAGED_DOMAIN" />. Esta acción borrará tus datos de Chrome en este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
index 98560042..3763289 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Dejar de actualizar</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obtener ayuda<ph name="END_LINK" /> mientras se buscan dispositivos…</translation>
 <translation id="4943872375798546930">Sin resultados</translation>
-<translation id="4956460920135325549">Página básica ofrecida por Google.</translation>
 <translation id="4958708863221495346">Estás compartiendo tu pantalla a través de <ph name="URL_OF_THE_CURRENT_TAB" /></translation>
 <translation id="4961334780091921942">Tus contraseñas, tu historial y mucho más en todos tus dispositivos</translation>
 <translation id="4961700429721424617">Estás cerrando sesión en una cuenta gestionada por <ph name="MANAGED_DOMAIN" />. Tus datos de Chrome se eliminarán de este dispositivo, pero permanecerán en tu cuenta de Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
index 84b53bc..3093b13a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -485,7 +485,6 @@
 <translation id="4913169188695071480">توقف تازه‌سازی</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />دریافت راهنمایی<ph name="END_LINK" /> درحین اسکن دستگاه‌ها…</translation>
 <translation id="4943872375798546930">نتیجه‌ای پیدا نشد</translation>
-<translation id="4956460920135325549">‏صفحه Lite توسط Google ارائه می‌شود.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> درحال اشتراک‌گذاری صفحه شما است</translation>
 <translation id="4961334780091921942">گذرواژه‌ها، سابقه و موارد دیگر در همه دستگاه‌ها</translation>
 <translation id="4961700429721424617">‏هم‌اکنون از حسابی که توسط <ph name="MANAGED_DOMAIN" /> مدیریت می‌شود، خارج می‌شوید. با این کار داده‌های Chrome شما از این دستگاه حذف می‌شود اما همچنان در حساب Google شما باقی می‌ماند.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
index b0f911a5..6d4d15e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Lopeta päivittäminen</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Tutustu ohjeisiin<ph name="END_LINK" /> laitteiden skannauksen aikana…</translation>
 <translation id="4943872375798546930">Ei tuloksia</translation>
-<translation id="4956460920135325549">Googlen tarjoama Lite-sivu</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> jakaa näyttösi.</translation>
 <translation id="4961334780091921942">Salasanasi, historiasi ja paljon muuta kaikilla laitteilla</translation>
 <translation id="4961700429721424617">Olet kirjautumassa ulos verkkotunnuksen <ph name="MANAGED_DOMAIN" /> hallinnoimalta tililtä. Chrome-tietosi poistetaan tältä laitteelta, mutta tietosi säilyvät Google-tililläsi.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
index c004e80..bbc894e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Ihinto ang pag-refresh</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Humingi ng tulong<ph name="END_LINK" /> habang nag-ii-scan ng mga device…</translation>
 <translation id="4943872375798546930">Walang mga resulta</translation>
-<translation id="4956460920135325549">Lite na page na inihatid ng Google</translation>
 <translation id="4958708863221495346">Ibinabahagi ng <ph name="URL_OF_THE_CURRENT_TAB" /> ang iyong screen</translation>
 <translation id="4961334780091921942">Ang iyong mga password, history, at higit pa sa lahat ng device</translation>
 <translation id="4961700429721424617">Nagsa-sign out ka sa account na pinamamahalaan ng <ph name="MANAGED_DOMAIN" />. Ide-delete nito ang data mo sa Chrome mula sa device na ito, ngunit mananatili ang data mo sa iyong Google account.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
index 71c3b80a..2d04b76 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Ne plus actualiser</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obtenir de l'aide<ph name="END_LINK" /> lors de la recherche d'appareils…</translation>
 <translation id="4943872375798546930">Aucun résultat</translation>
-<translation id="4956460920135325549">Page simplifiée diffusée par Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> partage votre écran.</translation>
 <translation id="4961334780091921942">Vos mots de passe, votre historique et plus encore sur tous les appareils</translation>
 <translation id="4961700429721424617">Vous vous déconnectez d'un compte géré par <ph name="MANAGED_DOMAIN" />. Cette opération entraînera la suppression de vos données Chrome de cet appareil, mais celles-ci seront conservées dans votre compte Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
index 68419281..5579962f 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">रीफ्रेश करना बंद करें</translation>
 <translation id="4915549754973153784">डिवाइस स्कैन करने में <ph name="BEGIN_LINK" />सहायता पाएं<ph name="END_LINK" />...</translation>
 <translation id="4943872375798546930">कोई परिणाम नहीं</translation>
-<translation id="4956460920135325549">Google की ओर से लाइट पेज डिलीवर किया गया.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> आपकी स्क्रीन शेयर कर रहा है</translation>
 <translation id="4961334780091921942">सभी डिवाइस पर आपके पासवर्ड, इतिहास वगैरह</translation>
 <translation id="4961700429721424617">आप <ph name="MANAGED_DOMAIN" /> द्वारा प्रबंधित खाते से प्रस्थान कर रहे हैं. इससे आपका Chrome डेटा इस डिवाइस से हट जाएगा, लेकिन आपका डेटा आपके Google खाते में बना रहेगा.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
index f0288426..d4f9ba6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Zaustavi osvježavanje</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Potražite pomoć<ph name="END_LINK" /> tijekom traženja uređaja…</translation>
 <translation id="4943872375798546930">Nema rezultata</translation>
-<translation id="4956460920135325549">Jednostavnu stranicu pruža Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> dijeli vaš zaslon</translation>
 <translation id="4961334780091921942">Vaše zaporke, povijest i drugo na svim uređajima</translation>
 <translation id="4961700429721424617">Odjavljujete se s računa kojim upravlja <ph name="MANAGED_DOMAIN" />. Vaši podaci u Chromeu izbrisat će se s ovog uređaja, no ostat će na vašem Google računu.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
index 8d52ebb..2bc87d2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Frissítés leállítása</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Kérjen segítséget<ph name="END_LINK" />, miközben eszközöket keresünk…</translation>
 <translation id="4943872375798546930">Nincs találat</translation>
-<translation id="4956460920135325549">Egyszerű oldal a Google-tól.</translation>
 <translation id="4958708863221495346">A(z) <ph name="URL_OF_THE_CURRENT_TAB" /> webhely megosztja az Ön képernyőjét</translation>
 <translation id="4961334780091921942">Jelszavai, előzményei (és még sok más) valamennyi eszközén</translation>
 <translation id="4961700429721424617">Kijelentkezik egy <ph name="MANAGED_DOMAIN" /> által felügyelt fiókból. Ezzel törli az eszközön található Chrome-adatokat, amelyek azonban Google-fiókjában megmaradnak.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
index 95826b6..90b8216 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Hentikan refresh</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Dapatkan bantuan<ph name="END_LINK" /> saat memindai perangkat…</translation>
 <translation id="4943872375798546930">Tidak ada hasil</translation>
-<translation id="4956460920135325549">Halaman Ringan yang ditampilkan oleh Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> berbagi layar Anda</translation>
 <translation id="4961334780091921942">Sandi, histori dan lainnya di semua perangkat</translation>
 <translation id="4961700429721424617">Anda akan keluar dari akun yang dikelola oleh <ph name="MANAGED_DOMAIN" />. Tindakan ini akan menghapus data Chrome dari perangkat ini, namun data tetap tersedia di Akun Google Anda.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
index 0f5fde2..1df5bbf 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Interrompi aggiornamento</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Richiedi assistenza<ph name="END_LINK" /> durante la ricerca di dispositivi…</translation>
 <translation id="4943872375798546930">Nessun risultato</translation>
-<translation id="4956460920135325549">Pagina Lite offerta da Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> sta condividendo il tuo schermo</translation>
 <translation id="4961334780091921942">Le tue password, la tua cronologia e altro su tutti i tuoi dispositivi</translation>
 <translation id="4961700429721424617">Stai per uscire da un account gestito da <ph name="MANAGED_DOMAIN" />. I dati di Chrome verranno eliminati da questo dispositivo, ma rimarranno memorizzati nel tuo account Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
index a3045f58..d598a86e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">הפסק לרענן</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />קבל עזרה<ph name="END_LINK" /> בזמן חיפוש התקנים…</translation>
 <translation id="4943872375798546930">אין תוצאות</translation>
-<translation id="4956460920135325549">‏הדף בגרסה בסיסית נוצר על-ידי Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> משתף את המסך שלך</translation>
 <translation id="4961334780091921942">גישה אל הסיסמאות, ההיסטוריה ונתונים נוספים בכל המכשירים</translation>
 <translation id="4961700429721424617">‏אתה יוצא מחשבון המנוהל על-ידי <ph name="MANAGED_DOMAIN" />. פעולה זו תמחק את הנתונים שלך ב-Chrome מהמכשיר הזה, אבל הם יישארו בחשבון Google שלך.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
index 9f6d47f5..3a5d3ba 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">更新を停止</translation>
 <translation id="4915549754973153784">デバイスのスキャン中… <ph name="BEGIN_LINK" />ヘルプ<ph name="END_LINK" /></translation>
 <translation id="4943872375798546930">結果はありません</translation>
-<translation id="4956460920135325549">Google から配信されている軽量版のページです。</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> が画面を共有しています</translation>
 <translation id="4961334780091921942">すべての端末で同じパスワード、履歴、その他の設定を使用できます</translation>
 <translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" /> で管理されているアカウントからログアウトしようとしています。この操作を行うと、Chrome データはこの端末から削除されますが、Google アカウントには残ります。</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
index d6f14a6..f765e1c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">새로고침 중지</translation>
 <translation id="4915549754973153784">기기를 검색할 때 <ph name="BEGIN_LINK" />도움말 보기<ph name="END_LINK" />...</translation>
 <translation id="4943872375798546930">검색결과가 없습니다.</translation>
-<translation id="4956460920135325549">Google에서 제공하는 라이트 페이지입니다.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" />에서 내 화면을 공유하는 중입니다.</translation>
 <translation id="4961334780091921942">모든 기기의 비밀번호, 방문 기록 등</translation>
 <translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" />에서 관리하는 계정에서 로그아웃합니다. 이렇게 하면 내 Chrome 데이터가 이 기기에서 삭제되지만 Google 계정에는 그대로 유지됩니다.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
index d98bce3..af0aba9a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Sustabdyti atnaujinimą</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Gaukite pagalbos<ph name="END_LINK" />, kol ieškoma įrenginių…</translation>
 <translation id="4943872375798546930">Rezultatų nėra</translation>
-<translation id="4956460920135325549">Supaprastintasis puslapis, kurį teikia „Google“.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> bendrina jūsų ekrano vaizdą</translation>
 <translation id="4961334780091921942">Slaptažodžiai, istorija ir daugiau visuose jūsų įrenginiuose</translation>
 <translation id="4961700429721424617">Atsijungiate nuo paskyros, kurią tvarko „<ph name="MANAGED_DOMAIN" />“. „Chrome“ duomenys bus ištrinti iš šio įrenginio, bet liks „Google“ paskyroje.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
index 3d4d5f1..fb6ac002 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Pārtraukt atsvaidzināšanu</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Saņemiet palīdzību<ph name="END_LINK" />, meklējot ierīces…</translation>
 <translation id="4943872375798546930">Nav rezultātu</translation>
-<translation id="4956460920135325549">Vienkāršota lapa, ko nodrošina Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> kopīgo jūsu ekrānu</translation>
 <translation id="4961334780091921942">Jūsu paroles, vēstures un cita informācijas sinhronizēšana visās jūsu ierīcēs</translation>
 <translation id="4961700429721424617">Jūs izrakstāties no konta, kas tiek pārvaldīts domēnā <ph name="MANAGED_DOMAIN" />. Izrakstoties jūsu Chrome dati tiks dzēsti no šīs ierīces, taču tie paliks jūsu Google kontā.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
index f8e2206..5b9e528 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Vernieuwen stopzetten</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Hulp<ph name="END_LINK" /> bij het zoeken naar apparaten…</translation>
 <translation id="4943872375798546930">Geen resultaten</translation>
-<translation id="4956460920135325549">Lite-pagina geleverd door Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> heeft toegang tot je scherm</translation>
 <translation id="4961334780091921942">Je wachtwoorden, geschiedenis en meer op al je apparaten</translation>
 <translation id="4961700429721424617">Je logt uit van een account dat wordt beheerd door <ph name="MANAGED_DOMAIN" />. Hierdoor worden je Chrome-gegevens verwijderd van dit apparaat. Je gegevens blijven echter opgeslagen in je Google-account.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
index 77fcd8f..6c80770 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -338,6 +338,7 @@
 <translation id="3744111561329211289">Bakgrunnssynkronisering</translation>
 <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Slå på Bluetooth<ph name="END_LINK" /> for å tillate tilkobling</translation>
 <translation id="3778956594442850293">Lagt til på startskjermen</translation>
+<translation id="3781011235031427080">Mer av dette ble åpnet i halv høyde</translation>
 <translation id="3789841737615482174">Installer</translation>
 <translation id="3810838688059735925">Video</translation>
 <translation id="3810973564298564668">Administrer</translation>
@@ -504,6 +505,7 @@
 <translation id="5087580092889165836">Legg til et kort</translation>
 <translation id="5100237604440890931">Minimert – klikk for å utvide</translation>
 <translation id="510275257476243843">1 time igjen</translation>
+<translation id="5123685120097942451">Inkognitofane</translation>
 <translation id="5127805178023152808">Synkronisering er slått av</translation>
 <translation id="5129038482087801250">Installer nettprogram</translation>
 <translation id="5139940364318403933">Finn ut hvordan du bruker Google Disk</translation>
@@ -651,6 +653,7 @@
 <translation id="6177111841848151710">Blokkert for den aktive søkemotoren</translation>
 <translation id="6177390657002841081">Slå på Datasparing</translation>
 <translation id="6181444274883918285">Legg til et nettsted som unntak</translation>
+<translation id="618993374665929060">Mer av dette ble åpnet i full høyde</translation>
 <translation id="6192333916571137726">Last ned filen</translation>
 <translation id="6192792657125177640">Unntak</translation>
 <translation id="6206551242102657620">Tilkoblingen er sikker. Informasjon om nettstedet</translation>
@@ -722,9 +725,11 @@
 <translation id="6697947395630195233">Chrome trenger tilgang til posisjonen din for å kunne dele den med dette nettstedet.</translation>
 <translation id="6698801883190606802">Administrer synkroniserte data</translation>
 <translation id="6710213216561001401">Forrige</translation>
+<translation id="6712388303105732168">Se mer av dette fra Google ved å bruke Mer av dette-knappen</translation>
 <translation id="6738867403308150051">Laster ned …</translation>
 <translation id="6746124502594467657">Flytt ned</translation>
 <translation id="6762156594045689028">For å endre denne innstillingen, <ph name="BEGIN_LINK" />tilbakestill synkroniseringen<ph name="END_LINK" /></translation>
+<translation id="6766622839693428701">Sveip ned for å lukke.</translation>
 <translation id="6768277682697012280">Installerer AR-modulen …</translation>
 <translation id="6776813977906306442">Last ned videoer du vil se senere, med Last ned-knappen</translation>
 <translation id="6790428901817661496">Spill av</translation>
@@ -778,7 +783,9 @@
 <translation id="7121362699166175603">Tømmer loggen og fjerner autofullføringer i adressefeltet. Det kan hende Google-kontoen din har andre typer nettlesingslogger på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7128222689758636196">Tillat for den aktive søkemotoren</translation>
 <translation id="7138678301420049075">Annet</translation>
+<translation id="7139148793369023665">Mer av dette lukket</translation>
 <translation id="7141896414559753902">Blokkér nettsteder fra å vise forgrunnsvinduer og viderekoblinger (anbefales)</translation>
+<translation id="7149158118503947153"><ph name="BEGIN_LINK" />Last inn original side<ph name="END_LINK" /> fra <ph name="DOMAIN_NAME" /></translation>
 <translation id="7149893636342594995">Siste døgn</translation>
 <translation id="7176368934862295254"><ph name="KILOBYTES" /> kB</translation>
 <translation id="7177466738963138057">Du kan endre dette senere i Innstillinger</translation>
@@ -866,6 +873,7 @@
 <translation id="7846076177841592234">Opphev valget</translation>
 <translation id="784934925303690534">Tidsperiode</translation>
 <translation id="7851858861565204677">Andre enheter</translation>
+<translation id="7854964836418414587">Lukk Mer av dette</translation>
 <translation id="7875915731392087153">Opprett e-post</translation>
 <translation id="7876243839304621966">Fjern alle</translation>
 <translation id="7882131421121961860">Fant ingen logg</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
index 797e363..74415053 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Zatrzymaj odświeżanie</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Pomoc<ph name="END_LINK" /> w trakcie wyszukiwania urządzeń…</translation>
 <translation id="4943872375798546930">Brak wyników</translation>
-<translation id="4956460920135325549">Lżejsza wersja strony dostarczona przez Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> udostępnia Twój ekran</translation>
 <translation id="4961334780091921942">Twoje hasła, historia i inne dane na wszystkich Twoich urządzeniach</translation>
 <translation id="4961700429721424617">Wylogowujesz się z konta, którym zarządza <ph name="MANAGED_DOMAIN" />. Spowoduje to usunięcie danych Chrome z tego urządzenia, ale pozostaną one na Twoim koncie Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
index c1bafe5..4adb1411 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -487,7 +487,6 @@
 <translation id="4913169188695071480">Parar de atualizar</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Receber ajuda<ph name="END_LINK" /> ao procurar dispositivos…</translation>
 <translation id="4943872375798546930">Nenhum resultado</translation>
-<translation id="4956460920135325549">Página Lite exibida pelo Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> está compartilhando sua tela</translation>
 <translation id="4961334780091921942">Suas senhas, histórico e muito mais em todos os dispositivos</translation>
 <translation id="4961700429721424617">Você está saindo de uma conta gerenciada por <ph name="MANAGED_DOMAIN" />. Os dados do Chrome serão excluídos desse dispositivo, mas permanecerão na sua Conta do Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
index 1efe28c..dc104c7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Parar a atualização</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obter ajuda<ph name="END_LINK" /> enquanto procura dispositivos…</translation>
 <translation id="4943872375798546930">Nenhum resultado</translation>
-<translation id="4956460920135325549">Página em modo lite fornecida pela Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> está a partilhar o seu ecrã</translation>
 <translation id="4961334780091921942">As suas palavras-passe, histórico e muito mais em todos os dispositivos.</translation>
 <translation id="4961700429721424617">Está a terminar sessão numa conta gerida por <ph name="MANAGED_DOMAIN" />. Esta ação elimina os seus dados do Chrome deste dispositivo, embora permaneçam na Conta Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
index e56c2c0a..bf07d0c 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Oprește actualizarea</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Obține ajutor<ph name="END_LINK" /> în timp ce se caută dispozitive…</translation>
 <translation id="4943872375798546930">Nu există rezultate</translation>
-<translation id="4956460920135325549">Pagină Lite oferită de Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> accesează conținutul de pe ecran</translation>
 <translation id="4961334780091921942">Parolele, istoricul și alte date, pe toate dispozitivele</translation>
 <translation id="4961700429721424617">Te deconectezi de la un cont gestionat de <ph name="MANAGED_DOMAIN" />. Astfel, se vor șterge datele Chrome de pe acest dispozitiv, dar datele vor rămâne în Contul Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
index c441bb6..4d2ca22 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Остановить обновление</translation>
 <translation id="4915549754973153784">Поиск устройств… <ph name="BEGIN_LINK" />Справка<ph name="END_LINK" /></translation>
 <translation id="4943872375798546930">Нет результатов</translation>
-<translation id="4956460920135325549">Lite-версия страницы получена с помощью Google.</translation>
 <translation id="4958708863221495346">Сайту <ph name="URL_OF_THE_CURRENT_TAB" /> предоставлен доступ к вашему экрану</translation>
 <translation id="4961334780091921942">Пароли, история действий и другая информация на всех устройствах</translation>
 <translation id="4961700429721424617">Вы выходите из аккаунта, которым управляет администратор домена <ph name="MANAGED_DOMAIN" />. Обратите внимание, что данные Chrome будут удалены с устройства, но сохранятся в аккаунте Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
index 6d468ff..071bf63 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Zastaviť obnovovanie</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Získajte pomoc<ph name="END_LINK" /> s vyhľadávaním zariadení…</translation>
 <translation id="4943872375798546930">Žiadne výsledky</translation>
-<translation id="4956460920135325549">Zjednodušenú verziu stránky poskytol Google.</translation>
 <translation id="4958708863221495346">Web <ph name="URL_OF_THE_CURRENT_TAB" /> zdieľa vašu obrazovku</translation>
 <translation id="4961334780091921942">Vaše heslá, história a ďalší obsah vo všetkých zariadeniach</translation>
 <translation id="4961700429721424617">Odhlasujete sa z účtu spravovaného doménou <ph name="MANAGED_DOMAIN" />. Týmto odstránite údaje Chromu z tohto zariadenia, avšak zostanú naďalej vo vašom účte Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
index bd768ce..e3a6b3d3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -485,7 +485,6 @@
 <translation id="4913169188695071480">Ustavitev osveževanja</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Poiščite pomoč<ph name="END_LINK" /> med iskanjem naprav …</translation>
 <translation id="4943872375798546930">Ni rezultatov</translation>
-<translation id="4956460920135325549">Stran v osnovnem načinu, ki jo je prikazal Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> dostopa do vašega zaslona</translation>
 <translation id="4961334780091921942">Gesla, zgodovina in drugi podatki v vseh vaših napravah</translation>
 <translation id="4961700429721424617">Odjavili se boste iz računa, ki ga upravlja <ph name="MANAGED_DOMAIN" />. S tem boste iz te naprave izbrisali podatke v Chromu, vendar bodo vaši podatki še vedno na voljo v Google Računu.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
index 2303c80..e31368a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Заустави освежавање</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Потражите помоћ<ph name="END_LINK" /> док скенирате уређаје…</translation>
 <translation id="4943872375798546930">Нема резултата</translation>
-<translation id="4956460920135325549">Поједностављену страницу пружа Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> дели екран</translation>
 <translation id="4961334780091921942">Лозинке, историја и други садржај са свих уређаја</translation>
 <translation id="4961700429721424617">Одјављујете се са налога којим управља <ph name="MANAGED_DOMAIN" />. Тако бришете Chrome податке са овог уређаја, али ће подаци остати на Google налогу.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
index 3758b5abb..0ba3c55 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Sluta uppdatera</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Få hjälp<ph name="END_LINK" /> under sökningen efter enheter …</translation>
 <translation id="4943872375798546930">Inga resultat</translation>
-<translation id="4956460920135325549">Lite-sida via Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> delar skärmen</translation>
 <translation id="4961334780091921942">Samma lösenord, historik med mera på alla dina enheter</translation>
 <translation id="4961700429721424617">Du håller på att logga ut från ett konto som hanteras av <ph name="MANAGED_DOMAIN" />. Åtgärden raderar din data i Chrome från den här enheten, men den finns kvar i Google-kontot.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
index 72551b0..245bcaa 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Acha kuonyesha upya</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Pata usaidizi<ph name="END_LINK" /> huku ukitafuta vifaa...</translation>
 <translation id="4943872375798546930">Hakuna matokeo yoyote yaliyopatikana</translation>
-<translation id="4956460920135325549">Ukurasa mwepesi umewasilishwa na Google.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> inashiriki skrini yako</translation>
 <translation id="4961334780091921942">Manenosiri yako, historia na zaidi katika vifaa vyote</translation>
 <translation id="4961700429721424617">Unaondoka kwenye akaunti inayodhibitiwa na <ph name="MANAGED_DOMAIN" />. Hatua hii itafuta data yako ya Chrome kwenye kifaa hiki, lakini data yako itasalia katika akaunti yako ya Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
index 182dadc..f8441bf 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">หยุดรีเฟรช</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />รับความช่วยเหลือ<ph name="END_LINK" />ระหว่างการค้นหาอุปกรณ์…</translation>
 <translation id="4943872375798546930">ไม่มีผลการค้นหา</translation>
-<translation id="4956460920135325549">หน้าเวอร์ชัน Lite แสดงโดย Google</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> กำลังแชร์หน้าจอของคุณ</translation>
 <translation id="4961334780091921942">รหัสผ่าน ประวัติการเข้าชม และอื่นๆ ในอุปกรณ์ทุกเครื่อง</translation>
 <translation id="4961700429721424617">คุณกำลังออกจากระบบบัญชีที่จัดการโดย <ph name="MANAGED_DOMAIN" /> การออกจากระบบจะลบข้อมูล Chrome ออกจากอุปกรณ์เครื่องนี้ แต่ข้อมูลจะยังคงอยู่ในบัญชี Google</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
index 0e7c6a03..a5688b30 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Yenilemeyi durdur</translation>
 <translation id="4915549754973153784">Cihazlar taranırken <ph name="BEGIN_LINK" />yardım alın<ph name="END_LINK" />…</translation>
 <translation id="4943872375798546930">Sonuç yok</translation>
-<translation id="4956460920135325549">Google tarafından sunulan basit sayfa.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> ekranınızı paylaşıyor</translation>
 <translation id="4961334780091921942">Tüm cihazlardaki şifreleriniz, geçmişiniz ve diğer öğeler</translation>
 <translation id="4961700429721424617"><ph name="MANAGED_DOMAIN" /> tarafından yönetilen bir hesabın oturumunu kapatıyorsunuz. Bu işlemle Chrome verileriniz bu cihazdan silinir, ancak Google Hesabınızda kalmaya devam eder.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
index 90ee0e8..b07cc13 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Припинити оновлення</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Довідка<ph name="END_LINK" /> під час пошуку пристроїв…</translation>
 <translation id="4943872375798546930">Не знайдено жодного результату</translation>
-<translation id="4956460920135325549">Спрощена сторінка, доставлена Google.</translation>
 <translation id="4958708863221495346">Сторінка <ph name="URL_OF_THE_CURRENT_TAB" /> показує ваш екран</translation>
 <translation id="4961334780091921942">Ваші паролі, історія тощо на всіх пристроях</translation>
 <translation id="4961700429721424617">Ви виходите з облікового запису, зареєстрованого в домені <ph name="MANAGED_DOMAIN" />. Дані Chrome буде видалено з цього пристрою, але вони залишаться у вашому обліковому записі Google.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
index 4abc2e5..a1b3118 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">Ngừng làm mới</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />Nhận trợ giúp<ph name="END_LINK" /> trong khi quét tìm thiết bị…</translation>
 <translation id="4943872375798546930">Không tìm thấy kết quả nào</translation>
-<translation id="4956460920135325549">Trang phiên bản rút gọn do Google cung cấp.</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> đang chia sẻ màn hình của bạn</translation>
 <translation id="4961334780091921942">Mật khẩu, lịch sử và nhiều nội dung khác của bạn trên tất cả các thiết bị</translation>
 <translation id="4961700429721424617">Bạn đang đăng xuất khỏi tài khoản do <ph name="MANAGED_DOMAIN" /> quản lý. Thao tác này sẽ xóa dữ liệu Chrome khỏi thiết bị này nhưng dữ liệu sẽ vẫn còn trong Tài khoản Google của bạn.</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
index 94aa223..a1210f2bb 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">停止刷新</translation>
 <translation id="4915549754973153784">正在搜寻设备…<ph name="BEGIN_LINK" />获取帮助<ph name="END_LINK" /></translation>
 <translation id="4943872375798546930">找不到结果</translation>
-<translation id="4956460920135325549">由 Google 提供的精简版网页。</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> 正在共享您的屏幕</translation>
 <translation id="4961334780091921942">您所有设备上的密码、历史记录等信息</translation>
 <translation id="4961700429721424617">您正要退出由 <ph name="MANAGED_DOMAIN" /> 管理的帐号。退出后,您的 Chrome 数据将从这台设备上删除,但仍会保留在您的 Google 帐号中。</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
index af66cf6..5288723 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -486,7 +486,6 @@
 <translation id="4913169188695071480">停止重新整理</translation>
 <translation id="4915549754973153784"><ph name="BEGIN_LINK" />查看說明<ph name="END_LINK" />。正在掃描裝置…</translation>
 <translation id="4943872375798546930">沒有結果</translation>
-<translation id="4956460920135325549">由 Google 提供的精簡版本網頁。</translation>
 <translation id="4958708863221495346"><ph name="URL_OF_THE_CURRENT_TAB" /> 正在共用你的畫面。</translation>
 <translation id="4961334780091921942">你所有裝置上的密碼、歷史記錄和其他設定</translation>
 <translation id="4961700429721424617">您即將登出由 <ph name="MANAGED_DOMAIN" /> 所管理的帳戶。系統會將您的 Chrome 資料從這個裝置上刪除,但繼續保留在您的 Google 帳戶中。</translation>
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBackgroundTaskUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBackgroundTaskUnitTest.java
index 274cf44..a3b70ed 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBackgroundTaskUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBackgroundTaskUnitTest.java
@@ -68,7 +68,7 @@
 
         @Implementation
         public static void updateCatalogFromNetwork(
-                Profile profile, Callback<Void> finishedCallback) {
+                Profile profile, boolean isImmediateFetch, Callback<Void> finishedCallback) {
             mUpdateCatalogFinishedCallback = finishedCallback;
         }
     }
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index cd16812..fb62e38 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -2888,7 +2888,6 @@
 <translation id="5380103295189760361">የእነዚህ መቀየሪያዎች የቁልፍ ሰሌዳ አቋራጮችን ለማየት Control፣ Alt፣ Shift፣ ወይም Searchን ይያዙ።</translation>
 <translation id="5382591305415226340">የሚደገፉ አገናኞችን ያስተዳድሩ</translation>
 <translation id="5384883051496921101">ይህ ጣቢያ ማንነት ከማያሳውቅ ሁነታ ውጭ ላለ መተግበሪያ መረጃ ሊያጋራ ነው።</translation>
-<translation id="5387961145478138773">ወደ የእርስዎ ተወዳጅ የGoogle መተግበሪያዎች ፈጣን መዳረሻ ያግኙ</translation>
 <translation id="5388885445722491159">ተጣምሯል</translation>
 <translation id="5389237414310520250">አዲሱ ተጠቃሚ ሊፈጠር አልቻለም። እባክዎ የደረቅ አንጻፊዎ ቦታ እና ፍቃዶችን ያረጋግጡና እንደገና ይሞክሩ።</translation>
 <translation id="5390100381392048184">ጣቢያዎች ድምጽ እንዲያጫውቱ ፍቀድ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 2c6e65a..7f814b8 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -2884,7 +2884,6 @@
 <translation id="5380103295189760361">‏اضغط مع الاستمرار على Control أو Alt أو Shift أو Search لمشاهدة اختصارات لوحة المفاتيح لتلك المعدّلات.</translation>
 <translation id="5382591305415226340">إدارة الروابط المدعومة</translation>
 <translation id="5384883051496921101">موقع الويب هذا على وشك مشاركة معلومات مع أحد التطبيقات خارج وضع التصفح المتخفي.</translation>
-<translation id="5387961145478138773">‏الحصول على إمكانية الوصول السريع إلى تطبيقات Google المفضلة لديك</translation>
 <translation id="5388885445722491159">مقترن</translation>
 <translation id="5389237414310520250">تعذّر إنشاء المستخدم الجديد. يُرجى التحقق من مساحة محرك الأقراص الثابتة والأذونات، وإعادة المحاولة.</translation>
 <translation id="5390100381392048184">السماح للمواقع بتشغيل الصوت</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index ae02207e..870a5a4 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -2889,7 +2889,6 @@
 <translation id="5380103295189760361">Задръжте „Control“, „Alt“, „Shift“ или „търсене“, за да видите клавишните комбинации за тези модификатори.</translation>
 <translation id="5382591305415226340">Управление на поддържаните връзки</translation>
 <translation id="5384883051496921101">Този сайт е напът да сподели информация с приложение, което не е в режим „инкогнито“.</translation>
-<translation id="5387961145478138773">Получете бърз достъп до любимите си приложения на Google</translation>
 <translation id="5388885445722491159">Сдвоено</translation>
 <translation id="5389237414310520250">Новият потребител не можа да се създаде. Моля, проверете мястото на твърдия си диск и разрешенията и опитайте отново.</translation>
 <translation id="5390100381392048184">Разрешаване на сайтовете да възпроизвеждат звук</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index e809d02..5c3cd96e3 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -2886,7 +2886,6 @@
 <translation id="5380103295189760361">এই সমস্ত সংশোধকের জন্য Control, Alt, Shift, ধরে থাকুন অথবা কীবোর্ড শর্টকাটগুলি দেখার জন্য সার্চ করুন৷</translation>
 <translation id="5382591305415226340">সমর্থিত লিঙ্কগুলি পরিচালনা করুন</translation>
 <translation id="5384883051496921101">এই সাইটটি ছদ্মবেশী মোডের বাইরের একটি অ্যাপের সাথে তথ্য শেয়ার করতে চলেছে।</translation>
-<translation id="5387961145478138773">আপনার পছন্দের Google অ্যাপগুলিতে দ্রুত অ্যাক্সেস পান</translation>
 <translation id="5388885445722491159">জোড়া</translation>
 <translation id="5389237414310520250">নতুন ব্যবহারকারী তৈরি করা যায়নি৷ আপনার হার্ড ড্রাইভের সঞ্চয়স্থান ও অনুমতিগুলি পরীক্ষা করুন এবং আবার চেষ্টা করুন৷</translation>
 <translation id="5390100381392048184">সাউন্ডটি প্লে করার জন্য সাইটগুলিতে অনুমতি দিন</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 03c20bf..45d5ed13 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1893,7 +1893,7 @@
 <translation id="38275787300541712">Premeu Retorn quan hàgiu acabat</translation>
 <translation id="3827774300009121996">&amp;Pantalla completa</translation>
 <translation id="3828029223314399057">Cerca adreces d'interès</translation>
-<translation id="3829765597456725595">Fitxers compartits d' SMB</translation>
+<translation id="3829765597456725595">Fitxers compartits d'SMB</translation>
 <translation id="3830674330436234648">No hi ha cap reproducció disponible</translation>
 <translation id="3831436149286513437">Suggeriments de cerca de Google Drive</translation>
 <translation id="3831486154586836914">Heu entrat al mode de visió general de la finestra.</translation>
@@ -2889,7 +2889,6 @@
 <translation id="5380103295189760361">Manteniu premudes les tecles Control, Alt, Maj o Cerca per veure les tecles de drecera per a aquests modificadors.</translation>
 <translation id="5382591305415226340">Gestiona els enllaços admesos</translation>
 <translation id="5384883051496921101">Aquest lloc està a punt de compartir informació amb una aplicació fora del mode d'incògnit.</translation>
-<translation id="5387961145478138773">Accedeix ràpidament a les teves aplicacions de Google preferides</translation>
 <translation id="5388885445722491159">Vinculat</translation>
 <translation id="5389237414310520250">No s'ha pogut crear l'usuari. Comproveu els vostres permisos i l'espai disponible a la unitat de disc dur i torneu-ho a provar.</translation>
 <translation id="5390100381392048184">Permet que els llocs web reprodueixin so</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 46164886..178cb20 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -2886,7 +2886,6 @@
 <translation id="5380103295189760361">Chcete-li zjistit klávesové zkratky přidružené ke klávese Ctrl, Alt, Shift nebo Hledat, přidržte příslušnou klávesu.</translation>
 <translation id="5382591305415226340">Spravovat podporované odkazy</translation>
 <translation id="5384883051496921101">Tento web chce sdílet informace s aplikací mimo anonymní režim.</translation>
-<translation id="5387961145478138773">Získejte rychlý přístup ke svým oblíbeným aplikacím Google</translation>
 <translation id="5388885445722491159">Párováno</translation>
 <translation id="5389237414310520250">Vytvoření nového uživatele se nezdařilo. Zkontrolujte místo na disku a oprávnění a zkuste to znovu.</translation>
 <translation id="5390100381392048184">Povolit webům přehrávat zvuky</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index ad00f16..6e7c3b32 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -2888,7 +2888,6 @@
 <translation id="5380103295189760361">Hold Ctrl, Alt, Shift eller Søg nede for at se tastaturgenveje for disse ændringstaster.</translation>
 <translation id="5382591305415226340">Administrer understøttede links</translation>
 <translation id="5384883051496921101">Dette website skal til at dele oplysninger med en app uden for inkognitotilstand.</translation>
-<translation id="5387961145478138773">Få hurtig adgang til dine foretrukne Google-apps.</translation>
 <translation id="5388885445722491159">Parret</translation>
 <translation id="5389237414310520250">Den nye bruger kunne ikke oprettes. Kontrollér, om der er ledig plads på din harddisk, og at du har de rette tilladelser, og prøv igen.</translation>
 <translation id="5390100381392048184">Tillad, at websites afspiller lyd</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 4caaf141..166e0d56 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -2886,7 +2886,6 @@
 <translation id="5380103295189760361">Halten Sie Strg, Alt, Umschalttaste oder Suchen gedrückt, um die Tastenkombinationen für diese Modifikatoren anzuzeigen.</translation>
 <translation id="5382591305415226340">Unterstützte Links verwalten</translation>
 <translation id="5384883051496921101">Diese Website ist im Begriff, Informationen mit einer App außerhalb des Inkognitomodus zu teilen.</translation>
-<translation id="5387961145478138773">Schnellen Zugriff auf Ihre bevorzugten Google-Apps erhalten</translation>
 <translation id="5388885445722491159">Gepaart</translation>
 <translation id="5389237414310520250">Der neue Nutzer konnte nicht erstellt werden. Bitte überprüfen Sie Ihren Festplattenspeicherplatz und Ihre Berechtigungen und versuchen Sie es dann erneut.</translation>
 <translation id="5390100381392048184">Wiedergabe von Ton auf Websites zulassen</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 8e16041c..7e848d3 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Κρατήστε πατημένα τα Control, Alt Shift ή Search για να δείτε τις συντομεύσεις πληκτρολογίου για αυτούς τους τροποποιητές.</translation>
 <translation id="5382591305415226340">Διαχείριση υποστηριζόμενων συνδέσμων</translation>
 <translation id="5384883051496921101">Αυτός ο ιστότοπος πρόκειται να κοινοποιήσει πληροφορίες με μια εφαρμογή εκτός της κατάστασης ανώνυμης περιήγησης.</translation>
-<translation id="5387961145478138773">Αποκτήστε γρήγορη πρόσβαση στις αγαπημένες σας Εφαρμογές Google</translation>
 <translation id="5388885445722491159">Με σύζευξη</translation>
 <translation id="5389237414310520250">Δεν ήταν δυνατή η δημιουργία του νέου χρήστη. Ελέγξτε τον ελεύθερο χώρο στο σκληρό δίσκο και τα δικαιώματά σας και προσπαθήστε ξανά.</translation>
 <translation id="5390100381392048184">Να επιτρέπεται στους ιστοτόπους να αναπαράγουν ήχο</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 00b8ceb..b196efab 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -2889,7 +2889,6 @@
 <translation id="5380103295189760361">Hold Control, Alt, Shift or Search to see keyboard shortcuts for those modifiers.</translation>
 <translation id="5382591305415226340">Manage supported links</translation>
 <translation id="5384883051496921101">This site is about to share information with an app outside of incognito mode.</translation>
-<translation id="5387961145478138773">Get quick access to your favourite Google Apps</translation>
 <translation id="5388885445722491159">Paired</translation>
 <translation id="5389237414310520250">The new user couldn't be created. Please check your hard drive space and permissions and try again.</translation>
 <translation id="5390100381392048184">Allow sites to play sound</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index acf17d64..35de87c 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -2887,7 +2887,6 @@
 <translation id="5380103295189760361">Mantén presionadas las teclas Control, Alt, Mayús o Buscar para ver las combinaciones de teclas para acceso directo de esos modificadores.</translation>
 <translation id="5382591305415226340">Administrar los vínculos compatibles</translation>
 <translation id="5384883051496921101">Este sitio está a punto de compartir información con una app fuera del modo de navegación incógnito.</translation>
-<translation id="5387961145478138773">Obtén acceso rápido a tus apps de Google favoritas</translation>
 <translation id="5388885445722491159">Vinculado</translation>
 <translation id="5389237414310520250">No se pudo crear el usuario nuevo. Comprueba los permisos y el espacio en tu disco duro y vuelve a intentarlo.</translation>
 <translation id="5390100381392048184">Permitir que los sitios reproduzcan sonido</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 35c3993f..0b805a56 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -2886,7 +2886,6 @@
 <translation id="5380103295189760361">Mantén pulsada la tecla de control, la tecla Alt, la tecla de mayúsculas o la tecla de búsqueda para ver combinaciones de teclas de esos modificadores.</translation>
 <translation id="5382591305415226340">Administrar enlaces compatibles</translation>
 <translation id="5384883051496921101">Este sitio web va a compartir información con una aplicación con la que no se utilizará el modo de incógnito.</translation>
-<translation id="5387961145478138773">Accede rápidamente a tus aplicaciones de Google favoritas</translation>
 <translation id="5388885445722491159">Sincronizado</translation>
 <translation id="5389237414310520250">No se ha podido crear el nuevo usuario. Comprueba los permisos y el espacio de tu disco duro y vuelve a intentarlo.</translation>
 <translation id="5390100381392048184">Permitir que los sitios web reproduzcan sonidos</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 69cfbdc6..5c729759 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Hoidke all juhtklahvi, klahvi Alt, tõstuklahvi või otsinguklahvi, et näha nende muuteklahvide klaviatuuri otseteid.</translation>
 <translation id="5382591305415226340">Toetatud linkide haldamine</translation>
 <translation id="5384883051496921101">See sait jagab teavet väljaspool inkognito režiimi oleva rakendusega.</translation>
-<translation id="5387961145478138773">Hankige kiirem juurdepääs oma Google'i lemmikrakendustele</translation>
 <translation id="5388885445722491159">Seotud</translation>
 <translation id="5389237414310520250">Uut kasutajat ei saanud luua. Kontrollige kõvakettaruumi ja lube ning proovige uuesti.</translation>
 <translation id="5390100381392048184">Luba saitidel heli esitada</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 205705ad..b73985f 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -2886,7 +2886,6 @@
 <translation id="5380103295189760361">‏برای مشاهده میان‌برهای صفحه‌ کلید مربوط به این اصلاح‌کننده‌ها کلیدهای Shift ،Alt ،Control یا Search را نگه دارید.</translation>
 <translation id="5382591305415226340">مدیریت پیوندهای پشتیبانی‌شده</translation>
 <translation id="5384883051496921101">این سایت می‌خواهد خارج از حالت ناشناس، اطلاعاتی را با برنامه‌ای به اشتراک بگذارد.</translation>
-<translation id="5387961145478138773">‏دسترسی سریع به برنامه‌های Google دلخواه</translation>
 <translation id="5388885445722491159">مرتبط شده</translation>
 <translation id="5389237414310520250">کاربر جدید ایجاد نشد. لطفاً فضای دیسک سخت و مجوزهایتان را بررسی کرده و دوباره امتحان کنید.</translation>
 <translation id="5390100381392048184">پخش صدا در سایت‌ها مجاز شود</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 9f7b822..1ff73c0 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -2888,7 +2888,6 @@
 <translation id="5380103295189760361">Kun painat pitkään Control-, Alt-, Shift- tai hakunäppäintä, näet sen pikanäppäimet.</translation>
 <translation id="5382591305415226340">Hallinnoi tuettuja linkkejä</translation>
 <translation id="5384883051496921101">Tämä sivusto aikoo jakaa tietoja sovellukselle incognito-tilan ulkopuolella.</translation>
-<translation id="5387961145478138773">Pääset käyttämään Googlen sovelluksia nopeasti</translation>
 <translation id="5388885445722491159">Laitepari muodostettu</translation>
 <translation id="5389237414310520250">Uuden käyttäjän luominen epäonnistui. Tarkista kiintolevytila ja käyttöluvat ja yritä sitten uudelleen.</translation>
 <translation id="5390100381392048184">Salli sivustojen toistaa ääniä</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index a99048d..9a23001 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Pindutin nang matagal ang Control, Alt, Shift, o Search upang makita ang mga keyboard shortcut para sa mga modifier na iyon.</translation>
 <translation id="5382591305415226340">Pamahalaan ang mga sinusuportahang link</translation>
 <translation id="5384883051496921101">Magbabahagi ang site na ito ng impormasyon sa isang app sa labas ng incognito mode.</translation>
-<translation id="5387961145478138773">Makakuha ng mabilis na access sa iyong mga paboritong Google App</translation>
 <translation id="5388885445722491159">Ipinares</translation>
 <translation id="5389237414310520250">Hindi magawa ang bagong user. Pakitingnan ang espasyo at mga pahintulot sa iyong hard drive at subukang muli.</translation>
 <translation id="5390100381392048184">Payagan ang mga site na mag-play ng tunog</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index b19c9c2..2f84457 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Maintenez la touche Ctrl, Alt, Maj ou la touche de recherche enfoncée pour afficher le raccourci clavier qui lui est associé.</translation>
 <translation id="5382591305415226340">Gérer les liens compatibles</translation>
 <translation id="5384883051496921101">Ce site s'apprête à partager des informations avec une application en dehors du mode navigation privée.</translation>
-<translation id="5387961145478138773">Accédez rapidement à vos applications Google préférées</translation>
 <translation id="5388885445722491159">Associé</translation>
 <translation id="5389237414310520250">Impossible de créer l'utilisateur. Veuillez vérifier l'espace disponible sur votre disque dur et vos autorisations, puis réessayer.</translation>
 <translation id="5390100381392048184">Autoriser l'activation du son des sites</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index a34118b8..0b3e7b3 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -2887,7 +2887,6 @@
 <translation id="5380103295189760361">તે સંશોધકોના કીબોર્ડ શોર્ટકટ જોવા માટે Control, Alt, Shift અથવા શોધને દબાવી રાખો.</translation>
 <translation id="5382591305415226340">સમર્થિત લિંક્સને સંચાલિત કરો</translation>
 <translation id="5384883051496921101">આ સાઇટ છુપા મોડની બહારની એક ઍપ્લિકેશન વડે માહિતી શેર કરવા જઈ રહી છે.</translation>
-<translation id="5387961145478138773">તમારી મનપસંદ Google ઍપનો ઝડપી ઍક્સેસ મેળવો</translation>
 <translation id="5388885445722491159">જોડી કરેલા</translation>
 <translation id="5389237414310520250">નવો વપરાશકર્તા બનાવી શકાયો નથી. કૃપા કરીને તમારું હાર્ડ ડ્રાઇવ સ્થાન અને પરવાનગીઓ તપાસો અને ફરી પ્રયાસ કરો.</translation>
 <translation id="5390100381392048184">સાઇટને અવાજ ચલાવવાની મંજૂરી આપો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index e34fa00..994bc04 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -2889,7 +2889,6 @@
 <translation id="5380103295189760361">उन कार्रवाई बदलने वाले बटनों के कीबोर्ड शॉर्टकट देखने के लिए Control, Alt, Shift, या Search को दबाए रखें.</translation>
 <translation id="5382591305415226340">समर्थित लिंक प्रबंधित करें</translation>
 <translation id="5384883051496921101">यह साइट गुप्त मोड से बाहर के ऐप्लिकेशन के साथ जानकारी शेयर करने वाली है.</translation>
-<translation id="5387961145478138773">अपने पसंदीदा 'Google ऐप्लिकेशन' झटपट एक्सेस करें</translation>
 <translation id="5388885445722491159">युग्मित</translation>
 <translation id="5389237414310520250">नया उपयोगकर्ता नहीं बनाया जा सका. कृपया अपनी हार्ड डिस्क पर खाली जगह और अनुमतियां देखें और दोबारा कोशिश करें.</translation>
 <translation id="5390100381392048184">साइटों को आवाज़ चलाने दें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 2519098e..71d9e33b 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Pritisnite Control, Alt, Shift ili Pretraživanje za prikaz tipkovničkih prečaca za te modifikatore.</translation>
 <translation id="5382591305415226340">Upravljanje podržanim vezama</translation>
 <translation id="5384883051496921101">Ova će web-lokacija dijeliti podatke s aplikacijom izvan anonimnog načina.</translation>
-<translation id="5387961145478138773">Brzo pristupajte svojim omiljenim Googleovim aplikacijama</translation>
 <translation id="5388885445722491159">Upareno</translation>
 <translation id="5389237414310520250">Izrada novog korisnika nije uspjela. Provjerite imate li dovoljno prostora na tvrdom disku i potrebna dopuštenja, pa pokušajte ponovo.</translation>
 <translation id="5390100381392048184">Dopusti web-lokacijama reprodukciju zvuka</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index aa263bd..bbf02fa 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -2891,7 +2891,6 @@
 <translation id="5380103295189760361">Tartsa lenyomva a Control, Alt, Shift vagy Keresés gombokat a módosítók billentyűkódjainak megtekintéséhez.</translation>
 <translation id="5382591305415226340">Támogatott linkek kezelése</translation>
 <translation id="5384883051496921101">A webhely adatokat kíván megosztani az inkognitómódon kívüli alkalmazással.</translation>
-<translation id="5387961145478138773">Gyors hozzáférés kedvenc Google-alkalmazásaihoz</translation>
 <translation id="5388885445722491159">Párosítva</translation>
 <translation id="5389237414310520250">Nem sikerült létrehozni az új felhasználót. Kérjük, ellenőrizze a merevlemezen rendelkezésre álló helyet és az engedélyeket, majd próbálja újra.</translation>
 <translation id="5390100381392048184">A webhelyek lejátszhatnak hangokat</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index d97b4b7b..3cf661d1 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Tekan Control, Alt, Shift, atau Telusur untuk melihat pintasan keyboard untuk pengubah tersebut.</translation>
 <translation id="5382591305415226340">Kelola link yang didukung</translation>
 <translation id="5384883051496921101">Situs ini akan membagikan informasi dengan aplikasi di luar mode penyamaran.</translation>
-<translation id="5387961145478138773">Dapatkan akses instan ke Aplikasi Google favorit Anda</translation>
 <translation id="5388885445722491159">Disandingkan</translation>
 <translation id="5389237414310520250">Tidak dapat membuat pengguna baru. Periksa ruang dan izin hard drive Anda, lalu coba lagi.</translation>
 <translation id="5390100381392048184">Izinkan situs untuk memutar suara</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index f751e9c..522c961 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -2886,7 +2886,6 @@
 <translation id="5380103295189760361">Tieni premuto Ctrl, Alt, Maiusc o Cerca per visualizzare le scorciatoie da tastiera per questi tasti di modifica.</translation>
 <translation id="5382591305415226340">Gestisci i link supportati</translation>
 <translation id="5384883051496921101">Questo sito sta per condividere informazioni con un'app esterna alla modalità di navigazione in incognito.</translation>
-<translation id="5387961145478138773">Accedi velocemente alle tue app Google preferite</translation>
 <translation id="5388885445722491159">Accoppiato</translation>
 <translation id="5389237414310520250">Impossibile creare il nuovo utente. Controlla lo spazio disponibile sul disco rigido e le autorizzazioni e riprova.</translation>
 <translation id="5390100381392048184">Consenti ai siti di riprodurre l'audio</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 83b1548c..58a35d3 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -2888,7 +2888,6 @@
 <translation id="5380103295189760361">‏החזק את Control‏, Alt‏, Shift או 'חפש' כדי לראות מקשי קיצור עבור מקשי הצירוף האלה.</translation>
 <translation id="5382591305415226340">נהל קישורים נתמכים</translation>
 <translation id="5384883051496921101">אתר זה עומד לשתף מידע עם אפליקציה מחוץ למצב גלישה בסתר.</translation>
-<translation id="5387961145478138773">‏קבלת גישה מהירה אל אפליקציות Google האהובות</translation>
 <translation id="5388885445722491159">מתואם</translation>
 <translation id="5389237414310520250">לא ניתן היה ליצור את המשתמש החדש. בדוק את השטח הפנוי בכונן הקשיח ואת ההרשאות שלך ונסה שוב.</translation>
 <translation id="5390100381392048184">מתן הרשאה לאתרים להשמיע צלילים</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 6956f0d6..1a63eb8a 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Ctrl キー、Alt キー、Shift キー、検索キーを押すと、各キーのキーボード ショートカットが表示されます。</translation>
 <translation id="5382591305415226340">サポートされているリンクを管理</translation>
 <translation id="5384883051496921101">このサイトの情報がシークレット モードの外部のアプリに共有されようとしています。</translation>
-<translation id="5387961145478138773">お気に入りの Google アプリにすばやくアクセスします</translation>
 <translation id="5388885445722491159">ペア設定済み</translation>
 <translation id="5389237414310520250">新しいユーザーを作成できませんでした。ハードドライブの空き容量と権限を確認し、もう一度お試しください。</translation>
 <translation id="5390100381392048184">音声の再生をサイトに許可する</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 94247c2..e0974922 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">ಆ ಮಾರ್ಪಾಡುಗಳಿಗಾಗಿ ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಲು Control, Alt, Shift, ಹಿಡಿದುಕೊಳ್ಳಿ ಅಥವಾ ಹುಡುಕಿ.</translation>
 <translation id="5382591305415226340">ಬೆಂಬಲಿತ ಲಿಂಕ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
 <translation id="5384883051496921101">ಈ ಸೈಟ್, ಅಜ್ಞಾತ ಮೋಡ್‌ಗೆ ಹೊರತಾಗಿರುವ ಅಪ್ಲಿಕೇಶನ್‌ನೊಂದಿಗೆ ಮಾಹಿತಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಲಿದೆ.</translation>
-<translation id="5387961145478138773">ನಿಮ್ಮ ನೆಚ್ಚಿನ Google ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ತ್ವರಿತ ಪ್ರವೇಶವನ್ನು ಪಡೆಯಿರಿ</translation>
 <translation id="5388885445722491159">ಜೋಡಿಯಾದ</translation>
 <translation id="5389237414310520250">ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಹಾರ್ಡ್ ಡ್ರೈವ್ ಸ್ಥಳಾವಕಾಶ ಮತ್ತು ಅನುಮತಿಗಳನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="5390100381392048184">ಧ್ವನಿಗಳನ್ನು ಪ್ಲೇ ಮಾಡಲು ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿಸಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index f73e4fd..a96441c 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -2888,7 +2888,6 @@
 <translation id="5380103295189760361">Ctrl, Alt, Shift 또는 Search 키를 길게 누르면 수정자에 대한 단축키를 볼 수 있습니다.</translation>
 <translation id="5382591305415226340">지원되는 링크 관리</translation>
 <translation id="5384883051496921101">이 사이트에서 시크릿 모드 외부의 앱을 사용하여 정보를 공유하려고 합니다.</translation>
-<translation id="5387961145478138773">즐겨 사용하는 Google 앱에 빠르게 액세스합니다.</translation>
 <translation id="5388885445722491159">페어링됨</translation>
 <translation id="5389237414310520250">새로운 사용자를 만들지 못했습니다. 하드 드라이브 공간 및 권한을 확인한 다음 다시 시도해 주세요.</translation>
 <translation id="5390100381392048184">사이트에서 소리를 재생하도록 허용</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index e5a6541..c3261058 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Jei norite matyti šių modifikatorių sparčiuosius klavišus, laikykite paspaudę „Control“, „Alt“, „Shift“ arba „Search“.</translation>
 <translation id="5382591305415226340">Tvarkyti palaikomas nuorodas</translation>
 <translation id="5384883051496921101">Šioje svetainėje ketinama bendrinti informaciją su programa ne inkognito režimu.</translation>
-<translation id="5387961145478138773">Greičiau pasiekite mėgstamiausias „Google“ programas</translation>
 <translation id="5388885445722491159">Susieta</translation>
 <translation id="5389237414310520250">Nepavyko sukurti naujo naudotojo. Patikrinkite, ar standžiajame diske yra vietos, ir leidimus ir bandykite dar kartą.</translation>
 <translation id="5390100381392048184">Leisti svetainėms leisti garsą</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 83fc44d7..456acd2 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Turiet nospiestu taustiņu Control, Alt, Shift vai Search, lai skatītu šo modificētāju īsinājumtaustiņus.</translation>
 <translation id="5382591305415226340">Pārvaldīt atbalstītās saites</translation>
 <translation id="5384883051496921101">Šī vietne kopīgos informāciju ar lietotni, kas nav inkognito režīmā.</translation>
-<translation id="5387961145478138773">Ātrāk piekļūstiet iecienītajām Google lietotnēm</translation>
 <translation id="5388885445722491159">Sapārots</translation>
 <translation id="5389237414310520250">Nevarēja izveidot jaunu lietotāju. Lūdzu, pārbaudiet vietu cietajā diskā un atļaujas un mēģiniet vēlreiz.</translation>
 <translation id="5390100381392048184">Atļaut vietnēm atskaņot skaņu</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 548cdc5c..540f74f 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -2887,7 +2887,6 @@
 <translation id="5380103295189760361">ആ മോഡിഫയറുകൾക്കുള്ള കീബോർഡ് കുറുക്കുവഴികൾ കാണുന്നതിന് Control, Alt, Shift അമർത്തിപ്പിടിക്കുക അല്ലെങ്കിൽ തിരയുക.</translation>
 <translation id="5382591305415226340">പിന്തുണയ്‌ക്കുന്ന ലിങ്കുകൾ മാനേജുചെയ്യുക</translation>
 <translation id="5384883051496921101">അദൃശ്യതാ സംവിധാനത്തിനു പുറത്തുള്ള ഒരു ആപ്പുമായി ഈ സൈറ്റ് വിവരങ്ങൾ പങ്കിടാൻ പോകുന്നു.</translation>
-<translation id="5387961145478138773">നിങ്ങളുടെ പ്രിയപ്പെട്ട Google ആപ്പുകളിലേക്ക് വേഗത്തിൽ ആക്‌സസ് നേടുക</translation>
 <translation id="5388885445722491159">ജോഡിയായ</translation>
 <translation id="5389237414310520250">പുതിയ ഉപയോക്താവിനെ സൃഷ്‌ടിക്കാനായില്ല. നിങ്ങളുടെ ഹാർഡ് ഡ്രൈവിലെ ഇടവും അനുമതികളും പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="5390100381392048184">ശബ്‌ദം പ്ലേ ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 51452641..9b7e3ae 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -2891,7 +2891,6 @@
 <translation id="5380103295189760361">अशा सुधारकांचे कीबोर्ड शॉर्टकट पाहण्यासाठी Control, Alt, Shift, किंवा शोध दाबून ठेवा.</translation>
 <translation id="5382591305415226340">समर्थित दुवे व्यवस्थापित करा</translation>
 <translation id="5384883051496921101">ही साइट गुप्त मोडच्या बाहेरील एखाद्या अ‍ॅपबरोबर ही माहिती शेअर करणार आहे.</translation>
-<translation id="5387961145478138773">तुमच्या आवडत्या Google अॅप्सचा झटपट अॅक्सेस मिळवा</translation>
 <translation id="5388885445722491159">जोडलेले</translation>
 <translation id="5389237414310520250">नवीन वापरकर्ता तयार करणे शक्य झाले नाही. कृपया तुमची हार्ड ड्राइव्ह जागा आणि परवानग्या तपासा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="5390100381392048184">साइटना ध्वनी प्ले करण्याची परवानगी द्या</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index f9d3977..3e2a27b 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -2891,7 +2891,6 @@
 <translation id="5380103295189760361">Tahan Control, Alt, Shift, atau Search untuk melihat pintasan papan kekunci bagi pengubah suai tersebut.</translation>
 <translation id="5382591305415226340">Urus pautan yang disokong</translation>
 <translation id="5384883051496921101">Tapak ini akan berkongsi maklumat dengan apl di luar daripada mod inkognito.</translation>
-<translation id="5387961145478138773">Dapatkan akses pantas ke Google Apps kegemaran anda</translation>
 <translation id="5388885445722491159">Dipasangkan</translation>
 <translation id="5389237414310520250">Pengguna baharu tidak dapat dibuat. Sila semak ruang cakera keras serta kebenaran anda dan cuba lagi.</translation>
 <translation id="5390100381392048184">Benarkan tapak untuk memainkan bunyi</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index c45861a..ba7fa82 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -2891,7 +2891,6 @@
 <translation id="5380103295189760361">Houd Ctrl, Alt, Shift of Zoeken ingedrukt om sneltoetsen voor die functietoetsen te bekijken.</translation>
 <translation id="5382591305415226340">Ondersteunde links beheren</translation>
 <translation id="5384883051496921101">Deze site staat op het punt buiten de incognitomodus informatie met een app te delen.</translation>
-<translation id="5387961145478138773">Snel toegang tot je favoriete Google-apps</translation>
 <translation id="5388885445722491159">Gekoppeld</translation>
 <translation id="5389237414310520250">De nieuwe gebruiker kan niet worden gemaakt. Controleer de ruimte op je harde schijf en je rechten, en probeer het opnieuw.</translation>
 <translation id="5390100381392048184">Toestaan dat sites geluid afspelen</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index eed6a7d..1a673e5 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -276,6 +276,7 @@
 <translation id="1395730723686586365">Oppdatereringsprogrammet er startet</translation>
 <translation id="1396139853388185343">Feil ved konfigurasjonen av skriveren</translation>
 <translation id="1396963298126346194">Brukernavnet og passordet du skrev inn, stemmer ikke overens</translation>
+<translation id="1397500194120344683">Ingen kvalifiserte enheter. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
 <translation id="1397854323885047133">Synkronisering og personlig tilpasning</translation>
 <translation id="1398853756734560583">Maksimer</translation>
 <translation id="1399511500114202393">Ingen brukersertifikater</translation>
@@ -524,6 +525,7 @@
 <translation id="175772926354468439">Aktiver temaet</translation>
 <translation id="1758018619400202187">EAP-TLS</translation>
 <translation id="17584710573359123">Se i Chrome Nettmarked</translation>
+<translation id="176193854664720708">Fingeravtrykkssensoren er i av/på-knappen. Trykk på den forsiktig.</translation>
 <translation id="1763046204212875858">Opprett snarveier</translation>
 <translation id="1763108912552529023">Fortsett å utforske</translation>
 <translation id="1763808908432309942">Åpner en ny fane</translation>
@@ -814,6 +816,7 @@
 <translation id="2208158072373999562">.zip-arkiv</translation>
 <translation id="220858061631308971">Skriv inn denne PIN-koden på «<ph name="DEVICE_NAME" />»:</translation>
 <translation id="2209593327042758816">Hylleelement 2</translation>
+<translation id="2212126039311489237">Skriv ut ved bruk av systemdialogboksen</translation>
 <translation id="2217501013957346740">Lag et navn –</translation>
 <translation id="2218019600945559112">Mus og styreflate</translation>
 <translation id="2218320521449013367">Det oppsto en feil mens Chrome fjernet skadelig programvare</translation>
@@ -1716,6 +1719,7 @@
 <translation id="3596235046596950091">Slå på skytjenester</translation>
 <translation id="3599863153486145794">Tømmer loggen på alle påloggede enheter. Det kan hende Google-kontoen din har andre typer nettlesingslogger på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="3600792891314830896">Kutt lyden for nettsteder som spiller av lyd</translation>
+<translation id="360180734785106144">Tilby nye funksjoner etter hvert som de blir tilgjengelige</translation>
 <translation id="3602290021589620013">Forhåndsvisning</translation>
 <translation id="3603533104205588786">Du kan klikke på stjernen for å sette en side som bokmerke</translation>
 <translation id="3603622770190368340">Hent nettverkssertifikat</translation>
@@ -2878,7 +2882,6 @@
 <translation id="5380103295189760361">Hold nede Control, Alt og Shift, eller søk for å se hurtigtaster for disse modifikatorene.</translation>
 <translation id="5382591305415226340">Administrer støttede linker</translation>
 <translation id="5384883051496921101">Dette nettstedet er i ferd med å dele informasjon med en app utenfor inkognitomodus.</translation>
-<translation id="5387961145478138773">Få rask tilgang til favorittappene dine fra Google</translation>
 <translation id="5388885445722491159">Sammenkoblet</translation>
 <translation id="5389237414310520250">Den nye brukeren kunne ikke opprettes. Sjekk hvor mye plass du har på harddisken og hvilke tillatelser som er aktive, og prøv på nytt.</translation>
 <translation id="5390100381392048184">Tillat nettsteder å spille av lyd</translation>
@@ -3122,6 +3125,7 @@
 <translation id="5731409020711461763">1 nytt bilde</translation>
 <translation id="5734362860645681824">Kommunikasjon</translation>
 <translation id="5736796278325406685">Skriv inn et gyldig brukernavn</translation>
+<translation id="5739235828260127894">Venter på bekreftelse. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
 <translation id="5739458112391494395">Veldig stor</translation>
 <translation id="5740331643563157105"><ph name="LANGUAGE_1" />, <ph name="LANGUAGE_2" /> og <ph name="NUM_ADDITIONAL_LANGUAGES" /> til</translation>
 <translation id="574209121243317957">Stemmeleie</translation>
@@ -3226,6 +3230,7 @@
 <translation id="5870086504539785141">Lukk tilgjengelighetsmenyen</translation>
 <translation id="5870155679953074650">Harde feil</translation>
 <translation id="5877064549588274448">Kanalen ble endret. Start enheten på nytt for å aktivere endringene.</translation>
+<translation id="5877584842898320529">Den valgte skriveren er ikke tilgjengelig, eller den er ikke installert på riktig måte. <ph name="BR" /> Kontrollér skriveren din, eller prøv å velge en annen skriver.</translation>
 <translation id="5880247576487732437">Token er tilgjengelig</translation>
 <translation id="5882919346125742463">Kjente nettverk</translation>
 <translation id="5884474295213649357">Denne fanen er koblet til en USB-enhet.</translation>
@@ -3291,6 +3296,7 @@
 <translation id="5979469435153841984">For å sette sider som bokmerker, klikk på stjernen i adressefeltet</translation>
 <translation id="5982621672636444458">Sorteringsalternativer</translation>
 <translation id="5984222099446776634">Nylig besøkte</translation>
+<translation id="5985458664595100876">Ugyldig nettadresseformat. Støttede formater er \\tjener\delt og smb://tjener/delt.</translation>
 <translation id="5990142338020175451">Google-tjenester med et mer personlig preg, som for eksempel bedre sideforslag</translation>
 <translation id="5990386583461751448">Oversatt</translation>
 <translation id="5991049340509704927">Forstørr</translation>
@@ -3320,6 +3326,7 @@
 <translation id="6026819612896463875"><ph name="WINDOW_TITLE" /> – en USB-enhet er koblet til</translation>
 <translation id="6028117231645531007">Legg til fingeravtrykk</translation>
 <translation id="6029027682598229313">Linux er ferdig installert.</translation>
+<translation id="6029292188939175871">slett [<ph name="FINGERPRINT_NAME" />], knapp</translation>
 <translation id="6029587122245504742">Langsomst</translation>
 <translation id="6032912588568283682">Filsystem</translation>
 <translation id="6034662038931255275">OS-oppdateringen er ferdig</translation>
@@ -3736,6 +3743,7 @@
 <translation id="6643016212128521049">Tøm</translation>
 <translation id="6644512095122093795">Tilbud om å lagre passord</translation>
 <translation id="6644846457769259194">Oppdaterer enheten din (<ph name="PROGRESS_PERCENT" />)</translation>
+<translation id="6645437135153136856">Den valgte Google Cloud Print-enheten støttes ikke lenger. <ph name="BR" /> Prøv å konfigurere skriveren i datamaskinens systeminnstillinger.</translation>
 <translation id="6647228709620733774">Nettadresse for tilbakekalling av Netscape-autoritetssertifikat</translation>
 <translation id="6647838571840953560">Nå på <ph name="CHANNEL_NAME" /></translation>
 <translation id="6648051959475508072">Sikkerhetsnøkkelen er aktivert</translation>
@@ -4101,6 +4109,7 @@
 <translation id="7201118060536064622">«<ph name="DELETED_ITEM_NAME" />» er slettet</translation>
 <translation id="7206693748120342859">Laster ned <ph name="PLUGIN_NAME" /> …</translation>
 <translation id="720715819012336933">{NUM_PAGES,plural, =1{Lukk siden}other{Lukk sidene}}</translation>
+<translation id="7210499381659830293">Utvidelsesskrivere</translation>
 <translation id="721467499098558573">Trykk og hold på knappen på sikkerhetsnøkkelen i minst fem sekunder</translation>
 <translation id="7216409898977639127">Mobiloperatør</translation>
 <translation id="7216595297012131718">Bestill språk basert på innstillingene dine</translation>
@@ -4178,6 +4187,7 @@
 <translation id="7321545336522791733">Tjeneren er ikke tilgjengelig</translation>
 <translation id="7324297612904500502">Forumet for betaversjoner</translation>
 <translation id="7325437708553334317">Høy kontrast-utvidelse</translation>
+<translation id="7328162502911382168">(<ph name="COUNT" />)</translation>
 <translation id="7328867076235380839">Ugyldig kombinasjon</translation>
 <translation id="7329154610228416156">Påloggingen mislyktes fordi den var konfigurert til å bruke en usikret nettadresse (<ph name="BLOCKED_URL" />). Kontakt administratoren din.</translation>
 <translation id="7334190995941642545">Smart Lock er for øyeblikket utilgjengelig. Prøv igjen senere.</translation>
@@ -4765,6 +4775,7 @@
 <translation id="8199300056570174101">Egenskaper for nettverk (tjeneste) og enhet</translation>
 <translation id="8200772114523450471">Fortsett</translation>
 <translation id="8202160505685531999">Legg inn passordet på nytt for å oppdatere <ph name="DEVICE_TYPE" />-profilen din.</translation>
+<translation id="8203732864715032075">Send deg varsler, og husk denne datamaskinen for Meldinger som standard. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
 <translation id="8206354486702514201">Denne innstillingen håndheves av administratoren din.</translation>
 <translation id="8206745257863499010">Plystre</translation>
 <translation id="8209677645716428427">En administrert bruker kan utforske nettet med veiledning fra deg. Som administrator for en administrert bruker i Chrome kan du:</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 455b6c0d..6fb8295e 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Przytrzymaj Control, Alt, Shift lub klawisz wyszukiwania, aby wyświetlić skróty klawiszowe dla tych modyfikatorów.</translation>
 <translation id="5382591305415226340">Zarządzaj obsługiwanymi linkami</translation>
 <translation id="5384883051496921101">Ta strona zamierza udostępnić informacje aplikacji poza trybem incognito.</translation>
-<translation id="5387961145478138773">Zapewnij sobie szybki dostęp do ulubionych aplikacji Google</translation>
 <translation id="5388885445722491159">Sparowane</translation>
 <translation id="5389237414310520250">Nie można utworzyć nowego użytkownika. Sprawdź miejsce na dysku twardym i uprawnienia, a potem spróbuj ponownie.</translation>
 <translation id="5390100381392048184">Zezwalaj na odtwarzanie dźwięku na stronach internetowych</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 2148f05a..49f9a04 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Pressione Control, Alt, Shift ou "Pesquisar" para visualizar os atalhos do teclado para estes modificadores.</translation>
 <translation id="5382591305415226340">Gerenciar links compatíveis</translation>
 <translation id="5384883051496921101">Este site está prestes a compartilhar informações com um app fora do modo de navegação anônima.</translation>
-<translation id="5387961145478138773">Acesse rapidamente seus apps favoritos do Google</translation>
 <translation id="5388885445722491159">Emparelhado</translation>
 <translation id="5389237414310520250">Não foi possível criar o novo usuário. Verifique o espaço no seu disco rígido e suas permissões e tente novamente.</translation>
 <translation id="5390100381392048184">Permitir que os sites reproduzam sons</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 32b6673..10e0a2a 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -2891,7 +2891,6 @@
 <translation id="5380103295189760361">Mantenha premido Control, Alt, Shift ou a Tecla de Pesquisa para ver atalhos de teclado para esses modificadores.</translation>
 <translation id="5382591305415226340">Gerir links suportados</translation>
 <translation id="5384883051496921101">Este site está prestes a partilhar informações com uma aplicação fora do modo de navegação anónima.</translation>
-<translation id="5387961145478138773">Obtenha acesso rápido às suas aplicações Google favoritas.</translation>
 <translation id="5388885445722491159">Emparelhado</translation>
 <translation id="5389237414310520250">Não foi possível criar o novo utilizador. Verifique o espaço no disco rígido e as autorizações e tente novamente.</translation>
 <translation id="5390100381392048184">Permitir que os sites reproduzam som</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index cff6e857..a0eea31d 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Mențineți apăsate tastele Control, Alt, Shift sau Căutare pentru a vedea comenzi rapide de la tastatură pentru respectivele taste de modificare.</translation>
 <translation id="5382591305415226340">Gestionează linkurile acceptate</translation>
 <translation id="5384883051496921101">Site-ul este pe cale să permită accesul la informații unei aplicații în afara modului incognito.</translation>
-<translation id="5387961145478138773">Obține acces rapid la aplicațiile tale Google preferate</translation>
 <translation id="5388885445722491159">Împerecheat</translation>
 <translation id="5389237414310520250">Noul utilizator nu a putut fi creat. Verifică spațiul de pe hard disk și permisiunile, apoi încearcă din nou.</translation>
 <translation id="5390100381392048184">Permite site-urilor să redea sunet</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 3f0fb96..45e8951 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -2891,7 +2891,6 @@
 <translation id="5380103295189760361">Нажмите Control, Alt, Shift или Search, чтобы увидеть соответствующие быстрые клавиши.</translation>
 <translation id="5382591305415226340">Управление поддерживаемыми ссылками</translation>
 <translation id="5384883051496921101">Этот сайт передает информацию стороннему приложению, пока вы в режиме инкогнито.</translation>
-<translation id="5387961145478138773">Быстрый доступ к любимым приложениям Google</translation>
 <translation id="5388885445722491159">Пара создана</translation>
 <translation id="5389237414310520250">Не удалось создать контролируемый профиль. Убедитесь, что у вас есть необходимые разрешения и свободное место на жестком диске, а затем повторите попытку.</translation>
 <translation id="5390100381392048184">Разрешить сайтам воспроизводить звуки</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 8495319..514d115 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Stlačením klávesov Ctrl, Alt, Shift alebo Hľadať zobrazíte klávesové skratky pre tieto modifikátory.</translation>
 <translation id="5382591305415226340">Spravovať podporované odkazy</translation>
 <translation id="5384883051496921101">Tento web chce zdieľať informácie s aplikáciou mimo režimu inkognito.</translation>
-<translation id="5387961145478138773">Získajte okamžitý prístup k svojim aplikáciám Google</translation>
 <translation id="5388885445722491159">Spárované</translation>
 <translation id="5389237414310520250">Nového používateľa sa nepodarilo vytvoriť. Skontrolujte priestor na pevnom disku a povolenia a skúste to znova.</translation>
 <translation id="5390100381392048184">Povoliť webom prehrávať zvuk</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index ed2f5c40..80ceb17 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Držite tipko Ctrl, Alt, Shift ali tipko za iskanje, če želite videti bližnjične tipke za te modifikatorje.</translation>
 <translation id="5382591305415226340">Upravljanje podprtih povezav</translation>
 <translation id="5384883051496921101">To spletno mesto bo delilo podatke z aplikacijo zunaj načina brez beleženja zgodovine.</translation>
-<translation id="5387961145478138773">Hiter dostop do priljubljenih Googlovih aplikacij</translation>
 <translation id="5388885445722491159">Povezano</translation>
 <translation id="5389237414310520250">Novega uporabnika ni bilo mogoče ustvariti. Preverite, koliko je prostora na trdem disku in dovoljenja, ter poskusite znova.</translation>
 <translation id="5390100381392048184">Dovoli spletnim mestom predvajanje zvoka</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 4353f2a..47bba338 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -2886,7 +2886,6 @@
 <translation id="5380103295189760361">Држите Control, Alt, Shift или Search да бисте видели тастерске пречице за те модификаторе.</translation>
 <translation id="5382591305415226340">Управљај подржаним линковима</translation>
 <translation id="5384883051496921101">Овај сајт ће делити информације са апликацијом изван режима без архивирања.</translation>
-<translation id="5387961145478138773">Брзо приступајте омиљеним Google апликацијама</translation>
 <translation id="5388885445722491159">Упарено</translation>
 <translation id="5389237414310520250">Прављење новог корисника није успело. Проверите да ли имате довољно простора на хард-диску и одговарајуће дозволе и покушајте поново.</translation>
 <translation id="5390100381392048184">Дозволи сајтовима да пуштају звук</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 6ee6d39..228fbbb 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -2889,7 +2889,6 @@
 <translation id="5380103295189760361">Håll ned Ctrl, Alt, Skift eller Sök om du vill visa kortkommandon för dessa modifierare.</translation>
 <translation id="5382591305415226340">Hantera länkar som stöds</translation>
 <translation id="5384883051496921101">Data på den här webbplatsen delas med en app utanför inkognitoläget.</translation>
-<translation id="5387961145478138773">Få snabb åtkomst till dina favoritappar från Google</translation>
 <translation id="5388885445722491159">Kopplad</translation>
 <translation id="5389237414310520250">Det gick inte att skapa den nya användaren. Kontrollera hårddiskutrymmet och dina behörigheter och försök igen.</translation>
 <translation id="5390100381392048184">Tillåt att ljud spelas upp på webbplatser</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 6009dd3..18b8c3ce 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -2881,7 +2881,6 @@
 <translation id="5380103295189760361">Shikilia "Control", "Alt", "Shift", au "Search" ili kuona mikato ya kibodi ya virekebishi hivyo.</translation>
 <translation id="5382591305415226340">Dhibiti viungo vinavyotumika</translation>
 <translation id="5384883051496921101">Tovuti hii inakaribia kushiriki maelezo na programu nyingine isiyo katika hali fiche.</translation>
-<translation id="5387961145478138773">Fikia kwa haraka Programu za Google unazopenda.</translation>
 <translation id="5388885445722491159">Imeoanishwa</translation>
 <translation id="5389237414310520250">Imeshindwa kuunda mtumiaji mpya. Tafadhali angalia ruhusa na nafasi ya hifadhi ya diski kuu kisha ujaribu tena.</translation>
 <translation id="5390100381392048184">Ruhusu tovuti kucheza sauti</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 26acf7a..d6973eb 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">அந்த மாடிஃபையர்களுக்கான விசைப்பலகைக் குறுக்குவழிகளைப் பார்க்க Control, Alt, Shift ஆகியவற்றை அல்லது Search ஐ அழுத்திப் பிடிக்கவும்.</translation>
 <translation id="5382591305415226340">ஆதரிக்கப்படும் இணைப்புகளை நிர்வகி</translation>
 <translation id="5384883051496921101">இந்தத் தளமானது மறைநிலைக்கு வெளியே உள்ள பயன்பாட்டுடன் தகவலைப் பகிரவிருக்கிறது.</translation>
-<translation id="5387961145478138773">உங்களுக்குப் பிடித்த Google ஆப்ஸை விரைவாக அணுகலாம்</translation>
 <translation id="5388885445722491159">சேர்க்கப்பட்டவை</translation>
 <translation id="5389237414310520250">புதிய பயனரை உருவாக்க முடியவில்லை. உங்கள் ஹார்ட் டிரைவில் உள்ள இடத்தையும் அனுமதிகளையும் சரிபார்த்து மீண்டும் முயலவும்.</translation>
 <translation id="5390100381392048184">ஒலியை இயக்க, தளங்களை அனுமதி</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 5e9494c..beaae0d 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -2891,7 +2891,6 @@
 <translation id="5380103295189760361">ఆ మాడిఫైయర్‌ల కోసం కీబోర్డ్ సత్వరమార్గాలను చూడటానికి Control, Alt, Shiftలను నొక్కి ఉంచండి లేదా శోధించండి.</translation>
 <translation id="5382591305415226340">మద్దతు గల లింక్‌లను నిర్వహించండి</translation>
 <translation id="5384883051496921101">ఈ సైట్ అజ్ఞాత మోడ్ వెలుపల ఆప్‌తో సమాచారాన్ని భాగస్వామ్యం చేయబోతోంది.</translation>
-<translation id="5387961145478138773">మీకు ఇష్టమైన Google యాప్‌లకు సత్వరమే యాక్సెస్‌ను పొందండి</translation>
 <translation id="5388885445722491159">జత చేయబడింది</translation>
 <translation id="5389237414310520250">కొత్త వినియోగదారుని సృష్టించడం సాధ్యపడలేదు. దయచేసి మీ హార్డ్ డ్రైవ్ నిల్వ ఖాళీని మరియు అనుమతులను తనిఖీ చేసి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="5390100381392048184">ధ్వనిని ప్లే చేయడానికి సైట్‌లను అనుమతించండి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index acf291d..174f566 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">กด Control Alt Shift หรือ Search ค้างไว้เพื่อดูแป้นพิมพ์ลัดสำหรับคีย์ตัวปรับแต่ง</translation>
 <translation id="5382591305415226340">จัดการลิงก์ที่สนับสนุน</translation>
 <translation id="5384883051496921101">ไซต์นี้กำลังจะแชร์ข้อมูลกับแอปนอกโหมดไม่ระบุตัวตน</translation>
-<translation id="5387961145478138773">เข้าถึงแอป Google ที่คุณชอบได้อย่างรวดเร็ว</translation>
 <translation id="5388885445722491159">จับคู่</translation>
 <translation id="5389237414310520250">ไม่สามารถสร้างผู้ใช้ใหม่ได้ โปรดตรวจสอบพื้นที่ว่างในฮาร์ดไดรฟ์และสิทธิ์ของคุณ แล้วลองอีกครั้ง</translation>
 <translation id="5390100381392048184">อนุญาตให้ไซต์เล่นเสียง</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 19283587..e7d6ff39 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Bu değiştiricilere ait klavye kısayollarını görmek için Ctrl, Alt, ÜstKrktr veya Arama tuşunu basılı tutun.</translation>
 <translation id="5382591305415226340">Desteklenen bağlantıları yönet</translation>
 <translation id="5384883051496921101">Bu site, gizli mod dışında bir uygulama ile bilgi paylaşımında bulunmak üzere.</translation>
-<translation id="5387961145478138773">Favori Google Uygulamalarınıza kolayca erişin</translation>
 <translation id="5388885445722491159">Eşleştirilmiş</translation>
 <translation id="5389237414310520250">Yeni kullanıcı oluşturulamadı. Lütfen sabit disk alanınızı ve izinlerinizi kontrol edin ve tekrar deneyin.</translation>
 <translation id="5390100381392048184">Sitelerin ses çalmasına izin ver</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 7dc4327..f51ce25d 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Утримуйте клавіші Control, Alt, Shift або клавішу Пошук, щоб побачити комбінації клавіш для цих модифікаторів.</translation>
 <translation id="5382591305415226340">Керувати підтримуваними посиланнями</translation>
 <translation id="5384883051496921101">Цей сайт збирається надіслати інформацію в додаток, у якому вимкнено режим анонімного перегляду.</translation>
-<translation id="5387961145478138773">Отримуйте швидкий доступ до улюблених додатків Google</translation>
 <translation id="5388885445722491159">Парні</translation>
 <translation id="5389237414310520250">Не вдалося створити нового користувача. Перевірте наявність місця на жорсткому диску та дозволи, а потім повторіть спробу.</translation>
 <translation id="5390100381392048184">Дозволити сайтам відтворювати звук</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index a669624..9b402a7a 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -2890,7 +2890,6 @@
 <translation id="5380103295189760361">Giữ Control, Alt, Shift hoặc Tìm kiếm để xem phím tắt dành cho các phím bổ trợ đó.</translation>
 <translation id="5382591305415226340">Quản lý liên kết được hỗ trợ</translation>
 <translation id="5384883051496921101">Trang web này sắp chia sẻ thông tin với một ứng dụng bên ngoài chế độ ẩn danh.</translation>
-<translation id="5387961145478138773">Truy cập nhanh vào Google Apps ưa thích của bạn</translation>
 <translation id="5388885445722491159">Được ghép nối</translation>
 <translation id="5389237414310520250">Không thể tạo người dùng mới. Vui lòng kiểm tra dung lượng ổ đĩa cứng và quyền của bạn rồi thử lại.</translation>
 <translation id="5390100381392048184">Cho phép các trang web phát âm thanh</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 3e8ecdc..0227ee9 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -2877,7 +2877,6 @@
 <translation id="5380103295189760361">按住 Ctrl、Alt、Shift 或 Search 键,即可查看这些辅助键的键盘快捷键。</translation>
 <translation id="5382591305415226340">管理支持的链接</translation>
 <translation id="5384883051496921101">该网站即将与某个并非处于隐身模式下的应用共享信息。</translation>
-<translation id="5387961145478138773">快速访问您最喜爱的各款 Google 应用</translation>
 <translation id="5388885445722491159">已配对</translation>
 <translation id="5389237414310520250">无法创建新用户。请检查您的硬盘空间和权限,然后重试。</translation>
 <translation id="5390100381392048184">允许网站播放声音</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index f98e7df..33b8f32 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -2888,7 +2888,6 @@
 <translation id="5380103295189760361">按住 Ctrl、Alt、Shift 鍵或搜尋鍵,即可查看這些輔助功能的鍵盤快速鍵。</translation>
 <translation id="5382591305415226340">管理支援的連結</translation>
 <translation id="5384883051496921101">這個網站即將與外部應用程式分享資訊,分享時會自動退出無痕模式。</translation>
-<translation id="5387961145478138773">快速存取你喜愛的 Google 應用程式</translation>
 <translation id="5388885445722491159">已配對</translation>
 <translation id="5389237414310520250">無法建立新的使用者。請檢查您的硬碟空間和權限,然後再試一次。</translation>
 <translation id="5390100381392048184">允許網站播放音訊</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 4eb6d7d..6876609 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -116,6 +116,8 @@
     "autofill/personal_data_manager_factory.h",
     "autofill/risk_util.cc",
     "autofill/risk_util.h",
+    "autofill/strike_database_factory.cc",
+    "autofill/strike_database_factory.h",
     "autofill/validation_rules_storage_factory.cc",
     "autofill/validation_rules_storage_factory.h",
     "background_fetch/background_fetch_delegate_factory.cc",
@@ -124,6 +126,8 @@
     "background_fetch/background_fetch_delegate_impl.h",
     "background_fetch/background_fetch_download_client.cc",
     "background_fetch/background_fetch_download_client.h",
+    "background_fetch/background_fetch_permission_context.cc",
+    "background_fetch/background_fetch_permission_context.h",
     "background_sync/background_sync_controller_factory.cc",
     "background_sync/background_sync_controller_factory.h",
     "background_sync/background_sync_controller_impl.cc",
@@ -2162,6 +2166,8 @@
       "android/explore_sites/get_catalog_task.h",
       "android/explore_sites/get_images_task.cc",
       "android/explore_sites/get_images_task.h",
+      "android/explore_sites/history_statistics_reporter.cc",
+      "android/explore_sites/history_statistics_reporter.h",
       "android/explore_sites/import_catalog_task.cc",
       "android/explore_sites/import_catalog_task.h",
       "android/explore_sites/ntp_json_fetcher.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 5b9351746..fc52e68 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -4101,6 +4101,10 @@
     {"ntp-icons", flag_descriptions::kNtpIconsName,
      flag_descriptions::kNtpIconsDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kNtpIcons)},
+
+    {"ntp-ui-md", flag_descriptions::kNtpUIMdName,
+     flag_descriptions::kNtpUIMdDescription, kOsDesktop,
+     FEATURE_VALUE_TYPE(features::kNtpUIMd)},
 #endif  // OS_WIN || OS_MACOSX || OS_LINUX
 
 #if defined(OS_ANDROID)
@@ -4418,12 +4422,17 @@
     {"enable-shill-sandboxing", flag_descriptions::kShillSandboxingName,
      flag_descriptions::kShillSandboxingDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(features::kShillSandboxing)},
-#endif
 
-    // NOTE: Adding a new flag requires adding a corresponding entry to enum
-    // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
-    // Histograms" in tools/metrics/histograms/README.md (run the
-    // AboutFlagsHistogramTest unit test to verify this process).
+    {"enable-arc-unified-audio-focus",
+     flag_descriptions::kEnableArcUnifiedAudioFocusName,
+     flag_descriptions::kEnableArcUnifiedAudioFocusDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(arc::kEnableUnifiedAudioFocusFeature)},
+#endif  // defined(OS_CHROMEOS)
+
+// NOTE: Adding a new flag requires adding a corresponding entry to enum
+// "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
+// Histograms" in tools/metrics/histograms/README.md (run the
+// AboutFlagsHistogramTest unit test to verify this process).
 
 #if defined(OS_WIN)
     {"use-angle", flag_descriptions::kUseAngleName,
diff --git a/chrome/browser/accessibility/accessibility_extension_api.cc b/chrome/browser/accessibility/accessibility_extension_api.cc
index 7d36c76..cc10edd 100644
--- a/chrome/browser/accessibility/accessibility_extension_api.cc
+++ b/chrome/browser/accessibility/accessibility_extension_api.cc
@@ -285,6 +285,23 @@
 }
 
 ExtensionFunction::ResponseAction
+AccessibilityPrivateEnableChromeVoxMouseEventsFunction::Run() {
+#if defined(OS_CHROMEOS)
+  bool enabled = false;
+  EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(0, &enabled));
+  ash::mojom::EventRewriterControllerPtr event_rewriter_controller_ptr;
+  content::ServiceManagerConnection* connection =
+      content::ServiceManagerConnection::GetForProcess();
+  connection->GetConnector()->BindInterface(ash::mojom::kServiceName,
+                                            &event_rewriter_controller_ptr);
+  event_rewriter_controller_ptr->SetSendMouseEventsToDelegate(enabled);
+  return RespondNow(NoArguments());
+#else
+  return RespondNow(Error(kErrorNotSupported));
+#endif
+}
+
+ExtensionFunction::ResponseAction
 AccessibilityPrivateOnSelectToSpeakStateChangedFunction::Run() {
   std::unique_ptr<accessibility_private::OnSelectToSpeakStateChanged::Params>
       params =
diff --git a/chrome/browser/accessibility/accessibility_extension_api.h b/chrome/browser/accessibility/accessibility_extension_api.h
index dba2f3c..e26d528 100644
--- a/chrome/browser/accessibility/accessibility_extension_api.h
+++ b/chrome/browser/accessibility/accessibility_extension_api.h
@@ -89,6 +89,15 @@
                              ACCESSIBILITY_PRIVATE_SENDSYNTHETICKEYEVENT)
 };
 
+// API function that enables or disables mouse events in ChromeVox.
+class AccessibilityPrivateEnableChromeVoxMouseEventsFunction
+    : public UIThreadExtensionFunction {
+  ~AccessibilityPrivateEnableChromeVoxMouseEventsFunction() override {}
+  ResponseAction Run() override;
+  DECLARE_EXTENSION_FUNCTION("accessibilityPrivate.enableChromeVoxMouseEvents",
+                             ACCESSIBILITY_PRIVATE_ENABLECHROMEVOXMOUSEEVENTS)
+};
+
 // API function that is called when the Select-to-Speak extension state changes.
 class AccessibilityPrivateOnSelectToSpeakStateChangedFunction
     : public UIThreadExtensionFunction {
diff --git a/chrome/browser/android/download/download_manager_service.cc b/chrome/browser/android/download/download_manager_service.cc
index 971c458..45940188 100644
--- a/chrome/browser/android/download/download_manager_service.cc
+++ b/chrome/browser/android/download/download_manager_service.cc
@@ -20,12 +20,15 @@
 #include "chrome/browser/download/download_core_service.h"
 #include "chrome/browser/download/download_core_service_factory.h"
 #include "chrome/browser/download/offline_item_utils.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/chrome_constants.h"
 #include "components/download/public/common/download_item.h"
 #include "components/download/public/common/download_item_impl.h"
+#include "components/download/public/common/download_url_loader_factory_getter_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/download_item_utils.h"
+#include "content/public/browser/network_service_instance.h"
 #include "content/public/browser/notification_service.h"
 #include "jni/DownloadInfo_jni.h"
 #include "jni/DownloadItem_jni.h"
@@ -172,8 +175,7 @@
 
 void DownloadManagerService::NotifyServiceStarted(
     std::unique_ptr<service_manager::Connector> connector) {
-  // TODO: Additional initialization, e.g. connect to Network Service using
-  // |connector| if the minimal download manager path is enabled by flag.
+  connector_ = std::move(connector);
 }
 
 void DownloadManagerService::Init(
@@ -573,8 +575,12 @@
   in_progress_manager_ = std::make_unique<download::InProgressDownloadManager>(
       nullptr, data_dir.Append(chrome::kInitialProfile),
       download::InProgressDownloadManager::IsOriginSecureCallback());
-  // TODO(qinmin): construct the URLLoaderFactoryGetter and pass it to
-  // |in_progress_manager_|
+  content::GetNetworkServiceFromConnector(connector_.get());
+  scoped_refptr<network::SharedURLLoaderFactory> factory =
+      SystemNetworkContextManager::GetInstance()->GetSharedURLLoaderFactory();
+  in_progress_manager_->set_url_loader_factory_getter(
+      base::MakeRefCounted<download::DownloadURLLoaderFactoryGetterImpl>(
+          factory->Clone()));
   in_progress_manager_->NotifyWhenInitialized(
       base::BindOnce(&DownloadManagerService::OnInProgressManagerInitiailized,
                      base::Unretained(this)));
diff --git a/chrome/browser/android/download/download_manager_service.h b/chrome/browser/android/download/download_manager_service.h
index 6b7ab30..1efc9475a 100644
--- a/chrome/browser/android/download/download_manager_service.h
+++ b/chrome/browser/android/download/download_manager_service.h
@@ -232,6 +232,9 @@
   // pass this object to DownloadManagerImpl once it is created.
   std::unique_ptr<download::InProgressDownloadManager> in_progress_manager_;
 
+  // Connector to the service manager to get the network service.
+  std::unique_ptr<service_manager::Connector> connector_;
+
   DISALLOW_COPY_AND_ASSIGN(DownloadManagerService);
 };
 
diff --git a/chrome/browser/android/explore_sites/explore_sites_bridge.cc b/chrome/browser/android/explore_sites/explore_sites_bridge.cc
index 7da3aab..e2dfde387 100644
--- a/chrome/browser/android/explore_sites/explore_sites_bridge.cc
+++ b/chrome/browser/android/explore_sites/explore_sites_bridge.cc
@@ -142,6 +142,7 @@
     JNIEnv* env,
     const JavaParamRef<jclass>& j_caller,
     const JavaParamRef<jobject>& j_profile,
+    jboolean is_immediate_fetch,
     const JavaParamRef<jobject>& j_callback_obj) {
   Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
   DCHECK(profile);
@@ -163,7 +164,7 @@
   }
 
   service->UpdateCatalogFromNetwork(
-      accept_languages,
+      static_cast<bool>(is_immediate_fetch), accept_languages,
       base::BindOnce(&UpdateCatalogDone,
                      ScopedJavaGlobalRef<jobject>(j_callback_obj)));
 }
diff --git a/chrome/browser/android/explore_sites/explore_sites_fetcher.cc b/chrome/browser/android/explore_sites/explore_sites_fetcher.cc
index 87c5094..7adf18d6 100644
--- a/chrome/browser/android/explore_sites/explore_sites_fetcher.cc
+++ b/chrome/browser/android/explore_sites/explore_sites_fetcher.cc
@@ -91,66 +91,101 @@
 
 }  // namespace
 
+const net::BackoffEntry::Policy
+    ExploreSitesFetcher::kImmediateFetchBackoffPolicy = {
+        0,         // Number of initial errors to ignore without backoff.
+        1 * 1000,  // Initial delay for backoff in ms: 1 second.
+        2,         // Factor to multiply for exponential backoff.
+        0,         // Fuzzing percentage.
+        4 * 1000,  // Maximum time to delay requests in ms: 4 seconds.
+        -1,        // Don't discard entry even if unused.
+        false      // Don't use initial delay unless the last was an error.
+};
+const int ExploreSitesFetcher::kMaxFailureCountForImmediateFetch = 3;
+
+const net::BackoffEntry::Policy
+    ExploreSitesFetcher::kBackgroundFetchBackoffPolicy = {
+        0,           // Number of initial errors to ignore without backoff.
+        5 * 1000,    // Initial delay for backoff in ms: 5 seconds.
+        2,           // Factor to multiply for exponential backoff.
+        0,           // Fuzzing percentage.
+        320 * 1000,  // Maximum time to delay requests in ms: 320 seconds.
+        -1,          // Don't discard entry even if unused.
+        false        // Don't use initial delay unless the last was an error.
+};
+const int ExploreSitesFetcher::kMaxFailureCountForBackgroundFetch = 7;
+
 std::unique_ptr<ExploreSitesFetcher> ExploreSitesFetcher::CreateForGetCatalog(
-    Callback callback,
-    const std::string catalog_version,
-    const std::string accept_languages,
-    scoped_refptr<network::SharedURLLoaderFactory> loader_factory) {
+    bool is_immediate_fetch,
+    const std::string& catalog_version,
+    const std::string& accept_languages,
+    scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
+    Callback callback) {
   GURL url = GetCatalogURL();
-  return base::WrapUnique(
-      new ExploreSitesFetcher(std::move(callback), url, catalog_version,
-                              accept_languages, loader_factory));
+  return base::WrapUnique(new ExploreSitesFetcher(
+      is_immediate_fetch, url, catalog_version, accept_languages,
+      loader_factory, std::move(callback)));
 }
 
 std::unique_ptr<ExploreSitesFetcher>
 ExploreSitesFetcher::CreateForGetCategories(
-    Callback callback,
-    const std::string catalog_version,
-    const std::string accept_languages,
-    scoped_refptr<network::SharedURLLoaderFactory> loader_factory) {
+    bool is_immediate_fetch,
+    const std::string& catalog_version,
+    const std::string& accept_languages,
+    scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
+    Callback callback) {
   GURL url = GetCategoriesURL();
-  return base::WrapUnique(
-      new ExploreSitesFetcher(std::move(callback), url, catalog_version,
-                              accept_languages, loader_factory));
+  return base::WrapUnique(new ExploreSitesFetcher(
+      is_immediate_fetch, url, catalog_version, accept_languages,
+      loader_factory, std::move(callback)));
 }
 
 ExploreSitesFetcher::ExploreSitesFetcher(
-    Callback callback,
+    bool is_immediate_fetch,
     const GURL& url,
-    const std::string catalog_version,
-    const std::string accept_languages,
-    scoped_refptr<network::SharedURLLoaderFactory> loader_factory)
-    : callback_(std::move(callback)),
+    const std::string& catalog_version,
+    const std::string& accept_languages,
+    scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
+    Callback callback)
+    : accept_languages_(accept_languages),
+      backoff_entry_(is_immediate_fetch ? &kImmediateFetchBackoffPolicy
+                                        : &kBackgroundFetchBackoffPolicy),
+      max_failure_count_(is_immediate_fetch
+                             ? kMaxFailureCountForImmediateFetch
+                             : kMaxFailureCountForBackgroundFetch),
+      callback_(std::move(callback)),
       url_loader_factory_(loader_factory),
       weak_factory_(this) {
   base::Version version = version_info::GetVersion();
   std::string channel_name = chrome::GetChannelName();
-  std::string client_version =
-      base::StringPrintf("%d.%d.%d.%s.chrome",
-                         version.components()[0],  // Major
-                         version.components()[2],  // Build
-                         version.components()[3],  // Patch
-                         channel_name.c_str());
-  GURL final_url =
+  client_version_ = base::StringPrintf("%d.%d.%d.%s.chrome",
+                                       version.components()[0],  // Major
+                                       version.components()[2],  // Build
+                                       version.components()[3],  // Patch
+                                       channel_name.c_str());
+  request_url_ =
       net::AppendOrReplaceQueryParameter(url, "country_code", GetCountry());
-  final_url = net::AppendOrReplaceQueryParameter(final_url, "version_token",
-                                                 catalog_version);
-  DVLOG(1) << "Final URL: " << final_url.spec();
+  request_url_ = net::AppendOrReplaceQueryParameter(
+      request_url_, "version_token", catalog_version);
+}
 
+ExploreSitesFetcher::~ExploreSitesFetcher() {}
+
+void ExploreSitesFetcher::Start() {
   auto resource_request = std::make_unique<network::ResourceRequest>();
-  resource_request->url = final_url;
+  resource_request->url = request_url_;
   resource_request->method = kRequestMethod;
   bool is_stable_channel =
       chrome::GetChannel() == version_info::Channel::STABLE;
   std::string api_key = is_stable_channel ? google_apis::GetAPIKey()
                                           : google_apis::GetNonStableAPIKey();
   resource_request->headers.SetHeader("x-goog-api-key", api_key);
-  resource_request->headers.SetHeader("X-Client-Version", client_version);
+  resource_request->headers.SetHeader("X-Client-Version", client_version_);
   resource_request->headers.SetHeader(net::HttpRequestHeaders::kContentType,
                                       kRequestContentType);
-  if (!accept_languages.empty()) {
+  if (!accept_languages_.empty()) {
     resource_request->headers.SetHeader(
-        net::HttpRequestHeaders::kAcceptLanguage, accept_languages);
+        net::HttpRequestHeaders::kAcceptLanguage, accept_languages_);
   }
 
   // Get field trial value, if any.
@@ -169,15 +204,19 @@
                      weak_factory_.GetWeakPtr()));
 }
 
-ExploreSitesFetcher::~ExploreSitesFetcher() {}
-
 void ExploreSitesFetcher::OnSimpleLoaderComplete(
     std::unique_ptr<std::string> response_body) {
   ExploreSitesRequestStatus status = HandleResponseCode();
 
   if (response_body && response_body->empty()) {
     DVLOG(1) << "Failed to get response or empty response";
-    status = ExploreSitesRequestStatus::kShouldRetry;
+    status = ExploreSitesRequestStatus::kFailure;
+  }
+
+  if (status == ExploreSitesRequestStatus::kFailure &&
+      !disable_retry_for_testing_) {
+    RetryWithBackoff();
+    return;
   }
 
   std::move(callback_).Run(status, std::move(response_body));
@@ -193,18 +232,33 @@
     DVLOG(1) << "Net error: " << net_error;
     return (net_error == net::ERR_BLOCKED_BY_ADMINISTRATOR)
                ? ExploreSitesRequestStatus::kShouldSuspendBlockedByAdministrator
-               : ExploreSitesRequestStatus::kShouldRetry;
+               : ExploreSitesRequestStatus::kFailure;
   } else if (response_code < 200 || response_code > 299) {
     DVLOG(1) << "HTTP status: " << response_code;
     switch (response_code) {
       case net::HTTP_BAD_REQUEST:
         return ExploreSitesRequestStatus::kShouldSuspendBadRequest;
       default:
-        return ExploreSitesRequestStatus::kShouldRetry;
+        return ExploreSitesRequestStatus::kFailure;
     }
   }
 
   return ExploreSitesRequestStatus::kSuccess;
 }
 
+void ExploreSitesFetcher::RetryWithBackoff() {
+  backoff_entry_.InformOfRequest(false);
+
+  if (backoff_entry_.failure_count() >= max_failure_count_) {
+    std::move(callback_).Run(ExploreSitesRequestStatus::kFailure,
+                             std::unique_ptr<std::string>());
+    return;
+  }
+
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&ExploreSitesFetcher::Start, weak_factory_.GetWeakPtr()),
+      backoff_entry_.GetTimeUntilRelease());
+}
+
 }  // namespace explore_sites
diff --git a/chrome/browser/android/explore_sites/explore_sites_fetcher.h b/chrome/browser/android/explore_sites/explore_sites_fetcher.h
index 0f319d20..8b331dd 100644
--- a/chrome/browser/android/explore_sites/explore_sites_fetcher.h
+++ b/chrome/browser/android/explore_sites/explore_sites_fetcher.h
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/android/explore_sites/explore_sites_types.h"
+#include "net/base/backoff_entry.h"
 
 namespace network {
 class SimpleURLLoader;
@@ -29,38 +30,62 @@
       base::OnceCallback<void(ExploreSitesRequestStatus status,
                               const std::unique_ptr<std::string> data)>;
 
+  static const net::BackoffEntry::Policy kImmediateFetchBackoffPolicy;
+  static const int kMaxFailureCountForImmediateFetch;
+  static const net::BackoffEntry::Policy kBackgroundFetchBackoffPolicy;
+  static const int kMaxFailureCountForBackgroundFetch;
+
   // Creates a fetcher for the GetCatalog RPC.
   static std::unique_ptr<ExploreSitesFetcher> CreateForGetCatalog(
-      Callback callback,
-      const std::string catalog_version,
-      const std::string accept_languages,
-      scoped_refptr<network::SharedURLLoaderFactory> loader_factory);
+      bool is_immediate_fetch,
+      const std::string& catalog_version,
+      const std::string& accept_languages,
+      scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
+      Callback callback);
 
   // Creates a fetcher for the GetCategories RPC.
   static std::unique_ptr<ExploreSitesFetcher> CreateForGetCategories(
-      Callback callback,
-      const std::string catalog_version,
-      const std::string accept_languages,
-      scoped_refptr<network::SharedURLLoaderFactory> loader_factory);
+      bool is_immediate_fetch,
+      const std::string& catalog_version,
+      const std::string& accept_languages,
+      scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
+      Callback callback);
 
   ~ExploreSitesFetcher();
 
+  void Start();
+
+  void disable_retry_for_testing() { disable_retry_for_testing_ = true; }
+
  private:
   explicit ExploreSitesFetcher(
-      Callback callback,
+      bool is_immediate_fetch,
       const GURL& url,
-      const std::string catalog_version,
-      const std::string accept_languages,
-      scoped_refptr<network ::SharedURLLoaderFactory> loader_factory);
+      const std::string& catalog_version,
+      const std::string& accept_languages,
+      scoped_refptr<network ::SharedURLLoaderFactory> loader_factory,
+      Callback callback);
 
   // Invoked from SimpleURLLoader after download is complete.
   void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body);
 
   ExploreSitesRequestStatus HandleResponseCode();
 
+  void RetryWithBackoff();
+
+  std::string accept_languages_;
+  std::string client_version_;
+  GURL request_url_;
+
+  net::BackoffEntry backoff_entry_;
+  int max_failure_count_;
+  bool disable_retry_for_testing_ = false;
+
   Callback callback_;
+
   scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
   std::unique_ptr<network::SimpleURLLoader> url_loader_;
+
   base::WeakPtrFactory<ExploreSitesFetcher> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ExploreSitesFetcher);
diff --git a/chrome/browser/android/explore_sites/explore_sites_fetcher_unittest.cc b/chrome/browser/android/explore_sites/explore_sites_fetcher_unittest.cc
index f110f12..d720b85 100644
--- a/chrome/browser/android/explore_sites/explore_sites_fetcher_unittest.cc
+++ b/chrome/browser/android/explore_sites/explore_sites_fetcher_unittest.cc
@@ -36,6 +36,7 @@
 const char kAcceptLanguages[] = "en-US,en;q=0.5";
 const char kCountryOverride[] = "country_override";
 const char kExperimentData[] = "FooBar";
+const char kTestData[] = "Any data.";
 }  // namespace
 
 namespace explore_sites {
@@ -52,6 +53,16 @@
       net::HttpStatusCode http_error);
   ExploreSitesRequestStatus RunFetcherWithData(const std::string& response_data,
                                                std::string* data_received);
+  ExploreSitesRequestStatus RunFetcherWithBackoffs(
+      bool is_immediate_fetch,
+      size_t num_of_backoffs,
+      std::vector<base::TimeDelta> backoff_delays,
+      std::vector<base::OnceCallback<void(void)>> respond_callbacks,
+      std::string* data_received);
+
+  void RespondWithData(const std::string& data);
+  void RespondWithNetError(int net_error);
+  void RespondWithHttpError(net::HttpStatusCode http_error);
 
   void SetUpExperimentOption(std::string option, std::string data) {
     const std::string kTrialName = "trial_name";
@@ -77,12 +88,11 @@
   ExploreSitesFetcher::Callback StoreResult();
   network::TestURLLoaderFactory::PendingRequest* GetPendingRequest(
       size_t index);
+  std::unique_ptr<ExploreSitesFetcher> CreateFetcher(bool disable_retry,
+                                                     bool is_immediate_fetch);
   ExploreSitesRequestStatus RunFetcher(
       base::OnceCallback<void(void)> respond_callback,
       std::string* data_received);
-  void RespondWithData(const std::string& data);
-  void RespondWithNetError(int net_error);
-  void RespondWithHttpError(net::HttpStatusCode http_error);
 
   network::TestURLLoaderFactory test_url_loader_factory_;
   scoped_refptr<network::SharedURLLoaderFactory>
@@ -192,9 +202,7 @@
     base::OnceCallback<void(void)> respond_callback,
     std::string* data_received) {
   std::unique_ptr<ExploreSitesFetcher> fetcher =
-      ExploreSitesFetcher::CreateForGetCatalog(StoreResult(), "123",
-                                               kAcceptLanguages,
-                                               test_shared_url_loader_factory_);
+      CreateFetcher(true /* disable_retry*/, true /*is_immediate_fetch*/);
 
   std::move(respond_callback).Run();
   task_runner_->RunUntilIdle();
@@ -204,19 +212,60 @@
   return last_status_;
 }
 
+ExploreSitesRequestStatus ExploreSitesFetcherTest::RunFetcherWithBackoffs(
+    bool is_immediate_fetch,
+    size_t num_of_backoffs,
+    std::vector<base::TimeDelta> backoff_delays,
+    std::vector<base::OnceCallback<void(void)>> respond_callbacks,
+    std::string* data_received) {
+  DCHECK_EQ(num_of_backoffs, backoff_delays.size());
+  DCHECK(num_of_backoffs <= respond_callbacks.size() &&
+         respond_callbacks.size() <= num_of_backoffs + 1);
+
+  std::unique_ptr<ExploreSitesFetcher> fetcher =
+      CreateFetcher(false /* disable_retry*/, is_immediate_fetch);
+
+  std::move(respond_callbacks[0]).Run();
+  task_runner_->RunUntilIdle();
+
+  for (size_t i = 0; i < num_of_backoffs; ++i) {
+    task_runner_->FastForwardBy(backoff_delays[i]);
+    if (i + 1 <= respond_callbacks.size() - 1)
+      std::move(respond_callbacks[i + 1]).Run();
+    task_runner_->RunUntilIdle();
+  }
+
+  if (last_data_)
+    *data_received = *last_data_;
+  return last_status_;
+}
+
+std::unique_ptr<ExploreSitesFetcher> ExploreSitesFetcherTest::CreateFetcher(
+    bool disable_retry,
+    bool is_immediate_fetch) {
+  std::unique_ptr<ExploreSitesFetcher> fetcher =
+      ExploreSitesFetcher::CreateForGetCatalog(
+          is_immediate_fetch, "123", kAcceptLanguages,
+          test_shared_url_loader_factory_, StoreResult());
+  if (disable_retry)
+    fetcher->disable_retry_for_testing();
+  fetcher->Start();
+  return fetcher;
+}
+
 TEST_F(ExploreSitesFetcherTest, NetErrors) {
   EXPECT_EQ(ExploreSitesRequestStatus::kShouldSuspendBlockedByAdministrator,
             RunFetcherWithNetError(net::ERR_BLOCKED_BY_ADMINISTRATOR));
 
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithNetError(net::ERR_INTERNET_DISCONNECTED));
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithNetError(net::ERR_NETWORK_CHANGED));
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithNetError(net::ERR_CONNECTION_RESET));
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithNetError(net::ERR_CONNECTION_CLOSED));
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithNetError(net::ERR_CONNECTION_REFUSED));
 }
 
@@ -224,37 +273,35 @@
   EXPECT_EQ(ExploreSitesRequestStatus::kShouldSuspendBadRequest,
             RunFetcherWithHttpError(net::HTTP_BAD_REQUEST));
 
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithHttpError(net::HTTP_NOT_IMPLEMENTED));
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithHttpError(net::HTTP_UNAUTHORIZED));
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithHttpError(net::HTTP_NOT_FOUND));
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithHttpError(net::HTTP_CONFLICT));
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithHttpError(net::HTTP_INTERNAL_SERVER_ERROR));
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithHttpError(net::HTTP_BAD_GATEWAY));
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithHttpError(net::HTTP_SERVICE_UNAVAILABLE));
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
             RunFetcherWithHttpError(net::HTTP_GATEWAY_TIMEOUT));
 }
 
 TEST_F(ExploreSitesFetcherTest, EmptyResponse) {
   std::string data;
-  EXPECT_EQ(ExploreSitesRequestStatus::kShouldRetry,
-            RunFetcherWithData("", &data));
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure, RunFetcherWithData("", &data));
   EXPECT_TRUE(data.empty());
 }
 
 TEST_F(ExploreSitesFetcherTest, Success) {
   std::string data;
   EXPECT_EQ(ExploreSitesRequestStatus::kSuccess,
-            RunFetcherWithData("Any data.", &data));
-  EXPECT_FALSE(data.empty());
-  EXPECT_EQ(data, "Any data.");
+            RunFetcherWithData(kTestData, &data));
+  EXPECT_EQ(kTestData, data);
 
   EXPECT_EQ(last_resource_request.url.spec(),
             "https://exploresites-pa.googleapis.com/v1/"
@@ -265,9 +312,8 @@
   SetUpExperimentOption(kCountryOverride, "KZ");
   std::string data;
   EXPECT_EQ(ExploreSitesRequestStatus::kSuccess,
-            RunFetcherWithData("Any data.", &data));
-  EXPECT_FALSE(data.empty());
-  EXPECT_EQ(data, "Any data.");
+            RunFetcherWithData(kTestData, &data));
+  EXPECT_EQ(kTestData, data);
 
   EXPECT_EQ(last_resource_request.url.spec(),
             "https://exploresites-pa.googleapis.com/v1/"
@@ -277,7 +323,7 @@
 TEST_F(ExploreSitesFetcherTest, TestHeaders) {
   std::string data;
   EXPECT_EQ(ExploreSitesRequestStatus::kSuccess,
-            RunFetcherWithData("Any data.", &data));
+            RunFetcherWithData(kTestData, &data));
 
   net::HttpRequestHeaders headers = last_resource_request.headers;
   std::string content_type;
@@ -311,7 +357,7 @@
 
   std::string data;
   EXPECT_EQ(ExploreSitesRequestStatus::kSuccess,
-            RunFetcherWithData("Any data.", &data));
+            RunFetcherWithData(kTestData, &data));
 
   net::HttpRequestHeaders headers = last_resource_request.headers;
   std::string header_text;
@@ -321,4 +367,136 @@
   EXPECT_EQ(std::string(kExperimentData), header_text);
 }
 
+TEST_F(ExploreSitesFetcherTest, OneBackoffForImmediateFetch) {
+  std::string data;
+  int initial_delay_ms =
+      ExploreSitesFetcher::kImmediateFetchBackoffPolicy.initial_delay_ms;
+  std::vector<base::TimeDelta> backoff_delays = {
+      base::TimeDelta::FromMilliseconds(initial_delay_ms)};
+  std::vector<base::OnceCallback<void(void)>> respond_callbacks;
+  respond_callbacks.push_back(
+      base::BindOnce(&ExploreSitesFetcherTest::RespondWithNetError,
+                     base::Unretained(this), net::ERR_INTERNET_DISCONNECTED));
+  respond_callbacks.push_back(
+      base::BindOnce(&ExploreSitesFetcherTest::RespondWithData,
+                     base::Unretained(this), kTestData));
+  EXPECT_EQ(
+      ExploreSitesRequestStatus::kSuccess,
+      RunFetcherWithBackoffs(true /*is_immediate_fetch*/, 1u, backoff_delays,
+                             std::move(respond_callbacks), &data));
+  EXPECT_EQ(kTestData, data);
+}
+
+TEST_F(ExploreSitesFetcherTest, OneBackoffForBackgroundFetch) {
+  std::string data;
+  int initial_delay_ms =
+      ExploreSitesFetcher::kBackgroundFetchBackoffPolicy.initial_delay_ms;
+  std::vector<base::TimeDelta> backoff_delays = {
+      base::TimeDelta::FromMilliseconds(initial_delay_ms)};
+  std::vector<base::OnceCallback<void(void)>> respond_callbacks;
+  respond_callbacks.push_back(
+      base::BindOnce(&ExploreSitesFetcherTest::RespondWithNetError,
+                     base::Unretained(this), net::ERR_INTERNET_DISCONNECTED));
+  respond_callbacks.push_back(
+      base::BindOnce(&ExploreSitesFetcherTest::RespondWithData,
+                     base::Unretained(this), kTestData));
+  EXPECT_EQ(
+      ExploreSitesRequestStatus::kSuccess,
+      RunFetcherWithBackoffs(false /*is_immediate_fetch*/, 1u, backoff_delays,
+                             std::move(respond_callbacks), &data));
+  EXPECT_EQ(kTestData, data);
+}
+
+TEST_F(ExploreSitesFetcherTest, TwoBackoffsForImmediateFetch) {
+  std::string data;
+  int initial_delay_ms =
+      ExploreSitesFetcher::kImmediateFetchBackoffPolicy.initial_delay_ms;
+  std::vector<base::TimeDelta> backoff_delays = {
+      base::TimeDelta::FromMilliseconds(initial_delay_ms),
+      base::TimeDelta::FromMilliseconds(initial_delay_ms * 2)};
+  std::vector<base::OnceCallback<void(void)>> respond_callbacks;
+  respond_callbacks.push_back(
+      base::BindOnce(&ExploreSitesFetcherTest::RespondWithNetError,
+                     base::Unretained(this), net::ERR_INTERNET_DISCONNECTED));
+  respond_callbacks.push_back(
+      base::BindOnce(&ExploreSitesFetcherTest::RespondWithHttpError,
+                     base::Unretained(this), net::HTTP_INTERNAL_SERVER_ERROR));
+  respond_callbacks.push_back(
+      base::BindOnce(&ExploreSitesFetcherTest::RespondWithData,
+                     base::Unretained(this), kTestData));
+  EXPECT_EQ(
+      ExploreSitesRequestStatus::kSuccess,
+      RunFetcherWithBackoffs(true /*is_immediate_fetch*/, 2u, backoff_delays,
+                             std::move(respond_callbacks), &data));
+  EXPECT_EQ(kTestData, data);
+}
+
+TEST_F(ExploreSitesFetcherTest, TwoBackoffsForBackgroundFetch) {
+  std::string data;
+  int initial_delay_ms =
+      ExploreSitesFetcher::kBackgroundFetchBackoffPolicy.initial_delay_ms;
+  std::vector<base::TimeDelta> backoff_delays = {
+      base::TimeDelta::FromMilliseconds(initial_delay_ms),
+      base::TimeDelta::FromMilliseconds(initial_delay_ms * 2)};
+  std::vector<base::OnceCallback<void(void)>> respond_callbacks;
+  respond_callbacks.push_back(
+      base::BindOnce(&ExploreSitesFetcherTest::RespondWithNetError,
+                     base::Unretained(this), net::ERR_INTERNET_DISCONNECTED));
+  respond_callbacks.push_back(
+      base::BindOnce(&ExploreSitesFetcherTest::RespondWithHttpError,
+                     base::Unretained(this), net::HTTP_INTERNAL_SERVER_ERROR));
+  respond_callbacks.push_back(
+      base::BindOnce(&ExploreSitesFetcherTest::RespondWithData,
+                     base::Unretained(this), kTestData));
+  EXPECT_EQ(
+      ExploreSitesRequestStatus::kSuccess,
+      RunFetcherWithBackoffs(false /*is_immediate_fetch*/, 2u, backoff_delays,
+                             std::move(respond_callbacks), &data));
+  EXPECT_EQ(kTestData, data);
+}
+
+TEST_F(ExploreSitesFetcherTest, ExceedMaxBackoffsForImmediateFetch) {
+  std::string data;
+  int delay_ms =
+      ExploreSitesFetcher::kImmediateFetchBackoffPolicy.initial_delay_ms;
+  std::vector<base::TimeDelta> backoff_delays;
+  std::vector<base::OnceCallback<void(void)>> respond_callbacks;
+  for (int i = 0; i < ExploreSitesFetcher::kMaxFailureCountForImmediateFetch;
+       ++i) {
+    backoff_delays.push_back(base::TimeDelta::FromMilliseconds(delay_ms));
+    delay_ms *= 2;
+    respond_callbacks.push_back(
+        base::BindOnce(&ExploreSitesFetcherTest::RespondWithNetError,
+                       base::Unretained(this), net::ERR_INTERNET_DISCONNECTED));
+  }
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
+            RunFetcherWithBackoffs(
+                true /*is_immediate_fetch*/,
+                ExploreSitesFetcher::kMaxFailureCountForImmediateFetch,
+                backoff_delays, std::move(respond_callbacks), &data));
+  EXPECT_TRUE(data.empty());
+}
+
+TEST_F(ExploreSitesFetcherTest, ExceedMaxBackoffsForBackgroundFetch) {
+  std::string data;
+  int delay_ms =
+      ExploreSitesFetcher::kBackgroundFetchBackoffPolicy.initial_delay_ms;
+  std::vector<base::TimeDelta> backoff_delays;
+  std::vector<base::OnceCallback<void(void)>> respond_callbacks;
+  for (int i = 0; i < ExploreSitesFetcher::kMaxFailureCountForBackgroundFetch;
+       ++i) {
+    backoff_delays.push_back(base::TimeDelta::FromMilliseconds(delay_ms));
+    delay_ms *= 2;
+    respond_callbacks.push_back(
+        base::BindOnce(&ExploreSitesFetcherTest::RespondWithNetError,
+                       base::Unretained(this), net::ERR_INTERNET_DISCONNECTED));
+  }
+  EXPECT_EQ(ExploreSitesRequestStatus::kFailure,
+            RunFetcherWithBackoffs(
+                false /*is_immediate_fetch*/,
+                ExploreSitesFetcher::kMaxFailureCountForBackgroundFetch,
+                backoff_delays, std::move(respond_callbacks), &data));
+  EXPECT_TRUE(data.empty());
+}
+
 }  // namespace explore_sites
diff --git a/chrome/browser/android/explore_sites/explore_sites_service.h b/chrome/browser/android/explore_sites/explore_sites_service.h
index 9bdd70a..c3558a3 100644
--- a/chrome/browser/android/explore_sites/explore_sites_service.h
+++ b/chrome/browser/android/explore_sites/explore_sites_service.h
@@ -30,9 +30,12 @@
   virtual void GetSiteImage(int site_id, BitmapCallback callback) = 0;
 
   // Fetch the latest catalog from the network and stores it locally. Returns
-  // true in the callback for success.  If the accept_languages string is empty,
-  // no "Accept-Language" header is created for the network request.
-  virtual void UpdateCatalogFromNetwork(std::string accept_languages,
+  // true in the callback for success.  |is_immediate_fetch| denotes if the
+  // fetch should be done immediately or on background.  If the accept_languages
+  // string is empty, no "Accept-Language" header is created for the network
+  // request.
+  virtual void UpdateCatalogFromNetwork(bool is_immediate_fetch,
+                                        const std::string& accept_languages,
                                         BooleanCallback callback) = 0;
 };
 
diff --git a/chrome/browser/android/explore_sites/explore_sites_service_factory.cc b/chrome/browser/android/explore_sites/explore_sites_service_factory.cc
index b760cb3..7f005cb 100644
--- a/chrome/browser/android/explore_sites/explore_sites_service_factory.cc
+++ b/chrome/browser/android/explore_sites/explore_sites_service_factory.cc
@@ -11,14 +11,16 @@
 #include "base/memory/singleton.h"
 #include "base/sequenced_task_runner.h"
 #include "base/task/post_task.h"
+#include "base/time/default_clock.h"
 
-#include "chrome/browser/android/explore_sites/explore_sites_bridge.h"
-#include "chrome/browser/android/explore_sites/explore_sites_feature.h"
 #include "chrome/browser/android/explore_sites/explore_sites_service.h"
 #include "chrome/browser/android/explore_sites/explore_sites_service_impl.h"
 #include "chrome/browser/android/explore_sites/explore_sites_store.h"
+#include "chrome/browser/android/explore_sites/history_statistics_reporter.h"
+#include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_constants.h"
+#include "components/history/core/browser/history_service.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "content/public/browser/browser_context.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -46,8 +48,9 @@
 }
 
 bool ExploreSitesServiceFactory::ServiceIsCreatedWithBrowserContext() const {
-  return chrome::android::explore_sites::GetExploreSitesVariation() ==
-         chrome::android::explore_sites::ExploreSitesVariation::ENABLED;
+  // Always create this service with BrowserContext. This service is lightweight
+  // but ensures various background activities are on if they are needed.
+  return true;
 }
 
 KeyedService* ExploreSitesServiceFactory::BuildServiceInstanceFor(
@@ -61,11 +64,14 @@
       std::make_unique<ExploreSitesStore>(background_task_runner, store_path);
   scoped_refptr<network::SharedURLLoaderFactory> url_fetcher =
       profile->GetURLLoaderFactory();
-
-  ExploreSitesBridge::ScheduleDailyTask();
+  history::HistoryService* history_service =
+      HistoryServiceFactory::GetForProfile(profile,
+                                           ServiceAccessType::EXPLICIT_ACCESS);
+  auto history_stats_reporter = std::make_unique<HistoryStatisticsReporter>(
+      history_service, profile->GetPrefs(), base::DefaultClock::GetInstance());
 
   return new ExploreSitesServiceImpl(std::move(explore_sites_store),
-                                     url_fetcher);
+                                     url_fetcher,
+                                     std::move(history_stats_reporter));
 }
-
 }  // namespace explore_sites
diff --git a/chrome/browser/android/explore_sites/explore_sites_service_impl.cc b/chrome/browser/android/explore_sites/explore_sites_service_impl.cc
index 8f89885b..a47e0b0 100644
--- a/chrome/browser/android/explore_sites/explore_sites_service_impl.cc
+++ b/chrome/browser/android/explore_sites/explore_sites_service_impl.cc
@@ -7,6 +7,7 @@
 #include "base/logging.h"
 #include "base/task/post_task.h"
 #include "chrome/browser/android/explore_sites/catalog.pb.h"
+#include "chrome/browser/android/explore_sites/explore_sites_bridge.h"
 #include "chrome/browser/android/explore_sites/explore_sites_feature.h"
 #include "chrome/browser/android/explore_sites/explore_sites_store.h"
 #include "chrome/browser/android/explore_sites/get_catalog_task.h"
@@ -31,14 +32,23 @@
 
 ExploreSitesServiceImpl::ExploreSitesServiceImpl(
     std::unique_ptr<ExploreSitesStore> store,
-    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+    std::unique_ptr<HistoryStatisticsReporter> history_statistics_reporter)
     : task_queue_(this),
       explore_sites_store_(std::move(store)),
       url_loader_factory_(url_loader_factory),
-      weak_ptr_factory_(this) {}
+      history_statistics_reporter_(std::move(history_statistics_reporter)),
+      weak_ptr_factory_(this) {
+  if (IsExploreSitesEnabled()) {
+    ExploreSitesBridge::ScheduleDailyTask();
+  }
+  // Collect history statistics unconditionally, to have baseline as well.
+  history_statistics_reporter_->ScheduleReportStatistics();
+}
 
 ExploreSitesServiceImpl::~ExploreSitesServiceImpl() {}
 
+// static
 bool ExploreSitesServiceImpl::IsExploreSitesEnabled() {
   return GetExploreSitesVariation() == ExploreSitesVariation::ENABLED;
 }
@@ -69,7 +79,8 @@
 }
 
 void ExploreSitesServiceImpl::UpdateCatalogFromNetwork(
-    std::string accept_languages,
+    bool is_immediate_fetch,
+    const std::string& accept_languages,
     BooleanCallback callback) {
   if (!IsExploreSitesEnabled())
     return;
@@ -82,9 +93,11 @@
 
   // Create a fetcher and start fetching the protobuf (async).
   explore_sites_fetcher_ = ExploreSitesFetcher::CreateForGetCatalog(
+      is_immediate_fetch, catalog_version, accept_languages,
+      url_loader_factory_,
       base::BindOnce(&ExploreSitesServiceImpl::OnCatalogFetched,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
-      catalog_version, accept_languages, url_loader_factory_);
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+  explore_sites_fetcher_->Start();
 }
 
 void ExploreSitesServiceImpl::OnCatalogFetched(
@@ -162,5 +175,4 @@
                             data_decoder::kDefaultMaxSizeInBytes, gfx::Size(),
                             base::BindOnce(&OnDecodeDone, std::move(callback)));
 }
-
 }  // namespace explore_sites
diff --git a/chrome/browser/android/explore_sites/explore_sites_service_impl.h b/chrome/browser/android/explore_sites/explore_sites_service_impl.h
index 5cab255..46eeaa4 100644
--- a/chrome/browser/android/explore_sites/explore_sites_service_impl.h
+++ b/chrome/browser/android/explore_sites/explore_sites_service_impl.h
@@ -12,6 +12,7 @@
 #include "chrome/browser/android/explore_sites/explore_sites_service.h"
 #include "chrome/browser/android/explore_sites/explore_sites_store.h"
 #include "chrome/browser/android/explore_sites/explore_sites_types.h"
+#include "chrome/browser/android/explore_sites/history_statistics_reporter.h"
 #include "components/offline_pages/task/task_queue.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
@@ -25,16 +26,18 @@
  public:
   ExploreSitesServiceImpl(
       std::unique_ptr<ExploreSitesStore> store,
-      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+      std::unique_ptr<HistoryStatisticsReporter> history_statistics_reporter);
   ~ExploreSitesServiceImpl() override;
 
-  bool IsExploreSitesEnabled();
+  static bool IsExploreSitesEnabled();
 
   // ExploreSitesService implementation.
   void GetCatalog(CatalogCallback callback) override;
   void GetCategoryImage(int category_id, BitmapCallback callback) override;
   void GetSiteImage(int site_id, BitmapCallback callback) override;
-  void UpdateCatalogFromNetwork(std::string accept_languages,
+  void UpdateCatalogFromNetwork(bool is_immediate_fetch,
+                                const std::string& accept_languages,
                                 BooleanCallback callback) override;
 
  private:
@@ -69,6 +72,7 @@
   std::unique_ptr<ExploreSitesStore> explore_sites_store_;
   scoped_refptr<network ::SharedURLLoaderFactory> url_loader_factory_;
   std::unique_ptr<ExploreSitesFetcher> explore_sites_fetcher_;
+  std::unique_ptr<HistoryStatisticsReporter> history_statistics_reporter_;
   base::WeakPtrFactory<ExploreSitesServiceImpl> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ExploreSitesServiceImpl);
diff --git a/chrome/browser/android/explore_sites/explore_sites_service_impl_unittest.cc b/chrome/browser/android/explore_sites/explore_sites_service_impl_unittest.cc
index cf2c24c8..aa0f171 100644
--- a/chrome/browser/android/explore_sites/explore_sites_service_impl_unittest.cc
+++ b/chrome/browser/android/explore_sites/explore_sites_service_impl_unittest.cc
@@ -35,8 +35,11 @@
   void SetUp() override {
     std::unique_ptr<ExploreSitesStore> store =
         std::make_unique<ExploreSitesStore>(task_runner_);
+    auto history_stats_reporter =
+        std::make_unique<HistoryStatisticsReporter>(nullptr, nullptr, nullptr);
     service_ = std::make_unique<ExploreSitesServiceImpl>(
-        std::move(store), test_shared_url_loader_factory_);
+        std::move(store), test_shared_url_loader_factory_,
+        std::move(history_stats_reporter));
     success_ = false;
     test_data_ = CreateTestDataProto();
   }
@@ -155,7 +158,7 @@
   scoped_feature_list.InitAndEnableFeature(chrome::android::kExploreSites);
 
   service()->UpdateCatalogFromNetwork(
-      kAcceptLanguages,
+      true /*is_immediate_fetch*/, kAcceptLanguages,
       base::BindOnce(&ExploreSitesServiceImplTest::UpdateCatalogDoneCallback,
                      base::Unretained(this)));
 
diff --git a/chrome/browser/android/explore_sites/explore_sites_types.h b/chrome/browser/android/explore_sites/explore_sites_types.h
index 1956db0..185906c 100644
--- a/chrome/browser/android/explore_sites/explore_sites_types.h
+++ b/chrome/browser/android/explore_sites/explore_sites_types.h
@@ -69,8 +69,8 @@
 enum class ExploreSitesRequestStatus {
   // Request completed successfully.
   kSuccess = 0,
-  // Request failed due to to local network problem, caller should retry.
-  kShouldRetry = 1,
+  // Request failed even after all the retries.
+  kFailure = 1,
   // Request failed with error indicating that the request can not be serviced
   // by the server.
   kShouldSuspendBadRequest = 2,
diff --git a/chrome/browser/android/explore_sites/history_statistics_reporter.cc b/chrome/browser/android/explore_sites/history_statistics_reporter.cc
new file mode 100644
index 0000000..8a44377f
--- /dev/null
+++ b/chrome/browser/android/explore_sites/history_statistics_reporter.cc
@@ -0,0 +1,99 @@
+// Copyright 2018 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 "chrome/browser/android/explore_sites/history_statistics_reporter.h"
+
+#include <memory>
+#include <utility>
+#include "base/metrics/histogram_macros.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "chrome/common/pref_names.h"
+#include "components/history/core/browser/history_service.h"
+#include "components/history/core/browser/history_types.h"
+
+namespace {
+// Delay between the scheduling and actual computing/reporting of stats.
+const int kComputeStatisticsDelaySeconds = 5;
+
+// Pref name for the persistent timestamp of the last stats reporting.
+const char kWeeklyStatsReportingTimestamp[] =
+    "explore_sites.weekly_stats_reporting_timestamp";
+}  // namespace
+
+namespace explore_sites {
+
+// static
+void HistoryStatisticsReporter::RegisterPrefs(PrefRegistrySimple* registry) {
+  registry->RegisterTimePref(kWeeklyStatsReportingTimestamp, base::Time());
+}
+
+// TODO(dimich): remove the need to have CancelableTaskTracker (by removing it
+// from HistoryService::CountUniqueHostsVisitedLastMonth)
+HistoryStatisticsReporter::HistoryStatisticsReporter(
+    history::HistoryService* history_service,
+    PrefService* prefs,
+    base::Clock* clock)
+    : history_service_(history_service),
+      prefs_(prefs),
+      clock_(clock),
+      cancelable_task_tracker_(new base::CancelableTaskTracker()),
+      history_service_observer_(this),
+      weak_ptr_factory_(this) {}
+
+HistoryStatisticsReporter::~HistoryStatisticsReporter() {}
+
+void HistoryStatisticsReporter::ScheduleReportStatistics() {
+  // Only try to report stats once per session.
+  if (attempted_to_report_once_ || !history_service_ || !prefs_)
+    return;
+  attempted_to_report_once_ = true;
+
+  // If we've already reported metrics during last week, bail out.
+  base::Time last_report_time = prefs_->GetTime(kWeeklyStatsReportingTimestamp);
+  if (last_report_time > clock_->Now() - base::TimeDelta::FromDays(7))
+    return;
+  prefs_->SetTime(kWeeklyStatsReportingTimestamp, clock_->Now());
+
+  base::TimeDelta computeStatisticsDelay =
+      base::TimeDelta::FromSeconds(kComputeStatisticsDelaySeconds);
+
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&HistoryStatisticsReporter::MaybeReportStatistics,
+                     weak_ptr_factory_.GetWeakPtr()),
+      computeStatisticsDelay);
+}
+
+void HistoryStatisticsReporter::OnHistoryServiceLoaded(
+    history::HistoryService* history_service) {
+  DCHECK(history_service == history_service_);
+  ComputeStatistics();
+}
+
+void HistoryStatisticsReporter::MaybeReportStatistics() {
+  if (history_service_->BackendLoaded()) {
+    // HistoryService is already loaded. Continue with Initialization.
+    ComputeStatistics();
+  } else {
+    // Register for HistoryServiceLoading in case HistoryService is not yet
+    // ready.
+    DCHECK(!history_service_observer_.IsObserving(history_service_));
+    history_service_observer_.Add(history_service_);
+  }
+}
+
+void HistoryStatisticsReporter::ComputeStatistics() {
+  history_service_->CountUniqueHostsVisitedLastMonth(
+      base::BindRepeating(&HistoryStatisticsReporter::ReportStatistics,
+                          weak_ptr_factory_.GetWeakPtr()),
+      cancelable_task_tracker_.get());
+}
+
+void HistoryStatisticsReporter::ReportStatistics(
+    history::HistoryCountResult result) {
+  if (!result.success)
+    return;
+  UMA_HISTOGRAM_COUNTS_1000("ExploreSites.MonthlyHostCount", result.count);
+}
+}  // namespace explore_sites
diff --git a/chrome/browser/android/explore_sites/history_statistics_reporter.h b/chrome/browser/android/explore_sites/history_statistics_reporter.h
new file mode 100644
index 0000000..d31c7c1d
--- /dev/null
+++ b/chrome/browser/android/explore_sites/history_statistics_reporter.h
@@ -0,0 +1,59 @@
+// Copyright 2018 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 CHROME_BROWSER_ANDROID_EXPLORE_SITES_HISTORY_STATISTICS_REPORTER_H_
+#define CHROME_BROWSER_ANDROID_EXPLORE_SITES_HISTORY_STATISTICS_REPORTER_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/scoped_observer.h"
+#include "base/time/clock.h"
+#include "components/history/core/browser/history_service.h"
+#include "components/history/core/browser/history_service_observer.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/pref_service.h"
+
+namespace explore_sites {
+class HistoryStatisticsReporter : public history::HistoryServiceObserver {
+ public:
+  static void RegisterPrefs(PrefRegistrySimple* registry);
+
+  HistoryStatisticsReporter(history::HistoryService* history_service,
+                            PrefService* prefs,
+                            base::Clock* clock);
+  ~HistoryStatisticsReporter() override;
+
+  // Schedules delayed task to compute/report history statistics.
+  void ScheduleReportStatistics();
+
+ private:
+  // history::HistoryServiceObserver:
+  void OnHistoryServiceLoaded(
+      history::HistoryService* history_service) override;
+
+  // If needed, computes/reports of history statistics. Uses Prefs to only
+  // run weekly (approximately).
+  void MaybeReportStatistics();
+
+  void ComputeStatistics();
+  void ReportStatistics(history::HistoryCountResult result);
+
+  history::HistoryService* const history_service_;
+  PrefService* prefs_;
+  base::Clock* clock_;
+
+  std::unique_ptr<base::CancelableTaskTracker> cancelable_task_tracker_;
+  ScopedObserver<history::HistoryService, history::HistoryServiceObserver>
+      history_service_observer_;
+  bool attempted_to_report_once_ = false;
+  base::WeakPtrFactory<HistoryStatisticsReporter> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(HistoryStatisticsReporter);
+};
+
+}  // namespace explore_sites
+
+#endif  // CHROME_BROWSER_ANDROID_EXPLORE_SITES_HISTORY_STATISTICS_REPORTER_H_
diff --git a/chrome/browser/android/explore_sites/history_statistics_reporter_unittest.cc b/chrome/browser/android/explore_sites/history_statistics_reporter_unittest.cc
new file mode 100644
index 0000000..84a7446
--- /dev/null
+++ b/chrome/browser/android/explore_sites/history_statistics_reporter_unittest.cc
@@ -0,0 +1,234 @@
+// Copyright 2018 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 "chrome/browser/android/explore_sites/history_statistics_reporter.h"
+
+#include "base/feature_list.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/test/bind_test_util.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/test_mock_time_task_runner.h"
+#include "components/history/core/browser/history_database_params.h"
+#include "components/history/core/browser/history_service.h"
+#include "components/history/core/test/history_service_test_util.h"
+#include "components/history/core/test/test_history_database.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/testing_pref_service.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+// Pref name for the persistent timestamp of the last stats reporting.
+// Should be in sync with similar name in the reporter's impl.
+const char kWeeklyStatsReportingTimestamp[] =
+    "explore_sites.weekly_stats_reporting_timestamp";
+}  // namespace
+
+namespace explore_sites {
+
+class HistoryStatisticsReporterTest : public testing::Test {
+ public:
+  HistoryStatisticsReporterTest()
+      : task_runner_(new base::TestMockTimeTaskRunner(
+            base::TestMockTimeTaskRunner::Type::kBoundToThread)) {}
+  ~HistoryStatisticsReporterTest() override{};
+
+  void SetUp() override {
+    HistoryStatisticsReporter::RegisterPrefs(pref_service_.registry());
+    ASSERT_TRUE(history_dir_.CreateUniqueTempDir());
+    // Creates HistoryService, but does not load it yet. Use LoadHistory() from
+    // tests to control loading of HistoryService.
+    history_service_ = std::make_unique<history::HistoryService>();
+    reporter_ = std::make_unique<HistoryStatisticsReporter>(
+        history_service(), &pref_service_, task_runner_->GetMockClock());
+  }
+
+  // Wait for separate background task runner in HistoryService to complete
+  // all tasks and then all the tasks on the current one to complete as well.
+  void RunUntilIdle() {
+    history::BlockUntilHistoryProcessesPendingRequests(history_service());
+    task_runner_->RunUntilIdle();
+  }
+
+  void ScheduleReportAndRunUntilIdle() {
+    reporter()->ScheduleReportStatistics();
+    task_runner()->FastForwardUntilNoTasksRemain();
+    RunUntilIdle();
+  }
+
+  bool LoadHistory() {
+    if (!history_service_->Init(
+            history::TestHistoryDatabaseParamsForPath(history_dir_.GetPath())))
+      return false;
+    history::BlockUntilHistoryProcessesPendingRequests(history_service());
+    return true;
+  }
+
+  HistoryStatisticsReporter* reporter() const { return reporter_.get(); }
+  const base::HistogramTester& histograms() const { return histogram_tester_; }
+  history::HistoryService* history_service() { return history_service_.get(); }
+  base::TestMockTimeTaskRunner* task_runner() { return task_runner_.get(); }
+  TestingPrefServiceSimple* prefs() { return &pref_service_; }
+
+ private:
+  scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
+  base::ScopedTempDir history_dir_;
+  TestingPrefServiceSimple pref_service_;
+  base::HistogramTester histogram_tester_;
+  std::unique_ptr<history::HistoryService> history_service_;
+  std::unique_ptr<HistoryStatisticsReporter> reporter_;
+
+  DISALLOW_COPY_AND_ASSIGN(HistoryStatisticsReporterTest);
+};
+
+TEST_F(HistoryStatisticsReporterTest, HistoryNotLoaded) {
+  EXPECT_FALSE(history_service()->backend_loaded());
+  reporter()->ScheduleReportStatistics();
+
+  // Move past initial delay of reporter.
+  task_runner()->FastForwardUntilNoTasksRemain();
+
+  // Since History is not yet loaded, there should be no histograms.
+  histograms().ExpectTotalCount("History.DatabaseMonthlyHostCountTime", 0);
+  histograms().ExpectTotalCount("ExploreSites.MonthlyHostCount", 0);
+
+  // Load history. This should trigger reporter, via HistoryService observer.
+  ASSERT_TRUE(LoadHistory());
+  RunUntilIdle();
+
+  histograms().ExpectTotalCount("History.DatabaseMonthlyHostCountTime", 1);
+  // No hosts were visited, but there should be a sample.
+  histograms().ExpectUniqueSample("ExploreSites.MonthlyHostCount", 0, 1);
+}
+
+TEST_F(HistoryStatisticsReporterTest, HistoryLoaded) {
+  EXPECT_FALSE(history_service()->backend_loaded());
+  ASSERT_TRUE(LoadHistory());
+
+  reporter()->ScheduleReportStatistics();
+  // Move past initial delay of reporter.
+  task_runner()->FastForwardUntilNoTasksRemain();
+
+  RunUntilIdle();
+  // Since History is already loaded, there should be a sample reported.
+  histograms().ExpectUniqueSample("ExploreSites.MonthlyHostCount", 0, 1);
+}
+
+TEST_F(HistoryStatisticsReporterTest, HistoryLoadedTimeDelay) {
+  ASSERT_TRUE(LoadHistory());
+
+  reporter()->ScheduleReportStatistics();
+  RunUntilIdle();
+
+  // No reporting yet because the initial delay of reporter prevents it
+  // from accessing HistoryService for a while.
+  histograms().ExpectTotalCount("History.DatabaseMonthlyHostCountTime", 0);
+
+  // Move past initial delay of reporter.
+  task_runner()->FastForwardUntilNoTasksRemain();
+
+  RunUntilIdle();
+  // Since History is already loaded, there should be a sample reported.
+  histograms().ExpectUniqueSample("ExploreSites.MonthlyHostCount", 0, 1);
+}
+
+TEST_F(HistoryStatisticsReporterTest, HostAddedSimple) {
+  ASSERT_TRUE(LoadHistory());
+
+  base::Time time_now = base::Time::Now();
+
+  history_service()->AddPage(GURL("http://www.google.com"), time_now,
+                             history::VisitSource::SOURCE_BROWSED);
+
+  ScheduleReportAndRunUntilIdle();
+
+  // One host.
+  histograms().ExpectUniqueSample("ExploreSites.MonthlyHostCount", 1, 1);
+}
+
+TEST_F(HistoryStatisticsReporterTest, HostAddedLongAgo) {
+  ASSERT_TRUE(LoadHistory());
+
+  base::Time time_now = base::Time::Now();
+  base::Time time_29_days_ago = time_now - base::TimeDelta::FromDays(29);
+  base::Time time_31_days_ago = time_now - base::TimeDelta::FromDays(31);
+
+  history_service()->AddPage(GURL("http://www.google.com"), time_now,
+                             history::VisitSource::SOURCE_BROWSED);
+  history_service()->AddPage(GURL("http://example.com"), time_29_days_ago,
+                             history::VisitSource::SOURCE_BROWSED);
+  history_service()->AddPage(GURL("http://example1.com"), time_31_days_ago,
+                             history::VisitSource::SOURCE_BROWSED);
+
+  ScheduleReportAndRunUntilIdle();
+
+  // Two hosts, since the 3rd one was outside of the past month.
+  histograms().ExpectUniqueSample("ExploreSites.MonthlyHostCount", 2, 1);
+}
+
+TEST_F(HistoryStatisticsReporterTest, OneRunPerSession) {
+  ASSERT_TRUE(LoadHistory());
+
+  base::Time time_now = base::Time::Now();
+
+  history_service()->AddPage(GURL("http://www.google.com"), time_now,
+                             history::VisitSource::SOURCE_BROWSED);
+
+  ScheduleReportAndRunUntilIdle();
+
+  // One query, one host.
+  histograms().ExpectTotalCount("History.DatabaseMonthlyHostCountTime", 1);
+  histograms().ExpectUniqueSample("ExploreSites.MonthlyHostCount", 1, 1);
+
+  history_service()->AddPage(GURL("http://example.com"), time_now,
+                             history::VisitSource::SOURCE_BROWSED);
+
+  ScheduleReportAndRunUntilIdle();
+
+  // Still one query, one host. Second query in the same session is ignored.
+  histograms().ExpectTotalCount("History.DatabaseMonthlyHostCountTime", 1);
+  histograms().ExpectUniqueSample("ExploreSites.MonthlyHostCount", 1, 1);
+}
+
+TEST_F(HistoryStatisticsReporterTest, OneRunPerWeekSaveTimestamp) {
+  base::Time time_now = task_runner()->GetMockClock()->Now();
+
+  ASSERT_TRUE(LoadHistory());
+
+  ScheduleReportAndRunUntilIdle();
+
+  // One query.
+  histograms().ExpectTotalCount("History.DatabaseMonthlyHostCountTime", 1);
+
+  // Reporter should have left the time of request in Prefs.
+  EXPECT_EQ(time_now, prefs()->GetTime(kWeeklyStatsReportingTimestamp));
+}
+
+TEST_F(HistoryStatisticsReporterTest, OneRunPerWeekReadTimestamp) {
+  ASSERT_TRUE(LoadHistory());
+
+  prefs()->SetTime(kWeeklyStatsReportingTimestamp,
+                   task_runner()->GetMockClock()->Now());
+  ScheduleReportAndRunUntilIdle();
+
+  // No queries, a week did not pass yet.
+  histograms().ExpectTotalCount("History.DatabaseMonthlyHostCountTime", 0);
+}
+
+TEST_F(HistoryStatisticsReporterTest, OneRunPerWeekReadTimestampAfterWeek) {
+  base::Time time_now = task_runner()->GetMockClock()->Now();
+
+  ASSERT_TRUE(LoadHistory());
+
+  prefs()->SetTime(
+      kWeeklyStatsReportingTimestamp,
+      task_runner()->GetMockClock()->Now() - base::TimeDelta::FromDays(8));
+  ScheduleReportAndRunUntilIdle();
+
+  // More than a week since last query, should have gone through.
+  histograms().ExpectTotalCount("History.DatabaseMonthlyHostCountTime", 1);
+  // Reporter should have left the time of request in Prefs.
+  EXPECT_EQ(time_now, prefs()->GetTime(kWeeklyStatsReportingTimestamp));
+}
+
+}  // namespace explore_sites
diff --git a/chrome/browser/android/feed/feed_logging_bridge.cc b/chrome/browser/android/feed/feed_logging_bridge.cc
index f9ffc9e1..637eb80 100644
--- a/chrome/browser/android/feed/feed_logging_bridge.cc
+++ b/chrome/browser/android/feed/feed_logging_bridge.cc
@@ -13,8 +13,10 @@
 using base::android::JavaRef;
 using base::android::JavaParamRef;
 
-static jlong JNI_FeedLoggingBridge_Init(JNIEnv* env,
-                                        const JavaParamRef<jobject>& j_this) {
+static jlong JNI_FeedLoggingBridge_Init(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& j_this,
+    const JavaParamRef<jobject>& j_profile) {
   FeedLoggingBridge* native_logging_bridge = new FeedLoggingBridge();
   return reinterpret_cast<intptr_t>(native_logging_bridge);
 }
@@ -27,8 +29,57 @@
   delete this;
 }
 
+void FeedLoggingBridge::OnContentViewed(
+    JNIEnv* j_env,
+    const base::android::JavaRef<jobject>& j_this,
+    const jint position,
+    const jlong publishedTimeSeconds,
+    const jlong timeContentBecameAvailable,
+    const jfloat score) {}
+
+void FeedLoggingBridge::OnContentDismissed(
+    JNIEnv* j_env,
+    const base::android::JavaRef<jobject>& j_this,
+    const base::android::JavaRef<jstring>& j_url) {}
+
+void FeedLoggingBridge::OnContentClicked(
+    JNIEnv* j_env,
+    const base::android::JavaRef<jobject>& j_this,
+    const jint position,
+    const jlong publishedTimeSeconds,
+    const jfloat score) {}
+
+void FeedLoggingBridge::OnClientAction(
+    JNIEnv* j_env,
+    const base::android::JavaRef<jobject>& j_this,
+    const jint j_action_type) {}
+
+void FeedLoggingBridge::OnContentContextMenuOpened(
+    JNIEnv* j_env,
+    const base::android::JavaRef<jobject>& j_this,
+    const jint position,
+    const jlong publishedTimeSeconds,
+    const jfloat score) {}
+
+void FeedLoggingBridge::OnMoreButtonViewed(JNIEnv* j_env,
+                                           const JavaRef<jobject>& j_this,
+                                           const jint j_position) {}
+
+void FeedLoggingBridge::OnMoreButtonClicked(JNIEnv* j_env,
+                                            const JavaRef<jobject>& j_this,
+                                            const jint j_position) {}
+
 void FeedLoggingBridge::OnOpenedWithContent(JNIEnv* j_env,
                                             const JavaRef<jobject>& j_this,
+                                            const jint j_time_to_Populate,
                                             const jint j_content_count) {}
 
+void FeedLoggingBridge::OnOpenedWithNoImmediateContent(
+    JNIEnv* j_env,
+    const base::android::JavaRef<jobject>& j_this) {}
+
+void FeedLoggingBridge::OnOpenedWithNoContent(
+    JNIEnv* j_env,
+    const base::android::JavaRef<jobject>& j_this) {}
+
 }  // namespace feed
diff --git a/chrome/browser/android/feed/feed_logging_bridge.h b/chrome/browser/android/feed/feed_logging_bridge.h
index d264367a..28571c9 100644
--- a/chrome/browser/android/feed/feed_logging_bridge.h
+++ b/chrome/browser/android/feed/feed_logging_bridge.h
@@ -19,10 +19,53 @@
 
   void Destroy(JNIEnv* j_env, const base::android::JavaRef<jobject>& j_this);
 
+  void OnContentViewed(JNIEnv* j_env,
+                       const base::android::JavaRef<jobject>& j_this,
+                       const jint position,
+                       const jlong publishedTimeSeconds,
+                       const jlong timeContentBecameAvailable,
+                       const jfloat score);
+
+  void OnContentDismissed(JNIEnv* j_env,
+                          const base::android::JavaRef<jobject>& j_this,
+                          const base::android::JavaRef<jstring>& j_url);
+
+  void OnContentClicked(JNIEnv* j_env,
+                        const base::android::JavaRef<jobject>& j_this,
+                        const jint position,
+                        const jlong publishedTimeSeconds,
+                        const jfloat score);
+
+  void OnClientAction(JNIEnv* j_env,
+                      const base::android::JavaRef<jobject>& j_this,
+                      const jint j_action_type);
+
+  void OnContentContextMenuOpened(JNIEnv* j_env,
+                                  const base::android::JavaRef<jobject>& j_this,
+                                  const jint position,
+                                  const jlong publishedTimeSeconds,
+                                  const jfloat score);
+
+  void OnMoreButtonViewed(JNIEnv* j_env,
+                          const base::android::JavaRef<jobject>& j_this,
+                          const jint j_position);
+
+  void OnMoreButtonClicked(JNIEnv* j_env,
+                           const base::android::JavaRef<jobject>& j_this,
+                           const jint j_position);
+
   void OnOpenedWithContent(JNIEnv* j_env,
                            const base::android::JavaRef<jobject>& j_this,
+                           const jint j_time_to_Populate,
                            const jint j_content_count);
 
+  void OnOpenedWithNoImmediateContent(
+      JNIEnv* j_env,
+      const base::android::JavaRef<jobject>& j_this);
+
+  void OnOpenedWithNoContent(JNIEnv* j_env,
+                             const base::android::JavaRef<jobject>& j_this);
+
  private:
   DISALLOW_COPY_AND_ASSIGN(FeedLoggingBridge);
 };
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc
index f4c77be..75ebba37 100644
--- a/chrome/browser/autocomplete/search_provider_unittest.cc
+++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -3615,37 +3615,47 @@
   EXPECT_TRUE(provider_->matches().empty());
 }
 
-#if defined(THREAD_SANITIZER)
-// SearchProviderTest.SendsWarmUpRequestOnFocus is flaky on Linux TSan Tests
-// crbug.com/891959.
-#define MAYBE_SendsWarmUpRequestOnFocus DISABLED_SendsWarmUpRequestOnFocus
-#else
-#define MAYBE_SendsWarmUpRequestOnFocus SendsWarmUpRequestOnFocus
-#endif  // defined(THREAD_SANITIZER)
-TEST_F(SearchProviderTest, MAYBE_SendsWarmUpRequestOnFocus) {
+// SearchProviderWarmUpTest --------------------------------------------------
+//
+// Like SearchProviderTest.  The only addition is that it's a
+// TestWithParam<bool>, where the boolean parameter represents whether the
+// omnibox::kSearchProviderWarmUpOnFocus feature flag should be enabled.
+class SearchProviderWarmUpTest : public SearchProviderTest,
+                                 public testing::WithParamInterface<bool> {
+ public:
+  SearchProviderWarmUpTest() {}
+  void SetUp() override;
+
+ protected:
+  base::test::ScopedFeatureList feature_list_;
+
+  DISALLOW_COPY_AND_ASSIGN(SearchProviderWarmUpTest);
+};
+
+void SearchProviderWarmUpTest::SetUp() {
+  if (GetParam())
+    feature_list_.InitAndEnableFeature(omnibox::kSearchProviderWarmUpOnFocus);
+  else
+    feature_list_.InitAndDisableFeature(omnibox::kSearchProviderWarmUpOnFocus);
+  SearchProviderTest::SetUp();
+}
+
+TEST_P(SearchProviderWarmUpTest, SendsWarmUpRequestOnFocus) {
   AutocompleteInput input(base::ASCIIToUTF16("f"),
                           metrics::OmniboxEventProto::OTHER,
                           ChromeAutocompleteSchemeClassifier(&profile_));
   input.set_prefer_keyword(true);
   input.set_from_omnibox_focus(true);
 
-  {
-    // First, verify that without the warm-up feature enabled, the provider
-    // immediately terminates with no matches.
-    base::test::ScopedFeatureList feature_list;
-    feature_list.InitAndDisableFeature(omnibox::kSearchProviderWarmUpOnFocus);
+  if (!GetParam()) {  // The warm-up feature ought to be disabled.
+    // The provider immediately terminates with no matches.
     provider_->Start(input, false);
     // RunUntilIdle so that SearchProvider has a chance to create the
     // URLFetchers (if it wants to, which it shouldn't in this case).
     base::RunLoop().RunUntilIdle();
     EXPECT_TRUE(provider_->done());
     EXPECT_TRUE(provider_->matches().empty());
-  }
-
-  {
-    // Then, check the behavior with the warm-up feature enabled.
-    base::test::ScopedFeatureList feature_list;
-    feature_list.InitAndEnableFeature(omnibox::kSearchProviderWarmUpOnFocus);
+  } else {  // The warm-up feature ought to be enabled.
     provider_->Start(input, false);
     // RunUntilIdle so that SearchProvider create the URLFetcher.
     base::RunLoop().RunUntilIdle();
@@ -3663,3 +3673,7 @@
     EXPECT_TRUE(provider_->matches().empty());
   }
 }
+
+INSTANTIATE_TEST_CASE_P(SearchProviderTest,
+                        SearchProviderWarmUpTest,
+                        testing::Values(false, true));
diff --git a/chrome/browser/autocomplete/shortcuts_provider_extension_unittest.cc b/chrome/browser/autocomplete/shortcuts_provider_extension_unittest.cc
index 2594236..4cb7b1b 100644
--- a/chrome/browser/autocomplete/shortcuts_provider_extension_unittest.cc
+++ b/chrome/browser/autocomplete/shortcuts_provider_extension_unittest.cc
@@ -41,7 +41,7 @@
     {"BD85DBA2-8C29-49F9-84AE-48E1E90880F1", "echo echo", "echo echo",
      "chrome-extension://cedabbhfglmiikkmdgcpjdkocfcmbkee/?q=echo",
      "Run Echo command: echo", "0,0", "Echo", "0,4", ui::PAGE_TRANSITION_TYPED,
-     AutocompleteMatchType::EXTENSION_APP_DEPRECATED, "echo", 1, 1},
+     AutocompleteMatchType::EXTENSION_APP_DEPRECATED, "", 1, 1},
 };
 
 }  // namespace
diff --git a/chrome/browser/autofill/strike_database_factory.cc b/chrome/browser/autofill/strike_database_factory.cc
new file mode 100644
index 0000000..c21d418
--- /dev/null
+++ b/chrome/browser/autofill/strike_database_factory.cc
@@ -0,0 +1,48 @@
+// Copyright 2018 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 "chrome/browser/autofill/strike_database_factory.h"
+
+#include "base/memory/singleton.h"
+#include "chrome/browser/profiles/incognito_helpers.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/autofill/core/browser/strike_database.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+
+namespace autofill {
+
+// static
+StrikeDatabase* StrikeDatabaseFactory::GetForProfile(Profile* profile) {
+  return static_cast<StrikeDatabase*>(
+      GetInstance()->GetServiceForBrowserContext(profile, true));
+}
+
+// static
+StrikeDatabaseFactory* StrikeDatabaseFactory::GetInstance() {
+  return base::Singleton<StrikeDatabaseFactory>::get();
+}
+
+StrikeDatabaseFactory::StrikeDatabaseFactory()
+    : BrowserContextKeyedServiceFactory(
+          "AutofillStrikeDatabase",
+          BrowserContextDependencyManager::GetInstance()) {}
+
+StrikeDatabaseFactory::~StrikeDatabaseFactory() {}
+
+KeyedService* StrikeDatabaseFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  Profile* profile = Profile::FromBrowserContext(context);
+  // Note: This instance becomes owned by an object that never gets destroyed,
+  // effectively leaking it until browser close. Only one is created per
+  // profile, and closing-then-opening a profile returns the same instance.
+  return new StrikeDatabase(
+      profile->GetPath().Append(FILE_PATH_LITERAL("AutofillStrikeDatabase")));
+}
+
+content::BrowserContext* StrikeDatabaseFactory::GetBrowserContextToUse(
+    content::BrowserContext* context) const {
+  return chrome::GetBrowserContextRedirectedInIncognito(context);
+}
+
+}  // namespace autofill
diff --git a/chrome/browser/autofill/strike_database_factory.h b/chrome/browser/autofill/strike_database_factory.h
new file mode 100644
index 0000000..5e93e11
--- /dev/null
+++ b/chrome/browser/autofill/strike_database_factory.h
@@ -0,0 +1,49 @@
+// Copyright 2018 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 CHROME_BROWSER_AUTOFILL_STRIKE_DATABASE_FACTORY_H_
+#define CHROME_BROWSER_AUTOFILL_STRIKE_DATABASE_FACTORY_H_
+
+#include "base/compiler_specific.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+namespace base {
+template <typename T>
+struct DefaultSingletonTraits;
+}
+
+class Profile;
+
+namespace autofill {
+
+class StrikeDatabase;
+
+// Singleton that owns all StrikeDatabases and associates them with Profiles.
+class StrikeDatabaseFactory : public BrowserContextKeyedServiceFactory {
+ public:
+  // Returns the StrikeDatabase for |profile|, creating it if it is not yet
+  // created.
+  static StrikeDatabase* GetForProfile(Profile* profile);
+
+  static StrikeDatabaseFactory* GetInstance();
+
+ private:
+  friend struct base::DefaultSingletonTraits<StrikeDatabaseFactory>;
+
+  StrikeDatabaseFactory();
+  ~StrikeDatabaseFactory() override;
+
+  // BrowserContextKeyedServiceFactory:
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* profile) const override;
+  content::BrowserContext* GetBrowserContextToUse(
+      content::BrowserContext* context) const override;
+
+  DISALLOW_COPY_AND_ASSIGN(StrikeDatabaseFactory);
+};
+
+}  // namespace autofill
+
+#endif  // CHROME_BROWSER_AUTOFILL_STRIKE_DATABASE_FACTORY_H_
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_factory.cc b/chrome/browser/background_fetch/background_fetch_delegate_factory.cc
index 6c05e1e7..202497f6 100644
--- a/chrome/browser/background_fetch/background_fetch_delegate_factory.cc
+++ b/chrome/browser/background_fetch/background_fetch_delegate_factory.cc
@@ -8,6 +8,7 @@
 #include "chrome/browser/background_fetch/background_fetch_delegate_impl.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/download/download_service_factory.h"
+#include "chrome/browser/offline_items_collection/offline_content_aggregator_factory.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
@@ -35,6 +36,7 @@
           BrowserContextDependencyManager::GetInstance()) {
   DependsOn(DownloadServiceFactory::GetInstance());
   DependsOn(HostContentSettingsMapFactory::GetInstance());
+  DependsOn(OfflineContentAggregatorFactory::GetInstance());
 }
 
 BackgroundFetchDelegateFactory::~BackgroundFetchDelegateFactory() {}
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
index a01c87c..07119a8 100644
--- a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
+++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
@@ -628,6 +628,22 @@
          outstanding_guids.end();
 }
 
+void BackgroundFetchDelegateImpl::RestartPausedDownload(
+    const std::string& download_guid) {
+  auto job_it = download_job_unique_id_map_.find(download_guid);
+
+  if (job_it == download_job_unique_id_map_.end())
+    return;
+
+  const std::string& unique_id = job_it->second;
+
+  DCHECK(job_details_map_.find(unique_id) != job_details_map_.end());
+  JobDetails& job_details = job_details_map_.find(unique_id)->second;
+  job_details.paused = true;
+
+  UpdateOfflineItemAndUpdateObservers(&job_details);
+}
+
 std::set<std::string> BackgroundFetchDelegateImpl::TakeOutstandingGuids() {
   std::set<std::string> outstanding_guids;
   for (auto& job_id_details : job_details_map_) {
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.h b/chrome/browser/background_fetch/background_fetch_delegate_impl.h
index 54325043..15aed432 100644
--- a/chrome/browser/background_fetch/background_fetch_delegate_impl.h
+++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.h
@@ -108,6 +108,10 @@
   // Fetch.
   bool IsGuidOutstanding(const std::string& guid) const;
 
+  // Notifies the OfflineContentAggregator of an interrupted download that is
+  // in a paused state.
+  void RestartPausedDownload(const std::string& download_guid);
+
   // Returns the set of download GUIDs that have started but did not finish
   // according to Background Fetch. Clears out all references to outstanding
   // GUIDs.
diff --git a/chrome/browser/background_fetch/background_fetch_download_client.cc b/chrome/browser/background_fetch/background_fetch_download_client.cc
index 40f1d9c..27cbf6d1 100644
--- a/chrome/browser/background_fetch/background_fetch_download_client.cc
+++ b/chrome/browser/background_fetch/background_fetch_download_client.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/threading/sequenced_task_runner_handle.h"
+#include "chrome/browser/after_startup_task_utils.h"
 #include "chrome/browser/background_fetch/background_fetch_delegate_impl.h"
 #include "chrome/browser/download/download_service_factory.h"
 #include "components/download/public/background_service/download_metadata.h"
@@ -61,9 +62,18 @@
     if (download.completion_info) {
       // The download finished but was not persisted.
       OnDownloadSucceeded(download.guid, *download.completion_info);
+      return;
     }
 
-    // The download is resuming, and will call the appropriate functions.
+    // The download is active, and will call the appropriate functions.
+
+    if (download.paused) {
+      // We need to resurface the notification in a paused state.
+      AfterStartupTaskUtils::PostTask(
+          FROM_HERE, base::SequencedTaskRunnerHandle::Get(),
+          base::BindOnce(&BackgroundFetchDelegateImpl::RestartPausedDownload,
+                         GetDelegate()->GetWeakPtr(), download.guid));
+    }
   }
 
   // There is also the case that the Download Service is not aware of the GUID.
diff --git a/chrome/browser/background_fetch/background_fetch_permission_context.cc b/chrome/browser/background_fetch/background_fetch_permission_context.cc
new file mode 100644
index 0000000..686a060
--- /dev/null
+++ b/chrome/browser/background_fetch/background_fetch_permission_context.cc
@@ -0,0 +1,90 @@
+// Copyright 2018 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 "chrome/browser/background_fetch/background_fetch_permission_context.h"
+
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/download/download_request_limiter.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/web_contents.h"
+
+BackgroundFetchPermissionContext::BackgroundFetchPermissionContext(
+    Profile* profile)
+    : PermissionContextBase(profile,
+                            CONTENT_SETTINGS_TYPE_BACKGROUND_FETCH,
+                            blink::mojom::FeaturePolicyFeature::kNotFound) {}
+
+bool BackgroundFetchPermissionContext::IsRestrictedToSecureOrigins() const {
+  return true;
+}
+
+ContentSetting BackgroundFetchPermissionContext::GetPermissionStatusInternal(
+    content::RenderFrameHost* render_frame_host,
+    const GURL& requesting_origin,
+    const GURL& embedding_origin) const {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  if (render_frame_host && !render_frame_host->GetParent()) {
+    DownloadRequestLimiter* limiter =
+        g_browser_process->download_request_limiter();
+    DCHECK(limiter);
+    auto status = limiter->GetDownloadStatus(
+        content::WebContents::FromRenderFrameHost(render_frame_host));
+
+    switch (status) {
+      case DownloadRequestLimiter::DownloadStatus::ALLOW_ONE_DOWNLOAD:
+      case DownloadRequestLimiter::DownloadStatus::ALLOW_ALL_DOWNLOADS:
+        return CONTENT_SETTING_ALLOW;
+      case DownloadRequestLimiter::DownloadStatus::PROMPT_BEFORE_DOWNLOAD:
+        return CONTENT_SETTING_ASK;
+      case DownloadRequestLimiter::DownloadStatus::DOWNLOADS_NOT_ALLOWED:
+        return CONTENT_SETTING_BLOCK;
+    }
+
+    NOTREACHED();
+  }
+
+  // |render_frame_host| is either a nullptr, which means we're being called
+  // from a worker context, or it's not a top level frame. In either case, use
+  // content settings.
+  auto* host_content_settings_map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  DCHECK(host_content_settings_map);
+
+  // The set of valid settings for automatic downloads is defined as
+  // {CONTENT_SETTING_ALLOW, CONTENT_SETTING_ASK, CONTENT_SETTING_BLOCK}.
+  return host_content_settings_map->GetContentSetting(
+      requesting_origin, requesting_origin,
+      CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
+      std::string() /* resource_identifier */);
+}
+
+void BackgroundFetchPermissionContext::DecidePermission(
+    content::WebContents* web_contents,
+    const PermissionRequestID& id,
+    const GURL& requesting_origin,
+    const GURL& embedding_origin,
+    bool user_gesture,
+    const BrowserPermissionCallback& callback) {
+  // The user should never be prompted to authorize Background Fetch
+  // from BackgroundFetchPermissionContext.
+  // BackgroundFetchDelegateImpl invokes CanDownload() on DownloadRequestLimiter
+  // to prompt the user.
+  NOTREACHED();
+}
+
+void BackgroundFetchPermissionContext::NotifyPermissionSet(
+    const PermissionRequestID& id,
+    const GURL& requesting_origin,
+    const GURL& embedding_origin,
+    const BrowserPermissionCallback& callback,
+    bool persist,
+    ContentSetting content_setting) {
+  DCHECK(!persist);
+  PermissionContextBase::NotifyPermissionSet(
+      id, requesting_origin, embedding_origin, std::move(callback), persist,
+      content_setting);
+}
diff --git a/chrome/browser/background_fetch/background_fetch_permission_context.h b/chrome/browser/background_fetch/background_fetch_permission_context.h
new file mode 100644
index 0000000..3e484fe
--- /dev/null
+++ b/chrome/browser/background_fetch/background_fetch_permission_context.h
@@ -0,0 +1,47 @@
+// Copyright 2018 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 CHROME_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_PERMISSION_CONTEXT_H_
+#define CHROME_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_PERMISSION_CONTEXT_H_
+
+#include "base/macros.h"
+#include "chrome/browser/permissions/permission_context_base.h"
+#include "components/content_settings/core/common/content_settings.h"
+
+class GURL;
+class Profile;
+
+// Manages user permissions for Background Fetch. Background Fetch permission
+// is currently dynamic and relies on either the download status from
+// DownloadRequestLimiter, or the Automatic Downloads content setting
+// This is why it isn't persisted.
+class BackgroundFetchPermissionContext : public PermissionContextBase {
+ public:
+  explicit BackgroundFetchPermissionContext(Profile* profile);
+  ~BackgroundFetchPermissionContext() override = default;
+
+ private:
+  // PermissionContextBase implementation.
+  bool IsRestrictedToSecureOrigins() const override;
+  ContentSetting GetPermissionStatusInternal(
+      content::RenderFrameHost* render_frame_host,
+      const GURL& requesting_origin,
+      const GURL& embedding_origin) const override;
+  void DecidePermission(content::WebContents* web_contents,
+                        const PermissionRequestID& id,
+                        const GURL& requesting_origin,
+                        const GURL& embedding_origin,
+                        bool user_gesture,
+                        const BrowserPermissionCallback& callback) override;
+  void NotifyPermissionSet(const PermissionRequestID& id,
+                           const GURL& requesting_origin,
+                           const GURL& embedding_origin,
+                           const BrowserPermissionCallback& callback,
+                           bool persist,
+                           ContentSetting content_setting) override;
+
+  DISALLOW_COPY_AND_ASSIGN(BackgroundFetchPermissionContext);
+};
+
+#endif  // CHROME_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_PERMISSION_CONTEXT_H_
diff --git a/chrome/browser/background_fetch/background_fetch_permission_context_unittest.cc b/chrome/browser/background_fetch/background_fetch_permission_context_unittest.cc
new file mode 100644
index 0000000..841d2f5
--- /dev/null
+++ b/chrome/browser/background_fetch/background_fetch_permission_context_unittest.cc
@@ -0,0 +1,116 @@
+// Copyright 2018 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 "chrome/browser/background_fetch/background_fetch_permission_context.h"
+
+#include <string>
+
+#include "base/macros.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/content_settings/core/common/content_settings.h"
+#include "components/content_settings/core/common/content_settings_types.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/web_contents_tester.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+class BackgroundFetchPermissionContextTest
+    : public ChromeRenderViewHostTestHarness {
+ protected:
+  BackgroundFetchPermissionContextTest() = default;
+
+  ~BackgroundFetchPermissionContextTest() override = default;
+
+  ContentSetting GetPermissonStatus(
+      const GURL& url,
+      BackgroundFetchPermissionContext* permission_context,
+      bool with_frame) {
+    content::RenderFrameHost* render_frame_host = nullptr;
+
+    if (with_frame) {
+      content::WebContentsTester::For(web_contents())->NavigateAndCommit(url);
+      render_frame_host = web_contents()->GetMainFrame();
+    }
+
+    auto permission_result = permission_context->GetPermissionStatus(
+        render_frame_host, url /* requesting_origin */,
+        url /* embedding_origin */);
+    return permission_result.content_setting;
+  }
+
+  void SetContentSetting(const GURL& url,
+                         ContentSettingsType content_type,
+                         ContentSetting setting) {
+    auto* host_content_settings_map =
+        HostContentSettingsMapFactory::GetForProfile(profile());
+    ASSERT_TRUE(host_content_settings_map);
+    host_content_settings_map->SetContentSettingDefaultScope(
+        url /* primary_url*/, url /* secondary_url*/, content_type,
+        std::string() /* resource_identifier */, setting);
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BackgroundFetchPermissionContextTest);
+};
+
+// Test that Background Fetch permission is "allow" by default, when queried
+// from a top level frame.
+TEST_F(BackgroundFetchPermissionContextTest, TestOutcomeAllowWithFrame) {
+  GURL url("https://example.com");
+
+  BackgroundFetchPermissionContext permission_context(profile());
+  EXPECT_EQ(GetPermissonStatus(url, &permission_context, /*with_frame =*/true),
+            CONTENT_SETTING_ALLOW);
+}
+
+// Test that Background Fetch permission is "allow" when queried from a worker
+// context, if the Automatic Downloads content setting is set to
+// CONTENT_SETTING_ALLOW.
+TEST_F(BackgroundFetchPermissionContextTest, TestOutcomeAllowWithoutFrame) {
+  GURL url("https://example.com");
+  SetContentSetting(url, CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
+                    CONTENT_SETTING_ALLOW);
+
+  BackgroundFetchPermissionContext permission_context(profile());
+
+  EXPECT_EQ(GetPermissonStatus(url, &permission_context, /*with_frame =*/false),
+            CONTENT_SETTING_ALLOW);
+}
+
+// Test that Background Fetch permission is "deny" when queried from a worker
+// context, if the Automatic Downloads content settings is set to
+// CONTENT_SETTING_BLOCK.
+TEST_F(BackgroundFetchPermissionContextTest, TestOutcomeDenyWithoutFrame) {
+  GURL url("https://example.com");
+  SetContentSetting(url, CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
+                    CONTENT_SETTING_BLOCK);
+
+  BackgroundFetchPermissionContext permission_context(profile());
+  EXPECT_EQ(GetPermissonStatus(url, &permission_context, /*with_frame =*/false),
+            CONTENT_SETTING_BLOCK);
+}
+
+// Test that Background Fetch permission is "prompt" when queried from a worker
+// context, if the Automatic Downloads content setting is CONTENT_SETTING_ASK.
+TEST_F(BackgroundFetchPermissionContextTest, TestOutcomePromptWithoutFrame) {
+  auto* host_content_settings_map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  ASSERT_TRUE(host_content_settings_map);
+
+  GURL url("https://example.com");
+  SetContentSetting(url, CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
+                    CONTENT_SETTING_ASK);
+
+  BackgroundFetchPermissionContext permission_context(profile());
+
+  EXPECT_EQ(GetPermissonStatus(url, &permission_context, /*with_frame =*/false),
+            CONTENT_SETTING_ASK);
+}
+
+}  // namespace
diff --git a/chrome/browser/chrome_navigation_browsertest.cc b/chrome/browser/chrome_navigation_browsertest.cc
index 55f66f1..eed18d9 100644
--- a/chrome/browser/chrome_navigation_browsertest.cc
+++ b/chrome/browser/chrome_navigation_browsertest.cc
@@ -449,6 +449,32 @@
   EXPECT_EQ(GURL(), new_web_contents->GetLastCommittedURL());
 }
 
+// Ensure that a failed navigation in a new tab will not leave an invalid
+// visible URL, which may be formatted in an unsafe way in the omnibox.
+// See https://crbug.com/850824.
+IN_PROC_BROWSER_TEST_F(ChromeNavigationBrowserTest,
+                       ClearInvalidPendingURLOnFail) {
+  GURL initial_url = embedded_test_server()->GetURL(
+      "/frame_tree/invalid_link_to_new_window.html");
+
+  // Navigate to a page with a link that opens an invalid URL in a new window.
+  ui_test_utils::NavigateToURL(browser(), initial_url);
+  content::WebContents* main_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  // Simulate a click on the link and wait for the new window.
+  content::WebContentsAddedObserver new_tab_observer;
+  EXPECT_TRUE(ExecuteScript(main_contents, "simulateClick()"));
+  content::WebContents* new_contents = new_tab_observer.GetWebContents();
+
+  // The load in the new window should fail.
+  EXPECT_FALSE(WaitForLoadStop(new_contents));
+
+  // Ensure that there is no pending entry or visible URL.
+  EXPECT_EQ(nullptr, new_contents->GetController().GetPendingEntry());
+  EXPECT_EQ(GURL(), new_contents->GetVisibleURL());
+}
+
 // A test performing two simultaneous navigations, to ensure code in chrome/,
 // such as tab helpers, can handle those cases.
 // This test starts a browser-initiated cross-process navigation, which is
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 3fac27e..b160893c 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -103,6 +103,7 @@
     "//chromeos/services/secure_channel/public/cpp/client",
     "//components/arc",
     "//components/arc/common:struct_traits",
+    "//components/arc/media_session",
     "//components/browser_sync",
     "//components/captive_portal",
     "//components/component_updater:crl_set_remover",
diff --git a/chrome/browser/chromeos/accessibility/event_handler_common.cc b/chrome/browser/chromeos/accessibility/event_handler_common.cc
index efadb10b..8d343cf 100644
--- a/chrome/browser/chromeos/accessibility/event_handler_common.cc
+++ b/chrome/browser/chromeos/accessibility/event_handler_common.cc
@@ -11,6 +11,8 @@
 #include "extensions/browser/extension_host.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/process_manager.h"
+#include "third_party/blink/public/platform/web_mouse_event.h"
+#include "ui/events/blink/web_input_event.h"
 
 namespace chromeos {
 
@@ -52,4 +54,33 @@
   // Don't forward latency info, as these are getting forwarded to an extension.
   rvh->GetWidget()->ForwardKeyboardEvent(web_event);
 }
+
+void ForwardMouseToExtension(const ui::MouseEvent& mouse_event,
+                             extensions::ExtensionHost* host) {
+  if (!host) {
+    VLOG(2) << "Unable to forward mouse to extension";
+    return;
+  }
+
+  content::RenderViewHost* rvh = host->render_view_host();
+  if (!rvh) {
+    VLOG(3) << "Unable to forward mouse to extension";
+    return;
+  }
+
+  if (mouse_event.type() == ui::ET_MOUSE_EXITED) {
+    VLOG(3) << "Couldn't forward unsupported mouse event to extension";
+    return;
+  }
+
+  const blink::WebMouseEvent& web_event = ui::MakeWebMouseEvent(mouse_event);
+
+  if (web_event.GetType() == blink::WebInputEvent::kUndefined) {
+    VLOG(3) << "Couldn't forward unsupported mouse event to extension";
+    return;
+  }
+
+  // Don't forward latency info, as these are getting forwarded to an extension.
+  rvh->GetWidget()->ForwardMouseEvent(web_event);
+}
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/accessibility/event_handler_common.h b/chrome/browser/chromeos/accessibility/event_handler_common.h
index d65bfa3b..184c243 100644
--- a/chrome/browser/chromeos/accessibility/event_handler_common.h
+++ b/chrome/browser/chromeos/accessibility/event_handler_common.h
@@ -19,6 +19,11 @@
 void ForwardKeyToExtension(const ui::KeyEvent& key_event,
                            extensions::ExtensionHost* host);
 
+// Forwards the mouse event to the extension background page for the
+// corresponding host.
+void ForwardMouseToExtension(const ui::MouseEvent& mouse_event,
+                             extensions::ExtensionHost* host);
+
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_EVENT_HANDLER_COMMON_H_
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.cc b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.cc
index fedcbb6..7e45325 100644
--- a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.cc
+++ b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.cc
@@ -43,6 +43,14 @@
   chromeos::ForwardKeyToExtension(*(event->AsKeyEvent()), host);
 }
 
+void SpokenFeedbackEventRewriterDelegate::DispatchMouseEventToChromeVox(
+    std::unique_ptr<ui::Event> event) {
+  extensions::ExtensionHost* host = chromeos::GetAccessibilityExtensionHost(
+      extension_misc::kChromeVoxExtensionId);
+  // Forward the event to ChromeVox's background page.
+  chromeos::ForwardMouseToExtension(*(event->AsMouseEvent()), host);
+}
+
 bool SpokenFeedbackEventRewriterDelegate::ShouldDispatchKeyEventToChromeVox(
     const ui::Event* event) const {
   chromeos::AccessibilityManager* accessibility_manager =
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.h b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.h
index c4ce971..c05d51f12 100644
--- a/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.h
+++ b/chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter_delegate.h
@@ -25,6 +25,7 @@
   // ui::mojom::SpokenFeedbackEventRewriterDelegate:
   void DispatchKeyEventToChromeVox(std::unique_ptr<ui::Event> event,
                                    bool capture) override;
+  void DispatchMouseEventToChromeVox(std::unique_ptr<ui::Event> event) override;
 
  private:
   // Returns whether the event should be dispatched to the ChromeVox extension.
diff --git a/chrome/browser/chromeos/arc/arc_service_launcher.cc b/chrome/browser/chromeos/arc/arc_service_launcher.cc
index ca97df60..9ff2b351 100644
--- a/chrome/browser/chromeos/arc/arc_service_launcher.cc
+++ b/chrome/browser/chromeos/arc/arc_service_launcher.cc
@@ -56,6 +56,7 @@
 #include "components/arc/ime/arc_ime_service.h"
 #include "components/arc/intent_helper/arc_intent_helper_bridge.h"
 #include "components/arc/lock_screen/arc_lock_screen_bridge.h"
+#include "components/arc/media_session/arc_media_session_bridge.h"
 #include "components/arc/metrics/arc_metrics_service.h"
 #include "components/arc/midis/arc_midis_bridge.h"
 #include "components/arc/net/arc_net_host_impl.h"
@@ -171,6 +172,7 @@
   ArcIntentHelperBridge::GetForBrowserContext(profile);
   ArcKioskBridge::GetForBrowserContext(profile);
   ArcLockScreenBridge::GetForBrowserContext(profile);
+  ArcMediaSessionBridge::GetForBrowserContext(profile);
   ArcMetricsService::GetForBrowserContext(profile);
   ArcMidisBridge::GetForBrowserContext(profile);
   ArcNetHostImpl::GetForBrowserContext(profile)->SetPrefService(
diff --git a/chrome/browser/chromeos/extensions/input_method_event_router.cc b/chrome/browser/chromeos/extensions/input_method_event_router.cc
index b82ce7b..e7446f68 100644
--- a/chrome/browser/chromeos/extensions/input_method_event_router.cc
+++ b/chrome/browser/chromeos/extensions/input_method_event_router.cc
@@ -35,11 +35,12 @@
     input_method::InputMethodManager* manager,
     Profile* profile,
     bool show_message) {
-  // This should probably be CHECK, as delivering event to a wrong
-  // profile means delivering it to a wrong extension instance.
-  DCHECK(profile->IsSameProfile(Profile::FromBrowserContext(context_)));
-  extensions::EventRouter* router = extensions::EventRouter::Get(context_);
+  // If an event is recieved from a different profile, e.g. while switching
+  // between multiple profiles, ignore it.
+  if (!profile->IsSameProfile(Profile::FromBrowserContext(context_)))
+    return;
 
+  extensions::EventRouter* router = extensions::EventRouter::Get(context_);
   if (!router->HasEventListener(OnChanged::kEventName))
     return;
 
diff --git a/chrome/browser/chromeos/login/app_launch_controller.cc b/chrome/browser/chromeos/login/app_launch_controller.cc
index c7756fa..70ff76d 100644
--- a/chrome/browser/chromeos/login/app_launch_controller.cc
+++ b/chrome/browser/chromeos/login/app_launch_controller.cc
@@ -60,7 +60,7 @@
 };
 
 // Application install splash screen minimum show time in milliseconds.
-constexpr int kAppInstallSplashScreenMinTimeMS = 3000;
+constexpr int kAppInstallSplashScreenMinTimeMS = 10000;
 
 // Parameters for test:
 bool skip_splash_wait = false;
diff --git a/chrome/browser/chromeos/login/arc_kiosk_controller.cc b/chrome/browser/chromeos/login/arc_kiosk_controller.cc
index 8f43d335..89046b1 100644
--- a/chrome/browser/chromeos/login/arc_kiosk_controller.cc
+++ b/chrome/browser/chromeos/login/arc_kiosk_controller.cc
@@ -26,7 +26,7 @@
 
 // ARC Kiosk splash screen minimum show time.
 constexpr base::TimeDelta kArcKioskSplashScreenMinTime =
-    base::TimeDelta::FromSeconds(3);
+    base::TimeDelta::FromSeconds(10);
 
 ArcKioskController::ArcKioskController(LoginDisplayHost* host, OobeUI* oobe_ui)
     : host_(host),
diff --git a/chrome/browser/chromeos/login/auth/auth_prewarmer.cc b/chrome/browser/chromeos/login/auth/auth_prewarmer.cc
index dd4b7298..567f8167 100644
--- a/chrome/browser/chromeos/login/auth/auth_prewarmer.cc
+++ b/chrome/browser/chromeos/login/auth/auth_prewarmer.cc
@@ -7,7 +7,6 @@
 #include <stddef.h>
 
 #include "base/task/post_task.h"
-#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/login/helper.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
@@ -16,9 +15,9 @@
 #include "chromeos/network/network_state_handler.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_source.h"
-#include "content/public/browser/resource_hints.h"
 #include "google_apis/gaia/gaia_urls.h"
+#include "net/base/load_flags.h"
+#include "services/network/public/mojom/network_context.mojom.h"
 #include "url/gurl.h"
 
 namespace chromeos {
@@ -26,15 +25,6 @@
 AuthPrewarmer::AuthPrewarmer() : doing_prewarm_(false) {}
 
 AuthPrewarmer::~AuthPrewarmer() {
-  if (registrar_.IsRegistered(
-          this,
-          chrome::NOTIFICATION_PROFILE_URL_REQUEST_CONTEXT_GETTER_INITIALIZED,
-          content::Source<Profile>(ProfileHelper::GetSigninProfile()))) {
-    registrar_.Remove(
-        this,
-        chrome::NOTIFICATION_PROFILE_URL_REQUEST_CONTEXT_GETTER_INITIALIZED,
-        content::Source<Profile>(ProfileHelper::GetSigninProfile()));
-  }
   NetworkHandler::Get()->network_state_handler()->RemoveObserver(this,
                                                                  FROM_HERE);
 }
@@ -47,21 +37,14 @@
   }
   doing_prewarm_ = true;
   completion_callback_ = std::move(completion_callback);
-  if (GetRequestContext() && IsNetworkConnected()) {
+
+  if (IsNetworkConnected()) {
     DoPrewarm();
-    return;
-  }
-  if (!IsNetworkConnected()) {
+  } else {
     // DefaultNetworkChanged will get called when a network becomes connected.
     NetworkHandler::Get()->network_state_handler()->AddObserver(this,
                                                                 FROM_HERE);
   }
-  if (!GetRequestContext()) {
-    registrar_.Add(
-        this,
-        chrome::NOTIFICATION_PROFILE_URL_REQUEST_CONTEXT_GETTER_INITIALIZED,
-        content::Source<Profile>(ProfileHelper::GetSigninProfile()));
-  }
 }
 
 void AuthPrewarmer::DefaultNetworkChanged(const NetworkState* network) {
@@ -70,30 +53,21 @@
 
   NetworkHandler::Get()->network_state_handler()->RemoveObserver(this,
                                                                  FROM_HERE);
-  if (GetRequestContext())
-    DoPrewarm();
-}
-
-void AuthPrewarmer::Observe(int type,
-                            const content::NotificationSource& source,
-                            const content::NotificationDetails& details) {
-  DCHECK_EQ(chrome::NOTIFICATION_PROFILE_URL_REQUEST_CONTEXT_GETTER_INITIALIZED,
-            type);
-  registrar_.Remove(
-      this, chrome::NOTIFICATION_PROFILE_URL_REQUEST_CONTEXT_GETTER_INITIALIZED,
-      content::Source<Profile>(ProfileHelper::GetSigninProfile()));
-  if (IsNetworkConnected())
-    DoPrewarm();
+  DoPrewarm();
 }
 
 void AuthPrewarmer::DoPrewarm() {
   const int kConnectionsNeeded = 1;
+  const int kLoadFlags = net::LOAD_NORMAL;
+  const bool kShouldUsePrivacyMode = false;
   const GURL& url = GaiaUrls::GetInstance()->service_login_url();
-  base::PostTaskWithTraits(
-      FROM_HERE, {content::BrowserThread::IO},
-      base::BindOnce(&content::PreconnectUrl,
-                     base::RetainedRef(GetRequestContext()), url, url,
-                     kConnectionsNeeded, true));
+  network::mojom::NetworkContext* network_context =
+      login::GetSigninNetworkContext();
+  if (network_context) {
+    // Do nothing if NetworkContext isn't available.
+    network_context->PreconnectSockets(kConnectionsNeeded, url, kLoadFlags,
+                                       kShouldUsePrivacyMode);
+  }
   if (!completion_callback_.is_null()) {
     base::PostTaskWithTraits(FROM_HERE, {content::BrowserThread::UI},
                              std::move(completion_callback_));
@@ -105,8 +79,4 @@
   return (nsh->ConnectedNetworkByType(NetworkTypePattern::Default()) != NULL);
 }
 
-net::URLRequestContextGetter* AuthPrewarmer::GetRequestContext() const {
-  return login::GetSigninContext();
-}
-
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/auth/auth_prewarmer.h b/chrome/browser/chromeos/login/auth/auth_prewarmer.h
index 79adaa2b..208cd0d 100644
--- a/chrome/browser/chromeos/login/auth/auth_prewarmer.h
+++ b/chrome/browser/chromeos/login/auth/auth_prewarmer.h
@@ -8,20 +8,13 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "chromeos/network/network_state_handler_observer.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
-
-namespace net {
-class URLRequestContextGetter;
-}  // namespace net
 
 namespace chromeos {
 
 class NetworkState;
 
 // Class for prewarming authentication network connection.
-class AuthPrewarmer : public NetworkStateHandlerObserver,
-                      public content::NotificationObserver {
+class AuthPrewarmer : public NetworkStateHandlerObserver {
  public:
   AuthPrewarmer();
   ~AuthPrewarmer() override;
@@ -32,16 +25,9 @@
   // chromeos::NetworkStateHandlerObserver overrides.
   void DefaultNetworkChanged(const NetworkState* network) override;
 
-  // content::NotificationObserver overrides.
-  void Observe(int type,
-               const content::NotificationSource& source,
-               const content::NotificationDetails& details) override;
-
   bool IsNetworkConnected() const;
-  net::URLRequestContextGetter* GetRequestContext() const;
   void DoPrewarm();
 
-  content::NotificationRegistrar registrar_;
   base::OnceClosure completion_callback_;
   bool doing_prewarm_;
 
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc
index 11cb787..49f8d07 100644
--- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc
@@ -33,6 +33,7 @@
 #include "chrome/browser/gcm/gcm_profile_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h"
 #include "chrome/common/apps/platform_apps/api/easy_unlock_private.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/extensions/extension_constants.h"
@@ -706,6 +707,18 @@
   LoadRemoteDevices();
 }
 
+void EasyUnlockServiceRegular::ShowChromebookAddedNotification() {
+  DCHECK(base::FeatureList::IsEnabled(chromeos::features::kMultiDeviceApi) &&
+         base::FeatureList::IsEnabled(
+             chromeos::features::kEnableUnifiedMultiDeviceSetup));
+
+  // The user may have decided to disable Smart Lock or the whole multidevice
+  // suite immediately after completing setup, so ensure that Smart Lock is
+  // enabled.
+  if (feature_state_ == multidevice_setup::mojom::FeatureState::kEnabledByUser)
+    notification_controller_->ShowChromebookAddedNotification();
+}
+
 void EasyUnlockServiceRegular::ShowNotificationIfNewDevicePresent(
     const std::set<std::string>& public_keys_before_sync,
     const std::set<std::string>& public_keys_after_sync) {
@@ -724,6 +737,21 @@
 
   if (!public_keys_after_sync.empty() && !is_setup_fresh) {
     if (public_keys_before_sync.empty()) {
+      if (base::FeatureList::IsEnabled(chromeos::features::kMultiDeviceApi) &&
+          base::FeatureList::IsEnabled(
+              chromeos::features::kEnableUnifiedMultiDeviceSetup)) {
+        multidevice_setup::MultiDeviceSetupDialog* multidevice_setup_dialog =
+            multidevice_setup::MultiDeviceSetupDialog::Get();
+        if (multidevice_setup_dialog) {
+          // Delay showing the "Chromebook added" notification until the
+          // MultiDeviceSetupDialog is closed.
+          multidevice_setup_dialog->AddOnCloseCallback(base::BindOnce(
+              &EasyUnlockServiceRegular::ShowChromebookAddedNotification,
+              weak_ptr_factory_.GetWeakPtr()));
+          return;
+        }
+      }
+
       notification_controller_->ShowChromebookAddedNotification();
     } else {
       shown_pairing_changed_notification_ = true;
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.h b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.h
index 3307276..311dd2e28 100644
--- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.h
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.h
@@ -129,6 +129,8 @@
       const multidevice_setup::MultiDeviceSetupClient::FeatureStatesMap&
           feature_states_map) override;
 
+  void ShowChromebookAddedNotification();
+
   void ShowNotificationIfNewDevicePresent(
       const std::set<std::string>& public_keys_before_sync,
       const std::set<std::string>& public_keys_after_sync);
diff --git a/chrome/browser/chromeos/login/helper.cc b/chrome/browser/chromeos/login/helper.cc
index 4e7cf4a6..5ad0614c 100644
--- a/chrome/browser/chromeos/login/helper.cc
+++ b/chrome/browser/chromeos/login/helper.cc
@@ -34,6 +34,7 @@
 #include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/mojom/network_context.mojom.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/display/display.h"
@@ -183,18 +184,13 @@
   return signin_partition_manager->GetCurrentStoragePartition();
 }
 
-net::URLRequestContextGetter* GetSigninContext() {
+network::mojom::NetworkContext* GetSigninNetworkContext() {
   content::StoragePartition* signin_partition = GetSigninPartition();
 
-  // Special case for unit tests. There's no LoginDisplayHost thus no
-  // webview instance. See http://crbug.com/477402
-  if (!signin_partition && !LoginDisplayHost::default_host())
-    return ProfileHelper::GetSigninProfile()->GetRequestContext();
-
   if (!signin_partition)
     return nullptr;
 
-  return signin_partition->GetURLRequestContext();
+  return signin_partition->GetNetworkContext();
 }
 
 scoped_refptr<network::SharedURLLoaderFactory> GetSigninURLLoaderFactory() {
diff --git a/chrome/browser/chromeos/login/helper.h b/chrome/browser/chromeos/login/helper.h
index da77d51..43e7a11 100644
--- a/chrome/browser/chromeos/login/helper.h
+++ b/chrome/browser/chromeos/login/helper.h
@@ -29,11 +29,10 @@
 class StoragePartition;
 }
 
-namespace net {
-class URLRequestContextGetter;
-}
-
 namespace network {
+namespace mojom {
+class NetworkContext;
+}
 class SharedURLLoaderFactory;
 }
 
@@ -109,10 +108,10 @@
 // webui is torn down.
 content::StoragePartition* GetSigninPartition();
 
-// Returns the request context that contains sign-in cookies. For old iframe
-// based flow, the context of the sign-in profile is returned. For webview based
-// flow, the context of the sign-in webview storage partition is returned.
-net::URLRequestContextGetter* GetSigninContext();
+// Returns the network context for the sign-in webview. Note the function
+// returns nullptr if the sign-in partition is not available yet, or if sign-in
+// webui is torn down.
+network::mojom::NetworkContext* GetSigninNetworkContext();
 
 // Returns the URLLoaderFactory that contains sign-in cookies. For old iframe
 // based flow, the URLLoaderFactory of the sign-in profile is returned. For
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_common.h b/chrome/browser/chromeos/login/ui/login_display_host_common.h
index 55ee60f..05ad25e 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_common.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host_common.h
@@ -11,6 +11,7 @@
 
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
 
 class AccountId;
 class ScopedKeepAlive;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
index 7ce3c67..a8dbbbc5 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -295,16 +295,16 @@
 void DisableKeyboardOverscroll() {
   auto* client = ChromeKeyboardControllerClient::Get();
   keyboard::mojom::KeyboardConfig config = client->GetKeyboardConfig();
-  config.overscroll_override =
-      keyboard::mojom::KeyboardOverscrollOverride::kDisabled;
+  config.overscroll_behavior =
+      keyboard::mojom::KeyboardOverscrollBehavior::kDisabled;
   client->SetKeyboardConfig(config);
 }
 
-void ResetKeyboardOverscrollOverride() {
+void ResetKeyboardOverscrollBehavior() {
   auto* client = ChromeKeyboardControllerClient::Get();
   keyboard::mojom::KeyboardConfig config = client->GetKeyboardConfig();
-  config.overscroll_override =
-      keyboard::mojom::KeyboardOverscrollOverride::kNone;
+  config.overscroll_behavior =
+      keyboard::mojom::KeyboardOverscrollBehavior::kDefault;
   client->SetKeyboardConfig(config);
 }
 
@@ -468,7 +468,7 @@
   if (window_manager)
     window_manager->RemoveObserver(this);
 
-  ResetKeyboardOverscrollOverride();
+  ResetKeyboardOverscrollBehavior();
 
   views::FocusManager::set_arrow_key_traversal_enabled(false);
   ResetLoginWindowAndView();
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index a83f91f..76e6c34 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -75,6 +75,7 @@
 #include "chrome/browser/chromeos/login/session/user_session_manager.h"
 #include "chrome/browser/chromeos/login/startup_utils.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
+#include "chrome/browser/chromeos/multidevice_setup/multidevice_setup_client_factory.h"
 #include "chrome/browser/chromeos/net/delay_network_call.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
@@ -106,6 +107,7 @@
 #include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
 #include "chromeos/network/portal_detector/network_portal_detector.h"
+#include "chromeos/services/multidevice_setup/public/cpp/multidevice_setup_client.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "chromeos/settings/cros_settings_provider.h"
 #include "chromeos/settings/timezone_settings.h"
@@ -847,17 +849,31 @@
 }
 
 void WizardController::ShowMultiDeviceSetupScreen() {
-  if (base::FeatureList::IsEnabled(chromeos::features::kMultiDeviceApi) &&
-      base::FeatureList::IsEnabled(
-          chromeos::features::kEnableUnifiedMultiDeviceSetup)) {
-    // TODO(khorimoto): Use MultiDeviceSetupClient to determine if any potential
-    // phone(s) on the same GAIA account can be used for multi-device features.
-    // Only show the setup screen if it is possible to use these features.
-    UpdateStatusAreaVisibilityForScreen(OobeScreen::SCREEN_MULTIDEVICE_SETUP);
-    SetCurrentScreen(GetScreen(OobeScreen::SCREEN_MULTIDEVICE_SETUP));
-  } else {
+  // If multi-device flags are disabled, skip the associated setup flow.
+  if (!base::FeatureList::IsEnabled(features::kMultiDeviceApi) ||
+      !base::FeatureList::IsEnabled(features::kEnableUnifiedMultiDeviceSetup)) {
     OnMultiDeviceSetupFinished();
+    return;
   }
+
+  multidevice_setup::MultiDeviceSetupClient* client =
+      multidevice_setup::MultiDeviceSetupClientFactory::GetForProfile(
+          ProfileManager::GetActiveUserProfile());
+  DCHECK(client);
+
+  // If there is no eligible multi-device host phone or if there is a phone and
+  // it has already been set, skip the setup flow.
+  if (client->GetHostStatus().first !=
+      multidevice_setup::mojom::HostStatus::kEligibleHostExistsButNoHostSet) {
+    VLOG(1) << "Skipping MultiDevice setup screen; host status: "
+            << client->GetHostStatus().first;
+    OnMultiDeviceSetupFinished();
+    return;
+  }
+
+  VLOG(1) << "Showing MultiDevice setup screen.";
+  UpdateStatusAreaVisibilityForScreen(OobeScreen::SCREEN_MULTIDEVICE_SETUP);
+  SetCurrentScreen(GetScreen(OobeScreen::SCREEN_MULTIDEVICE_SETUP));
 }
 
 void WizardController::ShowDiscoverScreen() {
diff --git a/chrome/browser/chromeos/settings/OWNERS b/chrome/browser/chromeos/settings/OWNERS
index 487dbb6..68741cc 100644
--- a/chrome/browser/chromeos/settings/OWNERS
+++ b/chrome/browser/chromeos/settings/OWNERS
@@ -1,6 +1,3 @@
-mnissler@chromium.org
-bartfab@chromium.org
-pastarmovj@chromium.org
-stevenjb@chromium.org
+file://chromeos/settings/OWNERS
 
 # COMPONENT: Enterprise
diff --git a/chrome/browser/chromeos/settings/session_manager_operation.cc b/chrome/browser/chromeos/settings/session_manager_operation.cc
index 5532af2..da2ca784 100644
--- a/chrome/browser/chromeos/settings/session_manager_operation.cc
+++ b/chrome/browser/chromeos/settings/session_manager_operation.cc
@@ -13,7 +13,7 @@
 #include "base/stl_util.h"
 #include "base/task/post_task.h"
 #include "base/task/task_traits.h"
-#include "base/task_runner_util.h"
+#include "chrome/browser/net/nss_context.h"
 #include "components/ownership/owner_key_util.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "components/policy/proto/chrome_device_policy.pb.h"
@@ -89,16 +89,14 @@
 
 void SessionManagerOperation::EnsurePublicKey(const base::Closure& callback) {
   if (force_key_load_ || !public_key_ || !public_key_->is_loaded()) {
-    scoped_refptr<base::TaskRunner> task_runner =
-        base::CreateTaskRunnerWithTraits(
-            {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
-             base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
-    base::PostTaskAndReplyWithResult(
-        task_runner.get(), FROM_HERE,
-        base::Bind(&SessionManagerOperation::LoadPublicKey, owner_key_util_,
-                   force_key_load_ ? nullptr : public_key_),
-        base::Bind(&SessionManagerOperation::StorePublicKey,
-                   weak_factory_.GetWeakPtr(), callback));
+    base::PostTaskWithTraitsAndReplyWithResult(
+        FROM_HERE,
+        {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
+         base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
+        base::BindOnce(&SessionManagerOperation::LoadPublicKey, owner_key_util_,
+                       force_key_load_ ? nullptr : public_key_),
+        base::BindOnce(&SessionManagerOperation::StorePublicKey,
+                       weak_factory_.GetWeakPtr(), callback));
   } else {
     callback.Run();
   }
diff --git a/chrome/browser/conflicts/module_info_util_win.cc b/chrome/browser/conflicts/module_info_util_win.cc
index 4b029cf4..9da05a0 100644
--- a/chrome/browser/conflicts/module_info_util_win.cc
+++ b/chrome/browser/conflicts/module_info_util_win.cc
@@ -20,8 +20,8 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/scoped_handle.h"
+#include "base/win/wincrypt_shim.h"
 #include "chrome/common/safe_browsing/pe_image_reader_win.h"
-#include "crypto/wincrypt_shim.h"
 
 // This must be after wincrypt and wintrust.
 #include <mscat.h>
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 07f2ecf..f48f6a3 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1233,6 +1233,10 @@
     "Show Material Design icons on the New Tab Page, instead of Most Visited "
     "tiles. Implicitly enables 'ntp-ui-md'.";
 
+const char kNtpUIMdName[] = "New Tab Page Material Design UI";
+const char kNtpUIMdDescription[] =
+    "Updates the New Tab Page with Material Design elements.";
+
 const char kNumRasterThreadsName[] = "Number of raster threads";
 const char kNumRasterThreadsDescription[] =
     "Specify the number of raster threads.";
@@ -3157,6 +3161,12 @@
     "Enables gaps at the end of each page and enables dragging an item to an "
     "empty page in launcher.";
 
+extern const char kEnableArcUnifiedAudioFocusName[] =
+    "Enable unified audio focus on ARC";
+extern const char kEnableArcUnifiedAudioFocusDescription[] =
+    "If audio focus is enabled in Chrome then this will delegate audio focus "
+    "control in Android apps to Chrome.";
+
 const char kEnableBackgroundBlurName[] = "Enable background blur.";
 const char kEnableBackgroundBlurDescription[] =
     "Enables background blur for the Peeking Launcher and Tab Switcher.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index cb840554..3e4beda 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -770,6 +770,9 @@
 extern const char kNtpIconsName[];
 extern const char kNtpIconsDescription[];
 
+extern const char kNtpUIMdName[];
+extern const char kNtpUIMdDescription[];
+
 extern const char kNumRasterThreadsName[];
 extern const char kNumRasterThreadsDescription[];
 extern const char kNumRasterThreadsOne[];
@@ -1928,6 +1931,9 @@
 extern const char kEnableAppsGridGapFeatureName[];
 extern const char kEnableAppsGridGapFeatureDescription[];
 
+extern const char kEnableArcUnifiedAudioFocusName[];
+extern const char kEnableArcUnifiedAudioFocusDescription[];
+
 extern const char kEnableBackgroundBlurName[];
 extern const char kEnableBackgroundBlurDescription[];
 
diff --git a/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc b/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc
index 8cc10b9f..3a9d39b 100644
--- a/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc
+++ b/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc
@@ -698,26 +698,31 @@
   previews::PreviewsDeciderImpl* previews_decider_impl =
       io_data->previews_decider_impl();
   if (data_reduction_proxy_io_data && previews_decider_impl) {
-    previews::PreviewsUserData::Create(url_request,
-                                       previews_decider_impl->GeneratePageId());
+    bool is_reload = (url_request->load_flags() &
+                      (net::LOAD_VALIDATE_CACHE | net::LOAD_BYPASS_CACHE));
+
+    previews::PreviewsUserData* previews_data =
+        previews::PreviewsUserData::Create(
+            url_request, previews_decider_impl->GeneratePageId());
+
     if (url_request->url().SchemeIsHTTPOrHTTPS() &&
         previews_decider_impl->ShouldAllowPreviewAtECT(
-            *url_request, previews::PreviewsType::LITE_PAGE,
+            previews_data, url_request->url(), is_reload,
+            previews::PreviewsType::LITE_PAGE,
             net::EFFECTIVE_CONNECTION_TYPE_4G, std::vector<std::string>(),
             true) &&
         previews_decider_impl->ShouldAllowPreviewAtECT(
-            *url_request, previews::PreviewsType::LOFI,
-            net::EFFECTIVE_CONNECTION_TYPE_4G, std::vector<std::string>(),
-            true)) {
+            previews_data, url_request->url(), is_reload,
+            previews::PreviewsType::LOFI, net::EFFECTIVE_CONNECTION_TYPE_4G,
+            std::vector<std::string>(), true)) {
       previews_state |= content::SERVER_LOFI_ON;
       previews_state |= content::SERVER_LITE_PAGE_ON;
     }
 
     // Check for enabled client-side previews if data saver is enabled.
-    if (data_reduction_proxy_io_data->IsEnabled()) {
-      previews_state |= previews::DetermineEnabledClientPreviewsState(
-          *url_request, previews_decider_impl);
-    }
+    previews_state |= previews::DetermineEnabledClientPreviewsState(
+        previews_data, url_request->url(), is_reload,
+        data_reduction_proxy_io_data->IsEnabled(), previews_decider_impl);
   }
 
   if (previews_state == content::PREVIEWS_UNSPECIFIED)
@@ -770,9 +775,16 @@
   if (!previews::HasEnabledPreviews(initial_state))
     return content::PREVIEWS_OFF;
 
+  DCHECK_EQ(
+      content::RESOURCE_TYPE_MAIN_FRAME,
+      content::ResourceRequestInfo::ForRequest(request)->GetResourceType());
+
+  data_reduction_proxy::DataReductionProxyData* drp_data =
+      data_reduction_proxy::DataReductionProxyData::GetData(*request);
+
   content::PreviewsState previews_state =
       data_reduction_proxy::ContentLoFiDecider::
-          DetermineCommittedServerPreviewsState(*request, initial_state);
+          DetermineCommittedServerPreviewsState(drp_data, initial_state);
 
   // TODO(crbug.com/842233): This should be removed in the previews s13n work.
   if (PreviewsLitePageNavigationThrottle::GetOriginalURL(
@@ -780,6 +792,9 @@
     previews_state = previews_state & content::LITE_PAGE_REDIRECT_ON;
   }
 
+  previews::PreviewsUserData* previews_user_data =
+      previews::PreviewsUserData::GetData(*request);
+
   return previews::DetermineCommittedClientPreviewsState(
-      *request, previews_state, previews_decider);
+      previews_user_data, request->url(), previews_state, previews_decider);
 }
diff --git a/chrome/browser/metrics/ukm_browsertest.cc b/chrome/browser/metrics/ukm_browsertest.cc
index 1f0ca2a..2bc9e70 100644
--- a/chrome/browser/metrics/ukm_browsertest.cc
+++ b/chrome/browser/metrics/ukm_browsertest.cc
@@ -992,7 +992,10 @@
 }
 
 // Run UKM browser test suite with Unified Consent enabled and disabled.
-INSTANTIATE_TEST_CASE_P(, UkmBrowserTest, testing::Bool());
+//
+// Tests with Unified Consent enabled were temporarely disabled.
+// (see http://crbug.com/891777).
+INSTANTIATE_TEST_CASE_P(, UkmBrowserTest, ::testing::Values(false));
 
 IN_PROC_BROWSER_TEST_P(UkmConsentParamBrowserTest, GroupPolicyConsentCheck) {
   // Note we are not using the synthetic MetricsConsentOverride since we are
@@ -1017,8 +1020,11 @@
 }
 
 // Verify UKM is enabled/disabled for both potential settings of group policy.
+//
+// Tests with Unified Consent enabled were temporarely disabled.
+// (see http://crbug.com/891777).
 INSTANTIATE_TEST_CASE_P(UkmConsentParamBrowserTests,
                         UkmConsentParamBrowserTest,
-                        testing::Bool());
+                        ::testing::Values(false));
 
 }  // namespace metrics
diff --git a/chrome/browser/net/spdyproxy/data_reduction_proxy_browsertest.cc b/chrome/browser/net/spdyproxy/data_reduction_proxy_browsertest.cc
new file mode 100644
index 0000000..10cef1e
--- /dev/null
+++ b/chrome/browser/net/spdyproxy/data_reduction_proxy_browsertest.cc
@@ -0,0 +1,161 @@
+// Copyright 2018 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 "base/strings/strcat.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_config_service_client_test_utils.h"
+#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
+#include "components/data_reduction_proxy/proto/client_config.pb.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_test_utils.h"
+#include "net/dns/mock_host_resolver.h"
+#include "net/test/embedded_test_server/default_handlers.h"
+#include "net/test/embedded_test_server/http_request.h"
+#include "net/test/embedded_test_server/http_response.h"
+#include "services/network/public/cpp/network_switches.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace data_reduction_proxy {
+namespace {
+
+using testing::HasSubstr;
+using testing::Not;
+
+constexpr char kSessionKey[] = "TheSessionKeyYay!";
+constexpr char kMockHost[] = "mock.host";
+constexpr char kDummyBody[] = "dummy";
+
+std::unique_ptr<net::test_server::HttpResponse> EchoDummy(
+    const net::test_server::HttpRequest& request) {
+  auto response = std::make_unique<net::test_server::BasicHttpResponse>();
+  response->set_content(kDummyBody);
+  response->set_content_type("text/plain");
+  return response;
+}
+
+}  // namespace
+
+class DataReductionProxyBrowsertest : public InProcessBrowserTest {
+ public:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    net::HostPortPair host_port_pair = embedded_test_server()->host_port_pair();
+    std::string config = EncodeConfig(CreateConfig(
+        kSessionKey, 1000, 0, ProxyServer_ProxyScheme_HTTP,
+        host_port_pair.host(), host_port_pair.port(), ProxyServer::CORE,
+        ProxyServer_ProxyScheme_HTTP, "fallback.net", 80,
+        ProxyServer::UNSPECIFIED_TYPE, 0.5f, false));
+    command_line->AppendSwitchASCII(
+        switches::kDataReductionProxyServerClientConfig, config);
+    command_line->AppendSwitch(
+        switches::kDisableDataReductionProxyWarmupURLFetch);
+    command_line->AppendSwitchASCII(
+        network::switches::kForceEffectiveConnectionType, "4G");
+  }
+
+  void SetUp() override {
+    ASSERT_TRUE(embedded_test_server()->Start());
+    InProcessBrowserTest::SetUp();
+  }
+
+  void SetUpOnMainThread() override {
+    host_resolver()->AddRule(kMockHost, "127.0.0.1");
+    EnableDataSaver(true);
+  }
+
+ protected:
+  void EnableDataSaver(bool enabled) {
+    PrefService* prefs = browser()->profile()->GetPrefs();
+    prefs->SetBoolean(::prefs::kDataSaverEnabled, enabled);
+    base::RunLoop().RunUntilIdle();
+  }
+
+  std::string GetBody() {
+    std::string body;
+    EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+        browser()->tab_strip_model()->GetActiveWebContents(),
+        "window.domAutomationController.send(document.body.textContent);",
+        &body));
+    return body;
+  }
+
+  GURL GetURLWithMockHost(const net::EmbeddedTestServer& server,
+                          const std::string& relative_url) {
+    GURL server_base_url = server.base_url();
+    GURL base_url =
+        GURL(base::StrCat({server_base_url.scheme(), "://", kMockHost, ":",
+                           server_base_url.port()}));
+    EXPECT_TRUE(base_url.is_valid()) << base_url.possibly_invalid_spec();
+    return base_url.Resolve(relative_url);
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(DataReductionProxyBrowsertest, ChromeProxyHeaderSet) {
+  // Proxy will be used, so it shouldn't matter if the host cannot be resolved.
+  ui_test_utils::NavigateToURL(
+      browser(), GURL("http://does.not.resolve/echoheader?Chrome-Proxy"));
+
+  std::string body = GetBody();
+  EXPECT_THAT(body, HasSubstr(kSessionKey));
+  EXPECT_THAT(body, HasSubstr("pid="));
+}
+
+IN_PROC_BROWSER_TEST_F(DataReductionProxyBrowsertest,
+                       ChromeProxyHeaderSetForSubresource) {
+  net::EmbeddedTestServer test_server;
+  test_server.RegisterRequestHandler(base::BindRepeating(&EchoDummy));
+  ASSERT_TRUE(test_server.Start());
+
+  ui_test_utils::NavigateToURL(browser(),
+                               GetURLWithMockHost(test_server, "/echo"));
+
+  std::string script = R"((url => {
+    var xhr = new XMLHttpRequest();
+    xhr.open('GET', url, true);
+    xhr.onload = () => domAutomationController.send(xhr.responseText);
+    xhr.send();
+  }))";
+  std::string result;
+  ASSERT_TRUE(ExecuteScriptAndExtractString(
+      browser()->tab_strip_model()->GetActiveWebContents(),
+      script + "('" +
+          GetURLWithMockHost(test_server, "/echoheader?Chrome-Proxy").spec() +
+          "')",
+      &result));
+
+  EXPECT_THAT(result, HasSubstr(kSessionKey));
+  EXPECT_THAT(result, Not(HasSubstr("pid=")));
+}
+
+IN_PROC_BROWSER_TEST_F(DataReductionProxyBrowsertest, ChromeProxyEctHeaderSet) {
+  // Proxy will be used, so it shouldn't matter if the host cannot be resolved.
+  ui_test_utils::NavigateToURL(
+      browser(), GURL("http://does.not.resolve/echoheader?Chrome-Proxy-Ect"));
+
+  EXPECT_EQ(GetBody(), "4G");
+}
+
+IN_PROC_BROWSER_TEST_F(DataReductionProxyBrowsertest,
+                       ProxyNotUsedWhenDisabled) {
+  net::EmbeddedTestServer test_server;
+  test_server.RegisterRequestHandler(base::BindRepeating(&EchoDummy));
+  ASSERT_TRUE(test_server.Start());
+
+  ui_test_utils::NavigateToURL(
+      browser(), GetURLWithMockHost(test_server, "/echoheader?Chrome-Proxy"));
+  EXPECT_THAT(GetBody(), testing::HasSubstr(kSessionKey));
+
+  EnableDataSaver(false);
+
+  // |test_server| only has the EchoDummy handler, so should return the dummy
+  // response no matter what the URL if it is not being proxied.
+  ui_test_utils::NavigateToURL(
+      browser(), GetURLWithMockHost(test_server, "/echoheader?Chrome-Proxy"));
+  EXPECT_EQ(GetBody(), kDummyBody);
+}
+
+}  // namespace data_reduction_proxy
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
index 0369ffc..8a4ef8f 100644
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -30,6 +30,7 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "components/certificate_transparency/ct_known_logs.h"
+#include "components/net_log/net_export_file_writer.h"
 #include "components/network_session_configurator/common/network_features.h"
 #include "components/os_crypt/os_crypt.h"
 #include "components/policy/core/common/policy_namespace.h"
@@ -641,6 +642,14 @@
   return network_context_params;
 }
 
+net_log::NetExportFileWriter*
+SystemNetworkContextManager::GetNetExportFileWriter() {
+  if (!net_export_file_writer_) {
+    net_export_file_writer_ = std::make_unique<net_log::NetExportFileWriter>();
+  }
+  return net_export_file_writer_.get();
+}
+
 void SystemNetworkContextManager::FlushSSLConfigManagerForTesting() {
   ssl_config_service_manager_->FlushForTesting();
 }
diff --git a/chrome/browser/net/system_network_context_manager.h b/chrome/browser/net/system_network_context_manager.h
index 4df6f15..e0b48d4 100644
--- a/chrome/browser/net/system_network_context_manager.h
+++ b/chrome/browser/net/system_network_context_manager.h
@@ -28,6 +28,10 @@
 class SharedURLLoaderFactory;
 }  // namespace network
 
+namespace net_log {
+class NetExportFileWriter;
+}
+
 // Responsible for creating and managing access to the system NetworkContext.
 // Lives on the UI thread. The NetworkContext this owns is intended for requests
 // not associated with a profile. It stores no data on disk, and has no HTTP
@@ -124,6 +128,11 @@
   // Returns default set of parameters for configuring the network service.
   network::mojom::NetworkContextParamsPtr CreateDefaultNetworkContextParams();
 
+  // Returns a shared global NetExportFileWriter instance, used by net-export.
+  // It lives here so it can outlive chrome://net-export/ if the tab is closed
+  // or destroyed, and so that it's destroyed before Mojo is shut down.
+  net_log::NetExportFileWriter* GetNetExportFileWriter();
+
   // Flushes all pending SSL configuration changes.
   void FlushSSLConfigManagerForTesting();
 
@@ -187,6 +196,9 @@
 
   BooleanPrefMember enable_referrers_;
 
+  // Initialized on first access.
+  std::unique_ptr<net_log::NetExportFileWriter> net_export_file_writer_;
+
   DISALLOW_COPY_AND_ASSIGN(SystemNetworkContextManager);
 };
 
diff --git a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer.cc
index 9cfbbeb1..91c8f36 100644
--- a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer.cc
@@ -16,7 +16,7 @@
 #include "chrome/browser/page_load_metrics/observers/histogram_suffixes.h"
 #include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h"
-#include "chrome/browser/previews/previews_infobar_delegate.h"
+#include "chrome/browser/previews/previews_ui_tab_helper.h"
 #include "chrome/common/page_load_metrics/page_load_timing.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h"
@@ -558,7 +558,7 @@
 void DataReductionProxyMetricsObserver::OnEventOccurred(
     const void* const event_key) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (event_key == PreviewsInfoBarDelegate::OptOutEventKey())
+  if (event_key == PreviewsUITabHelper::OptOutEventKey())
     opted_out_ = true;
 }
 
diff --git a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_unittest.cc
index f4a0ad8..55140b4 100644
--- a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_unittest.cc
@@ -23,7 +23,7 @@
 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
 #include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/page_load_tracker.h"
-#include "chrome/browser/previews/previews_infobar_delegate.h"
+#include "chrome/browser/previews/previews_ui_tab_helper.h"
 #include "chrome/common/page_load_metrics/page_load_timing.h"
 #include "chrome/common/page_load_metrics/test/page_load_metrics_test_util.h"
 #include "chrome/test/base/testing_browser_process.h"
@@ -515,8 +515,7 @@
   // Verify that when an opt out occurs, that it is reported in the pingback.
   timing_.document_timing->load_event_start = base::nullopt;
   RunTest(true, true, true, false);
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
   ValidateTimes();
   ValidateLoFiInPingback(false);
diff --git a/chrome/browser/page_load_metrics/observers/previews_ukm_observer.cc b/chrome/browser/page_load_metrics/observers/previews_ukm_observer.cc
index 5f864e1..cf82a56 100644
--- a/chrome/browser/page_load_metrics/observers/previews_ukm_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/previews_ukm_observer.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/page_load_metrics_util.h"
-#include "chrome/browser/previews/previews_infobar_delegate.h"
+#include "chrome/browser/previews/previews_ui_tab_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/page_load_metrics/page_load_timing.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
@@ -156,7 +156,7 @@
 
 void PreviewsUKMObserver::OnEventOccurred(const void* const event_key) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (event_key == PreviewsInfoBarDelegate::OptOutEventKey())
+  if (event_key == PreviewsUITabHelper::OptOutEventKey())
     opt_out_occurred_ = true;
 }
 
diff --git a/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc
index 12edbd9..621e884 100644
--- a/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/previews_ukm_observer_unittest.cc
@@ -15,7 +15,7 @@
 #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h"
 #include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/page_load_tracker.h"
-#include "chrome/browser/previews/previews_infobar_delegate.h"
+#include "chrome/browser/previews/previews_ui_tab_helper.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
 #include "components/previews/core/previews_features.h"
@@ -243,8 +243,7 @@
   RunTest(false /* data_reduction_proxy_used */, false /* lite_page_received */,
           false /* noscript_on */, false /* resource_loading_hints_on */,
           false /* origin_opt_out */, false /* save_data_enabled */);
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
   // Opt out should not be added since we don't track this type.
@@ -271,7 +270,7 @@
               false /* save_data_enabled_expected */);
 }
 
-TEST_F(PreviewsUKMObserverTest, LitePageOptOutInfobar) {
+TEST_F(PreviewsUKMObserverTest, LitePageOptOut) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       {} /* enabled features */,
@@ -282,8 +281,7 @@
           false /* noscript_on */, false /* resource_loading_hints_on */,
           false /* origin_opt_out */, false /* save_data_enabled */);
 
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
   ValidateUKM(false /* server_lofi_expected */,
@@ -304,8 +302,7 @@
           false /* noscript_on */, false /* resource_loading_hints_on */,
           false /* origin_opt_out */, false /* save_data_enabled */);
 
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
   ValidateUKM(false /* server_lofi_expected */,
@@ -331,7 +328,7 @@
               false /* save_data_enabled_expected */);
 }
 
-TEST_F(PreviewsUKMObserverTest, NoScriptOptOutInfobar) {
+TEST_F(PreviewsUKMObserverTest, NoScriptOptOut) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       {} /* enabled features */,
@@ -342,8 +339,7 @@
           true /* noscript_on */, false /* resource_loading_hints_on */,
           false /* origin_opt_out */, false /* save_data_enabled */);
 
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
   ValidateUKM(false /* server_lofi_expected */,
@@ -364,8 +360,7 @@
           true /* noscript_on */, false /* resource_loading_hints_on */,
           false /* origin_opt_out */, false /* save_data_enabled */);
 
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
   ValidateUKM(false /* server_lofi_expected */,
@@ -391,7 +386,7 @@
               false /* save_data_enabled_expected */);
 }
 
-TEST_F(PreviewsUKMObserverTest, ResourceLoadingHintsOptOutInfobar) {
+TEST_F(PreviewsUKMObserverTest, ResourceLoadingHintsOptOut) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       {} /* enabled features */,
@@ -402,8 +397,7 @@
           false /* noscript_on */, true /* resource_loading_hints_on */,
           false /* origin_opt_out */, false /* save_data_enabled */);
 
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
   ValidateUKM(false /* server_lofi_expected */,
@@ -424,8 +418,7 @@
           false /* noscript_on */, true /* resource_loading_hints_on */,
           false /* origin_opt_out */, false /* save_data_enabled */);
 
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
   ValidateUKM(false /* server_lofi_expected */,
@@ -474,7 +467,7 @@
               false /* save_data_enabled_expected */);
 }
 
-TEST_F(PreviewsUKMObserverTest, ClientLoFiOptOutInfobar) {
+TEST_F(PreviewsUKMObserverTest, ClientLoFiOptOut) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       {} /* enabled features */,
@@ -508,8 +501,7 @@
 
   for (const auto& request : resources)
     SimulateLoadedResource(request);
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
   ValidateUKM(false /* server_lofi_expected */, true /* client_lofi_expected */,
@@ -552,8 +544,7 @@
 
   for (const auto& request : resources)
     SimulateLoadedResource(request);
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
   ValidateUKM(false /* server_lofi_expected */, true /* client_lofi_expected */,
@@ -601,7 +592,7 @@
               false /* save_data_enabled_expected */);
 }
 
-TEST_F(PreviewsUKMObserverTest, ServerLoFiOptOutInfobar) {
+TEST_F(PreviewsUKMObserverTest, ServerLoFiOptOut) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       {} /* enabled features */,
@@ -636,8 +627,7 @@
   for (const auto& request : resources)
     SimulateLoadedResource(request);
 
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
   ValidateUKM(true /* server_lofi_expected */, false /* client_lofi_expected */,
@@ -681,8 +671,7 @@
   for (const auto& request : resources)
     SimulateLoadedResource(request);
 
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
 
   ValidateUKM(true /* server_lofi_expected */, false /* client_lofi_expected */,
@@ -735,7 +724,7 @@
               false /* save_data_enabled_expected */);
 }
 
-TEST_F(PreviewsUKMObserverTest, BothLoFiOptOutInfobar) {
+TEST_F(PreviewsUKMObserverTest, BothLoFiOptOut) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       {} /* enabled features */,
@@ -775,8 +764,7 @@
 
   for (const auto& request : resources)
     SimulateLoadedResource(request);
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
   ValidateUKM(true /* server_lofi_expected */, true /* client_lofi_expected */,
               false /* lite_page_expected */, false /* noscript_expected */,
@@ -824,8 +812,7 @@
 
   for (const auto& request : resources)
     SimulateLoadedResource(request);
-  observer()->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
+  observer()->BroadcastEventToObservers(PreviewsUITabHelper::OptOutEventKey());
   NavigateToUntrackedUrl();
   ValidateUKM(true /* server_lofi_expected */, true /* client_lofi_expected */,
               false /* lite_page_expected */, false /* noscript_expected */,
diff --git a/chrome/browser/permissions/permission_context_base.cc b/chrome/browser/permissions/permission_context_base.cc
index b6c6742..b47a4e8e6 100644
--- a/chrome/browser/permissions/permission_context_base.cc
+++ b/chrome/browser/permissions/permission_context_base.cc
@@ -32,6 +32,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_features.h"
@@ -167,6 +168,7 @@
         break;
       case PermissionStatusSource::INSECURE_ORIGIN:
       case PermissionStatusSource::UNSPECIFIED:
+      case PermissionStatusSource::VIRTUAL_URL_DIFFERENT_ORIGIN:
         break;
     }
 
@@ -230,6 +232,31 @@
                             PermissionStatusSource::FEATURE_POLICY);
   }
 
+  if (render_frame_host) {
+    content::WebContents* web_contents =
+        content::WebContents::FromRenderFrameHost(render_frame_host);
+
+    // Automatically deny all HTTP or HTTPS requests where the virtual URL and
+    // the loaded URL are for different origins. The loaded URL is the one
+    // actually in the renderer, but the virtual URL is the one
+    // seen by the user. This may be very confusing for a user to see in a
+    // permissions request.
+    const content::NavigationEntry* entry =
+        web_contents->GetController().GetLastCommittedEntry();
+    if (entry) {
+      const GURL virtual_url = entry->GetVirtualURL();
+      const GURL loaded_url = entry->GetURL();
+      if (virtual_url.SchemeIsHTTPOrHTTPS() &&
+          loaded_url.SchemeIsHTTPOrHTTPS() &&
+          !url::Origin::Create(virtual_url)
+               .IsSameOriginWith(url::Origin::Create(loaded_url))) {
+        return PermissionResult(
+            CONTENT_SETTING_BLOCK,
+            PermissionStatusSource::VIRTUAL_URL_DIFFERENT_ORIGIN);
+      }
+    }
+  }
+
   ContentSetting content_setting = GetPermissionStatusInternal(
       render_frame_host, requesting_origin, embedding_origin);
   if (content_setting == CONTENT_SETTING_ASK) {
diff --git a/chrome/browser/permissions/permission_context_base_unittest.cc b/chrome/browser/permissions/permission_context_base_unittest.cc
index 8c90e0a..3a0dfeb 100644
--- a/chrome/browser/permissions/permission_context_base_unittest.cc
+++ b/chrome/browser/permissions/permission_context_base_unittest.cc
@@ -36,6 +36,7 @@
 #include "components/content_settings/core/common/content_settings_types.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/mock_render_process_host.h"
@@ -594,6 +595,23 @@
     EXPECT_EQ(response, permission_context.GetContentSettingFromMap(url, url));
   }
 
+  void TestVirtualURL(const GURL& loaded_url,
+                      const GURL& virtual_url,
+                      const ContentSetting want_response,
+                      const PermissionStatusSource& want_source) {
+    TestPermissionContext permission_context(
+        profile(), CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
+
+    NavigateAndCommit(loaded_url);
+    web_contents()->GetController().GetVisibleEntry()->SetVirtualURL(
+        virtual_url);
+
+    PermissionResult result = permission_context.GetPermissionStatus(
+        web_contents()->GetMainFrame(), virtual_url, virtual_url);
+    EXPECT_EQ(result.content_setting, want_response);
+    EXPECT_EQ(result.source, want_source);
+  }
+
   void SetUpUrl(const GURL& url) {
     NavigateAndCommit(url);
     prompt_factory_->DocumentOnLoadCompletedInMainFrame();
@@ -707,3 +725,20 @@
 TEST_F(PermissionContextBaseTests, TestParallelRequestsDismissed) {
   TestParallelRequests(CONTENT_SETTING_ASK);
 }
+
+TEST_F(PermissionContextBaseTests, TestVirtualURLDifferentOrigin) {
+  TestVirtualURL(GURL("http://www.google.com"), GURL("http://foo.com"),
+                 CONTENT_SETTING_BLOCK,
+                 PermissionStatusSource::VIRTUAL_URL_DIFFERENT_ORIGIN);
+}
+
+TEST_F(PermissionContextBaseTests, TestVirtualURLNotHTTP) {
+  TestVirtualURL(GURL("chrome://foo"), GURL("chrome://newtab"),
+                 CONTENT_SETTING_ASK, PermissionStatusSource::UNSPECIFIED);
+}
+
+TEST_F(PermissionContextBaseTests, TestVirtualURLSameOrigin) {
+  TestVirtualURL(GURL("http://www.google.com"),
+                 GURL("http://www.google.com/foo"), CONTENT_SETTING_ASK,
+                 PermissionStatusSource::UNSPECIFIED);
+}
diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc
index c89d22cc..1584767 100644
--- a/chrome/browser/permissions/permission_manager.cc
+++ b/chrome/browser/permissions/permission_manager.cc
@@ -11,6 +11,7 @@
 #include "base/feature_list.h"
 #include "build/build_config.h"
 #include "chrome/browser/accessibility/accessibility_permission_context.h"
+#include "chrome/browser/background_fetch/background_fetch_permission_context.h"
 #include "chrome/browser/background_sync/background_sync_permission_context.h"
 #include "chrome/browser/clipboard/clipboard_read_permission_context.h"
 #include "chrome/browser/clipboard/clipboard_write_permission_context.h"
@@ -123,6 +124,8 @@
       return CONTENT_SETTINGS_TYPE_CLIPBOARD_WRITE;
     case PermissionType::PAYMENT_HANDLER:
       return CONTENT_SETTINGS_TYPE_PAYMENT_HANDLER;
+    case PermissionType::BACKGROUND_FETCH:
+      return CONTENT_SETTINGS_TYPE_BACKGROUND_FETCH;
     case PermissionType::NUM:
       // This will hit the NOTREACHED below.
       break;
@@ -307,6 +310,8 @@
       std::make_unique<ClipboardWritePermissionContext>(profile);
   permission_contexts_[CONTENT_SETTINGS_TYPE_PAYMENT_HANDLER] =
       std::make_unique<payments::PaymentHandlerPermissionContext>(profile);
+  permission_contexts_[CONTENT_SETTINGS_TYPE_BACKGROUND_FETCH] =
+      std::make_unique<BackgroundFetchPermissionContext>(profile);
 }
 
 PermissionManager::~PermissionManager() {
diff --git a/chrome/browser/permissions/permission_result.h b/chrome/browser/permissions/permission_result.h
index bfeb458e..484ff29 100644
--- a/chrome/browser/permissions/permission_result.h
+++ b/chrome/browser/permissions/permission_result.h
@@ -29,6 +29,12 @@
 
   // The feature has been blocked in the requesting frame by feature policy.
   FEATURE_POLICY,
+
+  // The virtual URL and the loaded URL are for different origins. The loaded
+  // URL is the one actually in the renderer, but the virtual URL is the one
+  // seen by the user. This may be very confusing for a user to see in a
+  // permissions request.
+  VIRTUAL_URL_DIFFERENT_ORIGIN,
 };
 
 struct PermissionResult {
diff --git a/chrome/browser/permissions/permission_uma_util.cc b/chrome/browser/permissions/permission_uma_util.cc
index 14efe3c..e2c560d 100644
--- a/chrome/browser/permissions/permission_uma_util.cc
+++ b/chrome/browser/permissions/permission_uma_util.cc
@@ -206,6 +206,7 @@
     case PermissionStatusSource::KILL_SWITCH:
     case PermissionStatusSource::INSECURE_ORIGIN:
     case PermissionStatusSource::FEATURE_POLICY:
+    case PermissionStatusSource::VIRTUAL_URL_DIFFERENT_ORIGIN:
       // The permission wasn't under embargo, so don't record anything. We may
       // embargo it later.
       break;
diff --git a/chrome/browser/permissions/permission_util.cc b/chrome/browser/permissions/permission_util.cc
index 9ec1081c..f767574 100644
--- a/chrome/browser/permissions/permission_util.cc
+++ b/chrome/browser/permissions/permission_util.cc
@@ -50,6 +50,8 @@
       return "ClipboardWrite";
     case CONTENT_SETTINGS_TYPE_PAYMENT_HANDLER:
       return "PaymentHandler";
+    case CONTENT_SETTINGS_TYPE_BACKGROUND_FETCH:
+      return "BackgroundFetch";
     default:
       break;
   }
@@ -122,6 +124,8 @@
     *out = PermissionType::CLIPBOARD_READ;
   } else if (type == CONTENT_SETTINGS_TYPE_PAYMENT_HANDLER) {
     *out = PermissionType::PAYMENT_HANDLER;
+  } else if (type == CONTENT_SETTINGS_TYPE_BACKGROUND_FETCH) {
+    *out = PermissionType::BACKGROUND_FETCH;
   } else {
     return false;
   }
@@ -145,6 +149,7 @@
     case CONTENT_SETTINGS_TYPE_ACCESSIBILITY_EVENTS:
     case CONTENT_SETTINGS_TYPE_CLIPBOARD_READ:
     case CONTENT_SETTINGS_TYPE_PAYMENT_HANDLER:
+    case CONTENT_SETTINGS_TYPE_BACKGROUND_FETCH:
       return true;
     default:
       return false;
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 3e4160cd..c000b17 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -189,6 +189,7 @@
 #if defined(OS_ANDROID)
 #include "chrome/browser/android/bookmarks/partner_bookmarks_shim.h"
 #include "chrome/browser/android/contextual_suggestions/contextual_suggestions_prefs.h"
+#include "chrome/browser/android/explore_sites/history_statistics_reporter.h"
 #include "chrome/browser/android/ntp/content_suggestions_notifier_service.h"
 #include "chrome/browser/android/ntp/recent_tabs_page_prefs.h"
 #include "chrome/browser/android/oom_intervention/oom_intervention_decider.h"
@@ -671,6 +672,7 @@
       registry);
   ContentSuggestionsNotifierService::RegisterProfilePrefs(registry);
   DownloadSuggestionsProvider::RegisterProfilePrefs(registry);
+  explore_sites::HistoryStatisticsReporter::RegisterPrefs(registry);
   ntp_snippets::BreakingNewsGCMAppHandler::RegisterProfilePrefs(registry);
   ntp_snippets::ClickBasedCategoryRanker::RegisterProfilePrefs(registry);
   ntp_snippets::SubscriptionManagerImpl::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/previews/previews_infobar_delegate.cc b/chrome/browser/previews/previews_infobar_delegate.cc
index ee271be..a6427a2 100644
--- a/chrome/browser/previews/previews_infobar_delegate.cc
+++ b/chrome/browser/previews/previews_infobar_delegate.cc
@@ -13,7 +13,6 @@
 #include "chrome/browser/infobars/infobar_service.h"
 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h"
 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h"
-#include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
 #include "chrome/browser/previews/previews_ui_tab_helper.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
@@ -32,8 +31,6 @@
 
 namespace {
 
-const void* const kOptOutEventKey = 0;
-
 static const char kPreviewInfobarEventType[] = "InfoBar";
 
 void RecordPreviewsInfoBarAction(
@@ -49,17 +46,6 @@
       ->Add(static_cast<int32_t>(action));
 }
 
-void InformPLMOfOptOut(content::WebContents* web_contents) {
-  page_load_metrics::MetricsWebContentsObserver* metrics_web_contents_observer =
-      page_load_metrics::MetricsWebContentsObserver::FromWebContents(
-          web_contents);
-  if (!metrics_web_contents_observer)
-    return;
-
-  metrics_web_contents_observer->BroadcastEventToObservers(
-      PreviewsInfoBarDelegate::OptOutEventKey());
-}
-
 }  // namespace
 
 PreviewsInfoBarDelegate::~PreviewsInfoBarDelegate() {
@@ -183,11 +169,6 @@
 bool PreviewsInfoBarDelegate::LinkClicked(WindowOpenDisposition disposition) {
   infobar_dismissed_action_ = INFOBAR_LOAD_ORIGINAL_CLICKED;
 
-  content::WebContents* web_contents =
-      InfoBarService::WebContentsFromInfoBar(infobar());
-
-  InformPLMOfOptOut(web_contents);
-
   ui_tab_helper_->ReloadWithoutPreviews(previews_type_);
 
   return true;
@@ -202,8 +183,3 @@
     ui_tab_helper_->set_displayed_preview_timestamp(true);
   return text;
 }
-
-// static
-const void* PreviewsInfoBarDelegate::OptOutEventKey() {
-  return &kOptOutEventKey;
-}
diff --git a/chrome/browser/previews/previews_infobar_delegate.h b/chrome/browser/previews/previews_infobar_delegate.h
index 33cfc1f40..76e6443 100644
--- a/chrome/browser/previews/previews_infobar_delegate.h
+++ b/chrome/browser/previews/previews_infobar_delegate.h
@@ -56,9 +56,6 @@
 
   base::string16 GetStalePreviewTimestampText() const;
 
-  // A key to identify opt out events.
-  static const void* OptOutEventKey();
-
  private:
   PreviewsInfoBarDelegate(PreviewsUITabHelper* ui_tab_helper,
                           previews::PreviewsType previews_type,
diff --git a/chrome/browser/previews/previews_infobar_delegate_unittest.cc b/chrome/browser/previews/previews_infobar_delegate_unittest.cc
index 013b8b5..2c323e96 100644
--- a/chrome/browser/previews/previews_infobar_delegate_unittest.cc
+++ b/chrome/browser/previews/previews_infobar_delegate_unittest.cc
@@ -62,6 +62,7 @@
 #include "content/public/test/navigation_simulator.h"
 #include "content/public/test/test_renderer_host.h"
 #include "content/public/test/web_contents_tester.h"
+#include "services/network/test/test_network_quality_tracker.h"
 #include "services/network/test/test_shared_url_loader_factory.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/page_transition_types.h"
@@ -120,7 +121,7 @@
   ~TestOptOutObserver() override {}
 
   void OnEventOccurred(const void* const event_key) override {
-    if (PreviewsInfoBarDelegate::OptOutEventKey() == event_key)
+    if (PreviewsUITabHelper::OptOutEventKey() == event_key)
       callback_.Run();
   }
 
@@ -203,16 +204,20 @@
         base::MessageLoopCurrent::Get()->task_runner(),
         base::MessageLoopCurrent::Get()->task_runner(),
         base::DefaultClock::GetInstance());
+    test_network_quality_tracker_ =
+        std::make_unique<network::TestNetworkQualityTracker>();
     previews_ui_service_ = std::make_unique<previews::PreviewsUIService>(
         previews_decider_impl_.get(),
         base::MessageLoopCurrent::Get()->task_runner(),
         nullptr /* previews_opt_out_store */, nullptr /* previews_opt_guide */,
         base::BindRepeating(&IsPreviewsEnabled), std::move(previews_logger),
-        blacklist::BlacklistData::AllowedTypesAndVersions());
+        blacklist::BlacklistData::AllowedTypesAndVersions(),
+        test_network_quality_tracker_.get());
     base::RunLoop().RunUntilIdle();
   }
 
   void TearDown() override {
+    previews_ui_service_.reset();
     drp_test_context_->DestroySettings();
     ChromeRenderViewHostTestHarness::TearDown();
     TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr);
@@ -298,6 +303,7 @@
   TestPreviewsLogger* previews_logger_;
   std::unique_ptr<previews::PreviewsDeciderImpl> previews_decider_impl_;
   std::unique_ptr<previews::PreviewsUIService> previews_ui_service_;
+  std::unique_ptr<network::NetworkQualityTracker> test_network_quality_tracker_;
 };
 
 // TODO(crbug/782740): Test temporarily disabled on Windows because it crashes
diff --git a/chrome/browser/previews/previews_lite_page_navigation_throttle.cc b/chrome/browser/previews/previews_lite_page_navigation_throttle.cc
index 7bca863c..81ee2c8 100644
--- a/chrome/browser/previews/previews_lite_page_navigation_throttle.cc
+++ b/chrome/browser/previews/previews_lite_page_navigation_throttle.cc
@@ -412,16 +412,15 @@
 
 content::NavigationThrottle::ThrottleCheckResult
 PreviewsLitePageNavigationThrottle::WillProcessResponse() {
-  const net::HttpResponseHeaders* response_headers =
-      navigation_handle()->GetResponseHeaders();
-  DCHECK(response_headers);
-
   std::string original_url;
   if (!GetOriginalURL(navigation_handle()->GetURL(), &original_url)) {
     // Return early if this request was not for a Preview.
     return content::NavigationThrottle::PROCEED;
   }
 
+  const net::HttpResponseHeaders* response_headers =
+      navigation_handle()->GetResponseHeaders();
+
   // After this point, the given response is known to be for a Preview.
   // The Previews server will only send the following response codes: 200, 307,
   // 404, and 503. 200 and 307 should proceed as normal, 404 and 503 request the
diff --git a/chrome/browser/previews/previews_service.cc b/chrome/browser/previews/previews_service.cc
index 1f36396..82814fc6 100644
--- a/chrome/browser/previews/previews_service.cc
+++ b/chrome/browser/previews/previews_service.cc
@@ -8,6 +8,7 @@
 #include "base/files/file_path.h"
 #include "base/sequenced_task_runner.h"
 #include "base/task/post_task.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/previews/previews_lite_page_decider.h"
 #include "chrome/common/chrome_constants.h"
 #include "components/blacklist/opt_out_blacklist/opt_out_blacklist_data.h"
@@ -131,7 +132,8 @@
                 optimization_guide_service, io_task_runner)
           : nullptr,
       base::Bind(&IsPreviewsTypeEnabled),
-      std::make_unique<previews::PreviewsLogger>(), GetAllowedPreviews());
+      std::make_unique<previews::PreviewsLogger>(), GetAllowedPreviews(),
+      g_browser_process->network_quality_tracker());
 }
 
 void PreviewsService::Shutdown() {
diff --git a/chrome/browser/previews/previews_service_unittest.cc b/chrome/browser/previews/previews_service_unittest.cc
index 9e0c7a21..c19956e2 100644
--- a/chrome/browser/previews/previews_service_unittest.cc
+++ b/chrome/browser/previews/previews_service_unittest.cc
@@ -28,6 +28,7 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "net/base/network_change_notifier.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -72,6 +73,7 @@
       : field_trial_list_(nullptr), scoped_feature_list_() {}
 
   void SetUp() override {
+    network_change_notifier_.reset(net::NetworkChangeNotifier::CreateMock());
     previews_decider_impl_ = std::make_unique<TestPreviewsDeciderImpl>();
 
     service_ = std::make_unique<PreviewsService>(nullptr);
@@ -95,6 +97,7 @@
   }
 
  private:
+  std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
   content::TestBrowserThreadBundle threads_;
   base::FieldTrialList field_trial_list_;
   std::unique_ptr<TestPreviewsDeciderImpl> previews_decider_impl_;
diff --git a/chrome/browser/previews/previews_ui_tab_helper.cc b/chrome/browser/previews/previews_ui_tab_helper.cc
index f120426..28eb1e6 100644
--- a/chrome/browser/previews/previews_ui_tab_helper.cc
+++ b/chrome/browser/previews/previews_ui_tab_helper.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/loader/chrome_navigation_data.h"
 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h"
 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h"
+#include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
 #include "chrome/browser/previews/previews_infobar_delegate.h"
 #include "chrome/browser/previews/previews_service.h"
 #include "chrome/browser/previews/previews_service_factory.h"
@@ -43,6 +44,8 @@
 
 namespace {
 
+const void* const kOptOutEventKey = 0;
+
 const char kMinStalenessParamName[] = "min_staleness_in_minutes";
 const char kMaxStalenessParamName[] = "max_staleness_in_minutes";
 const int kMinStalenessParamDefaultValue = 5;
@@ -66,6 +69,17 @@
   UMA_HISTOGRAM_ENUMERATION("Previews.StalePreviewTimestampShown", value);
 }
 
+void InformPLMOfOptOut(content::WebContents* web_contents) {
+  page_load_metrics::MetricsWebContentsObserver* metrics_web_contents_observer =
+      page_load_metrics::MetricsWebContentsObserver::FromWebContents(
+          web_contents);
+  if (!metrics_web_contents_observer)
+    return;
+
+  metrics_web_contents_observer->BroadcastEventToObservers(
+      PreviewsUITabHelper::OptOutEventKey());
+}
+
 }  // namespace
 
 PreviewsUITabHelper::~PreviewsUITabHelper() {}
@@ -172,6 +186,7 @@
 
 void PreviewsUITabHelper::ReloadWithoutPreviews(
     previews::PreviewsType previews_type) {
+  InformPLMOfOptOut(web_contents());
 #if defined(OS_ANDROID)
   should_display_android_omnibox_badge_ = false;
 #endif
@@ -305,3 +320,8 @@
     }
   }
 }
+
+// static
+const void* PreviewsUITabHelper::OptOutEventKey() {
+  return &kOptOutEventKey;
+}
diff --git a/chrome/browser/previews/previews_ui_tab_helper.h b/chrome/browser/previews/previews_ui_tab_helper.h
index d641d12..d481044 100644
--- a/chrome/browser/previews/previews_ui_tab_helper.h
+++ b/chrome/browser/previews/previews_ui_tab_helper.h
@@ -89,6 +89,9 @@
     return previews_user_data_.get();
   }
 
+  // A key to identify opt out events.
+  static const void* OptOutEventKey();
+
  private:
   friend class content::WebContentsUserData<PreviewsUITabHelper>;
   friend class PreviewsUITabHelperUnitTest;
diff --git a/chrome/browser/resources/chromeos/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/chromevox/BUILD.gn
index c9213194..9bc9585 100644
--- a/chrome/browser/resources/chromeos/chromevox/BUILD.gn
+++ b/chrome/browser/resources/chromeos/chromevox/BUILD.gn
@@ -143,6 +143,7 @@
   "cvox2/background/log_store.js",
   "cvox2/background/math_handler.js",
   "cvox2/background/media_automation_handler.js",
+  "cvox2/background/mouse_handler.js",
   "cvox2/background/next_earcons.js",
   "cvox2/background/notifications.js",
   "cvox2/background/output.js",
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html
index 85d85ae..61f4ef3 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.html
@@ -40,6 +40,14 @@
     </label>
   </div>
 
+  <div class="option">
+    <input id="speakTextUnderMouse" type="checkbox" class="checkbox pref"
+           name="speakTextUnderMouse">
+    <label for="speakTextUnderMouse" class="i18n" msgid="options_speak_mouse">
+      Speak text under the mouse.
+    </label>
+  </div>
+
   <h2 class="i18n description" msgid="options_audio_description"
       id="audioDescription">
     When playing audio
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js
index 766c29c2..739fa68 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/options.js
@@ -138,6 +138,13 @@
   document.addEventListener('click', cvox.OptionsPage.eventListener, false);
   document.addEventListener('keydown', cvox.OptionsPage.eventListener, false);
 
+  window.addEventListener('storage', (event) => {
+    if (event.key == 'speakTextUnderMouse') {
+      chrome.accessibilityPrivate.enableChromeVoxMouseEvents(
+          event.newValue == String(true));
+    }
+  });
+
   cvox.ExtensionBridge.addMessageListener(function(message) {
     if (message['prefs']) {
       cvox.OptionsPage.update();
diff --git a/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js b/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js
index 159b38a..6f3cdcba 100644
--- a/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js
+++ b/chrome/browser/resources/chromeos/chromevox/chromevox/background/prefs.js
@@ -87,6 +87,7 @@
       'https://ssl.gstatic.com/accessibility/javascript/ext/',
   'siteSpecificScriptLoader':
       'https://ssl.gstatic.com/accessibility/javascript/ext/loader.js',
+  'speakTextUnderMouse': false,
   'sticky': false,
   'typingEcho': 0,
   'useIBeamCursor': cvox.ChromeVox.isMac,
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
index f5b6985..8062c68 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.js
@@ -12,6 +12,7 @@
 goog.require('AutomationPredicate');
 goog.require('AutomationUtil');
 goog.require('BackgroundKeyboardHandler');
+goog.require('BackgroundMouseHandler');
 goog.require('BrailleCommandData');
 goog.require('BrailleCommandHandler');
 goog.require('ChromeVoxState');
@@ -121,6 +122,13 @@
   /** @type {!BackgroundKeyboardHandler} @private */
   this.keyboardHandler_ = new BackgroundKeyboardHandler();
 
+  /** @type {!BackgroundMouseHandler} @private */
+  this.mouseHandler_ = new BackgroundMouseHandler();
+
+  if (localStorage['speakTextUnderMouse'] == String(true)) {
+    chrome.accessibilityPrivate.enableChromeVoxMouseEvents(true);
+  }
+
   /** @type {!LiveRegions} @private */
   this.liveRegions_ = new LiveRegions(this);
 
@@ -462,7 +470,7 @@
     // the next or previous focusable node from |start|.
     if (!start.state[StateType.OFFSCREEN])
       start.setSequentialFocusNavigationStartingPoint();
-  }
+  },
 };
 
 /**
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/mouse_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/mouse_handler.js
new file mode 100644
index 0000000..30d3331
--- /dev/null
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/mouse_handler.js
@@ -0,0 +1,39 @@
+// Copyright 2018 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.
+
+/**
+ * @fileoverview ChromeVox mouse handler.
+ */
+
+goog.provide('BackgroundMouseHandler');
+
+var EventType = chrome.automation.EventType;
+
+/** @constructor */
+BackgroundMouseHandler = function() {
+  document.addEventListener('mousemove', this.onMouseMove.bind(this));
+
+  chrome.automation.getDesktop(function(desktop) {
+    /**
+     *
+     * The desktop node.
+     *
+     * @private {!chrome.automation.AutomationNode}
+     */
+    this.desktop_ = desktop;
+  }.bind(this));
+};
+
+BackgroundMouseHandler.prototype = {
+  /**
+   * Handles mouse move events.
+   * @param {Event} evt The mouse move event to process.
+   * @return {boolean} True if the default action should be performed.
+   */
+  onMouseMove: function(evt) {
+    // Immediately save the most recent mouse coordinates.
+    this.desktop_.hitTest(evt.screenX, evt.screenY, EventType.HOVER);
+    return false;
+  },
+};
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
index c41c5c27..a3e219a7 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd
@@ -514,6 +514,9 @@
       <message desc="An option to show the cursor between characters." name="IDS_CHROMEVOX_OPTIONS_CURSOR_BETWEEN_CHARACTERS">
         Place cursor between characters when editing text (like Mac OS X).
       </message>
+      <message desc="An option to speak text under the mouse." name="IDS_CHROMEVOX_OPTIONS_SPEAK_MOUSE">
+        Speak text under the mouse.
+      </message>
       <message desc="An options page section header for options about the ChromeVox voice. This section lets users change the voice by selecting a different voice from a listbox." name="IDS_CHROMEVOX_OPTIONS_VOICES">
         Voices
       </message>
diff --git a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
index e7776aa6..b0fdb6a 100644
--- a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
+++ b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.html
@@ -5,6 +5,8 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
 <link rel="import" href="chrome://oobe/custom_elements.html">
+<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup_shared_css.html">
+<link rel="import" href="chrome://resources/cr_components/chromeos/multidevice_setup/multidevice_setup.html">
 <!--
   UI for the MultiDevice setup flow when displayed after OOBE or during the
   user's first login on this Chromebook. Note that this flow is
@@ -16,20 +18,24 @@
         screen.
     (3) In the first run, buttons are styled with custom OOBE buttons.
 
-  TODO(khorimoto): Implement real flow. For now, this page simply displays
-                   placeholder buttons. See https://crbug.com/884065.
-
   Example:
       <multidevice-setup-first-run></multidevice-setup-first-run>
 -->
 <dom-module id="multidevice-setup-first-run">
   <template>
-    <div>Placeholder MultiDevice setup flow</div>
-    <oobe-text-button inverse on-click="onSkipSetupClicked_">
-      <div>Skip setup</div>
-    </oobe-text-button>
-    <oobe-next-button on-click="onAcceptClicked_">
-      <div>Next</div>
-    </oobe-next-button>
+    <style include="shared-style multidevice-setup-shared"></style>
+    <multidevice-setup delegate="[[delegate_]]"
+        on-setup-exited="onExitRequested_"
+        forward-button-text="{{forwardButtonText_}}"
+        forward-button-disabled="{{forwardButtonDisabled_}}"
+        backward-button-text="{{backwardButtonText_}}">
+      <oobe-text-button slot="backward-button">
+        <div>[[backwardButtonText_]]</div>
+      </oobe-text-button>
+      <oobe-next-button slot="forward-button"
+          disabled$="[[forwardButtonDisabled_]]">
+        <div>[[forwardButtonText_]]</div>
+      </oobe-next-button>
+    </multidevice-setup>
   </template>
 </dom-module>
diff --git a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js
index 93633b4..6d8748d 100644
--- a/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js
+++ b/chrome/browser/resources/chromeos/login/multidevice_setup_first_run.js
@@ -7,21 +7,93 @@
  *     run (i.e., after OOBE or during the user's first login on this
  *     Chromebook).
  */
-Polymer({
-  is: 'multidevice-setup-first-run',
 
-  /** @private */
-  onSkipSetupClicked_: function() {
-    this.exitSetupFlow_();
-  },
+cr.define('multidevice_setup', function() {
+  /** @implements {multidevice_setup.MultiDeviceSetupDelegate} */
+  class MultiDeviceSetupFirstRunDelegate {
+    constructor() {
+      /**
+       * @private {?chromeos.multideviceSetup.mojom.
+       *               PrivilegedHostDeviceSetterPtr}
+       */
+      this.ptr_ = null;
+    }
 
-  /** @private */
-  onAcceptClicked_: function() {
-    this.exitSetupFlow_();
-  },
+    /** @override */
+    isPasswordRequiredToSetHost() {
+      return false;
+    }
 
-  /** @private */
-  exitSetupFlow_: function() {
-    chrome.send('login.MultiDeviceSetupScreen.userActed', ['setup-finished']);
+    /** @override */
+    setHostDevice(hostDeviceId, opt_authToken) {
+      // An authentication token is not expected since a password is not
+      // required.
+      assert(!opt_authToken);
+
+      if (!this.ptr_) {
+        this.ptr_ =
+            new chromeos.multideviceSetup.mojom.PrivilegedHostDeviceSetterPtr();
+        Mojo.bindInterface(
+            chromeos.multideviceSetup.mojom.PrivilegedHostDeviceSetter.name,
+            mojo.makeRequest(this.ptr_).handle);
+      }
+
+      return this.ptr_.setHostDevice(hostDeviceId);
+    }
+
+    /** @override */
+    shouldExitSetupFlowAfterSettingHost() {
+      return true;
+    }
   }
+
+  const MultiDeviceSetupFirstRun = Polymer({
+    is: 'multidevice-setup-first-run',
+
+    properties: {
+      /** @private {!multidevice_setup.MultiDeviceSetupDelegate} */
+      delegate_: Object,
+
+      /**
+       * Text to be shown on the forward navigation button.
+       * @private {string|undefined}
+       */
+      forwardButtonText_: {
+        type: String,
+        value: '',
+      },
+
+      /**
+       * Whether the forward button should be disabled.
+       * @private {boolean}
+       */
+      forwardButtonDisabled_: {
+        type: Boolean,
+        value: false,
+      },
+
+      /**
+       * Text to be shown on the backward navigation button.
+       * @private {string|undefined}
+       */
+      backwardButtonText_: {
+        type: String,
+        value: '',
+      },
+    },
+
+    /** @override */
+    attached: function() {
+      this.delegate_ = new MultiDeviceSetupFirstRunDelegate();
+    },
+
+    /** @private */
+    onExitRequested_: function() {
+      chrome.send('login.MultiDeviceSetupScreen.userActed', ['setup-finished']);
+    }
+  });
+
+  return {
+    MultiDeviceSetupFirstRun: MultiDeviceSetupFirstRun,
+  };
 });
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css
index 003e077..1f94939f 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.css
+++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -292,22 +292,32 @@
 }
 
 #fakebox {
-  background-color: rgb(241, 243, 244);
-  border-radius: 22px;
+  background-color: #fff;
+  border-radius: 2px;
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08);
   cursor: text;
   font-size: 18px;
   height: 44px;
   line-height: 36px;
+  margin: 0 calc(var(--tile-margin) / 2 + 1px) 0 calc(var(--tile-margin) / 2);
+  outline: none;
+  position: relative;
+  transition: box-shadow 200ms cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.md #fakebox {
+  background-color: rgb(241, 243, 244);
+  border-radius: 22px;
+  box-shadow: none;
   margin: 0 auto;
   max-width: 560px;
   opacity: 1;
-  position: relative;
   transition: background-color 300ms ease-in-out;
   /* Transition should be similar to .mv-tile/.md-tile opacity transition. */
   transition: opacity 200ms;
 }
 
-#fakebox:hover {
+.md #fakebox:hover {
   background-color: rgb(232, 234, 237);
 }
 
@@ -315,33 +325,50 @@
   display: none;
 }
 
+#fakebox:hover,
+body.fakebox-focused #fakebox {
+  box-shadow: 0 3px 8px 0 rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.08);
+}
+
+.md #fakebox:hover,
+body.md.fakebox-focused #fakebox {
+  box-shadow: none;
+}
+
 #fakebox > input {
   bottom: 0;
   box-sizing: border-box;
   left: 0;
   margin: 0;
   opacity: 0;
-  padding-left: 20px;
+  padding-left: 8px;
   position: absolute;
   top: 0;
   width: 100%;
 }
 
+.md #fakebox > input {
+  padding-left: 20px;
+}
+
 html[dir=rtl] #fakebox > input {
   padding-left: 0;
-  padding-right: 20px;
+  padding-right: 8px;
   right: 0;
 }
 
+html[dir=rtl] .md  #fakebox > input {
+  padding-right: 20px;
+}
+
 #fakebox-text {
   bottom: 4px;
-  color: rgb(128, 134, 139);
-  font-family: 'Roboto', arial, sans-serif;
-  font-size: 14px;
-  left: 0;
+  color: rgba(0, 0, 0, 0.42);
+  font-family: arial, sans-serif;
+  font-size: 16px;
+  left: 13px;
   margin-top: 1px;
   overflow: hidden;
-  padding-left: 20px;
   position: absolute;
   right: 13px;
   text-align: initial;
@@ -352,7 +379,20 @@
   white-space: nowrap;
 }
 
+.md #fakebox-text {
+  color: rgb(128, 134, 139);
+  font-family: 'Roboto', arial, sans-serif;
+  font-size: 14px;
+  left: 0;
+  padding-left: 20px;
+}
+
 html[dir=rtl] #fakebox-text {
+  left: auto;
+  right: 13px;
+}
+
+html[dir=rtl] .md #fakebox-text {
   padding-right: 20px;
   right: 0;
 }
@@ -360,15 +400,23 @@
 #fakebox-cursor {
   background: #333;
   bottom: 12px;
-  left: 20px;
+  left: 13px;
   position: absolute;
   top: 12px;
   visibility: hidden;
   width: 1px;
 }
 
+.md #fakebox-cursor {
+  left: 20px;
+}
+
 html[dir=rtl] #fakebox-cursor {
   left: auto;
+  right: 13px;
+}
+
+html[dir=rtl] .md #fakebox-cursor {
   right: 20px;
 }
 
@@ -377,20 +425,27 @@
   background-size: 24px 24px;
   bottom: 0;
   cursor: pointer;
-  margin-right: 12px;
   padding: 22px 12px 0;
   position: absolute;
   right: 0;
   top: 0;
+  width: 41px;
+}
+
+.md #fakebox-microphone {
+  margin-right: 12px;
   width: 28px;
 }
 
 html[dir=rtl] #fakebox-microphone {
   left: 0;
-  margin-left: 12px;
   right: auto;
 }
 
+html[dir=rtl] .md #fakebox-microphone {
+  margin-left: 12px;
+}
+
 @keyframes blink {
   0% {
     opacity: 1;
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index c4744a4..762ae75 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -111,6 +111,7 @@
   HIDE_NOTIFICATION: 'notice-hide',
   INITED: 'inited',  // Reveals the <body> once init() is done.
   LEFT_ALIGN_ATTRIBUTION: 'left-align-attribution',
+  MATERIAL_DESIGN: 'md',  // Applies Material Design styles to the page
   MATERIAL_DESIGN_ICONS:
       'md-icons',  // Applies Material Design styles to Most Visited.
   // Vertically centers the most visited section for a non-Google provided page.
@@ -938,9 +939,19 @@
 function enableMDIcons() {
   $(IDS.MOST_VISITED).classList.add(CLASSES.MATERIAL_DESIGN_ICONS);
   $(IDS.TILES).classList.add(CLASSES.MATERIAL_DESIGN_ICONS);
+  enableMD();
   addRippleAnimations();
 }
 
+
+/**
+ * Enables Material Design styles for all NTP components except Most Visited.
+ */
+function enableMD() {
+  document.body.classList.add(CLASSES.MATERIAL_DESIGN);
+}
+
+
 /**
  * Enables ripple animations for elements with CLASSES.RIPPLE. The target
  * element must have position relative or absolute.
@@ -1080,6 +1091,8 @@
   if (configData.isGooglePage) {
     if (configData.isMDIconsEnabled || configData.isCustomLinksEnabled) {
       enableMDIcons();
+    } else if (configData.isMDUIEnabled) {
+      enableMD();
     }
 
     if (configData.isCustomLinksEnabled) {
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.css b/chrome/browser/resources/local_ntp/most_visited_single.css
index 4b52284..c1e2a9c 100644
--- a/chrome/browser/resources/local_ntp/most_visited_single.css
+++ b/chrome/browser/resources/local_ntp/most_visited_single.css
@@ -53,19 +53,36 @@
 }
 
 #most-visited {
-  margin: 10px 0;
+  margin: 0;
   text-align: -webkit-center;
   user-select: none;
+}
+
+.md #most-visited {
+  margin: 10px 0;
   width: 100%
 }
 
-#mv-tiles {
-  display: flex;
-  flex-wrap: wrap;
+#mv-tiles,
+.mv-tiles-old {
   font-size: 0;
   /* Two rows of tiles of 128px each, and 16px of spacing between the rows.
    * If you change this, also change the corresponding values in
    * local_ntp.css. */
+  height: calc(2*var(--tile-height) + var(--tile-margin));
+  line-height: calc(var(--tile-height) + var(--tile-margin));
+  margin: 4px 0 8px 0;
+  opacity: 0;
+  position: absolute;
+  /* This align correctly for both LTR and RTL */
+  text-align: -webkit-auto;
+  transition: opacity 1s;
+  user-select: none;
+}
+
+.md #mv-tiles {
+  display: flex;
+  flex-wrap: wrap;
   height: auto;
   justify-content: center;
   line-height: normal;
@@ -73,15 +90,10 @@
   /* 5 88px tiles per row. If you change this, also change the corresponding
    * values in local_ntp.css. */
   max-width: calc(var(--md-tile-width) * var(--md-max-tiles-row));
-  opacity: 0;
   position: static;
-  /* This align correctly for both LTR and RTL */
-  text-align: -webkit-auto;
-  transition: opacity 1s;
-  user-select: none;
 }
 
-.mv-tiles-old {
+.md .mv-tiles-old {
   display: none;
 }
 
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.js b/chrome/browser/resources/local_ntp/most_visited_single.js
index 1f15847..36929c32 100644
--- a/chrome/browser/resources/local_ntp/most_visited_single.js
+++ b/chrome/browser/resources/local_ntp/most_visited_single.js
@@ -43,6 +43,7 @@
 const CLASSES = {
   FAILED_FAVICON: 'failed-favicon',  // Applied when the favicon fails to load.
   // Material Design classes.
+  MATERIAL_DESIGN: 'md',  // Applies Material Design styles to the page.
   MD_EMPTY_TILE: 'md-empty-tile',
   MD_FALLBACK_BACKGROUND: 'md-fallback-background',
   MD_FALLBACK_LETTER: 'md-fallback-letter',
@@ -975,6 +976,7 @@
   // Enable Material Design.
   if (queryArgs['enableMD'] == '1') {
     isMDEnabled = true;
+    document.body.classList.add(CLASSES.MATERIAL_DESIGN);
   }
 
   // Enable custom links.
diff --git a/chrome/browser/resources/pdf/pdf_viewer.js b/chrome/browser/resources/pdf/pdf_viewer.js
index 6b3c345..4823d72a 100644
--- a/chrome/browser/resources/pdf/pdf_viewer.js
+++ b/chrome/browser/resources/pdf/pdf_viewer.js
@@ -818,7 +818,7 @@
    */
   setUserInitiated_: function(userInitiated) {
     if (this.isUserInitiatedEvent_ == userInitiated) {
-      throw 'Trying to set user initiated to current value.';
+      throw new Error('Trying to set user initiated to current value.');
     }
     this.isUserInitiatedEvent_ = userInitiated;
   },
diff --git a/chrome/browser/resources/pdf/viewport.js b/chrome/browser/resources/pdf/viewport.js
index 1e635487..7f5cc47 100644
--- a/chrome/browser/resources/pdf/viewport.js
+++ b/chrome/browser/resources/pdf/viewport.js
@@ -367,8 +367,9 @@
    */
   setZoomInternal_: function(newZoom) {
     if (!this.allowedToChangeZoom_) {
-      throw 'Called Viewport.setZoomInternal_ without calling ' +
-          'Viewport.mightZoom_.';
+      throw new Error(
+          'Called Viewport.setZoomInternal_ without calling ' +
+          'Viewport.mightZoom_.');
     }
     // Record the scroll position (relative to the top-left of the window).
     var currentScrollPos = {
diff --git a/chrome/browser/resources/settings/internet_page/internet_detail_page.js b/chrome/browser/resources/settings/internet_page/internet_detail_page.js
index 399bbfd6..dbeec8a 100644
--- a/chrome/browser/resources/settings/internet_page/internet_detail_page.js
+++ b/chrome/browser/resources/settings/internet_page/internet_detail_page.js
@@ -412,7 +412,9 @@
    * @private
    */
   getEmptyNetworkProperties_: function() {
-    return {Type: this.networkProperties.Type};
+    const type =
+        this.networkProperties ? this.networkProperties.Type : CrOnc.Type.WI_FI;
+    return {Type: type};
   },
 
   /**
@@ -422,7 +424,7 @@
    * @private
    */
   getStateText_: function(networkProperties, outOfRange) {
-    if (!networkProperties.ConnectionState)
+    if (networkProperties === undefined || !networkProperties.ConnectionState)
       return '';
 
     if (outOfRange) {
@@ -449,7 +451,7 @@
    * @private
    */
   isRemembered_: function(networkProperties) {
-    const source = networkProperties.Source;
+    const source = networkProperties ? networkProperties.Source : null;
     return !!source && source != CrOnc.Source.NONE;
   },
 
@@ -469,7 +471,8 @@
    * @private
    */
   isCellular_: function(networkProperties) {
-    return networkProperties.Type == CrOnc.Type.CELLULAR &&
+    return networkProperties !== undefined &&
+        networkProperties.Type == CrOnc.Type.CELLULAR &&
         !!networkProperties.Cellular;
   },
 
@@ -482,7 +485,8 @@
    */
   isBlockedByPolicy_: function(
       networkProperties, globalPolicy, managedNetworkAvailable) {
-    if (networkProperties.Type != CrOnc.Type.WI_FI ||
+    if (networkProperties === undefined ||
+        networkProperties.Type != CrOnc.Type.WI_FI ||
         this.isPolicySource(networkProperties.Source) || !globalPolicy) {
       return false;
     }
@@ -504,6 +508,9 @@
    */
   showConnect_: function(
       networkProperties, globalPolicy, managedNetworkAvailable) {
+    if (networkProperties === undefined)
+      return false;
+
     if (this.isBlockedByPolicy_(
             networkProperties, globalPolicy, managedNetworkAvailable))
       return false;
@@ -523,7 +530,8 @@
    * @private
    */
   showDisconnect_: function(networkProperties) {
-    return networkProperties.Type != CrOnc.Type.ETHERNET &&
+    return networkProperties !== undefined &&
+        networkProperties.Type != CrOnc.Type.ETHERNET &&
         networkProperties.ConnectionState !=
         CrOnc.ConnectionState.NOT_CONNECTED;
   },
@@ -534,7 +542,7 @@
    * @private
    */
   showForget_: function(networkProperties) {
-    if (this.isSecondaryUser_)
+    if (this.isSecondaryUser_ || networkProperties === undefined)
       return false;
     const type = networkProperties.Type;
     if (type != CrOnc.Type.WI_FI && type != CrOnc.Type.VPN)
@@ -569,7 +577,7 @@
    */
   showConfigure_: function(
       networkProperties, globalPolicy, managedNetworkAvailable) {
-    if (this.isSecondaryUser_)
+    if (this.isSecondaryUser_ || networkProperties === undefined)
       return false;
     if (this.isBlockedByPolicy_(
             networkProperties, globalPolicy, managedNetworkAvailable))
@@ -905,8 +913,9 @@
    */
   showShared_: function(
       networkProperties, globalPolicy, managedNetworkAvailable) {
-    return (networkProperties.Source == 'Device' ||
-            networkProperties.Source == 'DevicePolicy') &&
+    return networkProperties !== undefined &&
+        (networkProperties.Source == 'Device' ||
+         networkProperties.Source == 'DevicePolicy') &&
         !this.isBlockedByPolicy_(
             networkProperties, globalPolicy, managedNetworkAvailable);
   },
@@ -920,7 +929,8 @@
    */
   showAutoConnect_: function(
       networkProperties, globalPolicy, managedNetworkAvailable) {
-    return networkProperties.Type != CrOnc.Type.ETHERNET &&
+    return networkProperties !== undefined &&
+        networkProperties.Type != CrOnc.Type.ETHERNET &&
         this.isRemembered_(networkProperties) &&
         !this.isArcVpn_(networkProperties) &&
         !this.isBlockedByPolicy_(
@@ -934,7 +944,8 @@
    * @private
    */
   enableAutoConnect_: function(networkProperties, globalPolicy) {
-    if (networkProperties.Type == CrOnc.Type.WI_FI && !!globalPolicy &&
+    if (networkProperties !== undefined &&
+        networkProperties.Type == CrOnc.Type.WI_FI && !!globalPolicy &&
         !!globalPolicy.AllowOnlyPolicyNetworksToAutoconnect &&
         !this.isPolicySource(networkProperties.Source)) {
       return false;
@@ -997,6 +1008,9 @@
    * @private
    */
   getInfoFields_: function() {
+    if (this.networkProperties === undefined)
+      return [];
+
     /** @type {!Array<string>} */ const fields = [];
     const type = this.networkProperties.Type;
     if (type == CrOnc.Type.CELLULAR && !!this.networkProperties.Cellular) {
@@ -1038,6 +1052,9 @@
    * @private
    */
   getInfoEditFieldTypes_: function() {
+    if (this.networkProperties === undefined)
+      return [];
+
     /** @dict */ const editFields = {};
     const type = this.networkProperties.Type;
     if (type == CrOnc.Type.VPN && !!this.networkProperties.VPN) {
@@ -1057,6 +1074,9 @@
    * @private
    */
   getAdvancedFields_: function() {
+    if (this.networkProperties === undefined)
+      return [];
+
     /** @type {!Array<string>} */ const fields = [];
     const type = this.networkProperties.Type;
     if (type != CrOnc.Type.TETHER)
@@ -1081,17 +1101,18 @@
    * @private
    */
   getDeviceFields_: function() {
-    /** @type {!Array<string>} */ const fields = [];
-    if (this.networkProperties.Type == CrOnc.Type.CELLULAR) {
-      fields.push(
-          'Cellular.HomeProvider.Name', 'Cellular.HomeProvider.Country',
-          'Cellular.HomeProvider.Code', 'Cellular.Manufacturer',
-          'Cellular.ModelID', 'Cellular.FirmwareRevision',
-          'Cellular.HardwareRevision', 'Cellular.ESN', 'Cellular.ICCID',
-          'Cellular.IMEI', 'Cellular.IMSI', 'Cellular.MDN', 'Cellular.MEID',
-          'Cellular.MIN', 'Cellular.PRLVersion');
+    if (this.networkProperties === undefined ||
+        this.networkProperties.Type !== CrOnc.Type.CELLULAR) {
+      return [];
     }
-    return fields;
+
+    return [
+      'Cellular.HomeProvider.Name', 'Cellular.HomeProvider.Country',
+      'Cellular.HomeProvider.Code', 'Cellular.Manufacturer', 'Cellular.ModelID',
+      'Cellular.FirmwareRevision', 'Cellular.HardwareRevision', 'Cellular.ESN',
+      'Cellular.ICCID', 'Cellular.IMEI', 'Cellular.IMSI', 'Cellular.MDN',
+      'Cellular.MEID', 'Cellular.MIN', 'Cellular.PRLVersion'
+    ];
   },
 
   /**
@@ -1100,7 +1121,8 @@
    * @private
    */
   showAdvanced_: function(networkProperties) {
-    if (networkProperties.Type == CrOnc.Type.TETHER) {
+    if (networkProperties === undefined ||
+        networkProperties.Type == CrOnc.Type.TETHER) {
       // These settings apply to the underlying WiFi network, not the Tether
       // network.
       return false;
@@ -1143,7 +1165,8 @@
    */
   hasNetworkSection_: function(
       networkProperties, globalPolicy, managedNetworkAvailable) {
-    if (networkProperties.Type == CrOnc.Type.TETHER) {
+    if (networkProperties === undefined ||
+        networkProperties.Type == CrOnc.Type.TETHER) {
       // These settings apply to the underlying WiFi network, not the Tether
       // network.
       return false;
@@ -1165,7 +1188,8 @@
    */
   hasProxySection_: function(
       networkProperties, globalPolicy, managedNetworkAvailable) {
-    if (networkProperties.Type == CrOnc.Type.TETHER) {
+    if (networkProperties === undefined ||
+        networkProperties.Type == CrOnc.Type.TETHER) {
       // Proxy settings apply to the underlying WiFi network, not the Tether
       // network.
       return false;
@@ -1182,7 +1206,8 @@
    * @private
    */
   showCellularChooseNetwork_: function(networkProperties) {
-    return networkProperties.Type == CrOnc.Type.CELLULAR &&
+    return networkProperties !== undefined &&
+        networkProperties.Type == CrOnc.Type.CELLULAR &&
         !!this.get('Cellular.SupportNetworkScan', this.networkProperties);
   },
 
@@ -1192,7 +1217,8 @@
    * @private
    */
   showCellularSim_: function(networkProperties) {
-    return networkProperties.Type == CrOnc.Type.CELLULAR &&
+    return networkProperties !== undefined &&
+        networkProperties.Type == CrOnc.Type.CELLULAR &&
         !!networkProperties.Cellular &&
         networkProperties.Cellular.Family != 'CDMA';
   },
@@ -1203,7 +1229,7 @@
    * @private
    */
   isArcVpn_: function(networkProperties) {
-    return !!networkProperties.VPN &&
+    return networkProperties !== undefined && !!networkProperties.VPN &&
         CrOnc.getActiveValue(networkProperties.VPN.Type) ==
         CrOnc.VPNType.ARCVPN;
   },
@@ -1214,7 +1240,7 @@
    * @private
    */
   isThirdPartyVpn_: function(networkProperties) {
-    return !!networkProperties.VPN &&
+    return networkProperties !== undefined && !!networkProperties.VPN &&
         CrOnc.getActiveValue(networkProperties.VPN.Type) ==
         CrOnc.VPNType.THIRD_PARTY_VPN;
   },
diff --git a/chrome/browser/resources/settings/internet_page/internet_subpage.js b/chrome/browser/resources/settings/internet_page/internet_subpage.js
index 003c91a1..e3285f7 100644
--- a/chrome/browser/resources/settings/internet_page/internet_subpage.js
+++ b/chrome/browser/resources/settings/internet_page/internet_subpage.js
@@ -161,7 +161,8 @@
 
   /** @private */
   deviceStateChanged_: function() {
-    this.showSpinner = !!this.deviceState.Scanning;
+    this.showSpinner =
+        this.deviceState !== undefined && !!this.deviceState.Scanning;
 
     // Scans should only be triggered by the "networks" subpage.
     if (settings.getCurrentRoute() != settings.routes.INTERNET_NETWORKS) {
diff --git a/chrome/browser/search/local_ntp_source.cc b/chrome/browser/search/local_ntp_source.cc
index f0ebd2c509..f22d405 100644
--- a/chrome/browser/search/local_ntp_source.cc
+++ b/chrome/browser/search/local_ntp_source.cc
@@ -152,7 +152,8 @@
 
   if (is_google) {
     AddString(translated_strings.get(), "searchboxPlaceholder",
-              IDS_GOOGLE_SEARCH_BOX_EMPTY_HINT_MD);
+              features::IsMDUIEnabled() ? IDS_GOOGLE_SEARCH_BOX_EMPTY_HINT_MD
+                                        : IDS_GOOGLE_SEARCH_BOX_EMPTY_HINT);
 
     // Custom Backgrounds
     AddString(translated_strings.get(), "customizeBackground",
@@ -504,6 +505,8 @@
                            content::BrowserAccessibilityState::GetInstance()
                                ->IsAccessibleBrowser());
 
+    config_data.SetBoolean("isMDUIEnabled", features::IsMDUIEnabled());
+
     config_data.SetBoolean("isMDIconsEnabled", features::IsMDIconsEnabled());
 
     if (is_google) {
diff --git a/chrome/browser/search/ntp_features.cc b/chrome/browser/search/ntp_features.cc
index 9667ffe..9b4fa88 100644
--- a/chrome/browser/search/ntp_features.cc
+++ b/chrome/browser/search/ntp_features.cc
@@ -11,15 +11,20 @@
 namespace features {
 
 // If enabled, the user will see a configuration UI, and be able to select
-// background images to set on the New Tab Page.
+// background images to set on the New Tab Page. Implicitly enables |kNtpIcons|.
 const base::Feature kNtpBackgrounds{"NewTabPageBackgrounds",
                                     base::FEATURE_DISABLED_BY_DEFAULT};
 
 // If enabled, the user will see the Most Visited tiles updated with Material
-// Design elements.
+// Design elements. Implicitly enables |kNtpUIMd|.
 const base::Feature kNtpIcons{"NewTabPageIcons",
                               base::FEATURE_DISABLED_BY_DEFAULT};
 
+// If enabled, the user will see the New Tab Page updated with Material Design
+// elements.
+const base::Feature kNtpUIMd{"NewTabPageUIMd",
+                             base::FEATURE_DISABLED_BY_DEFAULT};
+
 bool IsCustomLinksEnabled() {
   return ntp_tiles::IsCustomLinksEnabled();
 }
@@ -36,4 +41,14 @@
          base::FeatureList::IsEnabled(features::kExperimentalUi);
 }
 
+bool IsMDUIEnabled() {
+  return base::FeatureList::IsEnabled(kNtpUIMd) ||
+         // MD UI changes are implicitly enabled if Material Design icons,
+         // custom link, or custom backgrounds are enabled.
+         base::FeatureList::IsEnabled(kNtpIcons) ||
+         base::FeatureList::IsEnabled(kNtpBackgrounds) ||
+         base::FeatureList::IsEnabled(ntp_tiles::kNtpCustomLinks) ||
+         base::FeatureList::IsEnabled(features::kExperimentalUi);
+}
+
 }  // namespace features
diff --git a/chrome/browser/search/ntp_features.h b/chrome/browser/search/ntp_features.h
index d6a28ad4..cc591db 100644
--- a/chrome/browser/search/ntp_features.h
+++ b/chrome/browser/search/ntp_features.h
@@ -14,6 +14,7 @@
 
 extern const base::Feature kNtpBackgrounds;
 extern const base::Feature kNtpIcons;
+extern const base::Feature kNtpUIMd;
 
 // Returns whether New Tab Page custom links are enabled.
 bool IsCustomLinksEnabled();
@@ -24,6 +25,9 @@
 // Returns whether the Material Design UI for Most Visited is enabled.
 bool IsMDIconsEnabled();
 
+// Returns whether the Material Design UI is enabled on the New Tab Page.
+bool IsMDUIEnabled();
+
 }  // namespace features
 
 #endif  // CHROME_BROWSER_SEARCH_NTP_FEATURES_H_
diff --git a/chrome/browser/ssl/connection_help_tab_helper.cc b/chrome/browser/ssl/connection_help_tab_helper.cc
index 0fde728..b028844 100644
--- a/chrome/browser/ssl/connection_help_tab_helper.cc
+++ b/chrome/browser/ssl/connection_help_tab_helper.cc
@@ -6,6 +6,7 @@
 
 #include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
+#include "chrome/browser/ssl/ssl_blocking_page.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/chrome_features.h"
 #include "content/public/browser/navigation_handle.h"
@@ -35,10 +36,8 @@
 ConnectionHelpTabHelper::~ConnectionHelpTabHelper() {}
 
 void ConnectionHelpTabHelper::DidAttachInterstitialPage() {
-  GURL::Replacements replacements;
-  replacements.ClearRef();
-  if (web_contents()->GetURL().ReplaceComponents(replacements) ==
-      GetHelpCenterURL()) {
+  if (web_contents()->GetURL().EqualsIgnoringRef(GetHelpCenterURL()) ||
+      web_contents()->GetURL().EqualsIgnoringRef(GURL(kSymantecSupportUrl))) {
     UMA_HISTOGRAM_ENUMERATION(
         "SSL.CertificateErrorHelpCenterVisited",
         ConnectionHelpTabHelper::LearnMoreClickResult::kFailedWithInterstitial,
@@ -49,11 +48,9 @@
 
 void ConnectionHelpTabHelper::DidFinishNavigation(
     content::NavigationHandle* navigation_handle) {
-  GURL::Replacements replacements;
-  replacements.ClearRef();
   if (navigation_handle->IsInMainFrame() &&
-      web_contents()->GetURL().ReplaceComponents(replacements) ==
-          GetHelpCenterURL()) {
+      (web_contents()->GetURL().EqualsIgnoringRef(GetHelpCenterURL()) ||
+       web_contents()->GetURL().EqualsIgnoringRef(GURL(kSymantecSupportUrl)))) {
     LearnMoreClickResult histogram_value;
     if (navigation_handle->IsErrorPage()) {
       if (base::FeatureList::IsEnabled(features::kSSLCommittedInterstitials) &&
diff --git a/chrome/browser/ssl/ssl_blocking_page.cc b/chrome/browser/ssl/ssl_blocking_page.cc
index b723890..1cb522e0 100644
--- a/chrome/browser/ssl/ssl_blocking_page.cc
+++ b/chrome/browser/ssl/ssl_blocking_page.cc
@@ -45,9 +45,6 @@
 
 namespace {
 
-const char kSymantecSupportUrl[] =
-    "https://support.google.com/chrome?p=symantec";
-
 std::unique_ptr<ChromeMetricsHelper> CreateSslProblemMetricsHelper(
     content::WebContents* web_contents,
     int cert_error,
diff --git a/chrome/browser/ssl/ssl_blocking_page.h b/chrome/browser/ssl/ssl_blocking_page.h
index 5793d9b..2843c03 100644
--- a/chrome/browser/ssl/ssl_blocking_page.h
+++ b/chrome/browser/ssl/ssl_blocking_page.h
@@ -32,6 +32,13 @@
 
 class ChromeMetricsHelper;
 
+// URL to use as the 'Learn More' link when the interstitial is caused by
+// a "ERR_CERT_SYMANTEC_LEGACY" error, -202 fragment is included so
+// chrome://connection-help expands the right section if the user can't reach
+// the help center.
+const char kSymantecSupportUrl[] =
+    "https://support.google.com/chrome?p=symantec#-202";
+
 // This class is responsible for showing/hiding the interstitial page that is
 // shown when a certificate error happens.
 // It deletes itself when the interstitial page is closed.
diff --git a/chrome/browser/supervised_user/experimental/supervised_user_blacklist.cc b/chrome/browser/supervised_user/experimental/supervised_user_blacklist.cc
index e71d43e..e9c3b340 100644
--- a/chrome/browser/supervised_user/experimental/supervised_user_blacklist.cc
+++ b/chrome/browser/supervised_user/experimental/supervised_user_blacklist.cc
@@ -21,8 +21,7 @@
       new std::vector<SupervisedUserBlacklist::Hash>);
 
   base::MemoryMappedFile file;
-  file.Initialize(path);
-  if (!file.IsValid())
+  if (!file.Initialize(path))
     return host_hashes;
 
   size_t size = file.length();
diff --git a/chrome/browser/ui/ash/chrome_keyboard_controller_client.cc b/chrome/browser/ui/ash/chrome_keyboard_controller_client.cc
index 194cb7e..d602310 100644
--- a/chrome/browser/ui/ash/chrome_keyboard_controller_client.cc
+++ b/chrome/browser/ui/ash/chrome_keyboard_controller_client.cc
@@ -19,7 +19,6 @@
 #include "services/service_manager/public/cpp/connector.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/keyboard/keyboard_controller.h"
-#include "ui/keyboard/public/keyboard_config_util.h"
 
 namespace virtual_keyboard_private = extensions::api::virtual_keyboard_private;
 
@@ -76,7 +75,7 @@
   if (!cached_keyboard_config_) {
     // Unlikely edge case (called before the Ash mojo service replies to the
     // initial GetKeyboardConfig request). Return the default value.
-    return keyboard::GetDefaultKeyboardConfig();
+    return keyboard::mojom::KeyboardConfig();
   }
   return *cached_keyboard_config_.get();
 }
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index b5ce30cb..bdc5c42b 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/autofill/address_normalizer_factory.h"
 #include "chrome/browser/autofill/personal_data_manager_factory.h"
 #include "chrome/browser/autofill/risk_util.h"
+#include "chrome/browser/autofill/strike_database_factory.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/profiles/profile.h"
@@ -138,6 +139,18 @@
   return IdentityManagerFactory::GetForProfile(profile->GetOriginalProfile());
 }
 
+StrikeDatabase* ChromeAutofillClient::GetStrikeDatabase() {
+  Profile* profile =
+      Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+  // No need to return a StrikeDatabase in incognito mode. It is primarily used
+  // to determine whether or not to offer save of Autofill data. However, we
+  // don't allow saving of Autofill data while in incognito anyway, so an
+  // incognito code path should never get far enough to query StrikeDatabase.
+  return profile->IsOffTheRecord()
+             ? nullptr
+             : StrikeDatabaseFactory::GetForProfile(profile);
+}
+
 ukm::UkmRecorder* ChromeAutofillClient::GetUkmRecorder() {
   return ukm::UkmRecorder::Get();
 }
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h
index 907a3ab5..10db3f1 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.h
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -54,6 +54,7 @@
   PrefService* GetPrefs() override;
   syncer::SyncService* GetSyncService() override;
   identity::IdentityManager* GetIdentityManager() override;
+  StrikeDatabase* GetStrikeDatabase() override;
   ukm::UkmRecorder* GetUkmRecorder() override;
   ukm::SourceId GetUkmSourceId() override;
   AddressNormalizer* GetAddressNormalizer() override;
diff --git a/chrome/browser/ui/cryptuiapi_shim.h b/chrome/browser/ui/cryptuiapi_shim.h
index 404edcb1..a6470d90 100644
--- a/chrome/browser/ui/cryptuiapi_shim.h
+++ b/chrome/browser/ui/cryptuiapi_shim.h
@@ -13,6 +13,6 @@
 #include <windows.h>
 #include <cryptuiapi.h>
 
-#include "crypto/wincrypt_shim.h"
+#include "base/win/wincrypt_shim.h"
 
 #endif  // CHROME_BROWSER_UI_CRYPTUIAPI_SHIM_H_
diff --git a/chrome/browser/ui/search/local_ntp_browsertest.cc b/chrome/browser/ui/search/local_ntp_browsertest.cc
index c11a411..91d69df 100644
--- a/chrome/browser/ui/search/local_ntp_browsertest.cc
+++ b/chrome/browser/ui/search/local_ntp_browsertest.cc
@@ -602,7 +602,7 @@
   LocalNTPCustomLinksTest()
       : LocalNTPTest(
             /*enabled_features=*/{features::kUseGoogleLocalNtp,
-                                  features::kNtpIcons,
+                                  features::kNtpUIMd, features::kNtpIcons,
                                   ntp_tiles::kNtpCustomLinks},
             /*disabled_features=*/{}) {}
 
@@ -768,9 +768,9 @@
   LocalNTPNonMDTest()
       : LocalNTPTest(
             /*enabled_features=*/{features::kUseGoogleLocalNtp},
-            /*disabled_features=*/{features::kNtpBackgrounds,
-                                   features::kNtpIcons,
-                                   ntp_tiles::kNtpCustomLinks}) {}
+            /*disabled_features=*/{
+                features::kNtpUIMd, features::kNtpBackgrounds,
+                features::kNtpIcons, ntp_tiles::kNtpCustomLinks}) {}
 };
 
 IN_PROC_BROWSER_TEST_F(LocalNTPNonMDTest, LoadsNonMDIframe) {
diff --git a/chrome/browser/ui/toolbar/media_router_action_controller.cc b/chrome/browser/ui/toolbar/media_router_action_controller.cc
index cb35153fb..cfefe23 100644
--- a/chrome/browser/ui/toolbar/media_router_action_controller.cc
+++ b/chrome/browser/ui/toolbar/media_router_action_controller.cc
@@ -128,6 +128,13 @@
   observers_.RemoveObserver(observer);
 }
 
+bool MediaRouterActionController::ShouldEnableAction() const {
+  return shown_by_policy_ || has_local_display_route_ || has_issue_ ||
+         dialog_count_ || context_menu_shown_ ||
+         keep_visible_for_right_mouse_button_ ||
+         GetAlwaysShowActionPref(profile_);
+}
+
 MediaRouterActionController::MediaRouterActionController(
     Profile* profile,
     media_router::MediaRouter* router,
@@ -179,10 +186,3 @@
       observer.HideIcon();
   }
 }
-
-bool MediaRouterActionController::ShouldEnableAction() const {
-  return shown_by_policy_ || has_local_display_route_ || has_issue_ ||
-         dialog_count_ || context_menu_shown_ ||
-         keep_visible_for_right_mouse_button_ ||
-         GetAlwaysShowActionPref(profile_);
-}
diff --git a/chrome/browser/ui/toolbar/media_router_action_controller.h b/chrome/browser/ui/toolbar/media_router_action_controller.h
index 07c263d1..ef9a4ba 100644
--- a/chrome/browser/ui/toolbar/media_router_action_controller.h
+++ b/chrome/browser/ui/toolbar/media_router_action_controller.h
@@ -81,6 +81,10 @@
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
+  // Returns |true| if the Media Router action should be present on the toolbar
+  // or the overflow menu.
+  bool ShouldEnableAction() const;
+
  private:
   friend class MediaRouterActionControllerUnitTest;
   FRIEND_TEST_ALL_PREFIXES(MediaRouterActionControllerUnitTest,
@@ -99,10 +103,6 @@
   void MaybeAddOrRemoveComponentAction();
   void MaybeAddOrRemoveTrustedAreaIcon();
 
-  // Returns |true| if the Media Router action should be present on the toolbar
-  // or the overflow menu.
-  bool ShouldEnableAction() const;
-
   // The profile |this| is associated with. There should be one instance of this
   // class per profile.
   Profile* const profile_;
diff --git a/chrome/browser/ui/views/media_router/cast_toolbar_button.cc b/chrome/browser/ui/views/media_router/cast_toolbar_button.cc
index 10d38ea..c11598f 100644
--- a/chrome/browser/ui/views/media_router/cast_toolbar_button.cc
+++ b/chrome/browser/ui/views/media_router/cast_toolbar_button.cc
@@ -61,7 +61,6 @@
       browser_(browser),
       profile_(browser_->profile()),
       context_menu_(std::move(context_menu)) {
-  SetVisible(false);
   set_notify_action(Button::NOTIFY_ON_PRESS);
 
   EnableCanvasFlippingForRTLUI(false);
@@ -69,7 +68,10 @@
 
   ToolbarButton::Init();
   IssuesObserver::Init();
-  MediaRouterUIService::Get(profile_)->action_controller()->AddObserver(this);
+  MediaRouterActionController* controller =
+      MediaRouterUIService::Get(profile_)->action_controller();
+  controller->AddObserver(this);
+  SetVisible(controller->ShouldEnableAction());
 }
 
 CastToolbarButton::~CastToolbarButton() {
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
index 02e00f27..cb311571 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -684,10 +684,7 @@
     OffsetDoubleClickWord(offset);
   }
 
-  // Update the text to the full unelided URL. The caret is positioned at 0, as
-  // otherwise we will spuriously scroll the text to the end of the new string.
-  model()->SetUserText(full_url);
-  SetWindowTextAndCaretPos(full_url, 0, false, false);
+  model()->SetUserTextToURLForEditing();
   SelectRange(gfx::Range(start, end));
   return true;
 }
diff --git a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
index 186f9229..7ad9a51 100644
--- a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
+++ b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
@@ -68,7 +68,7 @@
           AuthenticatorRequestDialogModel::AuthenticatorReference>(
           "authenticator" /* authenticator_id */,
           base::string16() /* authenticator_display_name */,
-          AuthenticatorTransport::kInternal);
+          AuthenticatorTransport::kInternal, false /* is_in_pairing_mode */);
       model->SetSelectedAuthenticatorForTesting(test_authenticator_.get());
       model->SetCurrentStep(
           AuthenticatorRequestDialogModel::Step::kBlePinEntry);
diff --git a/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc
index 82c621a..0d04216 100644
--- a/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/multidevice_setup_screen_handler.cc
@@ -34,6 +34,8 @@
 }
 
 void MultiDeviceSetupScreenHandler::Show() {
+  AllowJavascript();
+  FireWebUIListener("multidevice_setup.initializeSetupFlow");
   ShowScreen(kScreenId);
 }
 
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index 24f9748..6d29d83 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -10,6 +10,7 @@
 
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/ash_switches.h"
+#include "base/bind.h"
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/macros.h"
@@ -32,6 +33,7 @@
 #include "chrome/browser/extensions/signin/gaia_auth_extension_loader.h"
 #include "chrome/browser/extensions/tab_helper.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/webui/about_ui.h"
 #include "chrome/browser/ui/webui/chromeos/login/active_directory_password_change_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.h"
@@ -90,11 +92,14 @@
 #include "chrome/grit/chrome_unscaled_resources.h"
 #include "chrome/grit/component_extension_resources.h"
 #include "chromeos/chromeos_switches.h"
+#include "chromeos/services/multidevice_setup/public/mojom/constants.mojom.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "components/prefs/pref_service.h"
+#include "content/public/browser/browser_context.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "content/public/common/content_switches.h"
+#include "services/service_manager/public/cpp/connector.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/base/webui/web_ui_util.h"
@@ -453,8 +458,29 @@
     oobe_display_chooser_ = std::make_unique<OobeDisplayChooser>();
 }
 
+service_manager::Connector* OobeUI::GetLoggedInUserMojoConnector() {
+  // This function should only be called after the user has logged in.
+  DCHECK(
+      user_manager::UserManager::Get()->IsUserLoggedIn() &&
+      user_manager::UserManager::Get()->GetActiveUser()->is_profile_created());
+  return content::BrowserContext::GetConnectorFor(
+      ProfileManager::GetActiveUserProfile());
+}
+
+void OobeUI::BindMultiDeviceSetup(
+    multidevice_setup::mojom::MultiDeviceSetupRequest request) {
+  GetLoggedInUserMojoConnector()->BindInterface(
+      multidevice_setup::mojom::kServiceName, std::move(request));
+}
+
+void OobeUI::BindPrivilegedHostDeviceSetter(
+    multidevice_setup::mojom::PrivilegedHostDeviceSetterRequest request) {
+  GetLoggedInUserMojoConnector()->BindInterface(
+      multidevice_setup::mojom::kServiceName, std::move(request));
+}
+
 OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url)
-    : WebUIController(web_ui) {
+    : ui::MojoWebUIController(web_ui, true /* enable_chrome_send */) {
   display_type_ = GetDisplayType(url);
 
   js_calls_container = std::make_unique<JSCallsContainer>();
@@ -479,10 +505,14 @@
   content::WebUIDataSource* html_source =
       CreateOobeUIDataSource(localized_strings, display_type_);
   content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), html_source);
+
+  AddHandlerToRegistry(base::BindRepeating(&OobeUI::BindMultiDeviceSetup,
+                                           base::Unretained(this)));
+  AddHandlerToRegistry(base::BindRepeating(
+      &OobeUI::BindPrivilegedHostDeviceSetter, base::Unretained(this)));
 }
 
-OobeUI::~OobeUI() {
-}
+OobeUI::~OobeUI() {}
 
 CoreOobeView* OobeUI::GetCoreOobeView() {
   return core_handler_;
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
index 0641452..6ae64ea 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
@@ -18,12 +18,17 @@
 #include "chrome/browser/chromeos/settings/shutdown_policy_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h"
-#include "content/public/browser/web_ui_controller.h"
+#include "chromeos/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
+#include "ui/webui/mojo_web_ui_controller.h"
 
 namespace base {
 class DictionaryValue;
 }  // namespace base
 
+namespace service_manager {
+class Connector;
+}  // namespace service_manager
+
 namespace chromeos {
 class AppDownloadingScreenView;
 class AppLaunchSplashScreenView;
@@ -76,7 +81,7 @@
 // - welcome screen (setup language/keyboard/network).
 // - eula screen (CrOS (+ OEM) EULA content/TPM password/crash reporting).
 // - update screen.
-class OobeUI : public content::WebUIController,
+class OobeUI : public ui::MojoWebUIController,
                public ShutdownPolicyHandler::Delegate {
  public:
   // List of known types of OobeUI. Type added as path in chrome://oobe url, for
@@ -228,6 +233,13 @@
   // display type.
   void ConfigureOobeDisplay();
 
+  // Adds Mojo bindings for this WebUIController.
+  service_manager::Connector* GetLoggedInUserMojoConnector();
+  void BindMultiDeviceSetup(
+      multidevice_setup::mojom::MultiDeviceSetupRequest request);
+  void BindPrivilegedHostDeviceSetter(
+      multidevice_setup::mojom::PrivilegedHostDeviceSetterRequest request);
+
   // Type of UI.
   std::string display_type_;
 
diff --git a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc
index 3dff4d9..6c7b76a6 100644
--- a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc
+++ b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc
@@ -58,11 +58,23 @@
       false /* is_minimal_style */);
 }
 
+// static
+MultiDeviceSetupDialog* MultiDeviceSetupDialog::Get() {
+  return current_instance_;
+}
+
+void MultiDeviceSetupDialog::AddOnCloseCallback(base::OnceClosure callback) {
+  on_close_callbacks_.push_back(std::move(callback));
+}
+
 MultiDeviceSetupDialog::MultiDeviceSetupDialog()
     : SystemWebDialogDelegate(GURL(chrome::kChromeUIMultiDeviceSetupUrl),
                               base::string16()) {}
 
-MultiDeviceSetupDialog::~MultiDeviceSetupDialog() = default;
+MultiDeviceSetupDialog::~MultiDeviceSetupDialog() {
+  for (auto& callback : on_close_callbacks_)
+    std::move(callback).Run();
+}
 
 void MultiDeviceSetupDialog::GetDialogSize(gfx::Size* size) const {
   size->SetSize(kDialogWidthPx, kDialogHeightPx);
diff --git a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h
index cd79039b..422b8fe 100644
--- a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h
+++ b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h
@@ -6,7 +6,9 @@
 #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_MULTIDEVICE_SETUP_MULTIDEVICE_SETUP_DIALOG_H_
 
 #include <string>
+#include <vector>
 
+#include "base/callback.h"
 #include "base/macros.h"
 #include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h"
 #include "chromeos/services/multidevice_setup/public/mojom/multidevice_setup.mojom.h"
@@ -25,6 +27,13 @@
   // no-op.
   static void Show();
 
+  // Returns the currently displayed dialog. If no dialog exists, returns
+  // nullptr.
+  static MultiDeviceSetupDialog* Get();
+
+  // Registers a callback which will be called when the dialog is closed.
+  void AddOnCloseCallback(base::OnceClosure callback);
+
  protected:
   MultiDeviceSetupDialog();
   ~MultiDeviceSetupDialog() override;
@@ -36,6 +45,10 @@
  private:
   static MultiDeviceSetupDialog* current_instance_;
 
+  // List of callbacks that have registered themselves to be invoked once this
+  // dialog is closed.
+  std::vector<base::OnceClosure> on_close_callbacks_;
+
   DISALLOW_COPY_AND_ASSIGN(MultiDeviceSetupDialog);
 };
 
diff --git a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc
index 46c92a66..b665dc9 100644
--- a/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc
+++ b/chrome/browser/ui/webui/interventions_internals/interventions_internals_page_handler_unittest.cc
@@ -41,6 +41,7 @@
 #include "net/nqe/effective_connection_type.h"
 #include "net/nqe/network_quality_estimator_params.h"
 #include "services/network/public/cpp/network_switches.h"
+#include "services/network/test/test_network_quality_tracker.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -213,15 +214,18 @@
 // Mocked TestPreviewsService for testing InterventionsInternalsPageHandler.
 class TestPreviewsUIService : public previews::PreviewsUIService {
  public:
-  TestPreviewsUIService(TestPreviewsDeciderImpl* previews_decider_impl,
-                        std::unique_ptr<previews::PreviewsLogger> logger)
+  TestPreviewsUIService(
+      TestPreviewsDeciderImpl* previews_decider_impl,
+      std::unique_ptr<previews::PreviewsLogger> logger,
+      network::TestNetworkQualityTracker* test_network_quality_tracker)
       : PreviewsUIService(previews_decider_impl,
                           nullptr, /* io_task_runner */
                           nullptr, /* previews_opt_out_store */
                           nullptr, /* previews_opt_guide */
                           base::Bind(&MockedPreviewsIsEnabled),
                           std::move(logger),
-                          blacklist::BlacklistData::AllowedTypesAndVersions()),
+                          blacklist::BlacklistData::AllowedTypesAndVersions(),
+                          test_network_quality_tracker),
         blacklist_ignored_(false) {}
   ~TestPreviewsUIService() override {}
 
@@ -250,8 +254,8 @@
     std::unique_ptr<TestPreviewsLogger> logger =
         std::make_unique<TestPreviewsLogger>();
     logger_ = logger.get();
-    previews_ui_service_ =
-        std::make_unique<TestPreviewsUIService>(&io_data, std::move(logger));
+    previews_ui_service_ = std::make_unique<TestPreviewsUIService>(
+        &io_data, std::move(logger), &test_network_quality_tracker_);
 
     ASSERT_TRUE(profile_manager_.SetUp());
 
@@ -278,6 +282,7 @@
   TestingProfileManager profile_manager_;
 
   TestPreviewsLogger* logger_;
+  network::TestNetworkQualityTracker test_network_quality_tracker_;
   std::unique_ptr<TestPreviewsUIService> previews_ui_service_;
 
   // InterventionsInternalPageHandler's variables.
diff --git a/chrome/browser/ui/webui/net_export_ui.cc b/chrome/browser/ui/webui/net_export_ui.cc
index bfdbe8e..38c8ac0 100644
--- a/chrome/browser/ui/webui/net_export_ui.cc
+++ b/chrome/browser/ui/webui/net_export_ui.cc
@@ -24,13 +24,13 @@
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/io_thread.h"
 #include "chrome/browser/net/net_export_helper.h"
+#include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/chrome_select_file_policy.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/url_constants.h"
 #include "components/grit/components_resources.h"
-#include "components/net_log/chrome_net_log.h"
 #include "components/net_log/net_export_file_writer.h"
 #include "components/net_log/net_export_ui_constants.h"
 #include "content/public/browser/browser_thread.h"
@@ -137,8 +137,7 @@
   // NetLog file.
   void ShowSelectFileDialog(const base::FilePath& default_path);
 
-  // Cache of g_browser_process->net_log()->net_export_file_writer(). This
-  // is owned by ChromeNetLog which is owned by BrowserProcessImpl.
+  // Cached pointer to SystemNetworkContextManager's NetExportFileWriter.
   net_log::NetExportFileWriter* file_writer_;
 
   ScopedObserver<net_log::NetExportFileWriter,
@@ -160,7 +159,8 @@
 };
 
 NetExportMessageHandler::NetExportMessageHandler()
-    : file_writer_(g_browser_process->net_log()->net_export_file_writer()),
+    : file_writer_(g_browser_process->system_network_context_manager()
+                       ->GetNetExportFileWriter()),
       state_observer_manager_(this),
       weak_ptr_factory_(this) {
   file_writer_->Initialize();
diff --git a/chrome/browser/ui/webui/site_settings_helper.cc b/chrome/browser/ui/webui/site_settings_helper.cc
index 457f8350..e0b755d 100644
--- a/chrome/browser/ui/webui/site_settings_helper.cc
+++ b/chrome/browser/ui/webui/site_settings_helper.cc
@@ -98,6 +98,7 @@
     {CONTENT_SETTINGS_TYPE_ACCESSIBILITY_EVENTS, nullptr},
     {CONTENT_SETTINGS_TYPE_CLIPBOARD_WRITE, nullptr},
     {CONTENT_SETTINGS_TYPE_PLUGINS_DATA, nullptr},
+    {CONTENT_SETTINGS_TYPE_BACKGROUND_FETCH, nullptr},
 };
 static_assert(arraysize(kContentSettingsTypeGroupNames) ==
                   // ContentSettingsType starts at -1, so add 1 here.
diff --git a/chrome/browser/vr/DEPS b/chrome/browser/vr/DEPS
index 62e96cd..d8903322 100644
--- a/chrome/browser/vr/DEPS
+++ b/chrome/browser/vr/DEPS
@@ -4,3 +4,10 @@
   "+cc/test",
   "+cc/trees",
 ]
+
+specific_include_rules = {
+  ".*test.*\.cc": [
+    "+device/vr/openvr/test/test_hook.h",
+    "+third_party/openvr/src/headers/openvr.h",
+  ],
+}
\ No newline at end of file
diff --git a/chrome/browser/vr/test/mock_openvr_device_hook_base.cc b/chrome/browser/vr/test/mock_openvr_device_hook_base.cc
index 6c8cfde5..1a79452 100644
--- a/chrome/browser/vr/test/mock_openvr_device_hook_base.cc
+++ b/chrome/browser/vr/test/mock_openvr_device_hook_base.cc
@@ -4,10 +4,55 @@
 
 #include "chrome/browser/vr/test/mock_openvr_device_hook_base.h"
 #include "content/public/common/service_manager_connection.h"
+#include "device/vr/openvr/test/test_hook.h"
 #include "device/vr/public/mojom/isolated_xr_service.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 
-MockOpenVRDeviceHookBase::MockOpenVRDeviceHookBase() : binding_(this) {
+// TODO(https://crbug.com/891832): Remove these conversion functions as part of
+// the switch to only mojom types.
+device_test::mojom::ControllerRole DeviceToMojoControllerRole(
+    device::ControllerRole role) {
+  switch (role) {
+    case device::kControllerRoleInvalid:
+      return device_test::mojom::ControllerRole::kControllerRoleInvalid;
+    case device::kControllerRoleRight:
+      return device_test::mojom::ControllerRole::kControllerRoleRight;
+    case device::kControllerRoleLeft:
+      return device_test::mojom::ControllerRole::kControllerRoleLeft;
+  }
+}
+
+device_test::mojom::ControllerFrameDataPtr DeviceToMojoControllerFrameData(
+    const device::ControllerFrameData& data) {
+  device_test::mojom::ControllerFrameDataPtr ret =
+      device_test::mojom::ControllerFrameData::New();
+  ret->packet_number = data.packet_number;
+  ret->buttons_pressed = data.buttons_pressed;
+  ret->buttons_touched = data.buttons_touched;
+  ret->supported_buttons = data.supported_buttons;
+  for (unsigned int i = 0; i < device::kMaxNumAxes; ++i) {
+    ret->axis_data.emplace_back(device_test::mojom::ControllerAxisData::New());
+    ret->axis_data[i]->x = data.axis_data[i].x;
+    ret->axis_data[i]->y = data.axis_data[i].y;
+    ret->axis_data[i]->axis_type = data.axis_data[i].axis_type;
+  }
+  ret->role = DeviceToMojoControllerRole(data.role);
+  ret->is_valid = data.is_valid;
+  ret->pose_data = device_test::mojom::PoseFrameData::New();
+  ret->pose_data->device_to_origin = gfx::Transform();
+  for (int row = 0; row < 4; ++row) {
+    for (int col = 0; col < 4; ++col) {
+      ret->pose_data->device_to_origin->matrix().set(
+          row, col, data.pose_data.device_to_origin[row * 4 + col]);
+    }
+  }
+  return ret;
+}
+
+MockOpenVRDeviceHookBase::MockOpenVRDeviceHookBase()
+    : tracked_classes_{device_test::mojom::TrackedDeviceClass::
+                           kTrackedDeviceInvalid},
+      binding_(this) {
   content::ServiceManagerConnection* connection =
       content::ServiceManagerConnection::GetForProcess();
   connection->GetConnector()->BindInterface(
@@ -18,6 +63,9 @@
   binding_.Bind(mojo::MakeRequest(&client));
 
   mojo::ScopedAllowSyncCallForTesting scoped_allow_sync;
+  // For now, always have the HMD connected.
+  tracked_classes_[0] =
+      device_test::mojom::TrackedDeviceClass::kTrackedDeviceHmd;
   test_hook_registration_->SetTestHook(std::move(client));
 }
 
@@ -62,3 +110,94 @@
   pose->device_to_origin = gfx::Transform();
   std::move(callback).Run(std::move(pose));
 }
+
+void MockOpenVRDeviceHookBase::WaitGetControllerRoleForTrackedDeviceIndex(
+    unsigned int index,
+    device_test::mojom::XRTestHook::
+        WaitGetControllerRoleForTrackedDeviceIndexCallback callback) {
+  auto iter = controller_data_map_.find(index);
+  auto role = iter == controller_data_map_.end()
+                  ? device_test::mojom::ControllerRole::kControllerRoleInvalid
+                  : DeviceToMojoControllerRole(iter->second.role);
+  std::move(callback).Run(role);
+}
+
+void MockOpenVRDeviceHookBase::WaitGetTrackedDeviceClass(
+    unsigned int index,
+    device_test::mojom::XRTestHook::WaitGetTrackedDeviceClassCallback
+        callback) {
+  DCHECK(index < device::kMaxTrackedDevices);
+  std::move(callback).Run(tracked_classes_[index]);
+}
+
+void MockOpenVRDeviceHookBase::WaitGetControllerData(
+    unsigned int index,
+    device_test::mojom::XRTestHook::WaitGetControllerDataCallback callback) {
+  if (tracked_classes_[index] ==
+      device_test::mojom::TrackedDeviceClass::kTrackedDeviceController) {
+    auto iter = controller_data_map_.find(index);
+    DCHECK(iter != controller_data_map_.end());
+    std::move(callback).Run(DeviceToMojoControllerFrameData(iter->second));
+    return;
+  }
+  // Default to not being valid so that controllers aren't connected unless
+  // a test specifically enables it.
+  auto data =
+      CreateValidController(device::ControllerRole::kControllerRoleInvalid);
+  data.is_valid = false;
+  std::move(callback).Run(DeviceToMojoControllerFrameData(data));
+}
+
+unsigned int MockOpenVRDeviceHookBase::ConnectController(
+    const device::ControllerFrameData& initial_data) {
+  // Find the first open tracked device slot and fill that.
+  for (unsigned int i = 0; i < device::kMaxTrackedDevices; ++i) {
+    if (tracked_classes_[i] ==
+        device_test::mojom::TrackedDeviceClass::kTrackedDeviceInvalid) {
+      tracked_classes_[i] =
+          device_test::mojom::TrackedDeviceClass::kTrackedDeviceController;
+      controller_data_map_.insert(std::make_pair(i, initial_data));
+      return i;
+    }
+  }
+  // We shouldn't be running out of slots during a test.
+  NOTREACHED();
+  // NOTREACHED should make it unnecessary to return here (as it does elsewhere
+  // in the code), but compilation fails if this is not present.
+  return device::kMaxTrackedDevices;
+}
+
+void MockOpenVRDeviceHookBase::UpdateController(
+    unsigned int index,
+    const device::ControllerFrameData& updated_data) {
+  auto iter = controller_data_map_.find(index);
+  DCHECK(iter != controller_data_map_.end());
+  iter->second = updated_data;
+}
+
+void MockOpenVRDeviceHookBase::DisconnectController(unsigned int index) {
+  DCHECK(tracked_classes_[index] ==
+         device_test::mojom::TrackedDeviceClass::kTrackedDeviceController);
+  auto iter = controller_data_map_.find(index);
+  DCHECK(iter != controller_data_map_.end());
+  controller_data_map_.erase(iter);
+  tracked_classes_[index] =
+      device_test::mojom::TrackedDeviceClass::kTrackedDeviceInvalid;
+}
+
+device::ControllerFrameData MockOpenVRDeviceHookBase::CreateValidController(
+    device::ControllerRole role) {
+  device::ControllerFrameData ret;
+  // Because why shouldn't a 64 button controller exist?
+  ret.supported_buttons = UINT64_MAX;
+  memset(ret.axis_data, 0,
+         sizeof(device::ControllerAxisData) * device::kMaxNumAxes);
+  ret.role = role;
+  ret.is_valid = true;
+  // Identity matrix.
+  ret.pose_data.device_to_origin[0] = 1;
+  ret.pose_data.device_to_origin[5] = 1;
+  ret.pose_data.device_to_origin[10] = 1;
+  ret.pose_data.device_to_origin[15] = 1;
+  return ret;
+}
diff --git a/chrome/browser/vr/test/mock_openvr_device_hook_base.h b/chrome/browser/vr/test/mock_openvr_device_hook_base.h
index cb789451..e8573f1 100644
--- a/chrome/browser/vr/test/mock_openvr_device_hook_base.h
+++ b/chrome/browser/vr/test/mock_openvr_device_hook_base.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_VR_TEST_MOCK_OPENVR_DEVICE_HOOK_BASE_H_
 #define CHROME_BROWSER_VR_TEST_MOCK_OPENVR_DEVICE_HOOK_BASE_H_
 
+#include "base/containers/flat_map.h"
+#include "device/vr/openvr/test/test_hook.h"
 #include "device/vr/public/mojom/browser_test_interfaces.mojom.h"
 #include "mojo/public/cpp/bindings/binding.h"
 
@@ -26,9 +28,35 @@
   void WaitGetMagicWindowPose(
       device_test::mojom::XRTestHook::WaitGetMagicWindowPoseCallback callback)
       override;
+  void WaitGetControllerRoleForTrackedDeviceIndex(
+      unsigned int index,
+      device_test::mojom::XRTestHook::
+          WaitGetControllerRoleForTrackedDeviceIndexCallback callback) override;
+  void WaitGetTrackedDeviceClass(
+      unsigned int index,
+      device_test::mojom::XRTestHook::WaitGetTrackedDeviceClassCallback
+          callback) override;
+  void WaitGetControllerData(
+      unsigned int index,
+      device_test::mojom::XRTestHook::WaitGetControllerDataCallback callback)
+      override;
 
+  // MockOpenVRDeviceHookBase
+  unsigned int ConnectController(
+      const device::ControllerFrameData& initial_data);
+  void UpdateController(unsigned int index,
+                        const device::ControllerFrameData& updated_data);
+  void DisconnectController(unsigned int index);
+  device::ControllerFrameData CreateValidController(
+      device::ControllerRole role);
   void StopHooking();
 
+ protected:
+  device_test::mojom::TrackedDeviceClass
+      tracked_classes_[device::kMaxTrackedDevices];
+  base::flat_map<unsigned int, device::ControllerFrameData>
+      controller_data_map_;
+
  private:
   mojo::Binding<device_test::mojom::XRTestHook> binding_;
   device_test::mojom::XRTestHookRegistrationPtr test_hook_registration_;
diff --git a/chrome/browser/vr/webxr_vr_input_browser_test.cc b/chrome/browser/vr/webxr_vr_input_browser_test.cc
index 019339d9..6302538 100644
--- a/chrome/browser/vr/webxr_vr_input_browser_test.cc
+++ b/chrome/browser/vr/webxr_vr_input_browser_test.cc
@@ -2,8 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/run_loop.h"
+#include "chrome/browser/vr/test/mock_openvr_device_hook_base.h"
 #include "chrome/browser/vr/test/webvr_browser_test.h"
 #include "chrome/browser/vr/test/webxr_vr_browser_test.h"
+#include "device/vr/openvr/test/test_hook.h"
+#include "device/vr/public/mojom/browser_test_interfaces.mojom.h"
+#include "third_party/openvr/src/headers/openvr.h"
 
 // Browser test equivalent of
 // chrome/android/javatests/src/.../browser/vr/WebXrVrInputTest.java.
@@ -30,4 +35,126 @@
   TestPresentationLocksFocusImpl(this, "webxr_test_presentation_locks_focus");
 }
 
+class WebXrControllerInputOpenVRMock : public MockOpenVRDeviceHookBase {
+ public:
+  void OnFrameSubmitted(
+      device_test::mojom::SubmittedFrameDataPtr frame_data,
+      device_test::mojom::XRTestHook::OnFrameSubmittedCallback callback) final;
+
+  void WaitNumFrames(unsigned int num_frames) {
+    DCHECK(!wait_loop_);
+    target_submitted_frames_ = num_submitted_frames_ + num_frames;
+    wait_loop_ = new base::RunLoop(base::RunLoop::Type::kNestableTasksAllowed);
+    wait_loop_->Run();
+    delete wait_loop_;
+    wait_loop_ = nullptr;
+  }
+
+  void ToggleTrigger(unsigned int index,
+                     device::ControllerFrameData& controller_data) {
+    uint64_t trigger_mask = vr::ButtonMaskFromId(vr::k_EButton_SteamVR_Trigger);
+    controller_data.packet_number++;
+    controller_data.buttons_pressed ^= trigger_mask;
+    UpdateController(index, controller_data);
+    // TODO(https://crbug.com/887726): Figure out why waiting for OpenVR to grab
+    // the updated state instead of waiting for a number of frames causes frames
+    // to be submitted at an extremely slow rate. Once fixed, switch away from
+    // waiting on number of frames.
+    WaitNumFrames(30);
+  }
+
+  void PressReleaseTrigger(unsigned int index,
+                           device::ControllerFrameData& controller_data) {
+    ToggleTrigger(index, controller_data);
+    ToggleTrigger(index, controller_data);
+  }
+
+ private:
+  base::RunLoop* wait_loop_ = nullptr;
+  unsigned int num_submitted_frames_ = 0;
+  unsigned int target_submitted_frames_ = 0;
+};
+
+void WebXrControllerInputOpenVRMock::OnFrameSubmitted(
+    device_test::mojom::SubmittedFrameDataPtr frame_data,
+    device_test::mojom::XRTestHook::OnFrameSubmittedCallback callback) {
+  num_submitted_frames_++;
+  if (wait_loop_ && target_submitted_frames_ == num_submitted_frames_) {
+    wait_loop_->Quit();
+  }
+  std::move(callback).Run();
+}
+
+// Test that OpenVR controller input is registered via WebXR's input method.
+// Equivalent to
+// WebXrVrInputTest#testControllerClicksRegisteredOnDaydream_WebXr.
+IN_PROC_BROWSER_TEST_F(WebXrVrBrowserTestStandard,
+                       REQUIRES_GPU(TestControllerInputRegistered)) {
+  WebXrControllerInputOpenVRMock my_mock;
+
+  // Connect a controller.
+  auto controller_data = my_mock.CreateValidController(
+      device::ControllerRole::kControllerRoleRight);
+  unsigned int controller_index = my_mock.ConnectController(controller_data);
+
+  // Load the test page and enter presentation.
+  this->LoadUrlAndAwaitInitialization(
+      this->GetHtmlTestFile("test_webxr_input"));
+  this->EnterSessionWithUserGestureOrFail();
+
+  unsigned int num_iterations = 10;
+  this->RunJavaScriptOrFail("stepSetupListeners(" +
+                            std::to_string(num_iterations) + ")");
+
+  // Press and unpress the controller's trigger a bunch of times and make sure
+  // they're all registered.
+  for (unsigned int i = 0; i < num_iterations; ++i) {
+    my_mock.PressReleaseTrigger(controller_index, controller_data);
+    // After each trigger release, wait for the JavaScript to receive the
+    // "select" event.
+    this->WaitOnJavaScriptStep();
+  }
+  this->EndTest();
+}
+
+// Test that OpenVR controller input is registered via the Gamepad API.
+// Equivalent to
+// WebXrVrInputTest#testControllerClicksRegisteredOnDaydream
+IN_PROC_BROWSER_TEST_F(WebVrBrowserTestStandard,
+                       REQUIRES_GPU(TestControllerInputRegistered)) {
+  WebXrControllerInputOpenVRMock my_mock;
+
+  // Connect a controller.
+  auto controller_data = my_mock.CreateValidController(
+      device::ControllerRole::kControllerRoleRight);
+  // openvr_gamepad_helper assumes axis index 1 is the trigger, so we need to
+  // set that here, otherwise it won't check whether it's pressed or not.
+  controller_data.axis_data[1].axis_type = vr::k_eControllerAxis_Trigger;
+  unsigned int controller_index = my_mock.ConnectController(controller_data);
+
+  // Load the test page and enter presentation.
+  this->LoadUrlAndAwaitInitialization(
+      this->GetHtmlTestFile("test_gamepad_button"));
+  this->EnterSessionWithUserGestureOrFail();
+
+  // We need to have this, otherwise the JavaScript side of the Gamepad API
+  // doesn't seem to pick up the correct button state? I.e. if we don't have
+  // this, openvr_gamepad_helper properly sets the gamepad's button state,
+  // but JavaScript still shows no buttons pressed.
+  // TODO(bsheedy): Figure out why this is the case.
+  my_mock.PressReleaseTrigger(controller_index, controller_data);
+
+  // Setting this in the Android version of the test needs to happen after a
+  // flakiness workaround. Coincidentally, it's also helpful for the different
+  // issue solved by the above PressReleaseTrigger, so make sure to set it here
+  // so that the above press/release isn't caught by the test code.
+  this->RunJavaScriptOrFail("canStartTest = true");
+  // Press and release the trigger, ensuring the Gamepad API detects both.
+  my_mock.ToggleTrigger(controller_index, controller_data);
+  this->WaitOnJavaScriptStep();
+  my_mock.ToggleTrigger(controller_index, controller_data);
+  this->WaitOnJavaScriptStep();
+  this->EndTest();
+}
+
 }  // namespace vr
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
index a7d3c46..cf8275bc 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -73,10 +73,12 @@
 AuthenticatorRequestDialogModel::AuthenticatorReference::AuthenticatorReference(
     base::StringPiece authenticator_id,
     base::StringPiece16 authenticator_display_name,
-    device::FidoTransportProtocol transport)
+    device::FidoTransportProtocol transport,
+    bool is_in_pairing_mode)
     : authenticator_id(authenticator_id),
       authenticator_display_name(authenticator_display_name),
-      transport(transport) {}
+      transport(transport),
+      is_in_pairing_mode(is_in_pairing_mode) {}
 AuthenticatorRequestDialogModel::AuthenticatorReference::AuthenticatorReference(
     AuthenticatorReference&& data) = default;
 AuthenticatorRequestDialogModel::AuthenticatorReference&
@@ -342,6 +344,17 @@
     it->authenticator_id = std::move(new_authenticator_id);
 }
 
+void AuthenticatorRequestDialogModel::UpdateAuthenticatorReferencePairingMode(
+    base::StringPiece authenticator_id) {
+  auto it =
+      std::find_if(saved_authenticators_.begin(), saved_authenticators_.end(),
+                   [authenticator_id](const auto& authenticator) {
+                     return authenticator.authenticator_id == authenticator_id;
+                   });
+  if (it != saved_authenticators_.end())
+    it->is_in_pairing_mode = true;
+}
+
 void AuthenticatorRequestDialogModel::SetSelectedAuthenticatorForTesting(
     AuthenticatorReference* authenticator) {
   selected_authenticator_ = authenticator;
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.h b/chrome/browser/webauthn/authenticator_request_dialog_model.h
index ad7472d..954264814 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.h
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.h
@@ -80,7 +80,8 @@
   struct AuthenticatorReference {
     AuthenticatorReference(base::StringPiece device_id,
                            base::StringPiece16 authenticator_display_name,
-                           device::FidoTransportProtocol transport);
+                           device::FidoTransportProtocol transport,
+                           bool is_in_pairing_mode);
     AuthenticatorReference(AuthenticatorReference&& data);
     AuthenticatorReference& operator=(AuthenticatorReference&& other);
 
@@ -89,6 +90,7 @@
     std::string authenticator_id;
     base::string16 authenticator_display_name;
     device::FidoTransportProtocol transport;
+    bool is_in_pairing_mode = false;
     bool dispatched = false;
   };
 
@@ -266,6 +268,9 @@
   void UpdateAuthenticatorReferenceId(base::StringPiece old_authenticator_id,
                                       std::string new_authenticator_id);
 
+  void UpdateAuthenticatorReferencePairingMode(
+      base::StringPiece authenticator_id);
+
   void SetSelectedAuthenticatorForTesting(
       AuthenticatorReference* authenticator);
 
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
index b6500ac..9b7cd01 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
@@ -476,7 +476,7 @@
       AuthenticatorRequestDialogModel::AuthenticatorReference(
           "authenticator" /* authenticator_id */,
           base::string16() /* authenticator_display_name */,
-          AuthenticatorTransport::kInternal));
+          AuthenticatorTransport::kInternal, false /* is_in_pairing_mode */));
 
   model.StartFlow(std::move(transports_info), base::nullopt);
   EXPECT_EQ(AuthenticatorRequestDialogModel::Step::kTransportSelection,
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
index d097bb3a..fd97167 100644
--- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
+++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
@@ -142,7 +142,8 @@
 void ChromeAuthenticatorRequestDelegate::RegisterActionCallbacks(
     base::OnceClosure cancel_callback,
     device::FidoRequestHandlerBase::RequestCallback request_callback,
-    base::RepeatingClosure bluetooth_adapter_power_on_callback) {
+    base::RepeatingClosure bluetooth_adapter_power_on_callback,
+    device::FidoRequestHandlerBase::BlePairingCallback ble_pairing_callback) {
   request_callback_ = request_callback;
   cancel_callback_ = std::move(cancel_callback);
 
@@ -298,7 +299,7 @@
 
   weak_dialog_model_->saved_authenticators().emplace_back(
       authenticator.GetId(), authenticator.GetDisplayName(),
-      authenticator.AuthenticatorTransport());
+      authenticator.AuthenticatorTransport(), authenticator.IsInPairingMode());
 }
 
 void ChromeAuthenticatorRequestDelegate::FidoAuthenticatorRemoved(
@@ -326,6 +327,14 @@
       old_authenticator_id, std::move(new_authenticator_id));
 }
 
+void ChromeAuthenticatorRequestDelegate::FidoAuthenticatorPairingModeChanged(
+    base::StringPiece authenticator_id) {
+  if (!weak_dialog_model_)
+    return;
+
+  weak_dialog_model_->UpdateAuthenticatorReferencePairingMode(authenticator_id);
+}
+
 void ChromeAuthenticatorRequestDelegate::BluetoothAdapterPowerChanged(
     bool is_powered_on) {
   if (!weak_dialog_model_)
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.h b/chrome/browser/webauthn/chrome_authenticator_request_delegate.h
index 93a9353..8e817375 100644
--- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.h
+++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.h
@@ -73,7 +73,9 @@
   void RegisterActionCallbacks(
       base::OnceClosure cancel_callback,
       device::FidoRequestHandlerBase::RequestCallback request_callback,
-      base::RepeatingClosure bluetooth_adapter_power_on_callback) override;
+      base::RepeatingClosure bluetooth_adapter_power_on_callback,
+      device::FidoRequestHandlerBase::BlePairingCallback ble_pairing_callback)
+      override;
   bool ShouldPermitIndividualAttestation(
       const std::string& relying_party_id) override;
   void ShouldReturnAttestation(
@@ -93,6 +95,8 @@
   void FidoAuthenticatorRemoved(base::StringPiece authenticator_id) override;
   void FidoAuthenticatorIdChanged(base::StringPiece old_authenticator_id,
                                   std::string new_authenticator_id) override;
+  void FidoAuthenticatorPairingModeChanged(
+      base::StringPiece authenticator_id) override;
   void BluetoothAdapterPowerChanged(bool is_powered_on) override;
 
   // AuthenticatorRequestDialogModel::Observer:
diff --git a/chrome/chrome_cleaner/os/system_util.h b/chrome/chrome_cleaner/os/system_util.h
index 11b29b85..bb74ddd 100644
--- a/chrome/chrome_cleaner/os/system_util.h
+++ b/chrome/chrome_cleaner/os/system_util.h
@@ -9,7 +9,7 @@
 
 #include "base/strings/string16.h"
 #include "base/win/scoped_handle.h"
-#include "crypto/wincrypt_shim.h"
+#include "base/win/wincrypt_shim.h"
 
 namespace chrome_cleaner {
 
diff --git a/chrome/common/extensions/api/accessibility_private.json b/chrome/common/extensions/api/accessibility_private.json
index eec66faa..b22ebc7 100644
--- a/chrome/common/extensions/api/accessibility_private.json
+++ b/chrome/common/extensions/api/accessibility_private.json
@@ -215,6 +215,19 @@
         "platforms": ["chromeos"]
       },
       {
+	"name": "enableChromeVoxMouseEvents",
+	"type": "function",
+	"description": "Enables or disables mouse events in ChromeVox.",
+	"parameters": [
+	  {
+	    "name": "enabled",
+	    "type": "boolean",
+	    "description": "True if ChromeVox should receive mouse events."
+	  }
+	],
+        "platforms": ["chromeos"]
+      },
+      {
         "name": "onSelectToSpeakStateChanged",
         "type": "function",
         "description": "Called by the Select-to-Speak extension when Select-to-Speak has changed states, between selecting with the mouse, speaking, and inactive.",
diff --git a/chrome/renderer/net/net_error_helper_core.cc b/chrome/renderer/net/net_error_helper_core.cc
index 6d2bda6..35ce48e 100644
--- a/chrome/renderer/net/net_error_helper_core.cc
+++ b/chrome/renderer/net/net_error_helper_core.cc
@@ -585,8 +585,13 @@
 
   // If there's no pending error page information associated with the page load,
   // or the new page is not an error page, then reset pending error page state.
-  if (!pending_error_page_info_ || page_type != ERROR_PAGE)
+  if (!pending_error_page_info_ || page_type != ERROR_PAGE) {
     CancelPendingFetches();
+  } else {
+    // Halt auto-reload if it's currently scheduled. OnFinishLoad will trigger
+    // auto-reload if appropriate.
+    PauseAutoReloadTimer();
+  }
 }
 
 void NetErrorHelperCore::OnCommitLoad(FrameType frame_type, const GURL& url) {
diff --git a/chrome/renderer/net/net_error_helper_core_unittest.cc b/chrome/renderer/net/net_error_helper_core_unittest.cc
index 34a309b..0c337a3 100644
--- a/chrome/renderer/net/net_error_helper_core_unittest.cc
+++ b/chrome/renderer/net/net_error_helper_core_unittest.cc
@@ -2114,6 +2114,27 @@
   EXPECT_EQ(0, core()->auto_reload_count());
 }
 
+// This is a regression test for http://crbug.com/881208.
+TEST_F(NetErrorHelperCoreAutoReloadTest, StopsOnErrorLoadCommit) {
+  DoErrorLoad(net::ERR_CONNECTION_RESET);
+  EXPECT_TRUE(timer()->IsRunning());
+
+  // Simulate manually reloading the error page while the timer is still
+  // running.
+  std::string html;
+  core()->PrepareErrorPage(
+      NetErrorHelperCore::MAIN_FRAME,
+      NetErrorForURL(net::ERR_CONNECTION_RESET, GURL(kFailedUrl)),
+      false /* is_failed_post */, false /* is_ignoring_cache */, &html);
+
+  core()->OnStartLoad(NetErrorHelperCore::MAIN_FRAME,
+                      NetErrorHelperCore::ERROR_PAGE);
+  EXPECT_FALSE(timer()->IsRunning());
+  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
+  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+  EXPECT_TRUE(timer()->IsRunning());
+}
+
 TEST_F(NetErrorHelperCoreAutoReloadTest, ResetsCountOnSuccess) {
   DoErrorLoad(net::ERR_CONNECTION_RESET);
   base::TimeDelta delay = timer()->GetCurrentDelay();
diff --git a/chrome/services/isolated_xr_device/xr_test_hook_wrapper.cc b/chrome/services/isolated_xr_device/xr_test_hook_wrapper.cc
index f3ed6a6..a812fa3 100644
--- a/chrome/services/isolated_xr_device/xr_test_hook_wrapper.cc
+++ b/chrome/services/isolated_xr_device/xr_test_hook_wrapper.cc
@@ -6,6 +6,37 @@
 
 namespace device {
 
+// TODO(https://crbug.com/891832): Remove these as conversion functions as part
+// of the switch to only mojom types.
+ControllerRole MojoToDeviceControllerRole(
+    device_test::mojom::ControllerRole role) {
+  switch (role) {
+    case device_test::mojom::ControllerRole::kControllerRoleInvalid:
+      return device::kControllerRoleInvalid;
+    case device_test::mojom::ControllerRole::kControllerRoleLeft:
+      return device::kControllerRoleLeft;
+    case device_test::mojom::ControllerRole::kControllerRoleRight:
+      return device::kControllerRoleRight;
+  }
+  return device::kControllerRoleInvalid;
+}
+
+PoseFrameData MojoToDevicePoseFrameData(
+    device_test::mojom::PoseFrameDataPtr& pose) {
+  PoseFrameData ret = {};
+  ret.is_valid = !!pose->device_to_origin;
+  if (ret.is_valid) {
+    for (int row = 0; row < 4; ++row) {
+      for (int col = 0; col < 4; ++col) {
+        ret.device_to_origin[row * 4 + col] =
+            pose->device_to_origin->matrix().getFloat(row, col);
+      }
+    }
+  }
+
+  return ret;
+}
+
 XRTestHookWrapper::XRTestHookWrapper(
     device_test::mojom::XRTestHookPtrInfo hook_info)
     : hook_info_(std::move(hook_info)) {}
@@ -56,18 +87,7 @@
     device_test::mojom::PoseFrameDataPtr pose;
     hook_->WaitGetPresentingPose(&pose);
     if (pose) {
-      PoseFrameData ret = {};
-      ret.is_valid = !!pose->device_to_origin;
-      if (ret.is_valid) {
-        for (int row = 0; row < 4; ++row) {
-          for (int col = 0; col < 4; ++col) {
-            ret.device_to_origin[row * 4 + col] =
-                pose->device_to_origin->matrix().getFloat(row, col);
-          }
-        }
-      }
-
-      return ret;
+      return MojoToDevicePoseFrameData(pose);
     }
   }
 
@@ -79,17 +99,69 @@
     device_test::mojom::PoseFrameDataPtr pose;
     hook_->WaitGetMagicWindowPose(&pose);
     if (pose) {
-      PoseFrameData ret = {};
-      ret.is_valid = !!pose->device_to_origin;
-      if (ret.is_valid) {
-        for (int row = 0; row < 4; ++row) {
-          for (int col = 0; col < 4; ++col) {
-            ret.device_to_origin[row * 4 + col] =
-                pose->device_to_origin->matrix().getFloat(row, col);
-          }
-        }
-      }
+      return MojoToDevicePoseFrameData(pose);
+    }
+  }
 
+  return {};
+}
+
+ControllerRole XRTestHookWrapper::WaitGetControllerRoleForTrackedDeviceIndex(
+    unsigned int index) {
+  if (hook_) {
+    device_test::mojom::ControllerRole role;
+    hook_->WaitGetControllerRoleForTrackedDeviceIndex(index, &role);
+    return MojoToDeviceControllerRole(role);
+  }
+
+  return device::kControllerRoleInvalid;
+}
+
+TrackedDeviceClass XRTestHookWrapper::WaitGetTrackedDeviceClass(
+    unsigned int index) {
+  if (hook_) {
+    device_test::mojom::TrackedDeviceClass device_class;
+    hook_->WaitGetTrackedDeviceClass(index, &device_class);
+    switch (device_class) {
+      case device_test::mojom::TrackedDeviceClass::kTrackedDeviceInvalid:
+        return device::kTrackedDeviceInvalid;
+      case device_test::mojom::TrackedDeviceClass::kTrackedDeviceHmd:
+        return device::kTrackedDeviceHmd;
+      case device_test::mojom::TrackedDeviceClass::kTrackedDeviceController:
+        return device::kTrackedDeviceController;
+      case device_test::mojom::TrackedDeviceClass::kTrackedDeviceGenericTracker:
+        return device::kTrackedDeviceGenericTracker;
+      case device_test::mojom::TrackedDeviceClass::
+          kTrackedDeviceTrackingReference:
+        return device::kTrackedDeviceTrackingReference;
+      case device_test::mojom::TrackedDeviceClass::
+          kTrackedDeviceDisplayRedirect:
+        return device::kTrackedDeviceDisplayRedirect;
+    }
+  }
+
+  return device::kTrackedDeviceInvalid;
+}
+
+ControllerFrameData XRTestHookWrapper::WaitGetControllerData(
+    unsigned int index) {
+  if (hook_) {
+    device_test::mojom::ControllerFrameDataPtr data;
+    hook_->WaitGetControllerData(index, &data);
+    if (data) {
+      ControllerFrameData ret = {};
+      ret.packet_number = data->packet_number;
+      ret.buttons_pressed = data->buttons_pressed;
+      ret.buttons_touched = data->buttons_touched;
+      ret.supported_buttons = data->supported_buttons;
+      ret.pose_data = MojoToDevicePoseFrameData(data->pose_data);
+      ret.role = MojoToDeviceControllerRole(data->role);
+      ret.is_valid = data->is_valid;
+      for (unsigned int i = 0; i < device::kMaxNumAxes; ++i) {
+        ret.axis_data[i].x = data->axis_data[i]->x;
+        ret.axis_data[i].y = data->axis_data[i]->y;
+        ret.axis_data[i].axis_type = data->axis_data[i]->axis_type;
+      }
       return ret;
     }
   }
diff --git a/chrome/services/isolated_xr_device/xr_test_hook_wrapper.h b/chrome/services/isolated_xr_device/xr_test_hook_wrapper.h
index 873c713..a615a13 100644
--- a/chrome/services/isolated_xr_device/xr_test_hook_wrapper.h
+++ b/chrome/services/isolated_xr_device/xr_test_hook_wrapper.h
@@ -25,6 +25,10 @@
   DeviceConfig WaitGetDeviceConfig() override;
   PoseFrameData WaitGetPresentingPose() override;
   PoseFrameData WaitGetMagicWindowPose() override;
+  ControllerRole WaitGetControllerRoleForTrackedDeviceIndex(
+      unsigned int index) override;
+  TrackedDeviceClass WaitGetTrackedDeviceClass(unsigned int index) override;
+  ControllerFrameData WaitGetControllerData(unsigned int index) override;
   void AttachCurrentThread() override;
   void DetachCurrentThread() override;
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index e446fd6..c719239a 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -673,6 +673,7 @@
       "../browser/net/profile_network_context_service_browsertest.cc",
       "../browser/net/proxy_browsertest.cc",
       "../browser/net/reporting_browsertest.cc",
+      "../browser/net/spdyproxy/data_reduction_proxy_browsertest.cc",
       "../browser/net/system_network_context_manager_browsertest.cc",
       "../browser/net/variations_http_headers_browsertest.cc",
       "../browser/net/websocket_browsertest.cc",
@@ -2317,6 +2318,7 @@
     "../browser/android/explore_sites/explore_sites_store_unittest.cc",
     "../browser/android/explore_sites/get_catalog_task_unittest.cc",
     "../browser/android/explore_sites/get_images_task_unittest.cc",
+    "../browser/android/explore_sites/history_statistics_reporter_unittest.cc",
     "../browser/android/explore_sites/import_catalog_task_unittest.cc",
     "../browser/android/explore_sites/ntp_json_fetcher_unittest.cc",
     "../browser/android/history_report/data_observer_unittest.cc",
@@ -2352,6 +2354,7 @@
     "../browser/autocomplete/chrome_autocomplete_scheme_classifier_unittest.cc",
     "../browser/autocomplete/search_provider_unittest.cc",
     "../browser/autocomplete/shortcuts_provider_extension_unittest.cc",
+    "../browser/background_fetch/background_fetch_permission_context_unittest.cc",
     "../browser/background_sync/background_sync_controller_impl_unittest.cc",
     "../browser/background_sync/background_sync_permission_context_unittest.cc",
     "../browser/banners/app_banner_settings_helper_unittest.cc",
diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc
index ff585414..1e96822 100644
--- a/chrome/test/base/testing_browser_process.cc
+++ b/chrome/test/base/testing_browser_process.cc
@@ -11,6 +11,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_impl.h"
+#include "chrome/browser/download/download_request_limiter.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/notifications/notification_platform_bridge.h"
 #include "chrome/browser/notifications/notification_ui_manager.h"
@@ -374,7 +375,9 @@
 }
 
 DownloadRequestLimiter* TestingBrowserProcess::download_request_limiter() {
-  return nullptr;
+  if (!download_request_limiter_)
+    download_request_limiter_ = base::MakeRefCounted<DownloadRequestLimiter>();
+  return download_request_limiter_.get();
 }
 
 net_log::ChromeNetLog* TestingBrowserProcess::net_log() {
diff --git a/chrome/test/base/testing_browser_process.h b/chrome/test/base/testing_browser_process.h
index 8344661f..1191d83 100644
--- a/chrome/test/base/testing_browser_process.h
+++ b/chrome/test/base/testing_browser_process.h
@@ -177,6 +177,7 @@
   std::unique_ptr<ProfileManager> profile_manager_;
   std::unique_ptr<NotificationUIManager> notification_ui_manager_;
   std::unique_ptr<NotificationPlatformBridge> notification_platform_bridge_;
+  scoped_refptr<DownloadRequestLimiter> download_request_limiter_;
 
 #if BUILDFLAG(ENABLE_PRINTING)
   std::unique_ptr<printing::PrintJobManager> print_job_manager_;
diff --git a/chrome/test/chromedriver/chrome/chrome.h b/chrome/test/chromedriver/chrome/chrome.h
index 98c7619..d4d82c2 100644
--- a/chrome/test/chromedriver/chrome/chrome.h
+++ b/chrome/test/chromedriver/chrome/chrome.h
@@ -7,6 +7,7 @@
 
 #include <list>
 #include <string>
+#include "base/values.h"
 
 struct BrowserInfo;
 class ChromeDesktopImpl;
@@ -41,6 +42,10 @@
                                int* width,
                                int* height) = 0;
 
+  // Sets the rect of the specified WebView
+  virtual Status SetWindowRect(const std::string& target_id,
+                               const base::DictionaryValue& params) = 0;
+
   // Sets the size of the specified WebView.
   virtual Status SetWindowSize(const std::string& target_id,
                                int width,
@@ -51,6 +56,20 @@
                                    int* x,
                                    int* y) = 0;
 
+  // Sets the on-screen position of the specified WebView.
+  virtual Status SetWindowPosition(const std::string& target_id,
+                                   int x,
+                                   int y) = 0;
+
+  // Maximizes specified WebView.
+  virtual Status MaximizeWindow(const std::string& target_id) = 0;
+
+  // Minimizes specified WebView.
+  virtual Status MinimizeWindow(const std::string& target_id) = 0;
+
+  // Opens specified WebView in full screen mode.
+  virtual Status FullScreenWindow(const std::string& target_id) = 0;
+
   // Closes the specified WebView.
   virtual Status CloseWebView(const std::string& id) = 0;
 
diff --git a/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc b/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc
index 0b4fd2f2..c5c54c4 100644
--- a/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc
+++ b/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc
@@ -230,133 +230,3 @@
     int network_connection) {
   network_connection_ = network_connection;
 }
-
-Status ChromeDesktopImpl::SetWindowRect(const std::string& target_id,
-                                        const base::DictionaryValue& params) {
-  Window window;
-  Status status = GetWindow(target_id, &window);
-  if (status.IsError())
-    return status;
-
-  auto bounds = std::make_unique<base::DictionaryValue>();
-
-  // fully exit fullscreen
-  if (window.state != "normal") {
-    auto bounds = std::make_unique<base::DictionaryValue>();
-    bounds->SetString("windowState", "normal");
-    status = SetWindowBounds(window.id, std::move(bounds));
-    if (status.IsError())
-      return status;
-  }
-
-  // window position
-  int x = 0;
-  int y = 0;
-  if (params.GetInteger("x", &x) && params.GetInteger("y", &y)) {
-    bounds->SetInteger("left", x);
-    bounds->SetInteger("top", y);
-  }
-  // window size
-  int width = 0;
-  int height = 0;
-  if (params.GetInteger("width", &width) &&
-      params.GetInteger("height", &height)) {
-    bounds->SetInteger("width", width);
-    bounds->SetInteger("height", height);
-  }
-
-  return SetWindowBounds(window.id, std::move(bounds));
-}
-
-Status ChromeDesktopImpl::SetWindowPosition(const std::string& target_id,
-                                            int x,
-                                            int y) {
-  Window window;
-  Status status = GetWindow(target_id, &window);
-  if (status.IsError())
-    return status;
-
-  if (window.state != "normal") {
-    // restore window to normal first to allow position change.
-    auto bounds = std::make_unique<base::DictionaryValue>();
-    bounds->SetString("windowState", "normal");
-    status = SetWindowBounds(window.id, std::move(bounds));
-    if (status.IsError())
-      return status;
-  }
-
-  auto bounds = std::make_unique<base::DictionaryValue>();
-  bounds->SetInteger("left", x);
-  bounds->SetInteger("top", y);
-  return SetWindowBounds(window.id, std::move(bounds));
-}
-
-Status ChromeDesktopImpl::MaximizeWindow(const std::string& target_id) {
-  Window window;
-  Status status = GetWindow(target_id, &window);
-  if (status.IsError())
-    return status;
-
-  if (window.state == "maximized")
-    return Status(kOk);
-
-  if (window.state != "normal") {
-    // always restore window to normal first, since chrome ui doesn't allow
-    // maximizing a minimized or fullscreen window.
-    auto bounds = std::make_unique<base::DictionaryValue>();
-    bounds->SetString("windowState", "normal");
-    status = SetWindowBounds(window.id, std::move(bounds));
-    if (status.IsError())
-      return status;
-  }
-
-  auto bounds = std::make_unique<base::DictionaryValue>();
-  bounds->SetString("windowState", "maximized");
-  return SetWindowBounds(window.id, std::move(bounds));
-}
-
-Status ChromeDesktopImpl::MinimizeWindow(const std::string& target_id) {
-  Window window;
-  Status status = GetWindow(target_id, &window);
-  if (status.IsError())
-    return status;
-
-  if (window.state == "minimized")
-    return Status(kOk);
-
-  if (window.state != "normal") {
-    // restore window to normal first
-    auto bounds = std::make_unique<base::DictionaryValue>();
-    bounds->SetString("windowState", "normal");
-    status = SetWindowBounds(window.id, std::move(bounds));
-    if (status.IsError())
-      return status;
-  }
-
-  auto bounds = std::make_unique<base::DictionaryValue>();
-  bounds->SetString("windowState", "minimized");
-  return SetWindowBounds(window.id, std::move(bounds));
-}
-
-Status ChromeDesktopImpl::FullScreenWindow(const std::string& target_id) {
-  Window window;
-  Status status = GetWindow(target_id, &window);
-  if (status.IsError())
-    return status;
-
-  if (window.state == "fullscreen")
-    return Status(kOk);
-
-  if (window.state != "normal") {
-    auto bounds = std::make_unique<base::DictionaryValue>();
-    bounds->SetString("windowState", "normal");
-    status = SetWindowBounds(window.id, std::move(bounds));
-    if (status.IsError())
-      return status;
-  }
-
-  auto bounds = std::make_unique<base::DictionaryValue>();
-  bounds->SetString("windowState", "fullscreen");
-  return SetWindowBounds(window.id, std::move(bounds));
-}
-
diff --git a/chrome/test/chromedriver/chrome/chrome_desktop_impl.h b/chrome/test/chromedriver/chrome/chrome_desktop_impl.h
index e9e5119..f25aead 100644
--- a/chrome/test/chromedriver/chrome/chrome_desktop_impl.h
+++ b/chrome/test/chromedriver/chrome/chrome_desktop_impl.h
@@ -65,13 +65,6 @@
   int GetNetworkConnection() const;
   void SetNetworkConnection(int network_connection);
 
-  Status SetWindowRect(const std::string& target_id,
-                       const base::DictionaryValue& params);
-  Status SetWindowPosition(const std::string& target_id, int x, int y);
-  Status MaximizeWindow(const std::string& target_id);
-  Status MinimizeWindow(const std::string& target_id);
-  Status FullScreenWindow(const std::string& target_id);
-
  private:
 
   base::Process process_;
diff --git a/chrome/test/chromedriver/chrome/chrome_impl.cc b/chrome/test/chromedriver/chrome/chrome_impl.cc
index f9cb23ac..c460432 100644
--- a/chrome/test/chromedriver/chrome/chrome_impl.cc
+++ b/chrome/test/chromedriver/chrome/chrome_impl.cc
@@ -149,6 +149,135 @@
   return Status(kOk);
 }
 
+Status ChromeImpl::SetWindowPosition(const std::string& target_id,
+                                            int x,
+                                            int y) {
+  Window window;
+  Status status = GetWindow(target_id, &window);
+  if (status.IsError())
+    return status;
+
+  if (window.state != "normal") {
+    // restore window to normal first to allow position change.
+    auto bounds = std::make_unique<base::DictionaryValue>();
+    bounds->SetString("windowState", "normal");
+    status = SetWindowBounds(window.id, std::move(bounds));
+    if (status.IsError())
+      return status;
+  }
+
+  auto bounds = std::make_unique<base::DictionaryValue>();
+  bounds->SetInteger("left", x);
+  bounds->SetInteger("top", y);
+  return SetWindowBounds(window.id, std::move(bounds));
+}
+
+Status ChromeImpl::MaximizeWindow(const std::string& target_id) {
+  Window window;
+  Status status = GetWindow(target_id, &window);
+  if (status.IsError())
+    return status;
+
+  if (window.state == "maximized")
+    return Status(kOk);
+
+  if (window.state != "normal") {
+    // always restore window to normal first, since chrome ui doesn't allow
+    // maximizing a minimized or fullscreen window.
+    auto bounds = std::make_unique<base::DictionaryValue>();
+    bounds->SetString("windowState", "normal");
+    status = SetWindowBounds(window.id, std::move(bounds));
+    if (status.IsError())
+      return status;
+  }
+
+  auto bounds = std::make_unique<base::DictionaryValue>();
+  bounds->SetString("windowState", "maximized");
+  return SetWindowBounds(window.id, std::move(bounds));
+}
+
+Status ChromeImpl::MinimizeWindow(const std::string& target_id) {
+  Window window;
+  Status status = GetWindow(target_id, &window);
+  if (status.IsError())
+    return status;
+
+  if (window.state == "minimized")
+    return Status(kOk);
+
+  if (window.state != "normal") {
+    // restore window to normal first
+    auto bounds = std::make_unique<base::DictionaryValue>();
+    bounds->SetString("windowState", "normal");
+    status = SetWindowBounds(window.id, std::move(bounds));
+    if (status.IsError())
+      return status;
+  }
+
+  auto bounds = std::make_unique<base::DictionaryValue>();
+  bounds->SetString("windowState", "minimized");
+  return SetWindowBounds(window.id, std::move(bounds));
+}
+
+Status ChromeImpl::FullScreenWindow(const std::string& target_id) {
+  Window window;
+  Status status = GetWindow(target_id, &window);
+  if (status.IsError())
+    return status;
+
+  if (window.state == "fullscreen")
+    return Status(kOk);
+
+  if (window.state != "normal") {
+    auto bounds = std::make_unique<base::DictionaryValue>();
+    bounds->SetString("windowState", "normal");
+    status = SetWindowBounds(window.id, std::move(bounds));
+    if (status.IsError())
+      return status;
+  }
+
+  auto bounds = std::make_unique<base::DictionaryValue>();
+  bounds->SetString("windowState", "fullscreen");
+  return SetWindowBounds(window.id, std::move(bounds));
+}
+
+Status ChromeImpl::SetWindowRect(const std::string& target_id,
+                                        const base::DictionaryValue& params) {
+  Window window;
+  Status status = GetWindow(target_id, &window);
+  if (status.IsError())
+    return status;
+
+  auto bounds = std::make_unique<base::DictionaryValue>();
+
+  // fully exit fullscreen
+  if (window.state != "normal") {
+    auto bounds = std::make_unique<base::DictionaryValue>();
+    bounds->SetString("windowState", "normal");
+    status = SetWindowBounds(window.id, std::move(bounds));
+    if (status.IsError())
+      return status;
+  }
+
+  // window position
+  int x = 0;
+  int y = 0;
+  if (params.GetInteger("x", &x) && params.GetInteger("y", &y)) {
+    bounds->SetInteger("left", x);
+    bounds->SetInteger("top", y);
+  }
+  // window size
+  int width = 0;
+  int height = 0;
+  if (params.GetInteger("width", &width) &&
+      params.GetInteger("height", &height)) {
+    bounds->SetInteger("width", width);
+    bounds->SetInteger("height", height);
+  }
+
+  return SetWindowBounds(window.id, std::move(bounds));
+}
+
 Status ChromeImpl::GetWindowSize(const std::string& target_id,
                                  int* width,
                                  int* height) {
diff --git a/chrome/test/chromedriver/chrome/chrome_impl.h b/chrome/test/chromedriver/chrome/chrome_impl.h
index dea5522..48dc989 100644
--- a/chrome/test/chromedriver/chrome/chrome_impl.h
+++ b/chrome/test/chromedriver/chrome/chrome_impl.h
@@ -39,7 +39,13 @@
   Status GetWindowSize(const std::string& id, int* width, int* height) override;
   Status SetWindowSize(const std::string& target_id,
                        int width, int height) override;
+  Status SetWindowRect(const std::string& target_id,
+                       const base::DictionaryValue& params) override;
   Status GetWindowPosition(const std::string& id, int* x, int* y) override;
+  Status SetWindowPosition(const std::string& target_id, int x, int y) override;
+  Status MaximizeWindow(const std::string& target_id) override;
+  Status MinimizeWindow(const std::string& target_id) override;
+  Status FullScreenWindow(const std::string& target_id) override;
   Status CloseWebView(const std::string& id) override;
   Status ActivateWebView(const std::string& id) override;
   Status SetAcceptInsecureCerts() override;
diff --git a/chrome/test/chromedriver/chrome/stub_chrome.cc b/chrome/test/chromedriver/chrome/stub_chrome.cc
index 5aa7b645..0a46d39 100644
--- a/chrome/test/chromedriver/chrome/stub_chrome.cc
+++ b/chrome/test/chromedriver/chrome/stub_chrome.cc
@@ -48,12 +48,34 @@
   return Status(kOk);
 }
 
+Status StubChrome::SetWindowRect(const std::string& target_id,
+                                 const base::DictionaryValue& params) {
+  return Status(kOk);
+}
+
 Status StubChrome::GetWindowPosition(const std::string& target_id,
                                      int* x,
                                      int* y) {
   return Status(kOk);
 }
 
+Status StubChrome::SetWindowPosition(const std::string& target_id,
+                                     int x, int y) {
+  return Status(kOk);
+}
+
+Status StubChrome::MaximizeWindow(const std::string& target_id) {
+  return Status(kOk);
+}
+
+Status StubChrome::MinimizeWindow(const std::string& target_id) {
+  return Status(kOk);
+}
+
+Status StubChrome::FullScreenWindow(const std::string& target_id) {
+  return Status(kOk);
+}
+
 Status StubChrome::CloseWebView(const std::string& id) {
   return Status(kOk);
 }
diff --git a/chrome/test/chromedriver/chrome/stub_chrome.h b/chrome/test/chromedriver/chrome/stub_chrome.h
index 68b2b6aa..6e57d4d 100644
--- a/chrome/test/chromedriver/chrome/stub_chrome.h
+++ b/chrome/test/chromedriver/chrome/stub_chrome.h
@@ -31,9 +31,15 @@
   Status GetWebViewById(const std::string& id, WebView** web_view) override;
   Status GetWindowSize(const std::string& id, int* width, int* height) override;
   Status SetWindowSize(const std::string& id, int width, int height) override;
+  Status SetWindowRect(const std::string& target_id,
+                       const base::DictionaryValue& params) override;
   Status GetWindowPosition(const std::string& target_id,
                            int* x,
                            int* y) override;
+  Status SetWindowPosition(const std::string& target_id, int x, int y) override;
+  Status MaximizeWindow(const std::string& target_id) override;
+  Status MinimizeWindow(const std::string& target_id) override;
+  Status FullScreenWindow(const std::string& target_id) override;
   Status CloseWebView(const std::string& id) override;
   Status ActivateWebView(const std::string& id) override;
   Status SetAcceptInsecureCerts() override;
diff --git a/chrome/test/chromedriver/server/http_handler.cc b/chrome/test/chromedriver/server/http_handler.cc
index 8381ca8..e0129b9 100644
--- a/chrome/test/chromedriver/server/http_handler.cc
+++ b/chrome/test/chromedriver/server/http_handler.cc
@@ -82,7 +82,10 @@
   device_manager_.reset(new DeviceManager(adb_.get()));
 
   CommandMapping commands[] = {
+      //
       // W3C standard endpoints
+      //
+
       CommandMapping(kPost, internal::kNewSessionPathPattern,
                      base::BindRepeating(
                          &ExecuteCreateSession, &session_thread_map_,
@@ -300,84 +303,12 @@
           kGet, "session/:sessionId/element/:id/screenshot",
           WrapToCommand("ElementScreenshot",
                         base::BindRepeating(&ExecuteElementScreenshot))),
-      // End of W3C standard endpoints
 
-      CommandMapping(
-          kPost, "session/:sessionId/goog/page/freeze",
-          WrapToCommand("Freeze", base::BindRepeating(&ExecuteFreeze))),
-      CommandMapping(
-          kPost, "session/:sessionId/goog/page/resume",
-          WrapToCommand("Resume", base::BindRepeating(&ExecuteResume))),
+      //
+      // Json wire protocol endpoints
+      //
 
-      // minimize/maximize oss version
-      CommandMapping(
-          kPost, "session/:sessionId/window/:windowHandle/maximize",
-          WrapToCommand("MaximizeWindow",
-                        base::BindRepeating(&ExecuteMaximizeWindow))),
-      CommandMapping(
-          kPost, "session/:sessionId/window/:windowHandle/minimize",
-          WrapToCommand("MinimizeWindow",
-                        base::BindRepeating(&ExecuteMinimizeWindow))),
-
-      // Json wire protocol only
-      // similar to /session/{session id}/window
-      CommandMapping(
-          kGet, "session/:sessionId/window_handle",
-          WrapToCommand("GetWindow",
-                        base::BindRepeating(&ExecuteGetCurrentWindowHandle))),
-
-      // similar to /session/{session id}/window/handles
-      CommandMapping(
-          kGet, "session/:sessionId/window_handles",
-          WrapToCommand("GetWindows",
-                        base::BindRepeating(&ExecuteGetWindowHandles))),
-
-      // similar to /session/{session id}/alert/dismiss
-      CommandMapping(
-          kPost, "session/:sessionId/dismiss_alert",
-          WrapToCommand(
-              "DismissAlert",
-              base::BindRepeating(&ExecuteAlertCommand,
-                                  base::BindRepeating(&ExecuteDismissAlert)))),
-
-      // similar to /session/{session id}/alert/accept
-      CommandMapping(
-          kPost, "session/:sessionId/accept_alert",
-          WrapToCommand(
-              "AcceptAlert",
-              base::BindRepeating(&ExecuteAlertCommand,
-                                  base::BindRepeating(&ExecuteAcceptAlert)))),
-      // similar to /session/{session id}/alert/text
-      CommandMapping(
-          kGet, "session/:sessionId/alert_text",
-          WrapToCommand(
-              "GetAlertMessage",
-              base::BindRepeating(&ExecuteAlertCommand,
-                                  base::BindRepeating(&ExecuteGetAlertText)))),
-      // similar to /session/{session id}/alert/text
-      CommandMapping(
-          kPost, "session/:sessionId/alert_text",
-          WrapToCommand(
-              "SetAlertPrompt",
-              base::BindRepeating(&ExecuteAlertCommand,
-                                  base::BindRepeating(&ExecuteSetAlertText)))),
-      // similar to /session/{session id}/execute/sync
-      CommandMapping(kPost, "session/:sessionId/execute",
-                     WrapToCommand("ExecuteScript",
-                                   base::BindRepeating(&ExecuteExecuteScript))),
-
-      // similar to /session/{session id}/execute/async
-      CommandMapping(
-          kPost, "session/:sessionId/execute_async",
-          WrapToCommand("ExecuteAsyncScript",
-                        base::BindRepeating(&ExecuteExecuteAsyncScript))),
-
-      // similar to /session/{session id}/execute/sync but GET request
-      CommandMapping(
-          kPost, "session/:sessionId/element/active",
-          WrapToCommand("GetActiveElement",
-                        base::BindRepeating(&ExecuteGetActiveElement))),
-
+      // No W3C equivalent.
       CommandMapping(
           kGet, "sessions",
           base::BindRepeating(
@@ -386,131 +317,173 @@
                                                &ExecuteGetSessionCapabilities)),
               &session_thread_map_)),
 
+      // No W3C equivalent.
       CommandMapping(
           kGet, "session/:sessionId",
           WrapToCommand("GetSessionCapabilities",
                         base::BindRepeating(&ExecuteGetSessionCapabilities))),
+
+      // Subset of W3C POST /session/:sessionId/timeouts.
+      CommandMapping(
+          kPost, "session/:sessionId/timeouts/implicit_wait",
+          WrapToCommand("SetImplicitWait",
+                        base::BindRepeating(&ExecuteImplicitlyWait))),
+
+      // Subset of W3C POST /session/:sessionId/timeouts.
+      CommandMapping(
+          kPost, "session/:sessionId/timeouts/async_script",
+          WrapToCommand("SetScriptTimeout",
+                        base::BindRepeating(&ExecuteSetScriptTimeout))),
+
+      // Similar to W3C GET /session/:sessionId/window.
+      CommandMapping(
+          kGet, "session/:sessionId/window_handle",
+          WrapToCommand("GetWindow",
+                        base::BindRepeating(&ExecuteGetCurrentWindowHandle))),
+
+      // Similar to W3C GET /session/:sessionId/window/handles
+      CommandMapping(
+          kGet, "session/:sessionId/window_handles",
+          WrapToCommand("GetWindows",
+                        base::BindRepeating(&ExecuteGetWindowHandles))),
+
+      // Similar to W3C POST /session/:sessionId/execute/sync.
+      CommandMapping(kPost, "session/:sessionId/execute",
+                     WrapToCommand("ExecuteScript",
+                                   base::BindRepeating(&ExecuteExecuteScript))),
+
+      // Similar to W3C POST /session/:sessionId/execute/async.
+      CommandMapping(
+          kPost, "session/:sessionId/execute_async",
+          WrapToCommand("ExecuteAsyncScript",
+                        base::BindRepeating(&ExecuteExecuteAsyncScript))),
+
+      // Subset of W3C POST /session/:sessionId/window/rect.
+      CommandMapping(kPost, "session/:sessionId/window/:windowHandle/size",
+                     WrapToCommand("SetWindowSize",
+                                   base::BindRepeating(&ExecuteSetWindowSize))),
+
+      // Subset of W3C GET /session/:sessionId/window/rect.
+      CommandMapping(kGet, "session/:sessionId/window/:windowHandle/size",
+                     WrapToCommand("GetWindowSize",
+                                   base::BindRepeating(&ExecuteGetWindowSize))),
+
+      // Subset of W3C POST /session/:sessionId/window/rect.
+      CommandMapping(
+          kPost, "session/:sessionId/window/:windowHandle/position",
+          WrapToCommand("SetWindowPosition",
+                        base::BindRepeating(&ExecuteSetWindowPosition))),
+
+      // Subset of W3C GET /session/:sessionId/window/rect.
+      CommandMapping(
+          kGet, "session/:sessionId/window/:windowHandle/position",
+          WrapToCommand("GetWindowPosition",
+                        base::BindRepeating(&ExecuteGetWindowPosition))),
+
+      // Similar to W3C POST /session/:sessionId/window/maximize.
+      CommandMapping(
+          kPost, "session/:sessionId/window/:windowHandle/maximize",
+          WrapToCommand("MaximizeWindow",
+                        base::BindRepeating(&ExecuteMaximizeWindow))),
+
+      // Similar to W3C GET /session/:sessionId/element/active, but is POST.
+      CommandMapping(
+          kPost, "session/:sessionId/element/active",
+          WrapToCommand("GetActiveElement",
+                        base::BindRepeating(&ExecuteGetActiveElement))),
+
+      // No W3C equivalent.
       CommandMapping(kPost, "session/:sessionId/element/:id/submit",
                      WrapToCommand("SubmitElement",
                                    base::BindRepeating(&ExecuteSubmitElement))),
+
+      // No W3C equivalent.
+      CommandMapping(
+          kPost, "session/:sessionId/keys",
+          WrapToCommand("Type",
+                        base::BindRepeating(&ExecuteSendKeysToActiveElement))),
+
+      // No W3C equivalent.
+      CommandMapping(kGet, "session/:sessionId/element/:id/equals/:other",
+                     WrapToCommand("IsElementEqual",
+                                   base::BindRepeating(&ExecuteElementEquals))),
+
+      // No W3C equivalent.
       CommandMapping(
           kGet, "session/:sessionId/element/:id/displayed",
           WrapToCommand("IsElementDisplayed",
                         base::BindRepeating(&ExecuteIsElementDisplayed))),
+
+      // No W3C equivalent.
       CommandMapping(
           kGet, "session/:sessionId/element/:id/location",
           WrapToCommand("GetElementLocation",
                         base::BindRepeating(&ExecuteGetElementLocation))),
 
+      // No W3C equivalent.
       CommandMapping(
           kGet, "session/:sessionId/element/:id/location_in_view",
           WrapToCommand("GetElementLocationInView",
                         base::BindRepeating(
                             &ExecuteGetElementLocationOnceScrolledIntoView))),
+
+      // No W3C equivalent.
       CommandMapping(
           kGet, "session/:sessionId/element/:id/size",
           WrapToCommand("GetElementSize",
                         base::BindRepeating(&ExecuteGetElementSize))),
-      CommandMapping(kGet, "session/:sessionId/element/:id/equals/:other",
-                     WrapToCommand("IsElementEqual",
-                                   base::BindRepeating(&ExecuteElementEquals))),
 
-      CommandMapping(kGet, "session/:sessionId/window/:windowHandle/size",
-                     WrapToCommand("GetWindowSize",
-                                   base::BindRepeating(&ExecuteGetWindowSize))),
-      CommandMapping(
-          kGet, "session/:sessionId/window/:windowHandle/position",
-          WrapToCommand("GetWindowPosition",
-                        base::BindRepeating(&ExecuteGetWindowPosition))),
-      CommandMapping(kPost, "session/:sessionId/window/:windowHandle/size",
-                     WrapToCommand("SetWindowSize",
-                                   base::BindRepeating(&ExecuteSetWindowSize))),
-
-      CommandMapping(
-          kPost, "session/:sessionId/window/:windowHandle/position",
-          WrapToCommand("SetWindowPosition",
-                        base::BindRepeating(&ExecuteSetWindowPosition))),
-      CommandMapping(
-          kPost, "session/:sessionId/timeouts/implicit_wait",
-          WrapToCommand("SetImplicitWait",
-                        base::BindRepeating(&ExecuteImplicitlyWait))),
-      CommandMapping(
-          kPost, "session/:sessionId/timeouts/async_script",
-          WrapToCommand("SetScriptTimeout",
-                        base::BindRepeating(&ExecuteSetScriptTimeout))),
-      CommandMapping(kGet, "session/:sessionId/location",
-                     WrapToCommand("GetGeolocation",
-                                   base::BindRepeating(&ExecuteGetLocation))),
-      CommandMapping(kPost, "session/:sessionId/location",
-                     WrapToCommand("SetGeolocation",
-                                   base::BindRepeating(&ExecuteSetLocation))),
-      CommandMapping(kGet, "session/:sessionId/application_cache/status",
-                     base::BindRepeating(&ExecuteGetStatus)),
-      CommandMapping(kGet, "session/:sessionId/local_storage/key/:key",
-                     WrapToCommand("GetLocalStorageItem",
-                                   base::BindRepeating(&ExecuteGetStorageItem,
-                                                       kLocalStorage))),
-      CommandMapping(
-          kDelete, "session/:sessionId/local_storage/key/:key",
-          WrapToCommand(
-              "RemoveLocalStorageItem",
-              base::BindRepeating(&ExecuteRemoveStorageItem, kLocalStorage))),
-      CommandMapping(kGet, "session/:sessionId/local_storage",
-                     WrapToCommand("GetLocalStorageKeys",
-                                   base::BindRepeating(&ExecuteGetStorageKeys,
-                                                       kLocalStorage))),
-      CommandMapping(kPost, "session/:sessionId/local_storage",
-                     WrapToCommand("SetLocalStorageKeys",
-                                   base::BindRepeating(&ExecuteSetStorageItem,
-                                                       kLocalStorage))),
-      CommandMapping(kDelete, "session/:sessionId/local_storage",
-                     WrapToCommand("ClearLocalStorage",
-                                   base::BindRepeating(&ExecuteClearStorage,
-                                                       kLocalStorage))),
-      CommandMapping(kGet, "session/:sessionId/local_storage/size",
-                     WrapToCommand("GetLocalStorageSize",
-                                   base::BindRepeating(&ExecuteGetStorageSize,
-                                                       kLocalStorage))),
-      CommandMapping(kGet, "session/:sessionId/session_storage/key/:key",
-                     WrapToCommand("GetSessionStorageItem",
-                                   base::BindRepeating(&ExecuteGetStorageItem,
-                                                       kSessionStorage))),
-      CommandMapping(
-          kDelete, "session/:sessionId/session_storage/key/:key",
-          WrapToCommand(
-              "RemoveSessionStorageItem",
-              base::BindRepeating(&ExecuteRemoveStorageItem, kSessionStorage))),
-      CommandMapping(kGet, "session/:sessionId/session_storage",
-                     WrapToCommand("GetSessionStorageKeys",
-                                   base::BindRepeating(&ExecuteGetStorageKeys,
-                                                       kSessionStorage))),
-      CommandMapping(kPost, "session/:sessionId/session_storage",
-                     WrapToCommand("SetSessionStorageItem",
-                                   base::BindRepeating(&ExecuteSetStorageItem,
-                                                       kSessionStorage))),
-      CommandMapping(kDelete, "session/:sessionId/session_storage",
-                     WrapToCommand("ClearSessionStorage",
-                                   base::BindRepeating(&ExecuteClearStorage,
-                                                       kSessionStorage))),
-      CommandMapping(kGet, "session/:sessionId/session_storage/size",
-                     WrapToCommand("GetSessionStorageSize",
-                                   base::BindRepeating(&ExecuteGetStorageSize,
-                                                       kSessionStorage))),
+      // No W3C equivalent.
       CommandMapping(
           kGet, "session/:sessionId/orientation",
           WrapToCommand("GetScreenOrientation",
                         base::BindRepeating(&ExecuteGetScreenOrientation))),
+
+      // No W3C equivalent.
       CommandMapping(
           kPost, "session/:sessionId/orientation",
           WrapToCommand("SetScreenOrientation",
                         base::BindRepeating(&ExecuteSetScreenOrientation))),
+
+      // Similar to W3C GET /session/:sessionId/alert/text.
+      CommandMapping(
+          kGet, "session/:sessionId/alert_text",
+          WrapToCommand(
+              "GetAlertMessage",
+              base::BindRepeating(&ExecuteAlertCommand,
+                                  base::BindRepeating(&ExecuteGetAlertText)))),
+
+      // Similar to W3C POST /session/:sessionId/alert/text.
+      CommandMapping(
+          kPost, "session/:sessionId/alert_text",
+          WrapToCommand(
+              "SetAlertPrompt",
+              base::BindRepeating(&ExecuteAlertCommand,
+                                  base::BindRepeating(&ExecuteSetAlertText)))),
+
+      // Similar to W3C POST /session/:sessionId/alert/accept.
+      CommandMapping(
+          kPost, "session/:sessionId/accept_alert",
+          WrapToCommand(
+              "AcceptAlert",
+              base::BindRepeating(&ExecuteAlertCommand,
+                                  base::BindRepeating(&ExecuteAcceptAlert)))),
+
+      // Similar to W3C POST /session/:sessionId/alert/dismiss.
+      CommandMapping(
+          kPost, "session/:sessionId/dismiss_alert",
+          WrapToCommand(
+              "DismissAlert",
+              base::BindRepeating(&ExecuteAlertCommand,
+                                  base::BindRepeating(&ExecuteDismissAlert)))),
+
+      // The following set of commands form a subset of W3C Actions API.
+      CommandMapping(
+          kPost, "session/:sessionId/moveto",
+          WrapToCommand("MouseMove", base::BindRepeating(&ExecuteMouseMoveTo))),
       CommandMapping(
           kPost, "session/:sessionId/click",
           WrapToCommand("Click", base::BindRepeating(&ExecuteMouseClick))),
-      CommandMapping(
-          kPost, "session/:sessionId/doubleclick",
-          WrapToCommand("DoubleClick",
-                        base::BindRepeating(&ExecuteMouseDoubleClick))),
       CommandMapping(kPost, "session/:sessionId/buttondown",
                      WrapToCommand("MouseDown", base::BindRepeating(
                                                     &ExecuteMouseButtonDown))),
@@ -518,12 +491,9 @@
           kPost, "session/:sessionId/buttonup",
           WrapToCommand("MouseUp", base::BindRepeating(&ExecuteMouseButtonUp))),
       CommandMapping(
-          kPost, "session/:sessionId/moveto",
-          WrapToCommand("MouseMove", base::BindRepeating(&ExecuteMouseMoveTo))),
-      CommandMapping(
-          kPost, "session/:sessionId/keys",
-          WrapToCommand("Type",
-                        base::BindRepeating(&ExecuteSendKeysToActiveElement))),
+          kPost, "session/:sessionId/doubleclick",
+          WrapToCommand("DoubleClick",
+                        base::BindRepeating(&ExecuteMouseDoubleClick))),
       CommandMapping(
           kPost, "session/:sessionId/touch/click",
           WrapToCommand("Tap", base::BindRepeating(&ExecuteTouchSingleTap))),
@@ -550,49 +520,140 @@
       CommandMapping(
           kPost, "session/:sessionId/touch/flick",
           WrapToCommand("TouchFlick", base::BindRepeating(&ExecuteFlick))),
+
+      // No W3C equivalent.
+      CommandMapping(kGet, "session/:sessionId/location",
+                     WrapToCommand("GetGeolocation",
+                                   base::BindRepeating(&ExecuteGetLocation))),
+
+      // No W3C equivalent.
+      CommandMapping(kPost, "session/:sessionId/location",
+                     WrapToCommand("SetGeolocation",
+                                   base::BindRepeating(&ExecuteSetLocation))),
+
+      // No W3C equivalent.
+      CommandMapping(kGet, "session/:sessionId/local_storage",
+                     WrapToCommand("GetLocalStorageKeys",
+                                   base::BindRepeating(&ExecuteGetStorageKeys,
+                                                       kLocalStorage))),
+
+      // No W3C equivalent.
+      CommandMapping(kPost, "session/:sessionId/local_storage",
+                     WrapToCommand("SetLocalStorageKeys",
+                                   base::BindRepeating(&ExecuteSetStorageItem,
+                                                       kLocalStorage))),
+
+      // No W3C equivalent.
+      CommandMapping(kDelete, "session/:sessionId/local_storage",
+                     WrapToCommand("ClearLocalStorage",
+                                   base::BindRepeating(&ExecuteClearStorage,
+                                                       kLocalStorage))),
+
+      // No W3C equivalent.
+      CommandMapping(kGet, "session/:sessionId/local_storage/key/:key",
+                     WrapToCommand("GetLocalStorageItem",
+                                   base::BindRepeating(&ExecuteGetStorageItem,
+                                                       kLocalStorage))),
+
+      // No W3C equivalent.
+      CommandMapping(
+          kDelete, "session/:sessionId/local_storage/key/:key",
+          WrapToCommand(
+              "RemoveLocalStorageItem",
+              base::BindRepeating(&ExecuteRemoveStorageItem, kLocalStorage))),
+
+      // No W3C equivalent.
+      CommandMapping(kGet, "session/:sessionId/local_storage/size",
+                     WrapToCommand("GetLocalStorageSize",
+                                   base::BindRepeating(&ExecuteGetStorageSize,
+                                                       kLocalStorage))),
+
+      // No W3C equivalent.
+      CommandMapping(kGet, "session/:sessionId/session_storage",
+                     WrapToCommand("GetSessionStorageKeys",
+                                   base::BindRepeating(&ExecuteGetStorageKeys,
+                                                       kSessionStorage))),
+
+      // No W3C equivalent.
+      CommandMapping(kPost, "session/:sessionId/session_storage",
+                     WrapToCommand("SetSessionStorageItem",
+                                   base::BindRepeating(&ExecuteSetStorageItem,
+                                                       kSessionStorage))),
+
+      // No W3C equivalent.
+      CommandMapping(kDelete, "session/:sessionId/session_storage",
+                     WrapToCommand("ClearSessionStorage",
+                                   base::BindRepeating(&ExecuteClearStorage,
+                                                       kSessionStorage))),
+
+      // No W3C equivalent.
+      CommandMapping(kGet, "session/:sessionId/session_storage/key/:key",
+                     WrapToCommand("GetSessionStorageItem",
+                                   base::BindRepeating(&ExecuteGetStorageItem,
+                                                       kSessionStorage))),
+
+      // No W3C equivalent.
+      CommandMapping(
+          kDelete, "session/:sessionId/session_storage/key/:key",
+          WrapToCommand(
+              "RemoveSessionStorageItem",
+              base::BindRepeating(&ExecuteRemoveStorageItem, kSessionStorage))),
+
+      // No W3C equivalent.
+      CommandMapping(kGet, "session/:sessionId/session_storage/size",
+                     WrapToCommand("GetSessionStorageSize",
+                                   base::BindRepeating(&ExecuteGetStorageSize,
+                                                       kSessionStorage))),
+
+      // No W3C equivalent.
       CommandMapping(
           kPost, "session/:sessionId/log",
           WrapToCommand("GetLog", base::BindRepeating(&ExecuteGetLog))),
+
+      // No W3C equivalent.
       CommandMapping(
           kGet, "session/:sessionId/log/types",
           WrapToCommand("GetLogTypes",
                         base::BindRepeating(&ExecuteGetAvailableLogTypes))),
 
-      // extension commands
+      // No W3C equivalent.
+      CommandMapping(kGet, "session/:sessionId/application_cache/status",
+                     base::BindRepeating(&ExecuteGetStatus)),
+
+      //
+      // Extension commands from other specs.
+      //
+
+      // Extension for Reporting API:
+      // https://w3c.github.io/reporting/#generate-test-report-command
       CommandMapping(
           kPost, "session/:sessionId/reporting/generate_test_report",
           WrapToCommand("GenerateTestReport",
                         base::BindRepeating(&ExecuteGenerateTestReport))),
 
-      // chromedriver only
-      CommandMapping(
-          kPost, "session/:sessionId/chromium/launch_app",
-          WrapToCommand("LaunchApp", base::BindRepeating(&ExecuteLaunchApp))),
-      CommandMapping(kGet, "session/:sessionId/alert",
-                     WrapToCommand("IsAlertOpen",
-                                   base::BindRepeating(
-                                       &ExecuteAlertCommand,
-                                       base::BindRepeating(&ExecuteGetAlert)))),
-      CommandMapping(
-          kGet, "session/:sessionId/chromium/heap_snapshot",
-          WrapToCommand("HeapSnapshot",
-                        base::BindRepeating(&ExecuteTakeHeapSnapshot))),
-      CommandMapping(
-          kPost, "session/:sessionId/file",
-          WrapToCommand("UploadFile", base::BindRepeating(&ExecuteUploadFile))),
-      CommandMapping(
-          kGet, "session/:sessionId/element/:id/value",
-          WrapToCommand("GetElementValue",
-                        base::BindRepeating(&ExecuteGetElementValue))),
-      CommandMapping(
-          kPost, "session/:sessionId/element/:id/hover",
-          WrapToCommand("HoverElement",
-                        base::BindRepeating(&ExecuteHoverOverElement))),
+      // Extensions from Mobile JSON Wire Protocol:
+      // https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md
       CommandMapping(
           kGet, "session/:sessionId/network_connection",
           WrapToCommand("GetNetworkConnection",
                         base::BindRepeating(&ExecuteGetNetworkConnection))),
       CommandMapping(
+          kPost, "session/:sessionId/network_connection",
+          WrapToCommand("SetNetworkConnection",
+                        base::BindRepeating(&ExecuteSetNetworkConnection))),
+
+      //
+      // ChromeDriver specific extension commands.
+      //
+
+      CommandMapping(
+          kPost, "session/:sessionId/chromium/launch_app",
+          WrapToCommand("LaunchApp", base::BindRepeating(&ExecuteLaunchApp))),
+      CommandMapping(
+          kGet, "session/:sessionId/chromium/heap_snapshot",
+          WrapToCommand("HeapSnapshot",
+                        base::BindRepeating(&ExecuteTakeHeapSnapshot))),
+      CommandMapping(
           kGet, "session/:sessionId/chromium/network_conditions",
           WrapToCommand("GetNetworkConditions",
                         base::BindRepeating(&ExecuteGetNetworkConditions))),
@@ -604,6 +665,50 @@
           kDelete, "session/:sessionId/chromium/network_conditions",
           WrapToCommand("DeleteNetworkConditions",
                         base::BindRepeating(&ExecuteDeleteNetworkConditions))),
+      CommandMapping(kPost, "session/:sessionId/chromium/send_command",
+                     WrapToCommand("SendCommand",
+                                   base::BindRepeating(&ExecuteSendCommand))),
+      CommandMapping(
+          kPost, "session/:sessionId/goog/cdp/execute",
+          WrapToCommand("ExecuteCDP",
+                        base::BindRepeating(&ExecuteSendCommandAndGetResult))),
+      CommandMapping(
+          kPost, "session/:sessionId/chromium/send_command_and_get_result",
+          WrapToCommand("SendCommandAndGetResult",
+                        base::BindRepeating(&ExecuteSendCommandAndGetResult))),
+      CommandMapping(
+          kPost, "session/:sessionId/goog/page/freeze",
+          WrapToCommand("Freeze", base::BindRepeating(&ExecuteFreeze))),
+      CommandMapping(
+          kPost, "session/:sessionId/goog/page/resume",
+          WrapToCommand("Resume", base::BindRepeating(&ExecuteResume))),
+
+      //
+      // Commands of unknown origins.
+      //
+
+      // Similar to W3C POST /session/:sessionId/window/minimize.
+      CommandMapping(
+          kPost, "session/:sessionId/window/:windowHandle/minimize",
+          WrapToCommand("MinimizeWindow",
+                        base::BindRepeating(&ExecuteMinimizeWindow))),
+
+      CommandMapping(kGet, "session/:sessionId/alert",
+                     WrapToCommand("IsAlertOpen",
+                                   base::BindRepeating(
+                                       &ExecuteAlertCommand,
+                                       base::BindRepeating(&ExecuteGetAlert)))),
+      CommandMapping(
+          kPost, "session/:sessionId/file",
+          WrapToCommand("UploadFile", base::BindRepeating(&ExecuteUploadFile))),
+      CommandMapping(
+          kGet, "session/:sessionId/element/:id/value",
+          WrapToCommand("GetElementValue",
+                        base::BindRepeating(&ExecuteGetElementValue))),
+      CommandMapping(
+          kPost, "session/:sessionId/element/:id/hover",
+          WrapToCommand("HoverElement",
+                        base::BindRepeating(&ExecuteHoverOverElement))),
       CommandMapping(
           kDelete, "session/:sessionId/orientation",
           WrapToCommand("DeleteScreenOrientation",
@@ -634,23 +739,6 @@
       CommandMapping(
           kPost, "session/:sessionId/touch/pinch",
           WrapToCommand("TouchPinch", base::BindRepeating(&ExecuteTouchPinch))),
-      CommandMapping(kPost, "session/:sessionId/chromium/send_command",
-                     WrapToCommand("SendCommand",
-                                   base::BindRepeating(&ExecuteSendCommand))),
-      CommandMapping(
-          kPost, "session/:sessionId/goog/cdp/execute",
-          WrapToCommand("ExecuteCDP",
-                        base::BindRepeating(&ExecuteSendCommandAndGetResult))),
-      CommandMapping(
-          kPost, "session/:sessionId/chromium/send_command_and_get_result",
-          WrapToCommand("SendCommandAndGetResult",
-                        base::BindRepeating(&ExecuteSendCommandAndGetResult))),
-
-      // mobile json protocol cmomand
-      CommandMapping(
-          kPost, "session/:sessionId/network_connection",
-          WrapToCommand("SetNetworkConnection",
-                        base::BindRepeating(&ExecuteSetNetworkConnection))),
   };
   command_map_.reset(
       new CommandMap(commands, commands + arraysize(commands)));
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc
index f51c2d8..7a4d767b 100644
--- a/chrome/test/chromedriver/session_commands.cc
+++ b/chrome/test/chromedriver/session_commands.cc
@@ -929,13 +929,9 @@
   if (!params.GetDouble("x", &x) || !params.GetDouble("y", &y))
     return Status(kUnknownError, "missing or invalid 'x' or 'y'");
 
-  ChromeDesktopImpl* desktop = NULL;
-  Status status = session->chrome->GetAsDesktop(&desktop);
-  if (status.IsError())
-    return status;
-
-  return desktop->SetWindowPosition(session->window, static_cast<int>(x),
-                                      static_cast<int>(y));
+  return session->chrome->SetWindowPosition(session->window,
+                                            static_cast<int>(x),
+                                            static_cast<int>(y));
 }
 
 Status ExecuteGetWindowSize(Session* session,
@@ -963,11 +959,6 @@
   double x = 0;
   double y = 0;
 
-  ChromeDesktopImpl* desktop = NULL;
-  Status status = session->chrome->GetAsDesktop(&desktop);
-  if (status.IsError())
-    return status;
-
   // to pass to the set window rect command
   base::DictionaryValue rect_params;
 
@@ -981,7 +972,7 @@
     rect_params.SetInteger("width", static_cast<int>(width));
     rect_params.SetInteger("height", static_cast<int>(height));
   }
-  status = desktop->SetWindowRect(session->window, rect_params);
+  Status status = session->chrome->SetWindowRect(session->window, rect_params);
   if (status.IsError())
     return status;
 
@@ -1006,12 +997,7 @@
 Status ExecuteMaximizeWindow(Session* session,
                              const base::DictionaryValue& params,
                              std::unique_ptr<base::Value>* value) {
-  ChromeDesktopImpl* desktop = NULL;
-  Status status = session->chrome->GetAsDesktop(&desktop);
-  if (status.IsError())
-    return status;
-
-  status = desktop->MaximizeWindow(session->window);
+  Status status = session->chrome->MaximizeWindow(session->window);
   if (status.IsError())
     return status;
 
@@ -1021,12 +1007,7 @@
 Status ExecuteMinimizeWindow(Session* session,
                              const base::DictionaryValue& params,
                              std::unique_ptr<base::Value>* value) {
-  ChromeDesktopImpl* desktop = NULL;
-  Status status = session->chrome->GetAsDesktop(&desktop);
-  if (status.IsError())
-    return status;
-
-  status = desktop->MinimizeWindow(session->window);
+  Status status = session->chrome->MinimizeWindow(session->window);
   if (status.IsError())
     return status;
 
@@ -1036,12 +1017,7 @@
 Status ExecuteFullScreenWindow(Session* session,
                                const base::DictionaryValue& params,
                                std::unique_ptr<base::Value>* value) {
-  ChromeDesktopImpl* desktop = NULL;
-  Status status = session->chrome->GetAsDesktop(&desktop);
-  if (status.IsError())
-    return status;
-
-  status = desktop->FullScreenWindow(session->window);
+  Status status = session->chrome->FullScreenWindow(session->window);
   if (status.IsError())
     return status;
 
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index 4cdf7e7..8e3e99f 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -135,16 +135,12 @@
     'ChromeDriverTest.testWindowMinimize',
     # https://bugs.chromium.org/p/chromedriver/issues/detail?id=2522
     'ChromeDriverTest.testWindowMaximize',
+    # https://bugs.chromium.org/p/chromedriver/issues/detail?id=1945
+    'ChromeDriverTest.testWindowFullScreen',
 ]
 
 _OS_VERSION_SPECIFIC_FILTER = {}
 _OS_VERSION_SPECIFIC_FILTER['mac', '68'] = [
-    # https://bugs.chromium.org/p/chromedriver/issues/detail?id=1945
-    'ChromeDriverTest.testWindowFullScreen',
-]
-_OS_VERSION_SPECIFIC_FILTER['mac', '69'] = [
-    # https://bugs.chromium.org/p/chromedriver/issues/detail?id=1945
-    'ChromeDriverTest.testWindowFullScreen',
 ]
 
 _DESKTOP_NEGATIVE_FILTER = [
diff --git a/chrome/test/data/frame_tree/invalid_link_to_new_window.html b/chrome/test/data/frame_tree/invalid_link_to_new_window.html
new file mode 100644
index 0000000..a98881ee0
--- /dev/null
+++ b/chrome/test/data/frame_tree/invalid_link_to_new_window.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<html>
+<head>
+<script>
+function simulateClick() {
+  var evt = new MouseEvent("click", {});
+  target = document.getElementById("invalid_url_link");
+  return target.dispatchEvent(evt);
+}
+</script>
+</head>
+<body>
+<a href="a.a:@javascript:foo()"
+   id="invalid_url_link"
+   target="win">Link to invalid URL in new window</a>
+</body>
+</html>
diff --git a/chrome/test/data/local_ntp/local_ntp_browsertest.js b/chrome/test/data/local_ntp/local_ntp_browsertest.js
index a9e196d3..76b2111 100644
--- a/chrome/test/data/local_ntp/local_ntp_browsertest.js
+++ b/chrome/test/data/local_ntp/local_ntp_browsertest.js
@@ -73,6 +73,32 @@
       window.chrome.embeddedSearch.newTabPage.mostVisited[0].rid));
 };
 
+/**
+ * Tests that the GM2 style is applied when the flag is enabled.
+ */
+test.localNtp.testMDApplied = function() {
+  // Turn off voice search to avoid reinitializing the speech object
+  configData.isVoiceSearchEnabled = false;
+
+  configData.isMDUIEnabled = true;
+  initLocalNTP(/*isGooglePage=*/true);
+  assertTrue(document.body.classList.contains('md'));
+}
+
+/**
+ * Tests that the GM2 style is not applied when the flag is disabled.
+ */
+test.localNtp.testMDNotApplied = function() {
+  // Turn off voice search to avoid reinitializing the speech object
+  configData.isVoiceSearchEnabled = false;
+
+  configData.isMDUIEnabled = false;
+  configData.isMDIconsEnabled = false;
+  configData.isCustomLinksEnabled = false;
+  initLocalNTP(/*isGooglePage=*/true);
+  assertFalse(document.body.classList.contains('md'));
+}
+
 
 // ****************************** ADVANCED TESTS ******************************
 // Advanced tests are controlled from the native side. The helpers here are
diff --git a/chrome/test/data/webui/settings/internet_page_tests.js b/chrome/test/data/webui/settings/internet_page_tests.js
index a168cac4..738fc30 100644
--- a/chrome/test/data/webui/settings/internet_page_tests.js
+++ b/chrome/test/data/webui/settings/internet_page_tests.js
@@ -336,6 +336,7 @@
             // Call setTimeout to populate iron-list.
             return new Promise((resolve) => {
               setTimeout(function() {
+                Polymer.dom.flush();
                 resolve();
               });
             });
diff --git a/chromecast/browser/cast_browser_main_parts.cc b/chromecast/browser/cast_browser_main_parts.cc
index 95da9925..47b5ec2 100644
--- a/chromecast/browser/cast_browser_main_parts.cc
+++ b/chromecast/browser/cast_browser_main_parts.cc
@@ -314,25 +314,25 @@
 
 CastBrowserMainParts::CastBrowserMainParts(
     const content::MainFunctionParams& parameters,
-    URLRequestContextFactory* url_request_context_factory)
+    URLRequestContextFactory* url_request_context_factory,
+    CastContentBrowserClient* cast_content_browser_client)
     : BrowserMainParts(),
       cast_browser_process_(new CastBrowserProcess()),
       field_trial_list_(nullptr),
       parameters_(parameters),
+      cast_content_browser_client_(cast_content_browser_client),
       url_request_context_factory_(url_request_context_factory),
       net_log_(new CastNetLog()),
       media_caps_(new media::MediaCapsImpl()) {
+  DCHECK(cast_content_browser_client);
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   AddDefaultCommandLineSwitches(command_line);
-
-#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
-  media_resource_tracker_ = nullptr;
-#endif  // BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
 }
 
 CastBrowserMainParts::~CastBrowserMainParts() {
 #if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
-  if (media_thread_ && media_pipeline_backend_manager_) {
+  if (cast_content_browser_client_->GetMediaTaskRunner() &&
+      media_pipeline_backend_manager_) {
     // Make sure that media_pipeline_backend_manager_ is destroyed after any
     // pending media thread tasks. The CastAudioOutputStream implementation
     // calls into media_pipeline_backend_manager_ when the stream is closed;
@@ -344,44 +344,19 @@
     // the media_pipeline_backend_manager_ using DeleteSoon on the media thread,
     // it is guaranteed that the AudioManager and all AudioOutputStreams have
     // been destroyed before media_pipeline_backend_manager_ is destroyed.
-    media_thread_->task_runner()->DeleteSoon(
+    cast_content_browser_client_->GetMediaTaskRunner()->DeleteSoon(
         FROM_HERE, media_pipeline_backend_manager_.release());
   }
 #endif  // BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
 }
 
-scoped_refptr<base::SingleThreadTaskRunner>
-CastBrowserMainParts::GetMediaTaskRunner() {
 #if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
-  if (!media_thread_) {
-    media_thread_.reset(new base::Thread("CastMediaThread"));
-    base::Thread::Options options;
-    options.priority = base::ThreadPriority::REALTIME_AUDIO;
-    CHECK(media_thread_->StartWithOptions(options));
-    // Start the media_resource_tracker as soon as the media thread is created.
-    // There are services that run on the media thread that depend on it,
-    // and we want to initialize it with the correct task runner before any
-    // tasks that might use it are posted to the media thread.
-    media_resource_tracker_ = new media::MediaResourceTracker(
-        base::ThreadTaskRunnerHandle::Get(), media_thread_->task_runner());
-  }
-  return media_thread_->task_runner();
-#else
-  return nullptr;
-#endif  // BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
-}
-
-#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
-media::MediaResourceTracker* CastBrowserMainParts::media_resource_tracker() {
-  DCHECK(media_thread_);
-  return media_resource_tracker_;
-}
-
 media::MediaPipelineBackendManager*
 CastBrowserMainParts::media_pipeline_backend_manager() {
   if (!media_pipeline_backend_manager_) {
-    media_pipeline_backend_manager_.reset(
-        new media::MediaPipelineBackendManager(GetMediaTaskRunner()));
+    media_pipeline_backend_manager_ =
+        std::make_unique<media::MediaPipelineBackendManager>(
+            cast_content_browser_client_->GetMediaTaskRunner());
   }
   return media_pipeline_backend_manager_.get();
 }
@@ -550,7 +525,8 @@
   gfx::Size display_size =
       display::Screen::GetScreen()->GetPrimaryDisplay().GetSizeInPixel();
   video_plane_controller_.reset(new media::VideoPlaneController(
-      Size(display_size.width(), display_size.height()), GetMediaTaskRunner()));
+      Size(display_size.width(), display_size.height()),
+      cast_content_browser_client_->GetMediaTaskRunner()));
   viz::OverlayStrategyUnderlayCast::SetOverlayCompositedCallback(
       base::BindRepeating(&media::VideoPlaneController::SetGeometry,
                           base::Unretained(video_plane_controller_.get())));
@@ -580,7 +556,7 @@
   cast_browser_process_->cast_service()->Initialize();
 
 #if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
-  media_resource_tracker()->InitializeMediaLib();
+  cast_content_browser_client_->media_resource_tracker()->InitializeMediaLib();
 #endif
   ::media::InitializeMediaLibrary();
   media_caps_->Initialize();
@@ -711,9 +687,8 @@
 
 void CastBrowserMainParts::PostDestroyThreads() {
 #if !defined(OS_ANDROID)
-  media_resource_tracker_->FinalizeAndDestroy();
-  media_resource_tracker_ = nullptr;
-#endif
+  cast_content_browser_client_->ResetMediaResourceTracker();
+#endif  // !defined(OS_ANDROID)
 }
 
 }  // namespace shell
diff --git a/chromecast/browser/cast_browser_main_parts.h b/chromecast/browser/cast_browser_main_parts.h
index 005373b..90c7c8d 100644
--- a/chromecast/browser/cast_browser_main_parts.h
+++ b/chromecast/browser/cast_browser_main_parts.h
@@ -23,11 +23,6 @@
 
 class PrefService;
 
-namespace base {
-class SingleThreadTaskRunner;
-class Thread;
-}  // namespace base
-
 namespace extensions {
 class ExtensionsClient;
 class ExtensionsBrowserClient;
@@ -49,12 +44,12 @@
 namespace media {
 class MediaCapsImpl;
 class MediaPipelineBackendManager;
-class MediaResourceTracker;
 class VideoPlaneController;
 }  // namespace media
 
 namespace shell {
 class CastBrowserProcess;
+class CastContentBrowserClient;
 class URLRequestContextFactory;
 
 class CastBrowserMainParts : public content::BrowserMainParts {
@@ -63,17 +58,16 @@
   // link in an implementation as needed.
   static std::unique_ptr<CastBrowserMainParts> Create(
       const content::MainFunctionParams& parameters,
-      URLRequestContextFactory* url_request_context_factory);
+      URLRequestContextFactory* url_request_context_factory,
+      CastContentBrowserClient* cast_content_browser_client);
 
   // This class does not take ownership of |url_request_content_factory|.
   CastBrowserMainParts(const content::MainFunctionParams& parameters,
-                       URLRequestContextFactory* url_request_context_factory);
+                       URLRequestContextFactory* url_request_context_factory,
+                       CastContentBrowserClient* cast_content_browser_client);
   ~CastBrowserMainParts() override;
 
-  scoped_refptr<base::SingleThreadTaskRunner> GetMediaTaskRunner();
-
 #if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
-  media::MediaResourceTracker* media_resource_tracker();
   media::MediaPipelineBackendManager* media_pipeline_backend_manager();
 #endif
   media::MediaCapsImpl* media_caps();
@@ -93,6 +87,8 @@
   std::unique_ptr<CastBrowserProcess> cast_browser_process_;
   base::FieldTrialList field_trial_list_;
   const content::MainFunctionParams parameters_;  // For running browser tests.
+  // Caches a pointer of the CastContentBrowserClient.
+  CastContentBrowserClient* const cast_content_browser_client_ = nullptr;
   URLRequestContextFactory* const url_request_context_factory_;
   std::unique_ptr<net::NetLog> net_log_;
   std::unique_ptr<media::VideoPlaneController> video_plane_controller_;
@@ -112,12 +108,6 @@
 #endif
 
 #if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
-  // CMA thread used by AudioManager, MojoRenderer, and MediaPipelineBackend.
-  std::unique_ptr<base::Thread> media_thread_;
-
-  // Tracks usage of media resource by e.g. CMA pipeline, CDM.
-  media::MediaResourceTracker* media_resource_tracker_;
-
   // Tracks all media pipeline backends.
   std::unique_ptr<media::MediaPipelineBackendManager>
       media_pipeline_backend_manager_;
diff --git a/chromecast/browser/cast_browser_main_parts_simple.cc b/chromecast/browser/cast_browser_main_parts_simple.cc
index c442288..045fd058 100644
--- a/chromecast/browser/cast_browser_main_parts_simple.cc
+++ b/chromecast/browser/cast_browser_main_parts_simple.cc
@@ -10,9 +10,10 @@
 // static
 std::unique_ptr<CastBrowserMainParts> CastBrowserMainParts::Create(
     const content::MainFunctionParams& parameters,
-    URLRequestContextFactory* url_request_context_factory) {
-  return std::make_unique<CastBrowserMainParts>(parameters,
-                                                url_request_context_factory);
+    URLRequestContextFactory* url_request_context_factory,
+    CastContentBrowserClient* cast_content_browser_client) {
+  return std::make_unique<CastBrowserMainParts>(
+      parameters, url_request_context_factory, cast_content_browser_client);
 }
 
 }  // namespace shell
diff --git a/chromecast/browser/cast_content_browser_client.cc b/chromecast/browser/cast_content_browser_client.cc
index 3a9cb287..87298d0 100644
--- a/chromecast/browser/cast_content_browser_client.cc
+++ b/chromecast/browser/cast_content_browser_client.cc
@@ -44,6 +44,7 @@
 #include "chromecast/browser/url_request_context_factory.h"
 #include "chromecast/common/global_descriptors.h"
 #include "chromecast/media/audio/cast_audio_manager.h"
+#include "chromecast/media/base/media_resource_tracker.h"
 #include "chromecast/media/cma/backend/cma_backend_factory_impl.h"
 #include "chromecast/media/cma/backend/media_pipeline_backend_manager.h"
 #include "chromecast/public/media/media_pipeline_backend.h"
@@ -167,6 +168,8 @@
       url_request_context_factory_(new URLRequestContextFactory()) {}
 
 CastContentBrowserClient::~CastContentBrowserClient() {
+  DCHECK(!media_resource_tracker_)
+      << "ResetMediaResourceTracker was not called";
   content::BrowserThread::DeleteSoon(content::BrowserThread::IO, FROM_HERE,
                                      url_request_context_factory_.release());
 }
@@ -185,18 +188,33 @@
   return nullptr;
 }
 
+scoped_refptr<base::SingleThreadTaskRunner>
+CastContentBrowserClient::GetMediaTaskRunner() {
+#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
+  if (!media_thread_) {
+    media_thread_.reset(new base::Thread("CastMediaThread"));
+    base::Thread::Options options;
+    options.priority = base::ThreadPriority::REALTIME_AUDIO;
+    CHECK(media_thread_->StartWithOptions(options));
+    // Start the media_resource_tracker as soon as the media thread is created.
+    // There are services that run on the media thread that depend on it,
+    // and we want to initialize it with the correct task runner before any
+    // tasks that might use it are posted to the media thread.
+    media_resource_tracker_ = new media::MediaResourceTracker(
+        base::ThreadTaskRunnerHandle::Get(), media_thread_->task_runner());
+  }
+  return media_thread_->task_runner();
+#else
+  return nullptr;
+#endif
+}
+
 #if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
 media::VideoResolutionPolicy*
 CastContentBrowserClient::GetVideoResolutionPolicy() {
   return nullptr;
 }
 
-scoped_refptr<base::SingleThreadTaskRunner>
-CastContentBrowserClient::GetMediaTaskRunner() {
-  DCHECK(cast_browser_main_parts_);
-  return cast_browser_main_parts_->GetMediaTaskRunner();
-}
-
 media::CmaBackendFactory* CastContentBrowserClient::GetCmaBackendFactory() {
   DCHECK(GetMediaTaskRunner()->BelongsToCurrentThread());
   if (!cma_backend_factory_) {
@@ -208,7 +226,13 @@
 
 media::MediaResourceTracker*
 CastContentBrowserClient::media_resource_tracker() {
-  return cast_browser_main_parts_->media_resource_tracker();
+  DCHECK(media_thread_);
+  return media_resource_tracker_;
+}
+
+void CastContentBrowserClient::ResetMediaResourceTracker() {
+  media_resource_tracker_->FinalizeAndDestroy();
+  media_resource_tracker_ = nullptr;
 }
 
 media::MediaPipelineBackendManager*
@@ -296,7 +320,7 @@
     const content::MainFunctionParams& parameters) {
   DCHECK(!cast_browser_main_parts_);
   auto main_parts = CastBrowserMainParts::Create(
-      parameters, url_request_context_factory_.get());
+      parameters, url_request_context_factory_.get(), this);
   cast_browser_main_parts_ = main_parts.get();
   CastBrowserProcess::GetInstance()->SetCastContentBrowserClient(this);
 
diff --git a/chromecast/browser/cast_content_browser_client.h b/chromecast/browser/cast_content_browser_client.h
index bb38c9c..7be1743f 100644
--- a/chromecast/browser/cast_content_browser_client.h
+++ b/chromecast/browser/cast_content_browser_client.h
@@ -12,6 +12,7 @@
 
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
+#include "base/threading/thread.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
 #include "chromecast/chromecast_buildflags.h"
@@ -83,18 +84,20 @@
 
   virtual media::VideoModeSwitcher* GetVideoModeSwitcher();
 
+  // Returns the task runner that must be used for media IO.
+  scoped_refptr<base::SingleThreadTaskRunner> GetMediaTaskRunner();
+
 #if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
   // Gets object for enforcing video resolution policy restrictions.
   virtual media::VideoResolutionPolicy* GetVideoResolutionPolicy();
 
-  // Returns the task runner that must be used for media IO.
-  scoped_refptr<base::SingleThreadTaskRunner> GetMediaTaskRunner();
-
   // Creates a CmaBackendFactory.
   virtual media::CmaBackendFactory* GetCmaBackendFactory();
 
   media::MediaResourceTracker* media_resource_tracker();
 
+  void ResetMediaResourceTracker();
+
   media::MediaPipelineBackendManager* media_pipeline_backend_manager();
 
   std::unique_ptr<::media::AudioManager> CreateAudioManager(
@@ -239,6 +242,14 @@
   std::unique_ptr<MemoryPressureControllerImpl> memory_pressure_controller_;
 #endif  // !defined(OS_ANDROID)
 
+#if BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
+  // CMA thread used by AudioManager, MojoRenderer, and MediaPipelineBackend.
+  std::unique_ptr<base::Thread> media_thread_;
+
+  // Tracks usage of media resource by e.g. CMA pipeline, CDM.
+  media::MediaResourceTracker* media_resource_tracker_ = nullptr;
+#endif  // BUILDFLAG(IS_CAST_USING_CMA_BACKEND)
+
   // Created by CastContentBrowserClient but owned by BrowserMainLoop.
   CastBrowserMainParts* cast_browser_main_parts_;
   std::unique_ptr<URLRequestContextFactory> url_request_context_factory_;
diff --git a/chromeos/settings/OWNERS b/chromeos/settings/OWNERS
new file mode 100644
index 0000000..a1e1b93
--- /dev/null
+++ b/chromeos/settings/OWNERS
@@ -0,0 +1,7 @@
+bartfab@chromium.org
+mnissler@chromium.org
+olsen@chromium.org
+pastarmovj@chromium.org
+stevenjb@chromium.org
+
+# COMPONENT: Enterprise
diff --git a/components/arc/arc_bridge_host_impl.cc b/components/arc/arc_bridge_host_impl.cc
index 1541fd5..a51a470e 100644
--- a/components/arc/arc_bridge_host_impl.cc
+++ b/components/arc/arc_bridge_host_impl.cc
@@ -143,6 +143,12 @@
                   std::move(lock_screen_ptr));
 }
 
+void ArcBridgeHostImpl::OnMediaSessionInstanceReady(
+    mojom::MediaSessionInstancePtr media_session_ptr) {
+  OnInstanceReady(arc_bridge_service_->media_session(),
+                  std::move(media_session_ptr));
+}
+
 void ArcBridgeHostImpl::OnMetricsInstanceReady(
     mojom::MetricsInstancePtr metrics_ptr) {
   OnInstanceReady(arc_bridge_service_->metrics(), std::move(metrics_ptr));
diff --git a/components/arc/arc_bridge_host_impl.h b/components/arc/arc_bridge_host_impl.h
index 1ecdc97..648c25e 100644
--- a/components/arc/arc_bridge_host_impl.h
+++ b/components/arc/arc_bridge_host_impl.h
@@ -70,6 +70,8 @@
   void OnKioskInstanceReady(mojom::KioskInstancePtr kiosk_ptr) override;
   void OnLockScreenInstanceReady(
       mojom::LockScreenInstancePtr lock_screen_ptr) override;
+  void OnMediaSessionInstanceReady(
+      mojom::MediaSessionInstancePtr media_session_ptr) override;
   void OnMetricsInstanceReady(mojom::MetricsInstancePtr metrics_ptr) override;
   void OnMidisInstanceReady(mojom::MidisInstancePtr midis_ptr) override;
   void OnNetInstanceReady(mojom::NetInstancePtr net_ptr) override;
diff --git a/components/arc/arc_bridge_service.h b/components/arc/arc_bridge_service.h
index db0785e..2ae2280 100644
--- a/components/arc/arc_bridge_service.h
+++ b/components/arc/arc_bridge_service.h
@@ -51,6 +51,7 @@
 class KioskHost;
 class KioskInstance;
 class LockScreenInstance;
+class MediaSessionInstance;
 class MetricsHost;
 class MetricsInstance;
 class MidisHost;
@@ -175,6 +176,9 @@
   ConnectionHolder<mojom::LockScreenInstance>* lock_screen() {
     return &lock_screen_;
   }
+  ConnectionHolder<mojom::MediaSessionInstance>* media_session() {
+    return &media_session_;
+  }
   ConnectionHolder<mojom::MetricsInstance, mojom::MetricsHost>* metrics() {
     return &metrics_;
   }
@@ -276,6 +280,7 @@
       intent_helper_;
   ConnectionHolder<mojom::KioskInstance, mojom::KioskHost> kiosk_;
   ConnectionHolder<mojom::LockScreenInstance> lock_screen_;
+  ConnectionHolder<mojom::MediaSessionInstance> media_session_;
   ConnectionHolder<mojom::MetricsInstance, mojom::MetricsHost> metrics_;
   ConnectionHolder<mojom::MidisInstance, mojom::MidisHost> midis_;
   ConnectionHolder<mojom::NetInstance, mojom::NetHost> net_;
diff --git a/components/arc/arc_features.cc b/components/arc/arc_features.cc
index 58639ae..10a99eb 100644
--- a/components/arc/arc_features.cc
+++ b/components/arc/arc_features.cc
@@ -35,6 +35,10 @@
 const base::Feature kEnableRegularToChildTransitionFeature{
     "ArcEnableRegularToChildTransition", base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Controls whether we should delegate audio focus requests from ARC to Chrome.
+const base::Feature kEnableUnifiedAudioFocusFeature{
+    "ArcEnableUnifiedAudioFocus", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Controls experimental native bridge feature for ARC.
 const base::Feature kNativeBridgeExperimentFeature {
     "ArcNativeBridgeExperiment", base::FEATURE_ENABLED_BY_DEFAULT
diff --git a/components/arc/arc_features.h b/components/arc/arc_features.h
index 1935b45..c3a3ef73 100644
--- a/components/arc/arc_features.h
+++ b/components/arc/arc_features.h
@@ -18,6 +18,7 @@
 extern const base::Feature kEnableChildToRegularTransitionFeature;
 extern const base::Feature kEnableInputMethodFeature;
 extern const base::Feature kEnableRegularToChildTransitionFeature;
+extern const base::Feature kEnableUnifiedAudioFocusFeature;
 extern const base::Feature kNativeBridgeExperimentFeature;
 extern const base::Feature kSmartTextSelectionFeature;
 extern const base::Feature kUsbHostFeature;
diff --git a/components/arc/common/BUILD.gn b/components/arc/common/BUILD.gn
index ed76eb0..93305c8 100644
--- a/components/arc/common/BUILD.gn
+++ b/components/arc/common/BUILD.gn
@@ -33,6 +33,7 @@
       "intent_helper.mojom",
       "kiosk.mojom",
       "lock_screen.mojom",
+      "media_session.mojom",
       "metrics.mojom",
       "midis.mojom",
       "net.mojom",
@@ -65,6 +66,7 @@
       ":notifications",
       "//device/usb/public/mojom",
       "//mojo/public/mojom/base",
+      "//services/media_session/public/mojom",
       "//ui/accessibility/mojom",
       "//ui/gfx/geometry/mojo",
       "//url/mojom:url_mojom_gurl",
diff --git a/components/arc/common/arc_bridge.mojom b/components/arc/common/arc_bridge.mojom
index 362fe0fc..0d50630 100644
--- a/components/arc/common/arc_bridge.mojom
+++ b/components/arc/common/arc_bridge.mojom
@@ -24,6 +24,7 @@
 import "components/arc/common/intent_helper.mojom";
 import "components/arc/common/kiosk.mojom";
 import "components/arc/common/lock_screen.mojom";
+import "components/arc/common/media_session.mojom";
 import "components/arc/common/metrics.mojom";
 import "components/arc/common/midis.mojom";
 import "components/arc/common/net.mojom";
@@ -50,9 +51,9 @@
 import "components/arc/common/wake_lock.mojom";
 import "components/arc/common/wallpaper.mojom";
 
-// Next MinVersion: 43
+// Next MinVersion: 44
 // Deprecated method IDs: 101, 105
-// Next method ID: 148
+// Next method ID: 149
 interface ArcBridgeHost {
   // Keep the entries alphabetical. In order to do so without breaking
   // compatibility with the ARC instance, explicitly assign each interface a
@@ -127,6 +128,9 @@
   // Notifies Chrome that the LockScreenInstance interface is ready.
   [MinVersion=29] OnLockScreenInstanceReady@134(LockScreenInstance instance_ptr);
 
+  // Notifies Chrome that the MediaSessionInstance interface is ready.
+  [MinVersion=43] OnMediaSessionInstanceReady@148(MediaSessionInstance instance_ptr);
+
   // Notifies Chrome that the MetricsInstance interface is ready.
   [MinVersion=10] OnMetricsInstanceReady@116(MetricsInstance instance_ptr);
 
diff --git a/components/arc/common/media_session.mojom b/components/arc/common/media_session.mojom
new file mode 100644
index 0000000..f8e2c93
--- /dev/null
+++ b/components/arc/common/media_session.mojom
@@ -0,0 +1,20 @@
+// Copyright 2018 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.
+
+// Next MinVersion: 1
+
+module arc.mojom;
+
+import "services/media_session/public/mojom/audio_focus.mojom";
+
+// Next method ID: 3
+interface MediaSessionInstance {
+  // Enable audio focus integration on the Android side and register the
+  // unified AudioPolicy. The audio policy will send audio focus requests
+  // to |service|.
+  EnableAudioFocus@1(media_session.mojom.AudioFocusManager service);
+
+  // Disable audio focus integration if it is enabled.
+  DisableAudioFocus@2();
+};
diff --git a/components/arc/media_session/BUILD.gn b/components/arc/media_session/BUILD.gn
new file mode 100644
index 0000000..3c28303
--- /dev/null
+++ b/components/arc/media_session/BUILD.gn
@@ -0,0 +1,18 @@
+# Copyright 2018 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.
+
+static_library("media_session") {
+  sources = [
+    "arc_media_session_bridge.cc",
+    "arc_media_session_bridge.h",
+  ]
+
+  deps = [
+    "//components/arc:arc_base",
+    "//components/keyed_service/content",
+    "//content/public/common",
+    "//services/media_session/public/cpp",
+    "//services/media_session/public/mojom",
+  ]
+}
diff --git a/components/arc/media_session/DEPS b/components/arc/media_session/DEPS
new file mode 100644
index 0000000..4b3d221
--- /dev/null
+++ b/components/arc/media_session/DEPS
@@ -0,0 +1,5 @@
+include_rules = [
+  "+content/public/common/service_manager_connection.h",
+  "+services/media_session/public",
+  "+services/service_manager/public/cpp/connector.h",
+]
diff --git a/components/arc/media_session/OWNERS b/components/arc/media_session/OWNERS
new file mode 100644
index 0000000..162fbc21
--- /dev/null
+++ b/components/arc/media_session/OWNERS
@@ -0,0 +1,3 @@
+file://services/media_session/OWNERS
+
+# COMPONENT: Internals>Media>Session
diff --git a/components/arc/media_session/arc_media_session_bridge.cc b/components/arc/media_session/arc_media_session_bridge.cc
new file mode 100644
index 0000000..a5b0afd6
--- /dev/null
+++ b/components/arc/media_session/arc_media_session_bridge.cc
@@ -0,0 +1,98 @@
+// Copyright 2018 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 "components/arc/media_session/arc_media_session_bridge.h"
+
+#include "base/feature_list.h"
+#include "base/logging.h"
+#include "base/no_destructor.h"
+#include "components/arc/arc_bridge_service.h"
+#include "components/arc/arc_browser_context_keyed_service_factory_base.h"
+#include "components/arc/arc_features.h"
+#include "content/public/common/service_manager_connection.h"
+#include "services/media_session/public/cpp/switches.h"
+#include "services/media_session/public/mojom/audio_focus.mojom.h"
+#include "services/media_session/public/mojom/constants.mojom.h"
+#include "services/service_manager/public/cpp/connector.h"
+
+namespace arc {
+namespace {
+
+constexpr char kAudioFocusSourceName[] = "arc";
+
+// Singleton factory for ArcAccessibilityHelperBridge.
+class ArcMediaSessionBridgeFactory
+    : public internal::ArcBrowserContextKeyedServiceFactoryBase<
+          ArcMediaSessionBridge,
+          ArcMediaSessionBridgeFactory> {
+ public:
+  // Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
+  static constexpr const char* kName = "ArcMediaSessionBridgeFactory";
+
+  static ArcMediaSessionBridgeFactory* GetInstance() {
+    static base::NoDestructor<ArcMediaSessionBridgeFactory> factory;
+    return factory.get();
+  }
+
+  ArcMediaSessionBridgeFactory() = default;
+  ~ArcMediaSessionBridgeFactory() override = default;
+};
+
+bool IsArcUnifiedAudioFocusEnabled() {
+  return media_session::IsAudioFocusEnabled() &&
+         base::FeatureList::IsEnabled(kEnableUnifiedAudioFocusFeature);
+}
+
+}  // namespace
+
+// static
+ArcMediaSessionBridge* ArcMediaSessionBridge::GetForBrowserContext(
+    content::BrowserContext* context) {
+  return ArcMediaSessionBridgeFactory::GetForBrowserContext(context);
+}
+
+ArcMediaSessionBridge::ArcMediaSessionBridge(content::BrowserContext* context,
+                                             ArcBridgeService* bridge_service)
+    : arc_bridge_service_(bridge_service) {
+  arc_bridge_service_->media_session()->AddObserver(this);
+}
+
+ArcMediaSessionBridge::~ArcMediaSessionBridge() {
+  arc_bridge_service_->media_session()->RemoveObserver(this);
+}
+
+void ArcMediaSessionBridge::OnConnectionReady() {
+  DVLOG(2) << "ArcMediaSessionBridge::OnConnectionReady";
+  SetupAudioFocus();
+}
+
+void ArcMediaSessionBridge::OnConnectionClosed() {
+  DVLOG(2) << "ArcMediaSessionBridge::OnConnectionClosed";
+}
+
+void ArcMediaSessionBridge::SetupAudioFocus() {
+  DVLOG(2) << "ArcMediaSessionBridge::SetupAudioFocus";
+  mojom::MediaSessionInstance* ms_instance = ARC_GET_INSTANCE_FOR_METHOD(
+      arc_bridge_service_->media_session(), DisableAudioFocus);
+  if (!ms_instance)
+    return;
+
+  if (!IsArcUnifiedAudioFocusEnabled()) {
+    DVLOG(2) << "ArcMediaSessionBridge will disable audio focus";
+    ms_instance->DisableAudioFocus();
+    return;
+  }
+
+  media_session::mojom::AudioFocusManagerPtr audio_focus_ptr;
+  content::ServiceManagerConnection::GetForProcess()
+      ->GetConnector()
+      ->BindInterface(media_session::mojom::kServiceName, &audio_focus_ptr);
+
+  audio_focus_ptr->SetSourceName(kAudioFocusSourceName);
+
+  DVLOG(2) << "ArcMediaSessionBridge will enable audio focus";
+  ms_instance->EnableAudioFocus(std::move(audio_focus_ptr));
+}
+
+}  // namespace arc
diff --git a/components/arc/media_session/arc_media_session_bridge.h b/components/arc/media_session/arc_media_session_bridge.h
new file mode 100644
index 0000000..6564896
--- /dev/null
+++ b/components/arc/media_session/arc_media_session_bridge.h
@@ -0,0 +1,54 @@
+// Copyright 2018 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 COMPONENTS_ARC_MEDIA_SESSION_ARC_MEDIA_SESSION_BRIDGE_H_
+#define COMPONENTS_ARC_MEDIA_SESSION_ARC_MEDIA_SESSION_BRIDGE_H_
+
+#include <string>
+
+#include "base/macros.h"
+#include "components/arc/common/media_session.mojom.h"
+#include "components/arc/connection_observer.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+namespace content {
+class BrowserContext;
+}  // namespace content
+
+namespace arc {
+
+class ArcBridgeService;
+
+// ArcMediaSessionBridge exposes the media session service to ARC. This allows
+// Android apps to request and manage audio focus using the internal Chrome
+// API. This means that audio focus management is unified across both Android
+// and Chrome.
+class ArcMediaSessionBridge
+    : public KeyedService,
+      public ConnectionObserver<mojom::MediaSessionInstance> {
+ public:
+  // Returns singleton instance for the given BrowserContext,
+  // or nullptr if the browser |context| is not allowed to use ARC.
+  static ArcMediaSessionBridge* GetForBrowserContext(
+      content::BrowserContext* context);
+
+  ArcMediaSessionBridge(content::BrowserContext* context,
+                        ArcBridgeService* bridge_service);
+  ~ArcMediaSessionBridge() override;
+
+  // ConnectionObserver<mojom::MediaSessionInstance> overrides.
+  void OnConnectionReady() override;
+  void OnConnectionClosed() override;
+
+ private:
+  void SetupAudioFocus();
+
+  ArcBridgeService* const arc_bridge_service_;  // Owned by ArcServiceManager.
+
+  DISALLOW_COPY_AND_ASSIGN(ArcMediaSessionBridge);
+};
+
+}  // namespace arc
+
+#endif  // COMPONENTS_ARC_MEDIA_SESSION_ARC_MEDIA_SESSION_BRIDGE_H_
diff --git a/components/arc/test/fake_arc_bridge_host.cc b/components/arc/test/fake_arc_bridge_host.cc
index 754e88c..ccd4344 100644
--- a/components/arc/test/fake_arc_bridge_host.cc
+++ b/components/arc/test/fake_arc_bridge_host.cc
@@ -67,6 +67,9 @@
 void FakeArcBridgeHost::OnLockScreenInstanceReady(
     mojom::LockScreenInstancePtr lock_screen_ptr) {}
 
+void FakeArcBridgeHost::OnMediaSessionInstanceReady(
+    mojom::MediaSessionInstancePtr media_sesssion_ptr) {}
+
 void FakeArcBridgeHost::OnMetricsInstanceReady(
     mojom::MetricsInstancePtr metrics_ptr) {}
 
diff --git a/components/arc/test/fake_arc_bridge_host.h b/components/arc/test/fake_arc_bridge_host.h
index c3a7e11..32ebd7b 100644
--- a/components/arc/test/fake_arc_bridge_host.h
+++ b/components/arc/test/fake_arc_bridge_host.h
@@ -50,6 +50,8 @@
   void OnKioskInstanceReady(mojom::KioskInstancePtr kiosk_ptr) override;
   void OnLockScreenInstanceReady(
       mojom::LockScreenInstancePtr lock_screen_ptr) override;
+  void OnMediaSessionInstanceReady(
+      mojom::MediaSessionInstancePtr media_session_ptr) override;
   void OnMetricsInstanceReady(mojom::MetricsInstancePtr metrics_ptr) override;
   void OnMidisInstanceReady(mojom::MidisInstancePtr midis_ptr) override;
   void OnNetInstanceReady(mojom::NetInstancePtr net_ptr) override;
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h
index a981f74..5d42cd68b 100644
--- a/components/autofill/core/browser/autofill_client.h
+++ b/components/autofill/core/browser/autofill_client.h
@@ -53,6 +53,7 @@
 class FormStructure;
 class MigratableCreditCard;
 class PersonalDataManager;
+class StrikeDatabase;
 struct Suggestion;
 
 // A client interface that needs to be supplied to the Autofill component by the
@@ -113,6 +114,9 @@
   // Gets the IdentityManager associated with the client.
   virtual identity::IdentityManager* GetIdentityManager() = 0;
 
+  // Gets the StrikeDatabase associated with the client.
+  virtual StrikeDatabase* GetStrikeDatabase() = 0;
+
   // Gets the UKM service associated with this client (for metrics).
   virtual ukm::UkmRecorder* GetUkmRecorder() = 0;
 
diff --git a/components/autofill/core/browser/autofill_profile_sync_util.cc b/components/autofill/core/browser/autofill_profile_sync_util.cc
index b25f148..f54c161 100644
--- a/components/autofill/core/browser/autofill_profile_sync_util.cc
+++ b/components/autofill/core/browser/autofill_profile_sync_util.cc
@@ -50,6 +50,8 @@
       TruncateUTF8(entry.language_code()));
   specifics->set_validity_state_bitfield(
       entry.GetClientValidityBitfieldValue());
+  specifics->set_is_client_validity_states_updated(
+      entry.is_client_validity_states_updated());
 
   // Set repeated fields.
   if (entry.HasRawInfo(NAME_FIRST)) {
@@ -212,6 +214,10 @@
                         UTF8ToUTF16(specifics.address_home_street_address()));
   }
 
+  // This has to be the last one, otherwise setting the raw info may change it.
+  profile->set_is_client_validity_states_updated(
+      specifics.is_client_validity_states_updated());
+
   return profile;
 }
 
diff --git a/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc b/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc
index aa8d9bc5..b9677d5 100644
--- a/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc
+++ b/components/autofill/core/browser/autofill_profile_sync_util_unittest.cc
@@ -62,6 +62,8 @@
                      ASCIIToUTF16("Santa Clara"));
   profile.set_language_code("en");
   profile.SetClientValidityFromBitfieldValue(1984);
+  profile.set_is_client_validity_states_updated(true);
+
   return profile;
 }
 
@@ -99,6 +101,7 @@
   specifics.set_address_home_dependent_locality("Santa Clara");
   specifics.set_address_home_language_code("en");
   specifics.set_validity_state_bitfield(1984);
+  specifics.set_is_client_validity_states_updated(true);
 
   return specifics;
 }
diff --git a/components/autofill/core/browser/strike_database.h b/components/autofill/core/browser/strike_database.h
index 473d0b3e..cfb4b21 100644
--- a/components/autofill/core/browser/strike_database.h
+++ b/components/autofill/core/browser/strike_database.h
@@ -10,6 +10,7 @@
 
 #include "base/callback_forward.h"
 #include "base/memory/weak_ptr.h"
+#include "components/keyed_service/core/keyed_service.h"
 #include "components/leveldb_proto/proto_database.h"
 
 namespace autofill {
@@ -19,7 +20,7 @@
 // the user. Projects can earn strikes in a number of ways; for instance, if a
 // user ignores or declines a prompt, or if a user accepts a prompt but the task
 // fails.
-class StrikeDatabase {
+class StrikeDatabase : public KeyedService {
  public:
   using ClearStrikesCallback = base::RepeatingCallback<void(bool success)>;
 
@@ -34,7 +35,7 @@
   using StrikeDataProto = leveldb_proto::ProtoDatabase<StrikeData>;
 
   explicit StrikeDatabase(const base::FilePath& database_dir);
-  ~StrikeDatabase();
+  ~StrikeDatabase() override;
 
   // Passes the number of strikes for |key| to |outer_callback|. In the case
   // that the database fails to retrieve the strike update or if no entry is
diff --git a/components/autofill/core/browser/test_autofill_client.cc b/components/autofill/core/browser/test_autofill_client.cc
index ff83670..625f8e60 100644
--- a/components/autofill/core/browser/test_autofill_client.cc
+++ b/components/autofill/core/browser/test_autofill_client.cc
@@ -36,6 +36,10 @@
   return identity_test_env_.identity_manager();
 }
 
+StrikeDatabase* TestAutofillClient::GetStrikeDatabase() {
+  return nullptr;
+}
+
 ukm::UkmRecorder* TestAutofillClient::GetUkmRecorder() {
   return ukm::UkmRecorder::Get();
 }
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h
index fccf5e3..c69543a 100644
--- a/components/autofill/core/browser/test_autofill_client.h
+++ b/components/autofill/core/browser/test_autofill_client.h
@@ -33,6 +33,7 @@
   PrefService* GetPrefs() override;
   syncer::SyncService* GetSyncService() override;
   identity::IdentityManager* GetIdentityManager() override;
+  StrikeDatabase* GetStrikeDatabase() override;
   ukm::UkmRecorder* GetUkmRecorder() override;
   ukm::SourceId GetUkmSourceId() override;
   AddressNormalizer* GetAddressNormalizer() override;
diff --git a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc
index 80f283c..ca84bff 100644
--- a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge_unittest.cc
@@ -1010,12 +1010,14 @@
        RemoteWithSameGuid_ValidityState_DefaultValueNoSync) {
   AutofillProfile local(kGuidA, kHttpsOrigin);
   ASSERT_EQ(0, local.GetClientValidityBitfieldValue());
+  ASSERT_FALSE(local.is_client_validity_states_updated());
   AddAutofillProfilesToTable({local});
 
   // Remote data does not have a validity state bitfield value.
   AutofillProfileSpecifics remote =
       CreateAutofillProfileSpecifics(kGuidA, kHttpsOrigin);
   ASSERT_FALSE(remote.has_validity_state_bitfield());
+  ASSERT_FALSE(remote.is_client_validity_states_updated());
 
   // No update to sync, no change in local data.
   EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0);
diff --git a/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc b/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc
index 8ad100d..cd6d492 100644
--- a/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc
+++ b/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc
@@ -432,6 +432,12 @@
     diff = true;
   }
 
+  if (specifics.is_client_validity_states_updated() !=
+      profile->is_client_validity_states_updated()) {
+    profile->set_is_client_validity_states_updated(
+        specifics.is_client_validity_states_updated());
+    diff = true;
+  }
   return diff;
 }
 
@@ -488,6 +494,8 @@
   specifics->set_address_home_language_code(LimitData(profile.language_code()));
   specifics->set_validity_state_bitfield(
       profile.GetClientValidityBitfieldValue());
+  specifics->set_is_client_validity_states_updated(
+      profile.is_client_validity_states_updated());
 
   // TODO(estade): this should be set_email_address.
   specifics->add_email_address(
diff --git a/components/autofill/core/browser/webdata/autofill_profile_syncable_service_unittest.cc b/components/autofill/core/browser/webdata/autofill_profile_syncable_service_unittest.cc
index 0678d733..199e53f7 100644
--- a/components/autofill/core/browser/webdata/autofill_profile_syncable_service_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_profile_syncable_service_unittest.cc
@@ -172,6 +172,7 @@
                       ASCIIToUTF16("Santa Clara"));
   profile->set_language_code("en");
   profile->SetClientValidityFromBitfieldValue(kValidityStateBitfield);
+  profile->set_is_client_validity_states_updated(true);
   return profile;
 }
 
@@ -210,6 +211,7 @@
   specifics->set_address_home_dependent_locality("Santa Clara");
   specifics->set_address_home_language_code("en");
   specifics->set_validity_state_bitfield(kValidityStateBitfield);
+  specifics->set_is_client_validity_states_updated(true);
 
   return syncer::SyncData::CreateLocalData(kGuid1, kGuid1, entity_specifics);
 }
@@ -1175,7 +1177,8 @@
 }
 
 // Default validity state bitfield should be overwritten by sync.
-TEST_F(AutofillProfileSyncableServiceTest, SyncUpdatesDefaultValidityBitfield) {
+TEST_F(AutofillProfileSyncableServiceTest,
+       SyncUpdatesDefaultValidityBitfieldAndFlag) {
   std::vector<std::unique_ptr<AutofillProfile>> profiles_from_web_db;
 
   // Local autofill profile has a default validity state.
@@ -1196,6 +1199,7 @@
   autofill_specifics->add_email_address(std::string());
   autofill_specifics->add_phone_home_whole_number(std::string());
   autofill_specifics->set_validity_state_bitfield(kValidityStateBitfield);
+  autofill_specifics->set_is_client_validity_states_updated(true);
   EXPECT_TRUE(autofill_specifics->has_validity_state_bitfield());
 
   syncer::SyncDataList data_list;
@@ -1207,6 +1211,7 @@
   MockAutofillProfileSyncableService::DataBundle expected_bundle;
   AutofillProfile expected_profile(kGuid1, kEmptyOrigin);
   expected_profile.SetClientValidityFromBitfieldValue(kValidityStateBitfield);
+  expected_profile.set_is_client_validity_states_updated(true);
   expected_bundle.profiles_to_update.push_back(&expected_profile);
 
   // Expect no changes to remote data.
diff --git a/components/autofill_assistant/browser/controller.cc b/components/autofill_assistant/browser/controller.cc
index b5c0d1e..de6315f5 100644
--- a/components/autofill_assistant/browser/controller.cc
+++ b/components/autofill_assistant/browser/controller.cc
@@ -261,13 +261,22 @@
     return;
 
   // Under specific conditions, we can directly run a script without first
-  // displaying it. This is meant to work only at the very beginning, when
-  // no scripts have run, there has been no interaction with the webpage and
-  // only if there's exactly one runnable script, flagged for autostart.
-  if (allow_autostart_ && runnable_scripts.size() == 1 &&
-      runnable_scripts[0].autostart) {
-    OnScriptSelected(runnable_scripts[0].path);
-    return;
+  // displaying it. This is meant to work only at the very beginning, when no
+  // scripts have run, there has been no interaction with the webpage and only
+  // if there's exactly one runnable autostartable script.
+  if (allow_autostart_) {
+    int autostart_count = 0;
+    std::string autostart_path;
+    for (const auto& script : runnable_scripts) {
+      if (script.autostart) {
+        autostart_count++;
+        autostart_path = script.path;
+      }
+    }
+    if (autostart_count == 1) {
+      OnScriptSelected(autostart_path);
+      return;
+    }
   }
 
   GetUiController()->UpdateScripts(runnable_scripts);
diff --git a/components/autofill_assistant/browser/controller_unittest.cc b/components/autofill_assistant/browser/controller_unittest.cc
index 4f128717..85528ee 100644
--- a/components/autofill_assistant/browser/controller_unittest.cc
+++ b/components/autofill_assistant/browser/controller_unittest.cc
@@ -275,12 +275,14 @@
 
 TEST_F(ControllerTest, Autostart) {
   SupportsScriptResponseProto script_response;
-  AddRunnableScript(&script_response, "runnable")
+  AddRunnableScript(&script_response, "runnable");
+  AddRunnableScript(&script_response, "autostart")
       ->mutable_presentation()
       ->set_autostart(true);
+  AddRunnableScript(&script_response, "alsorunnable");
   SetNextScriptResponse(script_response);
 
-  EXPECT_CALL(*mock_service_, OnGetActions(StrEq("runnable"), _, _))
+  EXPECT_CALL(*mock_service_, OnGetActions(StrEq("autostart"), _, _))
       .WillOnce(RunOnceCallback<2>(true, ""));
 
   SimulateNavigateToUrl(GURL("http://a.example.com/path"));
diff --git a/components/browser_watcher/stability_paths.cc b/components/browser_watcher/stability_paths.cc
index 08855196..e777c92 100644
--- a/components/browser_watcher/stability_paths.cc
+++ b/components/browser_watcher/stability_paths.cc
@@ -46,8 +46,7 @@
   // Map the file read-write so it can guarantee consistency between
   // the analyzer and any trackers that may still be active.
   std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
-  mmfile->Initialize(file_path, MemoryMappedFile::READ_WRITE);
-  if (!mmfile->IsValid())
+  if (!mmfile->Initialize(file_path, MemoryMappedFile::READ_WRITE))
     return false;
   if (!FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, true))
     return false;
diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc
index 4e71f35a..bb24ab4 100644
--- a/components/content_settings/core/common/content_settings.cc
+++ b/components/content_settings/core/common/content_settings.cc
@@ -29,7 +29,7 @@
 // content settings type name instead.
 //
 // The array size must be explicit for the static_asserts below.
-constexpr size_t kNumHistogramValues = 38;
+constexpr size_t kNumHistogramValues = 39;
 constexpr HistogramValue kHistogramValue[kNumHistogramValues] = {
     {CONTENT_SETTINGS_TYPE_COOKIES, 0},
     {CONTENT_SETTINGS_TYPE_IMAGES, 1},
@@ -69,6 +69,7 @@
     {CONTENT_SETTINGS_TYPE_PLUGINS_DATA, 42},
     {CONTENT_SETTINGS_TYPE_PAYMENT_HANDLER, 43},
     {CONTENT_SETTINGS_TYPE_USB_GUARD, 44},
+    {CONTENT_SETTINGS_TYPE_BACKGROUND_FETCH, 45},
 };
 
 }  // namespace
diff --git a/components/content_settings/core/common/content_settings_types.h b/components/content_settings/core/common/content_settings_types.h
index c482a4dd..2977323 100644
--- a/components/content_settings/core/common/content_settings_types.h
+++ b/components/content_settings/core/common/content_settings_types.h
@@ -117,6 +117,11 @@
   // stored under CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA.
   CONTENT_SETTINGS_TYPE_USB_GUARD,
 
+  // Nothing is stored in this setting at present. Please refer to
+  // BackgroundFetchPermissionContext for details on how this permission
+  // is ascertained.
+  CONTENT_SETTINGS_TYPE_BACKGROUND_FETCH,
+
   CONTENT_SETTINGS_NUM_TYPES,
 };
 
diff --git a/components/cronet/tools/perf_test_utils.py b/components/cronet/tools/perf_test_utils.py
index 7792ad9..1c9a67b 100755
--- a/components/cronet/tools/perf_test_utils.py
+++ b/components/cronet/tools/perf_test_utils.py
@@ -11,6 +11,7 @@
 import posixpath
 import subprocess
 import tempfile
+from time import sleep
 
 REPOSITORY_ROOT = os.path.abspath(os.path.join(
     os.path.dirname(__file__), '..', '..', '..'))
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider.cc b/components/data_reduction_proxy/content/browser/content_lofi_decider.cc
index 79ed2e5..cc538a5d 100644
--- a/components/data_reduction_proxy/content/browser/content_lofi_decider.cc
+++ b/components/data_reduction_proxy/content/browser/content_lofi_decider.cc
@@ -30,27 +30,21 @@
 // Static
 content::PreviewsState
 ContentLoFiDecider::DetermineCommittedServerPreviewsState(
-    const net::URLRequest& request,
+    DataReductionProxyData* data,
     content::PreviewsState initial_state) {
-  DCHECK_EQ(
-      content::RESOURCE_TYPE_MAIN_FRAME,
-      content::ResourceRequestInfo::ForRequest(&request)->GetResourceType())
-      << "Request was not for main frame";
-  data_reduction_proxy::DataReductionProxyData* drp_data =
-      data_reduction_proxy::DataReductionProxyData::GetData(request);
-  if (!drp_data) {
+  if (!data) {
     return initial_state &=
            ~(content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON);
   }
   content::PreviewsState updated_state = initial_state;
-  if (!drp_data->lite_page_received()) {
+  if (!data->lite_page_received()) {
     // Turn off LitePage bit.
     updated_state &= ~(content::SERVER_LITE_PAGE_ON);
   }
-  if (!drp_data->lofi_policy_received()) {
+  if (!data->lofi_policy_received()) {
     // Turn off LoFi bit(s).
     updated_state &= ~(content::SERVER_LOFI_ON);
-    if (drp_data->used_data_reduction_proxy()) {
+    if (data->used_data_reduction_proxy()) {
       // Turn off Client LoFi bit also if using proxy but proxy did not
       // request LoFi.
       updated_state &= ~(content::CLIENT_LOFI_ON);
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider.h b/components/data_reduction_proxy/content/browser/content_lofi_decider.h
index 5549d05..940414a 100644
--- a/components/data_reduction_proxy/content/browser/content_lofi_decider.h
+++ b/components/data_reduction_proxy/content/browser/content_lofi_decider.h
@@ -31,10 +31,10 @@
 
   // Returns an updated PreviewsState with respect to server previews
   // given the main frame's committed |request| and the |initial_state|
-  // of enabled previews. |request| must have already been updated with
+  // of enabled previews. |data| must have already been updated with
   // respect to the main frame response headers.
   static content::PreviewsState DetermineCommittedServerPreviewsState(
-      const net::URLRequest& request,
+      DataReductionProxyData* data,
       content::PreviewsState initial_state);
 
   // LoFiDecider implementation:
diff --git a/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc b/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc
index 2dc681b..0d76ff9 100644
--- a/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc
+++ b/components/data_reduction_proxy/content/browser/content_lofi_decider_unittest.cc
@@ -503,56 +503,46 @@
   content::PreviewsState enabled_previews =
       content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON |
       content::CLIENT_LOFI_ON | content::NOSCRIPT_ON;
-  std::unique_ptr<net::URLRequest> request = CreateRequestByType(
-      content::RESOURCE_TYPE_MAIN_FRAME, false /* https */, enabled_previews);
 
   // Add DataReductionProxyData for LitePage to URLRequest.
-  data_reduction_proxy::DataReductionProxyData* data_reduction_proxy_data =
-      data_reduction_proxy::DataReductionProxyData::GetDataAndCreateIfNecessary(
-          request.get());
-  data_reduction_proxy_data->set_used_data_reduction_proxy(true);
-  data_reduction_proxy_data->set_lite_page_received(true);
-  data_reduction_proxy_data->set_lofi_policy_received(false);
+  data_reduction_proxy::DataReductionProxyData data_reduction_proxy_data;
+  data_reduction_proxy_data.set_used_data_reduction_proxy(true);
+  data_reduction_proxy_data.set_lite_page_received(true);
+  data_reduction_proxy_data.set_lofi_policy_received(false);
 
   // Verify selects LitePage bit but doesn't touch client-only NoScript bit.
   EXPECT_EQ(content::SERVER_LITE_PAGE_ON | content::NOSCRIPT_ON,
             ContentLoFiDecider::DetermineCommittedServerPreviewsState(
-                *request, enabled_previews));
+                &data_reduction_proxy_data, enabled_previews));
 }
 
 TEST_F(ContentLoFiDeciderTest, DetermineCommittedServerPreviewsStateLoFi) {
   content::PreviewsState enabled_previews =
       content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON |
       content::CLIENT_LOFI_ON | content::NOSCRIPT_ON;
-  std::unique_ptr<net::URLRequest> request = CreateRequestByType(
-      content::RESOURCE_TYPE_MAIN_FRAME, false /* https */, enabled_previews);
 
   // Add DataReductionProxyData for LitePage to URLRequest.
-  data_reduction_proxy::DataReductionProxyData* data_reduction_proxy_data =
-      data_reduction_proxy::DataReductionProxyData::GetDataAndCreateIfNecessary(
-          request.get());
-  data_reduction_proxy_data->set_used_data_reduction_proxy(true);
-  data_reduction_proxy_data->set_lite_page_received(false);
-  data_reduction_proxy_data->set_lofi_policy_received(true);
+  data_reduction_proxy::DataReductionProxyData data_reduction_proxy_data;
+  data_reduction_proxy_data.set_used_data_reduction_proxy(true);
+  data_reduction_proxy_data.set_lite_page_received(false);
+  data_reduction_proxy_data.set_lofi_policy_received(true);
 
   // Verify keeps LoFi bits and also doesn't touch client-only NoScript bit.
   EXPECT_EQ(
       content::SERVER_LOFI_ON | content::CLIENT_LOFI_ON | content::NOSCRIPT_ON,
       ContentLoFiDecider::DetermineCommittedServerPreviewsState(
-          *request, enabled_previews));
+          &data_reduction_proxy_data, enabled_previews));
 }
 
 TEST_F(ContentLoFiDeciderTest, DetermineCommittedServerPreviewsStateNoProxy) {
   content::PreviewsState enabled_previews =
       content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON |
       content::CLIENT_LOFI_ON | content::NOSCRIPT_ON;
-  std::unique_ptr<net::URLRequest> request = CreateRequestByType(
-      content::RESOURCE_TYPE_MAIN_FRAME, false /* https */, enabled_previews);
 
   // Verify keeps LoFi bits and also doesn't touch client-only NoScript bit.
   EXPECT_EQ(content::CLIENT_LOFI_ON | content::NOSCRIPT_ON,
             ContentLoFiDecider::DetermineCommittedServerPreviewsState(
-                *request, enabled_previews));
+                nullptr, enabled_previews));
 }
 
 }  // namespace data_reduction_proxy
diff --git a/components/download/internal/background_service/entry_utils.cc b/components/download/internal/background_service/entry_utils.cc
index 41cec5c..7bb6cbc3 100644
--- a/components/download/internal/background_service/entry_utils.cc
+++ b/components/download/internal/background_service/entry_utils.cc
@@ -92,6 +92,7 @@
   DCHECK(entry);
   DownloadMetaData meta_data;
   meta_data.guid = entry->guid;
+  meta_data.paused = entry->state == Entry::State::PAUSED;
   if (entry->state == Entry::State::COMPLETE) {
     meta_data.completion_info =
         CompletionInfo(entry->target_file_path, entry->bytes_downloaded,
diff --git a/components/download/public/background_service/download_metadata.cc b/components/download/public/background_service/download_metadata.cc
index ccfd63c..0d869c66 100644
--- a/components/download/public/background_service/download_metadata.cc
+++ b/components/download/public/background_service/download_metadata.cc
@@ -45,13 +45,13 @@
                                  other.response_headers.get());
 }
 
-DownloadMetaData::DownloadMetaData() : current_size(0u) {}
+DownloadMetaData::DownloadMetaData() : current_size(0u), paused(false) {}
 
 DownloadMetaData::DownloadMetaData(const DownloadMetaData& other) = default;
 
 bool DownloadMetaData::operator==(const DownloadMetaData& other) const {
   return guid == other.guid && current_size == other.current_size &&
-         completion_info == other.completion_info;
+         completion_info == other.completion_info && paused == other.paused;
 }
 
 DownloadMetaData::~DownloadMetaData() = default;
diff --git a/components/download/public/background_service/download_metadata.h b/components/download/public/background_service/download_metadata.h
index cd83d49..80900c2 100644
--- a/components/download/public/background_service/download_metadata.h
+++ b/components/download/public/background_service/download_metadata.h
@@ -61,6 +61,9 @@
   // uncompleted download.
   uint64_t current_size;
 
+  // Whether the entry is currently paused by the client.
+  bool paused;
+
   // Info about successfully completed download, or null for in-progress
   // download. Failed download will not be persisted and exposed as meta data.
   base::Optional<CompletionInfo> completion_info;
diff --git a/components/net_log/chrome_net_log.cc b/components/net_log/chrome_net_log.cc
index 878b964..99a1f26 100644
--- a/components/net_log/chrome_net_log.cc
+++ b/components/net_log/chrome_net_log.cc
@@ -14,7 +14,6 @@
 #include "base/values.h"
 #include "build/build_config.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_store.h"
-#include "components/net_log/net_export_file_writer.h"
 #include "components/version_info/version_info.h"
 #include "net/log/file_net_log_observer.h"
 #include "net/log/net_log_util.h"
@@ -28,7 +27,6 @@
 }
 
 ChromeNetLog::~ChromeNetLog() {
-  net_export_file_writer_.reset();
   ClearFileNetLogObserver();
   trace_net_log_observer_->StopWatchForTraceStart();
 }
@@ -47,12 +45,6 @@
   file_net_log_observer_->StartObserving(this, capture_mode);
 }
 
-NetExportFileWriter* ChromeNetLog::net_export_file_writer() {
-  if (!net_export_file_writer_)
-    net_export_file_writer_ = base::WrapUnique(new NetExportFileWriter());
-  return net_export_file_writer_.get();
-}
-
 // static
 std::unique_ptr<base::Value> ChromeNetLog::GetConstants(
     const base::CommandLine::StringType& command_line_string,
diff --git a/components/net_log/chrome_net_log.h b/components/net_log/chrome_net_log.h
index ead1479..39a5c92 100644
--- a/components/net_log/chrome_net_log.h
+++ b/components/net_log/chrome_net_log.h
@@ -24,8 +24,6 @@
 
 namespace net_log {
 
-class NetExportFileWriter;
-
 // ChromeNetLog is an implementation of NetLog that manages common observers
 // (for --log-net-log, chrome://net-export/, tracing), as well as acting as the
 // entry point for other consumers.
@@ -48,8 +46,6 @@
       const base::CommandLine::StringType& command_line_string,
       const std::string& channel_string);
 
-  NetExportFileWriter* net_export_file_writer();
-
   // Returns a Value containing constants needed to load a log file.
   // Safe to call on any thread.
   static std::unique_ptr<base::Value> GetConstants(
@@ -83,9 +79,6 @@
   // (In Chrome this corresponds to the --log-net-log command line).
   std::unique_ptr<net::FileNetLogObserver> file_net_log_observer_;
 
-  // This observer handles writing NetLogs started by chrome://net-export/
-  std::unique_ptr<NetExportFileWriter> net_export_file_writer_;
-
   // This observer forwards NetLog events to the chrome://tracing system.
   std::unique_ptr<net::TraceNetLogObserver> trace_net_log_observer_;
 
diff --git a/components/net_log/net_export_file_writer.h b/components/net_log/net_export_file_writer.h
index 5db38ae..f810099 100644
--- a/components/net_log/net_export_file_writer.h
+++ b/components/net_log/net_export_file_writer.h
@@ -36,14 +36,15 @@
 
 class ChromeNetLog;
 
-// NetExportFileWriter is used exclusively as a support class for net-export.
-// It's a singleton that acts as the interface to all NetExportMessageHandlers
-// which can tell it to start or stop logging in response to user actions from
-// net-export UIs. Because it's a singleton, the logging state can be shared
-// between multiple instances of the net-export UI. Internally, it manages a
+// NetExportFileWriter is used exclusively as a support class for
+// chrome://net-export/. There's a single instance created globally that acts as
+// the interface to all NetExportMessageHandlers which can tell it to start or
+// stop logging in response to user actions from chrome://net-export/ UIs.
+// Because there's only one instance, the logging state can be shared between
+// multiple instances of the chrome://net-export/ UI. Internally, it manages a
 // pipe to an instance of network::NetLogExporter and handles the
 // attaching/detaching of it to the NetLog. This class is used by the iOS and
-// non-iOS implementations of net-export.
+// non-iOS implementations of chrome://net-export/.
 //
 // NetExportFileWriter maintains the current logging state using the members
 // |state_|, |log_exists_|, |log_capture_mode_known_|, |log_capture_mode_|.
@@ -80,6 +81,10 @@
   using FilePathCallback = base::Callback<void(const base::FilePath&)>;
   using DirectoryGetter = base::Callback<bool(base::FilePath*)>;
 
+  // Constructs a NetExportFileWriter. Only one instance is created in browser
+  // process.
+  NetExportFileWriter();
+
   ~NetExportFileWriter();
 
   // Attaches a StateObserver. |observer| will be notified of state changes to
@@ -144,11 +149,6 @@
   // initialization. Should only be used by unit tests.
   void SetDefaultLogBaseDirectoryGetterForTest(const DirectoryGetter& getter);
 
- protected:
-  // Constructs a NetExportFileWriter. Only one instance is created in browser
-  // process.
-  NetExportFileWriter();
-
  private:
   friend class ChromeNetLog;
   friend class NetExportFileWriterTest;
diff --git a/components/ntp_snippets/features.cc b/components/ntp_snippets/features.cc
index 9da28447..5bfa440 100644
--- a/components/ntp_snippets/features.cc
+++ b/components/ntp_snippets/features.cc
@@ -54,7 +54,7 @@
 
 const base::Feature kPublisherFaviconsFromNewServerFeature{
     "ContentSuggestionsFaviconsFromNewServer",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+    base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kRemoteSuggestionsEmulateM58FetchingSchedule{
     "RemoteSuggestionsEmulateM58FetchingSchedule",
diff --git a/components/omnibox/browser/omnibox_edit_model.cc b/components/omnibox/browser/omnibox_edit_model.cc
index 7ab730c..f352325 100644
--- a/components/omnibox/browser/omnibox_edit_model.cc
+++ b/components/omnibox/browser/omnibox_edit_model.cc
@@ -282,6 +282,14 @@
   has_temporary_text_ = false;
 }
 
+void OmniboxEditModel::SetUserTextToURLForEditing() {
+  SetUserText(url_for_editing_);
+  view_->SetWindowTextAndCaretPos(url_for_editing_, 0, false, false);
+
+  // Select all in reverse to ensure the beginning of the URL is shown.
+  view_->SelectAll(true /* reversed */);
+}
+
 void OmniboxEditModel::OnChanged() {
   // Don't call CurrentMatch() when there's no editing, as in this case we'll
   // never actually use it.  This avoids running the autocomplete providers (and
diff --git a/components/omnibox/browser/omnibox_edit_model.h b/components/omnibox/browser/omnibox_edit_model.h
index 083af12..8705198 100644
--- a/components/omnibox/browser/omnibox_edit_model.h
+++ b/components/omnibox/browser/omnibox_edit_model.h
@@ -170,9 +170,14 @@
   // Returns the permanent display text for the current page and Omnibox state.
   base::string16 GetPermanentDisplayText() const;
 
-  // Sets the user_text_ to |text|.  Only the View should call this.
+  // Sets the user_text_ to |text|.
   void SetUserText(const base::string16& text);
 
+  // Sets the user text to be url_for_editing_. This also selects all and
+  // enters user-input-in-progress mode. This method is used to exit both
+  // Steady State Elisions and Query in Omnibox mode.
+  void SetUserTextToURLForEditing();
+
   // Invoked any time the text may have changed in the edit. Notifies the
   // controller.
   void OnChanged();
diff --git a/components/omnibox/browser/omnibox_edit_model_unittest.cc b/components/omnibox/browser/omnibox_edit_model_unittest.cc
index 22e2ba6..6340603b 100644
--- a/components/omnibox/browser/omnibox_edit_model_unittest.cc
+++ b/components/omnibox/browser/omnibox_edit_model_unittest.cc
@@ -264,8 +264,13 @@
   EXPECT_TRUE(model()->GetQueryInOmniboxSearchTerms(&search_terms));
   EXPECT_FALSE(search_terms.empty());
   EXPECT_EQ(base::ASCIIToUTF16("foobar"), search_terms);
-
   EXPECT_FALSE(model()->CurrentTextIsURL());
+
+  // Verify we can exit Query in Omnibox mode properly.
+  model()->SetUserTextToURLForEditing();
+  EXPECT_EQ(base::ASCIIToUTF16("https://www.example.com/"), view()->GetText());
+  EXPECT_TRUE(model()->user_input_in_progress());
+  EXPECT_TRUE(view()->IsSelectAll());
 }
 
 TEST_F(OmniboxEditModelTest, DisablePasteAndGoForLongTexts) {
diff --git a/components/omnibox/browser/search_provider.h b/components/omnibox/browser/search_provider.h
index 4f32d2f9..d87b308 100644
--- a/components/omnibox/browser/search_provider.h
+++ b/components/omnibox/browser/search_provider.h
@@ -95,13 +95,13 @@
   FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, AnswersCache);
   FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, RemoveExtraAnswers);
   FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, DoesNotProvideOnFocus);
-  FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, SendsWarmUpRequestOnFocus);
   FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, DoTrimHttpScheme);
   FRIEND_TEST_ALL_PREFIXES(SearchProviderTest,
                            DontTrimHttpSchemeIfInputHasScheme);
   FRIEND_TEST_ALL_PREFIXES(SearchProviderTest,
                            DontTrimHttpsSchemeIfInputHasScheme);
   FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, DoTrimHttpsScheme);
+  FRIEND_TEST_ALL_PREFIXES(SearchProviderWarmUpTest, SendsWarmUpRequestOnFocus);
   FRIEND_TEST_ALL_PREFIXES(InstantExtendedPrefetchTest, ClearPrefetchedResults);
   FRIEND_TEST_ALL_PREFIXES(InstantExtendedPrefetchTest, SetPrefetchQuery);
 
diff --git a/components/omnibox/browser/shortcuts_provider.cc b/components/omnibox/browser/shortcuts_provider.cc
index 610f7ce..96e73af5 100644
--- a/components/omnibox/browser/shortcuts_provider.cc
+++ b/components/omnibox/browser/shortcuts_provider.cc
@@ -17,6 +17,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram.h"
 #include "base/stl_util.h"
+#include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -388,37 +389,54 @@
                              base::UTF16ToUTF8(shortcut.text));
 
   // Set |inline_autocompletion| and |allowed_to_be_default_match| if possible.
-  // If the match is a search query this is easy: simply check whether the
-  // user text is a prefix of the query.  If the match is a navigation, we
-  // assume the fill_into_edit looks something like a URL, so we use
-  // URLPrefix::GetInlineAutocompleteOffset() to try and strip off any prefixes
-  // that the user might not think would change the meaning, but would
-  // otherwise prevent inline autocompletion.  This allows, for example, the
-  // input of "foo.c" to autocomplete to "foo.com" for a fill_into_edit of
-  // "http://foo.com".
+  // If the input is in keyword mode, navigation matches cannot be the default
+  // match, and search query matches can only be the default match if their
+  // keywords matches the input's keyword, as otherwise, default,
+  // different-keyword matches may result in leaving keyword mode. Additionally,
+  // if the match is a search query, check whether the user text is a prefix of
+  // the query. If the match is a navigation, we assume the fill_into_edit looks
+  // something like a URL, so we use URLPrefix::GetInlineAutocompleteOffset() to
+  // try and strip off any prefixes that the user might not think would change
+  // the meaning, but would otherwise prevent inline autocompletion. This
+  // allows, for example, the input of "foo.c" to autocomplete to "foo.com" for
+  // a fill_into_edit of "http://foo.com".
   const bool is_search_type = AutocompleteMatch::IsSearchType(match.type);
-  if (is_search_type) {
-    if (match.fill_into_edit.size() >= input.text().size() &&
-        std::equal(match.fill_into_edit.begin(),
-                   match.fill_into_edit.begin() + input.text().size(),
-                   input.text().begin(),
-                   SimpleCaseInsensitiveCompareUCS2())) {
-      match.inline_autocompletion =
-          match.fill_into_edit.substr(input.text().length());
-      match.allowed_to_be_default_match =
-          !input.prevent_inline_autocomplete() ||
-          match.inline_autocompletion.empty();
-    }
-  } else {
-    const size_t inline_autocomplete_offset =
-        URLPrefix::GetInlineAutocompleteOffset(
-            input.text(), fixed_up_input_text, true, match.fill_into_edit);
-    if (inline_autocomplete_offset != base::string16::npos) {
-      match.inline_autocompletion =
-          match.fill_into_edit.substr(inline_autocomplete_offset);
-      match.allowed_to_be_default_match =
-          !HistoryProvider::PreventInlineAutocomplete(input) ||
-          match.inline_autocompletion.empty();
+
+  DCHECK(is_search_type != match.keyword.empty());
+
+  // True if input is in keyword mode and the match is a URL suggestion or the
+  // match has a different keyword.
+  bool would_cause_leaving_keyboard_mode =
+      input.prefer_keyword() &&
+      (!is_search_type ||
+       !base::StartsWith(base::UTF16ToUTF8(input.text()),
+                         base::StrCat({base::UTF16ToUTF8(match.keyword), " "}),
+                         base::CompareCase::INSENSITIVE_ASCII));
+
+  if (!would_cause_leaving_keyboard_mode) {
+    if (is_search_type) {
+      if (match.fill_into_edit.size() >= input.text().size() &&
+          std::equal(match.fill_into_edit.begin(),
+                     match.fill_into_edit.begin() + input.text().size(),
+                     input.text().begin(),
+                     SimpleCaseInsensitiveCompareUCS2())) {
+        match.inline_autocompletion =
+            match.fill_into_edit.substr(input.text().length());
+        match.allowed_to_be_default_match =
+            !input.prevent_inline_autocomplete() ||
+            match.inline_autocompletion.empty();
+      }
+    } else {
+      const size_t inline_autocomplete_offset =
+          URLPrefix::GetInlineAutocompleteOffset(
+              input.text(), fixed_up_input_text, true, match.fill_into_edit);
+      if (inline_autocomplete_offset != base::string16::npos) {
+        match.inline_autocompletion =
+            match.fill_into_edit.substr(inline_autocomplete_offset);
+        match.allowed_to_be_default_match =
+            !HistoryProvider::PreventInlineAutocomplete(input) ||
+            match.inline_autocompletion.empty();
+      }
     }
   }
 
diff --git a/components/omnibox/browser/shortcuts_provider_unittest.cc b/components/omnibox/browser/shortcuts_provider_unittest.cc
index e374598f..865ada6 100644
--- a/components/omnibox/browser/shortcuts_provider_unittest.cc
+++ b/components/omnibox/browser/shortcuts_provider_unittest.cc
@@ -39,139 +39,126 @@
 namespace {
 
 struct TestShortcutData shortcut_test_db[] = {
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E0", "goog", "www.google.com",
-    "http://www.google.com/", "Google", "0,1,4,0", "Google", "0,3,4,1",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 1,
-    100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E1", "slash", "slashdot.org",
-    "http://slashdot.org/", "slashdot.org", "0,3,5,1",
-    "Slashdot - News for nerds, stuff that matters", "0,2,5,0",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 0,
-    100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E2", "news", "slashdot.org",
-    "http://slashdot.org/", "slashdot.org", "0,1",
-    "Slashdot - News for nerds, stuff that matters", "0,0,11,2,15,0",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_TITLE, "", 0,
-    5 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E3", "news", "sports.yahoo.com",
-    "http://sports.yahoo.com/", "sports.yahoo.com", "0,1",
-    "Yahoo! Sports - Sports News, Scores, Rumors, Fantasy Games, and more",
-    "0,0,23,2,27,0", ui::PAGE_TRANSITION_TYPED,
-    AutocompleteMatchType::HISTORY_TITLE, "", 2, 5 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E4", "news weather",
-    "www.cnn.com/index.html", "http://www.cnn.com/index.html",
-    "www.cnn.com/index.html", "0,1",
-    "CNN.com - Breaking News, U.S., World, Weather, Entertainment & Video",
-    "0,0,19,2,23,0,38,2,45,0", ui::PAGE_TRANSITION_TYPED,
-    AutocompleteMatchType::HISTORY_TITLE, "", 1, 10 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E5", "nhl scores", "sports.yahoo.com",
-    "http://sports.yahoo.com/", "sports.yahoo.com", "0,1",
-    "Yahoo! Sports - Sports News, Scores, Rumors, Fantasy Games, and more",
-    "0,0,29,2,35,0", ui::PAGE_TRANSITION_TYPED,
-    AutocompleteMatchType::HISTORY_BODY, "", 1, 10 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E6", "nhl scores",
-    "www.nhl.com/scores/index.html", "http://www.nhl.com/scores/index.html",
-    "www.nhl.com/scores/index.html", "0,1,4,3,7,1",
-    "January 13, 2010 - NHL.com - Scores", "0,0,19,2,22,0,29,2,35,0",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 5,
-    1 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E7", "just", "www.testsite.com/a.html",
-    "http://www.testsite.com/a.html", "www.testsite.com/a.html", "0,1",
-    "Test - site - just a test", "0,0,14,2,18,0",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_TITLE, "", 5,
-    1 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E8", "just", "www.testsite.com/b.html",
-    "http://www.testsite.com/b.html", "www.testsite.com/b.html", "0,1",
-    "Test - site - just a test", "0,0,14,2,18,0",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_TITLE, "", 5,
-    2 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880E9", "just", "www.testsite.com/c.html",
-    "http://www.testsite.com/c.html", "www.testsite.com/c.html", "0,1",
-    "Test - site - just a test", "0,0,14,2,18,0",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_TITLE, "", 8,
-    1 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880EA", "just a", "www.testsite.com/d.html",
-    "http://www.testsite.com/d.html", "www.testsite.com/d.html", "0,1",
-    "Test - site - just a test", "0,0,14,2,18,0",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_TITLE, "",
-    12, 1 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880EB", "just a t",
-    "www.testsite.com/e.html", "http://www.testsite.com/e.html",
-    "www.testsite.com/e.html", "0,1", "Test - site - just a test",
-    "0,0,14,2,18,0", ui::PAGE_TRANSITION_TYPED,
-    AutocompleteMatchType::HISTORY_TITLE, "", 12, 1 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880EC", "just a te",
-    "www.testsite.com/f.html", "http://www.testsite.com/f.html",
-    "www.testsite.com/f.html", "0,1", "Test - site - just a test",
-    "0,0,14,2,18,0", ui::PAGE_TRANSITION_TYPED,
-    AutocompleteMatchType::HISTORY_TITLE, "", 12, 1 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880ED", "ago", "www.daysagotest.com/a.html",
-    "http://www.daysagotest.com/a.html", "www.daysagotest.com/a.html",
-    "0,1,8,3,11,1", "Test - site", "0,0", ui::PAGE_TRANSITION_TYPED,
-    AutocompleteMatchType::HISTORY_URL, "", 1, 1 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880EE", "ago", "www.daysagotest.com/b.html",
-    "http://www.daysagotest.com/b.html", "www.daysagotest.com/b.html",
-    "0,1,8,3,11,1", "Test - site", "0,0", ui::PAGE_TRANSITION_TYPED,
-    AutocompleteMatchType::HISTORY_URL, "", 2, 1 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880EF", "ago", "www.daysagotest.com/c.html",
-    "http://www.daysagotest.com/c.html", "www.daysagotest.com/c.html",
-    "0,1,8,3,11,1", "Test - site", "0,0", ui::PAGE_TRANSITION_TYPED,
-    AutocompleteMatchType::HISTORY_URL, "", 3, 1 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880F0", "ago", "www.daysagotest.com/d.html",
-    "http://www.daysagotest.com/d.html", "www.daysagotest.com/d.html",
-    "0,1,8,3,11,1", "Test - site", "0,0", ui::PAGE_TRANSITION_TYPED,
-    AutocompleteMatchType::HISTORY_URL, "", 4, 1 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880F2", "abcdef.com", "http://abcdef.com",
-    "http://abcdef.com/", "Abcdef", "0,1,4,0", "Abcdef", "0,3,4,1",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 1,
-    100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880F3", "query", "query",
-    "https://www.google.com/search?q=query", "query", "0,0",
-    "Google Search", "0,4", ui::PAGE_TRANSITION_GENERATED,
-    AutocompleteMatchType::SEARCH_HISTORY, "", 1, 100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880F4", "word", "www.word",
-    "https://www.google.com/search?q=www.word", "www.word", "0,0",
-    "Google Search", "0,4", ui::PAGE_TRANSITION_GENERATED,
-    AutocompleteMatchType::SEARCH_HISTORY, "", 1, 100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880F5", "about:o", "chrome://omnibox",
-    "chrome://omnibox/", "about:omnibox", "0,3,10,1", "", "",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::NAVSUGGEST, "",
-    1, 100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880F6", "www/real sp",
-    "http://www/real space/long-url-with-space.html",
-    "http://www/real%20space/long-url-with-space.html",
-    "www/real space/long-url-with-space.html", "0,3,11,1",
-    "Page With Space; Input with Space", "0,0",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "",
-    1, 100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880F7", "duplicate", "http://duplicate.com",
-    "http://duplicate.com/", "Duplicate", "0,1", "Duplicate", "0,1",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 1,
-    100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880F8", "dupl", "http://duplicate.com",
-    "http://duplicate.com/", "Duplicate", "0,1", "Duplicate", "0,1",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 1,
-    100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880F9", "notrailing.com/",
-    "http://notrailing.com", "http://notrailing.com/", "No Trailing Slash",
-    "0,1", "No Trailing Slash on fill_into_edit", "0,1",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "",
-    1, 100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880FA", "http:///foo.com",
-    "http://foo.com", "http://foo.com/", "Foo - Typo in Input",
-    "0,1", "Foo - Typo in Input Corrected in fill_into_edit", "0,1",
-    ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "",
-    1, 100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880FB", "trailing1 ",
-    "http://trailing1.com", "http://trailing1.com/",
-    "Trailing1 - Space in Shortcut", "0,1",
-    "Trailing1 - Space in Shortcut", "0,1", ui::PAGE_TRANSITION_TYPED,
-    AutocompleteMatchType::HISTORY_URL, "", 1, 100 },
-  { "BD85DBA2-8C29-49F9-84AE-48E1E90880FC", "about:trailing2 ",
-    "chrome://trailing2blah", "chrome://trailing2blah/",
-    "Trailing2 - Space in Shortcut", "0,1",
-    "Trailing2 - Space in Shortcut", "0,1", ui::PAGE_TRANSITION_TYPED,
-    AutocompleteMatchType::HISTORY_URL, "", 1, 100 },
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880E0", "goog", "www.google.com",
+     "http://www.google.com/", "Google", "0,1,4,0", "Google", "0,3,4,1",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 1, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880E1", "slash", "slashdot.org",
+     "http://slashdot.org/", "slashdot.org", "0,3,5,1",
+     "Slashdot - News for nerds, stuff that matters", "0,2,5,0",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 0, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880E2", "news", "slashdot.org",
+     "http://slashdot.org/", "slashdot.org", "0,1",
+     "Slashdot - News for nerds, stuff that matters", "0,0,11,2,15,0",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_TITLE, "", 0, 5},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880E3", "news", "sports.yahoo.com",
+     "http://sports.yahoo.com/", "sports.yahoo.com", "0,1",
+     "Yahoo! Sports - Sports News, Scores, Rumors, Fantasy Games, and more",
+     "0,0,23,2,27,0", ui::PAGE_TRANSITION_TYPED,
+     AutocompleteMatchType::HISTORY_TITLE, "", 2, 5},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880E4", "news weather",
+     "www.cnn.com/index.html", "http://www.cnn.com/index.html",
+     "www.cnn.com/index.html", "0,1",
+     "CNN.com - Breaking News, U.S., World, Weather, Entertainment & Video",
+     "0,0,19,2,23,0,38,2,45,0", ui::PAGE_TRANSITION_TYPED,
+     AutocompleteMatchType::HISTORY_TITLE, "", 1, 10},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880E5", "nhl scores", "sports.yahoo.com",
+     "http://sports.yahoo.com/", "sports.yahoo.com", "0,1",
+     "Yahoo! Sports - Sports News, Scores, Rumors, Fantasy Games, and more",
+     "0,0,29,2,35,0", ui::PAGE_TRANSITION_TYPED,
+     AutocompleteMatchType::HISTORY_BODY, "", 1, 10},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880E6", "nhl scores",
+     "www.nhl.com/scores/index.html", "http://www.nhl.com/scores/index.html",
+     "www.nhl.com/scores/index.html", "0,1,4,3,7,1",
+     "January 13, 2010 - NHL.com - Scores", "0,0,19,2,22,0,29,2,35,0",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 5, 1},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880E7", "just", "www.testsite.com/a.html",
+     "http://www.testsite.com/a.html", "www.testsite.com/a.html", "0,1",
+     "Test - site - just a test", "0,0,14,2,18,0", ui::PAGE_TRANSITION_TYPED,
+     AutocompleteMatchType::HISTORY_TITLE, "", 5, 1},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880E8", "just", "www.testsite.com/b.html",
+     "http://www.testsite.com/b.html", "www.testsite.com/b.html", "0,1",
+     "Test - site - just a test", "0,0,14,2,18,0", ui::PAGE_TRANSITION_TYPED,
+     AutocompleteMatchType::HISTORY_TITLE, "", 5, 2},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880E9", "just", "www.testsite.com/c.html",
+     "http://www.testsite.com/c.html", "www.testsite.com/c.html", "0,1",
+     "Test - site - just a test", "0,0,14,2,18,0", ui::PAGE_TRANSITION_TYPED,
+     AutocompleteMatchType::HISTORY_TITLE, "", 8, 1},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880EA", "just a",
+     "www.testsite.com/d.html", "http://www.testsite.com/d.html",
+     "www.testsite.com/d.html", "0,1", "Test - site - just a test",
+     "0,0,14,2,18,0", ui::PAGE_TRANSITION_TYPED,
+     AutocompleteMatchType::HISTORY_TITLE, "", 12, 1},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880EB", "just a t",
+     "www.testsite.com/e.html", "http://www.testsite.com/e.html",
+     "www.testsite.com/e.html", "0,1", "Test - site - just a test",
+     "0,0,14,2,18,0", ui::PAGE_TRANSITION_TYPED,
+     AutocompleteMatchType::HISTORY_TITLE, "", 12, 1},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880EC", "just a te",
+     "www.testsite.com/f.html", "http://www.testsite.com/f.html",
+     "www.testsite.com/f.html", "0,1", "Test - site - just a test",
+     "0,0,14,2,18,0", ui::PAGE_TRANSITION_TYPED,
+     AutocompleteMatchType::HISTORY_TITLE, "", 12, 1},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880ED", "ago",
+     "www.daysagotest.com/a.html", "http://www.daysagotest.com/a.html",
+     "www.daysagotest.com/a.html", "0,1,8,3,11,1", "Test - site", "0,0",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 1, 1},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880EE", "ago",
+     "www.daysagotest.com/b.html", "http://www.daysagotest.com/b.html",
+     "www.daysagotest.com/b.html", "0,1,8,3,11,1", "Test - site", "0,0",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 2, 1},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880EF", "ago",
+     "www.daysagotest.com/c.html", "http://www.daysagotest.com/c.html",
+     "www.daysagotest.com/c.html", "0,1,8,3,11,1", "Test - site", "0,0",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 3, 1},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880F0", "ago",
+     "www.daysagotest.com/d.html", "http://www.daysagotest.com/d.html",
+     "www.daysagotest.com/d.html", "0,1,8,3,11,1", "Test - site", "0,0",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 4, 1},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880F2", "abcdef.com", "http://abcdef.com",
+     "http://abcdef.com/", "Abcdef", "0,1,4,0", "Abcdef", "0,3,4,1",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 1, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880F3", "query", "query",
+     "https://www.google.com/search?q=query", "query", "0,0", "Google Search",
+     "0,4", ui::PAGE_TRANSITION_GENERATED,
+     AutocompleteMatchType::SEARCH_HISTORY, "google.com", 1, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880F4", "word", "www.word",
+     "https://www.google.com/search?q=www.word", "www.word", "0,0",
+     "Google Search", "0,4", ui::PAGE_TRANSITION_GENERATED,
+     AutocompleteMatchType::SEARCH_HISTORY, "google.com", 1, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880F5", "about:o", "chrome://omnibox",
+     "chrome://omnibox/", "about:omnibox", "0,3,10,1", "", "",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::NAVSUGGEST, "", 1, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880F6", "www/real sp",
+     "http://www/real space/long-url-with-space.html",
+     "http://www/real%20space/long-url-with-space.html",
+     "www/real space/long-url-with-space.html", "0,3,11,1",
+     "Page With Space; Input with Space", "0,0", ui::PAGE_TRANSITION_TYPED,
+     AutocompleteMatchType::HISTORY_URL, "", 1, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880F7", "duplicate",
+     "http://duplicate.com", "http://duplicate.com/", "Duplicate", "0,1",
+     "Duplicate", "0,1", ui::PAGE_TRANSITION_TYPED,
+     AutocompleteMatchType::HISTORY_URL, "", 1, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880F8", "dupl", "http://duplicate.com",
+     "http://duplicate.com/", "Duplicate", "0,1", "Duplicate", "0,1",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 1, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880F9", "notrailing.com/",
+     "http://notrailing.com", "http://notrailing.com/", "No Trailing Slash",
+     "0,1", "No Trailing Slash on fill_into_edit", "0,1",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 1, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880FA", "http:///foo.com",
+     "http://foo.com", "http://foo.com/", "Foo - Typo in Input", "0,1",
+     "Foo - Typo in Input Corrected in fill_into_edit", "0,1",
+     ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "", 1, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880FB", "trailing1 ",
+     "http://trailing1.com", "http://trailing1.com/",
+     "Trailing1 - Space in Shortcut", "0,1", "Trailing1 - Space in Shortcut",
+     "0,1", ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "",
+     1, 100},
+    {"BD85DBA2-8C29-49F9-84AE-48E1E90880FC", "about:trailing2 ",
+     "chrome://trailing2blah", "chrome://trailing2blah/",
+     "Trailing2 - Space in Shortcut", "0,1", "Trailing2 - Space in Shortcut",
+     "0,1", ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::HISTORY_URL, "",
+     1, 100},
 };
 
 }  // namespace
diff --git a/components/os_crypt/os_crypt_win.cc b/components/os_crypt/os_crypt_win.cc
index beff2c7..792233d 100644
--- a/components/os_crypt/os_crypt_win.cc
+++ b/components/os_crypt/os_crypt_win.cc
@@ -7,7 +7,7 @@
 #include <windows.h>
 
 #include "base/strings/utf_string_conversions.h"
-#include "crypto/wincrypt_shim.h"
+#include "base/win/wincrypt_shim.h"
 
 bool OSCrypt::EncryptString16(const base::string16& plaintext,
                               std::string* ciphertext) {
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index cb69f89..812a660e 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -2359,8 +2359,7 @@
 <translation id="7433714841194914373">Google Instant aktivieren</translation>
 <translation id="7443061725198440541">Wenn diese Richtlinie nicht festgelegt oder aktiviert wird, darf der Nutzer die Rechtschreibprüfung verwenden.
 
-      Wenn diese Richtlinie deaktiviert wird, darf der Benutzer die Rechtschreibprüfung nicht verwenden. Die Richtlinie "SpellcheckLanguage" wird darüber hinaus ignoriert, wenn diese Richtlinie deaktiviert ist.
-      </translation>
+      Wenn diese Richtlinie deaktiviert wird, darf der Nutzer die Rechtschreibprüfung nicht verwenden. Die Richtlinie "SpellcheckLanguage" wird darüber hinaus ignoriert, wenn diese Richtlinie deaktiviert ist.</translation>
 <translation id="7443616896860707393">Ursprungsübergreifende HTTP-Basic-Authentifizierungsabfragen</translation>
 <translation id="7458437477941640506">Führen Sie kein Rollback auf die Zielversion durch, wenn die Version des Betriebssystems neuer als die der Zielversion ist. Aktualisierungen sind ebenfalls deaktiviert.</translation>
 <translation id="7464991223784276288">Cookies von übereinstimmenden URLs auf die aktuelle Sitzung beschränken</translation>
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index f9850515..19cbfdea 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -453,6 +453,9 @@
 <translation id="2201555246697292490">Konfigurer godkjenning av innebygde meldinger</translation>
 <translation id="2204753382813641270">Kontrollér automatisk skjuling av hyllen</translation>
 <translation id="2208976000652006649">Parametere for søkenettadresser som bruker POST</translation>
+<translation id="2214880135980649323">Når denne innstillingen er aktivert, får utvidelser installert via bedriftsinnstillinger tilgang til å bruke Enterprise Hardware Platform API.
+     Når denne innstillingen er deaktivert eller ingen verdi er angitt, får ingen utvidelser tilgang til Enterprise Hardware Platform API.
+     Denne innstillingen gjelder også for komponentutvidelser, for eksempel Hangout Services-utvidelsen.</translation>
 <translation id="2223598546285729819">Standardinnstilling for varslinger</translation>
 <translation id="2231817271680715693">Importér nettleserlogg fra standard nettleser ved første kjøring</translation>
 <translation id="2236488539271255289">Ikke la noen nettsteder angi lokale data</translation>
@@ -2832,6 +2835,25 @@
 <translation id="8465065632133292531">Parametere for Instant-nettadresser som bruker POST</translation>
 <translation id="847472800012384958">Ikke la noen nettsteder vise forgrunnsvinduer</translation>
 <translation id="8477885780684655676">TLS 1.0</translation>
+<translation id="8483004350080020634">Fjerner sensitive deler som personvern- og sikkerhetsrelaterte deler fra https://-nettadresser før adressene går videre til PAC-skript (Proxy Auto Config), som brukes av <ph name="PRODUCT_NAME" /> til å finne proxy-tjeneradresser.
+
+      Når verdien er True (sann), er sikkerhetsfunksjonen aktivert, og https://-nettadresser
+      modifiseres før de videresendes til et PAC-skript. Dermed kan ikke PAC-skript
+      se data som vanligvis er beskyttet av en kryptert kanal (for eksempel
+      nettadressens bane og søkestreng).
+
+      Når verdien er False (usann), blir sikkerhetsfunksjonen deaktivert, og PAC-skript
+      kan dermed se alle komponenter i https://-nettadresser. Dette gjelder for
+      alle PAC-skript, uansett opphav (inkludert de som er hentet via en usikker
+      transportmetode, eller som er oppdaget uten sikkerhet via WPAD).
+
+      Standardverdien er True (usann), og sikkerhetsfunksjon er da aktivert.
+
+      Vi anbefaler at du angir verdien True (sann). Den eneste grunnen til å angi False (usann)
+      er hvis dette er nødvendig for å unngå kompatibilitetsproblemer med
+      eksisterende PAC-skript.
+
+      Innstillingen fjernes i M75.</translation>
 <translation id="8484458986062090479">Tilpass listen over nettadressemønstre som alltid skal gjengis av vertsnettleseren.
 
           Hvis denne regelen ikke er angitt, brukes standardgjengivelsen for alle nettsteder, slik den er angitt i regelen «ChromeFrameRendererSettings».
diff --git a/components/previews/content/BUILD.gn b/components/previews/content/BUILD.gn
index 37e2853..b3d00926 100644
--- a/components/previews/content/BUILD.gn
+++ b/components/previews/content/BUILD.gn
@@ -30,6 +30,7 @@
     "//components/variations",
     "//content/public/common",
     "//net",
+    "//services/network:network_service",
   ]
 }
 
@@ -55,6 +56,8 @@
     "//components/variations",
     "//content/public/common",
     "//net:test_support",
+    "//services/network:network_service",
+    "//services/network:test_support",
     "//testing/gtest",
   ]
 }
diff --git a/components/previews/content/DEPS b/components/previews/content/DEPS
index 3ecca97f..f226b3f4 100644
--- a/components/previews/content/DEPS
+++ b/components/previews/content/DEPS
@@ -5,4 +5,5 @@
   "+components/variations",
   "+content/public/common",
   "+net",
+  "+services/network",
 ]
diff --git a/components/previews/content/previews_content_util.cc b/components/previews/content/previews_content_util.cc
index f7b3e7c..4bd2a65 100644
--- a/components/previews/content/previews_content_util.cc
+++ b/components/previews/content/previews_content_util.cc
@@ -6,7 +6,6 @@
 
 #include "base/metrics/histogram_macros.h"
 #include "components/previews/content/previews_user_data.h"
-#include "net/url_request/url_request.h"
 
 namespace previews {
 
@@ -17,7 +16,10 @@
 }
 
 content::PreviewsState DetermineEnabledClientPreviewsState(
-    const net::URLRequest& url_request,
+    previews::PreviewsUserData* previews_data,
+    const GURL& url,
+    bool is_reload,
+    bool is_data_saver_user,
     previews::PreviewsDecider* previews_decider) {
   content::PreviewsState previews_state = content::PREVIEWS_UNSPECIFIED;
 
@@ -25,33 +27,38 @@
     return previews_state;
   }
 
-  if (!url_request.url().SchemeIsHTTPOrHTTPS()) {
+  if (!url.SchemeIsHTTPOrHTTPS()) {
     return previews_state;
   }
 
-  if (previews_decider->ShouldAllowPreview(
-          url_request, previews::PreviewsType::RESOURCE_LOADING_HINTS)) {
-    previews_state |= content::RESOURCE_LOADING_HINTS_ON;
-    // Initiate load of any applicable hint details.
-    previews_decider->LoadResourceHints(url_request);
-  }
-
-  if (previews_decider->ShouldAllowPreview(url_request,
+  if (previews_decider->ShouldAllowPreview(previews_data, url, is_reload,
                                            previews::PreviewsType::OFFLINE)) {
     previews_state |= content::OFFLINE_PAGE_ON;
   }
 
-  // Check for client-side previews in precendence order.
+  // Only offline previews can be shown for non-data saver users.
+  if (!is_data_saver_user)
+    return previews_state;
+
+  if (previews_decider->ShouldAllowPreview(
+          previews_data, url, is_reload,
+          previews::PreviewsType::RESOURCE_LOADING_HINTS)) {
+    previews_state |= content::RESOURCE_LOADING_HINTS_ON;
+    // Initiate load of any applicable hint details.
+    previews_decider->LoadResourceHints(url);
+  }
+
+  // Check for client-side previews in precedence order.
   // Note: this is for the beginning of navigation so we should not
   // check for https here (since an http request may redirect to https).
-  if (previews_decider->ShouldAllowPreview(url_request,
+  if (previews_decider->ShouldAllowPreview(previews_data, url, is_reload,
                                            previews::PreviewsType::NOSCRIPT)) {
     previews_state |= content::NOSCRIPT_ON;
   }
 
   if (previews::params::IsClientLoFiEnabled() &&
       previews_decider->ShouldAllowPreviewAtECT(
-          url_request, previews::PreviewsType::LOFI,
+          previews_data, url, is_reload, previews::PreviewsType::LOFI,
           previews::params::EffectiveConnectionTypeThresholdForClientLoFi(),
           previews::params::GetBlackListedHostsForClientLoFiFieldTrial(),
           false)) {
@@ -62,15 +69,14 @@
 }
 
 content::PreviewsState DetermineCommittedClientPreviewsState(
-    const net::URLRequest& url_request,
+    previews::PreviewsUserData* previews_data,
+    const GURL& url,
     content::PreviewsState previews_state,
     const previews::PreviewsDecider* previews_decider) {
-  bool is_https = url_request.url().SchemeIs(url::kHttpsScheme);
+  bool is_https = url.SchemeIs(url::kHttpsScheme);
 
-  previews::PreviewsUserData* previews_user_data =
-      previews::PreviewsUserData::GetData(url_request);
   // Check if an offline preview was actually served.
-  if (previews_user_data && previews_user_data->offline_preview_used()) {
+  if (previews_data && previews_data->offline_preview_used()) {
     DCHECK(previews_state & content::OFFLINE_PAGE_ON);
     return content::OFFLINE_PAGE_ON;
   }
@@ -87,8 +93,7 @@
                              content::SERVER_LOFI_ON | content::CLIENT_LOFI_ON);
   }
 
-  if (previews_user_data &&
-      previews_user_data->cache_control_no_transform_directive()) {
+  if (previews_data && previews_data->cache_control_no_transform_directive()) {
     if (HasEnabledPreviews(previews_state)) {
       UMA_HISTOGRAM_ENUMERATION(
           "Previews.CacheControlNoTransform.BlockedPreview",
@@ -105,7 +110,8 @@
     // with it if the committed URL has HTTPS scheme and is allowed by decider.
     if (is_https && previews_decider &&
         previews_decider->IsURLAllowedForPreview(
-            url_request, previews::PreviewsType::RESOURCE_LOADING_HINTS)) {
+            previews_data, url,
+            previews::PreviewsType::RESOURCE_LOADING_HINTS)) {
       return content::RESOURCE_LOADING_HINTS_ON;
     }
     // Remove RESOURCE_LOADING_HINTS_ON from |previews_state| since we decided
@@ -118,7 +124,7 @@
     // if the committed URL has HTTPS scheme and is allowed by decider.
     if (is_https && previews_decider &&
         previews_decider->IsURLAllowedForPreview(
-            url_request, previews::PreviewsType::NOSCRIPT)) {
+            previews_data, url, previews::PreviewsType::NOSCRIPT)) {
       return content::NOSCRIPT_ON;
     }
     return content::PREVIEWS_OFF;
diff --git a/components/previews/content/previews_content_util.h b/components/previews/content/previews_content_util.h
index c814f09..19cd652 100644
--- a/components/previews/content/previews_content_util.h
+++ b/components/previews/content/previews_content_util.h
@@ -13,12 +13,17 @@
 // Returns whether |previews_state| has any enabled previews.
 bool HasEnabledPreviews(content::PreviewsState previews_state);
 
-// Returns the bitmask of enabled client-side previews for |url_request| and
-// the current effective network connection given |previews_decider|.
+// Returns the bitmask of enabled client-side previews for |url| and the
+// current effective network connection given |previews_decider|.
 // This handles the mapping of previews::PreviewsType enum values to bitmask
 // definitions for content::PreviewsState.
+// |is_reload| is used to eliminate certain preview types, and |previews_data|
+// is populated with relevant information.
 content::PreviewsState DetermineEnabledClientPreviewsState(
-    const net::URLRequest& url_request,
+    previews::PreviewsUserData* previews_data,
+    const GURL& url,
+    bool is_reload,
+    bool is_data_saver_user,
     previews::PreviewsDecider* previews_decider);
 
 // Returns an updated PreviewsState given |previews_state| that has already
@@ -26,7 +31,8 @@
 // time. It will defer to any server preview set, otherwise it chooses which
 // client preview bits to retain for processing the main frame response.
 content::PreviewsState DetermineCommittedClientPreviewsState(
-    const net::URLRequest& url_request,
+    previews::PreviewsUserData* previews_data,
+    const GURL& url,
     content::PreviewsState previews_state,
     const previews::PreviewsDecider* previews_decider);
 
diff --git a/components/previews/content/previews_content_util_unittest.cc b/components/previews/content/previews_content_util_unittest.cc
index ff164e9..b6efc2b3 100644
--- a/components/previews/content/previews_content_util_unittest.cc
+++ b/components/previews/content/previews_content_util_unittest.cc
@@ -9,10 +9,8 @@
 
 #include "base/message_loop/message_loop.h"
 #include "base/test/scoped_feature_list.h"
+#include "components/previews/content/previews_user_data.h"
 #include "content/public/common/previews_state.h"
-#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_test_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
@@ -28,29 +26,34 @@
   ~PreviewEnabledPreviewsDecider() override {}
 
   bool ShouldAllowPreviewAtECT(
-      const net::URLRequest& request,
+      PreviewsUserData* previews_data,
+      const GURL& url,
+      bool is_reload,
       PreviewsType type,
       net::EffectiveConnectionType effective_connection_type_threshold,
-      const std::vector<std::string>& host_blacklist_from_server,
-      bool ignore_long_term_black_list_rules) const override {
+      const std::vector<std::string>& host_blacklist_from_finch,
+      bool is_server_preview) const override {
     return IsEnabled(type);
   }
 
-  bool ShouldAllowPreview(const net::URLRequest& request,
+  bool ShouldAllowPreview(PreviewsUserData* previews_data,
+                          const GURL& url,
+                          bool is_reload,
                           PreviewsType type) const override {
-    return ShouldAllowPreviewAtECT(request, type,
+    return ShouldAllowPreviewAtECT(previews_data, url, is_reload, type,
                                    params::GetECTThresholdForPreview(type),
                                    std::vector<std::string>(), false);
   }
 
-  bool IsURLAllowedForPreview(const net::URLRequest& request,
+  bool IsURLAllowedForPreview(PreviewsUserData* previews_data,
+                              const GURL& url,
                               PreviewsType type) const override {
     EXPECT_TRUE(type == PreviewsType::NOSCRIPT ||
                 type == PreviewsType::RESOURCE_LOADING_HINTS);
     return IsEnabled(type);
   }
 
-  void LoadResourceHints(const net::URLRequest& request) override {}
+  void LoadResourceHints(const GURL& url) override {}
 
  private:
   bool IsEnabled(PreviewsType type) const {
@@ -87,26 +90,11 @@
     return &enabled_previews_decider_;
   }
 
-  std::unique_ptr<net::URLRequest> CreateRequest() const {
-    return CreateRequestWithURL(GURL("http://example.com"));
-  }
-
-  std::unique_ptr<net::URLRequest> CreateHttpsRequest() const {
-    return CreateRequestWithURL(GURL("https://secure.example.com"));
-  }
-
-  std::unique_ptr<net::URLRequest> CreateRequestWithURL(const GURL& url) const {
-    return context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr,
-                                  TRAFFIC_ANNOTATION_FOR_TESTS);
-  }
-
  protected:
-  // Needed for TestURLRequestContext.
   base::MessageLoopForIO loop_;
 
  private:
   PreviewEnabledPreviewsDecider enabled_previews_decider_;
-  net::TestURLRequestContext context_;
 };
 
 TEST_F(PreviewsContentUtilTest,
@@ -115,23 +103,47 @@
   scoped_feature_list.InitFromCommandLine(
       "ClientLoFi,ResourceLoadingHints,NoScriptPreviews" /* enable_features */,
       "Previews" /* disable_features */);
+  PreviewsUserData user_data(1);
   EXPECT_EQ(content::PREVIEWS_UNSPECIFIED,
             previews::DetermineEnabledClientPreviewsState(
-                *CreateHttpsRequest(), enabled_previews_decider()));
+                &user_data, GURL("http://www.google.com"), false, true,
+                enabled_previews_decider()));
   EXPECT_EQ(content::PREVIEWS_UNSPECIFIED,
             previews::DetermineEnabledClientPreviewsState(
-                *CreateRequest(), enabled_previews_decider()));
+                &user_data, GURL("http://www.google.com"), false, true,
+                enabled_previews_decider()));
+}
+
+TEST_F(PreviewsContentUtilTest,
+       DetermineEnabledClientPreviewsStateDataSaverDisabled) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitFromCommandLine(
+      "Previews,ClientLoFi,ResourceLoadingHints,NoScriptPreviews",
+      {} /* disable_features */);
+  PreviewsUserData user_data(1);
+  EXPECT_EQ(content::OFFLINE_PAGE_ON | content::CLIENT_LOFI_ON |
+                content::RESOURCE_LOADING_HINTS_ON | content::NOSCRIPT_ON,
+            previews::DetermineEnabledClientPreviewsState(
+                &user_data, GURL("http://www.google.com"), false, true,
+                enabled_previews_decider()));
+  EXPECT_EQ(content::OFFLINE_PAGE_ON,
+            previews::DetermineEnabledClientPreviewsState(
+                &user_data, GURL("http://www.google.com"), false, false,
+                enabled_previews_decider()));
 }
 
 TEST_F(PreviewsContentUtilTest, DetermineEnabledClientPreviewsStateClientLoFi) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitFromCommandLine("Previews,ClientLoFi", std::string());
+  PreviewsUserData user_data(1);
   EXPECT_TRUE(content::CLIENT_LOFI_ON &
               previews::DetermineEnabledClientPreviewsState(
-                  *CreateHttpsRequest(), enabled_previews_decider()));
+                  &user_data, GURL("https://www.google.com"), false, true,
+                  enabled_previews_decider()));
   EXPECT_TRUE(content::CLIENT_LOFI_ON &
               previews::DetermineEnabledClientPreviewsState(
-                  *CreateRequest(), enabled_previews_decider()));
+                  &user_data, GURL("http://www.google.com"), false, true,
+                  enabled_previews_decider()));
 }
 
 TEST_F(PreviewsContentUtilTest,
@@ -139,12 +151,15 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitFromCommandLine("Previews,ResourceLoadingHints",
                                           std::string());
+  PreviewsUserData user_data(1);
   EXPECT_LT(0, content::RESOURCE_LOADING_HINTS_ON &
                    previews::DetermineEnabledClientPreviewsState(
-                       *CreateHttpsRequest(), enabled_previews_decider()));
+                       &user_data, GURL("https://www.google.com"), false, true,
+                       enabled_previews_decider()));
   EXPECT_LT(0, content::RESOURCE_LOADING_HINTS_ON &
                    previews::DetermineEnabledClientPreviewsState(
-                       *CreateRequest(), enabled_previews_decider()));
+                       &user_data, GURL("http://www.google.com"), false, true,
+                       enabled_previews_decider()));
 }
 
 TEST_F(PreviewsContentUtilTest,
@@ -154,20 +169,22 @@
   scoped_feature_list.InitFromCommandLine(
       "Previews,ClientLoFi,NoScriptPreviews", std::string());
 
+  PreviewsUserData user_data(1);
   // Verify both are enabled.
   EXPECT_TRUE((content::NOSCRIPT_ON | content::CLIENT_LOFI_ON) &
               previews::DetermineEnabledClientPreviewsState(
-                  *CreateHttpsRequest(), enabled_previews_decider()));
+                  &user_data, GURL("https://www.google.com"), false, true,
+                  enabled_previews_decider()));
   EXPECT_TRUE((content::NOSCRIPT_ON | content::CLIENT_LOFI_ON) &
               previews::DetermineEnabledClientPreviewsState(
-                  *CreateRequest(), enabled_previews_decider()));
+                  &user_data, GURL("http://www.google.com"), false, true,
+                  enabled_previews_decider()));
 
   // Verify non-HTTP[S] URL has no previews enabled.
-  std::unique_ptr<net::URLRequest> data_url_request(
-      CreateRequestWithURL(GURL("data://someblob")));
   EXPECT_EQ(content::PREVIEWS_UNSPECIFIED,
             previews::DetermineEnabledClientPreviewsState(
-                *data_url_request, enabled_previews_decider()));
+                &user_data, GURL("data://someblob"), false, true,
+                enabled_previews_decider()));
 }
 
 TEST_F(PreviewsContentUtilTest, DetermineCommittedClientPreviewsState) {
@@ -175,26 +192,27 @@
   scoped_feature_list.InitFromCommandLine(
       "Previews,ClientLoFi,NoScriptPreviews,ResourceLoadingHints",
       std::string());
+  PreviewsUserData user_data(1);
   // Server bits take precedence over NoScript:
   EXPECT_EQ(content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON |
                 content::CLIENT_LOFI_ON,
             previews::DetermineCommittedClientPreviewsState(
-                *CreateHttpsRequest(),
+                &user_data, GURL("https://www.google.com"),
                 content::SERVER_LITE_PAGE_ON | content::SERVER_LOFI_ON |
                     content::CLIENT_LOFI_ON | content::NOSCRIPT_ON,
                 enabled_previews_decider()));
 
   // NoScript has precedence over Client LoFi - kept for committed HTTPS:
-  EXPECT_EQ(
-      content::NOSCRIPT_ON,
-      previews::DetermineCommittedClientPreviewsState(
-          *CreateHttpsRequest(), content::CLIENT_LOFI_ON | content::NOSCRIPT_ON,
-          enabled_previews_decider()));
+  EXPECT_EQ(content::NOSCRIPT_ON,
+            previews::DetermineCommittedClientPreviewsState(
+                &user_data, GURL("https://www.google.com"),
+                content::CLIENT_LOFI_ON | content::NOSCRIPT_ON,
+                enabled_previews_decider()));
 
   // RESOURCE_LOADING_HINTS has precedence over Client LoFi and NoScript.
   EXPECT_EQ(content::RESOURCE_LOADING_HINTS_ON,
             previews::DetermineCommittedClientPreviewsState(
-                *CreateHttpsRequest(),
+                &user_data, GURL("https://www.google.com"),
                 content::CLIENT_LOFI_ON | content::NOSCRIPT_ON |
                     content::RESOURCE_LOADING_HINTS_ON,
                 enabled_previews_decider()));
@@ -202,7 +220,7 @@
   // NoScript has precedence over Client LoFi - dropped for committed HTTP:
   EXPECT_EQ(content::PREVIEWS_OFF,
             previews::DetermineCommittedClientPreviewsState(
-                *CreateRequest(),
+                &user_data, GURL("http://www.google.com"),
                 content::CLIENT_LOFI_ON | content::NOSCRIPT_ON |
                     content::RESOURCE_LOADING_HINTS_ON,
                 enabled_previews_decider()));
@@ -210,14 +228,14 @@
   // Only Client LoFi:
   EXPECT_EQ(content::CLIENT_LOFI_ON,
             previews::DetermineCommittedClientPreviewsState(
-                *CreateHttpsRequest(), content::CLIENT_LOFI_ON,
-                enabled_previews_decider()));
+                &user_data, GURL("https://www.google.com"),
+                content::CLIENT_LOFI_ON, enabled_previews_decider()));
 
   // Only NoScript:
   EXPECT_EQ(content::NOSCRIPT_ON,
             previews::DetermineCommittedClientPreviewsState(
-                *CreateHttpsRequest(), content::NOSCRIPT_ON,
-                enabled_previews_decider()));
+                &user_data, GURL("https://www.google.com"),
+                content::NOSCRIPT_ON, enabled_previews_decider()));
 }
 
 TEST_F(PreviewsContentUtilTest,
@@ -225,10 +243,11 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitFromCommandLine("Previews,ClientLoFi",
                                           "NoScriptPreviews");
+  PreviewsUserData user_data(1);
   // NoScript not allowed at commit time so Client LoFi chosen:
   EXPECT_EQ(content::PREVIEWS_OFF,
             previews::DetermineCommittedClientPreviewsState(
-                *CreateHttpsRequest(),
+                &user_data, GURL("https://www.google.com"),
                 content::CLIENT_LOFI_ON | content::NOSCRIPT_ON |
                     content::RESOURCE_LOADING_HINTS_ON,
                 enabled_previews_decider()));
diff --git a/components/previews/content/previews_decider_impl.cc b/components/previews/content/previews_decider_impl.cc
index ec549e1..41826e2c 100644
--- a/components/previews/content/previews_decider_impl.cc
+++ b/components/previews/content/previews_decider_impl.cc
@@ -22,10 +22,7 @@
 #include "components/previews/content/previews_user_data.h"
 #include "components/previews/core/previews_experiments.h"
 #include "components/previews/core/previews_switches.h"
-#include "net/base/load_flags.h"
 #include "net/nqe/network_quality_estimator.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_context.h"
 
 namespace previews {
 
@@ -241,7 +238,9 @@
                      previews_ui_service_, blacklist_ignored_));
 }
 
-bool PreviewsDeciderImpl::ShouldAllowPreview(const net::URLRequest& request,
+bool PreviewsDeciderImpl::ShouldAllowPreview(PreviewsUserData* previews_data,
+                                             const GURL& url,
+                                             bool is_reload,
                                              PreviewsType type) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(type == PreviewsType::OFFLINE ||
@@ -250,13 +249,15 @@
          type == PreviewsType::RESOURCE_LOADING_HINTS);
   // Consumers that need to specify a blacklist or ignore flag should use
   // ShouldAllowPreviewAtECT directly.
-  return ShouldAllowPreviewAtECT(request, type,
+  return ShouldAllowPreviewAtECT(previews_data, url, is_reload, type,
                                  params::GetECTThresholdForPreview(type),
                                  std::vector<std::string>(), false);
 }
 
 bool PreviewsDeciderImpl::ShouldAllowPreviewAtECT(
-    const net::URLRequest& request,
+    PreviewsUserData* previews_data,
+    const GURL& url,
+    bool is_reload,
     PreviewsType type,
     net::EffectiveConnectionType effective_connection_type_threshold,
     const std::vector<std::string>& host_blacklist_from_finch,
@@ -266,18 +267,18 @@
     return false;
   }
 
-  if (!request.url().has_host() || !PreviewsUserData::GetData(request)) {
+  if (!url.has_host() || !previews_data) {
     // Don't capture UMA on this case, as it is not important and can happen
     // when navigating to files on disk, etc.
     return false;
   }
 
   std::vector<PreviewsEligibilityReason> passed_reasons;
-  uint64_t page_id = PreviewsUserData::GetData(request)->page_id();
+  uint64_t page_id = previews_data->page_id();
   if (is_enabled_callback_.is_null() || !previews_black_list_) {
     LogPreviewDecisionMade(PreviewsEligibilityReason::BLACKLIST_UNAVAILABLE,
-                           request.url(), clock_->Now(), type,
-                           std::move(passed_reasons), page_id);
+                           url, clock_->Now(), type, std::move(passed_reasons),
+                           page_id);
     return false;
   }
   passed_reasons.push_back(PreviewsEligibilityReason::BLACKLIST_UNAVAILABLE);
@@ -293,7 +294,7 @@
   if (blacklist_ignored_) {
     if (clock_->Now() < last_opt_out_time_ + base::TimeDelta::FromSeconds(5)) {
       LogPreviewDecisionMade(PreviewsEligibilityReason::USER_RECENTLY_OPTED_OUT,
-                             request.url(), clock_->Now(), type,
+                             url, clock_->Now(), type,
                              std::move(passed_reasons), page_id);
 
       return false;
@@ -302,16 +303,15 @@
     // The blacklist will disallow certain hosts for periods of time based on
     // user's opting out of the preview.
     PreviewsEligibilityReason status = previews_black_list_->IsLoadedAndAllowed(
-        request.url(), type,
+        url, type,
         is_server_preview && ignore_long_term_blacklist_for_server_previews_,
         &passed_reasons);
 
     if (status != PreviewsEligibilityReason::ALLOWED) {
       if (type == PreviewsType::LITE_PAGE) {
-        PreviewsUserData::GetData(request)->set_black_listed_for_lite_page(
-            true);
+        previews_data->set_black_listed_for_lite_page(true);
       }
-      LogPreviewDecisionMade(status, request.url(), clock_->Now(), type,
+      LogPreviewDecisionMade(status, url, clock_->Now(), type,
                              std::move(passed_reasons), page_id);
       return false;
     }
@@ -319,32 +319,24 @@
 
   if (effective_connection_type_threshold !=
       net::EFFECTIVE_CONNECTION_TYPE_LAST) {
-    net::NetworkQualityEstimator* network_quality_estimator =
-        request.context()->network_quality_estimator();
-    const net::EffectiveConnectionType observed_effective_connection_type =
-        network_quality_estimator
-            ? network_quality_estimator->GetEffectiveConnectionType()
-            : net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
     // Network quality estimator may sometimes return effective connection type
     // as offline when the Android APIs incorrectly return device connectivity
     // as null. See https://crbug.com/838969. So, we do not trigger previews
     // when |observed_effective_connection_type| is
     // net::EFFECTIVE_CONNECTION_TYPE_OFFLINE.
-    if (observed_effective_connection_type <=
-        net::EFFECTIVE_CONNECTION_TYPE_OFFLINE) {
+    if (effective_connection_type_ <= net::EFFECTIVE_CONNECTION_TYPE_OFFLINE) {
       LogPreviewDecisionMade(
-          PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE, request.url(),
+          PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE, url,
           clock_->Now(), type, std::move(passed_reasons), page_id);
       return false;
     }
     passed_reasons.push_back(
         PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE);
 
-    if (observed_effective_connection_type >
-        effective_connection_type_threshold) {
-      LogPreviewDecisionMade(PreviewsEligibilityReason::NETWORK_NOT_SLOW,
-                             request.url(), clock_->Now(), type,
-                             std::move(passed_reasons), page_id);
+    if (effective_connection_type_ > effective_connection_type_threshold) {
+      LogPreviewDecisionMade(PreviewsEligibilityReason::NETWORK_NOT_SLOW, url,
+                             clock_->Now(), type, std::move(passed_reasons),
+                             page_id);
       return false;
     }
     passed_reasons.push_back(PreviewsEligibilityReason::NETWORK_NOT_SLOW);
@@ -352,22 +344,19 @@
 
   // LOAD_VALIDATE_CACHE or LOAD_BYPASS_CACHE mean the user reloaded the page.
   // If this is a query for offline previews, reloads should be disallowed.
-  if (!AllowedOnReload(type) &&
-      request.load_flags() &
-          (net::LOAD_VALIDATE_CACHE | net::LOAD_BYPASS_CACHE)) {
-    LogPreviewDecisionMade(PreviewsEligibilityReason::RELOAD_DISALLOWED,
-                           request.url(), clock_->Now(), type,
-                           std::move(passed_reasons), page_id);
+  if (!AllowedOnReload(type) && is_reload) {
+    LogPreviewDecisionMade(PreviewsEligibilityReason::RELOAD_DISALLOWED, url,
+                           clock_->Now(), type, std::move(passed_reasons),
+                           page_id);
     return false;
   }
   passed_reasons.push_back(PreviewsEligibilityReason::RELOAD_DISALLOWED);
 
   // Check Finch-provided blacklist, if any. This type of blacklist was added
   // for Finch provided blacklist for Client LoFi.
-  if (base::ContainsValue(host_blacklist_from_finch,
-                          request.url().host_piece())) {
+  if (base::ContainsValue(host_blacklist_from_finch, url.host_piece())) {
     LogPreviewDecisionMade(
-        PreviewsEligibilityReason::HOST_BLACKLISTED_BY_SERVER, request.url(),
+        PreviewsEligibilityReason::HOST_BLACKLISTED_BY_SERVER, url,
         clock_->Now(), type, std::move(passed_reasons), page_id);
     return false;
   }
@@ -380,9 +369,9 @@
       // Optimization hints are configured, so determine if those hints
       // allow the optimization type (as of start-of-navigation time anyway).
       PreviewsEligibilityReason status = ShouldAllowPreviewPerOptimizationHints(
-          request, type, &passed_reasons);
+          previews_data, url, type, &passed_reasons);
       if (status != PreviewsEligibilityReason::ALLOWED) {
-        LogPreviewDecisionMade(status, request.url(), clock_->Now(), type,
+        LogPreviewDecisionMade(status, url, clock_->Now(), type,
                                std::move(passed_reasons), page_id);
         return false;
       }
@@ -390,9 +379,8 @@
       // RESOURCE_LOADING_HINTS optimization can be applied only when a server
       // provided whitelist is available.
       LogPreviewDecisionMade(
-          PreviewsEligibilityReason::HOST_NOT_WHITELISTED_BY_SERVER,
-          request.url(), clock_->Now(), type, std::move(passed_reasons),
-          page_id);
+          PreviewsEligibilityReason::HOST_NOT_WHITELISTED_BY_SERVER, url,
+          clock_->Now(), type, std::move(passed_reasons), page_id);
       return false;
     } else {
       DCHECK(type == PreviewsType::LITE_PAGE_REDIRECT ||
@@ -400,28 +388,28 @@
       // Since server optimization guidance not configured, allow the preview
       // but with qualified eligibility reason.
       LogPreviewDecisionMade(
-          PreviewsEligibilityReason::ALLOWED_WITHOUT_OPTIMIZATION_HINTS,
-          request.url(), clock_->Now(), type, std::move(passed_reasons),
-          page_id);
+          PreviewsEligibilityReason::ALLOWED_WITHOUT_OPTIMIZATION_HINTS, url,
+          clock_->Now(), type, std::move(passed_reasons), page_id);
       return true;
     }
   }
 
-  LogPreviewDecisionMade(PreviewsEligibilityReason::ALLOWED, request.url(),
-                         clock_->Now(), type, std::move(passed_reasons),
-                         page_id);
+  LogPreviewDecisionMade(PreviewsEligibilityReason::ALLOWED, url, clock_->Now(),
+                         type, std::move(passed_reasons), page_id);
   return true;
 }
 
-void PreviewsDeciderImpl::LoadResourceHints(const net::URLRequest& request) {
+void PreviewsDeciderImpl::LoadResourceHints(const GURL& url) {
   DCHECK(io_task_runner_->BelongsToCurrentThread());
   previews_opt_guide_->MaybeLoadOptimizationHints(
-      request, base::BindOnce(&PreviewsDeciderImpl::OnResourceLoadingHints,
-                              weak_factory_.GetWeakPtr()));
+      url, base::BindOnce(&PreviewsDeciderImpl::OnResourceLoadingHints,
+                          weak_factory_.GetWeakPtr()));
 }
 
-bool PreviewsDeciderImpl::IsURLAllowedForPreview(const net::URLRequest& request,
-                                                 PreviewsType type) const {
+bool PreviewsDeciderImpl::IsURLAllowedForPreview(
+    PreviewsUserData* previews_data,
+    const GURL& url,
+    PreviewsType type) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(PreviewsType::NOSCRIPT == type ||
          PreviewsType::RESOURCE_LOADING_HINTS == type);
@@ -430,15 +418,11 @@
     // The blacklist will disallow certain hosts for periods of time based on
     // user's opting out of the preview.
     PreviewsEligibilityReason status = previews_black_list_->IsLoadedAndAllowed(
-        request.url(), type, false, &passed_reasons);
+        url, type, false, &passed_reasons);
     if (status != PreviewsEligibilityReason::ALLOWED) {
-      if (type == PreviewsType::LITE_PAGE) {
-        PreviewsUserData::GetData(request)->set_black_listed_for_lite_page(
-            true);
-      }
-      LogPreviewDecisionMade(status, request.url(), clock_->Now(), type,
+      LogPreviewDecisionMade(status, url, clock_->Now(), type,
                              std::move(passed_reasons),
-                             PreviewsUserData::GetData(request)->page_id());
+                             previews_data->page_id());
       return false;
     }
   }
@@ -448,12 +432,12 @@
     if (params::IsOptimizationHintsEnabled()) {
       std::vector<PreviewsEligibilityReason> passed_reasons;
       PreviewsEligibilityReason status =
-          IsURLAllowedForPreviewByOptimizationHints(request, type,
+          IsURLAllowedForPreviewByOptimizationHints(previews_data, url, type,
                                                     &passed_reasons);
       if (status != PreviewsEligibilityReason::ALLOWED) {
-        LogPreviewDecisionMade(status, request.url(), clock_->Now(), type,
+        LogPreviewDecisionMade(status, url, clock_->Now(), type,
                                std::move(passed_reasons),
-                               PreviewsUserData::GetData(request)->page_id());
+                               previews_data->page_id());
         return false;
       }
     }
@@ -463,7 +447,8 @@
 
 PreviewsEligibilityReason
 PreviewsDeciderImpl::ShouldAllowPreviewPerOptimizationHints(
-    const net::URLRequest& request,
+    PreviewsUserData* previews_data,
+    const GURL& url,
     PreviewsType type,
     std::vector<PreviewsEligibilityReason>* passed_reasons) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -482,7 +467,7 @@
 
   // For LitePageRedirect, ensure it is not blacklisted for this request.
   if (type == PreviewsType::LITE_PAGE_REDIRECT) {
-    if (previews_opt_guide_->IsBlacklisted(request, type)) {
+    if (previews_opt_guide_->IsBlacklisted(url, type)) {
       return PreviewsEligibilityReason::HOST_BLACKLISTED_BY_SERVER;
     }
     passed_reasons->push_back(
@@ -491,7 +476,7 @@
 
   // For NoScript, ensure it is whitelisted for this request.
   if (type == PreviewsType::NOSCRIPT) {
-    if (!previews_opt_guide_->IsWhitelisted(request, type)) {
+    if (!previews_opt_guide_->IsWhitelisted(previews_data, url, type)) {
       return PreviewsEligibilityReason::HOST_NOT_WHITELISTED_BY_SERVER;
     }
     passed_reasons->push_back(
@@ -506,7 +491,8 @@
 
 PreviewsEligibilityReason
 PreviewsDeciderImpl::IsURLAllowedForPreviewByOptimizationHints(
-    const net::URLRequest& request,
+    PreviewsUserData* previews_data,
+    const GURL& url,
     PreviewsType type,
     std::vector<PreviewsEligibilityReason>* passed_reasons) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -520,7 +506,7 @@
     return PreviewsEligibilityReason::ALLOWED;
 
   // Check if request URL is whitelisted by the optimization guide.
-  if (!previews_opt_guide_->IsWhitelisted(request, type)) {
+  if (!previews_opt_guide_->IsWhitelisted(previews_data, url, type)) {
     return PreviewsEligibilityReason::HOST_NOT_WHITELISTED_BY_SERVER;
   }
   passed_reasons->push_back(
@@ -540,4 +526,9 @@
       ignore_long_term_blacklist_for_server_previews;
 }
 
+void PreviewsDeciderImpl::SetEffectiveConnectionType(
+    net::EffectiveConnectionType effective_connection_type) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  effective_connection_type_ = effective_connection_type;
+}
 }  // namespace previews
diff --git a/components/previews/content/previews_decider_impl.h b/components/previews/content/previews_decider_impl.h
index 20bff17..16c3f0c 100644
--- a/components/previews/content/previews_decider_impl.h
+++ b/components/previews/content/previews_decider_impl.h
@@ -36,10 +36,6 @@
 class OptOutStore;
 }
 
-namespace net {
-class URLRequest;
-}
-
 namespace previews {
 class PreviewsUIService;
 
@@ -111,15 +107,20 @@
   PreviewsBlackList* black_list() const { return previews_black_list_.get(); }
 
   // PreviewsDecider implementation:
-  bool ShouldAllowPreview(const net::URLRequest& request,
+  bool ShouldAllowPreview(PreviewsUserData* previews_data,
+                          const GURL& url,
+                          bool is_reload,
                           PreviewsType type) const override;
   bool ShouldAllowPreviewAtECT(
-      const net::URLRequest& request,
+      PreviewsUserData* previews_data,
+      const GURL& url,
+      bool is_reload,
       PreviewsType type,
       net::EffectiveConnectionType effective_connection_type_threshold,
       const std::vector<std::string>& host_blacklist_from_finch,
       bool is_server_preview) const override;
-  bool IsURLAllowedForPreview(const net::URLRequest& request,
+  bool IsURLAllowedForPreview(PreviewsUserData* previews_data,
+                              const GURL& url,
                               PreviewsType type) const override;
 
   // Set whether ignoring the long term blacklist rules is allowed for calls to
@@ -128,12 +129,15 @@
   void SetIgnoreLongTermBlackListForServerPreviews(
       bool ignore_long_term_blacklist_for_server_previews);
 
-  void LoadResourceHints(const net::URLRequest& request) override;
+  void LoadResourceHints(const GURL& url) override;
 
   // Generates a page ID that is guaranteed to be unique from any other page ID
   // generated in this browser session. Also, guaranteed to be non-zero.
   uint64_t GeneratePageId();
 
+  void SetEffectiveConnectionType(
+      net::EffectiveConnectionType effective_connection_type);
+
  protected:
   // Posts a task to SetIOData for |previews_ui_service_| on the UI thread with
   // a weak pointer to |this|. Virtualized for testing.
@@ -151,20 +155,22 @@
       std::unique_ptr<PreviewsBlackList> previews_back_list);
 
  private:
-  // Whether the preview |type| should be allowed to be considered for |request|
+  // Whether the preview |type| should be allowed to be considered for |url|
   // subject to any server provided optimization hints. This is meant for
   // checking the initial navigation URL. Returns ALLOWED if no reason found
   // to deny the preview for consideration.
   PreviewsEligibilityReason ShouldAllowPreviewPerOptimizationHints(
-      const net::URLRequest& request,
+      PreviewsUserData* previews_data,
+      const GURL& url,
       PreviewsType type,
       std::vector<PreviewsEligibilityReason>* passed_reasons) const;
 
-  // Whether |request| is allowed for |type| according to server provided
+  // Whether |url| is allowed for |type| according to server provided
   // optimization hints, if available. This is meant for checking the committed
   // navigation URL against any specific hint details.
   PreviewsEligibilityReason IsURLAllowedForPreviewByOptimizationHints(
-      const net::URLRequest& request,
+      PreviewsUserData* previews_data,
+      const GURL& url,
       PreviewsType type,
       std::vector<PreviewsEligibilityReason>* passed_reasons) const;
 
@@ -192,6 +198,11 @@
   // |is_server_preview| true.
   bool ignore_long_term_blacklist_for_server_previews_ = false;
 
+  // The estimate of how slow a user's connection is. Used for triggering
+  // Previews.
+  net::EffectiveConnectionType effective_connection_type_ =
+      net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
+
   base::Clock* clock_;
 
   // The UI and IO thread task runners. |ui_task_runner_| is used to post
diff --git a/components/previews/content/previews_decider_impl_unittest.cc b/components/previews/content/previews_decider_impl_unittest.cc
index f144f5a..b780845 100644
--- a/components/previews/content/previews_decider_impl_unittest.cc
+++ b/components/previews/content/previews_decider_impl_unittest.cc
@@ -42,12 +42,10 @@
 #include "components/previews/core/previews_logger.h"
 #include "components/previews/core/previews_switches.h"
 #include "components/variations/variations_associated_data.h"
-#include "net/base/load_flags.h"
 #include "net/nqe/effective_connection_type.h"
 #include "net/nqe/network_quality_estimator_test_util.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_test_util.h"
+#include "services/network/test/test_network_quality_tracker.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
@@ -140,27 +138,27 @@
   ~TestPreviewsOptimizationGuide() override {}
 
   // PreviewsOptimizationGuide:
-  bool IsWhitelisted(const net::URLRequest& request,
+  bool IsWhitelisted(PreviewsUserData* previews_user_data,
+                     const GURL& url,
+
                      PreviewsType type) const override {
     EXPECT_TRUE(type == PreviewsType::NOSCRIPT ||
                 type == PreviewsType::RESOURCE_LOADING_HINTS);
     if (type == PreviewsType::NOSCRIPT) {
-      return request.url().host().compare("whitelisted.example.com") == 0 ||
-             request.url().host().compare(
-                 "noscript_only_whitelisted.example.com") == 0;
+      return url.host().compare("whitelisted.example.com") == 0 ||
+             url.host().compare("noscript_only_whitelisted.example.com") == 0;
     }
     if (type == PreviewsType::RESOURCE_LOADING_HINTS) {
-      return request.url().host().compare("whitelisted.example.com") == 0;
+      return url.host().compare("whitelisted.example.com") == 0;
     }
     return false;
   }
 
   // PreviewsOptimizationGuide:
-  bool IsBlacklisted(const net::URLRequest& request,
-                     PreviewsType type) const override {
+  bool IsBlacklisted(const GURL& url, PreviewsType type) const override {
     EXPECT_TRUE(type == PreviewsType::LITE_PAGE_REDIRECT);
     if (type == PreviewsType::LITE_PAGE_REDIRECT) {
-      return request.url().host().compare("blacklisted.example.com") == 0;
+      return url.host().compare("blacklisted.example.com") == 0;
     }
     return false;
   }
@@ -177,14 +175,16 @@
       std::unique_ptr<PreviewsOptimizationGuide> previews_opt_guide,
       const PreviewsIsEnabledCallback& is_enabled_callback,
       std::unique_ptr<PreviewsLogger> logger,
-      blacklist::BlacklistData::AllowedTypesAndVersions allowed_types)
+      blacklist::BlacklistData::AllowedTypesAndVersions allowed_types,
+      network::NetworkQualityTracker* network_quality_tracker)
       : PreviewsUIService(previews_decider_impl,
                           io_task_runner,
                           std::move(previews_opt_out_store),
                           std::move(previews_opt_guide),
                           is_enabled_callback,
                           std::move(logger),
-                          std::move(allowed_types)),
+                          std::move(allowed_types),
+                          network_quality_tracker),
         user_blacklisted_(false),
         blacklist_ignored_(false) {}
 
@@ -368,13 +368,10 @@
             scoped_task_environment_.GetMainThreadTaskRunner(),
             &clock_)),
         optimization_guide_service_(
-            scoped_task_environment_.GetMainThreadTaskRunner()),
-        context_(true) {
-    context_.set_network_quality_estimator(&network_quality_estimator_);
-    context_.Init();
+            scoped_task_environment_.GetMainThreadTaskRunner()) {
     clock_.SetNow(base::Time::Now());
 
-    network_quality_estimator_.set_effective_connection_type(
+    network_quality_tracker_.ReportEffectiveConnectionTypeForTesting(
         net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
   }
 
@@ -390,6 +387,8 @@
         scoped_task_environment_.GetMainThreadTaskRunner(), &clock_);
   }
 
+  void TearDown() override { ui_service_.reset(); }
+
   void InitializeUIServiceWithoutWaitingForBlackList() {
     blacklist::BlacklistData::AllowedTypesAndVersions allowed_types;
     allowed_types[static_cast<int>(PreviewsType::OFFLINE)] = 0;
@@ -406,7 +405,8 @@
             &optimization_guide_service_,
             scoped_task_environment_.GetMainThreadTaskRunner()),
         base::BindRepeating(&IsPreviewFieldTrialEnabled),
-        std::make_unique<PreviewsLogger>(), std::move(allowed_types)));
+        std::make_unique<PreviewsLogger>(), std::move(allowed_types),
+        &network_quality_tracker_));
   }
 
   void InitializeUIService() {
@@ -415,32 +415,16 @@
     base::RunLoop().RunUntilIdle();
   }
 
-  std::unique_ptr<net::URLRequest> CreateRequest() const {
-    std::unique_ptr<net::URLRequest> request =
-        CreateRequestWithURL(GURL("http://example.com"));
-    return request;
-  }
-
-  std::unique_ptr<net::URLRequest> CreateHttpsRequest() const {
-    std::unique_ptr<net::URLRequest> request =
-        CreateRequestWithURL(GURL("https://secure.example.com"));
-    return request;
-  }
-
-  std::unique_ptr<net::URLRequest> CreateRequestWithURL(const GURL& url) const {
-    std::unique_ptr<net::URLRequest> request = context_.CreateRequest(
-        url, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS);
-    PreviewsUserData::Create(request.get(), kDefaultPageId);
-    return request;
-  }
-
   TestPreviewsDeciderImpl* previews_decider_impl() {
     return previews_decider_impl_.get();
   }
   TestPreviewsUIService* ui_service() { return ui_service_.get(); }
-  net::TestURLRequestContext* context() { return &context_; }
-  net::TestNetworkQualityEstimator* network_quality_estimator() {
-    return &network_quality_estimator_;
+
+  void ReportEffectiveConnectionType(
+      net::EffectiveConnectionType effective_connection_type) {
+    network_quality_tracker_.ReportEffectiveConnectionTypeForTesting(
+        effective_connection_type);
+    base::RunLoop().RunUntilIdle();
   }
 
  protected:
@@ -452,8 +436,7 @@
   std::unique_ptr<TestPreviewsDeciderImpl> previews_decider_impl_;
   optimization_guide::OptimizationGuideService optimization_guide_service_;
   std::unique_ptr<TestPreviewsUIService> ui_service_;
-  net::TestNetworkQualityEstimator network_quality_estimator_;
-  net::TestURLRequestContext context_;
+  network::TestNetworkQualityTracker network_quality_tracker_;
 };
 
 TEST_F(PreviewsDeciderImplTest, TestInitialization) {
@@ -470,16 +453,19 @@
       {features::kPreviews} /* disable_features */);
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
+  PreviewsUserData user_data(kDefaultPageId);
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateHttpsRequest(), PreviewsType::LOFI,
+      &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI,
       previews::params::GetECTThresholdForPreview(
           previews::PreviewsType::NOSCRIPT),
       std::vector<std::string>(), false));
+
+  PreviewsUserData user_data2(kDefaultPageId);
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateHttpsRequest(), PreviewsType::NOSCRIPT,
+      &user_data2, GURL("https://www.google.com"), false,
+      PreviewsType::NOSCRIPT,
       previews::params::GetECTThresholdForPreview(
           previews::PreviewsType::NOSCRIPT),
       std::vector<std::string>(), false));
@@ -491,12 +477,13 @@
 TEST_F(PreviewsDeciderImplTest, TestDisallowPreviewBecauseOfBlackListState) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(features::kPreviews);
-  std::unique_ptr<net::URLRequest> request = CreateRequest();
   base::HistogramTester histogram_tester;
 
+  PreviewsUserData user_data(kDefaultPageId);
   // The blacklist is not created yet.
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreview(
-      *request, PreviewsType::OFFLINE));
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::OFFLINE));
   histogram_tester.ExpectUniqueSample(
       "Previews.EligibilityReason.Offline",
       static_cast<int>(PreviewsEligibilityReason::BLACKLIST_UNAVAILABLE), 1);
@@ -505,7 +492,8 @@
 
   // The blacklist is not created yet.
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreview(
-      *request, PreviewsType::OFFLINE));
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::OFFLINE));
   histogram_tester.ExpectBucketCount(
       "Previews.EligibilityReason.Offline",
       static_cast<int>(PreviewsEligibilityReason::BLACKLIST_UNAVAILABLE), 2);
@@ -520,7 +508,8 @@
   previews_decider_impl()->ClearBlackList(now, now);
 
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreview(
-      *request, PreviewsType::OFFLINE));
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::OFFLINE));
   histogram_tester.ExpectBucketCount(
       "Previews.EligibilityReason.Offline",
       static_cast<int>(PreviewsEligibilityReason::BLACKLIST_DATA_NOT_LOADED),
@@ -533,20 +522,20 @@
 TEST_F(PreviewsDeciderImplTest, TestSetBlacklistBoolDueToBlackListState) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(features::kPreviews);
-  std::unique_ptr<net::URLRequest> request = CreateRequest();
+
+  PreviewsUserData user_data(kDefaultPageId);
+
   base::HistogramTester histogram_tester;
   InitializeUIServiceWithoutWaitingForBlackList();
   base::RunLoop().RunUntilIdle();
-  previews_decider_impl()->AddPreviewNavigation(GURL(request->url()), true,
-                                                PreviewsType::LITE_PAGE, 1);
+  previews_decider_impl()->AddPreviewNavigation(
+      GURL("https://www.google.com"), true, PreviewsType::LITE_PAGE, 1);
 
-  auto* data =
-      PreviewsUserData::Create(request.get(), 54321 /* page_id, not used */);
-  EXPECT_FALSE(data->black_listed_for_lite_page());
+  EXPECT_FALSE(user_data.black_listed_for_lite_page());
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *request, PreviewsType::LITE_PAGE, net::EFFECTIVE_CONNECTION_TYPE_2G, {},
-      false));
-  EXPECT_TRUE(data->black_listed_for_lite_page());
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::LITE_PAGE, net::EFFECTIVE_CONNECTION_TYPE_2G, {}, false));
+  EXPECT_TRUE(user_data.black_listed_for_lite_page());
 }
 
 TEST_F(PreviewsDeciderImplTest,
@@ -555,12 +544,14 @@
   scoped_feature_list.InitAndEnableFeature(features::kPreviews);
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
+  PreviewsUserData user_data(kDefaultPageId);
+
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
 
   base::HistogramTester histogram_tester;
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreview(
-      *CreateRequest(), PreviewsType::OFFLINE));
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::OFFLINE));
   histogram_tester.ExpectUniqueSample(
       "Previews.EligibilityReason.Offline",
       static_cast<int>(PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE),
@@ -572,14 +563,15 @@
   scoped_feature_list.InitAndEnableFeature(features::kPreviews);
   InitializeUIService();
 
+  PreviewsUserData user_data(kDefaultPageId);
   // LoFi and LitePage check NQE on their own.
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_3G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_3G);
 
   base::HistogramTester histogram_tester;
   EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::LITE_PAGE,
-      net::EFFECTIVE_CONNECTION_TYPE_4G, std::vector<std::string>(), false));
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::LITE_PAGE, net::EFFECTIVE_CONNECTION_TYPE_4G,
+      std::vector<std::string>(), false));
   histogram_tester.ExpectUniqueSample(
       "Previews.EligibilityReason.LitePage",
       static_cast<int>(PreviewsEligibilityReason::ALLOWED), 1);
@@ -590,11 +582,13 @@
   scoped_feature_list.InitAndEnableFeature(features::kPreviews);
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_3G);
+  PreviewsUserData user_data(kDefaultPageId);
+
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_3G);
   base::HistogramTester histogram_tester;
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreview(
-      *CreateRequest(), PreviewsType::OFFLINE));
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::OFFLINE));
   histogram_tester.ExpectUniqueSample(
       "Previews.EligibilityReason.Offline",
       static_cast<int>(PreviewsEligibilityReason::NETWORK_NOT_SLOW), 1);
@@ -605,15 +599,13 @@
   scoped_feature_list.InitAndEnableFeature(features::kPreviews);
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
-  std::unique_ptr<net::URLRequest> request = CreateRequest();
-  request->SetLoadFlags(net::LOAD_BYPASS_CACHE);
+  PreviewsUserData user_data(kDefaultPageId);
 
   base::HistogramTester histogram_tester;
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreview(
-      *request, PreviewsType::OFFLINE));
+      &user_data, GURL("https://www.google.com"), true, PreviewsType::OFFLINE));
   histogram_tester.ExpectUniqueSample(
       "Previews.EligibilityReason.Offline",
       static_cast<int>(PreviewsEligibilityReason::RELOAD_DISALLOWED), 1);
@@ -635,13 +627,14 @@
       {net::EFFECTIVE_CONNECTION_TYPE_3G, false},
   };
   for (const auto& test : tests) {
-    network_quality_estimator()->set_effective_connection_type(
-        test.effective_connection_type);
+    ReportEffectiveConnectionType(test.effective_connection_type);
 
+    PreviewsUserData user_data(kDefaultPageId);
     base::HistogramTester histogram_tester;
     EXPECT_EQ(test.expected_offline_allowed,
               previews_decider_impl()->ShouldAllowPreview(
-                  *CreateRequest(), PreviewsType::OFFLINE))
+                  &user_data, GURL("https://www.google.com"), false,
+                  PreviewsType::OFFLINE))
         << " effective_connection_type=" << test.effective_connection_type;
     if (test.expected_offline_allowed) {
       histogram_tester.ExpectUniqueSample(
@@ -663,12 +656,12 @@
 
   EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G,
             params::EffectiveConnectionTypeThresholdForClientLoFi());
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
+  PreviewsUserData user_data(kDefaultPageId);
   base::HistogramTester histogram_tester;
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::LOFI,
+      &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false));
   histogram_tester.ExpectTotalCount("Previews.EligibilityReason.LoFi", 0);
@@ -681,12 +674,12 @@
       {features::kPreviews, features::kClientLoFi}, {});
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
 
+  PreviewsUserData user_data(kDefaultPageId);
   base::HistogramTester histogram_tester;
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::LOFI,
+      &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false));
   histogram_tester.ExpectUniqueSample(
@@ -703,12 +696,12 @@
 
   EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G,
             params::EffectiveConnectionTypeThresholdForClientLoFi());
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_3G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_3G);
 
   base::HistogramTester histogram_tester;
+  PreviewsUserData user_data(kDefaultPageId);
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::LOFI,
+      &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false));
   histogram_tester.ExpectUniqueSample(
@@ -737,13 +730,14 @@
   };
 
   for (const auto& test : tests) {
-    network_quality_estimator()->set_effective_connection_type(
-        test.effective_connection_type);
+    ReportEffectiveConnectionType(test.effective_connection_type);
 
     base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
     EXPECT_EQ(test.expected_client_lofi_allowed,
               previews_decider_impl()->ShouldAllowPreviewAtECT(
-                  *CreateRequest(), PreviewsType::LOFI,
+                  &user_data, GURL("https://www.google.com"), false,
+                  PreviewsType::LOFI,
                   params::EffectiveConnectionTypeThresholdForClientLoFi(),
                   params::GetBlackListedHostsForClientLoFiFieldTrial(), false))
         << " effective_connection_type=" << test.effective_connection_type;
@@ -767,11 +761,11 @@
 
   EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G,
             params::EffectiveConnectionTypeThresholdForClientLoFi());
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
+  PreviewsUserData user_data(kDefaultPageId);
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequestWithURL(GURL("file:///sdcard")), PreviewsType::LOFI,
+      &user_data, GURL("file:///sdcard"), false, PreviewsType::LOFI,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false));
 }
@@ -784,15 +778,13 @@
 
   EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G,
             params::EffectiveConnectionTypeThresholdForClientLoFi());
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
-  std::unique_ptr<net::URLRequest> request = CreateRequest();
-  request->SetLoadFlags(net::LOAD_BYPASS_CACHE);
+  PreviewsUserData user_data(kDefaultPageId);
 
   base::HistogramTester histogram_tester;
   EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *request, PreviewsType::LOFI,
+      &user_data, GURL("https://www.google.com"), true, PreviewsType::LOFI,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false));
   histogram_tester.ExpectUniqueSample(
@@ -812,8 +804,7 @@
 
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   const struct {
     const char* url;
@@ -829,14 +820,11 @@
   for (const auto& test : tests) {
     base::HistogramTester histogram_tester;
 
-    std::unique_ptr<net::URLRequest> request =
-        context()->CreateRequest(GURL(test.url), net::DEFAULT_PRIORITY, nullptr,
-                                 TRAFFIC_ANNOTATION_FOR_TESTS);
-    PreviewsUserData::Create(request.get(), 54321 /* page_id, not used */);
+    PreviewsUserData user_data(kDefaultPageId);
 
     EXPECT_EQ(test.expected_client_lofi_allowed,
               previews_decider_impl()->ShouldAllowPreviewAtECT(
-                  *request, PreviewsType::LOFI,
+                  &user_data, GURL(test.url), false, PreviewsType::LOFI,
                   params::EffectiveConnectionTypeThresholdForClientLoFi(),
                   params::GetBlackListedHostsForClientLoFiFieldTrial(), false));
 
@@ -855,12 +843,12 @@
   scoped_feature_list.InitAndEnableFeature(features::kPreviews);
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   base::HistogramTester histogram_tester;
+  PreviewsUserData user_data(kDefaultPageId);
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::NOSCRIPT,
+      &user_data, GURL("https://www.google.com"), false, PreviewsType::NOSCRIPT,
       previews::params::GetECTThresholdForPreview(
           previews::PreviewsType::NOSCRIPT),
       std::vector<std::string>(), false));
@@ -897,13 +885,14 @@
   };
 
   for (const auto& test : tests) {
-    network_quality_estimator()->set_effective_connection_type(
-        test.effective_connection_type);
+    ReportEffectiveConnectionType(test.effective_connection_type);
 
     base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
     EXPECT_EQ(test.expected_noscript_allowed,
               previews_decider_impl()->ShouldAllowPreviewAtECT(
-                  *CreateHttpsRequest(), PreviewsType::NOSCRIPT,
+                  &user_data, GURL("https://www.google.com"), false,
+                  PreviewsType::NOSCRIPT,
                   previews::params::GetECTThresholdForPreview(
                       previews::PreviewsType::NOSCRIPT),
                   std::vector<std::string>(), false))
@@ -932,14 +921,14 @@
       {});
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   base::HistogramTester histogram_tester;
 
+  PreviewsUserData user_data(kDefaultPageId);
   // First verify no preview for non-whitelisted url.
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateHttpsRequest(), PreviewsType::NOSCRIPT,
+      &user_data, GURL("https://www.google.com"), false, PreviewsType::NOSCRIPT,
       previews::params::GetECTThresholdForPreview(
           previews::PreviewsType::NOSCRIPT),
       std::vector<std::string>(), false));
@@ -952,7 +941,7 @@
 
   // Now verify preview for whitelisted url.
   EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequestWithURL(GURL("https://whitelisted.example.com")),
+      &user_data, GURL("https://whitelisted.example.com"), false,
       PreviewsType::NOSCRIPT,
       previews::params::GetECTThresholdForPreview(
           previews::PreviewsType::NOSCRIPT),
@@ -971,14 +960,14 @@
       {});
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   // First verify not allowed for non-whitelisted url.
   {
     base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
     EXPECT_FALSE(previews_decider_impl()->IsURLAllowedForPreview(
-        *CreateHttpsRequest(), PreviewsType::NOSCRIPT));
+        &user_data, GURL("https://www.google.com"), PreviewsType::NOSCRIPT));
 
     histogram_tester.ExpectUniqueSample(
         "Previews.EligibilityReason.NoScript",
@@ -990,8 +979,9 @@
   // Now verify preview for whitelisted url.
   {
     base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
     EXPECT_TRUE(previews_decider_impl()->IsURLAllowedForPreview(
-        *CreateRequestWithURL(GURL("https://whitelisted.example.com")),
+        &user_data, GURL("https://whitelisted.example.com"),
         PreviewsType::NOSCRIPT));
 
     // Expect no eligibility logging.
@@ -1007,12 +997,13 @@
       {features::kOptimizationHints});
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   base::HistogramTester histogram_tester;
+  PreviewsUserData user_data(kDefaultPageId);
   EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::LITE_PAGE_REDIRECT,
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::LITE_PAGE_REDIRECT,
       previews::params::GetECTThresholdForPreview(
           previews::PreviewsType::LITE_PAGE_REDIRECT),
       std::vector<std::string>(), false));
@@ -1032,14 +1023,15 @@
       {});
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   base::HistogramTester histogram_tester;
 
+  PreviewsUserData user_data(kDefaultPageId);
   // First verify preview allowed for non-whitelisted url.
   EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateHttpsRequest(), PreviewsType::LITE_PAGE_REDIRECT,
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::LITE_PAGE_REDIRECT,
       previews::params::GetECTThresholdForPreview(
           previews::PreviewsType::LITE_PAGE_REDIRECT),
       std::vector<std::string>(), false));
@@ -1050,7 +1042,7 @@
 
   // Now verify no preview for blacklisted url.
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequestWithURL(GURL("https://blacklisted.example.com")),
+      &user_data, GURL("https://blacklisted.example.com"), false,
       PreviewsType::LITE_PAGE_REDIRECT,
       previews::params::GetECTThresholdForPreview(
           previews::PreviewsType::LITE_PAGE_REDIRECT),
@@ -1068,12 +1060,13 @@
       {features::kPreviews, features::kOptimizationHints}, {});
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   base::HistogramTester histogram_tester;
+  PreviewsUserData user_data(kDefaultPageId);
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::RESOURCE_LOADING_HINTS,
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::RESOURCE_LOADING_HINTS,
       previews::params::GetECTThresholdForPreview(
           previews::PreviewsType::RESOURCE_LOADING_HINTS),
       std::vector<std::string>(), false));
@@ -1087,12 +1080,12 @@
       {features::kOptimizationHints});
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   base::HistogramTester histogram_tester;
+  PreviewsUserData user_data(kDefaultPageId);
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequestWithURL(GURL("https://whitelisted.example.com")),
+      &user_data, GURL("https://whitelisted.example.com"), false,
       PreviewsType::RESOURCE_LOADING_HINTS,
       previews::params::GetECTThresholdForPreview(
           previews::PreviewsType::RESOURCE_LOADING_HINTS),
@@ -1124,20 +1117,19 @@
   };
 
   for (const auto& test : tests) {
-    network_quality_estimator()->set_effective_connection_type(
-        test.effective_connection_type);
+    ReportEffectiveConnectionType(test.effective_connection_type);
 
     base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
 
     // Check whitelisted URL.
-    EXPECT_EQ(
-        test.expected_resource_loading_hints_allowed,
-        previews_decider_impl()->ShouldAllowPreviewAtECT(
-            *CreateRequestWithURL(GURL("https://whitelisted.example.com")),
-            PreviewsType::RESOURCE_LOADING_HINTS,
-            previews::params::GetECTThresholdForPreview(
-                previews::PreviewsType::RESOURCE_LOADING_HINTS),
-            std::vector<std::string>(), false))
+    EXPECT_EQ(test.expected_resource_loading_hints_allowed,
+              previews_decider_impl()->ShouldAllowPreviewAtECT(
+                  &user_data, GURL("https://whitelisted.example.com"), false,
+                  PreviewsType::RESOURCE_LOADING_HINTS,
+                  previews::params::GetECTThresholdForPreview(
+                      previews::PreviewsType::RESOURCE_LOADING_HINTS),
+                  std::vector<std::string>(), false))
         << " effective_connection_type=" << test.effective_connection_type;
     if (test.expected_resource_loading_hints_allowed) {
       histogram_tester.ExpectUniqueSample(
@@ -1167,14 +1159,15 @@
       {});
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   base::HistogramTester histogram_tester;
 
+  PreviewsUserData user_data(kDefaultPageId);
   // First verify preview allowed for url without known hints.
   EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateHttpsRequest(), PreviewsType::RESOURCE_LOADING_HINTS,
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::RESOURCE_LOADING_HINTS,
       previews::params::GetECTThresholdForPreview(
           previews::PreviewsType::RESOURCE_LOADING_HINTS),
       std::vector<std::string>(), false));
@@ -1192,14 +1185,15 @@
       {});
   InitializeUIService();
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   // First verify not allowed for non-whitelisted url.
   {
     base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
     EXPECT_FALSE(previews_decider_impl()->IsURLAllowedForPreview(
-        *CreateHttpsRequest(), PreviewsType::RESOURCE_LOADING_HINTS));
+        &user_data, GURL("https://www.google.com"),
+        PreviewsType::RESOURCE_LOADING_HINTS));
 
     histogram_tester.ExpectUniqueSample(
         "Previews.EligibilityReason.ResourceLoadingHints",
@@ -1211,8 +1205,9 @@
   // Now verify preview for whitelisted url.
   {
     base::HistogramTester histogram_tester;
+    PreviewsUserData user_data(kDefaultPageId);
     EXPECT_TRUE(previews_decider_impl()->IsURLAllowedForPreview(
-        *CreateRequestWithURL(GURL("https://whitelisted.example.com")),
+        &user_data, GURL("https://whitelisted.example.com"),
         PreviewsType::RESOURCE_LOADING_HINTS));
 
     // Expect no eligibility logging.
@@ -1290,9 +1285,10 @@
   auto expected_type = PreviewsType::LOFI;
 
   previews_decider_impl()->InjectTestBlacklist(nullptr /* blacklist */);
+  PreviewsUserData user_data(kDefaultPageId);
   previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), expected_type, net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN,
-      {}, false);
+      &user_data, GURL("http://www.google.com"), false, expected_type,
+      net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN, {}, false);
   base::RunLoop().RunUntilIdle();
   // Testing correct log method is called.
   EXPECT_THAT(ui_service()->decision_reasons(),
@@ -1325,9 +1321,10 @@
                                                 previews_decider_impl());
     previews_decider_impl()->InjectTestBlacklist(std::move(blacklist));
 
+    PreviewsUserData user_data(kDefaultPageId);
     previews_decider_impl()->ShouldAllowPreviewAtECT(
-        *CreateRequest(), expected_type, net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN,
-        {}, false);
+        &user_data, GURL("http://www.google.com"), false, expected_type,
+        net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN, {}, false);
     base::RunLoop().RunUntilIdle();
     // Testing correct log method is called.
     // Check for all decision upto current decision is logged.
@@ -1347,10 +1344,10 @@
       {features::kOptimizationHints});
   InitializeUIService();
   auto expected_type = PreviewsType::NOSCRIPT;
-
+  PreviewsUserData user_data(kDefaultPageId);
   // First verify URL is allowed for no blacklist status.
-  EXPECT_TRUE(previews_decider_impl()->IsURLAllowedForPreview(*CreateRequest(),
-                                                              expected_type));
+  EXPECT_TRUE(previews_decider_impl()->IsURLAllowedForPreview(
+      &user_data, GURL("http://www.google.com"), expected_type));
 
   PreviewsEligibilityReason expected_reasons[] = {
       PreviewsEligibilityReason::BLACKLIST_DATA_NOT_LOADED,
@@ -1368,9 +1365,9 @@
         std::make_unique<TestPreviewsBlackList>(expected_reason,
                                                 previews_decider_impl());
     previews_decider_impl()->InjectTestBlacklist(std::move(blacklist));
-
+    PreviewsUserData user_data(kDefaultPageId);
     EXPECT_FALSE(previews_decider_impl()->IsURLAllowedForPreview(
-        *CreateRequest(), expected_type));
+        &user_data, GURL("http://www.google.com"), expected_type));
     base::RunLoop().RunUntilIdle();
     // Testing correct log method is called.
     // Check for all decision upto current decision is logged.
@@ -1388,8 +1385,7 @@
   scoped_feature_list.InitWithFeatures(
       {features::kPreviews, features::kClientLoFi}, {});
   InitializeUIService();
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
   auto expected_reason = PreviewsEligibilityReason::ALLOWED;
   auto expected_type = PreviewsType::LOFI;
 
@@ -1408,9 +1404,9 @@
         std::make_unique<TestPreviewsBlackList>(blacklist_decision,
                                                 previews_decider_impl());
     previews_decider_impl()->InjectTestBlacklist(std::move(blacklist));
-
+    PreviewsUserData user_data(kDefaultPageId);
     previews_decider_impl()->ShouldAllowPreviewAtECT(
-        *CreateRequest(), expected_type,
+        &user_data, GURL("http://www.google.com"), false, expected_type,
         params::EffectiveConnectionTypeThresholdForClientLoFi(),
         params::GetBlackListedHostsForClientLoFiFieldTrial(), false);
 
@@ -1428,14 +1424,13 @@
   scoped_feature_list.InitWithFeatures(
       {features::kPreviews, features::kClientLoFi}, {});
   InitializeUIService();
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   previews_decider_impl()->SetIgnorePreviewsBlacklistDecision(
       true /* ignored */);
-
+  PreviewsUserData user_data(kDefaultPageId);
   EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::LOFI,
+      &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false));
 
@@ -1443,14 +1438,14 @@
       GURL("http://wwww.somedomain.com"), true, PreviewsType::LOFI, 1);
 
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::LOFI,
+      &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false));
 
   clock_.Advance(base::TimeDelta::FromSeconds(6));
 
   EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::LOFI,
+      &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false));
 }
@@ -1476,11 +1471,10 @@
       PreviewsEligibilityReason::HOST_BLACKLISTED,
   };
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
-
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN);
+  PreviewsUserData user_data(kDefaultPageId);
   previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), expected_type,
+      &user_data, GURL("http://www.google.com"), false, expected_type,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false);
 
@@ -1510,8 +1504,7 @@
           PreviewsEligibilityReason::ALLOWED, previews_decider_impl());
   previews_decider_impl()->InjectTestBlacklist(std::move(blacklist));
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_4G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_4G);
 
   auto expected_reason = PreviewsEligibilityReason::NETWORK_NOT_SLOW;
   auto expected_type = PreviewsType::LOFI;
@@ -1524,9 +1517,9 @@
       PreviewsEligibilityReason::HOST_BLACKLISTED,
       PreviewsEligibilityReason::NETWORK_QUALITY_UNAVAILABLE,
   };
-
+  PreviewsUserData user_data(kDefaultPageId);
   previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), expected_type,
+      &user_data, GURL("http://www.google.com"), false, expected_type,
       net::EFFECTIVE_CONNECTION_TYPE_2G /* threshold */, {}, false);
   base::RunLoop().RunUntilIdle();
   // Testing correct log method is called.
@@ -1559,8 +1552,7 @@
           PreviewsEligibilityReason::ALLOWED, previews_decider_impl());
   previews_decider_impl()->InjectTestBlacklist(std::move(blacklist));
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   auto expected_reason = PreviewsEligibilityReason::HOST_BLACKLISTED_BY_SERVER;
   auto expected_type = PreviewsType::LOFI;
@@ -1575,9 +1567,9 @@
       PreviewsEligibilityReason::NETWORK_NOT_SLOW,
       PreviewsEligibilityReason::RELOAD_DISALLOWED,
   };
-
+  PreviewsUserData user_data(kDefaultPageId);
   previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), expected_type,
+      &user_data, GURL("http://example.com"), false, expected_type,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false);
   base::RunLoop().RunUntilIdle();
@@ -1606,10 +1598,8 @@
           PreviewsEligibilityReason::ALLOWED, previews_decider_impl());
   previews_decider_impl()->InjectTestBlacklist(std::move(blacklist));
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
-  std::unique_ptr<net::URLRequest> request = CreateRequest();
-  request->SetLoadFlags(net::LOAD_BYPASS_CACHE);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
+  PreviewsUserData user_data(kDefaultPageId);
 
   auto expected_reason = PreviewsEligibilityReason::RELOAD_DISALLOWED;
   auto expected_type = PreviewsType::OFFLINE;
@@ -1625,7 +1615,7 @@
   };
 
   previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *request, expected_type,
+      &user_data, GURL("http://www.google.com"), true, expected_type,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false);
   base::RunLoop().RunUntilIdle();
@@ -1662,12 +1652,11 @@
       std::make_unique<TestPreviewsBlackList>(
           PreviewsEligibilityReason::HOST_BLACKLISTED, previews_decider_impl());
   previews_decider_impl()->InjectTestBlacklist(std::move(blacklist));
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
-
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
+  PreviewsUserData user_data(kDefaultPageId);
   auto expected_reason = PreviewsEligibilityReason::ALLOWED;
   EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::LOFI,
+      &user_data, GURL("https://www.google.com"), false, PreviewsType::LOFI,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false));
 
@@ -1688,8 +1677,7 @@
 
   previews_decider_impl()->InjectTestBlacklist(std::move(blacklist));
 
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_2G);
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_2G);
 
   auto expected_reason = PreviewsEligibilityReason::ALLOWED;
   auto expected_type = PreviewsType::LOFI;
@@ -1705,9 +1693,9 @@
       PreviewsEligibilityReason::RELOAD_DISALLOWED,
       PreviewsEligibilityReason::HOST_BLACKLISTED_BY_SERVER,
   };
-
+  PreviewsUserData user_data(kDefaultPageId);
   previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), expected_type,
+      &user_data, GURL("http://www.google.com"), false, expected_type,
       params::EffectiveConnectionTypeThresholdForClientLoFi(),
       params::GetBlackListedHostsForClientLoFiFieldTrial(), false);
   base::RunLoop().RunUntilIdle();
@@ -1802,16 +1790,17 @@
   previews_decider_impl()->InjectTestBlacklist(std::move(blacklist));
 
   // LoFi and LitePage check NQE on their own.
-  network_quality_estimator()->set_effective_connection_type(
-      net::EFFECTIVE_CONNECTION_TYPE_3G);
-
+  ReportEffectiveConnectionType(net::EFFECTIVE_CONNECTION_TYPE_3G);
+  PreviewsUserData user_data(kDefaultPageId);
   base::HistogramTester histogram_tester;
   EXPECT_FALSE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::LITE_PAGE,
-      net::EFFECTIVE_CONNECTION_TYPE_4G, std::vector<std::string>(), false));
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::LITE_PAGE, net::EFFECTIVE_CONNECTION_TYPE_4G,
+      std::vector<std::string>(), false));
   EXPECT_TRUE(previews_decider_impl()->ShouldAllowPreviewAtECT(
-      *CreateRequest(), PreviewsType::LITE_PAGE,
-      net::EFFECTIVE_CONNECTION_TYPE_4G, std::vector<std::string>(), true));
+      &user_data, GURL("https://www.google.com"), false,
+      PreviewsType::LITE_PAGE, net::EFFECTIVE_CONNECTION_TYPE_4G,
+      std::vector<std::string>(), true));
 }
 
 }  // namespace
diff --git a/components/previews/content/previews_optimization_guide.cc b/components/previews/content/previews_optimization_guide.cc
index 7cdc9d15..ba8e2d9 100644
--- a/components/previews/content/previews_optimization_guide.cc
+++ b/components/previews/content/previews_optimization_guide.cc
@@ -11,7 +11,6 @@
 #include "components/optimization_guide/proto/hints.pb.h"
 #include "components/previews/content/previews_hints.h"
 #include "components/previews/content/previews_user_data.h"
-#include "net/url_request/url_request.h"
 #include "url/gurl.h"
 
 namespace previews {
@@ -32,31 +31,30 @@
   optimization_guide_service_->RemoveObserver(this);
 }
 
-bool PreviewsOptimizationGuide::IsWhitelisted(const net::URLRequest& request,
+bool PreviewsOptimizationGuide::IsWhitelisted(PreviewsUserData* previews_data,
+                                              const GURL& url,
                                               PreviewsType type) const {
   DCHECK(io_task_runner_->BelongsToCurrentThread());
   if (!hints_)
     return false;
 
   int inflation_percent = 0;
-  if (!hints_->IsWhitelisted(request.url(), type, &inflation_percent))
+  if (!hints_->IsWhitelisted(url, type, &inflation_percent))
     return false;
 
-  previews::PreviewsUserData* previews_user_data =
-      previews::PreviewsUserData::GetData(request);
-  if (inflation_percent != 0 && previews_user_data)
-    previews_user_data->SetDataSavingsInflationPercent(inflation_percent);
+  if (inflation_percent != 0 && previews_data)
+    previews_data->SetDataSavingsInflationPercent(inflation_percent);
 
   return true;
 }
 
-bool PreviewsOptimizationGuide::IsBlacklisted(const net::URLRequest& request,
+bool PreviewsOptimizationGuide::IsBlacklisted(const GURL& url,
                                               PreviewsType type) const {
   DCHECK(io_task_runner_->BelongsToCurrentThread());
   if (!hints_)
     return false;
 
-  return hints_->IsBlacklisted(request.url(), type);
+  return hints_->IsBlacklisted(url, type);
 }
 
 void PreviewsOptimizationGuide::OnLoadedHint(
@@ -93,7 +91,7 @@
 }
 
 bool PreviewsOptimizationGuide::MaybeLoadOptimizationHints(
-    const net::URLRequest& request,
+    const GURL& url,
     ResourceLoadingHintsCallback callback) {
   DCHECK(io_task_runner_->BelongsToCurrentThread());
 
@@ -101,9 +99,9 @@
     return false;
 
   return hints_->MaybeLoadOptimizationHints(
-      request.url(), base::BindOnce(&PreviewsOptimizationGuide::OnLoadedHint,
-                                    io_weak_ptr_factory_.GetWeakPtr(),
-                                    std::move(callback), request.url()));
+      url, base::BindOnce(&PreviewsOptimizationGuide::OnLoadedHint,
+                          io_weak_ptr_factory_.GetWeakPtr(),
+                          std::move(callback), url));
 }
 
 void PreviewsOptimizationGuide::OnHintsProcessed(
diff --git a/components/previews/content/previews_optimization_guide.h b/components/previews/content/previews_optimization_guide.h
index 09cab92..fe988ef 100644
--- a/components/previews/content/previews_optimization_guide.h
+++ b/components/previews/content/previews_optimization_guide.h
@@ -19,10 +19,6 @@
 #include "components/previews/core/previews_experiments.h"
 #include "url/gurl.h"
 
-namespace net {
-class URLRequest;
-}  // namespace net
-
 namespace optimization_guide {
 namespace proto {
 class Configuration;
@@ -32,6 +28,7 @@
 namespace previews {
 
 class PreviewsHints;
+class PreviewsUserData;
 
 using ResourceLoadingHintsCallback = base::OnceCallback<void(
     const GURL& document_gurl,
@@ -49,21 +46,22 @@
 
   ~PreviewsOptimizationGuide() override;
 
-  // Returns whether |type| is whitelisted for |request|.
+  // Returns whether |type| is whitelisted for |url|.|previews_data| can be
+  // modified.
   // Virtual so it can be mocked in tests.
-  virtual bool IsWhitelisted(const net::URLRequest& request,
+  virtual bool IsWhitelisted(PreviewsUserData* previews_data,
+                             const GURL& url,
                              PreviewsType type) const;
 
-  // Returns whether |type| is blacklisted for |request|.
+  // Returns whether |type| is blacklisted for |url|.
   // Virtual so it can be mocked in tests.
-  virtual bool IsBlacklisted(const net::URLRequest& request,
-                             PreviewsType type) const;
+  virtual bool IsBlacklisted(const GURL& url, PreviewsType type) const;
 
   // Returns whether |request| may have associated optimization hints
   // (specifically, PageHints). If so, but the hints are not available
   // synchronously, this method will request that they be loaded (from disk or
   // network).
-  bool MaybeLoadOptimizationHints(const net::URLRequest& request,
+  bool MaybeLoadOptimizationHints(const GURL& url,
                                   ResourceLoadingHintsCallback callback);
 
   // optimization_guide::OptimizationGuideServiceObserver implementation:
diff --git a/components/previews/content/previews_optimization_guide_unittest.cc b/components/previews/content/previews_optimization_guide_unittest.cc
index d43177f5..a472fd8 100644
--- a/components/previews/content/previews_optimization_guide_unittest.cc
+++ b/components/previews/content/previews_optimization_guide_unittest.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -24,14 +25,16 @@
 #include "components/previews/content/previews_user_data.h"
 #include "components/previews/core/bloom_filter.h"
 #include "components/previews/core/previews_features.h"
-#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_test_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
 namespace previews {
 
+namespace {
+// A fake default page_id for testing.
+const uint64_t kDefaultPageId = 123456;
+}  // namespace
+
 class TestOptimizationGuideService
     : public optimization_guide::OptimizationGuideService {
  public:
@@ -84,11 +87,6 @@
     guide_->OnHintsProcessed(config, info);
   }
 
-  std::unique_ptr<net::URLRequest> CreateRequestWithURL(const GURL& url) const {
-    return context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr,
-                                  TRAFFIC_ANNOTATION_FOR_TESTS);
-  }
-
   void MaybeLoadOptimizationHintsCallback(
       const GURL& document_gurl,
       const std::vector<std::string>& resource_patterns) {
@@ -141,8 +139,6 @@
   std::unique_ptr<PreviewsOptimizationGuide> guide_;
   std::unique_ptr<TestOptimizationGuideService> optimization_guide_service_;
 
-  net::TestURLRequestContext context_;
-
   GURL loaded_hints_document_gurl_;
   std::vector<std::string> loaded_hints_resource_patterns_;
 
@@ -253,9 +249,9 @@
 }
 
 TEST_F(PreviewsOptimizationGuideTest, IsWhitelistedWithoutHints) {
-  std::unique_ptr<net::URLRequest> request =
-      CreateRequestWithURL(GURL("https://m.facebook.com"));
-  EXPECT_FALSE(guide()->IsWhitelisted(*request, PreviewsType::NOSCRIPT));
+  PreviewsUserData user_data(kDefaultPageId);
+  EXPECT_FALSE(guide()->IsWhitelisted(
+      &user_data, GURL("https://m.facebook.com"), PreviewsType::NOSCRIPT));
 }
 
 TEST_F(PreviewsOptimizationGuideTest,
@@ -283,17 +279,15 @@
   ProcessHints(config, "2.0.0");
 
   RunUntilIdle();
-
+  PreviewsUserData user_data(kDefaultPageId);
   // Twitter and Facebook should be whitelisted but not Google.
-  EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.facebook.com")),
-      PreviewsType::NOSCRIPT));
-  EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.twitter.com/example")),
-      PreviewsType::NOSCRIPT));
-  EXPECT_FALSE(
-      guide()->IsWhitelisted(*CreateRequestWithURL(GURL("https://google.com")),
-                             PreviewsType::NOSCRIPT));
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data, GURL("https://m.facebook.com"),
+                                     PreviewsType::NOSCRIPT));
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data,
+                                     GURL("https://m.twitter.com/example"),
+                                     PreviewsType::NOSCRIPT));
+  EXPECT_FALSE(guide()->IsWhitelisted(&user_data, GURL("https://google.com"),
+                                      PreviewsType::NOSCRIPT));
 }
 
 // Test when resource loading hints are enabled.
@@ -341,16 +335,15 @@
 
   RunUntilIdle();
 
+  PreviewsUserData user_data(kDefaultPageId);
   // Twitter and Facebook should be whitelisted but not Google.
-  EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.facebook.com")),
-      PreviewsType::RESOURCE_LOADING_HINTS));
-  EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.twitter.com/example")),
-      PreviewsType::RESOURCE_LOADING_HINTS));
-  EXPECT_FALSE(
-      guide()->IsWhitelisted(*CreateRequestWithURL(GURL("https://google.com")),
-                             PreviewsType::RESOURCE_LOADING_HINTS));
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data, GURL("https://m.facebook.com"),
+                                     PreviewsType::RESOURCE_LOADING_HINTS));
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data,
+                                     GURL("https://m.twitter.com/example"),
+                                     PreviewsType::RESOURCE_LOADING_HINTS));
+  EXPECT_FALSE(guide()->IsWhitelisted(&user_data, GURL("https://google.com"),
+                                      PreviewsType::RESOURCE_LOADING_HINTS));
 }
 
 // Test when both NoScript and resource loading hints are enabled.
@@ -389,20 +382,18 @@
   ProcessHints(config, "2.0.0");
 
   RunUntilIdle();
-
+  PreviewsUserData user_data(kDefaultPageId);
   // Twitter and Facebook should be whitelisted but not Google.
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data, GURL("https://m.facebook.com"),
+                                     PreviewsType::NOSCRIPT));
   EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.facebook.com")),
+      &user_data, GURL("https://m.facebook.com/example.html"),
       PreviewsType::NOSCRIPT));
-  EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.facebook.com/example.html")),
-      PreviewsType::NOSCRIPT));
-  EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.twitter.com/example")),
-      PreviewsType::RESOURCE_LOADING_HINTS));
-  EXPECT_FALSE(
-      guide()->IsWhitelisted(*CreateRequestWithURL(GURL("https://google.com")),
-                             PreviewsType::RESOURCE_LOADING_HINTS));
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data,
+                                     GURL("https://m.twitter.com/example"),
+                                     PreviewsType::RESOURCE_LOADING_HINTS));
+  EXPECT_FALSE(guide()->IsWhitelisted(&user_data, GURL("https://google.com"),
+                                      PreviewsType::RESOURCE_LOADING_HINTS));
 }
 
 // This is a helper function for testing the experiment flags on the config for
@@ -450,27 +441,25 @@
 
   RunUntilIdle();
 
+  PreviewsUserData user_data(kDefaultPageId);
   // Check to ensure the optimization under test (facebook noscript) is either
   // enabled or disabled, depending on what the caller told us to expect.
   EXPECT_EQ(expect_enabled,
-            guide()->IsWhitelisted(
-                *CreateRequestWithURL(GURL("https://m.facebook.com")),
-                PreviewsType::NOSCRIPT));
+            guide()->IsWhitelisted(&user_data, GURL("https://m.facebook.com"),
+                                   PreviewsType::NOSCRIPT));
 
   // RESOURCE_LOADING_HINTS for facebook should always be enabled.
-  EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.facebook.com")),
-      PreviewsType::RESOURCE_LOADING_HINTS));
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data, GURL("https://m.facebook.com"),
+                                     PreviewsType::RESOURCE_LOADING_HINTS));
   // Twitter's NOSCRIPT should always be enabled; RESOURCE_LOADING_HINTS is not
   // configured and should be disabled.
-  EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.twitter.com/example")),
-      PreviewsType::NOSCRIPT));
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data,
+                                     GURL("https://m.twitter.com/example"),
+                                     PreviewsType::NOSCRIPT));
   // Google (which is not configured at all) should always have both NOSCRIPT
   // and RESOURCE_LOADING_HINTS disabled.
-  EXPECT_FALSE(
-      guide()->IsWhitelisted(*CreateRequestWithURL(GURL("https://google.com")),
-                             PreviewsType::NOSCRIPT));
+  EXPECT_FALSE(guide()->IsWhitelisted(&user_data, GURL("https://google.com"),
+                                      PreviewsType::NOSCRIPT));
 }
 
 TEST_F(PreviewsOptimizationGuideTest,
@@ -541,9 +530,9 @@
 
   RunUntilIdle();
 
-  std::unique_ptr<net::URLRequest> request =
-      CreateRequestWithURL(GURL("https://m.facebook.com"));
-  EXPECT_FALSE(guide()->IsWhitelisted(*request, PreviewsType::NOSCRIPT));
+  PreviewsUserData user_data(kDefaultPageId);
+  EXPECT_FALSE(guide()->IsWhitelisted(
+      &user_data, GURL("https://m.facebook.com"), PreviewsType::NOSCRIPT));
 }
 
 TEST_F(PreviewsOptimizationGuideTest,
@@ -560,9 +549,10 @@
 
   RunUntilIdle();
 
-  std::unique_ptr<net::URLRequest> request =
-      CreateRequestWithURL(GURL("https://m.facebook.com"));
-  EXPECT_FALSE(guide()->IsWhitelisted(*request, PreviewsType::NOSCRIPT));
+  PreviewsUserData user_data(kDefaultPageId);
+
+  EXPECT_FALSE(guide()->IsWhitelisted(
+      &user_data, GURL("https://m.facebook.com"), PreviewsType::NOSCRIPT));
 }
 
 TEST_F(PreviewsOptimizationGuideTest, ProcessHintsWithExistingSentinel) {
@@ -585,9 +575,9 @@
   // Verify config not processed for version 2.0.0 (same as sentinel).
   ProcessHints(config, "2.0.0");
   RunUntilIdle();
+  PreviewsUserData user_data(kDefaultPageId);
   EXPECT_FALSE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.facebook.com")),
-      PreviewsType::NOSCRIPT));
+      &user_data, GURL("https://m.facebook.com"), PreviewsType::NOSCRIPT));
   EXPECT_TRUE(base::PathExists(sentinel_path));
   histogram_tester.ExpectUniqueSample("Previews.ProcessHintsResult",
                                       2 /* FAILED_FINISH_PROCESSING */, 1);
@@ -595,9 +585,8 @@
   // Now verify config is processed for different version and sentinel cleared.
   ProcessHints(config, "3.0.0");
   RunUntilIdle();
-  EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.facebook.com")),
-      PreviewsType::NOSCRIPT));
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data, GURL("https://m.facebook.com"),
+                                     PreviewsType::NOSCRIPT));
   EXPECT_FALSE(base::PathExists(sentinel_path));
   histogram_tester.ExpectBucketCount("Previews.ProcessHintsResult",
                                      1 /* PROCESSED_PREVIEWS_HINTS */, 1);
@@ -624,9 +613,9 @@
   // that the existinel sentinel file is deleted.
   ProcessHints(config, "2.0.0");
   RunUntilIdle();
+  PreviewsUserData user_data(kDefaultPageId);
   EXPECT_FALSE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.facebook.com")),
-      PreviewsType::NOSCRIPT));
+      &user_data, GURL("https://m.facebook.com"), PreviewsType::NOSCRIPT));
   EXPECT_FALSE(base::PathExists(sentinel_path));
   histogram_tester.ExpectUniqueSample("Previews.ProcessHintsResult",
                                       2 /* FAILED_FINISH_PROCESSING */, 1);
@@ -634,9 +623,8 @@
   // Now verify config is processed with sentinel cleared.
   ProcessHints(config, "2.0.0");
   RunUntilIdle();
-  EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://m.facebook.com")),
-      PreviewsType::NOSCRIPT));
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data, GURL("https://m.facebook.com"),
+                                     PreviewsType::NOSCRIPT));
   EXPECT_FALSE(base::PathExists(sentinel_path));
   histogram_tester.ExpectBucketCount("Previews.ProcessHintsResult",
                                      1 /* PROCESSED_PREVIEWS_HINTS */, 1);
@@ -712,38 +700,34 @@
   ProcessHints(config, "2.0.0");
   RunUntilIdle();
 
-  std::unique_ptr<net::URLRequest> request1 =
-      CreateRequestWithURL(GURL("https://yahoo.com"));
-  previews::PreviewsUserData::Create(request1.get(), 1);
-  EXPECT_TRUE(guide()->IsWhitelisted(*request1, PreviewsType::NOSCRIPT));
-  EXPECT_EQ(30, previews::PreviewsUserData::GetData(*request1)
-                    ->data_savings_inflation_percent());
+  PreviewsUserData user_data(1);
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data, GURL("https://yahoo.com"),
+                                     PreviewsType::NOSCRIPT));
+  EXPECT_EQ(30, user_data.data_savings_inflation_percent());
 
-  std::unique_ptr<net::URLRequest> request2 =
-      CreateRequestWithURL(GURL("https://sports.yahoo.com"));
+  PreviewsUserData user_data2(2);
   // Uses "sports.yahoo.com" match before "yahoo.com" match.
-  EXPECT_FALSE(guide()->IsWhitelisted(*request2, PreviewsType::NOSCRIPT));
+  EXPECT_FALSE(guide()->IsWhitelisted(
+      &user_data, GURL("https://sports.yahoo.com"), PreviewsType::NOSCRIPT));
 
-  std::unique_ptr<net::URLRequest> request3 =
-      CreateRequestWithURL(GURL("https://mail.yahoo.com"));
-  previews::PreviewsUserData::Create(request3.get(), 3);
+  PreviewsUserData user_data3(3);
   // Uses "yahoo.com" match before "mail.yahoo.com" match.
-  EXPECT_TRUE(guide()->IsWhitelisted(*request3, PreviewsType::NOSCRIPT));
-  EXPECT_EQ(30, previews::PreviewsUserData::GetData(*request3)
-                    ->data_savings_inflation_percent());
+  EXPECT_TRUE(guide()->IsWhitelisted(
+      &user_data3, GURL("https://mail.yahoo.com"), PreviewsType::NOSCRIPT));
+  EXPECT_EQ(30, user_data3.data_savings_inflation_percent());
 
-  std::unique_ptr<net::URLRequest> request4 =
-      CreateRequestWithURL(GURL("https://indoor.sports.yahoo.com"));
-  previews::PreviewsUserData::Create(request4.get(), 4);
+  PreviewsUserData user_data4(4);
   // Uses "indoor.sports.yahoo.com" match before "sports.yahoo.com" match.
-  EXPECT_TRUE(guide()->IsWhitelisted(*request4, PreviewsType::NOSCRIPT));
-  EXPECT_EQ(10, previews::PreviewsUserData::GetData(*request4)
-                    ->data_savings_inflation_percent());
+  EXPECT_TRUE(guide()->IsWhitelisted(&user_data4,
+                                     GURL("https://indoor.sports.yahoo.com"),
+                                     PreviewsType::NOSCRIPT));
+  EXPECT_EQ(10, user_data4.data_savings_inflation_percent());
 
-  std::unique_ptr<net::URLRequest> request5 =
-      CreateRequestWithURL(GURL("https://outdoor.sports.yahoo.com"));
+  PreviewsUserData user_data5(5);
   // Uses "sports.yahoo.com" match before "yahoo.com" match.
-  EXPECT_FALSE(guide()->IsWhitelisted(*request5, PreviewsType::NOSCRIPT));
+  EXPECT_FALSE(guide()->IsWhitelisted(&user_data5,
+                                      GURL("https://outdoor.sports.yahoo.com"),
+                                      PreviewsType::NOSCRIPT));
 }
 
 TEST_F(PreviewsOptimizationGuideTest, MaybeLoadOptimizationHints) {
@@ -754,16 +738,14 @@
   InitializeFixedCountResourceLoadingHints();
 
   EXPECT_TRUE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://somedomain.org/")),
-      base::DoNothing()));
+      GURL("https://somedomain.org/"), base::DoNothing()));
   EXPECT_TRUE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://www.somedomain.org/news/football")),
+      GURL("https://www.somedomain.org/news/football"),
       base::BindOnce(
           &PreviewsOptimizationGuideTest::MaybeLoadOptimizationHintsCallback,
           base::Unretained(this))));
   EXPECT_FALSE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://www.unknown.com")),
-      base::DoNothing()));
+      GURL("https://www.unknown.com"), base::DoNothing()));
 
   RunUntilIdle();
   histogram_tester.ExpectUniqueSample(
@@ -779,17 +761,18 @@
   EXPECT_EQ(1ul, loaded_hints_resource_patterns().size());
   EXPECT_EQ("news_cruft.js", loaded_hints_resource_patterns().front());
 
+  PreviewsUserData user_data(kDefaultPageId);
   // Verify whitelisting from loaded page hints.
   EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(
-          GURL("https://www.somedomain.org/news/weather/raininginseattle")),
+      &user_data,
+      GURL("https://www.somedomain.org/news/weather/raininginseattle"),
       PreviewsType::RESOURCE_LOADING_HINTS));
   EXPECT_TRUE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(
-          GURL("https://www.somedomain.org/football/seahawksrebuildingyear")),
+      &user_data,
+      GURL("https://www.somedomain.org/football/seahawksrebuildingyear"),
       PreviewsType::RESOURCE_LOADING_HINTS));
   EXPECT_FALSE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(GURL("https://www.somedomain.org/unhinted")),
+      &user_data, GURL("https://www.somedomain.org/unhinted"),
       PreviewsType::RESOURCE_LOADING_HINTS));
 }
 
@@ -814,35 +797,31 @@
   InitializeMultipleResourceLoadingHints(key_count, page_patterns_per_key);
 
   EXPECT_TRUE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://somedomain0.org/")),
-      base::DoNothing()));
+      GURL("https://somedomain0.org/"), base::DoNothing()));
   EXPECT_TRUE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://www.somedomain0.org/news0/football")),
+      GURL("https://www.somedomain0.org/news0/football"),
       base::BindOnce(
           &PreviewsOptimizationGuideTest::MaybeLoadOptimizationHintsCallback,
           base::Unretained(this))));
   EXPECT_TRUE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(
-          GURL("https://www.somedomain0.org/news499/football")),
+
+      GURL("https://www.somedomain0.org/news499/football"),
       base::BindOnce(
           &PreviewsOptimizationGuideTest::MaybeLoadOptimizationHintsCallback,
           base::Unretained(this))));
   EXPECT_TRUE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(
-          GURL("https://www.somedomain0.org/news500/football")),
+
+      GURL("https://www.somedomain0.org/news500/football"),
       base::BindOnce(
           &PreviewsOptimizationGuideTest::MaybeLoadOptimizationHintsCallback,
           base::Unretained(this))));
 
   EXPECT_TRUE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://somedomain19.org/")),
-      base::DoNothing()));
+      GURL("https://somedomain19.org/"), base::DoNothing()));
   EXPECT_FALSE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://somedomain20.org/")),
-      base::DoNothing()));
+      GURL("https://somedomain20.org/"), base::DoNothing()));
   EXPECT_FALSE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://www.unknown.com")),
-      base::DoNothing()));
+      GURL("https://www.unknown.com"), base::DoNothing()));
 
   RunUntilIdle();
   histogram_tester.ExpectUniqueSample(
@@ -877,20 +856,18 @@
   InitializeMultipleResourceLoadingHints(key_count, page_patterns_per_key);
 
   EXPECT_TRUE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://somedomain0.org/")),
-      base::DoNothing()));
+      GURL("https://somedomain0.org/"), base::DoNothing()));
   EXPECT_TRUE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://www.somedomain0.org/news0/football")),
+      GURL("https://www.somedomain0.org/news0/football"),
       base::BindOnce(
           &PreviewsOptimizationGuideTest::MaybeLoadOptimizationHintsCallback,
           base::Unretained(this))));
 
   EXPECT_TRUE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://somedomain19.org/")),
-      base::DoNothing()));
+      GURL("https://somedomain19.org/"), base::DoNothing()));
   EXPECT_TRUE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(
-          GURL("https://www.somedomain19.org/news0/football")),
+
+      GURL("https://www.somedomain19.org/news0/football"),
       base::BindOnce(
           &PreviewsOptimizationGuideTest::MaybeLoadOptimizationHintsCallback,
           base::Unretained(this))));
@@ -898,11 +875,10 @@
   // The last page pattern should be dropped since it exceeds the threshold
   // count.
   EXPECT_FALSE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://somedomain20.org/")),
-      base::DoNothing()));
+      GURL("https://somedomain20.org/"), base::DoNothing()));
   EXPECT_FALSE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(
-          GURL("https://www.somedomain20.org/news0/football")),
+
+      GURL("https://www.somedomain20.org/news0/football"),
       base::BindOnce(
           &PreviewsOptimizationGuideTest::MaybeLoadOptimizationHintsCallback,
           base::Unretained(this))));
@@ -929,53 +905,50 @@
   InitializeFixedCountResourceLoadingHints();
 
   EXPECT_FALSE(guide()->MaybeLoadOptimizationHints(
-      *CreateRequestWithURL(GURL("https://www.somedomain.org")),
-      base::DoNothing()));
+      GURL("https://www.somedomain.org"), base::DoNothing()));
 
   RunUntilIdle();
-
+  PreviewsUserData user_data(kDefaultPageId);
   EXPECT_FALSE(guide()->IsWhitelisted(
-      *CreateRequestWithURL(
-          GURL("https://www.somedomain.org/news/weather/raininginseattle")),
+      &user_data,
+      GURL("https://www.somedomain.org/news/weather/raininginseattle"),
       PreviewsType::RESOURCE_LOADING_HINTS));
 }
 
 TEST_F(PreviewsOptimizationGuideTest, IsBlacklisted) {
   base::test::ScopedFeatureList scoped_list;
   scoped_list.InitAndEnableFeature(features::kLitePageServerPreviews);
-  std::unique_ptr<net::URLRequest> request =
-      CreateRequestWithURL(GURL("https://m.blacklisteddomain.com/path"));
+
   EXPECT_FALSE(
-      guide()->IsBlacklisted(*request, PreviewsType::LITE_PAGE_REDIRECT));
+      guide()->IsBlacklisted(GURL("https://m.blacklisteddomain.com/path"),
+                             PreviewsType::LITE_PAGE_REDIRECT));
 
   InitializeWithLitePageRedirectBlacklist();
 
   EXPECT_TRUE(
-      guide()->IsBlacklisted(*request, PreviewsType::LITE_PAGE_REDIRECT));
-  EXPECT_FALSE(guide()->IsBlacklisted(*request, PreviewsType::NOSCRIPT));
+      guide()->IsBlacklisted(GURL("https://m.blacklisteddomain.com/path"),
+                             PreviewsType::LITE_PAGE_REDIRECT));
+  EXPECT_FALSE(guide()->IsBlacklisted(
+      GURL("https://m.blacklisteddomain.com/path"), PreviewsType::NOSCRIPT));
 
-  std::unique_ptr<net::URLRequest> request2 = CreateRequestWithURL(
-      GURL("https://blacklistedsubdomain.maindomain.co.in"));
-  EXPECT_TRUE(
-      guide()->IsBlacklisted(*request2, PreviewsType::LITE_PAGE_REDIRECT));
+  EXPECT_TRUE(guide()->IsBlacklisted(
+      GURL("https://blacklistedsubdomain.maindomain.co.in"),
+      PreviewsType::LITE_PAGE_REDIRECT));
 
-  std::unique_ptr<net::URLRequest> request3 =
-      CreateRequestWithURL(GURL("https://maindomain.co.in"));
-  EXPECT_FALSE(
-      guide()->IsBlacklisted(*request3, PreviewsType::LITE_PAGE_REDIRECT));
+  EXPECT_FALSE(guide()->IsBlacklisted(GURL("https://maindomain.co.in"),
+                                      PreviewsType::LITE_PAGE_REDIRECT));
 }
 
 TEST_F(PreviewsOptimizationGuideTest,
        IsBlacklistedWithLitePageServerPreviewsDisabled) {
   base::test::ScopedFeatureList scoped_list;
   scoped_list.InitAndDisableFeature(features::kLitePageServerPreviews);
-  std::unique_ptr<net::URLRequest> request =
-      CreateRequestWithURL(GURL("https://m.blacklisteddomain.com/path"));
 
   InitializeWithLitePageRedirectBlacklist();
 
   EXPECT_FALSE(
-      guide()->IsBlacklisted(*request, PreviewsType::LITE_PAGE_REDIRECT));
+      guide()->IsBlacklisted(GURL("https://m.blacklisteddomain.com/path"),
+                             PreviewsType::LITE_PAGE_REDIRECT));
 }
 
 TEST_F(PreviewsOptimizationGuideTest, RemoveObserverCalledAtDestruction) {
diff --git a/components/previews/content/previews_ui_service.cc b/components/previews/content/previews_ui_service.cc
index f661fe0..7ed70687 100644
--- a/components/previews/content/previews_ui_service.cc
+++ b/components/previews/content/previews_ui_service.cc
@@ -17,25 +17,35 @@
     std::unique_ptr<PreviewsOptimizationGuide> previews_opt_guide,
     const PreviewsIsEnabledCallback& is_enabled_callback,
     std::unique_ptr<PreviewsLogger> logger,
-    blacklist::BlacklistData::AllowedTypesAndVersions allowed_previews)
+    blacklist::BlacklistData::AllowedTypesAndVersions allowed_previews,
+    network::NetworkQualityTracker* network_quality_tracker)
     : io_task_runner_(io_task_runner),
       logger_(std::move(logger)),
+      network_quality_tracker_(network_quality_tracker),
       weak_factory_(this) {
+  DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(logger_);
   previews_decider_impl->Initialize(
       weak_factory_.GetWeakPtr(), std::move(previews_opt_out_store),
       std::move(previews_opt_guide), is_enabled_callback,
       std::move(allowed_previews));
+  network_quality_tracker_->AddEffectiveConnectionTypeObserver(this);
 }
 
 PreviewsUIService::~PreviewsUIService() {
   DCHECK(thread_checker_.CalledOnValidThread());
+  network_quality_tracker_->RemoveEffectiveConnectionTypeObserver(this);
 }
 
 void PreviewsUIService::SetIOData(
     base::WeakPtr<PreviewsDeciderImpl> previews_decider_impl) {
   DCHECK(thread_checker_.CalledOnValidThread());
   previews_decider_impl_ = previews_decider_impl;
+  io_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&PreviewsDeciderImpl::SetEffectiveConnectionType,
+                     previews_decider_impl_,
+                     current_effective_connection_type_));
 }
 
 void PreviewsUIService::AddPreviewNavigation(const GURL& url,
@@ -143,4 +153,14 @@
                                 previews_decider_impl_, begin_time, end_time));
 }
 
+void PreviewsUIService::OnEffectiveConnectionTypeChanged(
+    net::EffectiveConnectionType type) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  current_effective_connection_type_ = type;
+  io_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&PreviewsDeciderImpl::SetEffectiveConnectionType,
+                     previews_decider_impl_, type));
+}
+
 }  // namespace previews
diff --git a/components/previews/content/previews_ui_service.h b/components/previews/content/previews_ui_service.h
index 981fe04..dc78067 100644
--- a/components/previews/content/previews_ui_service.h
+++ b/components/previews/content/previews_ui_service.h
@@ -20,6 +20,8 @@
 #include "components/previews/core/previews_black_list.h"
 #include "components/previews/core/previews_experiments.h"
 #include "components/previews/core/previews_logger.h"
+#include "net/nqe/effective_connection_type.h"
+#include "services/network/public/cpp/network_quality_tracker.h"
 
 class GURL;
 
@@ -32,7 +34,8 @@
 
 // A class to manage the UI portion of inter-thread communication between
 // previews/ objects. Created and used on the UI thread.
-class PreviewsUIService {
+class PreviewsUIService
+    : public network::NetworkQualityTracker::EffectiveConnectionTypeObserver {
  public:
   PreviewsUIService(
       PreviewsDeciderImpl* previews_decider_impl,
@@ -41,8 +44,13 @@
       std::unique_ptr<PreviewsOptimizationGuide> previews_opt_guide,
       const PreviewsIsEnabledCallback& is_enabled_callback,
       std::unique_ptr<PreviewsLogger> logger,
-      blacklist::BlacklistData::AllowedTypesAndVersions allowed_previews);
-  virtual ~PreviewsUIService();
+      blacklist::BlacklistData::AllowedTypesAndVersions allowed_previews,
+      network::NetworkQualityTracker* network_quality_tracker);
+  ~PreviewsUIService() override;
+
+  // network::EffectiveConnectionTypeObserver:
+  void OnEffectiveConnectionTypeChanged(
+      net::EffectiveConnectionType type) override;
 
   // Sets |previews_decider_impl_| to |previews_decider_impl| to allow calls
   // from the UI thread to the IO thread. Virtualized in testing.
@@ -133,7 +141,7 @@
       bool ignore_long_term_black_list_rules_allowed);
 
  private:
-  // The IO thread portion of the inter-thread communication for previews/.
+  // The IO thread portion of the inter-thread communication for previews.
   base::WeakPtr<previews::PreviewsDeciderImpl> previews_decider_impl_;
 
   base::ThreadChecker thread_checker_;
@@ -152,6 +160,14 @@
   // A log object to keep track of events such as previews navigations,
   // blacklist actions, etc.
   std::unique_ptr<PreviewsLogger> logger_;
+
+  // Used to remove |this| from observing.
+  network::NetworkQualityTracker* network_quality_tracker_;
+
+  // The current EffectiveConnectionType estimate.
+  net::EffectiveConnectionType current_effective_connection_type_ =
+      net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
+
   base::WeakPtrFactory<PreviewsUIService> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(PreviewsUIService);
diff --git a/components/previews/content/previews_ui_service_unittest.cc b/components/previews/content/previews_ui_service_unittest.cc
index ae90aab..c588118 100644
--- a/components/previews/content/previews_ui_service_unittest.cc
+++ b/components/previews/content/previews_ui_service_unittest.cc
@@ -16,6 +16,7 @@
 #include "components/previews/core/previews_black_list.h"
 #include "components/previews/core/previews_experiments.h"
 #include "components/previews/core/previews_logger.h"
+#include "services/network/test/test_network_quality_tracker.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace previews {
@@ -29,14 +30,16 @@
       const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner,
       std::unique_ptr<blacklist::OptOutStore> previews_opt_out_store,
       std::unique_ptr<PreviewsOptimizationGuide> previews_opt_guide,
-      std::unique_ptr<PreviewsLogger> logger)
+      std::unique_ptr<PreviewsLogger> logger,
+      network::TestNetworkQualityTracker* test_network_quality_tracker)
       : PreviewsUIService(previews_decider_impl,
                           io_task_runner,
                           std::move(previews_opt_out_store),
                           std::move(previews_opt_guide),
                           PreviewsIsEnabledCallback(),
                           std::move(logger),
-                          blacklist::BlacklistData::AllowedTypesAndVersions()),
+                          blacklist::BlacklistData::AllowedTypesAndVersions(),
+                          test_network_quality_tracker),
         previews_decider_impl_set_(false) {}
   ~TestPreviewsUIService() override {}
 
@@ -204,7 +207,7 @@
     ui_service_ = std::make_unique<TestPreviewsUIService>(
         previews_decider_impl(), loop_.task_runner(),
         nullptr /* previews_opt_out_store */, nullptr /* previews_opt_guide */,
-        std::move(logger));
+        std::move(logger), &test_network_quality_tracker_);
     base::RunLoop().RunUntilIdle();
   }
 
@@ -217,6 +220,7 @@
   // Run this test on a single thread.
   base::MessageLoopForIO loop_;
   TestPreviewsLogger* logger_ptr_;
+  network::TestNetworkQualityTracker test_network_quality_tracker_;
 
  private:
   std::unique_ptr<TestPreviewsDeciderImpl> previews_decider_impl_;
diff --git a/components/previews/content/previews_user_data.cc b/components/previews/content/previews_user_data.cc
index f8546d7..f859c41 100644
--- a/components/previews/content/previews_user_data.cc
+++ b/components/previews/content/previews_user_data.cc
@@ -5,7 +5,6 @@
 #include "components/previews/content/previews_user_data.h"
 
 #include "base/memory/ptr_util.h"
-#include "net/url_request/url_request.h"
 
 namespace previews {
 
@@ -23,21 +22,22 @@
   return base::WrapUnique(new PreviewsUserData(*this));
 }
 
-PreviewsUserData* PreviewsUserData::GetData(const net::URLRequest& request) {
+PreviewsUserData* PreviewsUserData::GetData(
+    const base::SupportsUserData& owner) {
   PreviewsUserData* data =
-      static_cast<PreviewsUserData*>(request.GetUserData(kPreviewsUserDataKey));
+      static_cast<PreviewsUserData*>(owner.GetUserData(kPreviewsUserDataKey));
   return data;
 }
 
-PreviewsUserData* PreviewsUserData::Create(net::URLRequest* request,
+PreviewsUserData* PreviewsUserData::Create(base::SupportsUserData* owner,
                                            uint64_t page_id) {
-  if (!request)
+  if (!owner)
     return nullptr;
-  PreviewsUserData* data = GetData(*request);
+  PreviewsUserData* data = GetData(*owner);
   if (data)
     return data;
   data = new PreviewsUserData(page_id);
-  request->SetUserData(kPreviewsUserDataKey, base::WrapUnique(data));
+  owner->SetUserData(kPreviewsUserDataKey, base::WrapUnique(data));
   return data;
 }
 
diff --git a/components/previews/content/previews_user_data.h b/components/previews/content/previews_user_data.h
index 048acc3..6b31a9c 100644
--- a/components/previews/content/previews_user_data.h
+++ b/components/previews/content/previews_user_data.h
@@ -11,10 +11,6 @@
 #include "base/supports_user_data.h"
 #include "components/previews/core/previews_experiments.h"
 
-namespace net {
-class URLRequest;
-}
-
 namespace previews {
 
 // A representation of previews information related to a navigation.
@@ -26,12 +22,13 @@
   // Makes a deep copy.
   std::unique_ptr<PreviewsUserData> DeepCopy() const;
 
-  // Creates the data on |request| if it does not exist, and returns a pointer
+  // Creates the data on |owner| if it does not exist, and returns a pointer
   // to the data.
-  static PreviewsUserData* Create(net::URLRequest* request, uint64_t page_id);
+  static PreviewsUserData* Create(base::SupportsUserData* owner,
+                                  uint64_t page_id);
 
-  // Gets the data from the request if it exists.
-  static PreviewsUserData* GetData(const net::URLRequest& request);
+  // Gets the data from the owner if the data exists.
+  static PreviewsUserData* GetData(const base::SupportsUserData& owner);
 
   // A session unique ID related to this navigation.
   uint64_t page_id() const { return page_id_; }
diff --git a/components/previews/content/previews_user_data_unittest.cc b/components/previews/content/previews_user_data_unittest.cc
index f4d17e1..f0697dc 100644
--- a/components/previews/content/previews_user_data_unittest.cc
+++ b/components/previews/content/previews_user_data_unittest.cc
@@ -9,11 +9,9 @@
 #include <memory>
 
 #include "base/message_loop/message_loop.h"
+#include "base/supports_user_data.h"
 #include "net/base/request_priority.h"
 #include "net/nqe/effective_connection_type.h"
-#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/url_request.h"
-#include "net/url_request/url_request_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
@@ -21,6 +19,8 @@
 
 namespace {
 
+struct TestSupportsUserData : public base::SupportsUserData {};
+
 class PreviewsUserDataTest : public testing::Test {
  public:
   PreviewsUserDataTest() {}
@@ -36,19 +36,16 @@
   EXPECT_EQ(id, data->page_id());
 }
 
-TEST_F(PreviewsUserDataTest, AddToURLRequest) {
-  std::unique_ptr<net::URLRequestContext> context(new net::URLRequestContext());
-  std::unique_ptr<net::URLRequest> fake_request(context->CreateRequest(
-      GURL("http://www.google.com"), net::RequestPriority::IDLE, nullptr,
-      TRAFFIC_ANNOTATION_FOR_TESTS));
-  PreviewsUserData* data = PreviewsUserData::GetData(*fake_request);
+TEST_F(PreviewsUserDataTest, AddToSupportsUserData) {
+  TestSupportsUserData owner;
+  PreviewsUserData* data = PreviewsUserData::GetData(owner);
   EXPECT_FALSE(data);
 
-  data = PreviewsUserData::Create(fake_request.get(), 1u);
+  data = PreviewsUserData::Create(&owner, 1u);
   EXPECT_TRUE(data);
-  EXPECT_EQ(data, PreviewsUserData::GetData(*fake_request));
+  EXPECT_EQ(data, PreviewsUserData::GetData(owner));
 
-  EXPECT_EQ(data, PreviewsUserData::Create(fake_request.get(), 1u));
+  EXPECT_EQ(data, PreviewsUserData::Create(&owner, 1u));
 }
 
 TEST_F(PreviewsUserDataTest, DeepCopy) {
diff --git a/components/previews/core/previews_decider.h b/components/previews/core/previews_decider.h
index 41dbb10..2e89162c 100644
--- a/components/previews/core/previews_decider.h
+++ b/components/previews/core/previews_decider.h
@@ -4,24 +4,21 @@
 
 #ifndef COMPONENTS_PREVIEWS_CORE_PREVIEWS_DECIDER_H_
 #define COMPONENTS_PREVIEWS_CORE_PREVIEWS_DECIDER_H_
-
-#include "components/previews/core/previews_experiments.h"
-
 #include <string>
 #include <vector>
 
 #include "base/strings/string_piece.h"
+#include "components/previews/core/previews_experiments.h"
 #include "net/nqe/effective_connection_type.h"
 
-namespace net {
-class URLRequest;
-}
+class GURL;
 
 namespace previews {
+class PreviewsUserData;
 
 class PreviewsDecider {
  public:
-  // Whether |request| is allowed to show a preview of |type|. If the current
+  // Whether |url| is allowed to show a preview of |type|. If the current
   // ECT is strictly faster than |effective_connection_type_threshold|, the
   // preview will be disallowed; preview types that check network quality before
   // calling ShouldAllowPreviewAtECT should pass in
@@ -30,7 +27,9 @@
   // not need to be checked for long term rules when Previews has been
   // configured to allow skipping the blacklist.
   virtual bool ShouldAllowPreviewAtECT(
-      const net::URLRequest& request,
+      PreviewsUserData* previews_data,
+      const GURL& url,
+      bool is_reload,
       PreviewsType type,
       net::EffectiveConnectionType effective_connection_type_threshold,
       const std::vector<std::string>& host_blacklist_from_finch,
@@ -38,18 +37,21 @@
 
   // Same as ShouldAllowPreviewAtECT, but uses the previews default
   // EffectiveConnectionType and no blacklisted hosts from the server.
-  virtual bool ShouldAllowPreview(const net::URLRequest& request,
+  virtual bool ShouldAllowPreview(PreviewsUserData* previews_data,
+                                  const GURL& url,
+                                  bool is_reload,
                                   PreviewsType type) const = 0;
 
-  // Whether the URL in |request| is allowed to show a preview of |type|.
+  // Whether the |url| is allowed to show a preview of |type|.
   // This only considers whether the URL is constrained/allowed in
   // blacklists/whitelists. It does not include other constraints such
   // as the effective connection type.
-  virtual bool IsURLAllowedForPreview(const net::URLRequest& request,
+  virtual bool IsURLAllowedForPreview(PreviewsUserData* previews_data,
+                                      const GURL& url,
                                       PreviewsType type) const = 0;
 
   // Requests that any applicable detailed resource hints be loaded.
-  virtual void LoadResourceHints(const net::URLRequest& request) = 0;
+  virtual void LoadResourceHints(const GURL& url) = 0;
 
  protected:
   PreviewsDecider() {}
diff --git a/components/previews/core/test_previews_decider.cc b/components/previews/core/test_previews_decider.cc
index 247e815..09e41b0d 100644
--- a/components/previews/core/test_previews_decider.cc
+++ b/components/previews/core/test_previews_decider.cc
@@ -12,25 +12,30 @@
 TestPreviewsDecider::~TestPreviewsDecider() {}
 
 bool TestPreviewsDecider::ShouldAllowPreviewAtECT(
-    const net::URLRequest& request,
-    previews::PreviewsType type,
+    PreviewsUserData* previews_data,
+    const GURL& url,
+    bool is_reload,
+    PreviewsType type,
     net::EffectiveConnectionType effective_connection_type_threshold,
-    const std::vector<std::string>& host_blacklist_from_server,
+    const std::vector<std::string>& host_blacklist_from_finch,
     bool is_server_preview) const {
   return allow_previews_;
 }
 
-bool TestPreviewsDecider::ShouldAllowPreview(
-    const net::URLRequest& request,
-    previews::PreviewsType type) const {
+bool TestPreviewsDecider::ShouldAllowPreview(PreviewsUserData* previews_data,
+                                             const GURL& url,
+                                             bool is_reload,
+                                             PreviewsType type) const {
   return allow_previews_;
 }
 
-bool TestPreviewsDecider::IsURLAllowedForPreview(const net::URLRequest& request,
-                                                 PreviewsType type) const {
+bool TestPreviewsDecider::IsURLAllowedForPreview(
+    PreviewsUserData* previews_data,
+    const GURL& url,
+    PreviewsType type) const {
   return allow_previews_;
 }
 
-void TestPreviewsDecider::LoadResourceHints(const net::URLRequest& request) {}
+void TestPreviewsDecider::LoadResourceHints(const GURL& url) {}
 
 }  // namespace previews
diff --git a/components/previews/core/test_previews_decider.h b/components/previews/core/test_previews_decider.h
index 1b76db7..77dc8fb 100644
--- a/components/previews/core/test_previews_decider.h
+++ b/components/previews/core/test_previews_decider.h
@@ -17,16 +17,21 @@
 
   // previews::PreviewsDecider:
   bool ShouldAllowPreviewAtECT(
-      const net::URLRequest& request,
-      previews::PreviewsType type,
+      PreviewsUserData* previews_data,
+      const GURL& url,
+      bool is_reload,
+      PreviewsType type,
       net::EffectiveConnectionType effective_connection_type_threshold,
-      const std::vector<std::string>& host_blacklist_from_server,
+      const std::vector<std::string>& host_blacklist_from_finch,
       bool is_server_preview) const override;
-  bool ShouldAllowPreview(const net::URLRequest& request,
-                          previews::PreviewsType type) const override;
-  bool IsURLAllowedForPreview(const net::URLRequest& request,
+  bool ShouldAllowPreview(PreviewsUserData* previews_data,
+                          const GURL& url,
+                          bool is_reload,
+                          PreviewsType type) const override;
+  bool IsURLAllowedForPreview(PreviewsUserData* previews_data,
+                              const GURL& url,
                               PreviewsType type) const override;
-  void LoadResourceHints(const net::URLRequest& request) override;
+  void LoadResourceHints(const GURL& url) override;
 
  private:
   bool allow_previews_;
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index 4f89f86..101ec90 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -810,6 +810,7 @@
 <translation id="6626291197371920147">የሚሰራ የካርድ ቁጥር ያክሉ</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> ፍለጋ</translation>
 <translation id="6630809736994426279">አሁን <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ላይ የሚገኙ አጥቂዎች የእርስዎን መረጃ (ለምሳሌ፦ ፎቶዎች፣ የይለፍ ቃላት፣ መልዕክቶች፣ እና ክሬዲት ካርዶች የመሳሰሉ) የሚሰርቁ ወይም የሚሰርዙ አደገኛ ፕሮግራሞችን በእርስዎ Mac ላይ ለመጫን እየሞከሩ ሊሆኑ ይችላሉ። <ph name="BEGIN_LEARN_MORE_LINK" />የበለጠ ለመረዳት<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">አጽዳ</translation>
 <translation id="6644283850729428850">ይህ መመሪያ ተቋርጧል።</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{ምንም}=1{ከ1 ጣቢያ (ከእርስዎ የGoogle መለያ ዘግተው እንዲወጡ አይደረጉም)}one{ከ# ጣቢያዎች (ከእርስዎ የGoogle መለያ ዘግተው እንዲወጡ አይደረጉም)}other{ከ# ጣቢያዎች (ከእርስዎ የGoogle መለያ ዘግተው እንዲወጡ አይደረጉም)}}</translation>
 <translation id="6657585470893396449">የይለፍ ቃል፦</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index 2a5f4c0..8434680 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">إضافة رقم بطاقة صالح</translation>
 <translation id="6628463337424475685">بحث <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">‏قد يحاول المهاجمون حاليًا على <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> تثبيت برامج خطيرة على جهاز Mac تؤدي إلى سرقة أو حذف معلوماتك (على سبيل المثال، الصور، وكلمات المرور، والرسائل، وبطاقات الائتمان) <ph name="BEGIN_LEARN_MORE_LINK" />مزيد من المعلومات<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">محو</translation>
 <translation id="6644283850729428850">تم تجاهل هذه السياسة.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{بدون}=1{‏من موقع ويب واحد (لن يتم تسجيل خروجك من حسابك على Google)}two{‏من موقعي ويب (#) (لن يتم تسجيل خروجك من حسابك على Google)}few{‏من # مواقع ويب (لن يتم تسجيل خروجك من حسابك على Google)}many{‏من # موقع ويب (لن يتم تسجيل خروجك من حسابك على Google)}other{‏من # موقع ويب (لن يتم تسجيل خروجك من حسابك على Google)}}</translation>
 <translation id="6657585470893396449">كلمة المرور</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index 6dae5bd..50b65203 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Добавяне на валиден номер на карта</translation>
 <translation id="6628463337424475685">Търсене с/ъс <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Извършители на атака, понастоящем използващи <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, може да опитат да инсталират опасни програми на компютъра ви Mac, които крадат или изтриват информацията ви (например снимки, пароли, съобщения и номера на кредитни карти). <ph name="BEGIN_LEARN_MORE_LINK" />Научете повече<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Изчистване</translation>
 <translation id="6644283850729428850">Това правило е оттеглено.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Няма}=1{От 1 сайт (няма да излезете от профила си в Google)}other{От # сайта (няма да излезете от профила си в Google)}}</translation>
 <translation id="6657585470893396449">Парола</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index 5f8fc27c..93683ef 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">বৈধ কার্ড নম্বর যোগ করুন</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> সার্চ</translation>
 <translation id="6630809736994426279"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />-এ যে আক্রমণকারীরা এই মুহূর্তে সক্রিয় আছে, তারা আপনার Mac-এ এমন বিপজ্জনক প্রোগ্রাম ইনস্টল করে দিতে পারে যেগুলি আপনার তথ্যের (যেমন ফটো, পাসওয়ার্ড, মেসেজ এবং ক্রেডিট কার্ড) ক্ষতি করতে বা সেগুলি চুরি করতে পারে। <ph name="BEGIN_LEARN_MORE_LINK" />আরও জানুন<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">সাফ করুন</translation>
 <translation id="6644283850729428850">এই নীতিটি অসমর্থিত হয়েছে৷</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{কিছুই নয়}=1{১টি সাইট থেকে (আপনাকে আপনার Google অ্যাকাউন্ট থেকে সাইন-আউট করা হবে না)}one{#টি সাইট থেকে (আপনাকে আপনার Google অ্যাকাউন্ট থেকে সাইন-আউট করা হবে না)}other{#টি সাইট থেকে (আপনাকে আপনার Google অ্যাকাউন্ট থেকে সাইন-আউট করা হবে না)}}</translation>
 <translation id="6657585470893396449">পাসওয়ার্ড</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index c352c83..d7c52e2 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Afegeix un número de targeta vàlid</translation>
 <translation id="6628463337424475685">Cerca de <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">És possible que els atacants que es troben a <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> provin d'instal·lar programes perillosos a l'ordinador Mac per robar-te o suprimir-te informació (per exemple, fotos, contrasenyes, missatges i targetes de crèdit). <ph name="BEGIN_LEARN_MORE_LINK" />Més informació<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Esborra</translation>
 <translation id="6644283850729428850">Aquesta política ha quedat obsoleta.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Cap}=1{D'1 lloc web (no se't tancarà la sessió del compte de Google)}other{De # llocs web (no se't tancarà la sessió del compte de Google)}}</translation>
 <translation id="6657585470893396449">Contrasenya</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index 1ff25cd..60bf68f 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -806,6 +806,7 @@
 <translation id="6626291197371920147">Přidání platného čísla karty</translation>
 <translation id="6628463337424475685">Vyhledávání <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Útočníci, kteří se aktuálně nacházejí na webu <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, se mohou pokusit nainstalovat do vašeho počítače Mac nebezpečné programy, které mohou ukrást nebo smazat vaše informace (například fotky, hesla, zprávy nebo platební karty). <ph name="BEGIN_LEARN_MORE_LINK" />Další informace<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Vymazat</translation>
 <translation id="6644283850729428850">Tato zásada se již nepoužívá.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Žádné}=1{Z 1 webu (nebudete odhlášeni z účtu Google)}few{Ze # webů (nebudete odhlášeni z účtu Google)}many{Z # webu (nebudete odhlášeni z účtu Google)}other{Z # webů (nebudete odhlášeni z účtu Google)}}</translation>
 <translation id="6657585470893396449">Heslo</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 45e91df..2c3328c 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Tilføj gyldigt kortnummer</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> -søgning</translation>
 <translation id="6630809736994426279">Brugere med ondsindede hensigter, der i øjeblikket er på <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, kan forsøge at installere farlige programmer på din Mac, som stjæler eller sletter dine oplysninger (f.eks. fotos, adgangskoder, beskeder og kreditkort). <ph name="BEGIN_LEARN_MORE_LINK" />Få flere oplysninger<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Ryd</translation>
 <translation id="6644283850729428850">Denne politik er forældet.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Ingen}=1{Fra 1 website (du logges ikke ud af din Google-konto)}one{Fra # website (du logges ikke ud af din Google-konto)}other{Fra # websites (du logges ikke ud af din Google-konto)}}</translation>
 <translation id="6657585470893396449">Adgangskode</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index 0c8b608..138420e1 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -810,6 +810,7 @@
 <translation id="6626291197371920147">Gültige Kartennummer hinzufügen</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" />-Suche</translation>
 <translation id="6630809736994426279">Zurzeit auf <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> befindliche Hacker könnten versuchen, gefährliche Programme auf Ihrem Mac zu installieren, um Daten wie Fotos, Passwörter, Nachrichten und Kreditkartendaten zu stehlen oder zu löschen. <ph name="BEGIN_LEARN_MORE_LINK" />Weitere Informationen<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Löschen</translation>
 <translation id="6644283850729428850">Diese Richtlinie ist veraltet.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Keine}=1{1 Website (Anmeldung in Google-Konto bleibt erhalten)}other{# Websites (Anmeldung in Google-Konto bleibt erhalten)}}</translation>
 <translation id="6657585470893396449">Passwort</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index cbc9fd36..25ce60e 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -812,6 +812,7 @@
 <translation id="6626291197371920147">Προσθήκη έγκυρου αριθμού κάρτας</translation>
 <translation id="6628463337424475685">Αναζήτηση <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Οι εισβολείς που βρίσκονται αυτήν τη στιγμή στον ιστότοπο <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ενδέχεται να επιχειρήσουν να εγκαταστήσουν επικίνδυνα προγράμματα στον υπολογιστή σας Mac, για να υποκλέψουν ή να διαγράψουν τα δεδομένα σας (για παράδειγμα, φωτογραφίες, κωδικούς πρόσβασης, μηνύματα και πιστωτικές κάρτες). <ph name="BEGIN_LEARN_MORE_LINK" />Μάθετε περισσότερα<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Διαγραφή</translation>
 <translation id="6644283850729428850">Αυτή η πολιτική έχει αποσυρθεί.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Κανένας}=1{Από 1 ιστότοπο (δεν θα αποσυνδεθείτε από τον Λογαριασμό σας Google)}other{Από # ιστοτόπους (δεν θα αποσυνδεθείτε από τον Λογαριασμό σας Google)}}</translation>
 <translation id="6657585470893396449">Κωδικός πρόσβασης</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 5f1a6d1..4be1ef3 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Add valid card number</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Search</translation>
 <translation id="6630809736994426279">Attackers currently on <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> might attempt to install dangerous programs on your Mac that steal or delete your information (for example, photos, passwords, messages and credit cards). <ph name="BEGIN_LEARN_MORE_LINK" />Learn more<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Clear</translation>
 <translation id="6644283850729428850">This policy has been deprecated.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{None}=1{From 1 site (you won't be signed out of your Google account)}other{From # sites (you won't be signed out of your Google account)}}</translation>
 <translation id="6657585470893396449">Password</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb
index b9584109..07304fb 100644
--- a/components/strings/components_strings_es-419.xtb
+++ b/components/strings/components_strings_es-419.xtb
@@ -812,6 +812,7 @@
 <translation id="6626291197371920147">Agregar un número de tarjeta válido</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Búsqueda</translation>
 <translation id="6630809736994426279">Es posible que los atacantes que actualmente se encuentran en <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> intenten instalar programas peligrosos en tu Mac para robar o borrar información (p. ej., fotos, contraseñas, mensajes y tarjetas de crédito). <ph name="BEGIN_LEARN_MORE_LINK" />Más información<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Borrar</translation>
 <translation id="6644283850729428850">Esta política no ha sido aprobada.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Ninguno}=1{De 1 sitio (no saldrás de tu cuenta de Google)}other{De # sitios (no saldrás de tu cuenta de Google)}}</translation>
 <translation id="6657585470893396449">Contraseña</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index c8582fe..0dd6102 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Añadir un número de tarjeta válido</translation>
 <translation id="6628463337424475685">Búsqueda de <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Es posible que los atacantes que se encuentren en <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> intenten instalar programas peligrosos en tu Mac para robar o eliminar tu información (por ejemplo, fotos, contraseñas, mensajes y tarjetas de crédito). <ph name="BEGIN_LEARN_MORE_LINK" />Más información<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Eliminar</translation>
 <translation id="6644283850729428850">Esta política está obsoleta.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Ninguno}=1{De 1 sitio web (no se cerrará la sesión en tu cuenta de Google)}other{De # sitios web (no se cerrará la sesión en tu cuenta de Google)}}</translation>
 <translation id="6657585470893396449">Contraseña</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index 88d695c..fce598e 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Kehtiva kaardinumbri lisamine</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" />'i otsing</translation>
 <translation id="6630809736994426279">Saidil <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> olevad ründajad võivad proovida installida teie Maci ohtlikke programme, mis varastavad teie teavet või kustutavad selle (nt fotod, paroolid, sõnumid ja krediitkaarditeave). <ph name="BEGIN_LEARN_MORE_LINK" />Lisateave<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Tühjenda</translation>
 <translation id="6644283850729428850">See reegel on aegunud.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Mitte ükski}=1{1 saidilt (teid ei logita Google'i kontolt välja)}other{# saidilt (teid ei logita Google'i kontolt välja)}}</translation>
 <translation id="6657585470893396449">Parool</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index 30a77d1..66f5906 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">افزودن شماره کارت معتبر</translation>
 <translation id="6628463337424475685">جستجوی <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">‏شاید درحال‌حاضر مهاجم‌ها در <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> در تلاش باشند برنامه‌های خطرناکی در Mac شما نصب کنند که اطلاعاتتان (مانند عکس‌ها، گذرواژه‌ها، پیام‌ها و کارت‌های اعتباری) را به سرقت می‌برند یا حذف می‌کنند. <ph name="BEGIN_LEARN_MORE_LINK" />بیشتر بدانید<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">پاک کردن</translation>
 <translation id="6644283850729428850">این قانون قدیمی شده است.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{هیچ‌کدام}=1{‏از ۱ سایت (از سیستم حساب Google خود خارج نخواهید شد)}one{‏از # سایت (از سیستم حساب Google خود خارج نخواهید شد)}other{‏از # سایت (از سیستم حساب Google خود خارج نخواهید شد)}}</translation>
 <translation id="6657585470893396449">گذرواژه</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index a6d921d..cd497f4 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -812,6 +812,7 @@
 <translation id="6626291197371920147">Lisää kelvollinen kortin numero</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" />-haku</translation>
 <translation id="6630809736994426279">Sivustolle <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> hyökännyt taho voi yrittää asentaa Maciisi vaarallisia ohjelmia, jotka varastavat tai poistavat tietojasi, esimerkiksi kuvia, salasanoja, viestejä tai luottokorttitietoja. <ph name="BEGIN_LEARN_MORE_LINK" />Lisätietoja<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Tyhjennä</translation>
 <translation id="6644283850729428850">Tämä käytäntö on vanhentunut.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Ei mitään}=1{1 sivustolta (sinua ei kirjata ulos Google-tililtäsi)}other{# sivustolta (sinua ei kirjata ulos Google-tililtäsi)}}</translation>
 <translation id="6657585470893396449">Salasana</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 59354f5..e3f3b23 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Magdagdag ng wastong card number</translation>
 <translation id="6628463337424475685">Paghahanap ng <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Maaaring magtangka ang mga attacker na kasalukuyang nasa <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> na mag-install ng mga mapanganib na program sa iyong Mac na magnanakaw o magde-delete ng impormasyon mo (halimbawa, mga larawan, password, mensahe, at credit card). <ph name="BEGIN_LEARN_MORE_LINK" />Matuto pa<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">I-clear</translation>
 <translation id="6644283850729428850">Hindi na ginagamit ang patakarang ito.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Wala}=1{Mula sa 1 site (hindi ka masa-sign out sa iyong Google Account)}one{Mula sa # site (hindi ka masa-sign out sa iyong Google Account)}other{Mula sa # na site (hindi ka masa-sign out sa iyong Google Account)}}</translation>
 <translation id="6657585470893396449">Password</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index f11288c..a6bd08c 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Ajouter un numéro de carte valide</translation>
 <translation id="6628463337424475685">Recherche <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Des individus malveillants à l'œuvre sur le site <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> pourraient tenter d'installer des programmes dangereux sur votre Mac afin de récupérer ou de supprimer certaines informations (photos, mots de passe, messages ou numéros de carte de crédit, par exemple). <ph name="BEGIN_LEARN_MORE_LINK" />En savoir plus<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Effacer</translation>
 <translation id="6644283850729428850">Cette règle est obsolète.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Aucun}=1{De 1 site (vous ne serez pas déconnecté de votre compte Google)}one{De # site (vous ne serez pas déconnecté de votre compte Google)}other{De # sites (vous ne serez pas déconnecté de votre compte Google)}}</translation>
 <translation id="6657585470893396449">Mot de passe</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index 29d43c9..978d487 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -810,6 +810,7 @@
 <translation id="6626291197371920147">માન્ય કાર્ડ નંબર ઉમેરો</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> શોધ</translation>
 <translation id="6630809736994426279"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> પરના હુમલાખોરો કદાચ હાલમાં તમારા Mac પર જોખમી પ્રોગ્રામ ઇન્સ્ટૉલ કરવાનો પ્રયાસ કરે છે કે જે તમારી માહિતી (ઉદાહરણ તરીકે, ફોટો, પાસવર્ડ, સંદેશા અને ક્રેડિટ કાર્ડ) ચોરી અથવા કાઢી નાખી શકે છે. <ph name="BEGIN_LEARN_MORE_LINK" />વધુ જાણો<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">સાફ કરો</translation>
 <translation id="6644283850729428850">આ નીતિ દૂર કરવામાં આવેલી છે.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{કોઈ નહીં}=1{1 સાઇટમાંથી (તમે તમારા Google એકાઉન્ટમાંથી સાઇન આઉટ થશો નહીં)}one{# સાઇટમાંથી (તમે તમારા Google એકાઉન્ટમાંથી સાઇન આઉટ થશો નહીં)}other{# સાઇટમાંથી (તમે તમારા Google એકાઉન્ટમાંથી સાઇન આઉટ થશો નહીં)}}</translation>
 <translation id="6657585470893396449">પાસવર્ડ</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 87ef933..3757ec4f 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">मान्य कार्ड नंबर जोड़ें</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> खोज</translation>
 <translation id="6630809736994426279">इस समय <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> पर मौजूद हमलावर आपके Mac पर ऐसे खतरनाक प्रोग्राम इंस्टॉल करने की कोशिश कर सकते हैं जो आपकी जानकारी (उदाहरण के लिए, फ़ोटो, पासवर्ड, संदेश और क्रेडिट कार्ड) चुराते हैं या उसे हटा देते हैं. <ph name="BEGIN_LEARN_MORE_LINK" />अधिक जानें<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">साफ़ करें</translation>
 <translation id="6644283850729428850">यह नीति हटा दी गई है.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{कोई नहीं}=1{1 साइट से (आप अपने Google खाते से साइन आउट नहीं होंगे)}one{# साइटों से (आप अपने Google खाते से साइन आउट नहीं होंगे)}other{# साइटों से (आप अपने Google खाते से साइन आउट नहीं होंगे)}}</translation>
 <translation id="6657585470893396449">पासवर्ड</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index 086a2645..490bc5f 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -810,6 +810,7 @@
 <translation id="6626291197371920147">Dodajte važeći broj kartice</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Pretraživanje</translation>
 <translation id="6630809736994426279">Napadači koji su trenutačno na web-lokaciji <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> mogu pokušati instalirati opasne programe na vaš Mac radi krađe ili brisanja vaših podataka (na primjer fotografija, zaporki, poruka i brojeva kreditnih kartica). <ph name="BEGIN_LEARN_MORE_LINK" />Saznajte više<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Izbriši</translation>
 <translation id="6644283850729428850">Ovo je pravilo zastarjelo.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Nijedna}=1{S jedne web-lokacije (nećete se odjaviti s Google računa)}one{S # web-lokacije (nećete se odjaviti s Google računa)}few{S # web-lokacije (nećete se odjaviti s Google računa)}other{S # web-lokacija (nećete se odjaviti s Google računa)}}</translation>
 <translation id="6657585470893396449">Zaporka</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index 1e7e57f6..88d9c481 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -809,6 +809,7 @@
 <translation id="6626291197371920147">Adjon meg érvényes kártyaszámot</translation>
 <translation id="6628463337424475685">Keresés: <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Előfordulhat, hogy a(z) <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> webhely támadói olyan veszélyes programokat kísérelnek meg telepíteni az Ön Mac típusú számítógépére, amelyek ellopják vagy törlik adatait (például fotóit, jelszavait, üzeneteit és hitelkártyaadatait). <ph name="BEGIN_LEARN_MORE_LINK" />További információ<ph name="END_LEARN_MORE_LINK" />.</translation>
+<translation id="6643016212128521049">Törlés</translation>
 <translation id="6644283850729428850">Ez a házirend már elavult.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Nincs}=1{1 webhelyről (a böngésző nem jelentkezteti ki Google-fiókjából)}other{# webhelyről (a böngésző nem jelentkezteti ki Google-fiókjából)}}</translation>
 <translation id="6657585470893396449">Jelszó</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index 671e934..b144303 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Tambahkan kartu yang valid</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Penelusuran</translation>
 <translation id="6630809736994426279">Saat ini, penyerang di <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> mungkin berusaha menginstal program berbahaya di Mac Anda yang dapat mencuri atau menghapus informasi Anda (misalnya, foto, sandi, pesan, dan kartu kredit). <ph name="BEGIN_LEARN_MORE_LINK" />Pelajari lebih lanjut<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Hapus</translation>
 <translation id="6644283850729428850">Kebijakan ini telah usang.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Tidak ada}=1{Dari 1 situs (Anda tidak akan logout dari Akun Google)}other{Dari # situs (Anda tidak akan logout dari Akun Google)}}</translation>
 <translation id="6657585470893396449">Sandi</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index e6d2faf2..f5eedb8 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -807,6 +807,7 @@
 <translation id="6626291197371920147">Aggiungi un numero di carta valido</translation>
 <translation id="6628463337424475685">Ricerca <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Gli utenti malintenzionati attualmente presenti sul sito <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> potrebbero cercare di installare sul tuo Mac programmi pericolosi che carpiscono o eliminano le tue informazioni (ad esempio, foto, password, messaggi e carte di credito). <ph name="BEGIN_LEARN_MORE_LINK" />Ulteriori informazioni<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Cancella</translation>
 <translation id="6644283850729428850">Questa norma è obsoleta.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Nessuno}=1{Da 1 sito (non verrai scollegato dal tuo account Google)}other{Da # siti (non verrai scollegato dal tuo account Google)}}</translation>
 <translation id="6657585470893396449">Password</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index 6486021..8510a60 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -816,6 +816,7 @@
 <translation id="6626291197371920147">הוסף מספר כרטיס חוקי</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> חיפוש</translation>
 <translation id="6630809736994426279">‏תוקפים שנמצאים כרגע באתר <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> עלולים להתקין במחשב ה-MAC שלך תוכנות מסוכנות שגונבות מידע או מוחקות אותו (לדוגמה, תמונות, סיסמאות, הודעות וכרטיסי אשראי). <ph name="BEGIN_LEARN_MORE_LINK" />מידע נוסף<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">נקה</translation>
 <translation id="6644283850729428850">מדיניות זו אינה בתוקף.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{ללא}=1{‏מאתר אחד (לא תבוצע יציאה מחשבון Google שלך.)}two{‏מ-# אתרים (לא תבוצע יציאה מחשבון Google שלך.)}many{‏מ-# אתרים (לא תבוצע יציאה מחשבון Google שלך.)}other{‏מ-# אתרים (לא תבוצע יציאה מחשבון Google שלך.)}}</translation>
 <translation id="6657585470893396449">סיסמה</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index 43daeaa..556ffaf 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">有効なカード番号を追加</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> 検索</translation>
 <translation id="6630809736994426279"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> では現在、悪意のあるユーザーによって、お使いの Mac 上に危険なプログラム(写真、パスワード、メッセージ、クレジット カードなどの情報を盗んだり削除したりするプログラム)がインストールされる可能性があります。<ph name="BEGIN_LEARN_MORE_LINK" />詳細<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">クリア</translation>
 <translation id="6644283850729428850">このポリシーは廃止されました。</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{なし}=1{1 件のサイトから(Google アカウントへのログイン状態は維持されます)}other{# 件のサイトから(Google アカウントへのログイン状態は維持されます)}}</translation>
 <translation id="6657585470893396449">パスワード</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index 79588dc..5de3045 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -805,6 +805,7 @@
 <translation id="6626291197371920147">ಮಾನ್ಯವಾದ ಕಾರ್ಡ್ ಸಂಖ್ಯೆಯನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> ಹುಡುಕಾಟ</translation>
 <translation id="6630809736994426279"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ನ ದಾಳಿಕೋರರು ನಿಮ್ಮ Macನಲ್ಲಿ ಮಾಹಿತಿಯನ್ನು (ಉದಾಹರಣೆಗೆ, ಫೋಟೋಗಳು, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಮಾಹಿತಿಗಳು) ಕದಿಯಲು ಇಲ್ಲವೇ ಅಳಿಸಲು ಅಪಾಯಕಾರಿ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಸ್ಥಾಪಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರಬಹುದು. <ph name="BEGIN_LEARN_MORE_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">ತೆರವುಗೊಳಿಸಿ</translation>
 <translation id="6644283850729428850">ಈ ನೀತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{ಯಾವುದೂ ಇಲ್ಲ}=1{1 ಸೈಟ್‌‍ನಿಂದ (ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ನಿಮ್ಮನ್ನು ಸೈನ್ ಔಟ್ ಮಾಡುವುದಿಲ್ಲ)}one{# ಸೈಟ್‌ಗಳಿಂದ (ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ನಿಮ್ಮನ್ನು ಸೈನ್ ಔಟ್ ಮಾಡುವುದಿಲ್ಲ)}other{# ಸೈಟ್‌ಗಳಿಂದ (ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ನಿಮ್ಮನ್ನು ಸೈನ್ ಔಟ್ ಮಾಡುವುದಿಲ್ಲ)}}</translation>
 <translation id="6657585470893396449">ಪಾಸ್‌ವರ್ಡ್</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index 2881519c..36b0bfa 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">유효한 카드 번호 추가</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> 검색</translation>
 <translation id="6630809736994426279"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />의 공격자가 사용자 정보(예: 사진, 비밀번호, 메시지, 신용카드)를 도용하거나 삭제하는 위험한 프로그램을 Mac에 설치하려고 시도할 수 있습니다. <ph name="BEGIN_LEARN_MORE_LINK" />자세히 알아보기<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">삭제</translation>
 <translation id="6644283850729428850">이 정책은 사용되지 않습니다.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{없음}=1{사이트 1개(Google 계정에서 로그아웃되지 않음)}other{사이트 #개(Google 계정에서 로그아웃되지 않음)}}</translation>
 <translation id="6657585470893396449">비밀번호</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index 4067001..84df504 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -812,6 +812,7 @@
 <translation id="6626291197371920147">Galiojančios kortelės numerio pridėjimas</translation>
 <translation id="6628463337424475685">„<ph name="ENGINE" />“ paieška</translation>
 <translation id="6630809736994426279">Šiuo metu <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> užpuolikai gali jūsų „Mac“ įrenginyje bandyti įdiegti pavojingas programas, kurios vagia arba ištrina informaciją (pvz., nuotraukas, slaptažodžius, pranešimus ir kredito kortelių duomenis). <ph name="BEGIN_LEARN_MORE_LINK" />Sužinokite daugiau<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Išvalyti</translation>
 <translation id="6644283850729428850">Ši politika nepatvirtinta.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Nėra}=1{Iš 1 svetainės (nebūsite atjungti nuo „Google“ paskyros)}one{Iš # svetainės (nebūsite atjungti nuo „Google“ paskyros)}few{Iš # svetainių (nebūsite atjungti nuo „Google“ paskyros)}many{Iš # svetainės (nebūsite atjungti nuo „Google“ paskyros)}other{Iš # svetainių (nebūsite atjungti nuo „Google“ paskyros)}}</translation>
 <translation id="6657585470893396449">Slaptažodis</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index cf1d222..3c05e6b 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -810,6 +810,7 @@
 <translation id="6626291197371920147">Derīga kartes numura pievienošana</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> meklēšana</translation>
 <translation id="6630809736994426279">Uzbrucēji vietnē <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> var mēģināt jūsu Mac datorā instalēt bīstamas programmas, kas zog vai izdzēš informāciju (piemēram, fotoattēlus, paroles, ziņojumus un kredītkaršu datus). <ph name="BEGIN_LEARN_MORE_LINK" />Uzziniet vairāk<ph name="END_LEARN_MORE_LINK" />.</translation>
+<translation id="6643016212128521049">Notīrīt</translation>
 <translation id="6644283850729428850">Šī politika ir izbeigta.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Nav}=1{No 1 vietnes (jūs netiksiet izrakstīts no sava Google konta)}zero{No # vietnēm (jūs netiksiet izrakstīts no sava Google konta)}one{No # vietnes (jūs netiksiet izrakstīts no sava Google konta)}other{No # vietnēm (jūs netiksiet izrakstīts no sava Google konta)}}</translation>
 <translation id="6657585470893396449">Parole</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index c26ff42..a535039 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -809,6 +809,7 @@
 <translation id="6626291197371920147">ശരിയായ കാർഡ് നമ്പർ ചേർക്കുക</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> തിരയൽ</translation>
 <translation id="6630809736994426279"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> എന്ന സൈറ്റിലെ നിലവിലുള്ള ആക്രമികൾ നിങ്ങളുടെ വിവരങ്ങൾ ഇല്ലാതാക്കാനോ മോഷ്‌ടിക്കാനോ ഇടയുള്ള (ഉദാഹരണത്തിന്, ഫോട്ടോകൾ, പാസ്‌വേഡുകൾ, സന്ദേശങ്ങൾ, ക്രെഡിറ്റ് കാർഡുകൾ മുതലായവ) അപകടകരമായ പ്രോഗ്രാമുകൾ Mac-ൽ ഇൻസ്‌റ്റാളുചെയ്യാൻ ശ്രമിച്ചേക്കാം. <ph name="BEGIN_LEARN_MORE_LINK" />കൂടുതലറിയുക<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">മായ്‌ക്കുക</translation>
 <translation id="6644283850729428850">ഈ നയം ഒഴിവാക്കി.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{ഒന്നുമില്ല}=1{ഒരു സൈറ്റിൽ നിന്ന് (നിങ്ങൾ Google അക്കൗണ്ടിൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യപ്പെടില്ല)}other{# സൈറ്റുകളിൽ നിന്ന് (നിങ്ങൾ Google അക്കൗണ്ടിൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യപ്പെടില്ല)}}</translation>
 <translation id="6657585470893396449">പാസ്‌വേഡ്</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index 4c43ce7..5ce4b395 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -812,6 +812,7 @@
 <translation id="6626291197371920147">वैध कार्ड नंबर जोडा</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> शोध</translation>
 <translation id="6630809736994426279">सध्या <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> वर असलेले हल्लेखोर कदाचित तुमच्या मॅकमधील तुमची माहिती चोरू किंवा हटवू शकणारे धोकादायक प्रोग्राम (उदाहरणार्थ, फोटो, पासवर्ड, संदेश आणि क्रेडिट कार्डे) इंस्टॉल करण्याचा प्रयत्न करू शकतील. <ph name="BEGIN_LEARN_MORE_LINK" />आणखी जाणून घ्या<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">साफ करा</translation>
 <translation id="6644283850729428850">हे धोरण नापसंत आहे.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{काहीही नाही}=1{एका साइटवरून (तुम्हाला तुमच्या Google खात्यातून साइन आउट केले जाणार नाही)}one{# साइटवरून (तुम्हाला तुमच्या Google खात्यातून साइन आउट केले जाणार नाही)}other{# साइटवरून (तुम्हाला तुमच्या Google खात्यातून साइन आउट केले जाणार नाही)}}</translation>
 <translation id="6657585470893396449">पासवर्ड</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index 995377b..37d4830 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -812,6 +812,7 @@
 <translation id="6626291197371920147">Tambahkan nombor kad yang sah</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Carian</translation>
 <translation id="6630809736994426279">Penyerang yang sedang berada di <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> mungkin cuba memasang atur cara berbahaya pada komputer Mac anda. Atur cara tersebut boleh mencuri atau memadamkan maklumat anda (contohnya, foto, kata laluan, mesej dan kad kredit). <ph name="BEGIN_LEARN_MORE_LINK" />Ketahui lebih lanjut<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Kosongkan</translation>
 <translation id="6644283850729428850">Dasar ini telah dikecam.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Tiada}=1{Daripada 1 tapak (anda tidak akan dilog keluar daripada Akaun Google anda)}other{Daripada # tapak (anda tidak akan dilog keluar daripada Akaun Google anda)}}</translation>
 <translation id="6657585470893396449">Kata laluan</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index d44f534..a135042 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -806,6 +806,7 @@
 <translation id="6626291197371920147">Een geldig kaartnummer toevoegen</translation>
 <translation id="6628463337424475685">Zoeken via <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Cybercriminelen op <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> proberen mogelijk gevaarlijke programma's op je Mac te installeren waarmee je gegevens kunnen worden gestolen of verwijderd (bijvoorbeeld foto's, wachtwoorden, berichten en creditcardgegevens). <ph name="BEGIN_LEARN_MORE_LINK" />Meer informatie<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Wissen</translation>
 <translation id="6644283850729428850">Dit beleid is verouderd.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Geen}=1{Van 1 site (je wordt niet uitgelogd bij je Google-account)}other{Van # sites (je wordt niet uitgelogd bij je Google-account)}}</translation>
 <translation id="6657585470893396449">Wachtwoord</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index ca3a2d6..de91809f 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Legg til et gyldig kortnummer</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Søk</translation>
 <translation id="6630809736994426279">Angripere som for øyeblikket er på <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, kan prøve å installere farlige programmer på Macen du bruker, for å stjele eller slette informasjonen din (for eksempel bilder, passord, meldinger og kredittkortinformasjon). <ph name="BEGIN_LEARN_MORE_LINK" />Finn ut mer<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Tøm</translation>
 <translation id="6644283850729428850">Denne retningslinjen er foreldet.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Ingen}=1{Fra 1 nettsted (du blir ikke logget av Google-kontoen din)}other{Fra # nettsteder (du blir ikke logget av Google-kontoen din)}}</translation>
 <translation id="6657585470893396449">Passord</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index d35c2ed..1c028a2a 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Dodaj prawidłowy numer karty</translation>
 <translation id="6628463337424475685">Wyszukiwarka <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Osoby obecnie atakujące stronę <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> mogą próbować zainstalować na Twoim komputerze Mac niebezpieczne programy wykradające lub usuwające informacje (na przykład zdjęcia, hasła, wiadomości lub dane kart kredytowych). <ph name="BEGIN_LEARN_MORE_LINK" />Więcej informacji<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Wyczyść</translation>
 <translation id="6644283850729428850">Zasada jest przestarzała.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Brak}=1{Z 1 witryny (nie spowoduje to wylogowania z konta Google)}few{Z # witryn (nie spowoduje to wylogowania z konta Google)}many{Z # witryn (nie spowoduje to wylogowania z konta Google)}other{Z # witryny (nie spowoduje to wylogowania z konta Google)}}</translation>
 <translation id="6657585470893396449">Hasło</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index dc5eb856..f3d66a1 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Adicionar número de cartão de crédito válido</translation>
 <translation id="6628463337424475685">Pesquisa do <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Invasores presentes no momento em <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> podem tentar instalar programas perigosos no seu Mac e roubar ou excluir suas informações (por exemplo, fotos, senhas, mensagens e cartões de crédito). <ph name="BEGIN_LEARN_MORE_LINK" />Saiba mais<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Limpar</translation>
 <translation id="6644283850729428850">Esta política foi encerrada.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Nenhum}=1{Em 1 site (você não será desconectado da sua Conta do Google)}one{Em # site (você não será desconectado da sua Conta do Google)}other{Em # sites (você não será desconectado da sua Conta do Google)}}</translation>
 <translation id="6657585470893396449">Senha</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index 6ce4982..69cc207 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Adicionar número de cartão válido</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Pesquisar</translation>
 <translation id="6630809736994426279">Os atacantes atualmente em <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> podem tentar instalar programas perigosos no seu Mac que roubam ou eliminam as suas informações (por exemplo, fotos, palavras-passe, mensagens e cartões de crédito). <ph name="BEGIN_LEARN_MORE_LINK" />Saiba mais<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Limpar</translation>
 <translation id="6644283850729428850">Esta política está obsoleta.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Nenhum}=1{De 1 site (a sessão na sua Conta Google não é terminada).}other{De # sites (a sessão na sua Conta Google não é terminada).}}</translation>
 <translation id="6657585470893396449">Palavra-passe</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index d1ae663..4188adf4 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Adaugă un număr de card valid</translation>
 <translation id="6628463337424475685">Căutare <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Atacatorii de pe <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> pot încerca să instaleze programe periculoase pe computerul tău Mac, care să îți fure sau să îți șteargă informațiile (de exemplu, fotografii, parole, mesaje sau date despre cardurile de credit). <ph name="BEGIN_LEARN_MORE_LINK" />Află mai multe<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Ștergeți</translation>
 <translation id="6644283850729428850">Această politică este învechită.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Niciunul}=1{De pe un site (nu te va deconecta de la Contul Google)}few{De pe # site-uri (nu te va deconecta de la Contul Google)}other{De pe # de site-uri (nu te va deconecta de la Contul Google)}}</translation>
 <translation id="6657585470893396449">Parolă</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index a3a82594..b5feac4 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -810,6 +810,7 @@
 <translation id="6626291197371920147">Введите номер действующей карты</translation>
 <translation id="6628463337424475685">Поиск <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Сайт <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> может установить на ваш компьютер Mac вредоносное ПО, которое крадет или удаляет личную информацию (например, фотографии, пароли, сообщения и реквизиты банковских карт). <ph name="BEGIN_LEARN_MORE_LINK" />Подробнее…<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Очистить</translation>
 <translation id="6644283850729428850">Правило устарело.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Нет}=1{С 1 сайта (вы останетесь в аккаунте Google)}one{С # сайта (вы останетесь в аккаунте Google)}few{С # сайтов (вы останетесь в аккаунте Google)}many{С # сайтов (вы останетесь в аккаунте Google)}other{С # сайта (вы останетесь в аккаунте Google)}}</translation>
 <translation id="6657585470893396449">Пароль</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index 4c0f8b0..1df07bef 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -806,6 +806,7 @@
 <translation id="6626291197371920147">Pridanie platného čísla karty</translation>
 <translation id="6628463337424475685">Vyhľadávanie <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Útočníci na webe <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> sa môžu pokúsiť vo vašom počítači Mac nainštalovať nebezpečné programy, pomocou ktorých ukradnú alebo odstránia informácie (napríklad fotky, heslá, správy a kreditné karty). <ph name="BEGIN_LEARN_MORE_LINK" />Ďalšie informácie<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Vymazať</translation>
 <translation id="6644283850729428850">Toto pravidlo bolo označené ako zastarané.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Žiadne}=1{Z 1 webu (neodhlásime vás z účtu Google)}few{Z # webov (neodhlásime vás z účtu Google)}many{From # sites (you won't be signed out of your Google Account)}other{Z # webov (neodhlásime vás z účtu Google)}}</translation>
 <translation id="6657585470893396449">Heslo</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index 170fc0f..667edab 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Dodajanje veljavne številke kartice</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Iskanje</translation>
 <translation id="6630809736994426279">Napadalci, ki so trenutno na spletnem mestu <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, lahko poskusijo v vašem računalniku Mac namestiti nevarne programe, ki kradejo ali brišejo podatke (na primer fotografije, gesla, sporočila in podatke kreditnih kartic). <ph name="BEGIN_LEARN_MORE_LINK" />Več o tem<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Počisti</translation>
 <translation id="6644283850729428850">Ta pravilnik je zastarel.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Nič}=1{Na 1 spletnem mestu (iz Google Računa ne boste odjavljeni)}one{Na # spletnem mestu (iz Google Računa ne boste odjavljeni)}two{Na # spletnih mestih (iz Google Računa ne boste odjavljeni)}few{Na # spletnih mestih (iz Google Računa ne boste odjavljeni)}other{Na # spletnih mestih (iz Google Računa ne boste odjavljeni)}}</translation>
 <translation id="6657585470893396449">Geslo</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index ecb83050..75d6a087 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -810,6 +810,7 @@
 <translation id="6626291197371920147">Додајте важећи број картице</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> претрага</translation>
 <translation id="6630809736994426279">Нападачи који су тренутно на <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ће можда покушати да инсталирају опасне програме на Mac-у који краду или бришу податке (на пример, слике, лозинке, поруке и бројеве кредитних картица). <ph name="BEGIN_LEARN_MORE_LINK" />Сазнајте више<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Обриши</translation>
 <translation id="6644283850729428850">Ове смернице су застареле.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{None}=1{Са 1 сајта (нећемо вас одјавити са Google налога)}one{Са # сајта (нећемо вас одјавити са Google налога)}few{Са # сајта (нећемо вас одјавити са Google налога)}other{Са # сајтова (нећемо вас одјавити са Google налога)}}</translation>
 <translation id="6657585470893396449">Лозинка</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index 9239d62..3bcdcbf 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Lägg till ett giltigt kortnummer</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Sök</translation>
 <translation id="6630809736994426279">Angripare på <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> kan försöka installera skadliga program som stjäl eller raderar information (t.ex. foton, lösenord, meddelanden och kreditkortsuppgifter) på din Mac. <ph name="BEGIN_LEARN_MORE_LINK" />Läs mer<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Rensa</translation>
 <translation id="6644283850729428850">Policyn är föråldrad.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Ingen}=1{Från 1 webbplats (du loggas inte ut från Google-kontot)}other{Från # webbplatser (du loggas inte ut från Google-kontot)}}</translation>
 <translation id="6657585470893396449">Lösenord</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb
index 08e152e..88e8a27 100644
--- a/components/strings/components_strings_sw.xtb
+++ b/components/strings/components_strings_sw.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Ongeza nambari sahihi ya kadi</translation>
 <translation id="6628463337424475685">Utafutaji wa <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Wavamizi ambao sasa wako kwenye <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> huenda wakajaribu kusakinisha programu hatari kwenye Mac yako ambazo zinaiba au kufuta maelezo yako (kwa mfano, picha, manenosiri, ujumbe na kadi za mikopo). <ph name="BEGIN_LEARN_MORE_LINK" />Pata maelezo zaidi<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Futa</translation>
 <translation id="6644283850729428850">Sera hii imepingwa.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Hamna}=1{Kutoka tovuti 1 (hutaondolewa kwenye Akaunti ya Google)}other{Kutoka tovuti # (hutaondolewa kwenye Akaunti ya Google)}}</translation>
 <translation id="6657585470893396449">Nenosiri</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index 87bd47f..749347d 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -807,6 +807,7 @@
 <translation id="6626291197371920147">சரியான கார்டு எண்ணைச் சேர்க்கவும்</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> தேடல்</translation>
 <translation id="6630809736994426279"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> தளத்தில் தற்போதுள்ள ஹேக்கர்கள் உங்கள் தனிப்பட்ட தகவலை (எடுத்துக்காட்டாக, படங்கள், கடவுச்சொற்கள், செய்திகள் மற்றும் கிரெடிட் கார்டுகள்) திருடக்கூடிய அல்லது நீக்கக்கூடிய ஆபத்தான நிரல்களை உங்கள் Mac இல் நிறுவ முயற்சிக்கக்கூடும். <ph name="BEGIN_LEARN_MORE_LINK" />மேலும் அறிக<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">அழி</translation>
 <translation id="6644283850729428850">இந்தக் கொள்கை தவிர்க்கப்பட்டது.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{எதுவுமில்லை}=1{1 தளத்திலிருந்து (உங்கள் Google கணக்கிலிருந்து வெளியேறமாட்டீர்கள்)}other{# தளங்களிலிருந்து (உங்கள் Google கணக்கிலிருந்து வெளியேறமாட்டீர்கள்)}}</translation>
 <translation id="6657585470893396449">கடவுச்சொல்</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index 03c7dfc..3b18663 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -810,6 +810,7 @@
 <translation id="6626291197371920147">చెల్లుబాటయ్యే కార్డ్ నంబర్‌ను జోడించండి</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> శోధన</translation>
 <translation id="6630809736994426279"><ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />లో హ్యాకర్‌లు మీ సమాచారాన్ని (ఉదాహరణకు, ఫోటోలు, పాస్‌వర్డ్‌లు, సందేశాలు మరియు క్రెడిట్ కార్డ్‌లు) దొంగిలించగల లేదా తొలగించగల హానికరమైన ప్రోగ్రామ్‌లను మీ Macలో ఇన్‌స్టాల్ చేయడానికి ప్రయత్నించవచ్చు. <ph name="BEGIN_LEARN_MORE_LINK" />మరింత తెలుసుకోండి<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">క్లియర్ చేయి</translation>
 <translation id="6644283850729428850">ఈ విధానం విలువ తగ్గించబడింది.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{ఏమీ లేవు}=1{1 సైట్ నుండి (మీరు మీ Google ఖాతా నుండి సైన్ అవుట్ చేయబడరు)}other{# సైట్‌ల నుండి (మీరు మీ Google ఖాతా నుండి సైన్ అవుట్ చేయబడరు)}}</translation>
 <translation id="6657585470893396449">పాస్‌వర్డ్</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index c3adf9d..6e62f03 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">เพิ่มหมายเลขบัตรที่ถูกต้อง</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> ค้นหา</translation>
 <translation id="6630809736994426279">ผู้โจมตีที่กำลังอยู่ใน <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> อาจพยายามติดตั้งโปรแกรมอันตรายลงในเครื่อง Mac ของคุณ เพื่อขโมยหรือลบข้อมูล (ตัวอย่างเช่น รูปภาพ รหัสผ่าน ข้อความ และบัตรเครดิต) <ph name="BEGIN_LEARN_MORE_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">ล้าง</translation>
 <translation id="6644283850729428850">นโยบายนี้ถูกยกเลิกแล้ว</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{ไม่มี}=1{จาก 1 เว็บไซต์ (คุณจะไม่ออกจากระบบบัญชี Google)}other{จาก # เว็บไซต์ (คุณจะไม่ออกจากระบบบัญชี Google)}}</translation>
 <translation id="6657585470893396449">รหัสผ่าน</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index e9f11e85..de8dddc 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Geçerli kart numarası ekle</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> Arama</translation>
 <translation id="6630809736994426279">Şu anda <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> sitesindeki saldırganlar bilgilerinizi (örneğin, fotoğraflar, şifreler, mesajlar ve kredi kartları) çalabilecek veya silebilecek tehlikeli programları Mac'inize yüklemeye çalışabilir. <ph name="BEGIN_LEARN_MORE_LINK" />Daha fazla bilgi<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Temizle</translation>
 <translation id="6644283850729428850">Bu politika uygun bulunmadı.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Yok}=1{1 siteden (Google Hesabınızdan çıkış yapılmaz)}other{# siteden (Google Hesabınızdan çıkış yapılmaz)}}</translation>
 <translation id="6657585470893396449">Şifre</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index 01c22a8..e9fc3d17 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Додати дійсний номер картки</translation>
 <translation id="6628463337424475685">Пошук <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Зловмисники на сайті <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> можуть установити на ваш комп’ютер Mac небезпечні програми, що викрадають або видаляють інформацію (як-от фотографії, паролі, повідомлення та дані кредитних карток). <ph name="BEGIN_LEARN_MORE_LINK" />Докладніше<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Очистити</translation>
 <translation id="6644283850729428850">Це правило більше не використовується.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Немає}=1{З 1 сайту (ви не вийдете з облікового запису Google)}one{З # сайту (ви не вийдете з облікового запису Google)}few{З # сайтів (ви не вийдете з облікового запису Google)}many{З # сайтів (ви не вийдете з облікового запису Google)}other{З # сайту (ви не вийдете з облікового запису Google)}}</translation>
 <translation id="6657585470893396449">Пароль</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index 5c3190a..03b6346 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">Thêm số thẻ hợp lệ</translation>
 <translation id="6628463337424475685">Tìm kiếm trên <ph name="ENGINE" /></translation>
 <translation id="6630809736994426279">Những kẻ tấn công hiện ở trên <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> có thể cố gắng cài đặt các chương trình nguy hiểm vào máy Mac của bạn. Các chương trình này sẽ đánh cắp hoặc xóa thông tin của bạn (ví dụ: ảnh, mật khẩu, thư và thẻ tín dụng). <ph name="BEGIN_LEARN_MORE_LINK" />Tìm hiểu thêm<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">Xóa</translation>
 <translation id="6644283850729428850">Chính sách này không được chấp thuận.</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{Không có trang web nào}=1{Từ 1 trang web (bạn sẽ không bị đăng xuất khỏi Tài khoản Google của mình)}other{Từ # trang web (bạn sẽ không bị đăng xuất khỏi Tài khoản Google của mình)}}</translation>
 <translation id="6657585470893396449">Mật khẩu</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index 5c87861f..1478e352 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -807,6 +807,7 @@
 <translation id="6626291197371920147">添加有效的卡号</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> 搜索</translation>
 <translation id="6630809736994426279">攻击者可能会试图通过 <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> 在您的 Mac 上安装危险程序,以窃取或删除您的信息(如照片、密码、通讯内容和信用卡信息)。<ph name="BEGIN_LEARN_MORE_LINK" />了解详情<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">清除</translation>
 <translation id="6644283850729428850">此政策已弃用。</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{无}=1{来自 1 个网站(这不会致使您退出自己的 Google 帐号)}other{来自 # 个网站(这不会致使您退出自己的 Google 帐号)}}</translation>
 <translation id="6657585470893396449">密码</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 300bc96..870cf71 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -811,6 +811,7 @@
 <translation id="6626291197371920147">新增有效的信用卡號碼</translation>
 <translation id="6628463337424475685"><ph name="ENGINE" /> 搜尋</translation>
 <translation id="6630809736994426279">攻擊者目前可能會試圖透過 <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> 在你的 Mac 上安裝危險程式,藉此竊取或刪除你的資訊 (例如相片、密碼、郵件和信用卡資料)。<ph name="BEGIN_LEARN_MORE_LINK" />瞭解詳情<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="6643016212128521049">清除</translation>
 <translation id="6644283850729428850">這項政策已遭取代。</translation>
 <translation id="6646269444027925224">{COUNT,plural, =0{無}=1{1 個網站 (你不會因此登出 Google 帳戶)}other{# 個網站 (你不會因此登出 Google 帳戶)}}</translation>
 <translation id="6657585470893396449">密碼</translation>
diff --git a/components/sync/protocol/autofill_specifics.proto b/components/sync/protocol/autofill_specifics.proto
index 5e88a828..b088254 100644
--- a/components/sync/protocol/autofill_specifics.proto
+++ b/components/sync/protocol/autofill_specifics.proto
@@ -56,6 +56,10 @@
   // the Autofill address. For more info please refer to autofill_profile.h.
   optional int64 validity_state_bitfield = 24;
 
+  // Denotes whether the validity_state_bitfield is updated according to the
+  // changes in the autofill profile values.
+  optional bool is_client_validity_states_updated = 25;
+
   // Deprecated.
   optional string label = 1 [deprecated = true];
   optional string phone_fax_whole_number = 14 [deprecated = true];
diff --git a/components/ui_devtools/devtools_server.cc b/components/ui_devtools/devtools_server.cc
index ba5d9f3..02affb66 100644
--- a/components/ui_devtools/devtools_server.cc
+++ b/components/ui_devtools/devtools_server.cc
@@ -23,7 +23,7 @@
 
 namespace {
 const char kChromeDeveloperToolsPrefix[] =
-    "chrome-devtools://devtools/bundled/inspector.html?ws=";
+    "chrome-devtools://devtools/bundled/devtools_app.html?ws=";
 
 bool IsDevToolsEnabled(const char* enable_devtools_flag) {
   return base::CommandLine::ForCurrentProcess()->HasSwitch(
diff --git a/components/ukm/observers/sync_disable_observer.cc b/components/ukm/observers/sync_disable_observer.cc
index 824463a..beb5dac7 100644
--- a/components/ukm/observers/sync_disable_observer.cc
+++ b/components/ukm/observers/sync_disable_observer.cc
@@ -4,25 +4,16 @@
 
 #include "components/ukm/observers/sync_disable_observer.h"
 
-#include <memory>
-#include <utility>
-
 #include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
 #include "components/sync/driver/sync_token_status.h"
 #include "components/sync/engine/connection_status.h"
-#include "components/unified_consent/feature.h"
-#include "components/unified_consent/url_keyed_data_collection_consent_helper.h"
-
-using unified_consent::UrlKeyedDataCollectionConsentHelper;
 
 namespace ukm {
 
 const base::Feature kUkmCheckAuthErrorFeature{"UkmCheckAuthError",
                                               base::FEATURE_ENABLED_BY_DEFAULT};
-const base::Feature kUkmPurgingOnConnection{"UkmPurgingOnConnection",
-                                            base::FEATURE_DISABLED_BY_DEFAULT};
 
 namespace {
 
@@ -43,7 +34,6 @@
   DISABLED_BY_HISTORY_CONNECTED_PASSPHRASE,
   DISABLED_BY_INITIALIZED_CONNECTED_PASSPHRASE,
   DISABLED_BY_HISTORY_INITIALIZED_CONNECTED_PASSPHRASE,
-  DISABLED_BY_ANONYMIZED_DATA_COLLECTION,
   MAX_DISABLE_INFO
 };
 
@@ -53,30 +43,16 @@
 
 }  // namespace
 
-SyncDisableObserver::SyncDisableObserver() : sync_observer_(this) {}
+SyncDisableObserver::SyncDisableObserver()
+    : sync_observer_(this),
+      all_histories_enabled_(false),
+      all_extensions_enabled_(false) {}
 
-SyncDisableObserver::~SyncDisableObserver() {
-  for (const auto& entry : consent_helpers_) {
-    entry.second->RemoveObserver(this);
-  }
-}
-
-bool SyncDisableObserver::SyncState::AllowsUkm() const {
-  if (anonymized_data_collection_state == DataCollectionState::kIgnored)
-    return history_enabled && initialized && connected && !passphrase_protected;
-  else
-    return anonymized_data_collection_state == DataCollectionState::kEnabled;
-}
-
-bool SyncDisableObserver::SyncState::AllowsUkmWithExtension() const {
-  return AllowsUkm() && extensions_enabled && initialized && connected &&
-         !passphrase_protected;
-}
+SyncDisableObserver::~SyncDisableObserver() {}
 
 // static
 SyncDisableObserver::SyncState SyncDisableObserver::GetSyncState(
-    syncer::SyncService* sync_service,
-    UrlKeyedDataCollectionConsentHelper* consent_helper) {
+    syncer::SyncService* sync_service) {
   syncer::SyncTokenStatus status = sync_service->GetSyncTokenStatus();
   SyncState state;
   state.history_enabled = sync_service->GetPreferredDataTypes().Has(
@@ -88,45 +64,27 @@
                     status.connection_status == syncer::CONNECTION_OK;
   state.passphrase_protected =
       state.initialized && sync_service->IsUsingSecondaryPassphrase();
-  if (consent_helper) {
-    state.anonymized_data_collection_state =
-        consent_helper->IsEnabled() ? DataCollectionState::kEnabled
-                                    : DataCollectionState::kDisabled;
-  }
   return state;
 }
 
 void SyncDisableObserver::ObserveServiceForSyncDisables(
     syncer::SyncService* sync_service,
-    PrefService* prefs) {
-  std::unique_ptr<UrlKeyedDataCollectionConsentHelper> consent_helper;
-  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
-    consent_helper = UrlKeyedDataCollectionConsentHelper::
-        NewAnonymizedDataCollectionConsentHelper(prefs, sync_service);
-  }
-
-  SyncState state = GetSyncState(sync_service, consent_helper.get());
-  previous_states_[sync_service] = state;
-
-  if (consent_helper) {
-    consent_helper->AddObserver(this);
-    consent_helpers_[sync_service] = std::move(consent_helper);
-  }
+    PrefService* pref_service) {
+  previous_states_[sync_service] = GetSyncState(sync_service);
   sync_observer_.Add(sync_service);
   UpdateAllProfileEnabled(false);
 }
 
 void SyncDisableObserver::UpdateAllProfileEnabled(bool must_purge) {
-  bool all_sync_states_allow_ukm = CheckSyncStateOnAllProfiles();
-  bool all_sync_states_allow_extension_ukm =
-      all_sync_states_allow_ukm && CheckSyncStateForExtensionsOnAllProfiles();
+  bool all_enabled = CheckSyncStateOnAllProfiles();
+  bool all_extensions_enabled =
+      all_enabled && CheckSyncStateForExtensionsOnAllProfiles();
   // Any change in sync settings needs to call OnSyncPrefsChanged so that the
   // new settings take effect.
-  if (must_purge || (all_sync_states_allow_ukm != all_sync_states_allow_ukm_) ||
-      (all_sync_states_allow_extension_ukm !=
-       all_sync_states_allow_extension_ukm_)) {
-    all_sync_states_allow_ukm_ = all_sync_states_allow_ukm;
-    all_sync_states_allow_extension_ukm_ = all_sync_states_allow_extension_ukm;
+  if (must_purge || (all_enabled != all_histories_enabled_) ||
+      (all_extensions_enabled != all_extensions_enabled_)) {
+    all_histories_enabled_ = all_enabled;
+    all_extensions_enabled_ = all_extensions_enabled;
     OnSyncPrefsChanged(must_purge);
   }
 }
@@ -136,23 +94,17 @@
     return false;
   for (const auto& kv : previous_states_) {
     const SyncDisableObserver::SyncState& state = kv.second;
-    if (!state.AllowsUkm()) {
+    if (!state.history_enabled || !state.initialized || !state.connected ||
+        state.passphrase_protected) {
       int disabled_by = 0;
-      if (state.anonymized_data_collection_state ==
-          DataCollectionState::kIgnored) {
-        if (!state.history_enabled)
-          disabled_by |= 1 << 0;
-        if (!state.initialized)
-          disabled_by |= 1 << 1;
-        if (!state.connected)
-          disabled_by |= 1 << 2;
-        if (state.passphrase_protected)
-          disabled_by |= 1 << 3;
-      } else {
-        DCHECK_EQ(DataCollectionState::kDisabled,
-                  state.anonymized_data_collection_state);
-        disabled_by |= 1 << 4;
-      }
+      if (!state.history_enabled)
+        disabled_by |= 1 << 0;
+      if (!state.initialized)
+        disabled_by |= 1 << 1;
+      if (!state.connected)
+        disabled_by |= 1 << 2;
+      if (state.passphrase_protected)
+        disabled_by |= 1 << 3;
       RecordDisableInfo(DisableInfo(disabled_by));
       return false;
     }
@@ -173,87 +125,36 @@
 }
 
 void SyncDisableObserver::OnStateChanged(syncer::SyncService* sync) {
-  UrlKeyedDataCollectionConsentHelper* consent_helper = nullptr;
-  auto found = consent_helpers_.find(sync);
-  if (found != consent_helpers_.end())
-    consent_helper = found->second.get();
-  UpdateSyncState(sync, consent_helper);
-}
-
-void SyncDisableObserver::OnUrlKeyedDataCollectionConsentStateChanged(
-    unified_consent::UrlKeyedDataCollectionConsentHelper* consent_helper) {
-  DCHECK(consent_helper);
-  syncer::SyncService* sync_service = nullptr;
-  for (const auto& entry : consent_helpers_) {
-    if (consent_helper == entry.second.get()) {
-      sync_service = entry.first;
-      break;
-    }
-  }
-  DCHECK(sync_service);
-  UpdateSyncState(sync_service, consent_helper);
-}
-
-void SyncDisableObserver::UpdateSyncState(
-    syncer::SyncService* sync,
-    UrlKeyedDataCollectionConsentHelper* consent_helper) {
   DCHECK(base::ContainsKey(previous_states_, sync));
+  SyncDisableObserver::SyncState state = GetSyncState(sync);
   const SyncDisableObserver::SyncState& previous_state = previous_states_[sync];
-  DCHECK(previous_state.anonymized_data_collection_state ==
-             DataCollectionState::kIgnored ||
-         consent_helper);
-  SyncDisableObserver::SyncState state = GetSyncState(sync, consent_helper);
-
-  // Trigger a purge if sync state no longer allows UKM.
-  // TODO(rkaplow): Clean this up once crbug.com/891777 is resolved.
-  bool must_purge;
-
-  // If unified_consent is used, we keep the logic introduced in
-  // http://crrev.com/c/1152744. Otherwise, if the kUkmPurgingOnConnection
-  // feature is enabled, we still use that logic.
-  if (unified_consent::IsUnifiedConsentFeatureEnabled() ||
-      base::FeatureList::IsEnabled(kUkmPurgingOnConnection)) {
-    // Purge using AllowsUkm which includes connected status.
-    must_purge = previous_state.AllowsUkm() && !state.AllowsUkm();
-  } else {
-    // Use the previous logic to investigate crbug.com/891777.
-    must_purge =
-        // Trigger a purge if history sync was disabled.
-        (previous_state.history_enabled && !state.history_enabled) ||
-        // Trigger a purge if engine has become disabled.
-        (previous_state.initialized && !state.initialized) ||
-        // Trigger a purge if the user added a passphrase.  Since we can't
-        // detect the use of a passphrase while the engine is not initialized,
-        // we may miss the transition if the user adds a passphrase in this
-        // state.
-        (previous_state.initialized && state.initialized &&
-         !previous_state.passphrase_protected && state.passphrase_protected);
-  }
-
-  UMA_HISTOGRAM_BOOLEAN("UKM.SyncDisable.Purge", must_purge);
-
+  bool must_purge =
+      // Trigger a purge if history sync was disabled.
+      (previous_state.history_enabled && !state.history_enabled) ||
+      // Trigger a purge if engine has become disabled.
+      (previous_state.initialized && !state.initialized) ||
+      // Trigger a purge if the user added a passphrase.  Since we can't detect
+      // the use of a passphrase while the engine is not initialized, we may
+      // miss the transition if the user adds a passphrase in this state.
+      (previous_state.initialized && state.initialized &&
+       !previous_state.passphrase_protected && state.passphrase_protected);
   previous_states_[sync] = state;
   UpdateAllProfileEnabled(must_purge);
 }
 
 void SyncDisableObserver::OnSyncShutdown(syncer::SyncService* sync) {
   DCHECK(base::ContainsKey(previous_states_, sync));
-  auto found = consent_helpers_.find(sync);
-  if (found != consent_helpers_.end()) {
-    found->second->RemoveObserver(this);
-    consent_helpers_.erase(found);
-  }
   sync_observer_.Remove(sync);
   previous_states_.erase(sync);
   UpdateAllProfileEnabled(false);
 }
 
 bool SyncDisableObserver::SyncStateAllowsUkm() {
-  return all_sync_states_allow_ukm_;
+  return all_histories_enabled_;
 }
 
 bool SyncDisableObserver::SyncStateAllowsExtensionUkm() {
-  return all_sync_states_allow_extension_ukm_;
+  return all_extensions_enabled_;
 }
 
 }  // namespace ukm
diff --git a/components/ukm/observers/sync_disable_observer.h b/components/ukm/observers/sync_disable_observer.h
index e70f25a..2b89842 100644
--- a/components/ukm/observers/sync_disable_observer.h
+++ b/components/ukm/observers/sync_disable_observer.h
@@ -10,22 +10,16 @@
 #include "base/scoped_observer.h"
 #include "components/sync/driver/sync_service.h"
 #include "components/sync/driver/sync_service_observer.h"
-#include "components/unified_consent/url_keyed_data_collection_consent_helper.h"
 
 class PrefService;
 
 namespace ukm {
 
-// Observer that monitors whether UKM is allowed for all profiles.
-//
-// For one profile, UKM is allowed under the following conditions:
-// * If unified consent is disabled, then UKM is allowed for the profile iff
-//   sync history is active;
-// * If unified consent is enabled, then UKM is allowed for the profile iff
-//   URL-keyed anonymized data collectiion is enabled.
-class SyncDisableObserver
-    : public syncer::SyncServiceObserver,
-      public unified_consent::UrlKeyedDataCollectionConsentHelper::Observer {
+// Observes the state of a set of SyncServices for changes to history sync
+// preferences.  This is for used to trigger purging of local state when
+// sync is disabled on a profile and disabling recording when any non-syncing
+// profiles are active.
+class SyncDisableObserver : public syncer::SyncServiceObserver {
  public:
   SyncDisableObserver();
   ~SyncDisableObserver() override;
@@ -34,13 +28,10 @@
   void ObserveServiceForSyncDisables(syncer::SyncService* sync_service,
                                      PrefService* pref_service);
 
-  // Returns true iff all sync states alllow UKM to be enabled. This means that
-  // for all profiles:
-  // * If unified consent is disabled, then sync is initialized, connected, has
-  //   the HISTORY_DELETE_DIRECTIVES data type enabled, and does not have a
-  //   secondary passphrase enabled.
-  // * If unified consent is enabled, then URL-keyed anonymized data collection
-  //   is enabled for that profile.
+  // Returns true iff sync is in a state that allows UKM to be enabled.
+  // This means that for all profiles, sync is initialized, connected, has the
+  // HISTORY_DELETE_DIRECTIVES data type enabled, and does not have a secondary
+  // passphrase enabled.
   virtual bool SyncStateAllowsUkm();
 
   // Returns true iff sync is in a state that allows UKM to capture extensions.
@@ -58,11 +49,6 @@
   void OnStateChanged(syncer::SyncService* sync) override;
   void OnSyncShutdown(syncer::SyncService* sync) override;
 
-  // unified_consent::UrlKeyedDataCollectionConsentHelper::Observer:
-  void OnUrlKeyedDataCollectionConsentStateChanged(
-      unified_consent::UrlKeyedDataCollectionConsentHelper* consent_helper)
-      override;
-
   // Recomputes all_profiles_enabled_ state from previous_states_;
   void UpdateAllProfileEnabled(bool must_purge);
 
@@ -78,29 +64,8 @@
   ScopedObserver<syncer::SyncService, syncer::SyncServiceObserver>
       sync_observer_;
 
-  enum class DataCollectionState {
-    // Matches the case when unified consent feature is disabled
-    kIgnored,
-    // Unified consent feature is enabled and the user has disabled URL-keyed
-    // anonymized data collection.
-    kDisabled,
-    // Unified consent feature is enabled and the user has enabled URL-keyed
-    // anonymized data collection.
-    kEnabled
-  };
-
   // State data about sync services that we need to remember.
   struct SyncState {
-    // Returns true if this sync state allows UKM:
-    // * If unified consent is disabled, then sync is initialized, connected,
-    //   has history data type enabled, and does not have a secondary passphrase
-    //   enabled.
-    // * If unified consent is enabled, then URL-keyed anonymized data
-    //   collection is enabled.
-    bool AllowsUkm() const;
-    // Returns true if |AllowUkm| and if sync extensions are enabled.
-    bool AllowsUkmWithExtension() const;
-
     // If the user has history sync enabled.
     bool history_enabled = false;
     // If the user has extension sync enabled.
@@ -112,45 +77,21 @@
     // Whether user data is hidden by a secondary passphrase.
     // This is not valid if the state is not initialized.
     bool passphrase_protected = false;
-
-    // Whether anonymized data collection is enabled.
-    // Note: This is not managed by sync service. It was added in this enum
-    // for convenience.
-    DataCollectionState anonymized_data_collection_state =
-        DataCollectionState::kIgnored;
   };
 
-  // Updates the sync state for |sync| service. Updates all profiles if needed.
-  void UpdateSyncState(
-      syncer::SyncService* sync,
-      unified_consent::UrlKeyedDataCollectionConsentHelper* consent_helper);
-
   // Gets the current state of a SyncService.
-  // A non-null |consent_helper| implies that Unified Consent is enabled.
-  static SyncState GetSyncState(
-      syncer::SyncService* sync,
-      unified_consent::UrlKeyedDataCollectionConsentHelper* consent_helper);
+  static SyncState GetSyncState(syncer::SyncService* sync);
 
-  // The state of the sync services being observed.
+  // The list of services that had sync enabled when we last checked.
   std::map<syncer::SyncService*, SyncState> previous_states_;
 
-  // The list of URL-keyed anonymized data collection consent helpers.
-  //
-  // Note: UrlKeyedDataCollectionConsentHelper do not rely on sync when
-  // unified consent feature is enabled but there must be exactly one per
-  // Chromium profile. As there is a single sync service per profile, it is safe
-  // to key them by sync service instead of introducing an additional map.
-  std::map<
-      syncer::SyncService*,
-      std::unique_ptr<unified_consent::UrlKeyedDataCollectionConsentHelper>>
-      consent_helpers_;
-
-  // Tracks if UKM is allowed on all profiles after the last state change.
-  bool all_sync_states_allow_ukm_ = false;
+  // Tracks if history sync was enabled on all profiles after the last state
+  // change.
+  bool all_histories_enabled_;
 
   // Tracks if extension sync was enabled on all profiles after the last state
   // change.
-  bool all_sync_states_allow_extension_ukm_ = false;
+  bool all_extensions_enabled_;
 
   DISALLOW_COPY_AND_ASSIGN(SyncDisableObserver);
 };
diff --git a/components/ukm/observers/sync_disable_observer_unittest.cc b/components/ukm/observers/sync_disable_observer_unittest.cc
index cf26268..043c751 100644
--- a/components/ukm/observers/sync_disable_observer_unittest.cc
+++ b/components/ukm/observers/sync_disable_observer_unittest.cc
@@ -154,7 +154,7 @@
   EXPECT_FALSE(observer.ResetPurged());
 }
 
-TEST_F(SyncDisableObserverTest, OneEnabled_UnifiedConsentEnabled) {
+TEST_F(SyncDisableObserverTest, DISABLED_OneEnabled_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
       UnifiedConsentFeatureState::kEnabledNoBump);
   sync_preferences::TestingPrefServiceSyncable prefs;
@@ -247,7 +247,7 @@
   EXPECT_FALSE(observer.ResetPurged());
 }
 
-TEST_F(SyncDisableObserverTest, MixedProfiles_UnifiedConsentEnabled) {
+TEST_F(SyncDisableObserverTest, DISABLED_MixedProfiles_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
       UnifiedConsentFeatureState::kEnabledNoBump);
   sync_preferences::TestingPrefServiceSyncable prefs1;
@@ -283,7 +283,7 @@
   EXPECT_FALSE(observer.ResetPurged());
 }
 
-TEST_F(SyncDisableObserverTest, TwoEnabled_UnifiedConsentEnabled) {
+TEST_F(SyncDisableObserverTest, DISABLED_TwoEnabled_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
       UnifiedConsentFeatureState::kEnabledNoBump);
   sync_preferences::TestingPrefServiceSyncable prefs1;
@@ -323,7 +323,7 @@
   EXPECT_FALSE(observer.ResetPurged());
 }
 
-TEST_F(SyncDisableObserverTest, OneAddRemove_UnifiedConsentEnabled) {
+TEST_F(SyncDisableObserverTest, DISABLED_OneAddRemove_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
       UnifiedConsentFeatureState::kEnabledNoBump);
   sync_preferences::TestingPrefServiceSyncable prefs;
@@ -364,7 +364,7 @@
   EXPECT_FALSE(observer.ResetPurged());
 }
 
-TEST_F(SyncDisableObserverTest, PurgeOnDisable_UnifiedConsentEnabled) {
+TEST_F(SyncDisableObserverTest, DISABLED_PurgeOnDisable_UnifiedConsentEnabled) {
   ScopedUnifiedConsent scoped_unified_consent(
       UnifiedConsentFeatureState::kEnabledNoBump);
 
diff --git a/components/zucchini/abs32_utils.cc b/components/zucchini/abs32_utils.cc
index b3fd9f4..bf6526b 100644
--- a/components/zucchini/abs32_utils.cc
+++ b/components/zucchini/abs32_utils.cc
@@ -167,12 +167,11 @@
 
 /******** Exported Functions ********/
 
-size_t RemoveOverlappingAbs32Locations(Bitness bitness,
+size_t RemoveOverlappingAbs32Locations(uint32_t width,
                                        std::vector<offset_t>* locations) {
   if (locations->size() <= 1)
     return 0;
 
-  uint32_t width = WidthOf(bitness);
   auto slow = locations->begin();
   auto fast = locations->begin() + 1;
   for (;;) {
diff --git a/components/zucchini/abs32_utils.h b/components/zucchini/abs32_utils.h
index b1d3ae0..a97aa38 100644
--- a/components/zucchini/abs32_utils.h
+++ b/components/zucchini/abs32_utils.h
@@ -127,9 +127,8 @@
 };
 
 // Given a sorted list of abs32 |locations|, removes all elements whose body
-// overlaps with the body of a previous element (|bitness| determines length).
-// Returns the number of elements removed.
-size_t RemoveOverlappingAbs32Locations(Bitness bitness,
+// (with |width| given) overlaps with the body of a previous element.
+size_t RemoveOverlappingAbs32Locations(uint32_t width,
                                        std::vector<offset_t>* locations);
 
 }  // namespace zucchini
diff --git a/components/zucchini/abs32_utils_unittest.cc b/components/zucchini/abs32_utils_unittest.cc
index 480fea0..a8f6917e 100644
--- a/components/zucchini/abs32_utils_unittest.cc
+++ b/components/zucchini/abs32_utils_unittest.cc
@@ -433,20 +433,20 @@
 }
 
 TEST(Abs32UtilsTest, RemoveOverlappingAbs32Locations) {
-  // Make |bitness| a state to reduce repetition.
-  Bitness bitness = kBit32;
+  // Make |width| a state to reduce repetition.
+  uint32_t width = WidthOf(kBit32);
 
-  auto run_test = [&bitness](const std::vector<offset_t>& expected_locations,
-                             std::vector<offset_t>&& locations) {
+  auto run_test = [&width](const std::vector<offset_t>& expected_locations,
+                           std::vector<offset_t>&& locations) {
     ASSERT_TRUE(std::is_sorted(locations.begin(), locations.end()));
     size_t expected_removals = locations.size() - expected_locations.size();
-    size_t removals = RemoveOverlappingAbs32Locations(bitness, &locations);
+    size_t removals = RemoveOverlappingAbs32Locations(width, &locations);
     EXPECT_EQ(expected_removals, removals);
     EXPECT_EQ(expected_locations, locations);
   };
 
   // 32-bit tests.
-  bitness = kBit32;
+  width = WidthOf(kBit32);
   run_test(std::vector<offset_t>(), std::vector<offset_t>());
   run_test({4U}, {4U});
   run_test({4U, 10U}, {4U, 10U});
@@ -470,7 +470,7 @@
   run_test({1000000U}, {1000000U, 1000002U});
 
   // 64-bit tests.
-  bitness = kBit64;
+  width = WidthOf(kBit64);
   run_test(std::vector<offset_t>(), std::vector<offset_t>());
   run_test({4U}, {4U});
   run_test({4U, 20U}, {4U, 20U});
diff --git a/components/zucchini/disassembler_elf.cc b/components/zucchini/disassembler_elf.cc
index 8107987..0f6d3a08 100644
--- a/components/zucchini/disassembler_elf.cc
+++ b/components/zucchini/disassembler_elf.cc
@@ -154,23 +154,6 @@
 }
 
 template <class Traits>
-std::unique_ptr<ReferenceReader> DisassemblerElf<Traits>::MakeReadAbs32(
-    offset_t lo,
-    offset_t hi) {
-  Abs32RvaExtractorWin32 abs_rva_extractor(image_, {Traits::kBitness, 0},
-                                           abs32_locations_, lo, hi);
-  return std::make_unique<Abs32ReaderWin32>(std::move(abs_rva_extractor),
-                                            translator_);
-}
-
-template <class Traits>
-std::unique_ptr<ReferenceWriter> DisassemblerElf<Traits>::MakeWriteAbs32(
-    MutableBufferView image) {
-  return std::make_unique<Abs32WriterWin32>(
-      image, AbsoluteAddress(Traits::kBitness, 0), translator_);
-}
-
-template <class Traits>
 bool DisassemblerElf<Traits>::ParseHeader() {
   BufferSource source(image_);
 
@@ -303,7 +286,7 @@
 
 template <class Traits>
 void DisassemblerElf<Traits>::GetAbs32FromRelocSections() {
-  constexpr int kAbs32Width = 4;
+  constexpr int kAbs32Width = Traits::kVAWidth;
   DCHECK(abs32_locations_.empty());
   auto relocs = MakeReadRelocs(0, offset_t(size()));
   for (auto ref = relocs->GetNext(); ref; ref = relocs->GetNext()) {
@@ -317,7 +300,7 @@
 
   // Abs32 reference bodies must not overlap. If found, simply remove them.
   size_t num_removed =
-      RemoveOverlappingAbs32Locations(Traits::kBitness, &abs32_locations_);
+      RemoveOverlappingAbs32Locations(kAbs32Width, &abs32_locations_);
   if (num_removed) {
     LOG(WARNING) << "Warning: Found and removed " << num_removed
                  << " abs32 locations with overlapping bodies.";
@@ -349,15 +332,17 @@
 template <class Traits>
 std::vector<ReferenceGroup> DisassemblerElfIntel<Traits>::MakeReferenceGroups()
     const {
-  return {{ReferenceTypeTraits{4, TypeTag(kReloc), PoolTag(kReloc)},
-           &DisassemblerElfIntel<Traits>::MakeReadRelocs,
-           &DisassemblerElfIntel<Traits>::MakeWriteRelocs},
-          {ReferenceTypeTraits{4, TypeTag(kAbs32), PoolTag(kAbs32)},
-           &DisassemblerElfIntel<Traits>::MakeReadAbs32,
-           &DisassemblerElfIntel<Traits>::MakeWriteAbs32},
-          {ReferenceTypeTraits{4, TypeTag(kRel32), PoolTag(kRel32)},
-           &DisassemblerElfIntel<Traits>::MakeReadRel32,
-           &DisassemblerElfIntel<Traits>::MakeWriteRel32}};
+  return {
+      {ReferenceTypeTraits{sizeof(Traits::Elf_Rel::r_offset), TypeTag(kReloc),
+                           PoolTag(kReloc)},
+       &DisassemblerElfIntel<Traits>::MakeReadRelocs,
+       &DisassemblerElfIntel<Traits>::MakeWriteRelocs},
+      {ReferenceTypeTraits{Traits::kVAWidth, TypeTag(kAbs32), PoolTag(kAbs32)},
+       &DisassemblerElfIntel<Traits>::MakeReadAbs32,
+       &DisassemblerElfIntel<Traits>::MakeWriteAbs32},
+      {ReferenceTypeTraits{4, TypeTag(kRel32), PoolTag(kRel32)},
+       &DisassemblerElfIntel<Traits>::MakeReadRel32,
+       &DisassemblerElfIntel<Traits>::MakeWriteRel32}};
 }
 
 template <class Traits>
@@ -404,6 +389,24 @@
 }
 
 template <class Traits>
+std::unique_ptr<ReferenceReader> DisassemblerElfIntel<Traits>::MakeReadAbs32(
+    offset_t lo,
+    offset_t hi) {
+  Abs32RvaExtractorWin32 abs_rva_extractor(this->image_,
+                                           AbsoluteAddress(Traits::kBitness, 0),
+                                           this->abs32_locations_, lo, hi);
+  return std::make_unique<Abs32ReaderWin32>(std::move(abs_rva_extractor),
+                                            this->translator_);
+}
+
+template <class Traits>
+std::unique_ptr<ReferenceWriter> DisassemblerElfIntel<Traits>::MakeWriteAbs32(
+    MutableBufferView image) {
+  return std::make_unique<Abs32WriterWin32>(
+      image, AbsoluteAddress(Traits::kBitness, 0), this->translator_);
+}
+
+template <class Traits>
 std::unique_ptr<ReferenceReader> DisassemblerElfIntel<Traits>::MakeReadRel32(
     offset_t lo,
     offset_t hi) {
diff --git a/components/zucchini/disassembler_elf.h b/components/zucchini/disassembler_elf.h
index a5b0a72..d8012db 100644
--- a/components/zucchini/disassembler_elf.h
+++ b/components/zucchini/disassembler_elf.h
@@ -39,6 +39,7 @@
   static const char kExeTypeString[];
   static constexpr elf::MachineArchitecture kMachineValue = elf::EM_386;
   static constexpr uint32_t kRelType = elf::R_386_RELATIVE;
+  enum : uint32_t { kVAWidth = 4 };
   using Rel32FinderUse = Rel32FinderX86;
 };
 
@@ -58,6 +59,7 @@
   static const char kExeTypeString[];
   static constexpr elf::MachineArchitecture kMachineValue = elf::EM_X86_64;
   static constexpr uint32_t kRelType = elf::R_X86_64_RELATIVE;
+  enum : uint32_t { kVAWidth = 8 };
   using Rel32FinderUse = Rel32FinderX64;
 };
 
@@ -81,8 +83,6 @@
   // Find/Receive functions that are common among different architectures.
   std::unique_ptr<ReferenceReader> MakeReadRelocs(offset_t lo, offset_t hi);
   std::unique_ptr<ReferenceWriter> MakeWriteRelocs(MutableBufferView image);
-  std::unique_ptr<ReferenceReader> MakeReadAbs32(offset_t lo, offset_t hi);
-  std::unique_ptr<ReferenceWriter> MakeWriteAbs32(MutableBufferView image);
 
   const AddressTranslator& translator() const { return translator_; }
 
@@ -171,6 +171,8 @@
   void PostProcessRel32() override;
 
   // Specialized Find/Receive functions.
+  std::unique_ptr<ReferenceReader> MakeReadAbs32(offset_t lo, offset_t hi);
+  std::unique_ptr<ReferenceWriter> MakeWriteAbs32(MutableBufferView image);
   std::unique_ptr<ReferenceReader> MakeReadRel32(offset_t lo, offset_t hi);
   std::unique_ptr<ReferenceWriter> MakeWriteRel32(MutableBufferView image);
 
diff --git a/components/zucchini/disassembler_win32.cc b/components/zucchini/disassembler_win32.cc
index 7eba0f4..b3f568bd 100644
--- a/components/zucchini/disassembler_win32.cc
+++ b/components/zucchini/disassembler_win32.cc
@@ -327,7 +327,7 @@
 
   // Abs32 reference bodies must not overlap. If found, simply remove them.
   size_t num_removed =
-      RemoveOverlappingAbs32Locations(Traits::kBitness, &abs32_locations_);
+      RemoveOverlappingAbs32Locations(Traits::kVAWidth, &abs32_locations_);
   LOG_IF(WARNING, num_removed) << "Found and removed " << num_removed
                                << " abs32 locations with overlapping bodies.";
   return true;
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc
index 8a16c067..30a9ccc 100644
--- a/content/app/content_main_runner_impl.cc
+++ b/content/app/content_main_runner_impl.cc
@@ -874,18 +874,11 @@
     main_params.startup_data = startup_data_.get();
 
     if (GetContentClient()->browser()->ShouldCreateTaskScheduler()) {
-      // Create the TaskScheduler early to allow upcoming code to use
-      // the post_task.h API. Note: This is okay because RunBrowserProcessMain()
-      // will soon result in invoking TaskScheduler::GetInstance()->Start().
-      // The TaskScheduler being started soon is a strict requirement (delaying
-      // this start would result in posted tasks not running).
+      // Create and start the TaskScheduler early to allow upcoming code to use
+      // the post_task.h API.
       base::TaskScheduler::Create("Browser");
     }
 
-    // Register the TaskExecutor for posting task to the BrowserThreads. It is
-    // incorrect to post to a BrowserThread before this point.
-    BrowserTaskExecutor::Create();
-
     delegate_->PreCreateMainMessageLoop();
 #if defined(OS_WIN)
     if (l10n_util::GetLocaleOverrides().empty()) {
@@ -909,6 +902,15 @@
 
     delegate_->PostEarlyInitialization();
 
+    if (GetContentClient()->browser()->ShouldCreateTaskScheduler()) {
+      // The FeatureList needs to create before starting the TaskScheduler.
+      StartBrowserTaskScheduler();
+    }
+
+    // Register the TaskExecutor for posting task to the BrowserThreads. It is
+    // incorrect to post to a BrowserThread before this point.
+    BrowserTaskExecutor::Create();
+
     return RunBrowserProcessMain(main_params, delegate_);
   }
 #endif  // !defined(CHROME_MULTIPLE_DLL_CHILD)
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index f95b75a..10e4d0146 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -1859,6 +1859,11 @@
   RunHtmlTest(FILE_PATH_LITERAL("label-with-selected-option.html"));
 }
 
+IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
+                       AccessibilityLabelWithPresentationalChild) {
+  RunHtmlTest(FILE_PATH_LITERAL("label-with-presentational-child.html"));
+}
+
 //
 // Regression tests. These don't test a specific web platform feature,
 // they test a specific web page that crashed or had some bad behavior
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index 6009645..20471ef5 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -346,46 +346,6 @@
   WORKER_POOL_COUNT  // Always last.
 };
 
-std::unique_ptr<base::TaskScheduler::InitParams>
-GetDefaultTaskSchedulerInitParams() {
-#if defined(OS_ANDROID)
-  // Mobile config, for iOS see ios/web/app/web_main_loop.cc.
-  return std::make_unique<base::TaskScheduler::InitParams>(
-      base::SchedulerWorkerPoolParams(
-          base::RecommendedMaxNumberOfThreadsInPool(2, 8, 0.1, 0),
-          base::TimeDelta::FromSeconds(30)),
-      base::SchedulerWorkerPoolParams(
-          base::RecommendedMaxNumberOfThreadsInPool(2, 8, 0.1, 0),
-          base::TimeDelta::FromSeconds(30)),
-      base::SchedulerWorkerPoolParams(
-          base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.3, 0),
-          base::TimeDelta::FromSeconds(30)),
-      base::SchedulerWorkerPoolParams(
-          base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.3, 0),
-          base::TimeDelta::FromSeconds(60)));
-#else
-  // Desktop config.
-  return std::make_unique<base::TaskScheduler::InitParams>(
-      base::SchedulerWorkerPoolParams(
-          base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0),
-          base::TimeDelta::FromSeconds(30)),
-      base::SchedulerWorkerPoolParams(
-          base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0),
-          base::TimeDelta::FromSeconds(40)),
-      base::SchedulerWorkerPoolParams(
-          base::RecommendedMaxNumberOfThreadsInPool(8, 32, 0.3, 0),
-          base::TimeDelta::FromSeconds(30)),
-      base::SchedulerWorkerPoolParams(
-          base::RecommendedMaxNumberOfThreadsInPool(8, 32, 0.3, 0),
-          base::TimeDelta::FromSeconds(60))
-#if defined(OS_WIN)
-          ,
-      base::TaskScheduler::InitParams::SharedWorkerPoolEnvironment::COM_MTA
-#endif  // defined(OS_WIN)
-      );
-#endif
-}
-
 #if !defined(OS_FUCHSIA)
 // Time between updating and recording swap rates.
 constexpr base::TimeDelta kSwapMetricsInterval =
@@ -569,12 +529,18 @@
   return g_current_browser_main_loop->audio_manager();
 }
 
-BrowserMainLoop::BrowserMainLoop(const MainFunctionParams& parameters)
+BrowserMainLoop::BrowserMainLoop(
+    const MainFunctionParams& parameters,
+    std::unique_ptr<base::TaskScheduler::ScopedExecutionFence>
+        scoped_execution_fence)
     : parameters_(parameters),
       parsed_command_line_(parameters.command_line),
       result_code_(service_manager::RESULT_CODE_NORMAL_EXIT),
-      created_threads_(false) {
+      created_threads_(false),
+      scoped_execution_fence_(std::move(scoped_execution_fence)) {
   DCHECK(!g_current_browser_main_loop);
+  DCHECK(scoped_execution_fence_)
+      << "TaskScheduler must be halted before kicking off content.";
   g_current_browser_main_loop = this;
 
   if (GetContentClient()->browser()->ShouldCreateTaskScheduler()) {
@@ -977,31 +943,8 @@
 int BrowserMainLoop::CreateThreads() {
   TRACE_EVENT0("startup,rail", "BrowserMainLoop::CreateThreads");
 
-  {
-    auto task_scheduler_init_params =
-        GetContentClient()->browser()->GetTaskSchedulerInitParams();
-    if (!task_scheduler_init_params)
-      task_scheduler_init_params = GetDefaultTaskSchedulerInitParams();
-    DCHECK(task_scheduler_init_params);
-
-    // If a renderer lives in the browser process, adjust the number of threads
-    // in the foreground pool.
-    if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-            switches::kSingleProcess)) {
-      const base::SchedulerWorkerPoolParams&
-          current_foreground_worker_pool_params(
-              task_scheduler_init_params->foreground_worker_pool_params);
-      task_scheduler_init_params->foreground_worker_pool_params =
-          base::SchedulerWorkerPoolParams(
-              std::max(GetMinThreadsInRendererTaskSchedulerForegroundPool(),
-                       current_foreground_worker_pool_params.max_tasks()),
-              current_foreground_worker_pool_params.suggested_reclaim_time(),
-              current_foreground_worker_pool_params.backward_compatibility());
-    }
-
-    base::TaskScheduler::GetInstance()->Start(
-        *task_scheduler_init_params.get());
-  }
+  // Release the TaskScheduler's threads.
+  scoped_execution_fence_.reset();
 
   // The |io_thread| can have optionally been injected into Init(), but if not,
   // create it here. Thre thread is only tagged as BrowserThread::IO here in
diff --git a/content/browser/browser_main_loop.h b/content/browser/browser_main_loop.h
index ba48e9e..f9118502 100644
--- a/content/browser/browser_main_loop.h
+++ b/content/browser/browser_main_loop.h
@@ -11,6 +11,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/timer/timer.h"
 #include "build/build_config.h"
 #include "content/browser/browser_process_sub_thread.h"
@@ -129,7 +130,9 @@
 
   // The TaskScheduler instance must exist but not to be started when building
   // BrowserMainLoop.
-  explicit BrowserMainLoop(const MainFunctionParams& parameters);
+  explicit BrowserMainLoop(
+      const MainFunctionParams& parameters,
+      std::unique_ptr<base::TaskScheduler::ScopedExecutionFence> fence);
   virtual ~BrowserMainLoop();
 
   void Init();
@@ -285,6 +288,15 @@
   const base::CommandLine& parsed_command_line_;
   int result_code_;
   bool created_threads_;  // True if the non-UI threads were created.
+  // //content must be initialized single-threaded until
+  // BrowserMainLoop::CreateThreads() as things initialized before it require an
+  // initialize-once happens-before relationship with all eventual content tasks
+  // running on other threads. This ScopedExecutionFence ensures that no tasks
+  // posted to TaskScheduler gets to run before CreateThreads(); satisfying this
+  // requirement even though the TaskScheduler is created and started before
+  // content is entered.
+  std::unique_ptr<base::TaskScheduler::ScopedExecutionFence>
+      scoped_execution_fence_;
 
   // Members initialized in |MainMessageLoopStart()| ---------------------------
   std::unique_ptr<base::MessageLoop> main_message_loop_;
diff --git a/content/browser/browser_main_loop_unittest.cc b/content/browser/browser_main_loop_unittest.cc
index 14821a5..b5d345fc 100644
--- a/content/browser/browser_main_loop_unittest.cc
+++ b/content/browser/browser_main_loop_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/test/scoped_command_line.h"
 #include "content/browser/browser_thread_impl.h"
 #include "content/browser/scheduler/browser_task_executor.h"
+#include "content/browser/startup_helper.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/main_function_params.h"
@@ -22,14 +23,17 @@
 // the number of cores in its foreground pool.
 TEST(BrowserMainLoopTest, CreateThreadsInSingleProcess) {
   {
-    base::TaskScheduler::Create("Browser");
-    BrowserTaskExecutor::Create();
     base::test::ScopedCommandLine scoped_command_line;
     scoped_command_line.GetProcessCommandLine()->AppendSwitch(
         switches::kSingleProcess);
+    base::TaskScheduler::Create("Browser");
+    StartBrowserTaskScheduler();
+    BrowserTaskExecutor::Create();
     MainFunctionParams main_function_params(
         *scoped_command_line.GetProcessCommandLine());
-    BrowserMainLoop browser_main_loop(main_function_params);
+    BrowserMainLoop browser_main_loop(
+        main_function_params,
+        std::make_unique<base::TaskScheduler::ScopedExecutionFence>());
     browser_main_loop.MainMessageLoopStart();
     browser_main_loop.Init();
     browser_main_loop.CreateThreads();
diff --git a/content/browser/browser_main_runner_impl.cc b/content/browser/browser_main_runner_impl.cc
index 94dc07f..f7794627 100644
--- a/content/browser/browser_main_runner_impl.cc
+++ b/content/browser/browser_main_runner_impl.cc
@@ -54,7 +54,10 @@
 }
 
 BrowserMainRunnerImpl::BrowserMainRunnerImpl()
-    : initialization_started_(false), is_shutdown_(false) {}
+    : initialization_started_(false),
+      is_shutdown_(false),
+      scoped_execution_fence_(
+          std::make_unique<base::TaskScheduler::ScopedExecutionFence>()) {}
 
 BrowserMainRunnerImpl::~BrowserMainRunnerImpl() {
   if (initialization_started_ && !is_shutdown_)
@@ -107,7 +110,8 @@
     gfx::win::MaybeInitializeDirectWrite();
 #endif  // OS_WIN
 
-    main_loop_.reset(new BrowserMainLoop(parameters));
+    main_loop_.reset(
+        new BrowserMainLoop(parameters, std::move(scoped_execution_fence_)));
 
     main_loop_->Init();
 
diff --git a/content/browser/browser_main_runner_impl.h b/content/browser/browser_main_runner_impl.h
index 08e959f..7ab5d1c 100644
--- a/content/browser/browser_main_runner_impl.h
+++ b/content/browser/browser_main_runner_impl.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_main_runner.h"
 
@@ -44,6 +45,12 @@
   // True if the runner has been shut down.
   bool is_shutdown_;
 
+  // Prevents execution of TaskScheduler tasks from the moment content is
+  // entered. Handed off to |main_loop_| later so it can decide when to release
+  // worker threads again.
+  std::unique_ptr<base::TaskScheduler::ScopedExecutionFence>
+      scoped_execution_fence_;
+
   std::unique_ptr<NotificationServiceImpl> notification_service_;
   std::unique_ptr<BrowserMainLoop> main_loop_;
 #if defined(OS_WIN)
diff --git a/content/browser/fileapi/README.md b/content/browser/fileapi/README.md
new file mode 100644
index 0000000..4707361
--- /dev/null
+++ b/content/browser/fileapi/README.md
@@ -0,0 +1,23 @@
+# FileSystem API
+
+This directory contains part of the browser side implementation of various
+filesystem related APIs.
+
+## Related directories
+
+[`//storage/browser/fileapi/`](../../../storage/browser/fileapi) contains the
+rest of the browser side implementation, while
+[`blink/renderer/modules/filesystem`](../../../third_party/blink/renderer/modules/filesystem)
+contains the renderer side implementation and
+[`blink/public/mojom/filesystem`](../../../third_party/blink/public/mojom/filesystem)
+contains the mojom interfaces for these APIs.
+
+## In this directory
+
+[`FileSystemManagerImpl`](file_system_manager_impl.h) is the main entry point
+for calls from the renderer, it mostly redirects incoming mojom calls to a
+`storage::FileSystemContext` instance.
+
+[`FileSystemChooser`](file_system_chooser.h) uses ui::SelectFileDialog to show
+a file or directory picker, and is responsible for granting a process the right
+permissions for actually accessing the files that were selected.
diff --git a/content/browser/fileapi/file_system_chooser.cc b/content/browser/fileapi/file_system_chooser.cc
index 0c8ae67..9b62430 100644
--- a/content/browser/fileapi/file_system_chooser.cc
+++ b/content/browser/fileapi/file_system_chooser.cc
@@ -5,6 +5,8 @@
 #include "content/browser/fileapi/file_system_chooser.h"
 
 #include "base/bind.h"
+#include "base/files/file_util.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/child_process_security_policy.h"
 #include "content/public/browser/content_browser_client.h"
@@ -19,20 +21,37 @@
 void FileSystemChooser::CreateAndShow(
     int render_process_id,
     int frame_id,
+    blink::mojom::ChooseFileSystemEntryType type,
     ResultCallback callback,
     scoped_refptr<base::TaskRunner> callback_runner) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   RenderFrameHost* rfh = RenderFrameHost::FromID(render_process_id, frame_id);
   WebContents* web_contents = WebContents::FromRenderFrameHost(rfh);
-  auto* listener = new FileSystemChooser(render_process_id, std::move(callback),
-                                         std::move(callback_runner));
+  auto* listener = new FileSystemChooser(
+      render_process_id, type, std::move(callback), std::move(callback_runner));
   listener->dialog_ = ui::SelectFileDialog::Create(
       listener,
       GetContentClient()->browser()->CreateSelectFilePolicy(web_contents));
   // TODO(https://crbug.com/878581): Better/more specific options to pass to
   //     SelectFile.
+  ui::SelectFileDialog::Type dialog_type = ui::SelectFileDialog::SELECT_NONE;
+  switch (type) {
+    case blink::mojom::ChooseFileSystemEntryType::kOpenFile:
+      dialog_type = ui::SelectFileDialog::SELECT_OPEN_FILE;
+      break;
+    case blink::mojom::ChooseFileSystemEntryType::kOpenMultipleFiles:
+      dialog_type = ui::SelectFileDialog::SELECT_OPEN_MULTI_FILE;
+      break;
+    case blink::mojom::ChooseFileSystemEntryType::kSaveFile:
+      dialog_type = ui::SelectFileDialog::SELECT_SAVEAS_FILE;
+      break;
+    case blink::mojom::ChooseFileSystemEntryType::kOpenDirectory:
+      dialog_type = ui::SelectFileDialog::SELECT_FOLDER;
+      break;
+  }
+  DCHECK_NE(dialog_type, ui::SelectFileDialog::SELECT_NONE);
   listener->dialog_->SelectFile(
-      ui::SelectFileDialog::SELECT_OPEN_FILE, /*title=*/base::string16(),
+      dialog_type, /*title=*/base::string16(),
       /*default_path=*/base::FilePath(), /*file_types=*/nullptr,
       /*file_type_index=*/0,
       /*default_extension=*/base::FilePath::StringType(),
@@ -42,11 +61,13 @@
 
 FileSystemChooser::FileSystemChooser(
     int render_process_id,
+    blink::mojom::ChooseFileSystemEntryType type,
     ResultCallback callback,
     scoped_refptr<base::TaskRunner> callback_runner)
     : render_process_id_(render_process_id),
       callback_(std::move(callback)),
-      callback_runner_(std::move(callback_runner)) {}
+      callback_runner_(std::move(callback_runner)),
+      type_(type) {}
 
 FileSystemChooser::~FileSystemChooser() {
   if (dialog_)
@@ -73,21 +94,72 @@
   for (const auto& path : files) {
     auto entry = blink::mojom::FileSystemEntry::New();
     entry->file_system_id = isolated_context->RegisterFileSystemForPath(
-        storage::kFileSystemTypeNativeForPlatformApp, std::string(), path,
+        storage::kFileSystemTypeNativeLocal, std::string(), path,
         &entry->base_name);
 
-    // TODO(https://crbug.com/878585): Determine if we always want to grant
-    //     write permission.
     security_policy->GrantReadFileSystem(render_process_id_,
                                          entry->file_system_id);
-    security_policy->GrantWriteFileSystem(render_process_id_,
-                                          entry->file_system_id);
-    security_policy->GrantDeleteFromFileSystem(render_process_id_,
-                                               entry->file_system_id);
+    // TODO(https://crbug.com/878585): Don't grant write/modify permissions
+    // unless a website already has the appropriate permissions.
+    if (type_ == blink::mojom::ChooseFileSystemEntryType::kOpenDirectory) {
+      // Only grant Create permissions if we're opening a directory. And
+      // just granting Create permissions on top of Write and Delete does not
+      // actually grant the same permissions as calling this method.
+      security_policy->GrantCreateReadWriteFileSystem(render_process_id_,
+                                                      entry->file_system_id);
+    } else {
+      security_policy->GrantWriteFileSystem(render_process_id_,
+                                            entry->file_system_id);
+      security_policy->GrantDeleteFromFileSystem(render_process_id_,
+                                                 entry->file_system_id);
+    }
 
     result.push_back(std::move(entry));
   }
 
+  if (type_ == blink::mojom::ChooseFileSystemEntryType::kSaveFile) {
+    // Create files if they don't yet exist.
+    // TODO(mek): If we change FileSystemFileHandle to be able to represent a
+    // file that doesn't exist on disk, we should be able to get rid of this
+    // step and make the whole API slightly more robust.
+    base::PostTaskWithTraits(
+        FROM_HERE, {base::TaskPriority::USER_BLOCKING, base::MayBlock()},
+        base::BindOnce(
+            [](const std::vector<base::FilePath>& files,
+               std::vector<blink::mojom::FileSystemEntryPtr> result,
+               scoped_refptr<base::TaskRunner> callback_runner,
+               ResultCallback callback) {
+              for (const auto& path : files) {
+                // Checking if a path exists, and then creating it if it doesn't
+                // is of course racy, but external applications could just as
+                // well be deleting the entire directory, or similar problematic
+                // cases, so no matter what we do there are always going to be
+                // race conditions and websites will just have to deal with any
+                // method being able to fail in unexpected ways.
+                if (base::PathExists(path))
+                  continue;
+                int creation_flags =
+                    base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ;
+                base::File file(path, creation_flags);
+
+                if (!file.IsValid()) {
+                  callback_runner->PostTask(
+                      FROM_HERE,
+                      base::BindOnce(
+                          std::move(callback), base::File::FILE_ERROR_FAILED,
+                          std::vector<blink::mojom::FileSystemEntryPtr>()));
+                  return;
+                }
+              }
+              callback_runner->PostTask(
+                  FROM_HERE,
+                  base::BindOnce(std::move(callback), base::File::FILE_OK,
+                                 std::move(result)));
+            },
+            files, std::move(result), callback_runner_, std::move(callback_)));
+    delete this;
+    return;
+  }
   callback_runner_->PostTask(
       FROM_HERE, base::BindOnce(std::move(callback_), base::File::FILE_OK,
                                 std::move(result)));
diff --git a/content/browser/fileapi/file_system_chooser.h b/content/browser/fileapi/file_system_chooser.h
index 2283a6725..d2f24d8 100644
--- a/content/browser/fileapi/file_system_chooser.h
+++ b/content/browser/fileapi/file_system_chooser.h
@@ -25,10 +25,12 @@
 
   static void CreateAndShow(int render_process_id,
                             int frame_id,
+                            blink::mojom::ChooseFileSystemEntryType type,
                             ResultCallback callback,
                             scoped_refptr<base::TaskRunner> callback_runner);
 
   FileSystemChooser(int render_process_id,
+                    blink::mojom::ChooseFileSystemEntryType type,
                     ResultCallback callback,
                     scoped_refptr<base::TaskRunner> callback_runner);
 
@@ -46,6 +48,7 @@
   int render_process_id_;
   ResultCallback callback_;
   scoped_refptr<base::TaskRunner> callback_runner_;
+  blink::mojom::ChooseFileSystemEntryType type_;
 
   scoped_refptr<ui::SelectFileDialog> dialog_;
 };
diff --git a/content/browser/fileapi/file_system_chooser_browsertest.cc b/content/browser/fileapi/file_system_chooser_browsertest.cc
new file mode 100644
index 0000000..97cfcd3
--- /dev/null
+++ b/content/browser/fileapi/file_system_chooser_browsertest.cc
@@ -0,0 +1,267 @@
+// Copyright 2018 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 "base/test/scoped_feature_list.h"
+#include "base/threading/thread_restrictions.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/content_browser_test.h"
+#include "content/public/test/content_browser_test_utils.h"
+#include "third_party/blink/public/common/features.h"
+#include "ui/shell_dialogs/select_file_dialog.h"
+#include "ui/shell_dialogs/select_file_dialog_factory.h"
+#include "ui/shell_dialogs/select_file_policy.h"
+
+namespace content {
+
+namespace {
+
+struct SelectFileDialogParams {
+  ui::SelectFileDialog::Type type = ui::SelectFileDialog::SELECT_NONE;
+};
+
+// A fake ui::SelectFileDialog, which will cancel the file selection instead of
+// selecting a file.
+class CancellingSelectFileDialog : public ui::SelectFileDialog {
+ public:
+  CancellingSelectFileDialog(Listener* listener,
+                             std::unique_ptr<ui::SelectFilePolicy> policy)
+      : ui::SelectFileDialog(listener, std::move(policy)) {}
+
+ protected:
+  void SelectFileImpl(Type type,
+                      const base::string16& title,
+                      const base::FilePath& default_path,
+                      const FileTypeInfo* file_types,
+                      int file_type_index,
+                      const base::FilePath::StringType& default_extension,
+                      gfx::NativeWindow owning_window,
+                      void* params) override {
+    listener_->FileSelectionCanceled(params);
+  }
+
+  bool IsRunning(gfx::NativeWindow owning_window) const override {
+    return false;
+  }
+  void ListenerDestroyed() override {}
+  bool HasMultipleFileTypeChoicesImpl() override { return false; }
+
+ private:
+  ~CancellingSelectFileDialog() override = default;
+};
+
+class CancellingSelectFileDialogFactory : public ui::SelectFileDialogFactory {
+ public:
+  CancellingSelectFileDialogFactory() {}
+
+  ui::SelectFileDialog* Create(
+      ui::SelectFileDialog::Listener* listener,
+      std::unique_ptr<ui::SelectFilePolicy> policy) override {
+    return new CancellingSelectFileDialog(listener, std::move(policy));
+  }
+};
+
+// A fake ui::SelectFileDialog, which will select one or more pre-determined
+// files.
+class FakeSelectFileDialog : public ui::SelectFileDialog {
+ public:
+  FakeSelectFileDialog(std::vector<base::FilePath> result,
+                       SelectFileDialogParams* out_params,
+                       Listener* listener,
+                       std::unique_ptr<ui::SelectFilePolicy> policy)
+      : ui::SelectFileDialog(listener, std::move(policy)),
+        result_(std::move(result)),
+        out_params_(out_params) {}
+
+ protected:
+  void SelectFileImpl(Type type,
+                      const base::string16& title,
+                      const base::FilePath& default_path,
+                      const FileTypeInfo* file_types,
+                      int file_type_index,
+                      const base::FilePath::StringType& default_extension,
+                      gfx::NativeWindow owning_window,
+                      void* params) override {
+    if (out_params_) {
+      out_params_->type = type;
+    }
+    if (result_.size() == 1)
+      listener_->FileSelected(result_[0], 0, params);
+    else
+      listener_->MultiFilesSelected(result_, params);
+  }
+
+  bool IsRunning(gfx::NativeWindow owning_window) const override {
+    return false;
+  }
+  void ListenerDestroyed() override {}
+  bool HasMultipleFileTypeChoicesImpl() override { return false; }
+
+ private:
+  ~FakeSelectFileDialog() override = default;
+  std::vector<base::FilePath> result_;
+  SelectFileDialogParams* out_params_;
+};
+
+class FakeSelectFileDialogFactory : public ui::SelectFileDialogFactory {
+ public:
+  explicit FakeSelectFileDialogFactory(std::vector<base::FilePath> result,
+                                       SelectFileDialogParams* out_params)
+      : result_(std::move(result)), out_params_(out_params) {}
+
+  ui::SelectFileDialog* Create(
+      ui::SelectFileDialog::Listener* listener,
+      std::unique_ptr<ui::SelectFilePolicy> policy) override {
+    return new FakeSelectFileDialog(result_, out_params_, listener,
+                                    std::move(policy));
+  }
+
+ private:
+  std::vector<base::FilePath> result_;
+  SelectFileDialogParams* out_params_;
+};
+
+}  // namespace
+
+// This browser test implements end-to-end tests for the chooseFileSystemEntry
+// API.
+class FileSystemChooserBrowserTest : public ContentBrowserTest {
+ public:
+  void SetUp() override {
+    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+    scoped_feature_list_.InitAndEnableFeature(
+        blink::features::kWritableFilesAPI);
+    ContentBrowserTest::SetUp();
+  }
+
+  void TearDown() override {
+    ContentBrowserTest::TearDown();
+    ASSERT_TRUE(temp_dir_.Delete());
+    ui::SelectFileDialog::SetFactory(nullptr);
+  }
+
+  base::FilePath CreateTestFile(const std::string& contents) {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    base::FilePath result;
+    EXPECT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &result));
+    EXPECT_EQ(int{contents.size()},
+              base::WriteFile(result, contents.data(), contents.size()));
+    return result;
+  }
+
+  base::FilePath CreateTestDir() {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    base::FilePath result;
+    EXPECT_TRUE(base::CreateTemporaryDirInDir(
+        temp_dir_.GetPath(), FILE_PATH_LITERAL("test"), &result));
+    return result;
+  }
+
+ protected:
+  const std::string kBlankHtml = "<!DOCTYPE html><html><body>";
+  const GURL kTestUrl = GURL("https://foobar.com/");
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+  base::ScopedTempDir temp_dir_;
+};
+
+IN_PROC_BROWSER_TEST_F(FileSystemChooserBrowserTest, CancelDialog) {
+  ui::SelectFileDialog::SetFactory(new CancellingSelectFileDialogFactory);
+  LoadDataWithBaseURL(shell(), kTestUrl, kBlankHtml, kTestUrl);
+  auto result = EvalJs(shell(), "self.chooseFileSystemEntries()");
+  EXPECT_TRUE(result.error.find("AbortError") != std::string::npos)
+      << result.error;
+}
+
+IN_PROC_BROWSER_TEST_F(FileSystemChooserBrowserTest, OpenFile) {
+  const std::string file_contents = "hello world!";
+  const base::FilePath test_file = CreateTestFile(file_contents);
+  SelectFileDialogParams dialog_params;
+  ui::SelectFileDialog::SetFactory(
+      new FakeSelectFileDialogFactory({test_file}, &dialog_params));
+  LoadDataWithBaseURL(shell(), kTestUrl, kBlankHtml, kTestUrl);
+  EXPECT_EQ(test_file.BaseName().AsUTF8Unsafe(),
+            EvalJs(shell(),
+                   "(async () => {"
+                   "  let e = await self.chooseFileSystemEntries();"
+                   "  self.selected_entry = e;"
+                   "  return e.name; })()"));
+  EXPECT_EQ(ui::SelectFileDialog::SELECT_OPEN_FILE, dialog_params.type);
+  EXPECT_EQ(
+      file_contents,
+      EvalJs(shell(),
+             "(async () => { const file = await self.selected_entry.getFile(); "
+             "return await new Response(file).text(); })()"));
+}
+
+IN_PROC_BROWSER_TEST_F(FileSystemChooserBrowserTest, SaveFile) {
+  const std::string file_contents = "file contents to write";
+  const base::FilePath test_file = CreateTestFile("");
+  {
+    // Delete file, since SaveFile should be able to deal with non-existing
+    // files.
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    ASSERT_TRUE(base::DeleteFile(test_file, false));
+  }
+  SelectFileDialogParams dialog_params;
+  ui::SelectFileDialog::SetFactory(
+      new FakeSelectFileDialogFactory({test_file}, &dialog_params));
+  LoadDataWithBaseURL(shell(), kTestUrl, kBlankHtml, kTestUrl);
+  EXPECT_EQ(test_file.BaseName().AsUTF8Unsafe(),
+            EvalJs(shell(),
+                   "(async () => {"
+                   "  let e = await self.chooseFileSystemEntries("
+                   "      {type: 'saveFile'});"
+                   "  self.entry = e;"
+                   "  return e.name; })()"));
+  EXPECT_EQ(ui::SelectFileDialog::SELECT_SAVEAS_FILE, dialog_params.type);
+  EXPECT_EQ(int{file_contents.size()},
+            EvalJs(shell(),
+                   JsReplace("(async () => {"
+                             "  const w = await self.entry.createWriter();"
+                             "  await w.write(0, new Blob([$1]));"
+                             "  return (await self.entry.getFile()).size; })()",
+                             file_contents)));
+  {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    std::string read_contents;
+    EXPECT_TRUE(base::ReadFileToString(test_file, &read_contents));
+    EXPECT_EQ(file_contents, read_contents);
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(FileSystemChooserBrowserTest, OpenMultipleFiles) {
+  const base::FilePath test_file1 = CreateTestFile("file1");
+  const base::FilePath test_file2 = CreateTestFile("file2");
+  SelectFileDialogParams dialog_params;
+  ui::SelectFileDialog::SetFactory(new FakeSelectFileDialogFactory(
+      {test_file1, test_file2}, &dialog_params));
+  LoadDataWithBaseURL(shell(), kTestUrl, kBlankHtml, kTestUrl);
+  EXPECT_EQ(ListValueOf(test_file1.BaseName().AsUTF8Unsafe(),
+                        test_file2.BaseName().AsUTF8Unsafe()),
+            EvalJs(shell(),
+                   "(async () => {"
+                   "  let e = await self.chooseFileSystemEntries("
+                   "      {multiple: true});"
+                   "  return e.map(x => x.name); })()"));
+  EXPECT_EQ(ui::SelectFileDialog::SELECT_OPEN_MULTI_FILE, dialog_params.type);
+}
+
+IN_PROC_BROWSER_TEST_F(FileSystemChooserBrowserTest, OpenDirectory) {
+  base::FilePath test_dir = CreateTestDir();
+  SelectFileDialogParams dialog_params;
+  ui::SelectFileDialog::SetFactory(
+      new FakeSelectFileDialogFactory({test_dir}, &dialog_params));
+  LoadDataWithBaseURL(shell(), kTestUrl, kBlankHtml, kTestUrl);
+  EXPECT_EQ(test_dir.BaseName().AsUTF8Unsafe(),
+            EvalJs(shell(),
+                   "(async () => {"
+                   "  let e = await self.chooseFileSystemEntries("
+                   "      {type: 'openDirectory'});"
+                   "  self.selected_entry = e;"
+                   "  return e.name; })()"));
+  EXPECT_EQ(ui::SelectFileDialog::SELECT_FOLDER, dialog_params.type);
+}
+
+}  // namespace content
\ No newline at end of file
diff --git a/content/browser/fileapi/file_system_manager_impl.cc b/content/browser/fileapi/file_system_manager_impl.cc
index 29f1d2d..91d5202 100644
--- a/content/browser/fileapi/file_system_manager_impl.cc
+++ b/content/browser/fileapi/file_system_manager_impl.cc
@@ -592,7 +592,9 @@
   std::move(callback).Run(base::File::FILE_OK, std::move(writer));
 }
 
-void FileSystemManagerImpl::ChooseEntry(ChooseEntryCallback callback) {
+void FileSystemManagerImpl::ChooseEntry(
+    blink::mojom::ChooseFileSystemEntryType type,
+    ChooseEntryCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   if (!base::FeatureList::IsEnabled(blink::features::kWritableFilesAPI)) {
     bindings_.ReportBadMessage("FSMI_WRITABLE_FILES_DISABLED");
@@ -602,7 +604,7 @@
   base::PostTaskWithTraits(
       FROM_HERE, {BrowserThread::UI},
       base::BindOnce(
-          &FileSystemChooser::CreateAndShow, process_id_, frame_id_,
+          &FileSystemChooser::CreateAndShow, process_id_, frame_id_, type,
           std::move(callback),
           base::CreateSingleThreadTaskRunnerWithTraits({BrowserThread::IO})));
 }
diff --git a/content/browser/fileapi/file_system_manager_impl.h b/content/browser/fileapi/file_system_manager_impl.h
index e92c5e46..4fe924e 100644
--- a/content/browser/fileapi/file_system_manager_impl.h
+++ b/content/browser/fileapi/file_system_manager_impl.h
@@ -125,7 +125,8 @@
                        GetPlatformPathCallback callback) override;
   void CreateWriter(const GURL& file_path,
                     CreateWriterCallback callback) override;
-  void ChooseEntry(ChooseEntryCallback callback) override;
+  void ChooseEntry(blink::mojom::ChooseFileSystemEntryType type,
+                   ChooseEntryCallback callback) override;
 
  private:
   class FileSystemCancellableOperationImpl;
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc
index d60301b2..201a8526 100644
--- a/content/browser/frame_host/navigator_impl.cc
+++ b/content/browser/frame_host/navigator_impl.cc
@@ -765,9 +765,14 @@
   // allow the view to clear the pending entry and typed URL if the user
   // requests (e.g., hitting Escape with focus in the address bar).
   //
+  // Do not leave the pending entry visible if it has an invalid URL, since this
+  // might be formatted in an unexpected or unsafe way.
+  // TODO(creis): Block navigations to invalid URLs in https://crbug.com/850824.
+  //
   // Note: don't touch the transient entry, since an interstitial may exist.
-  bool should_preserve_entry = controller_->IsUnmodifiedBlankTab() ||
-                               delegate_->ShouldPreserveAbortedURLs();
+  bool should_preserve_entry = pending_entry->GetURL().is_valid() &&
+                               (controller_->IsUnmodifiedBlankTab() ||
+                                delegate_->ShouldPreserveAbortedURLs());
   if (pending_entry != controller_->GetVisibleEntry() ||
       !should_preserve_entry) {
     controller_->DiscardPendingEntry(true);
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 46e6a4a..34e4ea2 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1725,7 +1725,7 @@
   // Initialize the RenderFrameHost for the new node.  We always create child
   // frames in the same SiteInstance as the current frame, and they can swap to
   // a different one if they navigate away.
-  child->render_manager()->Init(render_view_host()->GetSiteInstance(),
+  child->render_manager()->Init(GetSiteInstance(),
                                 render_view_host()->GetRoutingID(),
                                 frame_routing_id, MSG_ROUTING_NONE, false);
 
diff --git a/content/browser/loader/mojo_async_resource_handler.cc b/content/browser/loader/mojo_async_resource_handler.cc
index 2a063fe3..014399c7 100644
--- a/content/browser/loader/mojo_async_resource_handler.cc
+++ b/content/browser/loader/mojo_async_resource_handler.cc
@@ -186,6 +186,7 @@
   response->head.request_start = request()->creation_time();
   response->head.response_start = base::TimeTicks::Now();
   sent_received_response_message_ = true;
+  response->head.was_fetched_via_cache = request()->was_cached();
 
   if ((url_loader_options_ &
        network::mojom::kURLLoadOptionSendSSLInfoWithResponse) &&
diff --git a/content/browser/media/session/audio_focus_delegate_default.cc b/content/browser/media/session/audio_focus_delegate_default.cc
index bfd531a..10fd87a 100644
--- a/content/browser/media/session/audio_focus_delegate_default.cc
+++ b/content/browser/media/session/audio_focus_delegate_default.cc
@@ -18,6 +18,8 @@
 
 namespace {
 
+const char kAudioFocusSourceName[] = "web";
+
 // AudioFocusDelegateDefault is the default implementation of
 // AudioFocusDelegate which only handles audio focus between WebContents.
 class AudioFocusDelegateDefault : public AudioFocusDelegate {
@@ -152,6 +154,8 @@
       ServiceManagerConnection::GetForProcess()->GetConnector();
   connector->BindInterface(media_session::mojom::kServiceName,
                            mojo::MakeRequest(&audio_focus_ptr_));
+
+  audio_focus_ptr_->SetSourceName(kAudioFocusSourceName);
 }
 
 // static
diff --git a/content/browser/media/session/audio_focus_delegate_default_browsertest.cc b/content/browser/media/session/audio_focus_delegate_default_browsertest.cc
index 0612048..97d63ea 100644
--- a/content/browser/media/session/audio_focus_delegate_default_browsertest.cc
+++ b/content/browser/media/session/audio_focus_delegate_default_browsertest.cc
@@ -19,6 +19,12 @@
 
 using media_session::test::TestAudioFocusObserver;
 
+namespace {
+
+const char kExpectedSourceName[] = "web";
+
+}  // namespace
+
 class MediaSessionStateObserver
     : public media_session::mojom::MediaSessionObserver {
  public:
@@ -76,6 +82,17 @@
     command_line->AppendSwitch(media_session::switches::kEnableAudioFocus);
   }
 
+  void CheckSessionSourceName() {
+    audio_focus_ptr_->GetFocusRequests(base::BindOnce(
+        [](std::vector<media_session::mojom::AudioFocusRequestStatePtr>
+               requests) {
+          for (auto& request : requests)
+            EXPECT_EQ(kExpectedSourceName, request->source_name.value());
+        }));
+
+    audio_focus_ptr_.FlushForTesting();
+  }
+
   void Run(WebContents* start_contents, WebContents* interrupt_contents) {
     std::unique_ptr<MockMediaSessionPlayerObserver>
         player_observer(new MockMediaSessionPlayerObserver);
@@ -108,6 +125,8 @@
           media_session::mojom::MediaSessionInfo::SessionState::kInactive);
     }
 
+    CheckSessionSourceName();
+
     player_observer->StartNewPlayer();
 
     {
@@ -129,6 +148,8 @@
           media_session::mojom::MediaSessionInfo::SessionState::kActive);
     }
 
+    CheckSessionSourceName();
+
     {
       std::unique_ptr<TestAudioFocusObserver> observer = CreateObserver();
       media_session->Stop(MediaSessionImpl::SuspendType::kUI);
diff --git a/content/browser/permissions/permission_service_impl.cc b/content/browser/permissions/permission_service_impl.cc
index f84599d..064107bb 100644
--- a/content/browser/permissions/permission_service_impl.cc
+++ b/content/browser/permissions/permission_service_impl.cc
@@ -82,6 +82,9 @@
     case PermissionName::PAYMENT_HANDLER:
       *permission_type = PermissionType::PAYMENT_HANDLER;
       return true;
+    case PermissionName::BACKGROUND_FETCH:
+      *permission_type = PermissionType::BACKGROUND_FETCH;
+      return true;
   }
 
   NOTREACHED();
diff --git a/content/browser/portal/portal_browsertest.cc b/content/browser/portal/portal_browsertest.cc
index 8ba7e779..a0b63ea 100644
--- a/content/browser/portal/portal_browsertest.cc
+++ b/content/browser/portal/portal_browsertest.cc
@@ -5,6 +5,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/test/scoped_feature_list.h"
+#include "build/build_config.h"
 #include "content/browser/frame_host/render_frame_host_impl.h"
 #include "content/browser/portal/portal.h"
 #include "content/browser/web_contents/web_contents_impl.h"
@@ -22,7 +23,6 @@
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/mojom/portal/portal.mojom.h"
 #include "url/url_constants.h"
-
 using testing::_;
 
 namespace content {
@@ -302,7 +302,14 @@
 
 // Tests that the WebContentsDelegate will receive a request to swap the
 // WebContents when a portal is activated.
-IN_PROC_BROWSER_TEST_F(PortalBrowserTest, ActivatePortal) {
+// Disabled due to flakiness on Android.  See https://crbug.com/892669.
+#if defined(OS_ANDROID)
+#define MAYBE_ActivatePortal DISABLED_ActivatePortal
+#else
+#define MAYBE_ActivatePortal ActivatePortal
+#endif
+
+IN_PROC_BROWSER_TEST_F(PortalBrowserTest, MAYBE_ActivatePortal) {
   EXPECT_TRUE(NavigateToURL(
       shell(), embedded_test_server()->GetURL("portal.test", "/title1.html")));
   WebContentsImpl* web_contents_impl =
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
index 30f0df9..4911ca1b 100644
--- a/content/browser/renderer_host/compositor_impl_android.cc
+++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -1144,14 +1144,9 @@
                                          requires_alpha_channel_),
           ws::command_buffer_metrics::ContextType::BROWSER_COMPOSITOR);
   auto result = context_provider->BindToCurrentThread();
-  LOG_IF(FATAL, result == gpu::ContextResult::kFatalFailure)
-      << "Fatal error making Gpu context";
-  if (result == gpu::ContextResult::kSurfaceFailure) {
-    SetSurface(nullptr);
-    client_->RecreateSurface();
-  }
-
   if (result != gpu::ContextResult::kSuccess) {
+    if (gpu::IsFatalOrSurfaceFailure(result))
+      OnFatalOrSurfaceContextCreationFailure(result);
     HandlePendingLayerTreeFrameSinkRequest();
     return;
   }
@@ -1431,8 +1426,14 @@
 
 void CompositorImpl::OnFatalOrSurfaceContextCreationFailure(
     gpu::ContextResult context_result) {
+  DCHECK(gpu::IsFatalOrSurfaceFailure(context_result));
   LOG_IF(FATAL, context_result == gpu::ContextResult::kFatalFailure)
       << "Fatal error making Gpu context";
+
+  if (context_result == gpu::ContextResult::kSurfaceFailure) {
+    SetSurface(nullptr);
+    client_->RecreateSurface();
+  }
 }
 
 }  // namespace content
diff --git a/content/browser/renderer_host/ui_events_helper.cc b/content/browser/renderer_host/ui_events_helper.cc
index 8b3330f..1ca8415 100644
--- a/content/browser/renderer_host/ui_events_helper.cc
+++ b/content/browser/renderer_host/ui_events_helper.cc
@@ -78,8 +78,9 @@
     auto uievent = std::make_unique<ui::TouchEvent>(
         type, gfx::Point(), timestamp,
         ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, point.id,
-                           point.radius_x, point.radius_y, point.force),
-        flags, point.rotation_angle);
+                           point.radius_x, point.radius_y, point.force,
+                           point.rotation_angle),
+        flags);
     uievent->set_location_f(location);
     uievent->set_root_location_f(location);
     uievent->set_latency(touch_with_latency.latency);
diff --git a/content/browser/startup_helper.cc b/content/browser/startup_helper.cc
index 8df403a4..204b330 100644
--- a/content/browser/startup_helper.cc
+++ b/content/browser/startup_helper.cc
@@ -6,9 +6,60 @@
 
 #include "base/base_switches.h"
 #include "base/command_line.h"
+#include "base/sys_info.h"
+#include "base/task/task_scheduler/initialization_util.h"
+#include "base/task/task_scheduler/task_scheduler.h"
+#include "build/build_config.h"
+#include "content/common/task_scheduler.h"
+#include "content/public/browser/content_browser_client.h"
+#include "content/public/common/content_switches.h"
 
 namespace content {
 
+namespace {
+
+std::unique_ptr<base::TaskScheduler::InitParams>
+GetDefaultTaskSchedulerInitParams() {
+#if defined(OS_ANDROID)
+  // Mobile config, for iOS see ios/web/app/web_main_loop.cc.
+  return std::make_unique<base::TaskScheduler::InitParams>(
+      base::SchedulerWorkerPoolParams(
+          base::RecommendedMaxNumberOfThreadsInPool(2, 8, 0.1, 0),
+          base::TimeDelta::FromSeconds(30)),
+      base::SchedulerWorkerPoolParams(
+          base::RecommendedMaxNumberOfThreadsInPool(2, 8, 0.1, 0),
+          base::TimeDelta::FromSeconds(30)),
+      base::SchedulerWorkerPoolParams(
+          base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.3, 0),
+          base::TimeDelta::FromSeconds(30)),
+      base::SchedulerWorkerPoolParams(
+          base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.3, 0),
+          base::TimeDelta::FromSeconds(60)));
+#else
+  // Desktop config.
+  return std::make_unique<base::TaskScheduler::InitParams>(
+      base::SchedulerWorkerPoolParams(
+          base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0),
+          base::TimeDelta::FromSeconds(30)),
+      base::SchedulerWorkerPoolParams(
+          base::RecommendedMaxNumberOfThreadsInPool(3, 8, 0.1, 0),
+          base::TimeDelta::FromSeconds(40)),
+      base::SchedulerWorkerPoolParams(
+          base::RecommendedMaxNumberOfThreadsInPool(8, 32, 0.3, 0),
+          base::TimeDelta::FromSeconds(30)),
+      base::SchedulerWorkerPoolParams(
+          base::RecommendedMaxNumberOfThreadsInPool(8, 32, 0.3, 0),
+          base::TimeDelta::FromSeconds(60))
+#if defined(OS_WIN)
+          ,
+      base::TaskScheduler::InitParams::SharedWorkerPoolEnvironment::COM_MTA
+#endif  // defined(OS_WIN)
+      );
+#endif
+}
+
+}  // namespace
+
 std::unique_ptr<base::FieldTrialList> SetUpFieldTrialsAndFeatureList() {
   auto field_trial_list = std::make_unique<base::FieldTrialList>(nullptr);
   const base::CommandLine* command_line =
@@ -31,4 +82,29 @@
   return field_trial_list;
 }
 
+void StartBrowserTaskScheduler() {
+  auto task_scheduler_init_params =
+      GetContentClient()->browser()->GetTaskSchedulerInitParams();
+  if (!task_scheduler_init_params)
+    task_scheduler_init_params = GetDefaultTaskSchedulerInitParams();
+  DCHECK(task_scheduler_init_params);
+
+  // If a renderer lives in the browser process, adjust the number of
+  // threads in the foreground pool.
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kSingleProcess)) {
+    const base::SchedulerWorkerPoolParams&
+        current_foreground_worker_pool_params(
+            task_scheduler_init_params->foreground_worker_pool_params);
+    task_scheduler_init_params->foreground_worker_pool_params =
+        base::SchedulerWorkerPoolParams(
+            std::max(GetMinThreadsInRendererTaskSchedulerForegroundPool(),
+                     current_foreground_worker_pool_params.max_tasks()),
+            current_foreground_worker_pool_params.suggested_reclaim_time(),
+            current_foreground_worker_pool_params.backward_compatibility());
+  }
+
+  base::TaskScheduler::GetInstance()->Start(*task_scheduler_init_params.get());
+}
+
 }  // namespace content
diff --git a/content/browser/startup_helper.h b/content/browser/startup_helper.h
index 01285782..9259f9c 100644
--- a/content/browser/startup_helper.h
+++ b/content/browser/startup_helper.h
@@ -15,6 +15,9 @@
 std::unique_ptr<base::FieldTrialList> CONTENT_EXPORT
 SetUpFieldTrialsAndFeatureList();
 
+// Starts the task scheduler.
+void CONTENT_EXPORT StartBrowserTaskScheduler();
+
 }  // namespace content
 
 #endif  // CONTENT_BROWSER_STARTUP_HELPER_H_
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index a0f8530..13a53b4 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2723,9 +2723,11 @@
     new_contents = base::WrapUnique(
         GetBrowserPluginGuest()->CreateNewGuestWindow(create_params));
   }
-  WebContentsImpl* raw_new_contents =
-      static_cast<WebContentsImpl*>(new_contents.get());
-  raw_new_contents->GetController().SetSessionStorageNamespace(
+  auto owning_contents_impl =
+      base::WrapUnique(static_cast<WebContentsImpl*>(new_contents.release()));
+  auto* new_contents_impl = owning_contents_impl.get();
+
+  new_contents_impl->GetController().SetSessionStorageNamespace(
       partition_id, session_storage_namespace);
 
   // If the new frame has a name, make sure any SiteInstances that can find
@@ -2733,18 +2735,18 @@
   // SetSessionStorageNamespace, since this calls CreateRenderView, which uses
   // GetSessionStorageNamespace.
   if (!params.frame_name.empty())
-    raw_new_contents->GetRenderManager()->CreateProxiesForNewNamedFrame();
+    new_contents_impl->GetRenderManager()->CreateProxiesForNewNamedFrame();
 
   // Save the window for later if we're not suppressing the opener (since it
   // will be shown immediately).
   if (!params.opener_suppressed) {
     if (!is_guest) {
-      WebContentsView* new_view = raw_new_contents->view_.get();
+      WebContentsView* new_view = new_contents_impl->view_.get();
 
       // TODO(brettw): It seems bogus that we have to call this function on the
       // newly created object and give it one of its own member variables.
       new_view->CreateViewForWidget(
-          new_contents->GetRenderViewHost()->GetWidget(), false);
+          new_contents_impl->GetRenderViewHost()->GetWidget(), false);
     }
     // Save the created window associated with the route so we can show it
     // later.
@@ -2753,20 +2755,19 @@
     // FrameTreeNode id instead of the routing id of the Widget for the main
     // frame.  https://crbug.com/545684
     DCHECK_NE(MSG_ROUTING_NONE, main_frame_widget_route_id);
-    pending_contents_[GlobalRoutingID(render_process_id,
-                                      main_frame_widget_route_id)] =
-        std::move(new_contents);
-    AddDestructionObserver(raw_new_contents);
+    GlobalRoutingID id(render_process_id, main_frame_widget_route_id);
+    pending_contents_[id] = std::move(owning_contents_impl);
+    AddDestructionObserver(new_contents_impl);
   }
 
   if (delegate_) {
     delegate_->WebContentsCreated(this, render_process_id,
                                   opener->GetRoutingID(), params.frame_name,
-                                  params.target_url, raw_new_contents);
+                                  params.target_url, new_contents_impl);
   }
 
   for (auto& observer : observers_) {
-    observer.DidOpenRequestedURL(raw_new_contents, opener, params.target_url,
+    observer.DidOpenRequestedURL(new_contents_impl, opener, params.target_url,
                                  params.referrer, params.disposition,
                                  ui::PAGE_TRANSITION_LINK,
                                  false,  // started_from_context_menu
@@ -2782,16 +2783,17 @@
     // new window.  As a result, we need to show and navigate the window here.
     bool was_blocked = false;
 
-    base::WeakPtr<WebContentsImpl> weak_new_contents =
-        raw_new_contents->weak_factory_.GetWeakPtr();
     if (delegate_) {
-      gfx::Rect initial_rect;
+      base::WeakPtr<WebContentsImpl> weak_new_contents =
+          new_contents_impl->weak_factory_.GetWeakPtr();
 
-      delegate_->AddNewContents(this, std::move(new_contents),
+      gfx::Rect initial_rect;  // Report an empty initial rect.
+      delegate_->AddNewContents(this, std::move(owning_contents_impl),
                                 params.disposition, initial_rect,
                                 params.mimic_user_gesture, &was_blocked);
+      // The delegate may delete |new_contents_impl| during AddNewContents().
       if (!weak_new_contents)
-        return;  // The delegate deleted |new_contents| during AddNewContents().
+        return;
     }
 
     if (!was_blocked) {
@@ -2803,12 +2805,11 @@
 
       if (delegate_ && !is_guest &&
           !delegate_->ShouldResumeRequestsForCreatedWindow()) {
-        DCHECK(weak_new_contents);
         // We are in asynchronous add new contents path, delay opening url
-        weak_new_contents->delayed_open_url_params_.reset(
+        new_contents_impl->delayed_open_url_params_.reset(
             new OpenURLParams(open_params));
       } else {
-        weak_new_contents->OpenURL(open_params);
+        new_contents_impl->OpenURL(open_params);
       }
     }
   }
@@ -2863,29 +2864,46 @@
                                         WindowOpenDisposition disposition,
                                         const gfx::Rect& initial_rect,
                                         bool user_gesture) {
-  std::unique_ptr<WebContents> popup =
+  // This method is the renderer requesting an existing top level window to
+  // show a new top level window that the renderer created. Each top level
+  // window is associated with a WebContents. In this case it was created
+  // earlier but showing it was deferred until the renderer requested for it
+  // to be shown. We find that previously created WebContents here.
+  // TODO(danakj): Why do we defer this show step until the renderer asks for it
+  // when it will always do so. What needs to happen in the renderer before we
+  // reach here?
+  std::unique_ptr<WebContentsImpl> owned_created =
       GetCreatedWindow(process_id, main_frame_widget_route_id);
-  if (popup) {
-    WebContentsImpl* raw_popup = static_cast<WebContentsImpl*>(popup.get());
-    WebContentsDelegate* delegate = GetDelegate();
-    raw_popup->is_resume_pending_ = true;
-    if (!delegate || delegate->ShouldResumeRequestsForCreatedWindow())
-      raw_popup->ResumeLoadingCreatedWebContents();
+  WebContentsImpl* created = owned_created.get();
+  // The browser may have rejected the request to make a new window, or the
+  // renderer could be sending an invalid route id. Ignore the request then.
+  if (!created)
+    return;
 
-    base::WeakPtr<WebContentsImpl> weak_popup =
-        raw_popup->weak_factory_.GetWeakPtr();
-    if (delegate) {
-      delegate->AddNewContents(this, std::move(popup), disposition,
-                               initial_rect, user_gesture, nullptr);
-      if (!weak_popup)
-        return;  // The delegate deleted |popup| during AddNewContents().
-    }
+  // This uses the delegate for the WebContents where the window was created
+  // from, to control how to show the newly created window.
+  WebContentsDelegate* delegate = GetDelegate();
 
-    RenderWidgetHostImpl* rwh =
-        weak_popup->GetMainFrame()->GetRenderWidgetHost();
-    DCHECK_EQ(main_frame_widget_route_id, rwh->GetRoutingID());
-    rwh->Send(new WidgetMsg_SetBounds_ACK(rwh->GetRoutingID()));
+  // The delegate can be null in tests, so we must check for it :(.
+  if (delegate) {
+    // Mark the web contents as pending resume, then immediately do
+    // the resume if the delegate wants it.
+    created->is_resume_pending_ = true;
+    if (delegate->ShouldResumeRequestsForCreatedWindow())
+      created->ResumeLoadingCreatedWebContents();
+
+    base::WeakPtr<WebContentsImpl> weak_created =
+        created->weak_factory_.GetWeakPtr();
+    delegate->AddNewContents(this, std::move(owned_created), disposition,
+                             initial_rect, user_gesture, nullptr);
+    // The delegate may delete |created| during AddNewContents().
+    if (!weak_created)
+      return;
   }
+
+  RenderWidgetHostImpl* rwh = created->GetMainFrame()->GetRenderWidgetHost();
+  DCHECK_EQ(main_frame_widget_route_id, rwh->GetRoutingID());
+  rwh->Send(new WidgetMsg_SetBounds_ACK(rwh->GetRoutingID()));
 }
 
 void WebContentsImpl::ShowCreatedWidget(int process_id,
@@ -2945,7 +2963,7 @@
   render_widget_host_impl->set_allow_privileged_mouse_lock(is_fullscreen);
 }
 
-std::unique_ptr<WebContents> WebContentsImpl::GetCreatedWindow(
+std::unique_ptr<WebContentsImpl> WebContentsImpl::GetCreatedWindow(
     int process_id,
     int main_frame_widget_route_id) {
   auto key = GlobalRoutingID(process_id, main_frame_widget_route_id);
@@ -2956,14 +2974,12 @@
   if (iter == pending_contents_.end())
     return nullptr;
 
-  std::unique_ptr<WebContents> new_contents = std::move(iter->second);
+  std::unique_ptr<WebContentsImpl> new_contents = std::move(iter->second);
   pending_contents_.erase(key);
-  WebContentsImpl* raw_new_contents =
-      static_cast<WebContentsImpl*>(new_contents.get());
-  RemoveDestructionObserver(raw_new_contents);
+  RemoveDestructionObserver(new_contents.get());
 
   // Don't initialize the guest WebContents immediately.
-  if (BrowserPluginGuest::IsGuest(raw_new_contents))
+  if (BrowserPluginGuest::IsGuest(new_contents.get()))
     return new_contents;
 
   if (!new_contents->GetMainFrame()->GetProcess()->IsInitializedAndNotDead() ||
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 588a42f6..83f28751 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -1319,8 +1319,9 @@
   // Finds the new WebContentsImpl by |main_frame_widget_route_id|, initializes
   // it for renderer-initiated creation, and returns it. Note that this can only
   // be called once as this call also removes it from the internal map.
-  std::unique_ptr<WebContents> GetCreatedWindow(int process_id,
-                                                int main_frame_widget_route_id);
+  std::unique_ptr<WebContentsImpl> GetCreatedWindow(
+      int process_id,
+      int main_frame_widget_route_id);
 
   // Sends a Page message IPC.
   void SendPageMessage(IPC::Message* msg);
@@ -1444,7 +1445,7 @@
 
   // Tracks created WebContentsImpl objects that have not been shown yet. They
   // are identified by the process ID and routing ID passed to CreateNewWindow.
-  std::map<GlobalRoutingID, std::unique_ptr<WebContents>> pending_contents_;
+  std::map<GlobalRoutingID, std::unique_ptr<WebContentsImpl>> pending_contents_;
 
   // This map holds widgets that were created on behalf of the renderer but
   // haven't been shown yet.
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc
index 046668f3..d712e19 100644
--- a/content/browser/web_contents/web_contents_impl_unittest.cc
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -2506,28 +2506,25 @@
 // Test that if a pending contents is deleted before it is shown, we don't
 // crash.
 TEST_F(WebContentsImplTest, PendingContentsDestroyed) {
-  std::unique_ptr<WebContentsImpl> other_contents(
-      static_cast<WebContentsImpl*>(CreateTestWebContents().release()));
-  content::TestWebContents* raw_other_contents =
-      static_cast<TestWebContents*>(other_contents.get());
+  auto other_contents = base::WrapUnique(
+      static_cast<TestWebContents*>(CreateTestWebContents().release()));
+  content::TestWebContents* test_web_contents = other_contents.get();
   contents()->AddPendingContents(std::move(other_contents));
   RenderWidgetHost* widget =
-      raw_other_contents->GetMainFrame()->GetRenderWidgetHost();
+      test_web_contents->GetMainFrame()->GetRenderWidgetHost();
   int process_id = widget->GetProcess()->GetID();
   int widget_id = widget->GetRoutingID();
 
   // TODO(erikchen): Fix ownership semantics of WebContents. Nothing should be
   // able to delete it beside from the owner. https://crbug.com/832879.
-  delete raw_other_contents;
+  delete test_web_contents;
   EXPECT_EQ(nullptr, contents()->GetCreatedWindow(process_id, widget_id));
 }
 
 TEST_F(WebContentsImplTest, PendingContentsShown) {
-  std::unique_ptr<WebContents> other_contents(
-      static_cast<WebContents*>(CreateTestWebContents().release()));
-  content::WebContents* raw_other_contents = other_contents.get();
-  content::TestWebContents* test_web_contents =
-      static_cast<content::TestWebContents*>(other_contents.get());
+  auto other_contents = base::WrapUnique(
+      static_cast<TestWebContents*>(CreateTestWebContents().release()));
+  content::TestWebContents* test_web_contents = other_contents.get();
   contents()->AddPendingContents(std::move(other_contents));
 
   RenderWidgetHost* widget =
@@ -2536,7 +2533,7 @@
   int widget_id = widget->GetRoutingID();
 
   // The first call to GetCreatedWindow pops it off the pending list.
-  EXPECT_EQ(raw_other_contents,
+  EXPECT_EQ(test_web_contents,
             contents()->GetCreatedWindow(process_id, widget_id).get());
   // A second call should return nullptr, verifying that it's been forgotten.
   EXPECT_EQ(nullptr, contents()->GetCreatedWindow(process_id, widget_id));
diff --git a/content/browser/webauth/authenticator_impl.cc b/content/browser/webauth/authenticator_impl.cc
index 5170b50e..f2a17d16 100644
--- a/content/browser/webauth/authenticator_impl.cc
+++ b/content/browser/webauth/authenticator_impl.cc
@@ -357,7 +357,8 @@
   common_info->id = response_data.GetId();
   response->info = std::move(common_info);
 
-  // The transport used for the registration is always first in the list.
+  // The transport list must not contain duplicates but the order doesn't matter
+  // because Blink will sort the resulting strings before returning them.
   std::vector<device::FidoTransportProtocol> transports = {
       response_data.transport_used()};
   // If the attestation certificate specifies that the token supports any other
@@ -612,7 +613,10 @@
           request_->GetWeakPtr()) /* request_callback */,
       base::BindRepeating(
           &device::FidoRequestHandlerBase::PowerOnBluetoothAdapter,
-          request_->GetWeakPtr()) /* bluetooth_adapter_power_on_callback */);
+          request_->GetWeakPtr()) /* bluetooth_adapter_power_on_callback */,
+      base::BindRepeating(
+          &device::FidoRequestHandlerBase::InitiatePairingWithDevice,
+          request_->GetWeakPtr()) /* ble_pairing_callback*/);
   request_->set_observer(request_delegate_.get());
 
   request_->SetPlatformAuthenticatorOrMarkUnavailable(
@@ -703,7 +707,10 @@
           request_->GetWeakPtr()) /* request_callback */,
       base::BindRepeating(
           &device::FidoRequestHandlerBase::PowerOnBluetoothAdapter,
-          request_->GetWeakPtr()) /* bluetooth_adapter_power_on_callback */);
+          request_->GetWeakPtr()) /* bluetooth_adapter_power_on_callback */,
+      base::BindRepeating(
+          &device::FidoRequestHandlerBase::InitiatePairingWithDevice,
+          request_->GetWeakPtr()) /* ble_pairing_callback*/);
   request_->set_observer(request_delegate_.get());
 
   request_->SetPlatformAuthenticatorOrMarkUnavailable(
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc
index 03dd4fd9..bc926e7 100644
--- a/content/browser/webauth/authenticator_impl_unittest.cc
+++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -1124,7 +1124,9 @@
   void RegisterActionCallbacks(
       base::OnceClosure cancel_callback,
       device::FidoRequestHandlerBase::RequestCallback request_callback,
-      base::RepeatingClosure bluetooth_adapter_power_on_callback) override {
+      base::RepeatingClosure bluetooth_adapter_power_on_callback,
+      device::FidoRequestHandlerBase::BlePairingCallback ble_pairing_callback)
+      override {
     ASSERT_TRUE(action_callbacks_registered_callback_)
         << "RegisterActionCallbacks called twice.";
     std::move(action_callbacks_registered_callback_).Run();
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
index 7019d1f3..66c1b21 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
@@ -649,8 +649,7 @@
     return E_FAIL;
   }
 
-  data_.Initialize(base::File(duplicate_handle));
-  if (!data_.IsValid()) {
+  if (!data_.Initialize(base::File(duplicate_handle))) {
     LogFontProxyError(MAPPED_FILE_FAILED);
     return E_FAIL;
   }
diff --git a/content/common/input/input_event_struct_traits.cc b/content/common/input/input_event_struct_traits.cc
index 1603ef6..c88261f 100644
--- a/content/common/input/input_event_struct_traits.cc
+++ b/content/common/input/input_event_struct_traits.cc
@@ -135,8 +135,6 @@
         default:
           break;
         case blink::WebInputEvent::Type::kGestureTapDown:
-        case blink::WebInputEvent::Type::kGestureTapUnconfirmed:
-        case blink::WebInputEvent::Type::kGestureDoubleTap:
           gesture_event->data.tap_down.width =
               gesture_data->contact_size->width();
           gesture_event->data.tap_down.height =
@@ -149,10 +147,13 @@
               gesture_data->contact_size->height();
           break;
         case blink::WebInputEvent::Type::kGestureTap:
+        case blink::WebInputEvent::Type::kGestureTapUnconfirmed:
+        case blink::WebInputEvent::Type::kGestureDoubleTap:
           gesture_event->data.tap.width = gesture_data->contact_size->width();
           gesture_event->data.tap.height = gesture_data->contact_size->height();
           break;
         case blink::WebInputEvent::Type::kGestureLongPress:
+        case blink::WebInputEvent::Type::kGestureLongTap:
           gesture_event->data.long_press.width =
               gesture_data->contact_size->width();
           gesture_event->data.long_press.height =
@@ -434,6 +435,7 @@
           content::mojom::TapData::New(gesture_event->data.tap.tap_count);
       break;
     case blink::WebInputEvent::Type::kGestureLongPress:
+    case blink::WebInputEvent::Type::kGestureLongTap:
       gesture_data->contact_size =
           gfx::Size(gesture_event->data.long_press.width,
                     gesture_event->data.long_press.height);
diff --git a/content/public/browser/authenticator_request_client_delegate.cc b/content/public/browser/authenticator_request_client_delegate.cc
index 72a0ab7..230f8a5 100644
--- a/content/public/browser/authenticator_request_client_delegate.cc
+++ b/content/public/browser/authenticator_request_client_delegate.cc
@@ -22,7 +22,8 @@
 void AuthenticatorRequestClientDelegate::RegisterActionCallbacks(
     base::OnceClosure cancel_callback,
     device::FidoRequestHandlerBase::RequestCallback request_callback,
-    base::RepeatingClosure bluetooth_adapter_power_on_callback) {}
+    base::RepeatingClosure bluetooth_adapter_power_on_callback,
+    device::FidoRequestHandlerBase::BlePairingCallback ble_pairing_callback) {}
 
 bool AuthenticatorRequestClientDelegate::ShouldPermitIndividualAttestation(
     const std::string& relying_party_id) {
@@ -70,4 +71,7 @@
     base::StringPiece old_authenticator_id,
     std::string new_authenticator_id) {}
 
+void AuthenticatorRequestClientDelegate::FidoAuthenticatorPairingModeChanged(
+    base::StringPiece authenticator_id) {}
+
 }  // namespace content
diff --git a/content/public/browser/authenticator_request_client_delegate.h b/content/public/browser/authenticator_request_client_delegate.h
index b4be9c0..49ddb66 100644
--- a/content/public/browser/authenticator_request_client_delegate.h
+++ b/content/public/browser/authenticator_request_client_delegate.h
@@ -54,7 +54,8 @@
   virtual void RegisterActionCallbacks(
       base::OnceClosure cancel_callback,
       device::FidoRequestHandlerBase::RequestCallback request_callback,
-      base::RepeatingClosure bluetooth_adapter_power_on_callback);
+      base::RepeatingClosure bluetooth_adapter_power_on_callback,
+      device::FidoRequestHandlerBase::BlePairingCallback ble_pairing_callback);
 
   // Returns true if the given relying party ID is permitted to receive
   // individual attestation certificates. This:
@@ -117,6 +118,8 @@
   void FidoAuthenticatorRemoved(base::StringPiece device_id) override;
   void FidoAuthenticatorIdChanged(base::StringPiece old_authenticator_id,
                                   std::string new_authenticator_id) override;
+  void FidoAuthenticatorPairingModeChanged(
+      base::StringPiece authenticator_id) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(AuthenticatorRequestClientDelegate);
diff --git a/content/public/browser/permission_type.h b/content/public/browser/permission_type.h
index 1c256ae..a3a3cf5 100644
--- a/content/public/browser/permission_type.h
+++ b/content/public/browser/permission_type.h
@@ -29,6 +29,7 @@
   CLIPBOARD_READ = 14,
   CLIPBOARD_WRITE = 15,
   PAYMENT_HANDLER = 16,
+  BACKGROUND_FETCH = 17,
 
   // Always keep this at the end.
   NUM,
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc
index 29f79761..022e004 100644
--- a/content/public/test/browser_test_base.cc
+++ b/content/public/test/browser_test_base.cc
@@ -329,6 +329,7 @@
   base::TaskScheduler::Create("Browser");
   DCHECK(!field_trial_list_);
   field_trial_list_ = SetUpFieldTrialsAndFeatureList();
+  StartBrowserTaskScheduler();
   BrowserTaskExecutor::Create();
   // TODO(phajdan.jr): Check return code, http://crbug.com/374738 .
   BrowserMain(params);
diff --git a/content/renderer/gpu/gpu_benchmarking_extension.cc b/content/renderer/gpu/gpu_benchmarking_extension.cc
index 7f9420a..cfa8bb46 100644
--- a/content/renderer/gpu/gpu_benchmarking_extension.cc
+++ b/content/renderer/gpu/gpu_benchmarking_extension.cc
@@ -65,7 +65,7 @@
 // XpsObjectModel.h indirectly includes <wincrypt.h> which is
 // incompatible with Chromium's OpenSSL. By including wincrypt_shim.h
 // first, problems are avoided.
-#include "crypto/wincrypt_shim.h"
+#include "base/win/wincrypt_shim.h"
 
 #include <XpsObjectModel.h>
 #include <objbase.h>
@@ -291,7 +291,8 @@
                        float start_y,
                        float fling_velocity,
                        bool precise_scrolling_deltas,
-                       bool scroll_by_page) {
+                       bool scroll_by_page,
+                       bool cursor_visible) {
   gfx::Rect rect = context->render_view_impl()->GetWidget()->ViewRect();
   rect -= rect.OffsetFromOrigin();
   if (!rect.Contains(start_x, start_y)) {
@@ -309,7 +310,7 @@
     mouseMove.SetPositionInWidget(start_x, start_y);
     context->web_view()->HandleInputEvent(
         blink::WebCoalescedInputEvent(mouseMove));
-    context->web_view()->SetCursorVisibilityState(true);
+    context->web_view()->SetCursorVisibilityState(cursor_visible);
   }
 
   scoped_refptr<CallbackAndContext> callback_and_context =
@@ -669,6 +670,7 @@
   float speed_in_pixels_s = 800;
   bool precise_scrolling_deltas = true;
   bool scroll_by_page = false;
+  bool cursor_visible = true;
 
   if (!GetOptionalArg(args, &pixels_to_scroll) ||
       !GetOptionalArg(args, &callback) || !GetOptionalArg(args, &start_x) ||
@@ -677,7 +679,8 @@
       !GetOptionalArg(args, &direction) ||
       !GetOptionalArg(args, &speed_in_pixels_s) ||
       !GetOptionalArg(args, &precise_scrolling_deltas) ||
-      !GetOptionalArg(args, &scroll_by_page)) {
+      !GetOptionalArg(args, &scroll_by_page) ||
+      !GetOptionalArg(args, &cursor_visible)) {
     return false;
   }
 
@@ -689,10 +692,10 @@
          gesture_source_type == SyntheticGestureParams::MOUSE_INPUT);
 
   EnsureRemoteInterface();
-  return BeginSmoothScroll(&context, args, input_injector_, pixels_to_scroll,
-                           callback, gesture_source_type, direction,
-                           speed_in_pixels_s, true, start_x, start_y, 0,
-                           precise_scrolling_deltas, scroll_by_page);
+  return BeginSmoothScroll(
+      &context, args, input_injector_, pixels_to_scroll, callback,
+      gesture_source_type, direction, speed_in_pixels_s, true, start_x, start_y,
+      0, precise_scrolling_deltas, scroll_by_page, cursor_visible);
 }
 
 bool GpuBenchmarking::SmoothDrag(gin::Arguments* args) {
@@ -758,11 +761,11 @@
     fling_velocity = 1000;
 
   EnsureRemoteInterface();
-  return BeginSmoothScroll(&context, args, input_injector_, -pixels_to_scroll,
-                           callback, gesture_source_type, direction,
-                           speed_in_pixels_s, false, start_x, start_y,
-                           fling_velocity, true /* precise_scrolling_deltas */,
-                           false /* scroll_by_page */);
+  return BeginSmoothScroll(
+      &context, args, input_injector_, -pixels_to_scroll, callback,
+      gesture_source_type, direction, speed_in_pixels_s, false, start_x,
+      start_y, fling_velocity, true /* precise_scrolling_deltas */,
+      false /* scroll_by_page */, true /* cursor_visible */);
 }
 
 bool GpuBenchmarking::ScrollBounce(gin::Arguments* args) {
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index f0266e8..eb2d770 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -1868,9 +1868,11 @@
 
 RenderWidgetFullscreenPepper* RenderFrameImpl::CreatePepperFullscreenContainer(
     PepperPluginInstanceImpl* plugin) {
-  GURL active_url;
-  if (render_view()->webview())
-    active_url = render_view()->GetURLForGraphicsContext3D();
+  // Get the URL of the main frame if possible.
+  blink::WebURL main_frame_url;
+  WebFrame* main_frame = render_view()->webview()->MainFrame();
+  if (main_frame->IsWebLocalFrame())
+    main_frame_url = main_frame->ToWebLocalFrame()->GetDocument().Url();
 
   mojom::WidgetPtr widget_channel;
   mojom::WidgetRequest widget_channel_request =
@@ -1892,7 +1894,7 @@
   // web ScreenInfo or the original ScreenInfo here.
   RenderWidgetFullscreenPepper* widget = RenderWidgetFullscreenPepper::Create(
       fullscreen_widget_routing_id, std::move(show_callback),
-      GetRenderWidget()->compositor_deps(), plugin, active_url,
+      GetRenderWidget()->compositor_deps(), plugin, std::move(main_frame_url),
       GetRenderWidget()->GetWebScreenInfo(), std::move(widget_channel_request));
   // TODO(nick): The show() handshake seems like unnecessary complexity here,
   // since there's no real delay between CreateFullscreenWidget and
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 89e48f2d..6b411b19 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1165,15 +1165,6 @@
     BrowserPluginManager::Get()->UpdateFocusState();
 }
 
-GURL RenderViewImpl::GetURLForGraphicsContext3DForWidget() {
-  DCHECK(webview());
-  WebFrame* main_frame = webview()->MainFrame();
-  if (main_frame && main_frame->IsWebLocalFrame())
-    return GURL(main_frame->ToWebLocalFrame()->GetDocument().Url());
-  else
-    return GURL("chrome://gpu/RenderViewImpl::CreateGraphicsContext3D");
-}
-
 void RenderViewImpl::DidCommitCompositorFrameForWidget() {
   for (auto& observer : observers_)
     observer.DidCommitCompositorFrame();
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 70c2159..bb14a5d 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -394,7 +394,6 @@
   void ScrollFocusedNodeIntoViewForWidget() override;
   void DidReceiveSetFocusEventForWidget() override;
   void DidChangeFocusForWidget() override;
-  GURL GetURLForGraphicsContext3DForWidget() override;
   void DidCommitCompositorFrameForWidget() override;
   void DidCompletePageScaleAnimationForWidget() override;
   void ResizeWebWidgetForWidget(
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 72f38f1..a24f837 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -979,8 +979,12 @@
                                                         std::move(client_info));
   layer_tree_view_->SetRenderFrameObserver(
       std::move(render_frame_metadata_observer));
+  GURL url = GetWebWidget()->GetURLForDebugTrace();
+  // The |url| is not always available, fallback to a fixed string.
+  if (url.is_empty())
+    url = GURL("chrome://gpu/RenderWidget::RequestNewLayerTreeFrameSink");
   RenderThreadImpl::current()->RequestNewLayerTreeFrameSink(
-      routing_id_, frame_swap_message_queue_, GetURLForGraphicsContext3D(),
+      routing_id_, frame_swap_message_queue_, std::move(url),
       std::move(callback), std::move(client_request), std::move(ptr));
 }
 
@@ -1436,8 +1440,6 @@
         render_thread->GetWebMainThreadScheduler(), should_generate_frame_sink);
   }
 
-  UpdateURLForCompositorUkm();
-
   return layer_tree_view_.get();
 }
 
@@ -2142,12 +2144,6 @@
   }
 }
 
-GURL RenderWidget::GetURLForGraphicsContext3D() {
-  if (owner_delegate_)
-    return owner_delegate_->GetURLForGraphicsContext3DForWidget();
-  return GURL();
-}
-
 void RenderWidget::SetHidden(bool hidden) {
   if (is_hidden_ == hidden)
     return;
@@ -3143,20 +3139,6 @@
   OnSynchronizeVisualProperties(visual_properties);
 }
 
-void RenderWidget::UpdateURLForCompositorUkm() {
-  DCHECK(layer_tree_view_);
-  blink::WebFrameWidget* frame_widget = GetFrameWidget();
-  if (!frame_widget)
-    return;
-
-  auto* render_frame = RenderFrameImpl::FromWebFrame(frame_widget->LocalRoot());
-  if (!render_frame->IsMainFrame())
-    return;
-
-  layer_tree_view_->SetURLForUkm(
-      render_frame->GetWebFrame()->GetDocument().Url());
-}
-
 blink::WebLocalFrame* RenderWidget::GetFocusedWebLocalFrameInWidget() const {
   if (auto* frame_widget = GetFrameWidget())
     return frame_widget->FocusedWebLocalFrameInWidget();
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index a4e2bd18..ff560a1 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -68,8 +68,6 @@
 #include "ui/gfx/range/range.h"
 #include "ui/surface/transport_dib.h"
 
-class GURL;
-
 namespace IPC {
 class SyncMessageFilter;
 }
@@ -546,10 +544,6 @@
   // Notify subclasses that we initiated the paint operation.
   virtual void DidInitiatePaint() {}
 
-  // Gets the current URL or a placeholder constant for creating 3d contexts and
-  // attributing them back to a URL.
-  virtual GURL GetURLForGraphicsContext3D();
-
   // RenderWidget IPC message handler that can be overridden by subclasses.
   virtual void OnSynchronizeVisualProperties(const VisualProperties& params);
 
@@ -745,12 +739,6 @@
 #endif
   void RecordTimeToFirstActivePaint();
 
-  // Updates the URL used by the compositor for keying UKM metrics.
-  // Note that this uses the main frame's URL and only if its available in the
-  // current process. In the case where it is not available, no metrics will be
-  // recorded.
-  void UpdateURLForCompositorUkm();
-
   // This method returns the WebLocalFrame which is currently focused and
   // belongs to the frame tree associated with this RenderWidget.
   blink::WebLocalFrame* GetFocusedWebLocalFrameInWidget() const;
diff --git a/content/renderer/render_widget_fullscreen_pepper.cc b/content/renderer/render_widget_fullscreen_pepper.cc
index 28b8e28..ebb5925 100644
--- a/content/renderer/render_widget_fullscreen_pepper.cc
+++ b/content/renderer/render_widget_fullscreen_pepper.cc
@@ -130,9 +130,9 @@
 // necessary.
 class PepperWidget : public WebWidget {
  public:
-  explicit PepperWidget(RenderWidgetFullscreenPepper* widget)
-      : widget_(widget) {
-  }
+  explicit PepperWidget(RenderWidgetFullscreenPepper* widget,
+                        const blink::WebURL& local_main_frame_url)
+      : widget_(widget), local_main_frame_url_(local_main_frame_url) {}
 
   virtual ~PepperWidget() {}
 
@@ -243,9 +243,12 @@
                   : WebInputEventResult::kNotHandled;
   }
 
+  blink::WebURL GetURLForDebugTrace() override { return local_main_frame_url_; }
+
  private:
   RenderWidgetFullscreenPepper* widget_;
   WebSize size_;
+  blink::WebURL local_main_frame_url_;
 
   DISALLOW_COPY_AND_ASSIGN(PepperWidget);
 };
@@ -258,16 +261,16 @@
     RenderWidget::ShowCallback show_callback,
     CompositorDependencies* compositor_deps,
     PepperPluginInstanceImpl* plugin,
-    const GURL& active_url,
+    const blink::WebURL& local_main_frame_url,
     const ScreenInfo& screen_info,
     mojom::WidgetRequest widget_request) {
   DCHECK_NE(MSG_ROUTING_NONE, routing_id);
   DCHECK(show_callback);
   scoped_refptr<RenderWidgetFullscreenPepper> widget(
       new RenderWidgetFullscreenPepper(routing_id, compositor_deps, plugin,
-                                       active_url, screen_info,
-                                       std::move(widget_request)));
-  widget->Init(std::move(show_callback), new PepperWidget(widget.get()));
+                                       screen_info, std::move(widget_request)));
+  widget->Init(std::move(show_callback),
+               new PepperWidget(widget.get(), local_main_frame_url));
   widget->AddRef();
   return widget.get();
 }
@@ -276,7 +279,6 @@
     int32_t routing_id,
     CompositorDependencies* compositor_deps,
     PepperPluginInstanceImpl* plugin,
-    const GURL& active_url,
     const ScreenInfo& screen_info,
     mojom::WidgetRequest widget_request)
     : RenderWidget(routing_id,
@@ -288,7 +290,6 @@
                    false,
                    false,
                    std::move(widget_request)),
-      active_url_(active_url),
       plugin_(plugin),
       layer_(nullptr),
       mouse_lock_dispatcher_(new FullscreenMouseLockDispatcher(this)) {}
@@ -383,10 +384,6 @@
   UpdateLayerBounds();
 }
 
-GURL RenderWidgetFullscreenPepper::GetURLForGraphicsContext3D() {
-  return active_url_;
-}
-
 void RenderWidgetFullscreenPepper::UpdateLayerBounds() {
   if (!layer_)
     return;
diff --git a/content/renderer/render_widget_fullscreen_pepper.h b/content/renderer/render_widget_fullscreen_pepper.h
index 548bc99..c6b17e5 100644
--- a/content/renderer/render_widget_fullscreen_pepper.h
+++ b/content/renderer/render_widget_fullscreen_pepper.h
@@ -35,7 +35,7 @@
       RenderWidget::ShowCallback show_callback,
       CompositorDependencies* compositor_deps,
       PepperPluginInstanceImpl* plugin,
-      const GURL& active_url,
+      const blink::WebURL& local_main_frame_url,
       const ScreenInfo& screen_info,
       mojom::WidgetRequest widget_request);
 
@@ -61,7 +61,6 @@
   RenderWidgetFullscreenPepper(int32_t routing_id,
                                CompositorDependencies* compositor_deps,
                                PepperPluginInstanceImpl* plugin,
-                               const GURL& active_url,
                                const ScreenInfo& screen_info,
                                mojom::WidgetRequest widget_request);
   ~RenderWidgetFullscreenPepper() override;
@@ -72,15 +71,9 @@
   void OnSynchronizeVisualProperties(
       const VisualProperties& visual_properties) override;
 
-  // RenderWidget overrides.
-  GURL GetURLForGraphicsContext3D() override;
-
  private:
   void UpdateLayerBounds();
 
-  // URL that is responsible for this widget, passed to ggl::CreateViewContext.
-  GURL active_url_;
-
   // The plugin instance this widget wraps.
   PepperPluginInstanceImpl* plugin_;
 
diff --git a/content/renderer/render_widget_owner_delegate.h b/content/renderer/render_widget_owner_delegate.h
index 0b4a8af..35393e7 100644
--- a/content/renderer/render_widget_owner_delegate.h
+++ b/content/renderer/render_widget_owner_delegate.h
@@ -83,9 +83,6 @@
   // Called after RenderWidget changes focus.
   virtual void DidChangeFocusForWidget() = 0;
 
-  // Called to get the current URL if it exists or a hardcoded fallback.
-  virtual GURL GetURLForGraphicsContext3DForWidget() = 0;
-
   // Called when the RenderWidget handles
   // LayerTreeViewDelegate::DidCommitCompositorFrame().
   virtual void DidCommitCompositorFrameForWidget() = 0;
diff --git a/content/renderer/render_widget_unittest.cc b/content/renderer/render_widget_unittest.cc
index cd4ee4a..9762099 100644
--- a/content/renderer/render_widget_unittest.cc
+++ b/content/renderer/render_widget_unittest.cc
@@ -129,7 +129,12 @@
   DISALLOW_COPY_AND_ASSIGN(MockHandledEventCallback);
 };
 
-class MockWebWidget : public blink::WebWidget {
+class StubWebWidget : public blink::WebWidget {
+ public:
+  blink::WebURL GetURLForDebugTrace() override { return {}; }
+};
+
+class MockWebWidget : public StubWebWidget {
  public:
   MOCK_METHOD0(DispatchBufferedTouchEvents, blink::WebInputEventResult());
   MOCK_METHOD1(
@@ -483,7 +488,6 @@
   void ScrollFocusedNodeIntoViewForWidget() override {}
   void DidReceiveSetFocusEventForWidget() override {}
   void DidChangeFocusForWidget() override {}
-  GURL GetURLForGraphicsContext3DForWidget() override { return {}; }
   void DidCommitCompositorFrameForWidget() override {}
   void DidCompletePageScaleAnimationForWidget() override {}
   void ResizeWebWidgetForWidget(
diff --git a/content/shell/browser/layout_test/layout_test_message_filter.cc b/content/shell/browser/layout_test/layout_test_message_filter.cc
index 2c183a94..483235a5 100644
--- a/content/shell/browser/layout_test/layout_test_message_filter.cc
+++ b/content/shell/browser/layout_test/layout_test_message_filter.cc
@@ -220,6 +220,8 @@
   } else if (name == "accelerometer" || name == "gyroscope" ||
              name == "magnetometer" || name == "ambient-light-sensor") {
     type = PermissionType::SENSORS;
+  } else if (name == "background-fetch") {
+    type = PermissionType::BACKGROUND_FETCH;
   } else {
     NOTREACHED();
     type = PermissionType::NOTIFICATIONS;
diff --git a/content/shell/browser/shell_permission_manager.cc b/content/shell/browser/shell_permission_manager.cc
index 3cfcbaa..60761883 100644
--- a/content/shell/browser/shell_permission_manager.cc
+++ b/content/shell/browser/shell_permission_manager.cc
@@ -22,11 +22,12 @@
          permission == PermissionType::MIDI ||
          permission == PermissionType::SENSORS ||
          permission == PermissionType::PAYMENT_HANDLER ||
-         // Background sync browser tests require permission to be granted by
-         // default.
+         // Background Sync and Background Fetch browser tests require
+         // permission to be granted by default.
          // TODO(nsatragno): add a command line flag so that it's only granted
          // for tests.
          permission == PermissionType::BACKGROUND_SYNC ||
+         permission == PermissionType::BACKGROUND_FETCH ||
          permission == PermissionType::ACCESSIBILITY_EVENTS;
 }
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 35d3405..0b1ea0a 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -758,6 +758,7 @@
     # These tests have incorrect threading (https://crbug.com/860547).
     #"../browser/fileapi/file_system_url_loader_factory_browsertest.cc",
 
+    "../browser/fileapi/file_system_chooser_browsertest.cc",
     "../browser/fileapi/fileapi_browsertest.cc",
     "../browser/find_request_manager_browsertest.cc",
     "../browser/font_unique_name_lookup/font_unique_name_browsertest.cc",
diff --git a/content/test/data/accessibility/html/label-with-presentational-child-expected-blink.txt b/content/test/data/accessibility/html/label-with-presentational-child-expected-blink.txt
new file mode 100644
index 0000000..55fcd78
--- /dev/null
+++ b/content/test/data/accessibility/html/label-with-presentational-child-expected-blink.txt
@@ -0,0 +1,16 @@
+rootWebArea
+++genericContainer
+++++textField name='foo'
+++++++genericContainer
+++++labelText
+++++++genericContainer name='foo'
+++++++++genericContainer name='bar'
+++++++++++staticText name='baz'
+++++++++++++inlineTextBox name='baz'
+++++lineBreak name='<newline>'
+++++textField name='bar'
+++++++genericContainer
+++++labelText
+++++++genericContainer name='bar'
+++++++++staticText name='baz'
+++++++++++inlineTextBox name='baz'
diff --git a/content/test/data/accessibility/html/label-with-presentational-child.html b/content/test/data/accessibility/html/label-with-presentational-child.html
new file mode 100644
index 0000000..3805bef
--- /dev/null
+++ b/content/test/data/accessibility/html/label-with-presentational-child.html
@@ -0,0 +1,17 @@
+<html>
+<body>
+<input id="test1" />
+<label for="test1">
+  <span role="presentation" aria-label="foo">
+    <span aria-label="bar">baz</span>
+  </span>
+</label>
+<br />
+<input id="test2" />
+  <label for="test2">
+  <span role="presentation">
+    <span aria-label="bar">baz</span>
+  </span>
+</label>
+</body>
+</html>
diff --git a/content/test/data/media/mediarecorder_test.html b/content/test/data/media/mediarecorder_test.html
index 3b7e22c..2d7a538f5 100644
--- a/content/test/data/media/mediarecorder_test.html
+++ b/content/test/data/media/mediarecorder_test.html
@@ -501,7 +501,7 @@
 // Tests that MediaRecorder can record a 2 Channel audio stream.
 function testTwoChannelAudio() {
   var audioSize = 0;
-  var context = new OfflineAudioContext(2, NUM_SAMPLES, SAMPLING_RATE);
+  var context = new AudioContext();
   var oscillator = context.createOscillator();
   oscillator.type = 'sine';
   oscillator.frequency.value = FREQUENCY;
@@ -519,7 +519,6 @@
         };
         recorder.start(0);
         oscillator.start();
-        context.startRendering();
       })
       .then(function() {
         return waitFor('Make sure the recording has data',
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc
index 586e6fb..8347591 100644
--- a/content/test/test_web_contents.cc
+++ b/content/test/test_web_contents.cc
@@ -364,13 +364,12 @@
 }
 
 void TestWebContents::AddPendingContents(
-    std::unique_ptr<WebContents> contents) {
+    std::unique_ptr<WebContentsImpl> contents) {
   // This is normally only done in WebContentsImpl::CreateNewWindow.
   GlobalRoutingID key(
       contents->GetRenderViewHost()->GetProcess()->GetID(),
       contents->GetRenderViewHost()->GetWidget()->GetRoutingID());
-  WebContentsImpl* raw_contents = static_cast<WebContentsImpl*>(contents.get());
-  AddDestructionObserver(raw_contents);
+  AddDestructionObserver(contents.get());
   pending_contents_[key] = std::move(contents);
 }
 
diff --git a/content/test/test_web_contents.h b/content/test/test_web_contents.h
index 32c47b0..a930934b 100644
--- a/content/test/test_web_contents.h
+++ b/content/test/test_web_contents.h
@@ -132,7 +132,7 @@
   }
 
   // Allows us to simulate that a contents was created via CreateNewWindow.
-  void AddPendingContents(std::unique_ptr<WebContents> contents);
+  void AddPendingContents(std::unique_ptr<WebContentsImpl> contents);
 
   // Establish expected arguments for |SetHistoryOffsetAndLength()|. When
   // |SetHistoryOffsetAndLength()| is called, the arguments are compared
diff --git a/crypto/BUILD.gn b/crypto/BUILD.gn
index f8c9ba87..b7e91c73 100644
--- a/crypto/BUILD.gn
+++ b/crypto/BUILD.gn
@@ -67,7 +67,6 @@
     "signature_verifier.h",
     "symmetric_key.cc",
     "symmetric_key.h",
-    "wincrypt_shim.h",
   ]
 
   # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
diff --git a/crypto/scoped_capi_types.h b/crypto/scoped_capi_types.h
index 74e5765..6d2deb9 100644
--- a/crypto/scoped_capi_types.h
+++ b/crypto/scoped_capi_types.h
@@ -11,7 +11,7 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "crypto/wincrypt_shim.h"
+#include "base/win/wincrypt_shim.h"
 
 namespace crypto {
 
diff --git a/device/fido/ble/fido_ble_device.h b/device/fido/ble/fido_ble_device.h
index edc453c..e863620 100644
--- a/device/fido/ble/fido_ble_device.h
+++ b/device/fido/ble/fido_ble_device.h
@@ -48,7 +48,7 @@
 
   // Returns whether or not the underlying BLE device is currently in pairing
   // mode by investigating the advertisement payload.
-  bool IsInPairingMode() const;
+  bool IsInPairingMode() const override;
 
   FidoBleConnection::ReadCallback GetReadCallbackForTesting();
 
diff --git a/device/fido/ble/fido_ble_discovery.cc b/device/fido/ble/fido_ble_discovery.cc
index 8e21dcee..073585e 100644
--- a/device/fido/ble/fido_ble_discovery.cc
+++ b/device/fido/ble/fido_ble_discovery.cc
@@ -68,13 +68,27 @@
 
 void FidoBleDiscovery::DeviceChanged(BluetoothAdapter* adapter,
                                      BluetoothDevice* device) {
-  if (!CheckForExcludedDeviceAndCacheAddress(device) &&
-      base::ContainsKey(device->GetUUIDs(), FidoServiceUUID()) &&
-      !GetDevice(FidoBleDevice::GetId(device->GetAddress()))) {
+  if (CheckForExcludedDeviceAndCacheAddress(device) ||
+      !base::ContainsKey(device->GetUUIDs(), FidoServiceUUID())) {
+    return;
+  }
+
+  const auto device_id = FidoBleDevice::GetId(device->GetAddress());
+  auto* fido_device = GetDevice(device_id);
+  if (!fido_device) {
     VLOG(2) << "Discovered U2F service on existing BLE device: "
             << device->GetAddress();
     AddDevice(std::make_unique<FidoBleDevice>(adapter, device->GetAddress()));
+    return;
   }
+
+  // Our model of FIDO BLE security key assumes that if BLE device is in pairing
+  // mode long enough time without pairing attempt, the device stops advertising
+  // and BluetoothAdapter::DeviceRemoved() is invoked instead of returning back
+  // to regular "non-pairing" mode. As so, we only notify observer when
+  // |fido_device| goes into pairing mode.
+  if (observer() && fido_device->IsInPairingMode())
+    observer()->AuthenticatorPairingModeChanged(this, device_id);
 }
 
 void FidoBleDiscovery::DeviceRemoved(BluetoothAdapter* adapter,
diff --git a/device/fido/ble/fido_ble_discovery_unittest.cc b/device/fido/ble/fido_ble_discovery_unittest.cc
index 1e1a697..2fa673e4 100644
--- a/device/fido/ble/fido_ble_discovery_unittest.cc
+++ b/device/fido/ble/fido_ble_discovery_unittest.cc
@@ -31,10 +31,19 @@
 #include "device/bluetooth/test/bluetooth_test_bluez.h"
 #endif
 
-using ::testing::_;
-
 namespace device {
 
+namespace {
+
+using ::testing::_;
+using TestMockDevice = ::testing::NiceMock<MockBluetoothDevice>;
+
+constexpr char kDeviceName[] = "device_name";
+constexpr char kDeviceAddress[] = "device_address";
+constexpr char kDeviceChangedAddress[] = "device_changed_address";
+constexpr char kAuthenticatorId[] = "ble:device_address";
+constexpr char kAuthenticatorChangedId[] = "ble:device_changed_address";
+
 ACTION_P(ReturnFromAsyncCall, closure) {
   closure.Run();
 }
@@ -43,6 +52,8 @@
   return arg->GetId() == std::string("ble:") + id;
 }
 
+}  // namespace
+
 TEST_F(BluetoothTest, FidoBleDiscoveryNotifyObserverWhenAdapterNotPresent) {
   FidoBleDiscovery discovery;
   MockFidoDiscoveryObserver observer;
@@ -241,12 +252,6 @@
 
 TEST_F(BluetoothTest, DiscoveryDoesNotAddDuplicateDeviceOnAddressChanged) {
   using TestMockDevice = ::testing::NiceMock<MockBluetoothDevice>;
-  static constexpr char kDeviceName[] = "device_name";
-  static constexpr char kDeviceAddress[] = "device_address";
-  static constexpr char kAuthenticatorId[] = "ble:device_address";
-  static constexpr char kDeviceChangedAddress[] = "device_changed_address";
-  static constexpr char kAuthenticatorChangedId[] =
-      "ble:device_changed_address";
 
   MockFidoDiscoveryObserver observer;
   FidoBleDiscovery discovery;
@@ -287,4 +292,42 @@
   EXPECT_TRUE(discovery.GetDevice(kAuthenticatorChangedId));
 }
 
+TEST_F(BluetoothTest, DiscoveryNotifiesObserverWhenDeviceInPairingMode) {
+  FidoBleDiscovery discovery;
+  MockFidoDiscoveryObserver observer;
+  discovery.set_observer(&observer);
+
+  auto mock_adapter =
+      base::MakeRefCounted<::testing::NiceMock<MockBluetoothAdapter>>();
+  EXPECT_CALL(*mock_adapter, IsPresent()).WillOnce(::testing::Return(true));
+
+  auto mock_device = std::make_unique<TestMockDevice>(
+      mock_adapter.get(), 0 /* bluetooth_class */, kDeviceName, kDeviceAddress,
+      false /* paired */, false /* connected */);
+  EXPECT_CALL(*mock_device.get(), GetUUIDs)
+      .WillRepeatedly(::testing::Return(
+          std::vector<BluetoothUUID>{BluetoothUUID(kFidoServiceUUID)}));
+  EXPECT_CALL(*mock_adapter, GetDevice(kDeviceAddress))
+      .WillRepeatedly(::testing::Return(mock_device.get()));
+
+  BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter.get());
+  const auto device_id = FidoBleDevice::GetId(kDeviceAddress);
+  discovery.Start();
+
+  ::testing::InSequence sequence;
+  EXPECT_CALL(observer,
+              AuthenticatorAdded(&discovery, IdMatches(kDeviceAddress)));
+  mock_adapter->NotifyDeviceChanged(mock_device.get());
+
+  EXPECT_CALL(observer, AuthenticatorPairingModeChanged(&discovery, _));
+  // Update device advertisement data so that it represents BLE device in
+  // pairing mode.
+  mock_device->UpdateAdvertisementData(
+      0 /* rssi */, 1 << kLeLimitedDiscoverableModeBit,
+      std::vector<BluetoothUUID>{BluetoothUUID(kFidoServiceUUID)},
+      base::nullopt /* tx_power */, BluetoothDevice::ServiceDataMap(),
+      BluetoothDevice::ManufacturerDataMap());
+  mock_adapter->NotifyDeviceChanged(mock_device.get());
+}
+
 }  // namespace device
diff --git a/device/fido/ble/fido_ble_pairing_delegate.cc b/device/fido/ble/fido_ble_pairing_delegate.cc
index 4b2ec0b..c46a3ac51 100644
--- a/device/fido/ble/fido_ble_pairing_delegate.cc
+++ b/device/fido/ble/fido_ble_pairing_delegate.cc
@@ -88,4 +88,25 @@
   }
 }
 
+void FidoBlePairingDelegate::CancelPairingOnAllKnownDevices(
+    BluetoothAdapter* adapter) {
+  DCHECK(adapter);
+  auto bluetooth_devices = adapter->GetDevices();
+  for (const auto& may_be_paired_device_info : bluetooth_device_pincode_map_) {
+    const auto& authenticator_id = may_be_paired_device_info.first;
+    auto it = std::find_if(
+        bluetooth_devices.begin(), bluetooth_devices.end(),
+        [&authenticator_id](const auto* device) {
+          return FidoBleDevice::GetId(device->GetAddress()) == authenticator_id;
+        });
+    if (it == bluetooth_devices.end())
+      continue;
+
+    // TODO(hongjunchoi): Change this so that this is only invoked when we know
+    // that WebAuthN request was in middle of pairing -- not unconditionally.
+    // See: https://crbug.com/892697
+    (*it)->CancelPairing();
+  }
+}
+
 }  // namespace device
diff --git a/device/fido/ble/fido_ble_pairing_delegate.h b/device/fido/ble/fido_ble_pairing_delegate.h
index a31f4e5..a60db20 100644
--- a/device/fido/ble/fido_ble_pairing_delegate.h
+++ b/device/fido/ble/fido_ble_pairing_delegate.h
@@ -42,9 +42,11 @@
                                 std::string pin_code);
   void ChangeStoredDeviceAddress(const std::string& old_address,
                                  std::string new_address);
+  void CancelPairingOnAllKnownDevices(BluetoothAdapter* adapter);
 
  private:
   friend class FidoBlePairingDelegateTest;
+  friend class FidoBleAdapterManagerTest;
 
   base::flat_map<std::string, std::string> bluetooth_device_pincode_map_;
 
diff --git a/device/fido/ble_adapter_manager.cc b/device/fido/ble_adapter_manager.cc
index e9b3a88..12f2aaf 100644
--- a/device/fido/ble_adapter_manager.cc
+++ b/device/fido/ble_adapter_manager.cc
@@ -7,7 +7,9 @@
 #include <utility>
 
 #include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
+#include "device/fido/ble/fido_ble_device.h"
 
 namespace device {
 
@@ -21,8 +23,10 @@
   if (adapter_powered_on_programmatically_)
     SetAdapterPower(false /* set_power_on */);
 
-  if (adapter_)
+  if (adapter_) {
     adapter_->RemoveObserver(this);
+    pairing_delegate_.CancelPairingOnAllKnownDevices(adapter_.get());
+  }
 }
 
 void BleAdapterManager::SetAdapterPower(bool set_power_on) {
@@ -32,11 +36,54 @@
   adapter_->SetPowered(set_power_on, base::DoNothing(), base::DoNothing());
 }
 
+void BleAdapterManager::InitiatePairing(std::string authenticator_id,
+                                        std::string pin_code,
+                                        base::OnceClosure success_callback,
+                                        base::OnceClosure error_callback) {
+  DCHECK(adapter_);
+  auto device_list = adapter_->GetDevices();
+  auto device_it = std::find_if(
+      device_list.begin(), device_list.end(),
+      [&authenticator_id](const auto& bluetooth_device) {
+        return FidoBleDevice::GetId(bluetooth_device->GetAddress()) ==
+               authenticator_id;
+      });
+
+  if (device_it == device_list.end() ||
+      !request_handler_->HasAuthenticator(authenticator_id)) {
+    std::move(error_callback).Run();
+    return;
+  }
+
+  pairing_delegate_.StoreBlePinCodeForDevice(std::move(authenticator_id),
+                                             std::move(pin_code));
+
+  auto failure_callback = base::BindOnce(
+      [](base::OnceClosure callback,
+         BluetoothDevice::ConnectErrorCode error_code) {
+        std::move(callback).Run();
+      },
+      std::move(error_callback));
+
+  (*device_it)
+      ->Pair(&pairing_delegate_,
+             base::AdaptCallbackForRepeating(std::move(success_callback)),
+             base::AdaptCallbackForRepeating(std::move(failure_callback)));
+}
+
 void BleAdapterManager::AdapterPoweredChanged(BluetoothAdapter* adapter,
                                               bool powered) {
   request_handler_->OnBluetoothAdapterPowerChanged(powered);
 }
 
+void BleAdapterManager::DeviceAddressChanged(BluetoothAdapter* adapter,
+                                             BluetoothDevice* device,
+                                             const std::string& old_address) {
+  pairing_delegate_.ChangeStoredDeviceAddress(
+      FidoBleDevice::GetId(old_address),
+      FidoBleDevice::GetId(device->GetAddress()));
+}
+
 void BleAdapterManager::Start(scoped_refptr<BluetoothAdapter> adapter) {
   DCHECK(!adapter_);
   adapter_ = std::move(adapter);
diff --git a/device/fido/ble_adapter_manager.h b/device/fido/ble_adapter_manager.h
index 0990b0d..90ac26c9 100644
--- a/device/fido/ble_adapter_manager.h
+++ b/device/fido/ble_adapter_manager.h
@@ -5,11 +5,16 @@
 #ifndef DEVICE_FIDO_BLE_ADAPTER_MANAGER_H_
 #define DEVICE_FIDO_BLE_ADAPTER_MANAGER_H_
 
+#include <string>
+
+#include "base/callback.h"
 #include "base/component_export.h"
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "device/bluetooth/bluetooth_adapter.h"
+#include "device/bluetooth/bluetooth_device.h"
+#include "device/fido/ble/fido_ble_pairing_delegate.h"
 #include "device/fido/fido_request_handler_base.h"
 
 namespace device {
@@ -17,26 +22,34 @@
 class COMPONENT_EXPORT(DEVICE_FIDO) BleAdapterManager
     : public BluetoothAdapter::Observer {
  public:
-  // Handles notifying |request_handler| when BluetoothAdapter is powered on and
-  // off. Exposes API for |request_handler| to power on BluetoothAdapter
-  // programmatically, and if BluetoothAdapter was powered on programmatically,
-  // powers off BluetoothAdapter when |this| goes out of scope.
-  // |request_handler| must outlive |this|.
+  // Handles notifying events from/exposing API's in BluetoothAdapter to
+  // FidoRequestHandler. Namely, handles the following logic:
+  //   a) Exposing API to initiate Bluetooth pairing event.
+  //   b) Exposing API to trigger power Bluetooth adapter on/off.
+  //   c) Notifying FidoRequestHandler when Bluetooth adapter power changes.
   BleAdapterManager(FidoRequestHandlerBase* request_handler);
   ~BleAdapterManager() override;
 
   void SetAdapterPower(bool set_power_on);
+  void InitiatePairing(std::string fido_authenticator_id,
+                       std::string pin_code,
+                       base::OnceClosure success_callback,
+                       base::OnceClosure error_callback);
 
  private:
   friend class FidoBleAdapterManagerTest;
 
   // BluetoothAdapter::Observer:
   void AdapterPoweredChanged(BluetoothAdapter* adapter, bool powered) override;
+  void DeviceAddressChanged(BluetoothAdapter* adapter,
+                            BluetoothDevice* device,
+                            const std::string& old_address) override;
 
   void Start(scoped_refptr<BluetoothAdapter> adapter);
 
   FidoRequestHandlerBase* const request_handler_;
   scoped_refptr<BluetoothAdapter> adapter_;
+  FidoBlePairingDelegate pairing_delegate_;
   bool adapter_powered_on_programmatically_ = false;
 
   base::WeakPtrFactory<BleAdapterManager> weak_factory_;
diff --git a/device/fido/ble_adapter_manager_unittest.cc b/device/fido/ble_adapter_manager_unittest.cc
index fadf3d4..c09e203 100644
--- a/device/fido/ble_adapter_manager_unittest.cc
+++ b/device/fido/ble_adapter_manager_unittest.cc
@@ -4,12 +4,18 @@
 
 #include "device/fido/ble_adapter_manager.h"
 
+#include <map>
 #include <memory>
+#include <utility>
 
+#include "base/bind_helpers.h"
+#include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
 #include "device/bluetooth/test/mock_bluetooth_adapter.h"
+#include "device/bluetooth/test/mock_bluetooth_device.h"
 #include "device/fido/fido_request_handler_base.h"
+#include "device/fido/test_callback_receiver.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -19,6 +25,11 @@
 
 using ::testing::_;
 
+constexpr char kTestBluetoothDeviceAddress[] = "test_device_address";
+constexpr char kTestFidoBleAuthenticatorId[] = "ble:test_device_address";
+constexpr char kTestPinCode[] = "1234";
+constexpr char kTestBluetoothDisplayName[] = "device_name";
+
 class MockTransportAvailabilityObserver
     : public FidoRequestHandlerBase::TransportAvailabilityObserver {
  public:
@@ -36,6 +47,7 @@
   MOCK_METHOD2(FidoAuthenticatorIdChanged,
                void(base::StringPiece old_authenticator_id,
                     std::string new_authenticator_id));
+  MOCK_METHOD1(FidoAuthenticatorPairingModeChanged, void(base::StringPiece));
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockTransportAvailabilityObserver);
@@ -49,9 +61,20 @@
     set_observer(observer);
   }
 
+  void SimulateFidoRequestHandlerHasAuthenticator(bool simulate_authenticator) {
+    simulate_authenticator_ = simulate_authenticator;
+  }
+
  private:
   void DispatchRequest(FidoAuthenticator*) override {}
 
+  bool HasAuthenticator(
+      const std::string& authentictator_address) const override {
+    return simulate_authenticator_;
+  }
+
+  bool simulate_authenticator_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(FakeFidoRequestHandlerBase);
 };
 
@@ -67,6 +90,16 @@
     return std::make_unique<BleAdapterManager>(fake_request_handler_.get());
   }
 
+  MockBluetoothDevice* AddMockBluetoothDeviceToAdapter() {
+    auto mock_bluetooth_device = std::make_unique<MockBluetoothDevice>(
+        adapter_.get(), 0 /* bluetooth_class */, kTestBluetoothDisplayName,
+        kTestBluetoothDeviceAddress, false /* paired */, false /* connected */);
+
+    auto* mock_bluetooth_device_ptr = mock_bluetooth_device.get();
+    adapter_->AddMockDevice(std::move(mock_bluetooth_device));
+    return mock_bluetooth_device_ptr;
+  }
+
   MockBluetoothAdapter* adapter() { return adapter_.get(); }
   MockTransportAvailabilityObserver* observer() { return mock_observer_.get(); }
   bool adapter_powered_on_programmatically(
@@ -74,6 +107,20 @@
     return adapter_manager.adapter_powered_on_programmatically_;
   }
 
+  FakeFidoRequestHandlerBase* fake_request_handler() {
+    return fake_request_handler_.get();
+  }
+
+  const base::flat_map<std::string, std::string>& device_pincode_map(
+      const FidoBlePairingDelegate& delegate) const {
+    return delegate.bluetooth_device_pincode_map_;
+  }
+
+  const FidoBlePairingDelegate& ble_pairing_delegate(
+      const BleAdapterManager& ble_adapter_manager) {
+    return ble_adapter_manager.pairing_delegate_;
+  }
+
  protected:
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   scoped_refptr<MockBluetoothAdapter> adapter_ =
@@ -117,9 +164,9 @@
 }
 
 TEST_F(FidoBleAdapterManagerTest, AdapaterPresentAndCanBePowered) {
-  EXPECT_CALL(*adapter(), IsPresent()).WillOnce(::testing::Return(true));
-  EXPECT_CALL(*adapter(), IsPowered()).WillOnce(::testing::Return(false));
-  EXPECT_CALL(*adapter(), CanPower()).WillOnce(::testing::Return(true));
+  EXPECT_CALL(*adapter(), IsPresent).WillOnce(::testing::Return(true));
+  EXPECT_CALL(*adapter(), IsPowered).WillOnce(::testing::Return(false));
+  EXPECT_CALL(*adapter(), CanPower).WillOnce(::testing::Return(true));
 
   FidoRequestHandlerBase::TransportAvailabilityInfo data;
   EXPECT_CALL(*observer(), OnTransportAvailabilityEnumerated(_))
@@ -132,7 +179,7 @@
   EXPECT_TRUE(data.can_power_on_ble_adapter);
 }
 
-TEST_F(FidoBleAdapterManagerTest, TestSetBluetoothPowerOn) {
+TEST_F(FidoBleAdapterManagerTest, SetBluetoothPowerOn) {
   auto power_manager = CreateTestBleAdapterManager();
   ::testing::InSequence s;
   EXPECT_CALL(*adapter(), SetPowered(true, _, _));
@@ -142,4 +189,90 @@
   power_manager.reset();
 }
 
+TEST_F(FidoBleAdapterManagerTest, SuccessfulPairing) {
+  fake_request_handler()->SimulateFidoRequestHandlerHasAuthenticator(
+      true /* simulate_authenticator */);
+  auto* mock_bluetooth_device = AddMockBluetoothDeviceToAdapter();
+
+  EXPECT_CALL(*adapter(), GetDevices())
+      .WillRepeatedly(::testing::Return(adapter()->GetConstMockDevices()));
+  EXPECT_CALL(*mock_bluetooth_device, Pair)
+      .WillOnce(::testing::WithArgs<0, 1>(
+          [mock_bluetooth_device](
+              BluetoothDevice::PairingDelegate* delegate,
+              const base::RepeatingClosure& success_callback) {
+            delegate->RequestPinCode(mock_bluetooth_device);
+            success_callback.Run();
+          }));
+  EXPECT_CALL(*mock_bluetooth_device, SetPinCode(kTestPinCode));
+
+  auto adapter_manager = CreateTestBleAdapterManager();
+  test::TestCallbackReceiver<> callback_receiver;
+  adapter_manager->InitiatePairing(kTestFidoBleAuthenticatorId, kTestPinCode,
+                                   callback_receiver.callback(),
+                                   base::DoNothing());
+  callback_receiver.WaitForCallback();
+
+  const auto& pin_code_map =
+      device_pincode_map(ble_pairing_delegate(*adapter_manager));
+  EXPECT_EQ(1u, pin_code_map.size());
+  ASSERT_TRUE(base::ContainsKey(pin_code_map, kTestFidoBleAuthenticatorId));
+  EXPECT_EQ(kTestPinCode,
+            pin_code_map.find(kTestFidoBleAuthenticatorId)->second);
+}
+
+TEST_F(FidoBleAdapterManagerTest, PairingFailsOnUnknownDevice) {
+  auto* mock_bluetooth_device = AddMockBluetoothDeviceToAdapter();
+
+  EXPECT_CALL(*adapter(), GetDevices())
+      .WillRepeatedly(::testing::Return(adapter()->GetConstMockDevices()));
+  EXPECT_CALL(*mock_bluetooth_device, Pair).Times(0);
+
+  auto power_manager = CreateTestBleAdapterManager();
+  test::TestCallbackReceiver<> callback_receiver;
+  power_manager->InitiatePairing(kTestFidoBleAuthenticatorId, kTestPinCode,
+                                 base::DoNothing(),
+                                 callback_receiver.callback());
+  callback_receiver.WaitForCallback();
+
+  const auto& pin_code_map =
+      device_pincode_map(ble_pairing_delegate(*power_manager));
+  EXPECT_TRUE(pin_code_map.empty());
+}
+
+TEST_F(FidoBleAdapterManagerTest, PairingCancelledOnDestruction) {
+  fake_request_handler()->SimulateFidoRequestHandlerHasAuthenticator(
+      true /* simulate_authenticator */);
+  auto* mock_bluetooth_device = AddMockBluetoothDeviceToAdapter();
+
+  EXPECT_CALL(*adapter(), GetDevices())
+      .WillRepeatedly(::testing::Return(adapter()->GetConstMockDevices()));
+  EXPECT_CALL(*mock_bluetooth_device, Pair)
+      .WillOnce(::testing::WithArg<1>(
+          [](const base::RepeatingClosure& success_callback) {
+            success_callback.Run();
+          }));
+
+  auto adapter_manager = CreateTestBleAdapterManager();
+  test::TestCallbackReceiver<> callback_receiver;
+  adapter_manager->InitiatePairing(kTestFidoBleAuthenticatorId, kTestPinCode,
+                                   callback_receiver.callback(),
+                                   base::DoNothing());
+  callback_receiver.WaitForCallback();
+
+  const auto& pin_code_map =
+      device_pincode_map(ble_pairing_delegate(*adapter_manager));
+  EXPECT_EQ(1u, pin_code_map.size());
+  ASSERT_TRUE(base::ContainsKey(pin_code_map, kTestFidoBleAuthenticatorId));
+  EXPECT_EQ(kTestPinCode,
+            pin_code_map.find(kTestFidoBleAuthenticatorId)->second);
+
+  // Destroying BleAdapterManager should call CancelPairing() on all
+  // BluetoothDevice which has been attempted to be paried by the pairing
+  // delegate.
+  testing::Mock::VerifyAndClearExpectations(mock_bluetooth_device);
+  EXPECT_CALL(*mock_bluetooth_device, CancelPairing);
+  adapter_manager.reset();
+}
+
 }  // namespace device
diff --git a/device/fido/fido_authenticator.h b/device/fido/fido_authenticator.h
index 3d30e83..4fb6b7bb 100644
--- a/device/fido/fido_authenticator.h
+++ b/device/fido/fido_authenticator.h
@@ -52,6 +52,7 @@
   virtual base::string16 GetDisplayName() const = 0;
   virtual const AuthenticatorSupportedOptions& Options() const = 0;
   virtual FidoTransportProtocol AuthenticatorTransport() const = 0;
+  virtual bool IsInPairingMode() const = 0;
   virtual base::WeakPtr<FidoAuthenticator> GetWeakPtr() = 0;
 
  private:
diff --git a/device/fido/fido_device.cc b/device/fido/fido_device.cc
index b41fa9a..edd97a2 100644
--- a/device/fido/fido_device.cc
+++ b/device/fido/fido_device.cc
@@ -23,6 +23,10 @@
   return base::string16(id.begin(), id.end());
 }
 
+bool FidoDevice::IsInPairingMode() const {
+  return false;
+}
+
 void FidoDevice::DiscoverSupportedProtocolAndDeviceInfo(
     base::OnceClosure done) {
   if (base::FeatureList::IsEnabled(kNewCtap2Device)) {
diff --git a/device/fido/fido_device.h b/device/fido/fido_device.h
index 747734b2..9e7678f 100644
--- a/device/fido/fido_device.h
+++ b/device/fido/fido_device.h
@@ -62,6 +62,7 @@
   virtual std::string GetId() const = 0;
   virtual base::string16 GetDisplayName() const;
   virtual FidoTransportProtocol DeviceTransport() const = 0;
+  virtual bool IsInPairingMode() const;
   virtual base::WeakPtr<FidoDevice> GetWeakPtr() = 0;
 
   // Sends a speculative AuthenticatorGetInfo request to determine whether the
diff --git a/device/fido/fido_device_authenticator.cc b/device/fido/fido_device_authenticator.cc
index eeb17f1f..d7c68533 100644
--- a/device/fido/fido_device_authenticator.cc
+++ b/device/fido/fido_device_authenticator.cc
@@ -83,6 +83,10 @@
   return device_->DeviceTransport();
 }
 
+bool FidoDeviceAuthenticator::IsInPairingMode() const {
+  return device_->IsInPairingMode();
+}
+
 void FidoDeviceAuthenticator::SetTaskForTesting(
     std::unique_ptr<FidoTask> task) {
   task_ = std::move(task);
diff --git a/device/fido/fido_device_authenticator.h b/device/fido/fido_device_authenticator.h
index 07c6e5a..84a7b44 100644
--- a/device/fido/fido_device_authenticator.h
+++ b/device/fido/fido_device_authenticator.h
@@ -43,6 +43,7 @@
   base::string16 GetDisplayName() const override;
   const AuthenticatorSupportedOptions& Options() const override;
   FidoTransportProtocol AuthenticatorTransport() const override;
+  bool IsInPairingMode() const override;
   base::WeakPtr<FidoAuthenticator> GetWeakPtr() override;
 
   FidoDevice* GetDeviceForTesting() { return device_; }
diff --git a/device/fido/fido_discovery_base.h b/device/fido/fido_discovery_base.h
index f83a3a8..0ba4a62 100644
--- a/device/fido/fido_discovery_base.h
+++ b/device/fido/fido_discovery_base.h
@@ -40,6 +40,12 @@
     virtual void AuthenticatorIdChanged(FidoDiscoveryBase* discovery,
                                         const std::string& previous_id,
                                         std::string new_id) = 0;
+
+    // Invoked when connected Bluetooth device advertises that it is in pairing
+    // mode.
+    virtual void AuthenticatorPairingModeChanged(
+        FidoDiscoveryBase* discovery,
+        const std::string& device_id) = 0;
   };
 
   // Start authenticator discovery. The Observer must have been set before this
diff --git a/device/fido/fido_request_handler_base.cc b/device/fido/fido_request_handler_base.cc
index 5014e59..54138b6 100644
--- a/device/fido/fido_request_handler_base.cc
+++ b/device/fido/fido_request_handler_base.cc
@@ -176,6 +176,19 @@
   bluetooth_adapter_manager_->SetAdapterPower(true /* set_power_on */);
 }
 
+void FidoRequestHandlerBase::InitiatePairingWithDevice(
+    std::string authenticator_id,
+    std::string pin_code,
+    base::OnceClosure success_callback,
+    base::OnceClosure error_callback) {
+  if (!bluetooth_adapter_manager_)
+    return;
+
+  bluetooth_adapter_manager_->InitiatePairing(
+      std::move(authenticator_id), std::move(pin_code),
+      std::move(success_callback), std::move(error_callback));
+}
+
 base::WeakPtr<FidoRequestHandlerBase> FidoRequestHandlerBase::GetWeakPtr() {
   return weak_factory_.GetWeakPtr();
 }
@@ -223,6 +236,18 @@
     observer_->FidoAuthenticatorIdChanged(previous_id, std::move(new_id));
 }
 
+void FidoRequestHandlerBase::AuthenticatorPairingModeChanged(
+    FidoDiscoveryBase* discovery,
+    const std::string& device_id) {
+  DCHECK_EQ(FidoTransportProtocol::kBluetoothLowEnergy, discovery->transport());
+  auto it = active_authenticators_.find(device_id);
+  if (it == active_authenticators_.end())
+    return;
+
+  if (observer_)
+    observer_->FidoAuthenticatorPairingModeChanged(device_id);
+}
+
 void FidoRequestHandlerBase::AddAuthenticator(
     FidoAuthenticator* authenticator) {
   DCHECK(authenticator &&
@@ -275,6 +300,11 @@
   notify_observer_callback_.Run();
 }
 
+bool FidoRequestHandlerBase::HasAuthenticator(
+    const std::string& authenticator_id) const {
+  return base::ContainsKey(active_authenticators_, authenticator_id);
+}
+
 void FidoRequestHandlerBase::NotifyObserverTransportAvailability() {
   DCHECK(observer_);
   observer_->OnTransportAvailabilityEnumerated(transport_availability_info_);
diff --git a/device/fido/fido_request_handler_base.h b/device/fido/fido_request_handler_base.h
index 403dd21..550d36d 100644
--- a/device/fido/fido_request_handler_base.h
+++ b/device/fido/fido_request_handler_base.h
@@ -54,6 +54,11 @@
   using AuthenticatorMap =
       std::map<std::string, FidoAuthenticator*, std::less<>>;
   using RequestCallback = base::RepeatingCallback<void(const std::string&)>;
+  using BlePairingCallback =
+      base::RepeatingCallback<void(std::string authenticator_id,
+                                   std::string pin_code,
+                                   base::OnceClosure success_callback,
+                                   base::OnceClosure error_callback)>;
 
   enum class RequestType { kMakeCredential, kGetAssertion };
 
@@ -111,6 +116,8 @@
     virtual void FidoAuthenticatorIdChanged(
         base::StringPiece old_authenticator_id,
         std::string new_authenticator_id) = 0;
+    virtual void FidoAuthenticatorPairingModeChanged(
+        base::StringPiece authenticator_id) = 0;
   };
 
   // TODO(https://crbug.com/769631): Remove the dependency on Connector once
@@ -141,6 +148,10 @@
                                     bool can_power_on);
   void OnBluetoothAdapterPowerChanged(bool is_powered_on);
   void PowerOnBluetoothAdapter();
+  void InitiatePairingWithDevice(std::string authenticator_id,
+                                 std::string pin_code,
+                                 base::OnceClosure success_callback,
+                                 base::OnceClosure error_callback);
 
   base::WeakPtr<FidoRequestHandlerBase> GetWeakPtr();
 
@@ -158,6 +169,12 @@
   virtual void SetPlatformAuthenticatorOrMarkUnavailable(
       base::Optional<PlatformAuthenticatorInfo> platform_authenticator_info);
 
+  // Returns whether FidoAuthenticator with id equal to |authenticator_id|
+  // exists. Fake FidoRequestHandler objects used in testing overrides this
+  // function to simulate scenarios where authenticator with |authenticator_id|
+  // is known to the system.
+  virtual bool HasAuthenticator(const std::string& authentiator_id) const;
+
   TransportAvailabilityInfo& transport_availability_info() {
     return transport_availability_info_;
   }
@@ -187,6 +204,8 @@
   void AuthenticatorIdChanged(FidoDiscoveryBase* discovery,
                               const std::string& previous_id,
                               std::string new_id) final;
+  void AuthenticatorPairingModeChanged(FidoDiscoveryBase* discovery,
+                                       const std::string& device_id) final;
 
   void AddAuthenticator(FidoAuthenticator* authenticator);
   void NotifyObserverTransportAvailability();
diff --git a/device/fido/fido_request_handler_unittest.cc b/device/fido/fido_request_handler_unittest.cc
index dd3bd2f..117d54a 100644
--- a/device/fido/fido_request_handler_unittest.cc
+++ b/device/fido/fido_request_handler_unittest.cc
@@ -104,6 +104,8 @@
     authenticator_id_change_notification_receiver_.callback().Run(
         std::move(new_authenticator_id));
   }
+  void FidoAuthenticatorPairingModeChanged(
+      base::StringPiece authenticator_id) override {}
 
  private:
   TransportAvailabilityNotificationReceiver
diff --git a/device/fido/mac/authenticator.h b/device/fido/mac/authenticator.h
index 8e9741a162..1728623 100644
--- a/device/fido/mac/authenticator.h
+++ b/device/fido/mac/authenticator.h
@@ -60,6 +60,7 @@
   base::string16 GetDisplayName() const override;
   const AuthenticatorSupportedOptions& Options() const override;
   FidoTransportProtocol AuthenticatorTransport() const override;
+  bool IsInPairingMode() const override;
   base::WeakPtr<FidoAuthenticator> GetWeakPtr() override;
 
  private:
diff --git a/device/fido/mac/authenticator.mm b/device/fido/mac/authenticator.mm
index 43d4728..2e055b83 100644
--- a/device/fido/mac/authenticator.mm
+++ b/device/fido/mac/authenticator.mm
@@ -161,6 +161,10 @@
   return options;
 }
 
+bool TouchIdAuthenticator::IsInPairingMode() const {
+  return false;
+}
+
 base::WeakPtr<FidoAuthenticator> TouchIdAuthenticator::GetWeakPtr() {
   return weak_factory_.GetWeakPtr();
 }
diff --git a/device/fido/mock_fido_discovery_observer.h b/device/fido/mock_fido_discovery_observer.h
index 3f87945d9..21bd96ad 100644
--- a/device/fido/mock_fido_discovery_observer.h
+++ b/device/fido/mock_fido_discovery_observer.h
@@ -29,6 +29,8 @@
                void(FidoDiscoveryBase*, FidoAuthenticator*));
   MOCK_METHOD3(AuthenticatorIdChanged,
                void(FidoDiscoveryBase*, const std::string&, std::string));
+  MOCK_METHOD2(AuthenticatorPairingModeChanged,
+               void(FidoDiscoveryBase*, const std::string&));
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockFidoDiscoveryObserver);
diff --git a/device/vr/openvr/test/fake_openvr_impl_api.cc b/device/vr/openvr/test/fake_openvr_impl_api.cc
index 3850741..90596593 100644
--- a/device/vr/openvr/test/fake_openvr_impl_api.cc
+++ b/device/vr/openvr/test/fake_openvr_impl_api.cc
@@ -14,6 +14,8 @@
 #include <wrl.h>
 #include <memory>
 
+// TODO(https://crbug.com/892717): Update argument names to be consistent with
+// Chromium style guidelines.
 namespace vr {
 
 class TestVRSystem : public IVRSystem {
@@ -96,17 +98,9 @@
     return 0;
   }
   ETrackedControllerRole GetControllerRoleForTrackedDeviceIndex(
-      TrackedDeviceIndex_t unDeviceIndex) override {
-    NOTIMPLEMENTED();
-    return TrackedControllerRole_Invalid;
-  }
+      TrackedDeviceIndex_t unDeviceIndex) override;
   ETrackedDeviceClass GetTrackedDeviceClass(
-      TrackedDeviceIndex_t unDeviceIndex) override {
-    // Not yet implemented, but avoid calling NOTIMPLEMENTED() because it floods
-    // logs, and will be called to enumerate input devices.
-    // TODO(crbug.com/863487) - implement this and test input.
-    return TrackedDeviceClass_Invalid;
-  }
+      TrackedDeviceIndex_t unDeviceIndex) override;
   bool IsTrackedDeviceConnected(TrackedDeviceIndex_t unDeviceIndex) override {
     NOTIMPLEMENTED();
     return false;
@@ -125,17 +119,11 @@
   int32_t GetInt32TrackedDeviceProperty(
       TrackedDeviceIndex_t unDeviceIndex,
       ETrackedDeviceProperty prop,
-      ETrackedPropertyError* pError = 0L) override {
-    NOTIMPLEMENTED();
-    return 0;
-  }
+      ETrackedPropertyError* pError = 0L) override;
   uint64_t GetUint64TrackedDeviceProperty(
       TrackedDeviceIndex_t unDeviceIndex,
       ETrackedDeviceProperty prop,
-      ETrackedPropertyError* pError = 0L) override {
-    NOTIMPLEMENTED();
-    return 0;
-  }
+      ETrackedPropertyError* pError = 0L) override;
   HmdMatrix34_t GetMatrix34TrackedDeviceProperty(
       TrackedDeviceIndex_t unDeviceIndex,
       ETrackedDeviceProperty prop,
@@ -171,21 +159,15 @@
     NOTIMPLEMENTED();
     return {};
   }
-  bool GetControllerState(TrackedDeviceIndex_t unControllerDeviceIndex,
-                          VRControllerState_t* pControllerState,
-                          uint32_t unControllerStateSize) override {
-    NOTIMPLEMENTED();
-    return false;
-  }
+  bool GetControllerState(TrackedDeviceIndex_t controller_device_index,
+                          VRControllerState_t* controller_state,
+                          uint32_t controller_state_size) override;
   bool GetControllerStateWithPose(
-      ETrackingUniverseOrigin eOrigin,
-      TrackedDeviceIndex_t unControllerDeviceIndex,
-      VRControllerState_t* pControllerState,
-      uint32_t unControllerStateSize,
-      TrackedDevicePose_t* pTrackedDevicePose) override {
-    NOTIMPLEMENTED();
-    return false;
-  }
+      ETrackingUniverseOrigin origin,
+      TrackedDeviceIndex_t device_controller_index,
+      VRControllerState_t* controller_state,
+      uint32_t controller_state_size,
+      TrackedDevicePose_t* tracked_device_pose) override;
   void TriggerHapticPulse(TrackedDeviceIndex_t unControllerDeviceIndex,
                           uint32_t unAxisId,
                           unsigned short usDurationMicroSec) override {
@@ -506,6 +488,25 @@
   return false;
 }
 
+bool TestVRSystem::GetControllerState(
+    TrackedDeviceIndex_t controller_device_index,
+    VRControllerState_t* controller_state,
+    uint32_t controller_state_size) {
+  return g_test_helper.GetControllerState(controller_device_index,
+                                          controller_state);
+}
+
+bool TestVRSystem::GetControllerStateWithPose(
+    ETrackingUniverseOrigin origin,
+    TrackedDeviceIndex_t controller_device_index,
+    VRControllerState_t* controller_state,
+    uint32_t controller_state_size,
+    TrackedDevicePose_t* tracked_device_pose) {
+  g_test_helper.GetControllerState(controller_device_index, controller_state);
+  return g_test_helper.GetControllerPose(controller_device_index,
+                                         tracked_device_pose);
+}
+
 uint32_t TestVRSystem::GetStringTrackedDeviceProperty(
     TrackedDeviceIndex_t unDeviceIndex,
     ETrackedDeviceProperty prop,
@@ -535,6 +536,38 @@
   return 0;
 }
 
+int32_t TestVRSystem::GetInt32TrackedDeviceProperty(
+    TrackedDeviceIndex_t unDeviceIndex,
+    ETrackedDeviceProperty prop,
+    ETrackedPropertyError* pError) {
+  int32_t ret;
+  ETrackedPropertyError err =
+      g_test_helper.GetInt32TrackedDeviceProperty(unDeviceIndex, prop, ret);
+  if (err != TrackedProp_Success) {
+    NOTIMPLEMENTED();
+  }
+  if (pError) {
+    *pError = err;
+  }
+  return ret;
+}
+
+uint64_t TestVRSystem::GetUint64TrackedDeviceProperty(
+    TrackedDeviceIndex_t unDeviceIndex,
+    ETrackedDeviceProperty prop,
+    ETrackedPropertyError* pError) {
+  uint64_t ret;
+  ETrackedPropertyError err =
+      g_test_helper.GetUint64TrackedDeviceProperty(unDeviceIndex, prop, ret);
+  if (err != TrackedProp_Success) {
+    NOTIMPLEMENTED();
+  }
+  if (pError) {
+    *pError = err;
+  }
+  return ret;
+}
+
 HmdMatrix34_t TestVRSystem::GetSeatedZeroPoseToStandingAbsoluteTrackingPose() {
   HmdMatrix34_t ret = {};
   ret.m[0][0] = 1;
@@ -544,6 +577,16 @@
   return ret;
 }
 
+ETrackedControllerRole TestVRSystem::GetControllerRoleForTrackedDeviceIndex(
+    TrackedDeviceIndex_t unDeviceIndex) {
+  return g_test_helper.GetControllerRoleForTrackedDeviceIndex(unDeviceIndex);
+}
+
+ETrackedDeviceClass TestVRSystem::GetTrackedDeviceClass(
+    TrackedDeviceIndex_t unDeviceIndex) {
+  return g_test_helper.GetTrackedDeviceClass(unDeviceIndex);
+}
+
 void TestVRCompositor::SuspendRendering(bool bSuspend) {}
 
 void TestVRCompositor::SetTrackingSpace(ETrackingUniverseOrigin) {}
diff --git a/device/vr/openvr/test/test_helper.cc b/device/vr/openvr/test/test_helper.cc
index 381297f..5ad74a7 100644
--- a/device/vr/openvr/test/test_helper.cc
+++ b/device/vr/openvr/test/test_helper.cc
@@ -159,6 +159,140 @@
   return TranslatePose(pose);
 }
 
+vr::ETrackedPropertyError TestHelper::GetInt32TrackedDeviceProperty(
+    unsigned int index,
+    ETrackedDeviceProperty prop,
+    int32_t& prop_value) {
+  vr::ETrackedPropertyError ret = vr::TrackedProp_Success;
+  prop_value = 0;
+  lock_.Acquire();
+  switch (prop) {
+    case vr::Prop_Axis0Type_Int32:
+    case vr::Prop_Axis1Type_Int32:
+    case vr::Prop_Axis2Type_Int32:
+    case vr::Prop_Axis3Type_Int32:
+    case vr::Prop_Axis4Type_Int32: {
+      auto controller_data = test_hook_->WaitGetControllerData(index);
+      if (!controller_data.is_valid) {
+        ret = vr::TrackedProp_WrongDeviceClass;
+        break;
+      }
+      prop_value = static_cast<vr::EVRControllerAxisType>(
+          controller_data.axis_data[prop - vr::Prop_Axis0Type_Int32].axis_type);
+      break;
+    }
+    default:
+      ret = vr::TrackedProp_UnknownProperty;
+  }
+  lock_.Release();
+  return ret;
+}
+
+vr::ETrackedPropertyError TestHelper::GetUint64TrackedDeviceProperty(
+    unsigned int index,
+    ETrackedDeviceProperty prop,
+    uint64_t& prop_value) {
+  vr::ETrackedPropertyError ret = vr::TrackedProp_Success;
+  prop_value = 0;
+  lock_.Acquire();
+  switch (prop) {
+    case vr::Prop_SupportedButtons_Uint64: {
+      auto controller_data = test_hook_->WaitGetControllerData(index);
+      if (!controller_data.is_valid) {
+        ret = vr::TrackedProp_WrongDeviceClass;
+        break;
+      }
+      prop_value = controller_data.supported_buttons;
+      break;
+    }
+    default:
+      ret = vr::TrackedProp_UnknownProperty;
+  }
+  lock_.Release();
+  return ret;
+}
+
+vr::ETrackedControllerRole TestHelper::GetControllerRoleForTrackedDeviceIndex(
+    unsigned int index) {
+  vr::ETrackedControllerRole ret = vr::TrackedControllerRole_Invalid;
+  lock_.Acquire();
+  if (test_hook_) {
+    switch (test_hook_->WaitGetControllerRoleForTrackedDeviceIndex(index)) {
+      case device::kControllerRoleInvalid:
+        break;
+      case device::kControllerRoleLeft:
+        ret = vr::TrackedControllerRole_LeftHand;
+        break;
+      case device::kControllerRoleRight:
+        ret = vr::TrackedControllerRole_RightHand;
+        break;
+      default:
+        NOTREACHED();
+    }
+  }
+  lock_.Release();
+  return ret;
+}
+
+vr::ETrackedDeviceClass TestHelper::GetTrackedDeviceClass(unsigned int index) {
+  vr::ETrackedDeviceClass tracked_class = vr::TrackedDeviceClass_Invalid;
+  lock_.Acquire();
+  if (test_hook_) {
+    switch (test_hook_->WaitGetTrackedDeviceClass(index)) {
+      case device::kTrackedDeviceInvalid:
+        break;
+      case device::kTrackedDeviceHmd:
+        tracked_class = vr::TrackedDeviceClass_HMD;
+        break;
+      case device::kTrackedDeviceController:
+        tracked_class = vr::TrackedDeviceClass_Controller;
+        break;
+      case device::kTrackedDeviceGenericTracker:
+        tracked_class = vr::TrackedDeviceClass_GenericTracker;
+        break;
+      case device::kTrackedDeviceTrackingReference:
+        tracked_class = vr::TrackedDeviceClass_TrackingReference;
+        break;
+      default:
+        NOTREACHED();
+    }
+  }
+  lock_.Release();
+  return tracked_class;
+}
+
+bool TestHelper::GetControllerState(unsigned int index,
+                                    vr::VRControllerState_t* controller_state) {
+  lock_.Acquire();
+  if (test_hook_) {
+    auto controller_data = test_hook_->WaitGetControllerData(index);
+    lock_.Release();
+    controller_state->unPacketNum = controller_data.packet_number;
+    controller_state->ulButtonPressed = controller_data.buttons_pressed;
+    controller_state->ulButtonTouched = controller_data.buttons_touched;
+    for (unsigned int i = 0; i < device::kMaxNumAxes; ++i) {
+      controller_state->rAxis[i].x = controller_data.axis_data[i].x;
+      controller_state->rAxis[i].y = controller_data.axis_data[i].y;
+    }
+    return controller_data.is_valid;
+  }
+  lock_.Release();
+  return false;
+}
+
+bool TestHelper::GetControllerPose(unsigned int index,
+                                   vr::TrackedDevicePose_t* controller_pose) {
+  lock_.Acquire();
+  if (test_hook_) {
+    auto controller_data = test_hook_->WaitGetControllerData(index);
+    lock_.Release();
+    *controller_pose = TranslatePose(controller_data.pose_data);
+    return controller_data.is_valid && controller_data.pose_data.is_valid;
+  }
+  lock_.Release();
+  return false;
+}
+
 void TestHelper::SetTestHook(device::OpenVRTestHook* hook) {
   lock_.Acquire();
   test_hook_ = hook;
diff --git a/device/vr/openvr/test/test_helper.h b/device/vr/openvr/test/test_helper.h
index 69b9a53..3a2d1a0f 100644
--- a/device/vr/openvr/test/test_helper.h
+++ b/device/vr/openvr/test/test_helper.h
@@ -26,6 +26,21 @@
   TrackedDevicePose_t GetPose(bool presenting);
   float GetInterpupillaryDistance();
   ProjectionRaw GetProjectionRaw(bool left);
+  ETrackedPropertyError GetInt32TrackedDeviceProperty(
+      unsigned int index,
+      ETrackedDeviceProperty prop,
+      int32_t& prop_value);
+  ETrackedPropertyError GetUint64TrackedDeviceProperty(
+      unsigned int index,
+      ETrackedDeviceProperty prop,
+      uint64_t& prop_value);
+  ETrackedControllerRole GetControllerRoleForTrackedDeviceIndex(
+      unsigned int index);
+  ETrackedDeviceClass GetTrackedDeviceClass(unsigned int index);
+  bool GetControllerState(unsigned int index,
+                          VRControllerState_t* controller_state);
+  bool GetControllerPose(unsigned int index,
+                         TrackedDevicePose_t* controller_pose);
   void TestFailure();
 
   void AttachToCurrentThread();
diff --git a/device/vr/openvr/test/test_hook.h b/device/vr/openvr/test/test_hook.h
index 1aeb3528..3e6914ee 100644
--- a/device/vr/openvr/test/test_hook.h
+++ b/device/vr/openvr/test/test_hook.h
@@ -5,10 +5,14 @@
 #ifndef DEVICE_VR_OPENVR_TEST_TEST_HOOK_H_
 #define DEVICE_VR_OPENVR_TEST_TEST_HOOK_H_
 
+#include <cstdint>
+
 namespace device {
 
 // Update this string whenever either interface changes.
-constexpr char kChromeOpenVRTestHookAPI[] = "ChromeTestHook_1";
+constexpr char kChromeOpenVRTestHookAPI[] = "ChromeTestHook_2";
+constexpr unsigned int kMaxTrackedDevices = 64;
+constexpr unsigned int kMaxNumAxes = 5;
 
 struct Color {
   unsigned char r;
@@ -44,6 +48,38 @@
   float viewport_right[4];  // raw projection right {left, right, top, bottom}
 };
 
+struct ControllerAxisData {
+  float x = 0.0f;
+  float y = 0.0f;
+  unsigned int axis_type = 0;
+};
+
+enum TrackedDeviceClass {
+  kTrackedDeviceInvalid,
+  kTrackedDeviceHmd,
+  kTrackedDeviceController,
+  kTrackedDeviceGenericTracker,
+  kTrackedDeviceTrackingReference,
+  kTrackedDeviceDisplayRedirect
+};
+
+enum ControllerRole {
+  kControllerRoleInvalid,
+  kControllerRoleLeft,
+  kControllerRoleRight
+};
+
+struct ControllerFrameData {
+  unsigned int packet_number = 0;
+  uint64_t buttons_pressed = 0;
+  uint64_t buttons_touched = 0;
+  uint64_t supported_buttons = 0;
+  ControllerAxisData axis_data[kMaxNumAxes];
+  PoseFrameData pose_data = {};
+  ControllerRole role = kControllerRoleInvalid;
+  bool is_valid = false;
+};
+
 // Tests may implement this, and register it to control behavior of OpenVR.
 class OpenVRTestHook {
  public:
@@ -51,6 +87,10 @@
   virtual DeviceConfig WaitGetDeviceConfig() = 0;
   virtual PoseFrameData WaitGetPresentingPose() = 0;
   virtual PoseFrameData WaitGetMagicWindowPose() = 0;
+  virtual ControllerRole WaitGetControllerRoleForTrackedDeviceIndex(
+      unsigned int index) = 0;
+  virtual TrackedDeviceClass WaitGetTrackedDeviceClass(unsigned int index) = 0;
+  virtual ControllerFrameData WaitGetControllerData(unsigned int index) = 0;
 
   virtual void AttachCurrentThread() = 0;
   virtual void DetachCurrentThread() = 0;
diff --git a/device/vr/public/mojom/browser_test_interfaces.mojom b/device/vr/public/mojom/browser_test_interfaces.mojom
index 08a0070..bb2122b 100644
--- a/device/vr/public/mojom/browser_test_interfaces.mojom
+++ b/device/vr/public/mojom/browser_test_interfaces.mojom
@@ -47,15 +47,75 @@
   ProjectionRaw projection_right;
 };
 
+struct ControllerAxisData {
+  float x;
+  float y;
+  uint8 axis_type; // Corresponds to OpenVR's EVRControllerAxisType
+};
+
+enum TrackedDeviceClass {
+  kTrackedDeviceInvalid,
+  kTrackedDeviceHmd,
+  kTrackedDeviceController,
+  kTrackedDeviceGenericTracker,
+  kTrackedDeviceTrackingReference,
+  kTrackedDeviceDisplayRedirect
+};
+
+enum ControllerRole {
+  kControllerRoleInvalid,
+  kControllerRoleLeft,
+  kControllerRoleRight
+};
+
+struct ControllerFrameData {
+  uint32 packet_number;
+  uint64 buttons_pressed;
+  uint64 buttons_touched;
+  uint64 supported_buttons;
+  array<ControllerAxisData, 5> axis_data;
+  PoseFrameData pose_data;
+  ControllerRole role = kControllerRoleInvalid;
+  bool is_valid;
+};
+
 // Tests may implement this, and register it to control behavior of devices for
 // tests.  The test interface lives in the browser process, and may be consumed
 // by the device utility process.
 // It is only implemented when running in browser tests.
 interface XRTestHook {
+  // Notifies the test anytime the XR runtime receives a frame with the data
+  // that was submitted.
   [Sync] OnFrameSubmitted(SubmittedFrameData frame_data) => ();
+
+  // Called by the XR runtime to retrieve the XR device's configuration set by
+  // the test.
   [Sync] WaitGetDeviceConfig() => (DeviceConfig config);
+
+  // Called by the XR runtime to retrieve the XR device's pose while in a
+  // presenting/exclusive session.
   [Sync] WaitGetPresentingPose() => (PoseFrameData data);
+
+  // Called by the XR runtime to retrieve the XR device's pose while in a
+  // magic window/non-exclusive session.
   [Sync] WaitGetMagicWindowPose() => (PoseFrameData data);
+
+  // Called by the XR runtime to retrieve the ControllerRole of the device
+  // that the test has registered at the given index, i.e. which hand the
+  // controller is mapped to.
+  [Sync] WaitGetControllerRoleForTrackedDeviceIndex(uint32 index) =>
+      (ControllerRole role);
+
+  // Called by the XR runtime to retrieve the class of the device that the test
+  // has registered at the given index, e.g. whether it is a controller or
+  // headset.
+  [Sync] WaitGetTrackedDeviceClass(uint32 index) =>
+      (TrackedDeviceClass device_class);
+
+  // Called by the XR runtime anytime it updates its controller data to retrieve
+  // the controller data of the device that the test has registered at the
+  // given index, e.g. its current position and pressed buttons.
+  [Sync] WaitGetControllerData(uint32 index) => (ControllerFrameData data);
 };
 
 // Interface exposed by IsolatedXRService to allow browser tests to hook VR APIs
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 34e0550..dcb58e12 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1345,6 +1345,7 @@
   AUTOTESTPRIVATE_RUNCROSTINIUNINSTALLER = 1282,
   AUTOTESTPRIVATE_TAKESCREENSHOT = 1283,
   ACCESSIBILITY_PRIVATE_TOGGLEDICTATION = 1284,
+  ACCESSIBILITY_PRIVATE_ENABLECHROMEVOXMOUSEEVENTS = 1285,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc
index 5e0df73..feb8942 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc
@@ -32,6 +32,7 @@
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "services/network/public/cpp/features.h"
+#include "url/url_constants.h"
 
 using extensions::ExtensionsAPIClient;
 using extensions::MimeHandlerViewGuest;
@@ -157,6 +158,11 @@
 
 IN_PROC_BROWSER_TEST_P(MimeHandlerViewCrossProcessTest, Embedded) {
   RunTest("test_embedded.html");
+  // Sanity check. Navigate the page and verify the guest goes away.
+  ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
+  auto* gv_manager = GetGuestViewManager();
+  gv_manager->WaitForAllGuestsDeleted();
+  EXPECT_EQ(1U, gv_manager->num_guests_created());
 }
 
 // The following tests will eventually converted into a parametric version which
diff --git a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.cc b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.cc
index fb0bce0..9b3cb6da 100644
--- a/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.cc
+++ b/extensions/renderer/guest_view/mime_handler_view/mime_handler_view_frame_container.cc
@@ -35,6 +35,13 @@
     const std::string& mime_type,
     const content::WebPluginInfo& plugin_info,
     int32_t element_instance_id) {
+  if (plugin_info.type != content::WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN) {
+    // TODO(ekaramad): Rename this plugin type once https://crbug.com/659750 is
+    // fixed. We only create a MHVFC for the plugin types of BrowserPlugin
+    // (which used to create a MimeHandlerViewContainer).
+    return false;
+  }
+
   if (!IsSupportedMimeType(mime_type))
     return false;
   // Life time is managed by the class itself: when the MimeHandlerViewGuest
diff --git a/infra/config/global/cr-buildbucket.cfg b/infra/config/global/cr-buildbucket.cfg
index 5bc7b2aa..c248a3f 100644
--- a/infra/config/global/cr-buildbucket.cfg
+++ b/infra/config/global/cr-buildbucket.cfg
@@ -1949,6 +1949,13 @@
       mixins: "libfuzzer"
     }
     builders {
+      name: "Libfuzzer Upload Windows ASan"
+      dimensions: "os:Windows-10"
+      dimensions: "cores:8"
+      mixins: "fyi-ci"
+      mixins: "libfuzzer"
+    }
+    builders {
       name: "Mac ASan 64 Builder"
       dimensions: "os:Mac-10.13"
       dimensions: "cores:"  # Swapping between 8 and 24
@@ -2410,7 +2417,8 @@
     builders {
       name: "WebKit Win10"
       dimensions: "os:Windows-10"
-      mixins: "webkit-ci"
+      mixins: "win-ci"
+      mixins: "webkit-ci-migration"
     }
     builders {
       name: "win32-dbg"
diff --git a/infra/config/global/luci-milo.cfg b/infra/config/global/luci-milo.cfg
index 8490282..83876c88 100644
--- a/infra/config/global/luci-milo.cfg
+++ b/infra/config/global/luci-milo.cfg
@@ -2466,6 +2466,10 @@
     category: "chromium_libfuzzer"
   }
   builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Windows ASan"
+    category: "chromium_libfuzzer"
+  }
+  builders {
     name: "buildbucket/luci.chromium.ci/Linux Clang Analyzer"
     category: "clang tot"
   }
@@ -2814,6 +2818,10 @@
     category: "chromium_libfuzzer"
   }
   builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Windows ASan"
+    category: "chromium_libfuzzer"
+  }
+  builders {
     name: "buildbot/chromium.fyi/Linux Clang Analyzer"
     name: "buildbucket/luci.chromium.ci/Linux Clang Analyzer"
     category: "clang tot"
diff --git a/infra/config/global/luci-scheduler.cfg b/infra/config/global/luci-scheduler.cfg
index 52c881f..888d6d483 100644
--- a/infra/config/global/luci-scheduler.cfg
+++ b/infra/config/global/luci-scheduler.cfg
@@ -157,6 +157,7 @@
   triggers: "Libfuzzer Upload Linux MSan"
   triggers: "Libfuzzer Upload Linux UBSan"
   triggers: "Libfuzzer Upload Mac ASan"
+  triggers: "Libfuzzer Upload Windows ASan"
   triggers: "Linux ARM"
   triggers: "Linux ASan LSan Builder"
   triggers: "Linux Builder (dbg)"
@@ -3021,6 +3022,19 @@
 }
 
 job {
+  id: "Libfuzzer Upload Windows ASan"
+  acl_sets: "default"
+  buildbucket: {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Libfuzzer Upload Windows ASan"
+  }
+  triggering_policy: {
+    max_concurrent_invocations: 3
+  }
+}
+
+job {
   id: "Linux"
   acl_sets: "default"
   buildbucket: {
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 2cc41dc..a6cb2dd 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -453,6 +453,9 @@
       <message name="IDS_IOS_CLEAR_AUTOFILL" desc="Label for the option in settings to clear form data. In titlecase. [Length: 20em] [iOS only]">
         Autofill Data
       </message>
+      <message name="IDS_IOS_CLEAR_BROWSING_DATA_ACTIVITY_MODAL" desc="Message text for the activity indicator modal during clear browsing data.">
+        Clearing browsing data...
+      </message>
       <message name="IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_ACCOUNT" desc="Footer message in the settings to clear browsing data that informs the user that clearing browsing data will not sign them out of Chrome.">
         You won't be signed out of your Google Account.
       </message>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index 253b59a..cc4c6d66 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -176,6 +176,7 @@
 <translation id="3950820424414687140">Logg på</translation>
 <translation id="3967822245660637423">Nedlasting fullført</translation>
 <translation id="3989635538409502728">Logg av</translation>
+<translation id="3995521777587992544">Fremdriftslinje for sideinnlasting, <ph name="EMAIL" /> er lastet inn.</translation>
 <translation id="4002066346123236978">Tittel</translation>
 <translation id="4038354071007134711">Ingen apper på denne enheten kan åpne filen.</translation>
 <translation id="4042870976416480368">Finn på siden</translation>
diff --git a/ios/chrome/browser/application_context.h b/ios/chrome/browser/application_context.h
index 37b4000..256f9ae 100644
--- a/ios/chrome/browser/application_context.h
+++ b/ios/chrome/browser/application_context.h
@@ -31,11 +31,12 @@
 }
 
 namespace net {
+class NetLog;
 class URLRequestContextGetter;
 }
 
 namespace net_log {
-class ChromeNetLog;
+class NetExportFileWriter;
 }
 
 namespace network {
@@ -124,8 +125,10 @@
   // Gets the RapporServiceImpl. May return null.
   virtual rappor::RapporServiceImpl* GetRapporServiceImpl() = 0;
 
-  // Gets the ChromeNetLog.
-  virtual net_log::ChromeNetLog* GetNetLog() = 0;
+  // Gets the NetLog.
+  virtual net::NetLog* GetNetLog() = 0;
+
+  virtual net_log::NetExportFileWriter* GetNetExportFileWriter() = 0;
 
   // Gets the NetworkTimeTracker.
   virtual network_time::NetworkTimeTracker* GetNetworkTimeTracker() = 0;
diff --git a/ios/chrome/browser/application_context_impl.cc b/ios/chrome/browser/application_context_impl.cc
index 408cd7a..7036f2b0 100644
--- a/ios/chrome/browser/application_context_impl.cc
+++ b/ios/chrome/browser/application_context_impl.cc
@@ -26,7 +26,7 @@
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/metrics/metrics_service.h"
 #include "components/metrics_services_manager/metrics_services_manager.h"
-#include "components/net_log/chrome_net_log.h"
+#include "components/net_log/net_export_file_writer.h"
 #include "components/network_time/network_time_tracker.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
@@ -53,6 +53,7 @@
 #include "ios/chrome/common/channel_info.h"
 #include "ios/web/public/web_task_traits.h"
 #include "ios/web/public/web_thread.h"
+#include "net/log/net_log.h"
 #include "net/log/net_log_capture_mode.h"
 #include "net/socket/client_socket_pool_manager.h"
 #include "net/url_request/url_request_context_getter.h"
@@ -101,7 +102,7 @@
   DCHECK(!GetApplicationContext());
   SetApplicationContext(this);
 
-  net_log_.reset(new net_log::ChromeNetLog());
+  net_log_ = std::make_unique<net::NetLog>();
 
   SetApplicationLocale(locale);
 
@@ -134,6 +135,8 @@
   metrics_services_manager_.reset();
   network_time_tracker_.reset();
 
+  net_export_file_writer_.reset();
+
   // Need to clear browser states before the IO thread.
   chrome_browser_state_manager_.reset();
 
@@ -289,11 +292,19 @@
   return GetMetricsServicesManager()->GetRapporServiceImpl();
 }
 
-net_log::ChromeNetLog* ApplicationContextImpl::GetNetLog() {
+net::NetLog* ApplicationContextImpl::GetNetLog() {
   DCHECK(thread_checker_.CalledOnValidThread());
   return net_log_.get();
 }
 
+net_log::NetExportFileWriter* ApplicationContextImpl::GetNetExportFileWriter() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  if (!net_export_file_writer_) {
+    net_export_file_writer_ = std::make_unique<net_log::NetExportFileWriter>();
+  }
+  return net_export_file_writer_.get();
+}
+
 network_time::NetworkTimeTracker*
 ApplicationContextImpl::GetNetworkTimeTracker() {
   DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/ios/chrome/browser/application_context_impl.h b/ios/chrome/browser/application_context_impl.h
index 4b38d92..383ab55c 100644
--- a/ios/chrome/browser/application_context_impl.h
+++ b/ios/chrome/browser/application_context_impl.h
@@ -60,7 +60,8 @@
   ukm::UkmRecorder* GetUkmRecorder() override;
   variations::VariationsService* GetVariationsService() override;
   rappor::RapporServiceImpl* GetRapporServiceImpl() override;
-  net_log::ChromeNetLog* GetNetLog() override;
+  net::NetLog* GetNetLog() override;
+  net_log::NetExportFileWriter* GetNetExportFileWriter() override;
   network_time::NetworkTimeTracker* GetNetworkTimeTracker() override;
   IOSChromeIOThread* GetIOSChromeIOThread() override;
   gcm::GCMDriver* GetGCMDriver() override;
@@ -80,7 +81,8 @@
 
   base::ThreadChecker thread_checker_;
   std::unique_ptr<PrefService> local_state_;
-  std::unique_ptr<net_log::ChromeNetLog> net_log_;
+  std::unique_ptr<net::NetLog> net_log_;
+  std::unique_ptr<net_log::NetExportFileWriter> net_export_file_writer_;
   std::unique_ptr<network_time::NetworkTimeTracker> network_time_tracker_;
   std::unique_ptr<IOSChromeIOThread> ios_chrome_io_thread_;
   std::unique_ptr<metrics_services_manager::MetricsServicesManager>
diff --git a/ios/chrome/browser/autofill/BUILD.gn b/ios/chrome/browser/autofill/BUILD.gn
index 8053cc7..cccb59a 100644
--- a/ios/chrome/browser/autofill/BUILD.gn
+++ b/ios/chrome/browser/autofill/BUILD.gn
@@ -26,6 +26,8 @@
     "form_suggestion_view_client.h",
     "personal_data_manager_factory.cc",
     "personal_data_manager_factory.h",
+    "strike_database_factory.cc",
+    "strike_database_factory.h",
     "validation_rules_storage_factory.cc",
     "validation_rules_storage_factory.h",
   ]
@@ -67,6 +69,7 @@
     "//ios/chrome/browser/ui/autofill/manual_fill:manual_fill_ui",
     "//ios/chrome/browser/ui/image_util",
     "//ios/web",
+    "//third_party/leveldatabase",
     "//third_party/libaddressinput",
     "//ui/base",
     "//url",
@@ -116,6 +119,7 @@
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/ui/autofill",
     "//ios/web",
+    "//third_party/leveldatabase",
     "//ui/gfx/geometry",
     "//url",
   ]
@@ -162,6 +166,7 @@
     "//ios/web",
     "//ios/web/public/test",
     "//testing/gtest",
+    "//third_party/leveldatabase",
     "//third_party/ocmock",
     "//ui/base:test_support",
   ]
diff --git a/ios/chrome/browser/autofill/strike_database_factory.cc b/ios/chrome/browser/autofill/strike_database_factory.cc
new file mode 100644
index 0000000..6e5d6f9a
--- /dev/null
+++ b/ios/chrome/browser/autofill/strike_database_factory.cc
@@ -0,0 +1,45 @@
+// Copyright 2018 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 "ios/chrome/browser/autofill/strike_database_factory.h"
+
+#include <utility>
+
+#include "base/memory/singleton.h"
+#include "components/autofill/core/browser/strike_database.h"
+#include "components/keyed_service/ios/browser_state_dependency_manager.h"
+#include "ios/chrome/browser/application_context.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+
+namespace autofill {
+
+// static
+StrikeDatabase* StrikeDatabaseFactory::GetForBrowserState(
+    ios::ChromeBrowserState* browser_state) {
+  return static_cast<StrikeDatabase*>(
+      GetInstance()->GetServiceForBrowserState(browser_state, true));
+}
+
+// static
+StrikeDatabaseFactory* StrikeDatabaseFactory::GetInstance() {
+  return base::Singleton<StrikeDatabaseFactory>::get();
+}
+
+StrikeDatabaseFactory::StrikeDatabaseFactory()
+    : BrowserStateKeyedServiceFactory(
+          "AutofillStrikeDatabase",
+          BrowserStateDependencyManager::GetInstance()) {}
+
+StrikeDatabaseFactory::~StrikeDatabaseFactory() {}
+
+std::unique_ptr<KeyedService> StrikeDatabaseFactory::BuildServiceInstanceFor(
+    web::BrowserState* context) const {
+  ios::ChromeBrowserState* chrome_browser_state =
+      ios::ChromeBrowserState::FromBrowserState(context);
+  return std::make_unique<autofill::StrikeDatabase>(
+      chrome_browser_state->GetStatePath().Append(
+          FILE_PATH_LITERAL("AutofillStrikeDatabase")));
+}
+
+}  // namespace autofill
diff --git a/ios/chrome/browser/autofill/strike_database_factory.h b/ios/chrome/browser/autofill/strike_database_factory.h
new file mode 100644
index 0000000..6822440
--- /dev/null
+++ b/ios/chrome/browser/autofill/strike_database_factory.h
@@ -0,0 +1,49 @@
+// Copyright 2018 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 IOS_CHROME_BROWSER_AUTOFILL_STRIKE_DATABASE_FACTORY_H_
+#define IOS_CHROME_BROWSER_AUTOFILL_STRIKE_DATABASE_FACTORY_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
+
+namespace base {
+template <typename T>
+struct DefaultSingletonTraits;
+}  // namespace base
+
+namespace ios {
+class ChromeBrowserState;
+}
+
+namespace autofill {
+
+class StrikeDatabase;
+
+// Singleton that owns all StrikeDatabases and associates them with
+// ios::ChromeBrowserState.
+class StrikeDatabaseFactory : public BrowserStateKeyedServiceFactory {
+ public:
+  static StrikeDatabase* GetForBrowserState(
+      ios::ChromeBrowserState* browser_state);
+  static StrikeDatabaseFactory* GetInstance();
+
+ private:
+  friend struct base::DefaultSingletonTraits<StrikeDatabaseFactory>;
+
+  StrikeDatabaseFactory();
+  ~StrikeDatabaseFactory() override;
+
+  // BrowserStateKeyedServiceFactory implementation.
+  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
+      web::BrowserState* context) const override;
+
+  DISALLOW_COPY_AND_ASSIGN(StrikeDatabaseFactory);
+};
+
+}  // namespace autofill
+
+#endif  // IOS_CHROME_BROWSER_AUTOFILL_STRIKE_DATABASE_FACTORY_H_
diff --git a/ios/chrome/browser/ios_chrome_io_thread.h b/ios/chrome/browser/ios_chrome_io_thread.h
index ec839fcfa..c6e0a5bfe 100644
--- a/ios/chrome/browser/ios_chrome_io_thread.h
+++ b/ios/chrome/browser/ios_chrome_io_thread.h
@@ -12,9 +12,9 @@
 
 class PrefService;
 
-namespace net_log {
-class ChromeNetLog;
-}  // namespace net_log
+namespace net {
+class NetLog;
+}  // namespace net
 
 namespace network {
 class SharedURLLoaderFactory;
@@ -29,7 +29,7 @@
 // primarily used on, the IO thread.
 class IOSChromeIOThread : public io_thread::IOSIOThread {
  public:
-  IOSChromeIOThread(PrefService* local_state, net_log::ChromeNetLog* net_log);
+  IOSChromeIOThread(PrefService* local_state, net::NetLog* net_log);
   ~IOSChromeIOThread() override;
 
   network::mojom::NetworkContext* GetSystemNetworkContext();
diff --git a/ios/chrome/browser/ios_chrome_io_thread.mm b/ios/chrome/browser/ios_chrome_io_thread.mm
index 5f4136b..db06e723 100644
--- a/ios/chrome/browser/ios_chrome_io_thread.mm
+++ b/ios/chrome/browser/ios_chrome_io_thread.mm
@@ -14,7 +14,7 @@
 #endif
 
 IOSChromeIOThread::IOSChromeIOThread(PrefService* local_state,
-                                     net_log::ChromeNetLog* net_log)
+                                     net::NetLog* net_log)
     : IOSIOThread(local_state, net_log) {
   IOSChromeNetworkDelegate::InitializePrefsOnUIThread(nullptr, local_state);
 }
diff --git a/ios/chrome/browser/ui/autofill/BUILD.gn b/ios/chrome/browser/ui/autofill/BUILD.gn
index 47e85cd..1edc164c 100644
--- a/ios/chrome/browser/ui/autofill/BUILD.gn
+++ b/ios/chrome/browser/ui/autofill/BUILD.gn
@@ -26,6 +26,7 @@
     "//components/browser_sync",
     "//components/infobars/core",
     "//components/keyed_service/core",
+    "//components/leveldb_proto",
     "//components/password_manager/core/browser",
     "//components/prefs",
     "//components/strings",
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
index 334be37..bb3e01b 100644
--- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
+++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
@@ -14,6 +14,7 @@
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/card_unmask_delegate.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
+#include "components/autofill/core/browser/strike_database.h"
 #include "components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #import "components/autofill/ios/browser/autofill_client_ios_bridge.h"
@@ -47,6 +48,7 @@
   PrefService* GetPrefs() override;
   syncer::SyncService* GetSyncService() override;
   identity::IdentityManager* GetIdentityManager() override;
+  StrikeDatabase* GetStrikeDatabase() override;
   ukm::UkmRecorder* GetUkmRecorder() override;
   ukm::SourceId GetUkmSourceId() override;
   AddressNormalizer* GetAddressNormalizer() override;
@@ -108,6 +110,7 @@
   web::WebState* web_state_;
   __weak id<AutofillClientIOSBridge> bridge_;
   identity::IdentityManager* identity_manager_;
+  StrikeDatabase* strike_database_;
   scoped_refptr<AutofillWebDataService> autofill_web_data_service_;
   infobars::InfoBarManager* infobar_manager_;
   password_manager::PasswordGenerationManager* password_generation_manager_;
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
index b22fddc..7ee05b23 100644
--- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
+++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
@@ -22,6 +22,7 @@
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/autofill/address_normalizer_factory.h"
 #include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
+#include "ios/chrome/browser/autofill/strike_database_factory.h"
 #include "ios/chrome/browser/infobars/infobar.h"
 #include "ios/chrome/browser/infobars/infobar_utils.h"
 #include "ios/chrome/browser/metrics/ukm_url_recorder.h"
@@ -67,6 +68,8 @@
       bridge_(bridge),
       identity_manager_(IdentityManagerFactory::GetForBrowserState(
           browser_state->GetOriginalChromeBrowserState())),
+      strike_database_(StrikeDatabaseFactory::GetForBrowserState(
+          browser_state->GetOriginalChromeBrowserState())),
       autofill_web_data_service_(
           ios::WebDataServiceFactory::GetAutofillWebDataForBrowserState(
               browser_state,
@@ -101,6 +104,10 @@
   return identity_manager_;
 }
 
+StrikeDatabase* ChromeAutofillClientIOS::GetStrikeDatabase() {
+  return strike_database_;
+}
+
 ukm::UkmRecorder* ChromeAutofillClientIOS::GetUkmRecorder() {
   return GetApplicationContext()->GetUkmRecorder();
 }
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index 69fd27e..ac7e599 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -356,6 +356,29 @@
 
 }  // namespace
 
+#pragma mark - ToolbarContainerView
+
+// TODO(crbug.com/880672): This is a temporary solution.  This logic should be
+// handled by ToolbarContainerViewController.
+@interface ToolbarContainerView : UIView
+@end
+
+@implementation ToolbarContainerView
+
+- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event {
+  // Don't receive events that don't occur within a subview.  This is necessary
+  // because the container view overlaps with web content and the default
+  // behavior will intercept touches meant for the web page when the toolbars
+  // are collapsed.
+  for (UIView* subview in self.subviews) {
+    if (CGRectContainsPoint(subview.frame, point))
+      return [super hitTest:point withEvent:event];
+  }
+  return nil;
+}
+
+@end
+
 #pragma mark - HeaderDefinition helper
 
 // Class used to define a header, an object displayed at the top of the browser.
@@ -2431,7 +2454,7 @@
     if (self.secondaryToolbarCoordinator) {
       // Create the container view for the secondary toolbar and add it to the
       // hierarchy
-      UIView* container = [[UIView alloc] init];
+      UIView* container = [[ToolbarContainerView alloc] init];
       container.translatesAutoresizingMaskIntoConstraints = NO;
       [container
           addSubview:self.secondaryToolbarCoordinator.viewController.view];
diff --git a/ios/chrome/browser/ui/elements/BUILD.gn b/ios/chrome/browser/ui/elements/BUILD.gn
index 3b2a5c4..1c5c65c 100644
--- a/ios/chrome/browser/ui/elements/BUILD.gn
+++ b/ios/chrome/browser/ui/elements/BUILD.gn
@@ -25,6 +25,7 @@
   testonly = true
   sources = [
     "activity_overlay_coordinator_unittest.mm",
+    "chrome_activity_overlay_coordinator_unittest.mm",
     "selector_coordinator_unittest.mm",
     "selector_picker_view_controller_unittest.mm",
   ]
@@ -45,6 +46,10 @@
     "activity_overlay_coordinator.mm",
     "activity_overlay_view_controller.h",
     "activity_overlay_view_controller.mm",
+    "chrome_activity_overlay_coordinator.h",
+    "chrome_activity_overlay_coordinator.mm",
+    "chrome_activity_overlay_view_controller.h",
+    "chrome_activity_overlay_view_controller.mm",
   ]
   deps = [
     "//base",
diff --git a/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h b/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h
new file mode 100644
index 0000000..868a4853
--- /dev/null
+++ b/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h
@@ -0,0 +1,19 @@
+// Copyright 2018 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 IOS_CHROME_BROWSER_UI_ELEMENTS_CHROME_ACTIVITY_OVERLAY_COORDINATOR_H_
+#define IOS_CHROME_BROWSER_UI_ELEMENTS_CHROME_ACTIVITY_OVERLAY_COORDINATOR_H_
+
+#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
+
+// Coordinator for displaying a UIActivityIndicatorView overlay over the current
+// context.
+@interface ChromeActivityOverlayCoordinator : ChromeCoordinator
+
+// Text that will be shown above the UIActivityIndicatorView.
+@property(nonatomic, copy) NSString* messageText;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_ELEMENTS_CHROME_ACTIVITY_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.mm b/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.mm
new file mode 100644
index 0000000..ce4aae0
--- /dev/null
+++ b/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.mm
@@ -0,0 +1,54 @@
+// Copyright 2018 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.
+
+#import "ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h"
+
+#import "ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.h"
+#import "ios/chrome/common/ui_util/constraints_ui_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface ChromeActivityOverlayCoordinator ()
+// View controller that displays a native active indicator.
+@property(nonatomic, strong)
+    ChromeActivityOverlayViewController* chromeActivityOverlayViewController;
+@end
+
+@implementation ChromeActivityOverlayCoordinator
+
+- (void)start {
+  if (self.chromeActivityOverlayViewController)
+    return;
+
+  self.chromeActivityOverlayViewController =
+      [[ChromeActivityOverlayViewController alloc] init];
+
+  self.chromeActivityOverlayViewController.messageText = self.messageText;
+  [self.baseViewController
+      addChildViewController:self.chromeActivityOverlayViewController];
+  // Make sure frame of view is exactly the same size as its presenting view.
+  // Especially important when the presenting view is a bubble.
+  CGRect frame = self.chromeActivityOverlayViewController.view.frame;
+  frame.origin.x = 0;
+  frame.size.width = self.baseViewController.view.bounds.size.width;
+  frame.size.height = self.baseViewController.view.bounds.size.height;
+  self.chromeActivityOverlayViewController.view.frame = frame;
+  [self.baseViewController.view
+      addSubview:self.chromeActivityOverlayViewController.view];
+  [self.chromeActivityOverlayViewController
+      didMoveToParentViewController:self.baseViewController];
+}
+
+- (void)stop {
+  if (!self.chromeActivityOverlayViewController)
+    return;
+  [self.chromeActivityOverlayViewController willMoveToParentViewController:nil];
+  [self.chromeActivityOverlayViewController.view removeFromSuperview];
+  [self.chromeActivityOverlayViewController removeFromParentViewController];
+  self.chromeActivityOverlayViewController = nil;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator_unittest.mm b/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator_unittest.mm
new file mode 100644
index 0000000..968413a
--- /dev/null
+++ b/ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator_unittest.mm
@@ -0,0 +1,39 @@
+// Copyright 2018 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.
+
+#import "ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#import "testing/gtest_mac.h"
+#include "testing/platform_test.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using ChromeActivityOverlayCoordinatorTest = PlatformTest;
+
+// Tests that invoking start and stop on the coordinator presents and dismisses
+// the activity overlay view, respectively.
+TEST_F(ChromeActivityOverlayCoordinatorTest, StartAndStop) {
+  __weak UIView* overlay_view;
+  @autoreleasepool {
+    UIViewController* base_view_controller = [[UIViewController alloc] init];
+    ChromeActivityOverlayCoordinator* coordinator =
+        [[ChromeActivityOverlayCoordinator alloc]
+            initWithBaseViewController:base_view_controller];
+
+    EXPECT_EQ(0u, [base_view_controller.childViewControllers count]);
+
+    [coordinator start];
+    EXPECT_EQ(1u, [base_view_controller.childViewControllers count]);
+    overlay_view = [base_view_controller.childViewControllers firstObject].view;
+    EXPECT_TRUE(
+        [[base_view_controller.view subviews] containsObject:overlay_view]);
+
+    [coordinator stop];
+    EXPECT_EQ(0u, [base_view_controller.childViewControllers count]);
+  }
+  EXPECT_FALSE(overlay_view);
+}
diff --git a/ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.h b/ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.h
new file mode 100644
index 0000000..9b2703f
--- /dev/null
+++ b/ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.h
@@ -0,0 +1,19 @@
+// Copyright 2018 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 IOS_CHROME_BROWSER_UI_ELEMENTS_CHROME_ACTIVITY_OVERLAY_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_UI_ELEMENTS_CHROME_ACTIVITY_OVERLAY_VIEW_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+// View controller that displays a UIActivityIndicatorView and informative
+// |messageText| over a translucent background.
+@interface ChromeActivityOverlayViewController : UIViewController
+
+// Text that will be shown above the UIActivityIndicatorView.
+@property(nonatomic, copy) NSString* messageText;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_ELEMENTS_CHROME_ACTIVITY_OVERLAY_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.mm b/ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.mm
new file mode 100644
index 0000000..eb0c9b2
--- /dev/null
+++ b/ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.mm
@@ -0,0 +1,78 @@
+// Copyright 2018 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.
+
+#import "ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.h"
+
+#import "ios/chrome/common/ui_util/constraints_ui_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+// Alpha of the presented view's background.
+const CGFloat kViewBackgroundAlpha = 0.5;
+// Background white color of container view.
+const CGFloat kContainerBackgroundWhiteColor = 0.9;
+// Spacing between container view and subviews.
+const CGFloat kContainerViewSpacing = 25;
+// Corner radius of container view.
+const CGFloat kContainerCornerRadius = 10;
+// UIActivityIndicatorView's height and width
+const CGFloat kActivityIndicatorViewSize = 55;
+}
+
+@implementation ChromeActivityOverlayViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+  self.view.backgroundColor =
+      [UIColor colorWithWhite:0 alpha:kViewBackgroundAlpha];
+
+  UIView* containerView = [[UIView alloc] init];
+  containerView.translatesAutoresizingMaskIntoConstraints = NO;
+  containerView.backgroundColor =
+      [UIColor colorWithWhite:kContainerBackgroundWhiteColor alpha:1.0];
+  containerView.layer.cornerRadius = kContainerCornerRadius;
+  containerView.layer.masksToBounds = YES;
+
+  UIActivityIndicatorView* activityView = [[UIActivityIndicatorView alloc]
+      initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
+  activityView.color = [UIColor blackColor];
+  activityView.translatesAutoresizingMaskIntoConstraints = NO;
+  [activityView startAnimating];
+  [containerView addSubview:activityView];
+
+  UILabel* label = [[UILabel alloc] init];
+  label.translatesAutoresizingMaskIntoConstraints = NO;
+  label.text = self.messageText;
+  label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
+  [containerView addSubview:label];
+
+  NSArray* constraints = @[
+    [label.leadingAnchor constraintEqualToAnchor:containerView.leadingAnchor
+                                        constant:kContainerViewSpacing],
+    [label.trailingAnchor constraintEqualToAnchor:containerView.trailingAnchor
+                                         constant:-kContainerViewSpacing],
+    [label.topAnchor constraintEqualToAnchor:containerView.topAnchor
+                                    constant:kContainerViewSpacing],
+    [label.bottomAnchor constraintEqualToAnchor:activityView.topAnchor
+                                       constant:-5],
+    [activityView.bottomAnchor
+        constraintEqualToAnchor:containerView.bottomAnchor
+                       constant:-kContainerViewSpacing],
+    [activityView.centerXAnchor constraintEqualToAnchor:label.centerXAnchor
+                                               constant:0],
+    [activityView.heightAnchor
+        constraintEqualToConstant:kActivityIndicatorViewSize],
+    [activityView.widthAnchor
+        constraintEqualToConstant:kActivityIndicatorViewSize]
+  ];
+  [NSLayoutConstraint activateConstraints:constraints];
+
+  [self.view addSubview:containerView];
+  AddSameCenterConstraints(self.view, containerView);
+}
+
+@end
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_controller.h b/ios/chrome/browser/ui/fullscreen/fullscreen_controller.h
index c796a4b..c934bc6c 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_controller.h
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_controller.h
@@ -31,10 +31,9 @@
 
   // The WebStateList for the Browser whose fullscreen state is managed by this
   // controller.
-  // TODO(crbug.com/790886): Once FullscreenController is a BrowserUserData,
-  // remove this, as the Browser's WebStateList can be used directly rather than
-  // being set.
   virtual void SetWebStateList(WebStateList* web_state_list) = 0;
+  virtual const WebStateList* GetWebStateList() const = 0;
+  virtual WebStateList* GetWebStateList() = 0;
 
   // Adds and removes FullscreenControllerObservers.
   virtual void AddObserver(FullscreenControllerObserver* observer) = 0;
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.h b/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.h
index 73752124..63c532c 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.h
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.h
@@ -22,6 +22,8 @@
   // FullscreenController:
   ChromeBroadcaster* broadcaster() override;
   void SetWebStateList(WebStateList* web_state_list) override;
+  const WebStateList* GetWebStateList() const override;
+  WebStateList* GetWebStateList() override;
   void AddObserver(FullscreenControllerObserver* observer) override;
   void RemoveObserver(FullscreenControllerObserver* observer) override;
   bool IsEnabled() const override;
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm
index 854af5d..4a7d695 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm
@@ -59,6 +59,14 @@
   web_state_list_observer_.SetWebStateList(web_state_list);
 }
 
+const WebStateList* FullscreenControllerImpl::GetWebStateList() const {
+  return web_state_list_observer_.GetWebStateList();
+}
+
+WebStateList* FullscreenControllerImpl::GetWebStateList() {
+  return web_state_list_observer_.GetWebStateList();
+}
+
 void FullscreenControllerImpl::AddObserver(
     FullscreenControllerObserver* observer) {
   mediator_.AddObserver(observer);
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer.h b/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer.h
index f2b33ea..f56c6b5 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer.h
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer.h
@@ -27,8 +27,10 @@
                                  FullscreenMediator* mediator);
   ~FullscreenWebStateListObserver() override;
 
-  // Starts observing |web_state_list|.
+  // The WebStateList being observed.
   void SetWebStateList(WebStateList* web_state_list);
+  const WebStateList* GetWebStateList() const;
+  WebStateList* GetWebStateList();
 
   // Stops observing the the WebStateList.
   void Disconnect();
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer.mm
index c9408d4..af307e1 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer.mm
@@ -46,6 +46,14 @@
   }
 }
 
+const WebStateList* FullscreenWebStateListObserver::GetWebStateList() const {
+  return web_state_list_;
+}
+
+WebStateList* FullscreenWebStateListObserver::GetWebStateList() {
+  return web_state_list_;
+}
+
 void FullscreenWebStateListObserver::Disconnect() {
   SetWebStateList(nullptr);
 }
diff --git a/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.h b/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.h
index fd22a7b..39cc9ac 100644
--- a/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.h
+++ b/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.h
@@ -23,6 +23,8 @@
   // FullscreenController:
   ChromeBroadcaster* broadcaster() override;
   void SetWebStateList(WebStateList* web_state_list) override;
+  const WebStateList* GetWebStateList() const override;
+  WebStateList* GetWebStateList() override;
   void AddObserver(FullscreenControllerObserver* observer) override;
   void RemoveObserver(FullscreenControllerObserver* observer) override;
   bool IsEnabled() const override;
diff --git a/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.mm b/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.mm
index e50b6762..e172d77 100644
--- a/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.mm
+++ b/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.mm
@@ -25,6 +25,14 @@
 
 void TestFullscreenController::SetWebStateList(WebStateList* web_state_list) {}
 
+const WebStateList* TestFullscreenController::GetWebStateList() const {
+  return nullptr;
+}
+
+WebStateList* TestFullscreenController::GetWebStateList() {
+  return nullptr;
+}
+
 void TestFullscreenController::AddObserver(
     FullscreenControllerObserver* observer) {
   observers_.AddObserver(observer);
diff --git a/ios/chrome/browser/ui/open_in_controller.h b/ios/chrome/browser/ui/open_in_controller.h
index fd89aac..5981a3dd 100644
--- a/ios/chrome/browser/ui/open_in_controller.h
+++ b/ios/chrome/browser/ui/open_in_controller.h
@@ -17,6 +17,17 @@
 class SharedURLLoaderFactory;
 }
 
+// Enum for the IOS.OpenIn.DownloadResult UMA histogram to log the result of
+// the file download initiated when the user tap on "open in" button.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class OpenInDownloadResult {
+  kSucceeded = 0,
+  kCanceled = 1,
+  kFailed = 2,
+  kMaxValue = kFailed,
+};
+
 @class CRWWebController;
 
 // Class used to handle opening files in other applications.
diff --git a/ios/chrome/browser/ui/open_in_controller.mm b/ios/chrome/browser/ui/open_in_controller.mm
index 56a3999..976fa9d 100644
--- a/ios/chrome/browser/ui/open_in_controller.mm
+++ b/ios/chrome/browser/ui/open_in_controller.mm
@@ -9,6 +9,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/mac/scoped_cftyperef.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/task/post_task.h"
@@ -62,6 +63,11 @@
 // Bottom margin for the label displayed on the |overlayedView_|.
 const CGFloat kOverlayedViewLabelBottomMargin = 60;
 
+// Logs the result of the download process after the user taps "open in" button.
+void LogOpenInDownloadResult(const OpenInDownloadResult result) {
+  UMA_HISTOGRAM_ENUMERATION("IOS.OpenIn.DownloadResult", result);
+}
+
 // Returns true if the file located at |url| is a valid PDF file.
 bool HasValidPdfAtUrl(NSURL* _Nullable url) {
   if (!url)
@@ -599,19 +605,23 @@
   if (!filePath.empty())
     fileURL = [NSURL fileURLWithPath:base::SysUTF8ToNSString(filePath.value())];
   if (!downloadCanceled_ && HasValidPdfAtUrl(fileURL)) {
+    LogOpenInDownloadResult(OpenInDownloadResult::kSucceeded);
     [self presentOpenInMenuForFileAtURL:fileURL];
     return;
   }
   sequencedTaskRunner_->PostTask(FROM_HERE, base::BindOnce(^{
                                    [self removeDocumentAtPath:fileURL.path];
                                  }));
+  OpenInDownloadResult download_result = OpenInDownloadResult::kCanceled;
   if (!downloadCanceled_) {
+    download_result = OpenInDownloadResult::kFailed;
     if (IsIPadIdiom())
       [self hideOpenInToolbar];
     [self removeOverlayedView];
     [self showErrorWithMessage:l10n_util::GetNSStringWithFixup(
                                    IDS_IOS_OPEN_IN_FILE_DOWNLOAD_FAILED)];
   }
+  LogOpenInDownloadResult(download_result);
 }
 
 #pragma mark -
diff --git a/ios/chrome/browser/ui/open_in_controller_unittest.mm b/ios/chrome/browser/ui/open_in_controller_unittest.mm
index 55d78ea..e353cb4db 100644
--- a/ios/chrome/browser/ui/open_in_controller_unittest.mm
+++ b/ios/chrome/browser/ui/open_in_controller_unittest.mm
@@ -8,6 +8,7 @@
 
 #include "base/files/file_util.h"
 #include "base/strings/sys_string_conversions.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_task_environment.h"
 #import "ios/chrome/browser/tabs/tab.h"
 #import "ios/chrome/browser/ui/open_in_controller.h"
@@ -28,6 +29,8 @@
 
 namespace {
 
+const char kOpenInDownloadResultHistogram[] = "IOS.OpenIn.DownloadResult";
+
 class OpenInControllerTest : public PlatformTest {
  public:
   OpenInControllerTest()
@@ -80,9 +83,11 @@
   net::TestURLFetcherFactory factory_;
   OpenInController* open_in_controller_;
   UIView* parent_view_;
+  base::HistogramTester histogram_tester_;
 };
 
 TEST_F(OpenInControllerTest, TestDisplayOpenInMenu) {
+  histogram_tester_.ExpectTotalCount(kOpenInDownloadResultHistogram, 0);
   id document_controller =
       [OCMockObject niceMockForClass:[UIDocumentInteractionController class]];
   [open_in_controller_ setDocumentInteractionController:document_controller];
@@ -99,11 +104,16 @@
   test_url_loader_factory_.SimulateResponseForPendingRequest(
       pending_request->request.url.spec(), pdf_str);
   scoped_task_environment_.RunUntilIdle();
-
+  histogram_tester_.ExpectBucketCount(kOpenInDownloadResultHistogram,
+                                      static_cast<base::HistogramBase::Sample>(
+                                          OpenInDownloadResult::kSucceeded),
+                                      1);
+  histogram_tester_.ExpectTotalCount(kOpenInDownloadResultHistogram, 1);
   EXPECT_OCMOCK_VERIFY(document_controller);
 }
 
 TEST_F(OpenInControllerTest, TestCorruptedPDFDownload) {
+  histogram_tester_.ExpectTotalCount(kOpenInDownloadResultHistogram, 0);
   id document_controller =
       [OCMockObject niceMockForClass:[UIDocumentInteractionController class]];
   [open_in_controller_ setDocumentInteractionController:document_controller];
@@ -119,7 +129,11 @@
   test_url_loader_factory_.SimulateResponseForPendingRequest(
       pending_request->request.url.spec(), pdf_str.substr(pdf_str.size() / 2));
   scoped_task_environment_.RunUntilIdle();
-
+  histogram_tester_.ExpectBucketCount(
+      kOpenInDownloadResultHistogram,
+      static_cast<base::HistogramBase::Sample>(OpenInDownloadResult::kFailed),
+      1);
+  histogram_tester_.ExpectTotalCount(kOpenInDownloadResultHistogram, 1);
   EXPECT_OCMOCK_VERIFY(document_controller);
 }
 
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn
index a8f94b1..f63c282 100644
--- a/ios/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -181,6 +181,7 @@
     "//ios/chrome/browser/ui/content_suggestions/cells",
     "//ios/chrome/browser/ui/content_suggestions/cells:cells_ui",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
+    "//ios/chrome/browser/ui/elements:elements_internal",
     "//ios/chrome/browser/ui/icons",
     "//ios/chrome/browser/ui/keyboard",
     "//ios/chrome/browser/ui/list_model",
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm
index a76abf8..5e796657 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller.mm
@@ -29,6 +29,7 @@
 #import "ios/chrome/browser/ui/commands/application_commands.h"
 #import "ios/chrome/browser/ui/commands/browsing_data_commands.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
+#import "ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h"
 #import "ios/chrome/browser/ui/icons/chrome_icon.h"
 #import "ios/chrome/browser/ui/settings/cells/clear_browsing_data_constants.h"
 #import "ios/chrome/browser/ui/settings/cells/clear_browsing_data_item.h"
@@ -104,6 +105,11 @@
 // Coordinator that managers an action sheet to clear browsing data.
 @property(nonatomic, strong) ActionSheetCoordinator* actionSheetCoordinator;
 
+// Coordinator for displaying a modal overlay with native activity indicator to
+// prevent the user from interacting with the page.
+@property(nonatomic, strong)
+    ChromeActivityOverlayCoordinator* chromeActivityOverlayCoordinator;
+
 // Restarts the counters for data types specified in the mask.
 - (void)restartCounters:(BrowsingDataRemoveMask)mask;
 
@@ -236,10 +242,40 @@
                           completionBlock:(ProceduralBlock)completionBlock {
   base::RecordAction(
       base::UserMetricsAction("MobileClearBrowsingDataTriggeredFromLegacyUI"));
-  [self.dispatcher removeBrowsingDataForBrowserState:browserState
-                                          timePeriod:timePeriod
-                                          removeMask:removeMask
-                                     completionBlock:completionBlock];
+
+  // Show activity indicator modal while removal is happening.
+  self.chromeActivityOverlayCoordinator =
+      [[ChromeActivityOverlayCoordinator alloc]
+          initWithBaseViewController:self.navigationController];
+  self.chromeActivityOverlayCoordinator.messageText =
+      l10n_util::GetNSStringWithFixup(
+          IDS_HISTORY_OPEN_CLEAR_BROWSING_DATA_DIALOG);
+  [self.chromeActivityOverlayCoordinator start];
+
+  __weak ClearBrowsingDataCollectionViewController* weakSelf = self;
+  dispatch_time_t timeOneSecondLater =
+      dispatch_time(DISPATCH_TIME_NOW, (1 * NSEC_PER_SEC));
+  void (^removeBrowsingDidFinishCompletionBlock)(void) = ^void() {
+    ClearBrowsingDataCollectionViewController* strongSelf = weakSelf;
+    if (!strongSelf) {
+      return;
+    }
+
+    // Sometimes clear browsing data is really short
+    // (<1sec), so ensure that overlay displays for at
+    // least 1 second instead of looking like a glitch.
+    dispatch_after(timeOneSecondLater, dispatch_get_main_queue(), ^{
+      [self.chromeActivityOverlayCoordinator stop];
+      if (completionBlock)
+        completionBlock();
+    });
+
+  };
+  [self.dispatcher
+      removeBrowsingDataForBrowserState:browserState
+                             timePeriod:timePeriod
+                             removeMask:removeMask
+                        completionBlock:removeBrowsingDidFinishCompletionBlock];
 }
 
 #pragma mark UICollectionViewDelegate
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.mm
index 6303438..68004abb 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data_table_view_controller.mm
@@ -12,6 +12,7 @@
 #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h"
 #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
+#import "ios/chrome/browser/ui/elements/chrome_activity_overlay_coordinator.h"
 #import "ios/chrome/browser/ui/settings/cells/table_view_clear_browsing_data_item.h"
 #include "ios/chrome/browser/ui/settings/clear_browsing_data_local_commands.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data_manager.h"
@@ -51,6 +52,11 @@
 // Coordinator that managers a UIAlertController to clear browsing data.
 @property(nonatomic, strong) ActionSheetCoordinator* actionSheetCoordinator;
 
+// Coordinator for displaying a modal overlay with native activity indicator to
+// prevent the user from interacting with the page.
+@property(nonatomic, strong)
+    ChromeActivityOverlayCoordinator* chromeActivityOverlayCoordinator;
+
 // Reference to clear browsing data button for positioning popover confirmation
 // dialog.
 @property(nonatomic, strong) UIButton* clearBrowsingDataButton;
@@ -250,10 +256,39 @@
                           completionBlock:(ProceduralBlock)completionBlock {
   base::RecordAction(
       base::UserMetricsAction("MobileClearBrowsingDataTriggeredFromUIRefresh"));
-  [self.dispatcher removeBrowsingDataForBrowserState:browserState
-                                          timePeriod:timePeriod
-                                          removeMask:removeMask
-                                     completionBlock:completionBlock];
+
+  // Show activity indicator modal while removal is happening.
+  self.chromeActivityOverlayCoordinator =
+      [[ChromeActivityOverlayCoordinator alloc]
+          initWithBaseViewController:self.navigationController];
+  self.chromeActivityOverlayCoordinator.messageText =
+      l10n_util::GetNSStringWithFixup(
+          IDS_IOS_CLEAR_BROWSING_DATA_ACTIVITY_MODAL);
+  [self.chromeActivityOverlayCoordinator start];
+
+  __weak ClearBrowsingDataTableViewController* weakSelf = self;
+  dispatch_time_t timeOneSecondLater =
+      dispatch_time(DISPATCH_TIME_NOW, (1 * NSEC_PER_SEC));
+  void (^removeBrowsingDidFinishCompletionBlock)(void) = ^void() {
+    ClearBrowsingDataTableViewController* strongSelf = weakSelf;
+    if (!strongSelf) {
+      return;
+    }
+    // Sometimes clear browsing data is really short
+    // (<1sec), so ensure that overlay displays for at
+    // least 1 second instead of looking like a glitch.
+    dispatch_after(timeOneSecondLater, dispatch_get_main_queue(), ^{
+      [self.chromeActivityOverlayCoordinator stop];
+      if (completionBlock)
+        completionBlock();
+    });
+  };
+
+  [self.dispatcher
+      removeBrowsingDataForBrowserState:browserState
+                             timePeriod:timePeriod
+                             removeMask:removeMask
+                        completionBlock:removeBrowsingDidFinishCompletionBlock];
 }
 
 - (void)showBrowsingHistoryRemovedDialog {
diff --git a/ios/chrome/browser/ui/webui/net_export/net_export_ui.mm b/ios/chrome/browser/ui/webui/net_export/net_export_ui.mm
index c3a5281..6dc6229 100644
--- a/ios/chrome/browser/ui/webui/net_export/net_export_ui.mm
+++ b/ios/chrome/browser/ui/webui/net_export/net_export_ui.mm
@@ -14,7 +14,6 @@
 #include "base/strings/string_util.h"
 #include "base/values.h"
 #include "components/grit/components_resources.h"
-#include "components/net_log/chrome_net_log.h"
 #include "components/net_log/net_export_file_writer.h"
 #include "components/net_log/net_export_ui_constants.h"
 #include "ios/chrome/browser/application_context.h"
@@ -79,8 +78,8 @@
   void NotifyUIWithState(
       std::unique_ptr<base::DictionaryValue> file_writer_state);
 
-  // Cache of GetApplicationContex()->GetNetLog()->net_export_file_writer().
-  // This is owned by ChromeNetLog which is owned by BrowserProcessImpl.
+  // Cache of GetApplicationContext()->GetNetExportFileWriter().
+  // This is owned by the ApplicationContext.
   net_log::NetExportFileWriter* file_writer_;
 
   ScopedObserver<net_log::NetExportFileWriter,
@@ -93,8 +92,7 @@
 };
 
 NetExportMessageHandler::NetExportMessageHandler()
-    : file_writer_(
-          GetApplicationContext()->GetNetLog()->net_export_file_writer()),
+    : file_writer_(GetApplicationContext()->GetNetExportFileWriter()),
       state_observer_manager_(this),
       weak_ptr_factory_(this) {
   file_writer_->Initialize();
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
index abc2b90..e2b9173 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
@@ -111,6 +111,10 @@
                                           ConfirmClearBrowsingDataButton()]
       performAction:grey_tap()];
 
+  // Wait until activity indicator modal is cleared, meaning clearing browsing
+  // data has been finished.
+  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+
   // Include sufficientlyVisible condition for the case of the clear browsing
   // dialog, which also has a "Done" button and is displayed over the history
   // panel.
diff --git a/ios/chrome/test/testing_application_context.h b/ios/chrome/test/testing_application_context.h
index 8b932c0..48f003fa 100644
--- a/ios/chrome/test/testing_application_context.h
+++ b/ios/chrome/test/testing_application_context.h
@@ -54,7 +54,8 @@
   ukm::UkmRecorder* GetUkmRecorder() override;
   variations::VariationsService* GetVariationsService() override;
   rappor::RapporServiceImpl* GetRapporServiceImpl() override;
-  net_log::ChromeNetLog* GetNetLog() override;
+  net::NetLog* GetNetLog() override;
+  net_log::NetExportFileWriter* GetNetExportFileWriter() override;
   network_time::NetworkTimeTracker* GetNetworkTimeTracker() override;
   IOSChromeIOThread* GetIOSChromeIOThread() override;
   gcm::GCMDriver* GetGCMDriver() override;
diff --git a/ios/chrome/test/testing_application_context.mm b/ios/chrome/test/testing_application_context.mm
index 0874f83..056b2df 100644
--- a/ios/chrome/test/testing_application_context.mm
+++ b/ios/chrome/test/testing_application_context.mm
@@ -150,7 +150,13 @@
   return nullptr;
 }
 
-net_log::ChromeNetLog* TestingApplicationContext::GetNetLog() {
+net::NetLog* TestingApplicationContext::GetNetLog() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  return nullptr;
+}
+
+net_log::NetExportFileWriter*
+TestingApplicationContext::GetNetExportFileWriter() {
   DCHECK(thread_checker_.CalledOnValidThread());
   return nullptr;
 }
diff --git a/ios/components/io_thread/ios_io_thread.h b/ios/components/io_thread/ios_io_thread.h
index 4d792929..407f564 100644
--- a/ios/components/io_thread/ios_io_thread.h
+++ b/ios/components/io_thread/ios_io_thread.h
@@ -39,6 +39,7 @@
 class HttpTransactionFactory;
 class HttpUserAgentSettings;
 class LoggingNetworkChangeObserver;
+class NetLog;
 class NetworkDelegate;
 class ProxyConfigService;
 class ProxyResolutionService;
@@ -49,10 +50,6 @@
 class URLRequestJobFactory;
 }  // namespace net
 
-namespace net_log {
-class ChromeNetLog;
-}  // namespace net_log
-
 namespace io_thread {
 
 class SystemURLRequestContextGetter;
@@ -126,7 +123,7 @@
   };
 
   // |net_log| must either outlive the IOSIOThread or be NULL.
-  IOSIOThread(PrefService* local_state, net_log::ChromeNetLog* net_log);
+  IOSIOThread(PrefService* local_state, net::NetLog* net_log);
   ~IOSIOThread() override;
 
   // Can only be called on the IO thread.
@@ -137,7 +134,7 @@
   // into IOSIOThread global objects.
   void SetGlobalsForTesting(Globals* globals);
 
-  net_log::ChromeNetLog* net_log();
+  net::NetLog* net_log();
 
   // Handles changing to On The Record mode, discarding confidential data.
   void ChangedToOnTheRecord();
@@ -187,7 +184,7 @@
 
   // The NetLog is owned by the application context, to allow logging from other
   // threads during shutdown, but is used most frequently on the IO thread.
-  net_log::ChromeNetLog* net_log_;
+  net::NetLog* net_log_;
 
   // These member variables are basically global, but their lifetimes are tied
   // to the IOSIOThread.  IOSIOThread owns them all, despite not using
@@ -201,7 +198,7 @@
 
   net::HttpNetworkSession::Params params_;
 
-  // Observer that logs network changes to the ChromeNetLog.
+  // Observer that logs network changes to the NetLog.
   std::unique_ptr<net::LoggingNetworkChangeObserver> network_change_observer_;
 
   // These member variables are initialized by a task posted to the IO thread,
diff --git a/ios/components/io_thread/ios_io_thread.mm b/ios/components/io_thread/ios_io_thread.mm
index 80a2868..c7382ee 100644
--- a/ios/components/io_thread/ios_io_thread.mm
+++ b/ios/components/io_thread/ios_io_thread.mm
@@ -27,7 +27,6 @@
 #include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
-#include "components/net_log/chrome_net_log.h"
 #include "components/network_session_configurator/browser/network_session_configurator.h"
 #include "components/prefs/pref_service.h"
 #include "components/proxy_config/ios/proxy_service_factory.h"
@@ -53,6 +52,7 @@
 #include "net/http/http_auth_preferences.h"
 #include "net/http/http_network_layer.h"
 #include "net/http/http_server_properties_impl.h"
+#include "net/log/net_log.h"
 #include "net/log/net_log_event_type.h"
 #include "net/proxy_resolution/pac_file_fetcher_impl.h"
 #include "net/proxy_resolution/proxy_config_service.h"
@@ -174,11 +174,8 @@
 
 // |local_state| is passed in explicitly in order to (1) reduce implicit
 // dependencies and (2) make IOSIOThread more flexible for testing.
-IOSIOThread::IOSIOThread(PrefService* local_state,
-                         net_log::ChromeNetLog* net_log)
-    : net_log_(net_log),
-      globals_(nullptr),
-      weak_factory_(this) {
+IOSIOThread::IOSIOThread(PrefService* local_state, net::NetLog* net_log)
+    : net_log_(net_log), globals_(nullptr), weak_factory_(this) {
   pref_proxy_config_tracker_ =
       ProxyServiceFactory::CreatePrefProxyConfigTrackerOfLocalState(
           local_state);
@@ -208,7 +205,7 @@
   globals_ = globals;
 }
 
-net_log::ChromeNetLog* IOSIOThread::net_log() {
+net::NetLog* IOSIOThread::net_log() {
   return net_log_;
 }
 
@@ -239,7 +236,7 @@
   DCHECK(!globals_);
   globals_ = new Globals;
 
-  // Add an observer that will emit network change events to the ChromeNetLog.
+  // Add an observer that will emit network change events to the NetLog.
   // Assuming NetworkChangeNotifier dispatches in FIFO order, we should be
   // logging the network change before other IO thread consumers respond to it.
   network_change_observer_ =
@@ -306,7 +303,7 @@
   // Release objects that the net::URLRequestContext could have been pointing
   // to.
 
-  // This must be reset before the ChromeNetLog is destroyed.
+  // This must be reset before the NetLog is destroyed.
   network_change_observer_.reset();
 
   system_proxy_config_service_.reset();
diff --git a/ios/components/io_thread/ios_io_thread_unittest.mm b/ios/components/io_thread/ios_io_thread_unittest.mm
index e231bd3..cc1580d 100644
--- a/ios/components/io_thread/ios_io_thread_unittest.mm
+++ b/ios/components/io_thread/ios_io_thread_unittest.mm
@@ -27,7 +27,7 @@
 // A concrete implementation of IOThread for testing.
 class TestIOThread : public io_thread::IOSIOThread {
  public:
-  TestIOThread(PrefService* local_state, net_log::ChromeNetLog* net_log)
+  TestIOThread(PrefService* local_state, net::NetLog* net_log)
       : IOSIOThread(local_state, net_log) {}
   ~TestIOThread() override {}
 
diff --git a/ios/web/web_state/ui/crw_web_controller_container_view.mm b/ios/web/web_state/ui/crw_web_controller_container_view.mm
index 7d953f3..14d7a115 100644
--- a/ios/web/web_state/ui/crw_web_controller_container_view.mm
+++ b/ios/web/web_state/ui/crw_web_controller_container_view.mm
@@ -114,7 +114,10 @@
 - (void)layoutSubviews {
   [super layoutSubviews];
 
+  // webViewContentView layout.  |-setNeedsLayout| is called in case any webview
+  // layout updates need to occur despite the bounds size staying constant.
   self.webViewContentView.frame = self.bounds;
+  [self.webViewContentView setNeedsLayout];
 
   // TODO(crbug.com/570114): Move adding of the following subviews to another
   // place.
diff --git a/ios/web_view/BUILD.gn b/ios/web_view/BUILD.gn
index e47e5b5..59b6e434 100644
--- a/ios/web_view/BUILD.gn
+++ b/ios/web_view/BUILD.gn
@@ -99,6 +99,8 @@
   "internal/autofill/web_view_autofill_client_ios.mm",
   "internal/autofill/web_view_personal_data_manager_factory.cc",
   "internal/autofill/web_view_personal_data_manager_factory.h",
+  "internal/autofill/web_view_strike_database_factory.cc",
+  "internal/autofill/web_view_strike_database_factory.h",
   "internal/content_settings/web_view_cookie_settings_factory.cc",
   "internal/content_settings/web_view_cookie_settings_factory.h",
   "internal/content_settings/web_view_host_content_settings_map_factory.cc",
diff --git a/ios/web_view/internal/app/web_view_io_thread.h b/ios/web_view/internal/app/web_view_io_thread.h
index 0ffa7d04..deacfecb 100644
--- a/ios/web_view/internal/app/web_view_io_thread.h
+++ b/ios/web_view/internal/app/web_view_io_thread.h
@@ -11,9 +11,9 @@
 
 class PrefService;
 
-namespace net_log {
-class ChromeNetLog;
-}  // namespace net_log
+namespace net {
+class NetLog;
+}  // namespace net
 
 namespace ios_web_view {
 
@@ -21,7 +21,7 @@
 // primarily used on, the IO thread.
 class WebViewIOThread : public io_thread::IOSIOThread {
  public:
-  WebViewIOThread(PrefService* local_state, net_log::ChromeNetLog* net_log);
+  WebViewIOThread(PrefService* local_state, net::NetLog* net_log);
   ~WebViewIOThread() override;
 
  protected:
diff --git a/ios/web_view/internal/app/web_view_io_thread.mm b/ios/web_view/internal/app/web_view_io_thread.mm
index d964634..0ff7b29c 100644
--- a/ios/web_view/internal/app/web_view_io_thread.mm
+++ b/ios/web_view/internal/app/web_view_io_thread.mm
@@ -12,8 +12,7 @@
 
 namespace ios_web_view {
 
-WebViewIOThread::WebViewIOThread(PrefService* local_state,
-                                 net_log::ChromeNetLog* net_log)
+WebViewIOThread::WebViewIOThread(PrefService* local_state, net::NetLog* net_log)
     : IOSIOThread(local_state, net_log) {}
 
 WebViewIOThread::~WebViewIOThread() = default;
diff --git a/ios/web_view/internal/autofill/cwv_autofill_controller.mm b/ios/web_view/internal/autofill/cwv_autofill_controller.mm
index e1730588..8ba3df76 100644
--- a/ios/web_view/internal/autofill/cwv_autofill_controller.mm
+++ b/ios/web_view/internal/autofill/cwv_autofill_controller.mm
@@ -33,6 +33,7 @@
 #import "ios/web_view/internal/autofill/cwv_credit_card_verifier_internal.h"
 #import "ios/web_view/internal/autofill/web_view_autofill_client_ios.h"
 #include "ios/web_view/internal/autofill/web_view_personal_data_manager_factory.h"
+#include "ios/web_view/internal/autofill/web_view_strike_database_factory.h"
 #import "ios/web_view/internal/passwords/cwv_password_controller.h"
 #include "ios/web_view/internal/signin/web_view_identity_manager_factory.h"
 #import "ios/web_view/internal/sync/web_view_profile_sync_service_factory.h"
@@ -108,6 +109,8 @@
         _webState, self,
         ios_web_view::WebViewIdentityManagerFactory::GetForBrowserState(
             browserState->GetRecordingBrowserState()),
+        ios_web_view::WebViewStrikeDatabaseFactory::GetForBrowserState(
+            browserState->GetRecordingBrowserState()),
         ios_web_view::WebViewWebDataServiceWrapperFactory::
             GetAutofillWebDataForBrowserState(
                 browserState, ServiceAccessType::EXPLICIT_ACCESS),
diff --git a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
index 9afdfcf..17269dd 100644
--- a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
+++ b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
@@ -14,6 +14,7 @@
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/card_unmask_delegate.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
+#include "components/autofill/core/browser/strike_database.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/prefs/pref_service.h"
 #include "components/sync/driver/sync_service.h"
@@ -31,6 +32,7 @@
       web::WebState* web_state,
       id<CWVAutofillClientIOSBridge> bridge,
       identity::IdentityManager* identity_manager,
+      StrikeDatabase* strike_database,
       scoped_refptr<AutofillWebDataService> autofill_web_data_service,
       syncer::SyncService* sync_service);
   ~WebViewAutofillClientIOS() override;
@@ -40,6 +42,7 @@
   PrefService* GetPrefs() override;
   syncer::SyncService* GetSyncService() override;
   identity::IdentityManager* GetIdentityManager() override;
+  StrikeDatabase* GetStrikeDatabase() override;
   ukm::UkmRecorder* GetUkmRecorder() override;
   ukm::SourceId GetUkmSourceId() override;
   AddressNormalizer* GetAddressNormalizer() override;
@@ -100,6 +103,7 @@
   web::WebState* web_state_;
   __weak id<CWVAutofillClientIOSBridge> bridge_;
   identity::IdentityManager* identity_manager_;
+  StrikeDatabase* strike_database_;
   scoped_refptr<AutofillWebDataService> autofill_web_data_service_;
   syncer::SyncService* sync_service_ = nullptr;
 
diff --git a/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm b/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm
index 9577f35..db2cdb6 100644
--- a/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm
+++ b/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm
@@ -23,6 +23,7 @@
     web::WebState* web_state,
     id<CWVAutofillClientIOSBridge> bridge,
     identity::IdentityManager* identity_manager,
+    StrikeDatabase* strike_database,
     scoped_refptr<AutofillWebDataService> autofill_web_data_service,
     syncer::SyncService* sync_service)
     : pref_service_(pref_service),
@@ -30,6 +31,7 @@
       web_state_(web_state),
       bridge_(bridge),
       identity_manager_(identity_manager),
+      strike_database_(strike_database),
       autofill_web_data_service_(autofill_web_data_service),
       sync_service_(sync_service) {}
 
@@ -53,6 +55,10 @@
   return identity_manager_;
 }
 
+StrikeDatabase* WebViewAutofillClientIOS::GetStrikeDatabase() {
+  return strike_database_;
+}
+
 ukm::UkmRecorder* WebViewAutofillClientIOS::GetUkmRecorder() {
   // UKM recording is not supported for WebViews.
   return nullptr;
diff --git a/ios/web_view/internal/autofill/web_view_strike_database_factory.cc b/ios/web_view/internal/autofill/web_view_strike_database_factory.cc
new file mode 100644
index 0000000..f0ce6c3
--- /dev/null
+++ b/ios/web_view/internal/autofill/web_view_strike_database_factory.cc
@@ -0,0 +1,46 @@
+// Copyright 2018 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 "ios/web_view/internal/autofill/web_view_strike_database_factory.h"
+
+#include <utility>
+
+#include "base/memory/singleton.h"
+#include "components/autofill/core/browser/strike_database.h"
+#include "components/keyed_service/ios/browser_state_dependency_manager.h"
+#include "ios/web_view/internal/app/application_context.h"
+#include "ios/web_view/internal/web_view_browser_state.h"
+
+namespace ios_web_view {
+
+// static
+autofill::StrikeDatabase* WebViewStrikeDatabaseFactory::GetForBrowserState(
+    WebViewBrowserState* browser_state) {
+  return static_cast<autofill::StrikeDatabase*>(
+      GetInstance()->GetServiceForBrowserState(browser_state, true));
+}
+
+// static
+WebViewStrikeDatabaseFactory* WebViewStrikeDatabaseFactory::GetInstance() {
+  return base::Singleton<WebViewStrikeDatabaseFactory>::get();
+}
+
+WebViewStrikeDatabaseFactory::WebViewStrikeDatabaseFactory()
+    : BrowserStateKeyedServiceFactory(
+          "AutofillStrikeDatabase",
+          BrowserStateDependencyManager::GetInstance()) {}
+
+WebViewStrikeDatabaseFactory::~WebViewStrikeDatabaseFactory() {}
+
+std::unique_ptr<KeyedService>
+WebViewStrikeDatabaseFactory::BuildServiceInstanceFor(
+    web::BrowserState* context) const {
+  WebViewBrowserState* browser_state =
+      WebViewBrowserState::FromBrowserState(context);
+  return std::make_unique<autofill::StrikeDatabase>(
+      browser_state->GetStatePath().Append(
+          FILE_PATH_LITERAL("AutofillStrikeDatabase")));
+}
+
+}  // namespace ios_web_view
diff --git a/ios/web_view/internal/autofill/web_view_strike_database_factory.h b/ios/web_view/internal/autofill/web_view_strike_database_factory.h
new file mode 100644
index 0000000..93b48395
--- /dev/null
+++ b/ios/web_view/internal/autofill/web_view_strike_database_factory.h
@@ -0,0 +1,48 @@
+// Copyright 2018 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 IOS_WEB_VIEW_INTERNAL_AUTOFILL_WEB_VIEW_STRIKE_DATABASE_FACTORY_H_
+#define IOS_WEB_VIEW_INTERNAL_AUTOFILL_WEB_VIEW_STRIKE_DATABASE_FACTORY_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
+
+namespace base {
+template <typename T>
+struct DefaultSingletonTraits;
+}  // namespace base
+
+namespace autofill {
+class StrikeDatabase;
+}
+
+namespace ios_web_view {
+class WebViewBrowserState;
+
+// Singleton that owns all StrikeDatabases and associates them with
+// ios_web_view::WebViewBrowserState.
+class WebViewStrikeDatabaseFactory : public BrowserStateKeyedServiceFactory {
+ public:
+  static autofill::StrikeDatabase* GetForBrowserState(
+      WebViewBrowserState* browser_state);
+  static WebViewStrikeDatabaseFactory* GetInstance();
+
+ private:
+  friend struct base::DefaultSingletonTraits<WebViewStrikeDatabaseFactory>;
+
+  WebViewStrikeDatabaseFactory();
+  ~WebViewStrikeDatabaseFactory() override;
+
+  // BrowserStateKeyedServiceFactory implementation.
+  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
+      web::BrowserState* context) const override;
+
+  DISALLOW_COPY_AND_ASSIGN(WebViewStrikeDatabaseFactory);
+};
+
+}  // namespace ios_web_view
+
+#endif  // IOS_WEB_VIEW_INTERNAL_AUTOFILL_WEB_VIEW_STRIKE_DATABASE_FACTORY_H_
diff --git a/media/capture/video/mac/video_capture_device_factory_mac.mm b/media/capture/video/mac/video_capture_device_factory_mac.mm
index 48d3552..b9a79a7 100644
--- a/media/capture/video/mac/video_capture_device_factory_mac.mm
+++ b/media/capture/video/mac/video_capture_device_factory_mac.mm
@@ -19,12 +19,28 @@
 #import "media/capture/video/mac/video_capture_device_decklink_mac.h"
 #include "media/capture/video/mac/video_capture_device_mac.h"
 
-namespace media {
+namespace {
+
+void EnsureRunsOnCFRunLoopEnabledThread() {
+  static bool has_checked_cfrunloop_for_video_capture = false;
+  if (!has_checked_cfrunloop_for_video_capture) {
+    base::ScopedCFTypeRef<CFRunLoopMode> mode(
+        CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent()));
+    CHECK(mode != NULL)
+        << "The MacOS video capture code must be run on a CFRunLoop-enabled "
+           "thread";
+    has_checked_cfrunloop_for_video_capture = true;
+  }
+}
 
 // Blacklisted devices are identified by a characteristic trailing substring of
 // uniqueId. At the moment these are just Blackmagic devices.
 const char* kBlacklistedCamerasIdSignature[] = {"-01FDA82C8A9C"};
 
+}  // anonymous namespace
+
+namespace media {
+
 static bool IsDeviceBlacklisted(
     const VideoCaptureDeviceDescriptor& descriptor) {
   bool is_device_blacklisted = false;
@@ -52,6 +68,7 @@
     const VideoCaptureDeviceDescriptor& descriptor) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK_NE(descriptor.capture_api, VideoCaptureApi::UNKNOWN);
+  EnsureRunsOnCFRunLoopEnabledThread();
 
   std::unique_ptr<VideoCaptureDevice> capture_device;
   if (descriptor.capture_api == VideoCaptureApi::MACOSX_DECKLINK) {
@@ -70,6 +87,8 @@
 void VideoCaptureDeviceFactoryMac::GetDeviceDescriptors(
     VideoCaptureDeviceDescriptors* device_descriptors) {
   DCHECK(thread_checker_.CalledOnValidThread());
+  EnsureRunsOnCFRunLoopEnabledThread();
+
   // Loop through all available devices and add to |device_descriptors|.
   NSDictionary* capture_devices;
   DVLOG(1) << "Enumerating video capture devices using AVFoundation";
diff --git a/media/capture/video/mac/video_capture_device_factory_mac_unittest.mm b/media/capture/video/mac/video_capture_device_factory_mac_unittest.mm
index f9b1641..4ccc067e 100644
--- a/media/capture/video/mac/video_capture_device_factory_mac_unittest.mm
+++ b/media/capture/video/mac/video_capture_device_factory_mac_unittest.mm
@@ -2,22 +2,46 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 #include "media/capture/video/mac/video_capture_device_factory_mac.h"
+#include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "media/capture/video/mac/video_capture_device_mac.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace media {
 
-TEST(VideoCaptureDeviceFactoryMacTest, ListDevicesAVFoundation) {
-  VideoCaptureDeviceFactoryMac video_capture_device_factory;
+// Video capture code on MacOSX must run on a CFRunLoop enabled thread
+// for interaction with AVFoundation.
+// In order to make the test case run on the actual message loop that has
+// been created for this thread, we need to run it inside a RunLoop. This is
+// required, because on MacOS the capture code must run on a CFRunLoop
+// enabled message loop.
+void RunTestCase(base::OnceClosure test_case) {
+  base::test::ScopedTaskEnvironment scoped_task_environment(
+      base::test::ScopedTaskEnvironment::MainThreadType::UI);
+  base::RunLoop run_loop;
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(
+                     [](base::RunLoop* run_loop, base::OnceClosure* test_case) {
+                       std::move(*test_case).Run();
+                       run_loop->Quit();
+                     },
+                     &run_loop, &test_case));
+  run_loop.Run();
+}
 
-  VideoCaptureDeviceDescriptors descriptors;
-  video_capture_device_factory.GetDeviceDescriptors(&descriptors);
-  if (descriptors.empty()) {
-    DVLOG(1) << "No camera available. Exiting test.";
-    return;
-  }
-  for (const auto& descriptor : descriptors)
-    EXPECT_EQ(VideoCaptureApi::MACOSX_AVFOUNDATION, descriptor.capture_api);
+TEST(VideoCaptureDeviceFactoryMacTest, ListDevicesAVFoundation) {
+  RunTestCase(base::BindOnce([]() {
+    VideoCaptureDeviceFactoryMac video_capture_device_factory;
+
+    VideoCaptureDeviceDescriptors descriptors;
+    video_capture_device_factory.GetDeviceDescriptors(&descriptors);
+    if (descriptors.empty()) {
+      DVLOG(1) << "No camera available. Exiting test.";
+      return;
+    }
+    for (const auto& descriptor : descriptors)
+      EXPECT_EQ(VideoCaptureApi::MACOSX_AVFOUNDATION, descriptor.capture_api);
+  }));
 }
 
 };  // namespace media
diff --git a/media/capture/video/video_capture_device_unittest.cc b/media/capture/video/video_capture_device_unittest.cc
index de269cd9..b322dbe 100644
--- a/media/capture/video/video_capture_device_unittest.cc
+++ b/media/capture/video/video_capture_device_unittest.cc
@@ -206,11 +206,27 @@
   }
 #endif
 
+  void RunOpenInvalidDeviceTestCase();
+  void RunCaptureWithSizeTestCase();
+  void RunAllocateBadSizeTestCase();
+  void RunReAllocateCameraTestCase();
+  void RunCaptureMjpegTestCase();
+  void RunNoCameraSupportsPixelFormatMaxTestCase();
+  void RunTakePhotoTestCase();
+  void RunGetPhotoStateTestCase();
+
  protected:
   typedef VideoCaptureDevice::Client Client;
 
   VideoCaptureDeviceTest()
-      : device_descriptors_(new VideoCaptureDeviceDescriptors()),
+      :
+#if defined(OS_MACOSX)
+        // Video capture code on MacOSX must run on a CFRunLoop enabled thread
+        // for interaction with AVFoundation.
+        scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::UI),
+#endif
+        device_descriptors_(new VideoCaptureDeviceDescriptors()),
         main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
         video_capture_client_(CreateDeviceClient()),
         image_capture_client_(new MockImageCaptureClient()) {
@@ -295,7 +311,8 @@
   }
 
   void WaitForCapturedFrame() {
-    run_loop_.reset(new base::RunLoop());
+    run_loop_.reset(
+        new base::RunLoop(base::RunLoop::Type::kNestableTasksAllowed));
     run_loop_->Run();
   }
 
@@ -388,6 +405,27 @@
     return supported_formats.begin()->frame_size;
   }
 
+  void RunTestCase(base::OnceClosure test_case) {
+#if defined(OS_MACOSX)
+    // In order to make the test case run on the actual message loop that has
+    // been created for this thread, we need to run it inside a RunLoop. This is
+    // required, because on MacOS the capture code must run on a CFRunLoop
+    // enabled message loop.
+    base::RunLoop run_loop;
+    main_thread_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(
+            [](base::RunLoop* run_loop, base::OnceClosure* test_case) {
+              std::move(*test_case).Run();
+              run_loop->Quit();
+            },
+            &run_loop, &test_case));
+    run_loop.Run();
+#else
+    std::move(test_case).Run();
+#endif
+  }
+
 #if defined(OS_WIN)
   base::win::ScopedCOMInitializer initialize_com_;
 #endif
@@ -413,6 +451,11 @@
 #endif
 // Tries to allocate an invalid device and verifies it doesn't work.
 WRAPPED_TEST_P(VideoCaptureDeviceTest, MAYBE_OpenInvalidDevice) {
+  RunTestCase(
+      base::BindOnce(&VideoCaptureDeviceTest::RunOpenInvalidDeviceTestCase,
+                     base::Unretained(this)));
+}
+void VideoCaptureDeviceTest::RunOpenInvalidDeviceTestCase() {
   VideoCaptureDeviceDescriptor invalid_descriptor;
   invalid_descriptor.device_id = "jibberish";
   invalid_descriptor.set_display_name("jibberish");
@@ -452,6 +495,11 @@
 
 // Allocates the first enumerated device, and expects a frame.
 WRAPPED_TEST_P(VideoCaptureDeviceTest, CaptureWithSize) {
+  RunTestCase(
+      base::BindOnce(&VideoCaptureDeviceTest::RunCaptureWithSizeTestCase,
+                     base::Unretained(this)));
+}
+void VideoCaptureDeviceTest::RunCaptureWithSizeTestCase() {
   const auto descriptor = FindUsableDeviceDescriptor();
   if (!descriptor)
     return;
@@ -502,6 +550,11 @@
 // Allocates a device with an uncommon resolution and verifies frames are
 // captured in a close, much more typical one.
 WRAPPED_TEST_P(VideoCaptureDeviceTest, MAYBE_AllocateBadSize) {
+  RunTestCase(
+      base::BindOnce(&VideoCaptureDeviceTest::RunAllocateBadSizeTestCase,
+                     base::Unretained(this)));
+}
+void VideoCaptureDeviceTest::RunAllocateBadSizeTestCase() {
   const auto descriptor = FindUsableDeviceDescriptor();
   if (!descriptor)
     return;
@@ -529,6 +582,11 @@
 
 // Cause hangs on Windows, Linux. Fails Android. https://crbug.com/417824
 WRAPPED_TEST_P(VideoCaptureDeviceTest, DISABLED_ReAllocateCamera) {
+  RunTestCase(
+      base::BindOnce(&VideoCaptureDeviceTest::RunReAllocateCameraTestCase,
+                     base::Unretained(this)));
+}
+void VideoCaptureDeviceTest::RunReAllocateCameraTestCase() {
   const auto descriptor = FindUsableDeviceDescriptor();
   if (!descriptor)
     return;
@@ -573,6 +631,10 @@
 
 // Starts the camera in 720p to try and capture MJPEG format.
 WRAPPED_TEST_P(VideoCaptureDeviceTest, MAYBE_CaptureMjpeg) {
+  RunTestCase(base::BindOnce(&VideoCaptureDeviceTest::RunCaptureMjpegTestCase,
+                             base::Unretained(this)));
+}
+void VideoCaptureDeviceTest::RunCaptureMjpegTestCase() {
   std::unique_ptr<VideoCaptureDeviceDescriptor> device_descriptor =
       GetFirstDeviceDescriptorSupportingPixelFormat(PIXEL_FORMAT_MJPEG);
   if (!device_descriptor) {
@@ -610,6 +672,11 @@
 }
 
 WRAPPED_TEST_P(VideoCaptureDeviceTest, NoCameraSupportsPixelFormatMax) {
+  RunTestCase(base::BindOnce(
+      &VideoCaptureDeviceTest::RunNoCameraSupportsPixelFormatMaxTestCase,
+      base::Unretained(this)));
+}
+void VideoCaptureDeviceTest::RunNoCameraSupportsPixelFormatMaxTestCase() {
   // Use PIXEL_FORMAT_MAX to iterate all device names for testing
   // GetDeviceSupportedFormats().
   std::unique_ptr<VideoCaptureDeviceDescriptor> device_descriptor =
@@ -622,6 +689,10 @@
 // Starts the camera and verifies that a photo can be taken. The correctness of
 // the photo is enforced by MockImageCaptureClient.
 WRAPPED_TEST_P(VideoCaptureDeviceTest, MAYBE_TakePhoto) {
+  RunTestCase(base::BindOnce(&VideoCaptureDeviceTest::RunTakePhotoTestCase,
+                             base::Unretained(this)));
+}
+void VideoCaptureDeviceTest::RunTakePhotoTestCase() {
   const auto descriptor = FindUsableDeviceDescriptor();
   if (!descriptor)
     return;
@@ -654,7 +725,7 @@
   VideoCaptureDevice::TakePhotoCallback scoped_callback = base::BindOnce(
       &MockImageCaptureClient::DoOnPhotoTaken, image_capture_client_);
 
-  base::RunLoop run_loop;
+  base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
   base::Closure quit_closure = BindToCurrentLoop(run_loop.QuitClosure());
   EXPECT_CALL(*image_capture_client_.get(), OnCorrectPhotoTaken())
       .Times(1)
@@ -668,6 +739,10 @@
 
 // Starts the camera and verifies that the photo capabilities can be retrieved.
 WRAPPED_TEST_P(VideoCaptureDeviceTest, MAYBE_GetPhotoState) {
+  RunTestCase(base::BindOnce(&VideoCaptureDeviceTest::RunGetPhotoStateTestCase,
+                             base::Unretained(this)));
+}
+void VideoCaptureDeviceTest::RunGetPhotoStateTestCase() {
   const auto descriptor = FindUsableDeviceDescriptor();
   if (!descriptor)
     return;
@@ -704,7 +779,7 @@
   // On Chrome OS AllocateAndStart() is asynchronous, so wait until we get the
   // first frame.
   WaitForCapturedFrame();
-  base::RunLoop run_loop;
+  base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
   base::Closure quit_closure = BindToCurrentLoop(run_loop.QuitClosure());
   EXPECT_CALL(*image_capture_client_.get(), OnCorrectGetPhotoState())
       .Times(1)
@@ -765,7 +840,7 @@
   VideoCaptureDevice::TakePhotoCallback scoped_callback = base::BindOnce(
       &MockImageCaptureClient::DoOnPhotoTaken, image_capture_client_);
 
-  base::RunLoop run_loop;
+  base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
   base::RepeatingClosure quit_closure =
       BindToCurrentLoop(run_loop.QuitClosure());
   EXPECT_CALL(*image_capture_client_.get(), OnCorrectPhotoTaken())
diff --git a/media/ffmpeg/ffmpeg_common_unittest.cc b/media/ffmpeg/ffmpeg_common_unittest.cc
index 39146cf2..4f66dd1 100644
--- a/media/ffmpeg/ffmpeg_common_unittest.cc
+++ b/media/ffmpeg/ffmpeg_common_unittest.cc
@@ -82,7 +82,7 @@
 TEST_F(FFmpegCommonTest, AVStreamToDecoderConfig) {
   // Open a file to get a real AVStreams from FFmpeg.
   base::MemoryMappedFile file;
-  file.Initialize(GetTestDataFilePath("bear-320x240.webm"));
+  ASSERT_TRUE(file.Initialize(GetTestDataFilePath("bear-320x240.webm")));
   InMemoryUrlProtocol protocol(file.data(), file.length(), false);
   FFmpegGlue glue(&protocol);
   ASSERT_TRUE(glue.OpenContext());
@@ -125,8 +125,8 @@
 
 TEST_F(FFmpegCommonTest, AVStreamToAudioDecoderConfig_OpusAmbisonics_4ch) {
   base::MemoryMappedFile file;
-  file.Initialize(
-      GetTestDataFilePath("bear-opus-end-trimming-4ch-channelmapping2.webm"));
+  ASSERT_TRUE(file.Initialize(
+      GetTestDataFilePath("bear-opus-end-trimming-4ch-channelmapping2.webm")));
   InMemoryUrlProtocol protocol(file.data(), file.length(), false);
   FFmpegGlue glue(&protocol);
   ASSERT_TRUE(glue.OpenContext());
@@ -148,8 +148,8 @@
 
 TEST_F(FFmpegCommonTest, AVStreamToAudioDecoderConfig_OpusAmbisonics_11ch) {
   base::MemoryMappedFile file;
-  file.Initialize(
-      GetTestDataFilePath("bear-opus-end-trimming-11ch-channelmapping2.webm"));
+  ASSERT_TRUE(file.Initialize(
+      GetTestDataFilePath("bear-opus-end-trimming-11ch-channelmapping2.webm")));
   InMemoryUrlProtocol protocol(file.data(), file.length(), false);
   FFmpegGlue glue(&protocol);
   ASSERT_TRUE(glue.OpenContext());
@@ -171,7 +171,7 @@
 
 TEST_F(FFmpegCommonTest, AVStreamToAudioDecoderConfig_9ch_wav) {
   base::MemoryMappedFile file;
-  file.Initialize(GetTestDataFilePath("9ch.wav"));
+  ASSERT_TRUE(file.Initialize(GetTestDataFilePath("9ch.wav")));
   InMemoryUrlProtocol protocol(file.data(), file.length(), false);
   FFmpegGlue glue(&protocol);
   ASSERT_TRUE(glue.OpenContext());
diff --git a/media/filters/file_data_source.cc b/media/filters/file_data_source.cc
index 6249bde..8ec8b612 100644
--- a/media/filters/file_data_source.cc
+++ b/media/filters/file_data_source.cc
@@ -17,18 +17,16 @@
       bytes_read_(0) {
 }
 
-FileDataSource::FileDataSource(base::File file)
-    : force_read_errors_(false),
-      force_streaming_(false),
-      bytes_read_(0) {
-  file_.Initialize(std::move(file));
-}
-
 bool FileDataSource::Initialize(const base::FilePath& file_path) {
   DCHECK(!file_.IsValid());
   return file_.Initialize(file_path);
 }
 
+bool FileDataSource::Initialize(base::File file) {
+  DCHECK(!file_.IsValid());
+  return file_.Initialize(std::move(file));
+}
+
 void FileDataSource::Stop() {}
 
 void FileDataSource::Abort() {}
diff --git a/media/filters/file_data_source.h b/media/filters/file_data_source.h
index 7db58b4..f177b8c1 100644
--- a/media/filters/file_data_source.h
+++ b/media/filters/file_data_source.h
@@ -22,10 +22,10 @@
 class MEDIA_EXPORT FileDataSource : public DataSource {
  public:
   FileDataSource();
-  explicit FileDataSource(base::File file);
   ~FileDataSource() override;
 
-  bool Initialize(const base::FilePath& file_path);
+  WARN_UNUSED_RESULT bool Initialize(const base::FilePath& file_path);
+  WARN_UNUSED_RESULT bool Initialize(base::File file);
 
   // Implementation of DataSource.
   void Stop() override;
diff --git a/media/filters/media_file_checker.cc b/media/filters/media_file_checker.cc
index abbbf4f7..643a19b 100644
--- a/media/filters/media_file_checker.cc
+++ b/media/filters/media_file_checker.cc
@@ -37,7 +37,10 @@
 MediaFileChecker::~MediaFileChecker() = default;
 
 bool MediaFileChecker::Start(base::TimeDelta check_time) {
-  media::FileDataSource source(std::move(file_));
+  media::FileDataSource source;
+  if (!source.Initialize(std::move(file_)))
+    return false;
+
   bool read_ok = true;
   media::BlockingUrlProtocol protocol(
       &source, base::Bind(&OnMediaFileCheckerError, &read_ok));
diff --git a/net/BUILD.gn b/net/BUILD.gn
index c1d422a..1e2f8d7 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -451,8 +451,6 @@
       "base/hex_utils.h",
       "base/host_mapping_rules.cc",
       "base/host_mapping_rules.h",
-      "base/int128.cc",
-      "base/int128.h",
       "base/iovec.h",
       "base/ip_pattern.cc",
       "base/ip_pattern.h",
@@ -4635,7 +4633,6 @@
     "base/hex_utils_test.cc",
     "base/host_mapping_rules_unittest.cc",
     "base/host_port_pair_unittest.cc",
-    "base/int128_unittest.cc",
     "base/interval_set_test.cc",
     "base/interval_test.cc",
     "base/ip_address_unittest.cc",
@@ -5148,6 +5145,7 @@
     "third_party/quic/platform/api/quic_text_utils_test.cc",
     "third_party/quic/platform/api/quic_url_test.cc",
     "third_party/quic/platform/impl/quic_chromium_clock_test.cc",
+    "third_party/quic/platform/impl/quic_uint128_impl_unittest.cc",
     "third_party/quic/quartc/quartc_session_test.cc",
     "third_party/quic/quartc/quartc_stream_test.cc",
     "third_party/quic/quartc/simulated_packet_transport.cc",
diff --git a/net/base/int128.cc b/net/base/int128.cc
deleted file mode 100644
index 1e677cb..0000000
--- a/net/base/int128.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2012 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 "net/base/int128.h"
-
-#include <ostream>
-
-namespace net {
-
-const uint128_pod kuint128max = {static_cast<uint64_t>(0xFFFFFFFFFFFFFFFFULL),
-                                 static_cast<uint64_t>(0xFFFFFFFFFFFFFFFFULL)};
-
-std::ostream& operator<<(std::ostream& o, const uint128& b) {
-  return (o << b.hi_ << "::" << b.lo_);
-}
-
-}  // namespace net
diff --git a/net/base/int128.h b/net/base/int128.h
deleted file mode 100644
index c2fc51b..0000000
--- a/net/base/int128.h
+++ /dev/null
@@ -1,349 +0,0 @@
-// Copyright (c) 2012 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 NET_BASE_INT128_H_
-#define NET_BASE_INT128_H_
-
-#include <stdint.h>
-
-#include <iosfwd>
-
-#include "net/base/net_export.h"
-
-namespace net {
-
-struct uint128_pod;
-
-// An unsigned 128-bit integer type. Thread-compatible.
-class uint128 {
- public:
-  uint128();  // Sets to 0, but don't trust on this behavior.
-  uint128(uint64_t top, uint64_t bottom);
-  uint128(int bottom);
-  uint128(uint32_t bottom);  // Top 96 bits = 0
-  uint128(uint64_t bottom);  // hi_ = 0
-  uint128(const uint128 &val);
-  uint128(const uint128_pod &val);
-
-  void Initialize(uint64_t top, uint64_t bottom);
-
-  uint128& operator=(const uint128& b);
-
-  // Arithmetic operators.
-  // TODO: division, etc.
-  uint128& operator+=(const uint128& b);
-  uint128& operator-=(const uint128& b);
-  uint128& operator*=(const uint128& b);
-  uint128 operator++(int);
-  uint128 operator--(int);
-  uint128& operator<<=(int);
-  uint128& operator>>=(int);
-  uint128& operator&=(const uint128& b);
-  uint128& operator|=(const uint128& b);
-  uint128& operator^=(const uint128& b);
-  uint128& operator++();
-  uint128& operator--();
-
-  friend uint64_t Uint128Low64(const uint128& v);
-  friend uint64_t Uint128High64(const uint128& v);
-
-  // We add "std::" to avoid including all of port.h.
-  friend NET_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& o,
-                                                     const uint128& b);
-
- private:
-  // Little-endian memory order optimizations can benefit from
-  // having lo_ first, hi_ last.
-  // See util/endian/endian.h and Load128/Store128 for storing a uint128.
-  uint64_t lo_;
-  uint64_t hi_;
-
-  // Not implemented, just declared for catching automatic type conversions.
-  uint128(uint8_t);
-  uint128(uint16_t);
-  uint128(float v);
-  uint128(double v);
-};
-
-inline uint128 MakeUint128(uint64_t top, uint64_t bottom) {
-  return uint128(top, bottom);
-}
-
-// This is a POD form of uint128 which can be used for static variables which
-// need to be operated on as uint128.
-struct uint128_pod {
-  // Note: The ordering of fields is different than 'class uint128' but the
-  // same as its 2-arg constructor.  This enables more obvious initialization
-  // of static instances, which is the primary reason for this struct in the
-  // first place.  This does not seem to defeat any optimizations wrt
-  // operations involving this struct.
-  uint64_t hi;
-  uint64_t lo;
-};
-
-NET_EXPORT_PRIVATE extern const uint128_pod kuint128max;
-
-// allow uint128 to be logged
-NET_EXPORT_PRIVATE extern std::ostream& operator<<(std::ostream& o,
-                                                   const uint128& b);
-
-// Methods to access low and high pieces of 128-bit value.
-// Defined externally from uint128 to facilitate conversion
-// to native 128-bit types when compilers support them.
-inline uint64_t Uint128Low64(const uint128& v) {
-  return v.lo_;
-}
-inline uint64_t Uint128High64(const uint128& v) {
-  return v.hi_;
-}
-
-// TODO: perhaps it would be nice to have int128, a signed 128-bit type?
-
-// --------------------------------------------------------------------------
-//                      Implementation details follow
-// --------------------------------------------------------------------------
-inline bool operator==(const uint128& lhs, const uint128& rhs) {
-  return (Uint128Low64(lhs) == Uint128Low64(rhs) &&
-          Uint128High64(lhs) == Uint128High64(rhs));
-}
-inline bool operator!=(const uint128& lhs, const uint128& rhs) {
-  return !(lhs == rhs);
-}
-inline uint128& uint128::operator=(const uint128& b) {
-  lo_ = b.lo_;
-  hi_ = b.hi_;
-  return *this;
-}
-
-inline uint128::uint128(): lo_(0), hi_(0) { }
-inline uint128::uint128(uint64_t top, uint64_t bottom)
-    : lo_(bottom), hi_(top) {}
-inline uint128::uint128(const uint128 &v) : lo_(v.lo_), hi_(v.hi_) { }
-inline uint128::uint128(const uint128_pod &v) : lo_(v.lo), hi_(v.hi) { }
-inline uint128::uint128(uint64_t bottom) : lo_(bottom), hi_(0) {}
-inline uint128::uint128(uint32_t bottom) : lo_(bottom), hi_(0) {}
-inline uint128::uint128(int bottom) : lo_(bottom), hi_(0) {
-  if (bottom < 0) {
-    --hi_;
-  }
-}
-inline void uint128::Initialize(uint64_t top, uint64_t bottom) {
-  hi_ = top;
-  lo_ = bottom;
-}
-
-// Comparison operators.
-
-#define CMP128(op)                                                \
-inline bool operator op(const uint128& lhs, const uint128& rhs) { \
-  return (Uint128High64(lhs) == Uint128High64(rhs)) ?             \
-      (Uint128Low64(lhs) op Uint128Low64(rhs)) :                  \
-      (Uint128High64(lhs) op Uint128High64(rhs));                 \
-}
-
-CMP128(<)
-CMP128(>)
-CMP128(>=)
-CMP128(<=)
-
-#undef CMP128
-
-// Unary operators
-
-inline uint128 operator-(const uint128& val) {
-  const uint64_t hi_flip = ~Uint128High64(val);
-  const uint64_t lo_flip = ~Uint128Low64(val);
-  const uint64_t lo_add = lo_flip + 1;
-  if (lo_add < lo_flip) {
-    return uint128(hi_flip + 1, lo_add);
-  }
-  return uint128(hi_flip, lo_add);
-}
-
-inline bool operator!(const uint128& val) {
-  return !Uint128High64(val) && !Uint128Low64(val);
-}
-
-// Logical operators.
-
-inline uint128 operator~(const uint128& val) {
-  return uint128(~Uint128High64(val), ~Uint128Low64(val));
-}
-
-#define LOGIC128(op)                                                 \
-inline uint128 operator op(const uint128& lhs, const uint128& rhs) { \
-  return uint128(Uint128High64(lhs) op Uint128High64(rhs),           \
-                 Uint128Low64(lhs) op Uint128Low64(rhs));            \
-}
-
-LOGIC128(|)
-LOGIC128(&)
-LOGIC128(^)
-
-#undef LOGIC128
-
-#define LOGICASSIGN128(op)                                   \
-inline uint128& uint128::operator op(const uint128& other) { \
-  hi_ op other.hi_;                                          \
-  lo_ op other.lo_;                                          \
-  return *this;                                              \
-}
-
-LOGICASSIGN128(|=)
-LOGICASSIGN128(&=)
-LOGICASSIGN128(^=)
-
-#undef LOGICASSIGN128
-
-// Shift operators.
-
-inline uint128 operator<<(const uint128& val, int amount) {
-  // uint64_t shifts of >= 64 are undefined, so we will need some
-  // special-casing.
-  if (amount < 64) {
-    if (amount == 0) {
-      return val;
-    }
-    uint64_t new_hi =
-        (Uint128High64(val) << amount) | (Uint128Low64(val) >> (64 - amount));
-    uint64_t new_lo = Uint128Low64(val) << amount;
-    return uint128(new_hi, new_lo);
-  } else if (amount < 128) {
-    return uint128(Uint128Low64(val) << (amount - 64), 0);
-  } else {
-    return uint128(0, 0);
-  }
-}
-
-inline uint128 operator>>(const uint128& val, int amount) {
-  // uint64_t shifts of >= 64 are undefined, so we will need some
-  // special-casing.
-  if (amount < 64) {
-    if (amount == 0) {
-      return val;
-    }
-    uint64_t new_hi = Uint128High64(val) >> amount;
-    uint64_t new_lo =
-        (Uint128Low64(val) >> amount) | (Uint128High64(val) << (64 - amount));
-    return uint128(new_hi, new_lo);
-  } else if (amount < 128) {
-    return uint128(0, Uint128High64(val) >> (amount - 64));
-  } else {
-    return uint128(0, 0);
-  }
-}
-
-inline uint128& uint128::operator<<=(int amount) {
-  // uint64_t shifts of >= 64 are undefined, so we will need some
-  // special-casing.
-  if (amount < 64) {
-    if (amount != 0) {
-      hi_ = (hi_ << amount) | (lo_ >> (64 - amount));
-      lo_ = lo_ << amount;
-    }
-  } else if (amount < 128) {
-    hi_ = lo_ << (amount - 64);
-    lo_ = 0;
-  } else {
-    hi_ = 0;
-    lo_ = 0;
-  }
-  return *this;
-}
-
-inline uint128& uint128::operator>>=(int amount) {
-  // uint64_t shifts of >= 64 are undefined, so we will need some
-  // special-casing.
-  if (amount < 64) {
-    if (amount != 0) {
-      lo_ = (lo_ >> amount) | (hi_ << (64 - amount));
-      hi_ = hi_ >> amount;
-    }
-  } else if (amount < 128) {
-    hi_ = 0;
-    lo_ = hi_ >> (amount - 64);
-  } else {
-    hi_ = 0;
-    lo_ = 0;
-  }
-  return *this;
-}
-
-inline uint128 operator+(const uint128& lhs, const uint128& rhs) {
-  return uint128(lhs) += rhs;
-}
-
-inline uint128 operator-(const uint128& lhs, const uint128& rhs) {
-  return uint128(lhs) -= rhs;
-}
-
-inline uint128 operator*(const uint128& lhs, const uint128& rhs) {
-  return uint128(lhs) *= rhs;
-}
-
-inline uint128& uint128::operator+=(const uint128& b) {
-  hi_ += b.hi_;
-  uint64_t lolo = lo_ + b.lo_;
-  if (lolo < lo_)
-    ++hi_;
-  lo_ = lolo;
-  return *this;
-}
-
-inline uint128& uint128::operator-=(const uint128& b) {
-  hi_ -= b.hi_;
-  if (b.lo_ > lo_)
-    --hi_;
-  lo_ -= b.lo_;
-  return *this;
-}
-
-inline uint128& uint128::operator*=(const uint128& b) {
-  uint64_t a96 = hi_ >> 32;
-  uint64_t a64 = hi_ & 0xffffffffu;
-  uint64_t a32 = lo_ >> 32;
-  uint64_t a00 = lo_ & 0xffffffffu;
-  uint64_t b96 = b.hi_ >> 32;
-  uint64_t b64 = b.hi_ & 0xffffffffu;
-  uint64_t b32 = b.lo_ >> 32;
-  uint64_t b00 = b.lo_ & 0xffffffffu;
-  // multiply [a96 .. a00] x [b96 .. b00]
-  // terms higher than c96 disappear off the high side
-  // terms c96 and c64 are safe to ignore carry bit
-  uint64_t c96 = a96 * b00 + a64 * b32 + a32 * b64 + a00 * b96;
-  uint64_t c64 = a64 * b00 + a32 * b32 + a00 * b64;
-  this->hi_ = (c96 << 32) + c64;
-  this->lo_ = 0;
-  // add terms after this one at a time to capture carry
-  *this += uint128(a32 * b00) << 32;
-  *this += uint128(a00 * b32) << 32;
-  *this += a00 * b00;
-  return *this;
-}
-
-inline uint128 uint128::operator++(int) {
-  uint128 tmp(*this);
-  *this += 1;
-  return tmp;
-}
-
-inline uint128 uint128::operator--(int) {
-  uint128 tmp(*this);
-  *this -= 1;
-  return tmp;
-}
-
-inline uint128& uint128::operator++() {
-  *this += 1;
-  return *this;
-}
-
-inline uint128& uint128::operator--() {
-  *this -= 1;
-  return *this;
-}
-
-}  //  namespace net
-
-#endif  // NET_BASE_INT128_H_
diff --git a/net/base/int128_unittest.cc b/net/base/int128_unittest.cc
deleted file mode 100644
index 9a902897..0000000
--- a/net/base/int128_unittest.cc
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright (c) 2012 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 <stdint.h>
-
-#include <limits>
-
-#include "base/logging.h"
-#include "net/base/int128.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace net {
-
-namespace test {
-
-TEST(Int128, AllTests) {
-  uint128 zero(0);
-  uint128 one(1);
-  uint128 one_2arg(0, 1);
-  uint128 two(0, 2);
-  uint128 three(0, 3);
-  uint128 big(2000, 2);
-  uint128 big_minus_one(2000, 1);
-  uint128 bigger(2001, 1);
-  uint128 biggest(kuint128max);
-  uint128 high_low(1, 0);
-  uint128 low_high(0, std::numeric_limits<uint64_t>::max());
-  EXPECT_LT(one, two);
-  EXPECT_GT(two, one);
-  EXPECT_LT(one, big);
-  EXPECT_LT(one, big);
-  EXPECT_EQ(one, one_2arg);
-  EXPECT_NE(one, two);
-  EXPECT_GT(big, one);
-  EXPECT_GE(big, two);
-  EXPECT_GE(big, big_minus_one);
-  EXPECT_GT(big, big_minus_one);
-  EXPECT_LT(big_minus_one, big);
-  EXPECT_LE(big_minus_one, big);
-  EXPECT_NE(big_minus_one, big);
-  EXPECT_LT(big, biggest);
-  EXPECT_LE(big, biggest);
-  EXPECT_GT(biggest, big);
-  EXPECT_GE(biggest, big);
-  EXPECT_EQ(big, ~~big);
-  EXPECT_EQ(one, one | one);
-  EXPECT_EQ(big, big | big);
-  EXPECT_EQ(one, one | zero);
-  EXPECT_EQ(one, one & one);
-  EXPECT_EQ(big, big & big);
-  EXPECT_EQ(zero, one & zero);
-  EXPECT_EQ(zero, big & ~big);
-  EXPECT_EQ(zero, one ^ one);
-  EXPECT_EQ(zero, big ^ big);
-  EXPECT_EQ(one, one ^ zero);
-  EXPECT_EQ(big, big << 0);
-  EXPECT_EQ(big, big >> 0);
-  EXPECT_GT(big << 1, big);
-  EXPECT_LT(big >> 1, big);
-  EXPECT_EQ(big, (big << 10) >> 10);
-  EXPECT_EQ(big, (big >> 1) << 1);
-  EXPECT_EQ(one, (one << 80) >> 80);
-  EXPECT_EQ(zero, (one >> 80) << 80);
-  EXPECT_EQ(zero, big >> 128);
-  EXPECT_EQ(zero, big << 128);
-  EXPECT_EQ(Uint128High64(biggest), std::numeric_limits<uint64_t>::max());
-  EXPECT_EQ(Uint128Low64(biggest), std::numeric_limits<uint64_t>::max());
-  EXPECT_EQ(zero + one, one);
-  EXPECT_EQ(one + one, two);
-  EXPECT_EQ(big_minus_one + one, big);
-  EXPECT_EQ(one - one, zero);
-  EXPECT_EQ(one - zero, one);
-  EXPECT_EQ(zero - one, biggest);
-  EXPECT_EQ(big - big, zero);
-  EXPECT_EQ(big - one, big_minus_one);
-  EXPECT_EQ(big + std::numeric_limits<uint64_t>::max(), bigger);
-  EXPECT_EQ(biggest + 1, zero);
-  EXPECT_EQ(zero - 1, biggest);
-  EXPECT_EQ(high_low - one, low_high);
-  EXPECT_EQ(low_high + one, high_low);
-  EXPECT_EQ(Uint128High64((uint128(1) << 64) - 1), 0u);
-  EXPECT_EQ(Uint128Low64((uint128(1) << 64) - 1),
-            std::numeric_limits<uint64_t>::max());
-  EXPECT_TRUE(!!one);
-  EXPECT_TRUE(!!high_low);
-  EXPECT_FALSE(!!zero);
-  EXPECT_FALSE(!one);
-  EXPECT_FALSE(!high_low);
-  EXPECT_TRUE(!zero);
-  EXPECT_TRUE(zero == 0);
-  EXPECT_FALSE(zero != 0);
-  EXPECT_FALSE(one == 0);
-  EXPECT_TRUE(one != 0);
-
-  uint128 test = zero;
-  EXPECT_EQ(++test, one);
-  EXPECT_EQ(test, one);
-  EXPECT_EQ(test++, one);
-  EXPECT_EQ(test, two);
-  EXPECT_EQ(test -= 2, zero);
-  EXPECT_EQ(test, zero);
-  EXPECT_EQ(test += 2, two);
-  EXPECT_EQ(test, two);
-  EXPECT_EQ(--test, one);
-  EXPECT_EQ(test, one);
-  EXPECT_EQ(test--, one);
-  EXPECT_EQ(test, zero);
-  EXPECT_EQ(test |= three, three);
-  EXPECT_EQ(test &= one, one);
-  EXPECT_EQ(test ^= three, two);
-  EXPECT_EQ(test >>= 1, one);
-  EXPECT_EQ(test <<= 1, two);
-
-  EXPECT_EQ(big, -(-big));
-  EXPECT_EQ(two, -((-one) - 1));
-  EXPECT_EQ(kuint128max, -one);
-  EXPECT_EQ(zero, -zero);
-
-  LOG(INFO) << one;
-  LOG(INFO) << big_minus_one;
-}
-
-TEST(Int128, PodTests) {
-  uint128_pod pod = { 12345, 67890 };
-  uint128 from_pod(pod);
-  EXPECT_EQ(12345u, Uint128High64(from_pod));
-  EXPECT_EQ(67890u, Uint128Low64(from_pod));
-
-  uint128 zero(0);
-  uint128_pod zero_pod = {0, 0};
-  uint128 one(1);
-  uint128_pod one_pod = {0, 1};
-  uint128 two(2);
-  uint128_pod two_pod = {0, 2};
-  uint128 three(3);
-  uint128_pod three_pod = {0, 3};
-  uint128 big(1, 0);
-  uint128_pod big_pod = {1, 0};
-
-  EXPECT_EQ(zero, zero_pod);
-  EXPECT_EQ(zero_pod, zero);
-  EXPECT_EQ(zero_pod, zero_pod);
-  EXPECT_EQ(one, one_pod);
-  EXPECT_EQ(one_pod, one);
-  EXPECT_EQ(one_pod, one_pod);
-  EXPECT_EQ(two, two_pod);
-  EXPECT_EQ(two_pod, two);
-  EXPECT_EQ(two_pod, two_pod);
-
-  EXPECT_NE(one, two_pod);
-  EXPECT_NE(one_pod, two);
-  EXPECT_NE(one_pod, two_pod);
-
-  EXPECT_LT(one, two_pod);
-  EXPECT_LT(one_pod, two);
-  EXPECT_LT(one_pod, two_pod);
-  EXPECT_LE(one, one_pod);
-  EXPECT_LE(one_pod, one);
-  EXPECT_LE(one_pod, one_pod);
-  EXPECT_LE(one, two_pod);
-  EXPECT_LE(one_pod, two);
-  EXPECT_LE(one_pod, two_pod);
-
-  EXPECT_GT(two, one_pod);
-  EXPECT_GT(two_pod, one);
-  EXPECT_GT(two_pod, one_pod);
-  EXPECT_GE(two, two_pod);
-  EXPECT_GE(two_pod, two);
-  EXPECT_GE(two_pod, two_pod);
-  EXPECT_GE(two, one_pod);
-  EXPECT_GE(two_pod, one);
-  EXPECT_GE(two_pod, one_pod);
-
-  EXPECT_EQ(three, one | two_pod);
-  EXPECT_EQ(three, one_pod | two);
-  EXPECT_EQ(three, one_pod | two_pod);
-  EXPECT_EQ(one, three & one_pod);
-  EXPECT_EQ(one, three_pod & one);
-  EXPECT_EQ(one, three_pod & one_pod);
-  EXPECT_EQ(two, three ^ one_pod);
-  EXPECT_EQ(two, three_pod ^ one);
-  EXPECT_EQ(two, three_pod ^ one_pod);
-  EXPECT_EQ(two, three & (~one));
-  EXPECT_EQ(three, ~~three);
-
-  EXPECT_EQ(two, two_pod << 0);
-  EXPECT_EQ(two, one_pod << 1);
-  EXPECT_EQ(big, one_pod << 64);
-  EXPECT_EQ(zero, one_pod << 128);
-  EXPECT_EQ(two, two_pod >> 0);
-  EXPECT_EQ(one, two_pod >> 1);
-  EXPECT_EQ(one, big_pod >> 64);
-
-  EXPECT_EQ(one, zero + one_pod);
-  EXPECT_EQ(one, zero_pod + one);
-  EXPECT_EQ(one, zero_pod + one_pod);
-  EXPECT_EQ(one, two - one_pod);
-  EXPECT_EQ(one, two_pod - one);
-  EXPECT_EQ(one, two_pod - one_pod);
-}
-
-TEST(Int128, OperatorAssignReturnRef) {
-  uint128 v(1);
-  (v += 4) -= 3;
-  EXPECT_EQ(2, v);
-}
-
-TEST(Int128, Multiply) {
-  uint128 a, b, c;
-
-  // Zero test.
-  a = 0;
-  b = 0;
-  c = a * b;
-  EXPECT_EQ(0, c);
-
-  // Max carries.
-  a = uint128(0) - 1;
-  b = uint128(0) - 1;
-  c = a * b;
-  EXPECT_EQ(1, c);
-
-  // Self-operation with max carries.
-  c = uint128(0) - 1;
-  c *= c;
-  EXPECT_EQ(1, c);
-
-  // 1-bit x 1-bit.
-  for (int i = 0; i < 64; ++i) {
-    for (int j = 0; j < 64; ++j) {
-      a = uint128(1) << i;
-      b = uint128(1) << j;
-      c = a * b;
-      EXPECT_EQ(uint128(1) << (i+j), c);
-    }
-  }
-
-  // Verified with dc.
-  a = uint128(0xffffeeeeddddccccULL, 0xbbbbaaaa99998888ULL);
-  b = uint128(0x7777666655554444ULL, 0x3333222211110000ULL);
-  c = a * b;
-  EXPECT_EQ(uint128(0x530EDA741C71D4C3ULL, 0xBF25975319080000ULL), c);
-  EXPECT_EQ(0, c - b * a);
-  EXPECT_EQ(a*a - b*b, (a+b) * (a-b));
-
-  // Verified with dc.
-  a = uint128(0x0123456789abcdefULL, 0xfedcba9876543210ULL);
-  b = uint128(0x02468ace13579bdfULL, 0xfdb97531eca86420ULL);
-  c = a * b;
-  EXPECT_EQ(uint128(0x97a87f4f261ba3f2ULL, 0x342d0bbf48948200ULL), c);
-  EXPECT_EQ(0, c - b * a);
-  EXPECT_EQ(a*a - b*b, (a+b) * (a-b));
-}
-
-TEST(Int128, AliasTests) {
-  uint128 x1(1, 2);
-  uint128 x2(2, 4);
-  x1 += x1;
-  EXPECT_EQ(x2, x1);
-
-  uint128 x3(1, 1ull << 63);
-  uint128 x4(3, 0);
-  x3 += x3;
-  EXPECT_EQ(x4, x3);
-}
-
-}  // namespace test
-
-}  // namespace net
diff --git a/net/cert/known_roots_win.h b/net/cert/known_roots_win.h
index e9f681b..8b9cd24 100644
--- a/net/cert/known_roots_win.h
+++ b/net/cert/known_roots_win.h
@@ -5,7 +5,7 @@
 #ifndef NET_CERT_KNOWN_ROOTS_WIN_H_
 #define NET_CERT_KNOWN_ROOTS_WIN_H_
 
-#include "crypto/wincrypt_shim.h"
+#include "base/win/wincrypt_shim.h"
 
 namespace net {
 
diff --git a/net/cert/test_root_certs.h b/net/cert/test_root_certs.h
index bc211c5..8992af12 100644
--- a/net/cert/test_root_certs.h
+++ b/net/cert/test_root_certs.h
@@ -18,7 +18,7 @@
 #include "net/cert/scoped_nss_types.h"
 #elif defined(OS_WIN)
 #include <windows.h>
-#include "crypto/wincrypt_shim.h"
+#include "base/win/wincrypt_shim.h"
 #elif defined(OS_MACOSX)
 #include <CoreFoundation/CFArray.h>
 #include <Security/SecTrust.h>
diff --git a/net/cert/x509_util_win.h b/net/cert/x509_util_win.h
index a6a234e..c1c8f49 100644
--- a/net/cert/x509_util_win.h
+++ b/net/cert/x509_util_win.h
@@ -11,7 +11,7 @@
 #include <windows.h>
 
 #include "base/memory/ref_counted.h"
-#include "crypto/wincrypt_shim.h"
+#include "base/win/wincrypt_shim.h"
 #include "net/base/hash_value.h"
 #include "net/base/net_export.h"
 #include "net/cert/x509_certificate.h"
diff --git a/net/disk_cache/simple/simple_backend_impl.cc b/net/disk_cache/simple/simple_backend_impl.cc
index fa46b4d..93fd579 100644
--- a/net/disk_cache/simple/simple_backend_impl.cc
+++ b/net/disk_cache/simple/simple_backend_impl.cc
@@ -112,10 +112,11 @@
 // Detects if the files in the cache directory match the current disk cache
 // backend type and version. If the directory contains no cache, occupies it
 // with the fresh structure.
-bool FileStructureConsistent(const base::FilePath& path) {
+SimpleCacheConsistencyResult FileStructureConsistent(
+    const base::FilePath& path) {
   if (!base::PathExists(path) && !base::CreateDirectory(path)) {
     LOG(ERROR) << "Failed to create directory: " << path.LossyDisplayName();
-    return false;
+    return SimpleCacheConsistencyResult::kCreateDirectoryFailed;
   }
   return disk_cache::UpgradeSimpleCacheOnDisk(path);
 }
@@ -287,7 +288,7 @@
   PostTaskAndReplyWithResult(
       cache_runner_.get(), FROM_HERE,
       base::BindOnce(&SimpleBackendImpl::InitCacheStructureOnDisk, path_,
-                     orig_max_size_),
+                     orig_max_size_, cache_type_),
       base::BindOnce(&SimpleBackendImpl::InitializeIndex, AsWeakPtr(),
                      std::move(completion_callback)));
   return net::ERR_IO_PENDING;
@@ -709,13 +710,17 @@
 // static
 SimpleBackendImpl::DiskStatResult SimpleBackendImpl::InitCacheStructureOnDisk(
     const base::FilePath& path,
-    uint64_t suggested_max_size) {
+    uint64_t suggested_max_size,
+    net::CacheType cache_type) {
   DiskStatResult result;
   result.max_size = suggested_max_size;
   result.net_error = net::OK;
-  if (!FileStructureConsistent(path)) {
+  SimpleCacheConsistencyResult consistency = FileStructureConsistent(path);
+  SIMPLE_CACHE_UMA(ENUMERATION, "ConsistencyResult", cache_type, consistency);
+  if (consistency != SimpleCacheConsistencyResult::kOK) {
     LOG(ERROR) << "Simple Cache Backend: wrong file structure on disk: "
-               << path.LossyDisplayName();
+               << static_cast<int>(consistency)
+               << " path: " << path.LossyDisplayName();
     result.net_error = net::ERR_FAILED;
   } else {
     bool mtime_result =
diff --git a/net/disk_cache/simple/simple_backend_impl.h b/net/disk_cache/simple/simple_backend_impl.h
index 0c5029b..4f7a0712 100644
--- a/net/disk_cache/simple/simple_backend_impl.h
+++ b/net/disk_cache/simple/simple_backend_impl.h
@@ -205,7 +205,8 @@
   // Try to create the directory if it doesn't exist. This must run on the IO
   // thread.
   static DiskStatResult InitCacheStructureOnDisk(const base::FilePath& path,
-                                                 uint64_t suggested_max_size);
+                                                 uint64_t suggested_max_size,
+                                                 net::CacheType cache_type);
 
   // Looks at current state of |entries_pending_doom_| and |active_entries_|
   // relevant to |entry_hash|, and, as appropriate, either returns a valid entry
diff --git a/net/disk_cache/simple/simple_index_file_unittest.cc b/net/disk_cache/simple/simple_index_file_unittest.cc
index f8a56811..2bec1823 100644
--- a/net/disk_cache/simple/simple_index_file_unittest.cc
+++ b/net/disk_cache/simple/simple_index_file_unittest.cc
@@ -425,7 +425,8 @@
                             index_file_contents.size()));
 
   // Upgrade the cache.
-  ASSERT_TRUE(disk_cache::UpgradeSimpleCacheOnDisk(cache_path));
+  ASSERT_EQ(disk_cache::UpgradeSimpleCacheOnDisk(cache_path),
+            SimpleCacheConsistencyResult::kOK);
 
   // Create the backend and initiate index flush by destroying the backend.
   scoped_refptr<disk_cache::BackendCleanupTracker> cleanup_tracker =
diff --git a/net/disk_cache/simple/simple_version_upgrade.cc b/net/disk_cache/simple/simple_version_upgrade.cc
index 95389f20..6005f06 100644
--- a/net/disk_cache/simple/simple_version_upgrade.cc
+++ b/net/disk_cache/simple/simple_version_upgrade.cc
@@ -125,7 +125,8 @@
 //    upgrade steps. Atomicity of this is an interesting research topic. The
 //    intermediate fake index flushing must be added as soon as we add more
 //    upgrade steps.
-bool UpgradeSimpleCacheOnDisk(const base::FilePath& path) {
+SimpleCacheConsistencyResult UpgradeSimpleCacheOnDisk(
+    const base::FilePath& path) {
   // There is a convention among disk cache backends: looking at the magic in
   // the file "index" it should be sufficient to determine if the cache belongs
   // to the currently running backend. The Simple Backend stores its index in
@@ -141,9 +142,11 @@
 
   if (!fake_index_file.IsValid()) {
     if (fake_index_file.error_details() == base::File::FILE_ERROR_NOT_FOUND) {
-      return WriteFakeIndexFile(fake_index);
+      return WriteFakeIndexFile(fake_index)
+                 ? SimpleCacheConsistencyResult::kOK
+                 : SimpleCacheConsistencyResult::kWriteFakeIndexFileFailed;
     }
-    return false;
+    return SimpleCacheConsistencyResult::kBadFakeIndexFile;
   }
 
   FakeIndexData file_header;
@@ -154,20 +157,24 @@
       file_header.initial_magic_number !=
           disk_cache::simplecache_v5::kSimpleInitialMagicNumber) {
     LOG(ERROR) << "File structure does not match the disk cache backend.";
-    return false;
+    return SimpleCacheConsistencyResult::kBadInitialMagicNumber;
   }
   fake_index_file.Close();
 
   uint32_t version_from = file_header.version;
-  if (version_from < kMinVersionAbleToUpgrade ||
-      version_from > kSimpleVersion) {
-    LOG(ERROR) << "Inconsistent cache version.";
-    return false;
+  if (version_from < kMinVersionAbleToUpgrade) {
+    LOG(ERROR) << "Version " << version_from << " is too old.";
+    return SimpleCacheConsistencyResult::kVersionTooOld;
+  }
+
+  if (version_from > kSimpleVersion) {
+    LOG(ERROR) << "Version " << version_from << " is from the future.";
+    return SimpleCacheConsistencyResult::kVersionFromTheFuture;
   }
 
   if (file_header.zero != 0 && file_header.zero2 != 0) {
     LOG(WARNING) << "Rebuilding cache due to experiment change";
-    return false;
+    return SimpleCacheConsistencyResult::kBadZeroCheck;
   }
 
   bool new_fake_index_needed = (version_from != kSimpleVersion);
@@ -180,7 +187,7 @@
     // Upgrade only the index for V5 -> V6 move.
     if (!UpgradeIndexV5V6(path)) {
       LogMessageFailedUpgradeFromVersion(file_header.version);
-      return false;
+      return SimpleCacheConsistencyResult::kUpgradeIndexV5V6Failed;
     }
     version_from++;
   }
@@ -199,21 +206,21 @@
   DCHECK_EQ(kSimpleVersion, version_from);
 
   if (!new_fake_index_needed)
-    return true;
+    return SimpleCacheConsistencyResult::kOK;
 
   const base::FilePath temp_fake_index = path.AppendASCII("upgrade-index");
   if (!WriteFakeIndexFile(temp_fake_index)) {
     base::DeleteFile(temp_fake_index, /* recursive = */ false);
     LOG(ERROR) << "Failed to write a new fake index.";
     LogMessageFailedUpgradeFromVersion(file_header.version);
-    return false;
+    return SimpleCacheConsistencyResult::kWriteFakeIndexFileFailed;
   }
   if (!base::ReplaceFile(temp_fake_index, fake_index, NULL)) {
     LOG(ERROR) << "Failed to replace the fake index.";
     LogMessageFailedUpgradeFromVersion(file_header.version);
-    return false;
+    return SimpleCacheConsistencyResult::kReplaceFileFailed;
   }
-  return true;
+  return SimpleCacheConsistencyResult::kOK;
 }
 
 }  // namespace disk_cache
diff --git a/net/disk_cache/simple/simple_version_upgrade.h b/net/disk_cache/simple/simple_version_upgrade.h
index 835d549..697bc2f5 100644
--- a/net/disk_cache/simple/simple_version_upgrade.h
+++ b/net/disk_cache/simple/simple_version_upgrade.h
@@ -20,13 +20,30 @@
 
 namespace disk_cache {
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class SimpleCacheConsistencyResult {
+  kOK = 0,
+  kCreateDirectoryFailed = 1,
+  kBadFakeIndexFile = 2,
+  kBadInitialMagicNumber = 3,
+  kVersionTooOld = 4,
+  kVersionFromTheFuture = 5,
+  kBadZeroCheck = 6,
+  kUpgradeIndexV5V6Failed = 7,
+  kWriteFakeIndexFileFailed = 8,
+  kReplaceFileFailed = 9,
+  kMaxValue = kReplaceFileFailed,
+};
+
 // Performs all necessary disk IO to upgrade the cache structure if it is
 // needed.
 //
 // Returns true iff no errors were found during consistency checks and all
 // necessary transitions succeeded. If this function fails, there is nothing
 // left to do other than dropping the whole cache directory.
-NET_EXPORT_PRIVATE bool UpgradeSimpleCacheOnDisk(const base::FilePath& path);
+NET_EXPORT_PRIVATE SimpleCacheConsistencyResult
+UpgradeSimpleCacheOnDisk(const base::FilePath& path);
 
 struct NET_EXPORT_PRIVATE FakeIndexData {
   FakeIndexData();
diff --git a/net/disk_cache/simple/simple_version_upgrade_unittest.cc b/net/disk_cache/simple/simple_version_upgrade_unittest.cc
index 7b6e97f..582e22a 100644
--- a/net/disk_cache/simple/simple_version_upgrade_unittest.cc
+++ b/net/disk_cache/simple/simple_version_upgrade_unittest.cc
@@ -59,7 +59,8 @@
   ASSERT_EQ(static_cast<int>(sizeof(data)),
             base::WriteFile(file_name, reinterpret_cast<const char*>(&data),
                             sizeof(data)));
-  EXPECT_FALSE(disk_cache::UpgradeSimpleCacheOnDisk(cache_dir.GetPath()));
+  EXPECT_EQ(disk_cache::SimpleCacheConsistencyResult::kVersionFromTheFuture,
+            disk_cache::UpgradeSimpleCacheOnDisk(cache_dir.GetPath()));
 }
 
 TEST(SimpleVersionUpgradeTest, ExperimentBacktoDefault) {
@@ -79,7 +80,8 @@
 
   // The cache needs to transition from a deprecated experiment back to not
   // having one.
-  EXPECT_FALSE(disk_cache::UpgradeSimpleCacheOnDisk(cache_dir.GetPath()));
+  EXPECT_EQ(disk_cache::SimpleCacheConsistencyResult::kBadZeroCheck,
+            disk_cache::UpgradeSimpleCacheOnDisk(cache_dir.GetPath()));
 }
 
 TEST(SimpleVersionUpgradeTest, FakeIndexVersionGetsUpdated) {
@@ -95,7 +97,8 @@
       base::WriteFile(index_file, file_contents.data(), file_contents.size()));
 
   // Upgrade.
-  ASSERT_TRUE(disk_cache::UpgradeSimpleCacheOnDisk(cache_path));
+  ASSERT_EQ(disk_cache::SimpleCacheConsistencyResult::kOK,
+            disk_cache::UpgradeSimpleCacheOnDisk(cache_path));
 
   // Check that the version in the fake index file is updated.
   std::string new_fake_index_contents;
diff --git a/net/http/http_auth_cache.cc b/net/http/http_auth_cache.cc
index 236220fe..c78780b0 100644
--- a/net/http/http_auth_cache.cc
+++ b/net/http/http_auth_cache.cc
@@ -68,6 +68,11 @@
   UMA_HISTOGRAM_COUNTS_100("Net.HttpAuthCacheLookupByPathPosition", position);
 }
 
+void RecordEntriesExaminedWhenNoMatch(int num_examined_entries) {
+  UMA_HISTOGRAM_COUNTS_100("Net.HttpAuthCacheEntriesExaminedWhenNoMatch",
+                           num_examined_entries);
+}
+
 }  // namespace
 
 namespace net {
@@ -94,6 +99,7 @@
     }
   }
   RecordLookupPosition(0);
+  RecordEntriesExaminedWhenNoMatch(entries_examined);
   return NULL;  // No realm entry found.
 }
 
@@ -128,6 +134,8 @@
   }
   if (best_match)
     best_match->last_use_time_ticks_ = tick_clock_->NowTicks();
+  else
+    RecordEntriesExaminedWhenNoMatch(entries_examined);
   RecordLookupByPathPosition(best_match_position);
   return best_match;
 }
diff --git a/net/ssl/client_cert_store_win.cc b/net/ssl/client_cert_store_win.cc
index 39ae3aa2..2fcd5020 100644
--- a/net/ssl/client_cert_store_win.cc
+++ b/net/ssl/client_cert_store_win.cc
@@ -20,7 +20,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "crypto/wincrypt_shim.h"
+#include "base/win/wincrypt_shim.h"
 #include "net/cert/x509_util.h"
 #include "net/cert/x509_util_win.h"
 #include "net/ssl/ssl_platform_key_util.h"
diff --git a/net/ssl/ssl_platform_key_win.h b/net/ssl/ssl_platform_key_win.h
index d42cba8f57..70e70613 100644
--- a/net/ssl/ssl_platform_key_win.h
+++ b/net/ssl/ssl_platform_key_win.h
@@ -11,7 +11,7 @@
 #include <NCrypt.h>
 
 #include "base/memory/ref_counted.h"
-#include "crypto/wincrypt_shim.h"
+#include "base/win/wincrypt_shim.h"
 #include "net/base/net_export.h"
 
 namespace net {
diff --git a/net/test/spawned_test_server/remote_test_server_config.cc b/net/test/spawned_test_server/remote_test_server_config.cc
index 125ec6f..ac92e248 100644
--- a/net/test/spawned_test_server/remote_test_server_config.cc
+++ b/net/test/spawned_test_server/remote_test_server_config.cc
@@ -29,7 +29,7 @@
 #if defined(OS_ANDROID)
   base::PathService::Get(base::DIR_ANDROID_EXTERNAL_STORAGE, &dir);
 #elif defined(OS_FUCHSIA)
-  dir = base::FilePath("/data");
+  dir = base::FilePath("/test-shared");
 #else
   base::PathService::Get(base::DIR_TEMP, &dir);
 #endif
diff --git a/net/third_party/quic/platform/impl/quic_uint128_impl.h b/net/third_party/quic/platform/impl/quic_uint128_impl.h
index c6e8279..d766ac02 100644
--- a/net/third_party/quic/platform/impl/quic_uint128_impl.h
+++ b/net/third_party/quic/platform/impl/quic_uint128_impl.h
@@ -5,14 +5,324 @@
 #ifndef NET_THIRD_PARTY_QUIC_PLATFORM_IMPL_QUIC_UINT128_IMPL_H_
 #define NET_THIRD_PARTY_QUIC_PLATFORM_IMPL_QUIC_UINT128_IMPL_H_
 
-#include "net/base/int128.h"
+#include <stdint.h>
 
 namespace quic {
 
-using QuicUint128Impl = net::uint128;
-#define MakeQuicUint128Impl(hi, lo) net::MakeUint128(hi, lo)
-#define QuicUint128Low64Impl(x) Uint128Low64(x)
-#define QuicUint128High64Impl(x) Uint128High64(x)
+// An unsigned 128-bit integer type. Thread-compatible.
+class QuicUint128Impl {
+ public:
+  constexpr QuicUint128Impl();  // Sets to 0, but don't trust on this behavior.
+  constexpr QuicUint128Impl(uint64_t top, uint64_t bottom);
+  QuicUint128Impl(int bottom);
+  constexpr QuicUint128Impl(uint32_t bottom);  // Top 96 bits = 0
+  constexpr QuicUint128Impl(uint64_t bottom);  // hi_ = 0
+  constexpr QuicUint128Impl(const QuicUint128Impl& val);
+
+  void Initialize(uint64_t top, uint64_t bottom);
+
+  QuicUint128Impl& operator=(const QuicUint128Impl& b);
+
+  // Arithmetic operators.
+  // TODO: division, etc.
+  QuicUint128Impl& operator+=(const QuicUint128Impl& b);
+  QuicUint128Impl& operator-=(const QuicUint128Impl& b);
+  QuicUint128Impl& operator*=(const QuicUint128Impl& b);
+  QuicUint128Impl operator++(int);
+  QuicUint128Impl operator--(int);
+  QuicUint128Impl& operator<<=(int);
+  QuicUint128Impl& operator>>=(int);
+  QuicUint128Impl& operator&=(const QuicUint128Impl& b);
+  QuicUint128Impl& operator|=(const QuicUint128Impl& b);
+  QuicUint128Impl& operator^=(const QuicUint128Impl& b);
+  QuicUint128Impl& operator++();
+  QuicUint128Impl& operator--();
+
+  friend uint64_t QuicUint128Low64Impl(const QuicUint128Impl& v);
+  friend uint64_t QuicUint128High64Impl(const QuicUint128Impl& v);
+
+ private:
+  // Little-endian memory order optimizations can benefit from
+  // having lo_ first, hi_ last.
+  // See util/endian/endian.h and Load128/Store128 for storing a
+  // QuicUint128Impl.
+  uint64_t lo_;
+  uint64_t hi_;
+
+  // Not implemented, just declared for catching automatic type conversions.
+  QuicUint128Impl(uint8_t);
+  QuicUint128Impl(uint16_t);
+  QuicUint128Impl(float v);
+  QuicUint128Impl(double v);
+};
+
+inline QuicUint128Impl MakeQuicUint128Impl(uint64_t top, uint64_t bottom) {
+  return QuicUint128Impl(top, bottom);
+}
+
+// Methods to access low and high pieces of 128-bit value.
+// Defined externally from QuicUint128Impl to facilitate conversion
+// to native 128-bit types when compilers support them.
+inline uint64_t QuicUint128Low64Impl(const QuicUint128Impl& v) {
+  return v.lo_;
+}
+inline uint64_t QuicUint128High64Impl(const QuicUint128Impl& v) {
+  return v.hi_;
+}
+
+// --------------------------------------------------------------------------
+//                      Implementation details follow
+// --------------------------------------------------------------------------
+inline bool operator==(const QuicUint128Impl& lhs, const QuicUint128Impl& rhs) {
+  return (QuicUint128Low64Impl(lhs) == QuicUint128Low64Impl(rhs) &&
+          QuicUint128High64Impl(lhs) == QuicUint128High64Impl(rhs));
+}
+inline bool operator!=(const QuicUint128Impl& lhs, const QuicUint128Impl& rhs) {
+  return !(lhs == rhs);
+}
+inline QuicUint128Impl& QuicUint128Impl::operator=(const QuicUint128Impl& b) {
+  lo_ = b.lo_;
+  hi_ = b.hi_;
+  return *this;
+}
+
+constexpr QuicUint128Impl::QuicUint128Impl() : lo_(0), hi_(0) {}
+constexpr QuicUint128Impl::QuicUint128Impl(uint64_t top, uint64_t bottom)
+    : lo_(bottom), hi_(top) {}
+constexpr QuicUint128Impl::QuicUint128Impl(const QuicUint128Impl& v)
+    : lo_(v.lo_), hi_(v.hi_) {}
+constexpr QuicUint128Impl::QuicUint128Impl(uint64_t bottom)
+    : lo_(bottom), hi_(0) {}
+constexpr QuicUint128Impl::QuicUint128Impl(uint32_t bottom)
+    : lo_(bottom), hi_(0) {}
+inline QuicUint128Impl::QuicUint128Impl(int bottom) : lo_(bottom), hi_(0) {
+  if (bottom < 0) {
+    --hi_;
+  }
+}
+inline void QuicUint128Impl::Initialize(uint64_t top, uint64_t bottom) {
+  hi_ = top;
+  lo_ = bottom;
+}
+
+// Comparison operators.
+
+#define CMP128(op)                                                           \
+  inline bool operator op(const QuicUint128Impl& lhs,                        \
+                          const QuicUint128Impl& rhs) {                      \
+    return (QuicUint128High64Impl(lhs) == QuicUint128High64Impl(rhs))        \
+               ? (QuicUint128Low64Impl(lhs) op QuicUint128Low64Impl(rhs))    \
+               : (QuicUint128High64Impl(lhs) op QuicUint128High64Impl(rhs)); \
+  }
+
+CMP128(<)
+CMP128(>)
+CMP128(>=)
+CMP128(<=)
+
+#undef CMP128
+
+// Unary operators
+
+inline QuicUint128Impl operator-(const QuicUint128Impl& val) {
+  const uint64_t hi_flip = ~QuicUint128High64Impl(val);
+  const uint64_t lo_flip = ~QuicUint128Low64Impl(val);
+  const uint64_t lo_add = lo_flip + 1;
+  if (lo_add < lo_flip) {
+    return QuicUint128Impl(hi_flip + 1, lo_add);
+  }
+  return QuicUint128Impl(hi_flip, lo_add);
+}
+
+inline bool operator!(const QuicUint128Impl& val) {
+  return !QuicUint128High64Impl(val) && !QuicUint128Low64Impl(val);
+}
+
+// Logical operators.
+
+inline QuicUint128Impl operator~(const QuicUint128Impl& val) {
+  return QuicUint128Impl(~QuicUint128High64Impl(val),
+                         ~QuicUint128Low64Impl(val));
+}
+
+#define LOGIC128(op)                                               \
+  inline QuicUint128Impl operator op(const QuicUint128Impl& lhs,   \
+                                     const QuicUint128Impl& rhs) { \
+    return QuicUint128Impl(                                        \
+        QuicUint128High64Impl(lhs) op QuicUint128High64Impl(rhs),  \
+        QuicUint128Low64Impl(lhs) op QuicUint128Low64Impl(rhs));   \
+  }
+
+LOGIC128(|)
+LOGIC128(&)
+LOGIC128 (^)
+
+#undef LOGIC128
+
+#define LOGICASSIGN128(op)                              \
+  inline QuicUint128Impl& QuicUint128Impl::operator op( \
+      const QuicUint128Impl& other) {                   \
+    hi_ op other.hi_;                                   \
+    lo_ op other.lo_;                                   \
+    return *this;                                       \
+  }
+
+LOGICASSIGN128(|=)
+LOGICASSIGN128(&=)
+LOGICASSIGN128(^=)
+
+#undef LOGICASSIGN128
+
+// Shift operators.
+
+inline QuicUint128Impl operator<<(const QuicUint128Impl& val, int amount) {
+  // uint64_t shifts of >= 64 are undefined, so we will need some
+  // special-casing.
+  if (amount < 64) {
+    if (amount == 0) {
+      return val;
+    }
+    uint64_t new_hi = (QuicUint128High64Impl(val) << amount) |
+                      (QuicUint128Low64Impl(val) >> (64 - amount));
+    uint64_t new_lo = QuicUint128Low64Impl(val) << amount;
+    return QuicUint128Impl(new_hi, new_lo);
+  } else if (amount < 128) {
+    return QuicUint128Impl(QuicUint128Low64Impl(val) << (amount - 64), 0);
+  } else {
+    return QuicUint128Impl(0, 0);
+  }
+}
+
+inline QuicUint128Impl operator>>(const QuicUint128Impl& val, int amount) {
+  // uint64_t shifts of >= 64 are undefined, so we will need some
+  // special-casing.
+  if (amount < 64) {
+    if (amount == 0) {
+      return val;
+    }
+    uint64_t new_hi = QuicUint128High64Impl(val) >> amount;
+    uint64_t new_lo = (QuicUint128Low64Impl(val) >> amount) |
+                      (QuicUint128High64Impl(val) << (64 - amount));
+    return QuicUint128Impl(new_hi, new_lo);
+  } else if (amount < 128) {
+    return QuicUint128Impl(0, QuicUint128High64Impl(val) >> (amount - 64));
+  } else {
+    return QuicUint128Impl(0, 0);
+  }
+}
+
+inline QuicUint128Impl& QuicUint128Impl::operator<<=(int amount) {
+  // uint64_t shifts of >= 64 are undefined, so we will need some
+  // special-casing.
+  if (amount < 64) {
+    if (amount != 0) {
+      hi_ = (hi_ << amount) | (lo_ >> (64 - amount));
+      lo_ = lo_ << amount;
+    }
+  } else if (amount < 128) {
+    hi_ = lo_ << (amount - 64);
+    lo_ = 0;
+  } else {
+    hi_ = 0;
+    lo_ = 0;
+  }
+  return *this;
+}
+
+inline QuicUint128Impl& QuicUint128Impl::operator>>=(int amount) {
+  // uint64_t shifts of >= 64 are undefined, so we will need some
+  // special-casing.
+  if (amount < 64) {
+    if (amount != 0) {
+      lo_ = (lo_ >> amount) | (hi_ << (64 - amount));
+      hi_ = hi_ >> amount;
+    }
+  } else if (amount < 128) {
+    hi_ = 0;
+    lo_ = hi_ >> (amount - 64);
+  } else {
+    hi_ = 0;
+    lo_ = 0;
+  }
+  return *this;
+}
+
+inline QuicUint128Impl operator+(const QuicUint128Impl& lhs,
+                                 const QuicUint128Impl& rhs) {
+  return QuicUint128Impl(lhs) += rhs;
+}
+
+inline QuicUint128Impl operator-(const QuicUint128Impl& lhs,
+                                 const QuicUint128Impl& rhs) {
+  return QuicUint128Impl(lhs) -= rhs;
+}
+
+inline QuicUint128Impl operator*(const QuicUint128Impl& lhs,
+                                 const QuicUint128Impl& rhs) {
+  return QuicUint128Impl(lhs) *= rhs;
+}
+
+inline QuicUint128Impl& QuicUint128Impl::operator+=(const QuicUint128Impl& b) {
+  hi_ += b.hi_;
+  uint64_t lolo = lo_ + b.lo_;
+  if (lolo < lo_)
+    ++hi_;
+  lo_ = lolo;
+  return *this;
+}
+
+inline QuicUint128Impl& QuicUint128Impl::operator-=(const QuicUint128Impl& b) {
+  hi_ -= b.hi_;
+  if (b.lo_ > lo_)
+    --hi_;
+  lo_ -= b.lo_;
+  return *this;
+}
+
+inline QuicUint128Impl& QuicUint128Impl::operator*=(const QuicUint128Impl& b) {
+  uint64_t a96 = hi_ >> 32;
+  uint64_t a64 = hi_ & 0xffffffffu;
+  uint64_t a32 = lo_ >> 32;
+  uint64_t a00 = lo_ & 0xffffffffu;
+  uint64_t b96 = b.hi_ >> 32;
+  uint64_t b64 = b.hi_ & 0xffffffffu;
+  uint64_t b32 = b.lo_ >> 32;
+  uint64_t b00 = b.lo_ & 0xffffffffu;
+  // multiply [a96 .. a00] x [b96 .. b00]
+  // terms higher than c96 disappear off the high side
+  // terms c96 and c64 are safe to ignore carry bit
+  uint64_t c96 = a96 * b00 + a64 * b32 + a32 * b64 + a00 * b96;
+  uint64_t c64 = a64 * b00 + a32 * b32 + a00 * b64;
+  this->hi_ = (c96 << 32) + c64;
+  this->lo_ = 0;
+  // add terms after this one at a time to capture carry
+  *this += QuicUint128Impl(a32 * b00) << 32;
+  *this += QuicUint128Impl(a00 * b32) << 32;
+  *this += a00 * b00;
+  return *this;
+}
+
+inline QuicUint128Impl QuicUint128Impl::operator++(int) {
+  QuicUint128Impl tmp(*this);
+  *this += 1;
+  return tmp;
+}
+
+inline QuicUint128Impl QuicUint128Impl::operator--(int) {
+  QuicUint128Impl tmp(*this);
+  *this -= 1;
+  return tmp;
+}
+
+inline QuicUint128Impl& QuicUint128Impl::operator++() {
+  *this += 1;
+  return *this;
+}
+
+inline QuicUint128Impl& QuicUint128Impl::operator--() {
+  *this -= 1;
+  return *this;
+}
 
 }  // namespace quic
 
diff --git a/net/third_party/quic/platform/impl/quic_uint128_impl_unittest.cc b/net/third_party/quic/platform/impl/quic_uint128_impl_unittest.cc
new file mode 100644
index 0000000..7f35021
--- /dev/null
+++ b/net/third_party/quic/platform/impl/quic_uint128_impl_unittest.cc
@@ -0,0 +1,192 @@
+// Copyright (c) 2012 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 <stdint.h>
+
+#include <limits>
+
+#include "net/third_party/quic/platform/impl/quic_uint128_impl.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace quic {
+
+namespace test {
+
+constexpr QuicUint128Impl kuint128max(std::numeric_limits<uint64_t>::max(),
+                                      std::numeric_limits<uint64_t>::max());
+
+TEST(Int128, AllTests) {
+  QuicUint128Impl zero(0);
+  QuicUint128Impl one(1);
+  QuicUint128Impl one_2arg(0, 1);
+  QuicUint128Impl two(0, 2);
+  QuicUint128Impl three(0, 3);
+  QuicUint128Impl big(2000, 2);
+  QuicUint128Impl big_minus_one(2000, 1);
+  QuicUint128Impl bigger(2001, 1);
+  QuicUint128Impl biggest(kuint128max);
+  QuicUint128Impl high_low(1, 0);
+  QuicUint128Impl low_high(0, std::numeric_limits<uint64_t>::max());
+  EXPECT_LT(one, two);
+  EXPECT_GT(two, one);
+  EXPECT_LT(one, big);
+  EXPECT_LT(one, big);
+  EXPECT_EQ(one, one_2arg);
+  EXPECT_NE(one, two);
+  EXPECT_GT(big, one);
+  EXPECT_GE(big, two);
+  EXPECT_GE(big, big_minus_one);
+  EXPECT_GT(big, big_minus_one);
+  EXPECT_LT(big_minus_one, big);
+  EXPECT_LE(big_minus_one, big);
+  EXPECT_NE(big_minus_one, big);
+  EXPECT_LT(big, biggest);
+  EXPECT_LE(big, biggest);
+  EXPECT_GT(biggest, big);
+  EXPECT_GE(biggest, big);
+  EXPECT_EQ(big, ~~big);
+  EXPECT_EQ(one, one | one);
+  EXPECT_EQ(big, big | big);
+  EXPECT_EQ(one, one | zero);
+  EXPECT_EQ(one, one & one);
+  EXPECT_EQ(big, big & big);
+  EXPECT_EQ(zero, one & zero);
+  EXPECT_EQ(zero, big & ~big);
+  EXPECT_EQ(zero, one ^ one);
+  EXPECT_EQ(zero, big ^ big);
+  EXPECT_EQ(one, one ^ zero);
+  EXPECT_EQ(big, big << 0);
+  EXPECT_EQ(big, big >> 0);
+  EXPECT_GT(big << 1, big);
+  EXPECT_LT(big >> 1, big);
+  EXPECT_EQ(big, (big << 10) >> 10);
+  EXPECT_EQ(big, (big >> 1) << 1);
+  EXPECT_EQ(one, (one << 80) >> 80);
+  EXPECT_EQ(zero, (one >> 80) << 80);
+  EXPECT_EQ(zero, big >> 128);
+  EXPECT_EQ(zero, big << 128);
+  EXPECT_EQ(QuicUint128High64Impl(biggest),
+            std::numeric_limits<uint64_t>::max());
+  EXPECT_EQ(QuicUint128Low64Impl(biggest),
+            std::numeric_limits<uint64_t>::max());
+  EXPECT_EQ(zero + one, one);
+  EXPECT_EQ(one + one, two);
+  EXPECT_EQ(big_minus_one + one, big);
+  EXPECT_EQ(one - one, zero);
+  EXPECT_EQ(one - zero, one);
+  EXPECT_EQ(zero - one, biggest);
+  EXPECT_EQ(big - big, zero);
+  EXPECT_EQ(big - one, big_minus_one);
+  EXPECT_EQ(big + std::numeric_limits<uint64_t>::max(), bigger);
+  EXPECT_EQ(biggest + 1, zero);
+  EXPECT_EQ(zero - 1, biggest);
+  EXPECT_EQ(high_low - one, low_high);
+  EXPECT_EQ(low_high + one, high_low);
+  EXPECT_EQ(QuicUint128High64Impl((QuicUint128Impl(1) << 64) - 1), 0u);
+  EXPECT_EQ(QuicUint128Low64Impl((QuicUint128Impl(1) << 64) - 1),
+            std::numeric_limits<uint64_t>::max());
+  EXPECT_TRUE(!!one);
+  EXPECT_TRUE(!!high_low);
+  EXPECT_FALSE(!!zero);
+  EXPECT_FALSE(!one);
+  EXPECT_FALSE(!high_low);
+  EXPECT_TRUE(!zero);
+  EXPECT_TRUE(zero == 0);
+  EXPECT_FALSE(zero != 0);
+  EXPECT_FALSE(one == 0);
+  EXPECT_TRUE(one != 0);
+
+  QuicUint128Impl test = zero;
+  EXPECT_EQ(++test, one);
+  EXPECT_EQ(test, one);
+  EXPECT_EQ(test++, one);
+  EXPECT_EQ(test, two);
+  EXPECT_EQ(test -= 2, zero);
+  EXPECT_EQ(test, zero);
+  EXPECT_EQ(test += 2, two);
+  EXPECT_EQ(test, two);
+  EXPECT_EQ(--test, one);
+  EXPECT_EQ(test, one);
+  EXPECT_EQ(test--, one);
+  EXPECT_EQ(test, zero);
+  EXPECT_EQ(test |= three, three);
+  EXPECT_EQ(test &= one, one);
+  EXPECT_EQ(test ^= three, two);
+  EXPECT_EQ(test >>= 1, one);
+  EXPECT_EQ(test <<= 1, two);
+
+  EXPECT_EQ(big, -(-big));
+  EXPECT_EQ(two, -((-one) - 1));
+  EXPECT_EQ(kuint128max, -one);
+  EXPECT_EQ(zero, -zero);
+}
+
+TEST(Int128, OperatorAssignReturnRef) {
+  QuicUint128Impl v(1);
+  (v += 4) -= 3;
+  EXPECT_EQ(2, v);
+}
+
+TEST(Int128, Multiply) {
+  QuicUint128Impl a, b, c;
+
+  // Zero test.
+  a = 0;
+  b = 0;
+  c = a * b;
+  EXPECT_EQ(0, c);
+
+  // Max carries.
+  a = QuicUint128Impl(0) - 1;
+  b = QuicUint128Impl(0) - 1;
+  c = a * b;
+  EXPECT_EQ(1, c);
+
+  // Self-operation with max carries.
+  c = QuicUint128Impl(0) - 1;
+  c *= c;
+  EXPECT_EQ(1, c);
+
+  // 1-bit x 1-bit.
+  for (int i = 0; i < 64; ++i) {
+    for (int j = 0; j < 64; ++j) {
+      a = QuicUint128Impl(1) << i;
+      b = QuicUint128Impl(1) << j;
+      c = a * b;
+      EXPECT_EQ(QuicUint128Impl(1) << (i + j), c);
+    }
+  }
+
+  // Verified with dc.
+  a = QuicUint128Impl(0xffffeeeeddddccccULL, 0xbbbbaaaa99998888ULL);
+  b = QuicUint128Impl(0x7777666655554444ULL, 0x3333222211110000ULL);
+  c = a * b;
+  EXPECT_EQ(QuicUint128Impl(0x530EDA741C71D4C3ULL, 0xBF25975319080000ULL), c);
+  EXPECT_EQ(0, c - b * a);
+  EXPECT_EQ(a * a - b * b, (a + b) * (a - b));
+
+  // Verified with dc.
+  a = QuicUint128Impl(0x0123456789abcdefULL, 0xfedcba9876543210ULL);
+  b = QuicUint128Impl(0x02468ace13579bdfULL, 0xfdb97531eca86420ULL);
+  c = a * b;
+  EXPECT_EQ(QuicUint128Impl(0x97a87f4f261ba3f2ULL, 0x342d0bbf48948200ULL), c);
+  EXPECT_EQ(0, c - b * a);
+  EXPECT_EQ(a * a - b * b, (a + b) * (a - b));
+}
+
+TEST(Int128, AliasTests) {
+  QuicUint128Impl x1(1, 2);
+  QuicUint128Impl x2(2, 4);
+  x1 += x1;
+  EXPECT_EQ(x2, x1);
+
+  QuicUint128Impl x3(1, 1ull << 63);
+  QuicUint128Impl x4(3, 0);
+  x3 += x3;
+  EXPECT_EQ(x4, x3);
+}
+
+}  // namespace test
+
+}  // namespace quic
diff --git a/pdf/chunk_stream_unittest.cc b/pdf/chunk_stream_unittest.cc
index 5b9ad99..c6b979e 100644
--- a/pdf/chunk_stream_unittest.cc
+++ b/pdf/chunk_stream_unittest.cc
@@ -70,7 +70,7 @@
 TEST(ChunkStreamTest, Read) {
   TestChunkStream stream;
   stream.set_eof_pos(25);
-  const unsigned char start_value = 33;
+  constexpr unsigned char start_value = 33;
   unsigned char value = start_value;
   auto chunk_0 = CreateChunkData();
   for (auto& it : *chunk_0) {
diff --git a/pdf/document_loader_impl.cc b/pdf/document_loader_impl.cc
index f281218..53c9b1f7 100644
--- a/pdf/document_loader_impl.cc
+++ b/pdf/document_loader_impl.cc
@@ -25,7 +25,7 @@
 // current connection (like playing a cassette tape) and do not send new range
 // request (like rewind a cassette tape, and continue playing after).
 // Experimentally chosen value.
-const int kChunkCloseDistance = 10;
+constexpr int kChunkCloseDistance = 10;
 
 // Return true if the HTTP response of |loader| is a successful one and loading
 // should continue. 4xx error indicate subsequent requests will fail too.
diff --git a/pdf/document_loader_impl_unittest.cc b/pdf/document_loader_impl_unittest.cc
index 0595e049..9ae3db5df3 100644
--- a/pdf/document_loader_impl_unittest.cc
+++ b/pdf/document_loader_impl_unittest.cc
@@ -232,7 +232,7 @@
     partial_loader_data_.CallOpenCallback(0);
     uint32_t length = partial_loader_data_.byte_range().length();
     while (length > 0) {
-      const uint32_t max_part_len = kDefaultRequestSize;
+      constexpr uint32_t max_part_len = kDefaultRequestSize;
       const uint32_t part_len = std::min(length, max_part_len);
       partial_loader_data_.CallReadCallback(part_len);
       length -= part_len;
@@ -468,7 +468,7 @@
 }
 
 TEST_F(DocumentLoaderImplTest, PartialRequestLastChunk) {
-  const uint32_t kLastChunkSize = 300;
+  constexpr uint32_t kLastChunkSize = 300;
   TestClient client;
   client.SetCanUsePartialLoading();
   client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
@@ -539,8 +539,8 @@
 
   {
     EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
-    const gfx::Range range_requested(15 * kDefaultRequestSize,
-                                     16 * kDefaultRequestSize);
+    constexpr gfx::Range range_requested(15 * kDefaultRequestSize,
+                                         16 * kDefaultRequestSize);
     EXPECT_EQ(range_requested.start(),
               client.partial_loader_data()->open_byte_range().start());
     EXPECT_LE(range_requested.end(),
@@ -575,8 +575,8 @@
     // Loading should be restarted.
     EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
     // The first requested chunk should be processed.
-    const gfx::Range range_requested(35 * kDefaultRequestSize,
-                                     36 * kDefaultRequestSize);
+    constexpr gfx::Range range_requested(35 * kDefaultRequestSize,
+                                         36 * kDefaultRequestSize);
     EXPECT_EQ(range_requested.start(),
               client.partial_loader_data()->open_byte_range().start());
     EXPECT_LE(range_requested.end(),
@@ -597,8 +597,8 @@
     // Loading should be restarted .
     EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
     // The first requested chunk should be processed.
-    const gfx::Range range_requested(70 * kDefaultRequestSize,
-                                     71 * kDefaultRequestSize);
+    constexpr gfx::Range range_requested(70 * kDefaultRequestSize,
+                                         71 * kDefaultRequestSize);
     EXPECT_EQ(range_requested.start(),
               client.partial_loader_data()->open_byte_range().start());
     EXPECT_LE(range_requested.end(),
@@ -676,8 +676,8 @@
 
   {
     EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
-    const gfx::Range range_requested(13 * kDefaultRequestSize,
-                                     14 * kDefaultRequestSize);
+    constexpr gfx::Range range_requested(13 * kDefaultRequestSize,
+                                         14 * kDefaultRequestSize);
     EXPECT_EQ(range_requested.start(),
               client.partial_loader_data()->open_byte_range().start());
     EXPECT_LE(range_requested.end(),
@@ -694,8 +694,8 @@
   client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
   {
     EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
-    const gfx::Range range_requested(26 * kDefaultRequestSize,
-                                     27 * kDefaultRequestSize);
+    constexpr gfx::Range range_requested(26 * kDefaultRequestSize,
+                                         27 * kDefaultRequestSize);
     EXPECT_EQ(range_requested.start(),
               client.partial_loader_data()->open_byte_range().start());
     EXPECT_LE(range_requested.end(),
@@ -711,8 +711,8 @@
   client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
   {
     EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
-    const gfx::Range range_requested(39 * kDefaultRequestSize,
-                                     40 * kDefaultRequestSize);
+    constexpr gfx::Range range_requested(39 * kDefaultRequestSize,
+                                         40 * kDefaultRequestSize);
     EXPECT_EQ(range_requested.start(),
               client.partial_loader_data()->open_byte_range().start());
     EXPECT_LE(range_requested.end(),
@@ -796,8 +796,8 @@
   // Send initial data from FullPageLoader.
   client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
 
-  const gfx::Range range_requested(16 * kDefaultRequestSize,
-                                   18 * kDefaultRequestSize);
+  constexpr gfx::Range range_requested(16 * kDefaultRequestSize,
+                                       18 * kDefaultRequestSize);
   EXPECT_EQ(range_requested.start(),
             client.partial_loader_data()->open_byte_range().start());
   EXPECT_LE(range_requested.end(),
@@ -1102,7 +1102,7 @@
   client.partial_loader_data()->CallOpenCallback(0);
   uint32_t length = expected_length;
   while (length > 0) {
-    const uint32_t max_part_len = kDefaultRequestSize;
+    constexpr uint32_t max_part_len = kDefaultRequestSize;
     const uint32_t part_len = std::min(length, max_part_len);
     client.partial_loader_data()->CallReadCallback(part_len);
     length -= part_len;
@@ -1144,7 +1144,7 @@
   client.partial_loader_data()->CallOpenCallback(0);
   uint32_t length = client.partial_loader_data()->byte_range().length();
   while (length > 0) {
-    const uint32_t max_part_len = kDefaultRequestSize;
+    constexpr uint32_t max_part_len = kDefaultRequestSize;
     const uint32_t part_len = std::min(length, max_part_len);
     client.partial_loader_data()->CallReadCallback(part_len);
     length -= part_len;
diff --git a/pdf/draw_utils.cc b/pdf/draw_utils.cc
index 8078252..adb2ceb 100644
--- a/pdf/draw_utils.cc
+++ b/pdf/draw_utils.cc
@@ -55,7 +55,7 @@
 
   // pv - is a rounding power factor for smoothing corners.
   // pv = 2.0 will make corners completely round.
-  const double pv = 4.0;
+  constexpr double pv = 4.0;
   // pow_pv - cache to avoid recalculating pow(x, pv) every time.
   std::vector<double> pow_pv(depth_, 0.0);
 
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc
index 4e1b788..27d87ce3 100644
--- a/pdf/out_of_process_instance.cc
+++ b/pdf/out_of_process_instance.cc
@@ -47,118 +47,118 @@
 
 namespace {
 
-const char kChromePrint[] = "chrome://print/";
-const char kChromeExtension[] =
+constexpr char kChromePrint[] = "chrome://print/";
+constexpr char kChromeExtension[] =
     "chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai";
 
 // Constants used in handling postMessage() messages.
-const char kType[] = "type";
-const char kJSId[] = "id";
+constexpr char kType[] = "type";
+constexpr char kJSId[] = "id";
 // Beep messge arguments. (Plugin -> Page).
-const char kJSBeepType[] = "beep";
+constexpr char kJSBeepType[] = "beep";
 // Viewport message arguments. (Page -> Plugin).
-const char kJSViewportType[] = "viewport";
-const char kJSUserInitiated[] = "userInitiated";
-const char kJSXOffset[] = "xOffset";
-const char kJSYOffset[] = "yOffset";
-const char kJSZoom[] = "zoom";
-const char kJSPinchPhase[] = "pinchPhase";
+constexpr char kJSViewportType[] = "viewport";
+constexpr char kJSUserInitiated[] = "userInitiated";
+constexpr char kJSXOffset[] = "xOffset";
+constexpr char kJSYOffset[] = "yOffset";
+constexpr char kJSZoom[] = "zoom";
+constexpr char kJSPinchPhase[] = "pinchPhase";
 // kJSPinchX and kJSPinchY represent the center of the pinch gesture.
-const char kJSPinchX[] = "pinchX";
-const char kJSPinchY[] = "pinchY";
+constexpr char kJSPinchX[] = "pinchX";
+constexpr char kJSPinchY[] = "pinchY";
 // kJSPinchVector represents the amount of panning caused by the pinch gesture.
-const char kJSPinchVectorX[] = "pinchVectorX";
-const char kJSPinchVectorY[] = "pinchVectorY";
+constexpr char kJSPinchVectorX[] = "pinchVectorX";
+constexpr char kJSPinchVectorY[] = "pinchVectorY";
 // Stop scrolling message (Page -> Plugin)
-const char kJSStopScrollingType[] = "stopScrolling";
+constexpr char kJSStopScrollingType[] = "stopScrolling";
 // Document dimension arguments (Plugin -> Page).
-const char kJSDocumentDimensionsType[] = "documentDimensions";
-const char kJSDocumentWidth[] = "width";
-const char kJSDocumentHeight[] = "height";
-const char kJSPageDimensions[] = "pageDimensions";
-const char kJSPageX[] = "x";
-const char kJSPageY[] = "y";
-const char kJSPageWidth[] = "width";
-const char kJSPageHeight[] = "height";
+constexpr char kJSDocumentDimensionsType[] = "documentDimensions";
+constexpr char kJSDocumentWidth[] = "width";
+constexpr char kJSDocumentHeight[] = "height";
+constexpr char kJSPageDimensions[] = "pageDimensions";
+constexpr char kJSPageX[] = "x";
+constexpr char kJSPageY[] = "y";
+constexpr char kJSPageWidth[] = "width";
+constexpr char kJSPageHeight[] = "height";
 // Document load progress arguments (Plugin -> Page)
-const char kJSLoadProgressType[] = "loadProgress";
-const char kJSProgressPercentage[] = "progress";
+constexpr char kJSLoadProgressType[] = "loadProgress";
+constexpr char kJSProgressPercentage[] = "progress";
 // Document print preview loaded (Plugin -> Page)
-const char kJSPreviewLoadedType[] = "printPreviewLoaded";
+constexpr char kJSPreviewLoadedType[] = "printPreviewLoaded";
 // Metadata
-const char kJSMetadataType[] = "metadata";
-const char kJSBookmarks[] = "bookmarks";
-const char kJSTitle[] = "title";
+constexpr char kJSMetadataType[] = "metadata";
+constexpr char kJSBookmarks[] = "bookmarks";
+constexpr char kJSTitle[] = "title";
 // Get password (Plugin -> Page)
-const char kJSGetPasswordType[] = "getPassword";
+constexpr char kJSGetPasswordType[] = "getPassword";
 // Get password complete arguments (Page -> Plugin)
-const char kJSGetPasswordCompleteType[] = "getPasswordComplete";
-const char kJSPassword[] = "password";
+constexpr char kJSGetPasswordCompleteType[] = "getPasswordComplete";
+constexpr char kJSPassword[] = "password";
 // Print (Page -> Plugin)
-const char kJSPrintType[] = "print";
+constexpr char kJSPrintType[] = "print";
 // Save (Page -> Plugin)
-const char kJSSaveType[] = "save";
+constexpr char kJSSaveType[] = "save";
 // Go to page (Plugin -> Page)
-const char kJSGoToPageType[] = "goToPage";
-const char kJSPageNumber[] = "page";
+constexpr char kJSGoToPageType[] = "goToPage";
+constexpr char kJSPageNumber[] = "page";
 // Reset print preview mode (Page -> Plugin)
-const char kJSResetPrintPreviewModeType[] = "resetPrintPreviewMode";
-const char kJSPrintPreviewUrl[] = "url";
-const char kJSPrintPreviewGrayscale[] = "grayscale";
-const char kJSPrintPreviewPageCount[] = "pageCount";
+constexpr char kJSResetPrintPreviewModeType[] = "resetPrintPreviewMode";
+constexpr char kJSPrintPreviewUrl[] = "url";
+constexpr char kJSPrintPreviewGrayscale[] = "grayscale";
+constexpr char kJSPrintPreviewPageCount[] = "pageCount";
 // Load preview page (Page -> Plugin)
-const char kJSLoadPreviewPageType[] = "loadPreviewPage";
-const char kJSPreviewPageUrl[] = "url";
-const char kJSPreviewPageIndex[] = "index";
+constexpr char kJSLoadPreviewPageType[] = "loadPreviewPage";
+constexpr char kJSPreviewPageUrl[] = "url";
+constexpr char kJSPreviewPageIndex[] = "index";
 // Set scroll position (Plugin -> Page)
-const char kJSSetScrollPositionType[] = "setScrollPosition";
-const char kJSPositionX[] = "x";
-const char kJSPositionY[] = "y";
+constexpr char kJSSetScrollPositionType[] = "setScrollPosition";
+constexpr char kJSPositionX[] = "x";
+constexpr char kJSPositionY[] = "y";
 // Scroll by (Plugin -> Page)
-const char kJSScrollByType[] = "scrollBy";
+constexpr char kJSScrollByType[] = "scrollBy";
 // Cancel the stream URL request (Plugin -> Page)
-const char kJSCancelStreamUrlType[] = "cancelStreamUrl";
+constexpr char kJSCancelStreamUrlType[] = "cancelStreamUrl";
 // Navigate to the given URL (Plugin -> Page)
-const char kJSNavigateType[] = "navigate";
-const char kJSNavigateUrl[] = "url";
-const char kJSNavigateWindowOpenDisposition[] = "disposition";
+constexpr char kJSNavigateType[] = "navigate";
+constexpr char kJSNavigateUrl[] = "url";
+constexpr char kJSNavigateWindowOpenDisposition[] = "disposition";
 // Open the email editor with the given parameters (Plugin -> Page)
-const char kJSEmailType[] = "email";
-const char kJSEmailTo[] = "to";
-const char kJSEmailCc[] = "cc";
-const char kJSEmailBcc[] = "bcc";
-const char kJSEmailSubject[] = "subject";
-const char kJSEmailBody[] = "body";
+constexpr char kJSEmailType[] = "email";
+constexpr char kJSEmailTo[] = "to";
+constexpr char kJSEmailCc[] = "cc";
+constexpr char kJSEmailBcc[] = "bcc";
+constexpr char kJSEmailSubject[] = "subject";
+constexpr char kJSEmailBody[] = "body";
 // Rotation (Page -> Plugin)
-const char kJSRotateClockwiseType[] = "rotateClockwise";
-const char kJSRotateCounterclockwiseType[] = "rotateCounterclockwise";
+constexpr char kJSRotateClockwiseType[] = "rotateClockwise";
+constexpr char kJSRotateCounterclockwiseType[] = "rotateCounterclockwise";
 // Select all text in the document (Page -> Plugin)
-const char kJSSelectAllType[] = "selectAll";
+constexpr char kJSSelectAllType[] = "selectAll";
 // Get the selected text in the document (Page -> Plugin)
-const char kJSGetSelectedTextType[] = "getSelectedText";
+constexpr char kJSGetSelectedTextType[] = "getSelectedText";
 // Reply with selected text (Plugin -> Page)
-const char kJSGetSelectedTextReplyType[] = "getSelectedTextReply";
-const char kJSSelectedText[] = "selectedText";
+constexpr char kJSGetSelectedTextReplyType[] = "getSelectedTextReply";
+constexpr char kJSSelectedText[] = "selectedText";
 
 // Get the named destination with the given name (Page -> Plugin)
-const char kJSGetNamedDestinationType[] = "getNamedDestination";
-const char kJSGetNamedDestination[] = "namedDestination";
+constexpr char kJSGetNamedDestinationType[] = "getNamedDestination";
+constexpr char kJSGetNamedDestination[] = "namedDestination";
 // Reply with the page number of the named destination (Plugin -> Page)
-const char kJSGetNamedDestinationReplyType[] = "getNamedDestinationReply";
-const char kJSNamedDestinationPageNumber[] = "pageNumber";
+constexpr char kJSGetNamedDestinationReplyType[] = "getNamedDestinationReply";
+constexpr char kJSNamedDestinationPageNumber[] = "pageNumber";
 
-const char kJSTransformPagePointType[] = "transformPagePoint";
-const char kJSTransformPagePointReplyType[] = "transformPagePointReply";
+constexpr char kJSTransformPagePointType[] = "transformPagePoint";
+constexpr char kJSTransformPagePointReplyType[] = "transformPagePointReply";
 
 // Selecting text in document (Plugin -> Page)
-const char kJSSetIsSelectingType[] = "setIsSelecting";
-const char kJSIsSelecting[] = "isSelecting";
+constexpr char kJSSetIsSelectingType[] = "setIsSelecting";
+constexpr char kJSIsSelecting[] = "isSelecting";
 
 // Notify when a form field is focused (Plugin -> Page)
-const char kJSFieldFocusType[] = "formFocusChange";
-const char kJSFieldFocus[] = "focused";
+constexpr char kJSFieldFocusType[] = "formFocusChange";
+constexpr char kJSFieldFocus[] = "focused";
 
-const int kFindResultCooldownMs = 100;
+constexpr int kFindResultCooldownMs = 100;
 
 // Same value as printing::COMPLETE_PREVIEW_DOCUMENT_INDEX.
 constexpr int kCompletePDFIndex = -1;
@@ -167,11 +167,11 @@
 
 // A delay to wait between each accessibility page to keep the system
 // responsive.
-const int kAccessibilityPageDelayMs = 100;
+constexpr int kAccessibilityPageDelayMs = 100;
 
-const double kMinZoom = 0.01;
+constexpr double kMinZoom = 0.01;
 
-const char kPPPPdfInterface[] = PPP_PDF_INTERFACE_1;
+constexpr char kPPPPdfInterface[] = PPP_PDF_INTERFACE_1;
 
 // Used for UMA. Do not delete entries, and keep in sync with histograms.xml.
 enum PDFFeatures {
@@ -183,7 +183,7 @@
 
 // Used for UMA. Do not delete entries, and keep in sync with histograms.xml
 // and pdfium/public/fpdf_annot.h.
-const int kAnnotationTypesCount = 28;
+constexpr int kAnnotationTypesCount = 28;
 
 PP_Var GetLinkAtPosition(PP_Instance instance, PP_Point point) {
   pp::Var var;
@@ -1648,7 +1648,7 @@
   }
 
   pp::PDF::SetContentRestriction(this, content_restrictions);
-  static const int32_t kMaxFileSizeInKB = 12 * 1024 * 1024;
+  static constexpr int32_t kMaxFileSizeInKB = 12 * 1024 * 1024;
   HistogramCustomCounts("PDF.FileSizeInKB", file_size / 1024, 0,
                         kMaxFileSizeInKB, 50);
   HistogramCustomCounts("PDF.PageCount", document_features.page_count, 1,
diff --git a/pdf/paint_manager.cc b/pdf/paint_manager.cc
index fdccaef..e83805e 100644
--- a/pdf/paint_manager.cc
+++ b/pdf/paint_manager.cc
@@ -55,7 +55,7 @@
                                          const pp::Size& plugin_size) {
   // The amount of additional space in pixels to allocate to the right/bottom of
   // the context.
-  const int kBufferSize = 50;
+  constexpr int kBufferSize = 50;
 
   // Default to returning the same size.
   pp::Size result = current_context_size;
diff --git a/pdf/pdf_transform.cc b/pdf/pdf_transform.cc
index 28a69de..0acb36c4 100644
--- a/pdf/pdf_transform.cc
+++ b/pdf/pdf_transform.cc
@@ -42,9 +42,9 @@
 }
 
 void SetDefaultClipBox(bool rotated, PdfRectangle* clip_box) {
-  const int kDpi = 72;
-  const float kPaperWidth = 8.5 * kDpi;
-  const float kPaperHeight = 11 * kDpi;
+  constexpr int kDpi = 72;
+  constexpr float kPaperWidth = 8.5 * kDpi;
+  constexpr float kPaperHeight = 11 * kDpi;
   clip_box->left = 0;
   clip_box->bottom = 0;
   clip_box->right = rotated ? kPaperHeight : kPaperWidth;
diff --git a/pdf/pdf_transform_unittest.cc b/pdf/pdf_transform_unittest.cc
index e52b02a..faf424e 100644
--- a/pdf/pdf_transform_unittest.cc
+++ b/pdf/pdf_transform_unittest.cc
@@ -12,10 +12,10 @@
 
 namespace {
 
-const float kDefaultWidth = 8.5 * printing::kPointsPerInch;
-const float kDefaultHeight = 11.0 * printing::kPointsPerInch;
-const float kDefaultRatio = kDefaultWidth / kDefaultHeight;
-const double kTolerance = 0.0001;
+constexpr float kDefaultWidth = 8.5 * printing::kPointsPerInch;
+constexpr float kDefaultHeight = 11.0 * printing::kPointsPerInch;
+constexpr float kDefaultRatio = kDefaultWidth / kDefaultHeight;
+constexpr double kTolerance = 0.0001;
 
 void ExpectDefaultPortraitBox(const PdfRectangle& box) {
   EXPECT_FLOAT_EQ(0, box.left);
@@ -130,7 +130,7 @@
   ExpectDefaultLandscapeBox(crop_box);
 
   // Assume crop box is missing.
-  const PdfRectangle expected_box = {0, 0, 42, 420};
+  constexpr PdfRectangle expected_box = {0, 0, 42, 420};
   media_box = expected_box;
   InitializeBoxToInvalidValues(&crop_box);
   CalculateMediaBoxAndCropBox(false, true, false, &media_box, &crop_box);
@@ -188,7 +188,7 @@
 }
 
 TEST(PdfTransformTest, CalculateScaledClipBoxOffset) {
-  const gfx::Rect rect(kDefaultWidth, kDefaultHeight);
+  constexpr gfx::Rect rect(kDefaultWidth, kDefaultHeight);
   PdfRectangle clip_box;
   double offset_x;
   double offset_y;
@@ -210,7 +210,7 @@
 TEST(PdfTransformTest, CalculateNonScaledClipBoxOffset) {
   int page_width = kDefaultWidth;
   int page_height = kDefaultHeight;
-  const gfx::Rect rect(kDefaultWidth, kDefaultHeight);
+  constexpr gfx::Rect rect(kDefaultWidth, kDefaultHeight);
   PdfRectangle clip_box;
   double offset_x;
   double offset_y;
@@ -280,12 +280,12 @@
 TEST(PdfTransformTest, ReversedMediaBox) {
   int page_width = kDefaultWidth;
   int page_height = kDefaultHeight;
-  const gfx::Rect rect(kDefaultWidth, kDefaultHeight);
+  constexpr gfx::Rect rect(kDefaultWidth, kDefaultHeight);
   PdfRectangle clip_box;
   double offset_x;
   double offset_y;
 
-  const PdfRectangle expected_media_box_b491160 = {0, -792, 612, 0};
+  constexpr PdfRectangle expected_media_box_b491160 = {0, -792, 612, 0};
   PdfRectangle media_box_b491160 = {0, 0, 612, -792};
   CalculateMediaBoxAndCropBox(false, true, false, &media_box_b491160,
                               &clip_box);
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index 63c39768..fd7dbe5 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -76,20 +76,20 @@
 
 namespace {
 
-const int32_t kPageShadowTop = 3;
-const int32_t kPageShadowBottom = 7;
-const int32_t kPageShadowLeft = 5;
-const int32_t kPageShadowRight = 5;
+constexpr int32_t kPageShadowTop = 3;
+constexpr int32_t kPageShadowBottom = 7;
+constexpr int32_t kPageShadowLeft = 5;
+constexpr int32_t kPageShadowRight = 5;
 
-const int32_t kPageSeparatorThickness = 4;
-const int32_t kHighlightColorR = 153;
-const int32_t kHighlightColorG = 193;
-const int32_t kHighlightColorB = 218;
+constexpr int32_t kPageSeparatorThickness = 4;
+constexpr int32_t kHighlightColorR = 153;
+constexpr int32_t kHighlightColorG = 193;
+constexpr int32_t kHighlightColorB = 218;
 
-const uint32_t kPendingPageColor = 0xFFEEEEEE;
+constexpr uint32_t kPendingPageColor = 0xFFEEEEEE;
 
-const uint32_t kFormHighlightColor = 0xFFE4DD;
-const int32_t kFormHighlightAlpha = 100;
+constexpr uint32_t kFormHighlightColor = 0xFFE4DD;
+constexpr int32_t kFormHighlightAlpha = 100;
 
 constexpr int kMaxPasswordTries = 3;
 
@@ -105,12 +105,12 @@
 
 // See Table 3.20 in
 // http://www.adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf
-const uint32_t kPDFPermissionPrintLowQualityMask = 1 << 2;
-const uint32_t kPDFPermissionPrintHighQualityMask = 1 << 11;
-const uint32_t kPDFPermissionCopyMask = 1 << 4;
-const uint32_t kPDFPermissionCopyAccessibleMask = 1 << 9;
+constexpr uint32_t kPDFPermissionPrintLowQualityMask = 1 << 2;
+constexpr uint32_t kPDFPermissionPrintHighQualityMask = 1 << 11;
+constexpr uint32_t kPDFPermissionCopyMask = 1 << 4;
+constexpr uint32_t kPDFPermissionCopyAccessibleMask = 1 << 9;
 
-const int32_t kLoadingTextVerticalOffset = 50;
+constexpr int32_t kLoadingTextVerticalOffset = 50;
 
 // The maximum amount of time we'll spend doing a paint before we give back
 // control of the thread.
@@ -147,8 +147,8 @@
                 "PP_BrowserFont_Trusted_Weight min");
   static_assert(PP_BROWSERFONT_TRUSTED_WEIGHT_900 == 8,
                 "PP_BrowserFont_Trusted_Weight max");
-  const int kMinimumWeight = 100;
-  const int kMaximumWeight = 900;
+  constexpr int kMinimumWeight = 100;
+  constexpr int kMaximumWeight = 900;
   int normalized_weight =
       std::min(std::max(weight, kMinimumWeight), kMaximumWeight);
   normalized_weight = (normalized_weight / 100) - 1;
@@ -447,7 +447,7 @@
   std::vector<HyphenPosition> hyphen_positions;
   HyphenPosition current_hyphen_position;
   bool current_hyphen_position_is_valid = false;
-  const base::char16 kPdfiumHyphenEOL = 0xfffe;
+  constexpr base::char16 kPdfiumHyphenEOL = 0xfffe;
 
   for (size_t i = 0; i < text->size(); ++i) {
     const base::char16& current_char = (*text)[i];
@@ -471,7 +471,7 @@
 
   // With all the hyphen positions, do the search and replace.
   while (!hyphen_positions.empty()) {
-    static const base::char16 kCr[] = {L'\r', L'\0'};
+    static constexpr base::char16 kCr[] = {L'\r', L'\0'};
     const HyphenPosition& position = hyphen_positions.back();
     if (position.next_whitespace_position != 0) {
       (*text)[position.next_whitespace_position] = L'\n';
@@ -482,16 +482,16 @@
   }
 
   // Adobe Reader also get rid of trailing spaces right before a CRLF.
-  static const base::char16 kSpaceCrCn[] = {L' ', L'\r', L'\n', L'\0'};
-  static const base::char16 kCrCn[] = {L'\r', L'\n', L'\0'};
+  static constexpr base::char16 kSpaceCrCn[] = {L' ', L'\r', L'\n', L'\0'};
+  static constexpr base::char16 kCrCn[] = {L'\r', L'\n', L'\0'};
   base::ReplaceSubstringsAfterOffset(text, 0, kSpaceCrCn, kCrCn);
 }
 
 // Replace CR/LF with just LF on POSIX.
 void FormatStringForOS(base::string16* text) {
 #if defined(OS_POSIX)
-  static const base::char16 kCr[] = {L'\r', L'\0'};
-  static const base::char16 kBlank[] = {L'\0'};
+  static constexpr base::char16 kCr[] = {L'\r', L'\0'};
+  static constexpr base::char16 kBlank[] = {L'\0'};
   base::ReplaceChars(*text, kCr, kBlank, text);
 #elif defined(OS_WIN)
   // Do nothing
@@ -2347,7 +2347,7 @@
   pp::VarArray children;
 
   // Don't trust PDFium to handle circular bookmarks.
-  const unsigned int kMaxDepth = 128;
+  constexpr unsigned int kMaxDepth = 128;
   if (depth < kMaxDepth) {
     int child_index = 0;
     std::set<FPDF_BOOKMARK> seen_bookmarks;
@@ -3435,7 +3435,7 @@
   clip_rect.Offset(page_offset_);
 
   // Page drop shadow parameters.
-  const double factor = 0.5;
+  constexpr double factor = 0.5;
   uint32_t depth =
       std::max(std::max(page_rect.x() - shadow_rect.x(),
                         page_rect.y() - shadow_rect.y()),
diff --git a/pdf/pdfium/pdfium_print.cc b/pdf/pdfium/pdfium_print.cc
index a6ca61e..73e034c 100644
--- a/pdf/pdfium/pdfium_print.cc
+++ b/pdf/pdfium/pdfium_print.cc
@@ -432,7 +432,7 @@
     // Use quality = 40 as this does not significantly degrade the printed
     // document relative to a normal bitmap and provides better compression than
     // a higher quality setting.
-    const int kQuality = 40;
+    constexpr int kQuality = 40;
     SkImageInfo info = SkImageInfo::Make(
         FPDFBitmap_GetWidth(bitmap.get()), FPDFBitmap_GetHeight(bitmap.get()),
         kBGRA_8888_SkColorType, kOpaque_SkAlphaType);
diff --git a/pdf/pdfium/pdfium_print_unittest.cc b/pdf/pdfium/pdfium_print_unittest.cc
index f033a08..bc724c31 100644
--- a/pdf/pdfium/pdfium_print_unittest.cc
+++ b/pdf/pdfium/pdfium_print_unittest.cc
@@ -76,15 +76,15 @@
 
   PDFiumPrint print(&engine);
 
-  const PP_PrintSettings_Dev print_settings = {kUSLetterRect,
-                                               kUSLetterRect,
-                                               kUSLetterSize,
-                                               72,
-                                               PP_PRINTORIENTATION_NORMAL,
-                                               PP_PRINTSCALINGOPTION_NONE,
-                                               PP_FALSE,
-                                               PP_PRINTOUTPUTFORMAT_PDF};
-  const PP_PdfPrintSettings_Dev pdf_print_settings = {1, 100};
+  constexpr PP_PrintSettings_Dev print_settings = {kUSLetterRect,
+                                                   kUSLetterRect,
+                                                   kUSLetterSize,
+                                                   72,
+                                                   PP_PRINTORIENTATION_NORMAL,
+                                                   PP_PRINTSCALINGOPTION_NONE,
+                                                   PP_FALSE,
+                                                   PP_PRINTOUTPUTFORMAT_PDF};
+  constexpr PP_PdfPrintSettings_Dev pdf_print_settings = {1, 100};
 
   {
     // Print 2 pages.
diff --git a/remoting/proto/video_stats.proto b/remoting/proto/video_stats.proto
index c02ef22..185afef8 100644
--- a/remoting/proto/video_stats.proto
+++ b/remoting/proto/video_stats.proto
@@ -50,8 +50,7 @@
   // generates this frame.
   optional uint32 capturer_id = 12;
 
-  // The last quantizer chosen by the encoder for this frame. Higher numbers
-  // represent lower-quality images. Values are between 0 and 63, as used by
-  // the rc_*_quantizer config parameters.
-  optional uint32 frame_quantizer = 13;
+  // A simple indication of the quality of the frame, scored between 0 and 100,
+  // with 100 representing a lossless encoded frame.
+  optional uint32 frame_quality = 13;
 }
diff --git a/remoting/protocol/frame_stats.cc b/remoting/protocol/frame_stats.cc
index 4dfede2..a221235f 100644
--- a/remoting/protocol/frame_stats.cc
+++ b/remoting/protocol/frame_stats.cc
@@ -98,8 +98,8 @@
   if (message.has_capturer_id()) {
     result.capturer_id = message.capturer_id();
   }
-  if (message.has_frame_quantizer()) {
-    result.frame_quantizer = message.frame_quantizer();
+  if (message.has_frame_quality()) {
+    result.frame_quality = message.frame_quality();
   }
 
   return result;
@@ -142,8 +142,8 @@
   if (capturer_id != webrtc::DesktopCapturerId::kUnknown) {
     message_out->set_capturer_id(capturer_id);
   }
-  if (frame_quantizer != -1) {
-    message_out->set_frame_quantizer(frame_quantizer);
+  if (frame_quality != -1) {
+    message_out->set_frame_quality(frame_quality);
   }
 }
 
diff --git a/remoting/protocol/frame_stats.h b/remoting/protocol/frame_stats.h
index 581ec2b..fbd83ea 100644
--- a/remoting/protocol/frame_stats.h
+++ b/remoting/protocol/frame_stats.h
@@ -43,7 +43,7 @@
   base::TimeDelta rtt_estimate = base::TimeDelta::Max();
   int bandwidth_estimate_kbps = -1;
   uint32_t capturer_id = webrtc::DesktopCapturerId::kUnknown;
-  int frame_quantizer = -1;
+  int frame_quality = -1;
 };
 
 struct ClientFrameStats {
diff --git a/remoting/protocol/frame_stats_unittest.cc b/remoting/protocol/frame_stats_unittest.cc
index 9659c08..22a85e1 100644
--- a/remoting/protocol/frame_stats_unittest.cc
+++ b/remoting/protocol/frame_stats_unittest.cc
@@ -23,7 +23,7 @@
   stats.rtt_estimate = base::TimeDelta::FromSeconds(17);
   stats.bandwidth_estimate_kbps = 18;
   stats.capturer_id = 19;
-  stats.frame_quantizer = 20;
+  stats.frame_quality = 20;
   FrameStatsMessage message;
 
   stats.ToFrameStatsMessage(&message);
@@ -39,7 +39,7 @@
   EXPECT_EQ(stats.rtt_estimate, newStats.rtt_estimate);
   EXPECT_EQ(stats.bandwidth_estimate_kbps, newStats.bandwidth_estimate_kbps);
   EXPECT_EQ(stats.capturer_id, newStats.capturer_id);
-  EXPECT_EQ(stats.frame_quantizer, newStats.frame_quantizer);
+  EXPECT_EQ(stats.frame_quality, newStats.frame_quality);
 }
 
 }  // namespace protocol
diff --git a/remoting/protocol/webrtc_video_stream.cc b/remoting/protocol/webrtc_video_stream.cc
index 4c0b259..43c7fd2 100644
--- a/remoting/protocol/webrtc_video_stream.cc
+++ b/remoting/protocol/webrtc_video_stream.cc
@@ -53,7 +53,7 @@
 }  // namespace
 
 struct WebrtcVideoStream::FrameStats {
-  // The following fields is not null only for one frame after each incoming
+  // The following fields are non-null only for one frame after each incoming
   // input event.
   InputEventTimestamps input_event_timestamps;
 
@@ -64,7 +64,7 @@
   base::TimeTicks encode_ended_time;
 
   uint32_t capturer_id = 0;
-  int frame_quantizer = -1;
+  int frame_quality = -1;
 };
 
 WebrtcVideoStream::WebrtcVideoStream(const SessionOptions& session_options)
@@ -243,7 +243,14 @@
   DCHECK(thread_checker_.CalledOnValidThread());
 
   current_frame_stats_->encode_ended_time = base::TimeTicks::Now();
-  current_frame_stats_->frame_quantizer = frame->quantizer;
+
+  // Convert the frame quantizer to a measure of frame quality between 0 and
+  // 100, for a simple visualization of quality over time. The quantizer from
+  // VP8/VP9 encoder lies within 0-63, with 0 representing a lossless
+  // frame.
+  // TODO(crbug.com/891571): Remove |quantizer| from the WebrtcVideoEncoder
+  // interface, and move this logic to the encoders.
+  current_frame_stats_->frame_quality = (63 - frame->quantizer) * 100 / 63;
 
   HostFrameStats stats;
   scheduler_->OnFrameEncoded(frame.get(), &stats);
@@ -299,7 +306,7 @@
 
     stats.capturer_id = current_frame_stats_->capturer_id;
 
-    stats.frame_quantizer = current_frame_stats_->frame_quantizer;
+    stats.frame_quality = current_frame_stats_->frame_quality;
 
     video_stats_dispatcher_.OnVideoFrameStats(result.frame_id, stats);
   }
diff --git a/services/media_session/audio_focus_manager.cc b/services/media_session/audio_focus_manager.cc
index 5092168..b2b4c83 100644
--- a/services/media_session/audio_focus_manager.cc
+++ b/services/media_session/audio_focus_manager.cc
@@ -34,8 +34,10 @@
            mojom::MediaSessionPtr session,
            mojom::MediaSessionInfoPtr session_info,
            mojom::AudioFocusType audio_focus_type,
-           RequestId id)
+           RequestId id,
+           const std::string& source_name)
       : id_(id),
+        source_name_(source_name),
         session_(std::move(session)),
         session_info_(std::move(session_info)),
         audio_focus_type_(audio_focus_type),
@@ -98,6 +100,8 @@
 
   RequestId id() const { return id_; }
 
+  const std::string& source_name() const { return source_name_; }
+
   // Flush any pending mojo messages for testing.
   void FlushForTesting() {
     session_.FlushForTesting();
@@ -112,6 +116,8 @@
   }
 
   const RequestId id_;
+  const std::string source_name_;
+
   mojom::MediaSessionPtr session_;
   mojom::MediaSessionInfoPtr session_info_;
   mojom::AudioFocusType audio_focus_type_;
@@ -137,7 +143,8 @@
   RequestAudioFocusInternal(
       std::make_unique<StackRow>(
           this, std::move(request), std::move(media_session),
-          std::move(session_info), type, GenerateAudioFocusRequestId()),
+          std::move(session_info), type, GenerateAudioFocusRequestId(),
+          GetBindingSourceName()),
       type, std::move(callback));
 }
 
@@ -149,6 +156,7 @@
     request->session_info = row->info().Clone();
     request->audio_focus_type = row->audio_focus_type();
     request->request_id = row->id();
+    request->source_name = row->source_name();
     requests.push_back(std::move(request));
   }
 
@@ -203,10 +211,16 @@
   observers_.AddPtr(std::move(observer));
 }
 
+void AudioFocusManager::SetSourceName(const std::string& name) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  bindings_.dispatch_context()->source_name = name;
+}
+
 void AudioFocusManager::BindToInterface(
     mojom::AudioFocusManagerRequest request) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  bindings_.AddBinding(this, std::move(request));
+  bindings_.AddBinding(this, std::move(request),
+                       std::make_unique<BindingContext>());
 }
 
 void AudioFocusManager::BindToDebugInterface(
@@ -357,6 +371,11 @@
   return row;
 }
 
+const std::string& AudioFocusManager::GetBindingSourceName() const {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  return bindings_.dispatch_context()->source_name;
+}
+
 bool AudioFocusManager::IsSessionOnTopOfAudioFocusStack(
     RequestId id,
     mojom::AudioFocusType type) const {
diff --git a/services/media_session/audio_focus_manager.h b/services/media_session/audio_focus_manager.h
index 20c597df..18b8526 100644
--- a/services/media_session/audio_focus_manager.h
+++ b/services/media_session/audio_focus_manager.h
@@ -6,6 +6,7 @@
 #define SERVICES_MEDIA_SESSION_AUDIO_FOCUS_MANAGER_H_
 
 #include <list>
+#include <string>
 #include <unordered_map>
 
 #include "base/memory/singleton.h"
@@ -34,6 +35,7 @@
                          RequestAudioFocusCallback callback) override;
   void GetFocusRequests(GetFocusRequestsCallback callback) override;
   void AddObserver(mojom::AudioFocusObserverPtr observer) override;
+  void SetSourceName(const std::string& name) override;
 
   // mojom::AudioFocusManagerDebug.
   void GetDebugInfoForRequest(uint64_t request_id,
@@ -57,6 +59,15 @@
   // control its audio focus.
   class StackRow;
 
+  // BindingContext stores associated metadata for mojo binding.
+  struct BindingContext {
+    // The source name is associated with a binding when a client calls
+    // |SetSourceName|. It is used to provide more granularity than a
+    // service_manager::Identity for metrics and for identifying where an audio
+    // focus request originated from.
+    std::string source_name;
+  };
+
   void RequestAudioFocusInternal(std::unique_ptr<StackRow>,
                                  mojom::AudioFocusType,
                                  base::OnceCallback<void()>);
@@ -76,11 +87,16 @@
 
   std::unique_ptr<StackRow> RemoveFocusEntryIfPresent(RequestId id);
 
+  // Returns the source name of the binding currently accessing the Audio
+  // Focus Manager API over mojo.
+  const std::string& GetBindingSourceName() const;
+
   bool IsSessionOnTopOfAudioFocusStack(RequestId id,
                                        mojom::AudioFocusType type) const;
 
   // Holds mojo bindings for the Audio Focus Manager API.
-  mojo::BindingSet<mojom::AudioFocusManager> bindings_;
+  mojo::BindingSet<mojom::AudioFocusManager, std::unique_ptr<BindingContext>>
+      bindings_;
 
   // Holds mojo bindings for the Audio Focus Manager Debug API.
   mojo::BindingSet<mojom::AudioFocusManagerDebug> debug_bindings_;
diff --git a/services/media_session/audio_focus_manager_unittest.cc b/services/media_session/audio_focus_manager_unittest.cc
index e509c534..5e1bea9 100644
--- a/services/media_session/audio_focus_manager_unittest.cc
+++ b/services/media_session/audio_focus_manager_unittest.cc
@@ -34,6 +34,9 @@
 const char kExampleDebugInfoOwner[] = "owner";
 const char kExampleDebugInfoState[] = "state";
 
+const char kExampleSourceName[] = "test";
+const char kExampleSourceName2[] = "test2";
+
 class MockMediaSession : public mojom::MediaSession {
  public:
   MockMediaSession() = default;
@@ -296,6 +299,23 @@
     return mojom::MediaSessionInfo::SessionState::kActive;
   }
 
+  void SetSourceName(const std::string& name) {
+    GetService()->SetSourceName(name);
+    audio_focus_ptr_.FlushForTesting();
+  }
+
+  mojom::AudioFocusManagerPtr CreateAudioFocusManagerPtr() {
+    mojom::AudioFocusManagerPtr ptr;
+    connector_->BindInterface("test", mojo::MakeRequest(&ptr));
+    return ptr;
+  }
+
+  const std::string GetSourceNameForLastRequest() {
+    std::vector<mojom::AudioFocusRequestStatePtr> requests = GetRequests();
+    EXPECT_TRUE(requests.back());
+    return requests.back()->source_name.value();
+  }
+
  private:
   int GetCountForType(mojom::AudioFocusType type) {
     const auto audio_focus_requests = GetRequests();
@@ -930,4 +950,33 @@
             GetState(&media_session_1));
 }
 
+TEST_P(AudioFocusManagerTest, SourceName_AssociatedWithBinding) {
+  SetSourceName(kExampleSourceName);
+
+  mojom::AudioFocusManagerPtr new_ptr = CreateAudioFocusManagerPtr();
+  new_ptr->SetSourceName(kExampleSourceName2);
+  new_ptr.FlushForTesting();
+
+  MockMediaSession media_session;
+  RequestAudioFocus(&media_session, mojom::AudioFocusType::kGain);
+  EXPECT_EQ(kExampleSourceName, GetSourceNameForLastRequest());
+}
+
+TEST_P(AudioFocusManagerTest, SourceName_Empty) {
+  MockMediaSession media_session;
+  RequestAudioFocus(&media_session, mojom::AudioFocusType::kGain);
+  EXPECT_TRUE(GetSourceNameForLastRequest().empty());
+}
+
+TEST_P(AudioFocusManagerTest, SourceName_Updated) {
+  SetSourceName(kExampleSourceName);
+
+  MockMediaSession media_session;
+  RequestAudioFocus(&media_session, mojom::AudioFocusType::kGain);
+  EXPECT_EQ(kExampleSourceName, GetSourceNameForLastRequest());
+
+  SetSourceName(kExampleSourceName2);
+  EXPECT_EQ(kExampleSourceName, GetSourceNameForLastRequest());
+}
+
 }  // namespace media_session
diff --git a/services/media_session/public/mojom/audio_focus.mojom b/services/media_session/public/mojom/audio_focus.mojom
index ba13fda..6f9454b 100644
--- a/services/media_session/public/mojom/audio_focus.mojom
+++ b/services/media_session/public/mojom/audio_focus.mojom
@@ -6,7 +6,10 @@
 
 import "services/media_session/public/mojom/media_session.mojom";
 
+// Next MinVersion: 2
+
 // These are the different types of audio focus that can be requested.
+[Extensible]
 enum AudioFocusType {
   // Request permanent audio focus when you plan to play audio for the
   // foreseeable future (for example, when playing music) and you expect the
@@ -29,50 +32,60 @@
   MediaSessionInfo session_info;
   AudioFocusType audio_focus_type;
   uint64 request_id;
+  [MinVersion=2] string? source_name;
 };
 
 // The observer for audio focus events.
+// Next Method ID: 2
 interface AudioFocusObserver {
   // The given |session| gained audio focus with the specified |type|.
-  OnFocusGained(MediaSessionInfo session, AudioFocusType type);
+  OnFocusGained@0(MediaSessionInfo session, AudioFocusType type);
 
   // The given |session| lost audio focus.
-  OnFocusLost(MediaSessionInfo session);
+  OnFocusLost@1(MediaSessionInfo session);
 };
 
 // Controls audio focus for an associated request.
+// Next Method ID: 4
 interface AudioFocusRequestClient {
   // Requests updated audio focus for this request. If the request was granted
   // then the callback will resolve.
-  RequestAudioFocus(MediaSessionInfo session_info, AudioFocusType type) => ();
+  RequestAudioFocus@0(MediaSessionInfo session_info, AudioFocusType type) => ();
 
   // Abandons audio focus for this request.
-  AbandonAudioFocus();
+  AbandonAudioFocus@1();
 
   // Notifies the audio focus backend when the associated session info changes.
-  MediaSessionInfoChanged(MediaSessionInfo session_info);
+  MediaSessionInfoChanged@2(MediaSessionInfo session_info);
 
   // Retrieve a unique ID for this request.
-  GetRequestId() => (uint64 request_id);
+  GetRequestId@3() => (uint64 request_id);
 };
 
 // Controls audio focus across the entire system.
+// Next Method ID: 4
 interface AudioFocusManager {
   // Requests audio focus with |type| for the |media_session| with
   // |session_info|. Media sessions should provide a |request| that will
   // provide an AudioFocusRequestClient that can be used to control this
   // request. The callback will resolve when audio focus has been granted.
-  RequestAudioFocus(AudioFocusRequestClient& client,
+  RequestAudioFocus@0(AudioFocusRequestClient& client,
                     MediaSession media_session,
                     MediaSessionInfo session_info,
                     AudioFocusType type) => ();
 
   // Gets all the information about all |MediaSessions| that have requested
   // audio focus and their current requested type.
-  GetFocusRequests() => (array<AudioFocusRequestState> requests);
+  GetFocusRequests@1() => (array<AudioFocusRequestState> requests);
 
   // Adds observers that receive audio focus events.
-  AddObserver(AudioFocusObserver observer);
+  AddObserver@2(AudioFocusObserver observer);
+
+  // Associates a name with this binding. This will be associated with all
+  // audio focus requests made with this binding. It will also be used for
+  // associating metrics to a source. If the source name is updated then
+  // the audio focus requests will retain the previous source name.
+  [MinVersion=2] SetSourceName@3(string name);
 };
 
 // Provides debug information about audio focus requests.
diff --git a/services/media_session/public/mojom/media_session.mojom b/services/media_session/public/mojom/media_session.mojom
index 542bd630..25901a2 100644
--- a/services/media_session/public/mojom/media_session.mojom
+++ b/services/media_session/public/mojom/media_session.mojom
@@ -4,8 +4,11 @@
 
 module media_session.mojom;
 
+// Next MinVersion: 1
+
 // Contains state information about a MediaSession.
 struct MediaSessionInfo {
+  [Extensible]
   enum SessionState {
     // The MediaSession is currently playing media.
     kActive,
@@ -41,16 +44,19 @@
 };
 
 // The observer for observing media session events.
+// Next Method ID: 1
 interface MediaSessionObserver {
   // The info associated with the session changed.
-  MediaSessionInfoChanged(MediaSessionInfo info);
+  MediaSessionInfoChanged@0(MediaSessionInfo info);
 };
 
 // A MediaSession manages the media session and audio focus for a given
 // WebContents or ARC app.
 // TODO(https://crbug.com/875004): migrate media session from content/public
 // to mojo.
+// Next Method ID: 6
 interface MediaSession {
+  [Extensible]
   enum SuspendType {
     // Suspended by the system because a transient sound needs to be played.
     kSystem,
@@ -61,26 +67,26 @@
   };
 
   // Returns information about the MediaSession.
-  GetMediaSessionInfo() => (MediaSessionInfo info);
+  GetMediaSessionInfo@0() => (MediaSessionInfo info);
 
   // Returns debug information about the MediaSession.
-  GetDebugInfo() => (MediaSessionDebugInfo info);
+  GetDebugInfo@1() => (MediaSessionDebugInfo info);
 
   // Let the media session start ducking such that the volume multiplier
   // is reduced.
-  StartDucking();
+  StartDucking@2();
 
   // Let the media session stop ducking such that the volume multiplier is
   // recovered.
-  StopDucking();
+  StopDucking@3();
 
   // Suspend the media session.
   // |type| represents the origin of the request.
-  Suspend(SuspendType suspend_type);
+  Suspend@4(SuspendType suspend_type);
 
   // Resume the media session.
   // |type| represents the origin of the request.
-  Resume(SuspendType suspend_type);
+  Resume@5(SuspendType suspend_type);
 
-  AddObserver(MediaSessionObserver observer);
+  AddObserver@6(MediaSessionObserver observer);
 };
diff --git a/services/resource_coordinator/BUILD.gn b/services/resource_coordinator/BUILD.gn
index 4f2152e6..4675247 100644
--- a/services/resource_coordinator/BUILD.gn
+++ b/services/resource_coordinator/BUILD.gn
@@ -55,6 +55,8 @@
     "resource_coordinator_clock.h",
     "resource_coordinator_service.cc",
     "resource_coordinator_service.h",
+    "webui_graph_dump_impl.cc",
+    "webui_graph_dump_impl.h",
   ]
 
   public_deps = [
@@ -109,6 +111,7 @@
     "public/cpp/memory_instrumentation/memory_instrumentation_mojom_traits_unittest.cc",
     "public/cpp/memory_instrumentation/os_metrics_unittest.cc",
     "public/cpp/memory_instrumentation/tracing_integration_unittest.cc",
+    "webui_graph_dump_impl_unittest.cc",
   ]
 
   if (!is_android) {
diff --git a/services/resource_coordinator/coordination_unit/coordination_unit_graph.cc b/services/resource_coordinator/coordination_unit/coordination_unit_graph.cc
index 5c1771d4..80505505 100644
--- a/services/resource_coordinator/coordination_unit/coordination_unit_graph.cc
+++ b/services/resource_coordinator/coordination_unit/coordination_unit_graph.cc
@@ -127,25 +127,19 @@
   return ProcessCoordinationUnitImpl::FromCoordinationUnitBase(it->second);
 }
 
-std::vector<CoordinationUnitBase*>
-CoordinationUnitGraph::GetCoordinationUnitsOfType(CoordinationUnitType type) {
-  std::vector<CoordinationUnitBase*> results;
-  for (const auto& el : coordination_units_) {
-    if (el.first.type == type)
-      results.push_back(el.second.get());
-  }
-  return results;
-}
-
 std::vector<ProcessCoordinationUnitImpl*>
 CoordinationUnitGraph::GetAllProcessCoordinationUnits() {
-  auto cus = GetCoordinationUnitsOfType(CoordinationUnitType::kProcess);
-  std::vector<ProcessCoordinationUnitImpl*> process_cus;
-  for (auto* process_cu : cus) {
-    process_cus.push_back(
-        ProcessCoordinationUnitImpl::FromCoordinationUnitBase(process_cu));
-  }
-  return process_cus;
+  return GetAllCoordinationUnitsOfType<ProcessCoordinationUnitImpl>();
+}
+
+std::vector<FrameCoordinationUnitImpl*>
+CoordinationUnitGraph::GetAllFrameCoordinationUnits() {
+  return GetAllCoordinationUnitsOfType<FrameCoordinationUnitImpl>();
+}
+
+std::vector<PageCoordinationUnitImpl*>
+CoordinationUnitGraph::GetAllPageCoordinationUnits() {
+  return GetAllCoordinationUnitsOfType<PageCoordinationUnitImpl>();
 }
 
 CoordinationUnitBase* CoordinationUnitGraph::AddNewCoordinationUnit(
@@ -183,4 +177,15 @@
     processes_by_pid_[new_pid] = process;
 }
 
+template <typename CUType>
+std::vector<CUType*> CoordinationUnitGraph::GetAllCoordinationUnitsOfType() {
+  const auto type = CUType::Type();
+  std::vector<CUType*> ret;
+  for (const auto& el : coordination_units_) {
+    if (el.first.type == type)
+      ret.push_back(CUType::FromCoordinationUnitBase(el.second.get()));
+  }
+  return ret;
+}
+
 }  // namespace resource_coordinator
diff --git a/services/resource_coordinator/coordination_unit/coordination_unit_graph.h b/services/resource_coordinator/coordination_unit/coordination_unit_graph.h
index 649cfbc5..1d3df94 100644
--- a/services/resource_coordinator/coordination_unit/coordination_unit_graph.h
+++ b/services/resource_coordinator/coordination_unit/coordination_unit_graph.h
@@ -71,11 +71,10 @@
   SystemCoordinationUnitImpl* FindOrCreateSystemCoordinationUnit(
       std::unique_ptr<service_manager::ServiceContextRef> service_ref);
 
-  // Search functions for type and ID queries.
-  std::vector<CoordinationUnitBase*> GetCoordinationUnitsOfType(
-      CoordinationUnitType type);
-
   std::vector<ProcessCoordinationUnitImpl*> GetAllProcessCoordinationUnits();
+  std::vector<FrameCoordinationUnitImpl*> GetAllFrameCoordinationUnits();
+  std::vector<PageCoordinationUnitImpl*> GetAllPageCoordinationUnits();
+
   // Retrieves the process CU with PID |pid|, if any.
   ProcessCoordinationUnitImpl* GetProcessCoordinationUnitByPid(
       base::ProcessId pid);
@@ -103,6 +102,9 @@
   void BeforeProcessPidChange(ProcessCoordinationUnitImpl* process,
                               base::ProcessId new_pid);
 
+  template <typename CUType>
+  std::vector<CUType*> GetAllCoordinationUnitsOfType();
+
   CoordinationUnitID system_coordination_unit_id_;
   CUIDMap coordination_units_;
   ProcessByPidMap processes_by_pid_;
diff --git a/services/resource_coordinator/coordination_unit/coordination_unit_graph_unittest.cc b/services/resource_coordinator/coordination_unit/coordination_unit_graph_unittest.cc
index 16d0e00..84929d3 100644
--- a/services/resource_coordinator/coordination_unit/coordination_unit_graph_unittest.cc
+++ b/services/resource_coordinator/coordination_unit/coordination_unit_graph_unittest.cc
@@ -3,6 +3,9 @@
 // found in the LICENSE file.
 
 #include "services/resource_coordinator/coordination_unit/coordination_unit_graph.h"
+
+#include "services/resource_coordinator/coordination_unit/frame_coordination_unit_impl.h"
+#include "services/resource_coordinator/coordination_unit/mock_coordination_unit_graphs.h"
 #include "services/resource_coordinator/coordination_unit/process_coordination_unit_impl.h"
 #include "services/resource_coordinator/coordination_unit/system_coordination_unit_impl.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -92,4 +95,26 @@
   EXPECT_EQ(process2, graph.GetProcessCoordinationUnitByPid(kPid));
 }
 
+TEST(CoordinationUnitGraphTest, GetAllCUsByType) {
+  CoordinationUnitGraph graph;
+  MockMultiplePagesInSingleProcessCoordinationUnitGraph cu_graph(&graph);
+
+  std::vector<ProcessCoordinationUnitImpl*> processes =
+      graph.GetAllProcessCoordinationUnits();
+  ASSERT_EQ(1u, processes.size());
+  EXPECT_NE(nullptr, processes[0]);
+
+  std::vector<FrameCoordinationUnitImpl*> frames =
+      graph.GetAllFrameCoordinationUnits();
+  ASSERT_EQ(2u, frames.size());
+  EXPECT_NE(nullptr, frames[0]);
+  EXPECT_NE(nullptr, frames[1]);
+
+  std::vector<PageCoordinationUnitImpl*> pages =
+      graph.GetAllPageCoordinationUnits();
+  ASSERT_EQ(2u, pages.size());
+  EXPECT_NE(nullptr, pages[0]);
+  EXPECT_NE(nullptr, pages[1]);
+}
+
 }  // namespace resource_coordinator
diff --git a/services/resource_coordinator/coordination_unit/process_coordination_unit_impl.h b/services/resource_coordinator/coordination_unit/process_coordination_unit_impl.h
index 73ef2081..130a82a 100644
--- a/services/resource_coordinator/coordination_unit/process_coordination_unit_impl.h
+++ b/services/resource_coordinator/coordination_unit/process_coordination_unit_impl.h
@@ -13,7 +13,6 @@
 namespace resource_coordinator {
 
 class FrameCoordinationUnitImpl;
-class ProcessCoordinationUnitImpl;
 
 class ProcessCoordinationUnitImpl
     : public CoordinationUnitInterface<ProcessCoordinationUnitImpl,
diff --git a/services/resource_coordinator/public/mojom/BUILD.gn b/services/resource_coordinator/public/mojom/BUILD.gn
index 929c52f..8211d8d 100644
--- a/services/resource_coordinator/public/mojom/BUILD.gn
+++ b/services/resource_coordinator/public/mojom/BUILD.gn
@@ -18,6 +18,7 @@
     "page_signal.mojom",
     "service_constants.mojom",
     "signals.mojom",
+    "webui_graph_dump.mojom",
   ]
 
   public_deps = [
diff --git a/services/resource_coordinator/public/mojom/webui_graph_dump.mojom b/services/resource_coordinator/public/mojom/webui_graph_dump.mojom
new file mode 100644
index 0000000..a364bef6
--- /dev/null
+++ b/services/resource_coordinator/public/mojom/webui_graph_dump.mojom
@@ -0,0 +1,53 @@
+// Copyright 2018 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.
+
+// This file exposes an interface to the chrome://discards Web UI to allow
+// viewing and exploring the CU graph.
+
+module resource_coordinator.mojom;
+
+import "mojo/public/mojom/base/process_id.mojom";
+import "mojo/public/mojom/base/time.mojom";
+
+// Represents the momentary state of a Page CU.
+struct WebUIPageInfo {
+  int64 id;
+
+  int64 main_frame_id;
+
+  string main_frame_url;
+
+  // TODO(siggi): Estimate data.
+};
+
+// Represents the momentary state of a Frame CU.
+struct WebUIFrameInfo {
+  int64 id;
+
+  int64 parent_frame_id;
+  int64 process_id;
+};
+
+// Represents the momentary state of a Process CU.
+struct WebUIProcessInfo {
+  int64 id;
+
+  mojo_base.mojom.ProcessId pid;
+  mojo_base.mojom.TimeDelta cumulative_cpu_usage;
+  uint64 private_footprint_kb;
+};
+
+// Represents the momentary state of an entire RC graph.
+struct WebUIGraph {
+  array<WebUIPageInfo> pages;
+  array<WebUIFrameInfo> frames;
+  array<WebUIProcessInfo> processes;
+};
+
+// This interface allows grabbing the momentary state of the RC graph for
+// visulation or inspection. This is exposed on the RC service, and used from
+// the chrome://discards WebUI graph view tab.
+interface WebUIGraphDump {
+  GetCurrentGraph() => (WebUIGraph graph);
+};
diff --git a/services/resource_coordinator/webui_graph_dump_impl.cc b/services/resource_coordinator/webui_graph_dump_impl.cc
new file mode 100644
index 0000000..39f9707
--- /dev/null
+++ b/services/resource_coordinator/webui_graph_dump_impl.cc
@@ -0,0 +1,80 @@
+// 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 "services/resource_coordinator/webui_graph_dump_impl.h"
+
+#include "base/macros.h"
+#include "services/resource_coordinator/coordination_unit/coordination_unit_graph.h"
+#include "services/resource_coordinator/coordination_unit/frame_coordination_unit_impl.h"
+#include "services/resource_coordinator/coordination_unit/page_coordination_unit_impl.h"
+#include "services/resource_coordinator/coordination_unit/process_coordination_unit_impl.h"
+
+namespace resource_coordinator {
+
+WebUIGraphDumpImpl::WebUIGraphDumpImpl(CoordinationUnitGraph* graph)
+    : graph_(graph), binding_(this) {
+  DCHECK(graph);
+}
+
+WebUIGraphDumpImpl::~WebUIGraphDumpImpl() {}
+
+void WebUIGraphDumpImpl::Bind(mojom::WebUIGraphDumpRequest request) {
+  binding_.Bind(std::move(request));
+}
+
+void WebUIGraphDumpImpl::GetCurrentGraph(GetCurrentGraphCallback callback) {
+  mojom::WebUIGraphPtr graph = mojom::WebUIGraph::New();
+
+  {
+    auto processes = graph_->GetAllProcessCoordinationUnits();
+    graph->processes.reserve(processes.size());
+    for (auto* process : processes) {
+      mojom::WebUIProcessInfoPtr process_info = mojom::WebUIProcessInfo::New();
+
+      process_info->id = process->id().id;
+      process_info->pid = process->process_id();
+      process_info->cumulative_cpu_usage = process->cumulative_cpu_usage();
+      process_info->private_footprint_kb = process->private_footprint_kb();
+
+      graph->processes.push_back(std::move(process_info));
+    }
+  }
+
+  {
+    auto frames = graph_->GetAllFrameCoordinationUnits();
+    graph->frames.reserve(frames.size());
+    for (auto* frame : frames) {
+      mojom::WebUIFrameInfoPtr frame_info = mojom::WebUIFrameInfo::New();
+
+      frame_info->id = frame->id().id;
+
+      auto* parent_frame = frame->GetParentFrameCoordinationUnit();
+      frame_info->parent_frame_id = parent_frame ? parent_frame->id().id : 0;
+
+      auto* process = frame->GetProcessCoordinationUnit();
+      frame_info->process_id = process ? process->id().id : 0;
+
+      graph->frames.push_back(std::move(frame_info));
+    }
+  }
+
+  {
+    auto pages = graph_->GetAllPageCoordinationUnits();
+    graph->pages.reserve(pages.size());
+    for (auto* page : pages) {
+      mojom::WebUIPageInfoPtr page_info = mojom::WebUIPageInfo::New();
+
+      page_info->id = page->id().id;
+      page_info->main_frame_url = page->main_frame_url();
+
+      auto* main_frame = page->GetMainFrameCoordinationUnit();
+      page_info->main_frame_id = main_frame ? main_frame->id().id : 0;
+
+      graph->pages.push_back(std::move(page_info));
+    }
+  }
+  std::move(callback).Run(std::move(graph));
+}
+
+}  // namespace resource_coordinator
diff --git a/services/resource_coordinator/webui_graph_dump_impl.h b/services/resource_coordinator/webui_graph_dump_impl.h
new file mode 100644
index 0000000..f5d603f3
--- /dev/null
+++ b/services/resource_coordinator/webui_graph_dump_impl.h
@@ -0,0 +1,35 @@
+// 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 SERVICES_RESOURCE_COORDINATOR_WEBUI_GRAPH_DUMP_IMPL_H_
+#define SERVICES_RESOURCE_COORDINATOR_WEBUI_GRAPH_DUMP_IMPL_H_
+
+#include "mojo/public/cpp/bindings/binding.h"
+#include "services/resource_coordinator/public/mojom/webui_graph_dump.mojom.h"
+
+namespace resource_coordinator {
+
+class CoordinationUnitGraph;
+
+class WebUIGraphDumpImpl : public mojom::WebUIGraphDump {
+ public:
+  explicit WebUIGraphDumpImpl(CoordinationUnitGraph* graph);
+  ~WebUIGraphDumpImpl() override;
+
+  // WebUIGraphDump implementation.
+  void GetCurrentGraph(GetCurrentGraphCallback callback) override;
+
+  // Bind this instance to |request|.
+  void Bind(mojom::WebUIGraphDumpRequest request);
+
+ private:
+  CoordinationUnitGraph* graph_;
+  mojo::Binding<mojom::WebUIGraphDump> binding_;
+
+  DISALLOW_COPY_AND_ASSIGN(WebUIGraphDumpImpl);
+};
+
+}  // namespace resource_coordinator
+
+#endif  // SERVICES_RESOURCE_COORDINATOR_WEBUI_GRAPH_DUMP_IMPL_H_
diff --git a/services/resource_coordinator/webui_graph_dump_impl_unittest.cc b/services/resource_coordinator/webui_graph_dump_impl_unittest.cc
new file mode 100644
index 0000000..be205936
--- /dev/null
+++ b/services/resource_coordinator/webui_graph_dump_impl_unittest.cc
@@ -0,0 +1,67 @@
+// Copyright 2018 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 "services/resource_coordinator/webui_graph_dump_impl.h"
+
+#include "base/test/bind_test_util.h"
+#include "base/time/time.h"
+#include "services/resource_coordinator/coordination_unit/coordination_unit_test_harness.h"
+#include "services/resource_coordinator/coordination_unit/mock_coordination_unit_graphs.h"
+#include "services/resource_coordinator/coordination_unit/page_coordination_unit_impl.h"
+#include "services/resource_coordinator/resource_coordinator_clock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace resource_coordinator {
+
+class WebUIGraphDumpImplTest : public CoordinationUnitTestHarness {};
+
+TEST_F(WebUIGraphDumpImplTest, Create) {
+  CoordinationUnitGraph graph;
+  MockMultiplePagesWithMultipleProcessesCoordinationUnitGraph cu_graph(&graph);
+
+  base::TimeTicks now = ResourceCoordinatorClock::NowTicks();
+
+  constexpr char kExampleUrl[] = "http://www.example.org";
+  cu_graph.page->OnMainFrameNavigationCommitted(now, 1, kExampleUrl);
+  cu_graph.other_page->OnMainFrameNavigationCommitted(now, 2, kExampleUrl);
+
+  WebUIGraphDumpImpl impl(&graph);
+
+  mojom::WebUIGraphPtr returned_graph;
+  WebUIGraphDumpImpl::GetCurrentGraphCallback callback =
+      base::BindLambdaForTesting([&returned_graph](mojom::WebUIGraphPtr graph) {
+        returned_graph = std::move(graph);
+      });
+  impl.GetCurrentGraph(std::move(callback));
+
+  task_env().RunUntilIdle();
+
+  ASSERT_NE(nullptr, returned_graph.get());
+  EXPECT_EQ(2u, returned_graph->pages.size());
+  for (const auto& page : returned_graph->pages) {
+    EXPECT_NE(0u, page->id);
+    EXPECT_NE(0u, page->main_frame_id);
+  }
+
+  EXPECT_EQ(3u, returned_graph->frames.size());
+  // Count the top-level frames as we go.
+  size_t top_level_frames = 0;
+  for (const auto& frame : returned_graph->frames) {
+    if (frame->parent_frame_id == 0)
+      ++top_level_frames;
+    EXPECT_NE(0u, frame->id);
+    EXPECT_NE(0u, frame->process_id);
+  }
+  // Make sure we have one top-level frame per page.
+  EXPECT_EQ(returned_graph->pages.size(), top_level_frames);
+
+  EXPECT_EQ(2u, returned_graph->processes.size());
+  for (const auto& page : returned_graph->pages) {
+    EXPECT_NE(0u, page->id);
+    EXPECT_NE(0u, page->main_frame_id);
+    EXPECT_EQ(kExampleUrl, page->main_frame_url);
+  }
+}
+
+}  // namespace resource_coordinator
diff --git a/services/service_manager/public/cpp/BUILD.gn b/services/service_manager/public/cpp/BUILD.gn
index 40125676e..82ae6c8 100644
--- a/services/service_manager/public/cpp/BUILD.gn
+++ b/services/service_manager/public/cpp/BUILD.gn
@@ -17,6 +17,8 @@
     "local_interface_provider.h",
     "service.cc",
     "service.h",
+    "service_binding.cc",
+    "service_binding.h",
     "service_context.cc",
     "service_context.h",
     "service_context_ref.cc",
@@ -37,7 +39,12 @@
     "//url",
   ]
 
-  defines = [ "SERVICE_MANAGER_PUBLIC_CPP_IMPL" ]
+  defines = [
+    "IS_SERVICE_MANAGER_CPP_IMPL",
+
+    # TODO: Use COMPONENT_EXPORT everywhere here and remove this.
+    "SERVICE_MANAGER_PUBLIC_CPP_IMPL",
+  ]
 }
 
 # A component for types which the public interfaces depend on for typemapping.
diff --git a/services/service_manager/public/cpp/service.cc b/services/service_manager/public/cpp/service.cc
index 2030d03..11e6996 100644
--- a/services/service_manager/public/cpp/service.cc
+++ b/services/service_manager/public/cpp/service.cc
@@ -19,6 +19,8 @@
                               const std::string& interface_name,
                               mojo::ScopedMessagePipeHandle interface_pipe) {}
 
+void Service::OnDisconnected() {}
+
 bool Service::OnServiceManagerConnectionLost() {
   return true;
 }
diff --git a/services/service_manager/public/cpp/service.h b/services/service_manager/public/cpp/service.h
index b0242905..cf17566 100644
--- a/services/service_manager/public/cpp/service.h
+++ b/services/service_manager/public/cpp/service.h
@@ -7,9 +7,9 @@
 
 #include <string>
 
+#include "base/component_export.h"
 #include "base/macros.h"
 #include "mojo/public/cpp/system/message_pipe.h"
-#include "services/service_manager/public/cpp/export.h"
 
 namespace service_manager {
 
@@ -18,7 +18,7 @@
 
 // The primary contract between a Service and the Service Manager, receiving
 // lifecycle notifications and connection requests.
-class SERVICE_MANAGER_PUBLIC_CPP_EXPORT Service {
+class COMPONENT_EXPORT(SERVICE_MANAGER_CPP) Service {
  public:
   Service();
   virtual ~Service();
@@ -37,6 +37,14 @@
                                const std::string& interface_name,
                                mojo::ScopedMessagePipeHandle interface_pipe);
 
+  // Called when the Service Manager has stopped tracking this instance. Once
+  // invoked, no further Service interface methods will be called on this
+  // Service, and no further communication with the Service Manager is possible.
+  //
+  // The Service may continue to operate and service existing client connections
+  // as it deems appropriate.
+  virtual void OnDisconnected();
+
   // Called when the Service Manager has stopped tracking this instance. The
   // service should use this as a signal to shut down, and in fact its process
   // may be reaped shortly afterward if applicable.
@@ -49,6 +57,9 @@
   //
   // NOTE: This may be called at any time, and once it's been called, none of
   // the other public Service methods will be invoked by the ServiceContext.
+  //
+  // This is ONLY invoked when using a ServiceContext and is therefore
+  // deprecated.
   virtual bool OnServiceManagerConnectionLost();
 
  protected:
@@ -72,7 +83,7 @@
 
 // TODO(rockot): Remove this. It's here to satisfy a few remaining use cases
 // where a Service impl is owned by something other than its ServiceContext.
-class SERVICE_MANAGER_PUBLIC_CPP_EXPORT ForwardingService : public Service {
+class COMPONENT_EXPORT(SERVICE_MANAGER_CPP) ForwardingService : public Service {
  public:
   // |target| must outlive this object.
   explicit ForwardingService(Service* target);
diff --git a/services/service_manager/public/cpp/service_binding.cc b/services/service_manager/public/cpp/service_binding.cc
new file mode 100644
index 0000000..cac9eef
--- /dev/null
+++ b/services/service_manager/public/cpp/service_binding.cc
@@ -0,0 +1,94 @@
+// Copyright 2018 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 "services/service_manager/public/cpp/service_binding.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "services/service_manager/public/cpp/service.h"
+
+#include "base/debug/stack_trace.h"
+
+namespace service_manager {
+
+ServiceBinding::ServiceBinding(service_manager::Service* service)
+    : service_(service), binding_(this) {
+  DCHECK(service_);
+}
+
+ServiceBinding::ServiceBinding(service_manager::Service* service,
+                               mojom::ServiceRequest request)
+    : ServiceBinding(service) {
+  if (request.is_pending())
+    Bind(std::move(request));
+}
+
+ServiceBinding::~ServiceBinding() = default;
+
+Connector* ServiceBinding::GetConnector() {
+  if (!connector_)
+    connector_ = Connector::Create(&pending_connector_request_);
+  return connector_.get();
+}
+
+void ServiceBinding::Bind(mojom::ServiceRequest request) {
+  DCHECK(!is_bound());
+  binding_.Bind(std::move(request));
+  binding_.set_connection_error_handler(base::BindOnce(
+      &ServiceBinding::OnConnectionError, base::Unretained(this)));
+}
+
+void ServiceBinding::RequestClose() {
+  DCHECK(is_bound());
+  if (service_control_.is_bound()) {
+    service_control_->RequestQuit();
+  } else {
+    // It's possible that the service may request closure before receiving the
+    // initial |OnStart()| event, in which case there is not yet a control
+    // interface on which to request closure. In that case we defer until
+    // |OnStart()| is received.
+    request_closure_on_start_ = true;
+  }
+}
+
+void ServiceBinding::Close() {
+  DCHECK(is_bound());
+  binding_.Close();
+  service_control_.reset();
+  connector_.reset();
+}
+
+void ServiceBinding::OnConnectionError() {
+  service_->OnDisconnected();
+}
+
+void ServiceBinding::OnStart(const Identity& identity,
+                             OnStartCallback callback) {
+  identity_ = identity;
+  service_->OnStart();
+
+  if (!pending_connector_request_.is_pending())
+    connector_ = Connector::Create(&pending_connector_request_);
+  std::move(callback).Run(std::move(pending_connector_request_),
+                          mojo::MakeRequest(&service_control_));
+
+  // Execute any prior |RequestClose()| request on the service's behalf.
+  if (request_closure_on_start_)
+    service_control_->RequestQuit();
+}
+
+void ServiceBinding::OnBindInterface(
+    const BindSourceInfo& source_info,
+    const std::string& interface_name,
+    mojo::ScopedMessagePipeHandle interface_pipe,
+    OnBindInterfaceCallback callback) {
+  // Acknowledge this request.
+  std::move(callback).Run();
+
+  service_->OnBindInterface(source_info, interface_name,
+                            std::move(interface_pipe));
+}
+
+}  // namespace service_manager
diff --git a/services/service_manager/public/cpp/service_binding.h b/services/service_manager/public/cpp/service_binding.h
new file mode 100644
index 0000000..6ed9548
--- /dev/null
+++ b/services/service_manager/public/cpp/service_binding.h
@@ -0,0 +1,139 @@
+// Copyright 2018 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 SERVICES_SERVICE_MANAGER_PUBLIC_CPP_SERVICE_BINDING_H_
+#define SERVICES_SERVICE_MANAGER_PUBLIC_CPP_SERVICE_BINDING_H_
+
+#include <memory>
+
+#include "base/callback.h"
+#include "base/component_export.h"
+#include "base/macros.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "services/service_manager/public/cpp/connector.h"
+#include "services/service_manager/public/mojom/connector.mojom.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
+#include "services/service_manager/public/mojom/service_control.mojom.h"
+
+namespace service_manager {
+
+class Service;
+
+// Encapsulates service-side bindings to Service Manager interfaces. Namely,
+// this helps receive and dispatch Service interface events to a service
+// implementation, while also exposing a working Connector interface the service
+// can use to make outgoing interface requests.
+//
+// A ServiceBinding is considered to be "bound" after |Bind()| is invoked with a
+// valid ServiceRequest (or the equivalent constructor is used -- see below).
+// Upon connection error or an explicit call to |Close()|, the ServiceBinding
+// will be considered "unbound" until another call to |Bind()| is made.
+//
+// NOTE: A well-behaved service should aim to always close its ServiceBinding
+// gracefully by calling |RequestClose()|. Closing a ServiceBinding abruptly
+// (by either destroying it or explicitly calling |Close()|) introduces inherent
+// flakiness into the system unless the Service's |OnDisconnected()| has already
+// been invoked, because otherwise the Service Manager may have in-flight
+// interface requests directed at your service instance and these will be
+// dropped to the dismay of the service instance which issued them. Exceptions
+// can reasonably be made for system-wide shutdown situations where even the
+// Service Manager itself will be imminently torn down.
+class COMPONENT_EXPORT(SERVICE_MANAGER_CPP) ServiceBinding
+    : public mojom::Service {
+ public:
+  // Creates a new ServiceBinding bound to |service|. The service will not
+  // receive any Service interface calls until |Bind()| is called, but its
+  // |connector()| is usable immediately upon construction.
+  //
+  // |service| is not owned and must outlive this ServiceBinding.
+  explicit ServiceBinding(service_manager::Service* service);
+
+  // Same as above, but behaves as if |Bind(request)| is also called immediately
+  // after construction. See below.
+  ServiceBinding(service_manager::Service* service,
+                 mojom::ServiceRequest request);
+
+  ~ServiceBinding() override;
+
+  bool is_bound() const { return binding_.is_bound(); }
+
+  Identity identity() const { return identity_; }
+
+  // Returns a usable Connector which can make outgoing interface requests
+  // identifying as the service to which this ServiceBinding is bound.
+  Connector* GetConnector();
+
+  // Binds this ServiceBinding to a new ServiceRequest. Once a ServiceBinding
+  // is bound, its target Service will begin receiving Service events. The
+  // order of events received is:
+  //
+  //   - OnStart() exactly once
+  //   - OnIdentityKnown() exactly once
+  //   - OnBindInterface() zero or more times
+  //
+  // The target Service will be able to receive these events until this
+  // ServiceBinding is either unbound or destroyed.
+  //
+  // If |request| is invalid, this call does nothing.
+  //
+  // Must only be called on an unbound ServiceBinding.
+  void Bind(mojom::ServiceRequest request);
+
+  // Asks the Service Manager nicely if it's OK for this service instance to
+  // disappear now. If the Service Manager thinks it's OK, it will sever the
+  // binding's connection, ultimately triggering an |OnDisconnected()| call on
+  // the bound Service object.
+  //
+  // Must only be called on a bound ServiceBinding.
+  void RequestClose();
+
+  // Immediately severs the connection to the Service Manager. No further
+  // incoming interface requests will be received until this ServiceBinding is
+  // bound again. Always prefer |RequestClose()| under normal circumstances,
+  // unless |OnDisconnected()| has already been invoked on the Service. See the
+  // note in the class documentation above regarding graceful binding closure.
+  //
+  // Must only be called on a bound ServiceBinding.
+  void Close();
+
+ private:
+  void OnConnectionError();
+
+  // mojom::Service:
+  void OnStart(const Identity& identity, OnStartCallback callback) override;
+  void OnBindInterface(const BindSourceInfo& source_info,
+                       const std::string& interface_name,
+                       mojo::ScopedMessagePipeHandle interface_pipe,
+                       OnBindInterfaceCallback callback) override;
+
+  // The Service instance to which all incoming events from the Service Manager
+  // should be directed. Typically this is the object which owns this
+  // ServiceBinding.
+  service_manager::Service* const service_;
+
+  // A pending Connector request which will eventually be passed to the Service
+  // Manager. Created preemptively by every unbound ServiceBinding so that
+  // |connector()| may begin pipelining outgoing requests even before the
+  // ServiceBinding is bound to a ServiceRequest.
+  mojom::ConnectorRequest pending_connector_request_;
+
+  mojo::Binding<mojom::Service> binding_;
+  Identity identity_;
+  std::unique_ptr<Connector> connector_;
+
+  // This instance's control interface to the service manager. Note that this
+  // is unbound and therefore invalid until OnStart() is called.
+  mojom::ServiceControlAssociatedPtr service_control_;
+
+  // Tracks whether |RequestClose()| has been called at least once prior to
+  // receiving |OnStart()| on a bound ServiceBinding. This ensures that the
+  // closure request is actually issued once |OnStart()| is invoked.
+  bool request_closure_on_start_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(ServiceBinding);
+};
+
+}  // namespace service_manager
+
+#endif  // SERVICES_SERVICE_MANAGER_PUBLIC_CPP_SERVICE_CONTEXT_H_
diff --git a/services/service_manager/tests/connect/connect_test_package.cc b/services/service_manager/tests/connect/connect_test_package.cc
index 45a4cb1..acf9cfff4 100644
--- a/services/service_manager/tests/connect/connect_test_package.cc
+++ b/services/service_manager/tests/connect/connect_test_package.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
+#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/threading/simple_thread.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
@@ -17,8 +18,7 @@
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_context.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/cpp/service_binding.h"
 #include "services/service_manager/public/mojom/service_factory.mojom.h"
 #include "services/service_manager/tests/connect/connect_test.mojom.h"
 
@@ -74,6 +74,7 @@
     registry_.AddInterface<test::mojom::UserIdTest>(base::Bind(
         &ProvidedService::BindUserIdTestRequest, base::Unretained(this)));
   }
+
   void OnBindInterface(const BindSourceInfo& source_info,
                        const std::string& interface_name,
                        mojo::ScopedMessagePipeHandle interface_pipe) override {
@@ -81,6 +82,11 @@
                             source_info);
   }
 
+  void OnDisconnected() override {
+    service_binding_.Close();
+    run_loop_->Quit();
+  }
+
   void BindConnectTestServiceRequest(
       test::mojom::ConnectTestServiceRequest request,
       const BindSourceInfo& source_info) {
@@ -88,10 +94,11 @@
     test::mojom::ConnectionStatePtr state(test::mojom::ConnectionState::New());
     state->connection_remote_name = source_info.identity.name();
     state->connection_remote_userid = source_info.identity.user_id();
-    state->initialize_local_name = context()->identity().name();
-    state->initialize_userid = context()->identity().user_id();
+    state->initialize_local_name = service_binding_.identity().name();
+    state->initialize_userid = service_binding_.identity().user_id();
 
-    context()->connector()->BindInterface(source_info.identity, &caller_);
+    service_binding_.GetConnector()->BindInterface(source_info.identity,
+                                                   &caller_);
     caller_->ConnectionAccepted(std::move(state));
   }
 
@@ -111,7 +118,7 @@
   }
 
   void GetInstance(GetInstanceCallback callback) override {
-    std::move(callback).Run(context()->identity().instance());
+    std::move(callback).Run(service_binding_.identity().instance());
   }
 
   // test::mojom::BlockedInterface:
@@ -123,12 +130,12 @@
   void ConnectToClassAppAsDifferentUser(
       const service_manager::Identity& target,
       ConnectToClassAppAsDifferentUserCallback callback) override {
-    context()->connector()->StartService(target);
+    service_binding_.GetConnector()->StartService(target);
     mojom::ConnectResult result;
     Identity resolved_identity;
     {
       base::RunLoop loop(base::RunLoop::Type::kNestableTasksAllowed);
-      Connector::TestApi test_api(context()->connector());
+      Connector::TestApi test_api(service_binding_.GetConnector());
       test_api.SetStartServiceCallback(
           base::Bind(&QuitLoop, &loop, &result, &resolved_identity));
       loop.Run();
@@ -138,8 +145,13 @@
 
   // base::SimpleThread:
   void Run() override {
-    ServiceRunner(new ForwardingService(this)).Run(
-        request_.PassMessagePipe().release().value(), false);
+    base::MessageLoop message_loop;
+    base::RunLoop run_loop;
+    run_loop_ = &run_loop;
+    service_binding_.Bind(std::move(request_));
+    run_loop.Run();
+    run_loop_ = nullptr;
+
     caller_.reset();
     bindings_.CloseAllBindings();
     blocked_bindings_.CloseAllBindings();
@@ -147,10 +159,15 @@
   }
 
   void OnConnectionError() {
-    if (bindings_.empty())
-      context()->QuitNow();
+    if (bindings_.empty()) {
+      if (service_binding_.is_bound())
+        service_binding_.Close();
+      run_loop_->Quit();
+    }
   }
 
+  base::RunLoop* run_loop_;
+  service_manager::ServiceBinding service_binding_{this};
   const std::string title_;
   mojom::ServiceRequest request_;
   test::mojom::ExposedInterfacePtr caller_;
@@ -166,8 +183,11 @@
                            public mojom::ServiceFactory,
                            public test::mojom::ConnectTestService {
  public:
-  ConnectTestService() {}
-  ~ConnectTestService() override {}
+  ConnectTestService(service_manager::mojom::ServiceRequest request,
+                     base::OnceClosure quit_closure)
+      : service_binding_(this, std::move(request)),
+        quit_closure_(std::move(quit_closure)) {}
+  ~ConnectTestService() override = default;
 
  private:
   // service_manager::Service:
@@ -184,15 +204,16 @@
         base::Bind(&ConnectTestService::BindConnectTestServiceRequest,
                    base::Unretained(this)));
   }
+
   void OnBindInterface(const BindSourceInfo& source_info,
                        const std::string& interface_name,
                        mojo::ScopedMessagePipeHandle interface_pipe) override {
     registry_.BindInterface(interface_name, std::move(interface_pipe));
   }
 
-  bool OnServiceManagerConnectionLost() override {
+  void OnDisconnected() override {
     provided_services_.clear();
-    return true;
+    std::move(quit_closure_).Run();
   }
 
   void BindServiceFactoryRequest(mojom::ServiceFactoryRequest request) {
@@ -223,14 +244,16 @@
   }
 
   void GetInstance(GetInstanceCallback callback) override {
-    std::move(callback).Run(context()->identity().instance());
+    std::move(callback).Run(service_binding_.identity().instance());
   }
 
   void OnConnectionError() {
     if (bindings_.empty() && service_factory_bindings_.empty())
-      context()->CreateQuitClosure().Run();
+      service_binding_.RequestClose();
   }
 
+  service_manager::ServiceBinding service_binding_;
+  base::OnceClosure quit_closure_;
   std::vector<std::unique_ptr<Service>> delegates_;
   mojo::BindingSet<mojom::ServiceFactory> service_factory_bindings_;
   BinderRegistry registry_;
@@ -243,7 +266,12 @@
 }  // namespace service_manager
 
 MojoResult ServiceMain(MojoHandle service_request_handle) {
-  service_manager::ServiceRunner runner(
-      new service_manager::ConnectTestService);
-  return runner.Run(service_request_handle);
+  base::MessageLoop message_loop;
+  base::RunLoop run_loop;
+  service_manager::ConnectTestService service(
+      service_manager::mojom::ServiceRequest(mojo::MakeScopedHandle(
+          mojo::MessagePipeHandle(service_request_handle))),
+      run_loop.QuitClosure());
+  run_loop.Run();
+  return MOJO_RESULT_OK;
 }
diff --git a/services/service_manager/tests/lifecycle/app.cc b/services/service_manager/tests/lifecycle/app.cc
index b30a7799..9a930dc 100644
--- a/services/service_manager/tests/lifecycle/app.cc
+++ b/services/service_manager/tests/lifecycle/app.cc
@@ -2,11 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
 #include "services/service_manager/public/c/main.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 #include "services/service_manager/tests/lifecycle/app_client.h"
 
 MojoResult ServiceMain(MojoHandle service_request_handle) {
-  service_manager::ServiceRunner runner(new service_manager::test::AppClient);
-  return runner.Run(service_request_handle);
+  base::MessageLoop message_loop;
+  base::RunLoop run_loop;
+  service_manager::test::AppClient app_client(
+      service_manager::mojom::ServiceRequest(mojo::MakeScopedHandle(
+          mojo::MessagePipeHandle(service_request_handle))),
+      run_loop.QuitClosure());
+  run_loop.Run();
+  return MOJO_RESULT_OK;
 }
diff --git a/services/service_manager/tests/lifecycle/app_client.cc b/services/service_manager/tests/lifecycle/app_client.cc
index 20804e86..3115341 100644
--- a/services/service_manager/tests/lifecycle/app_client.cc
+++ b/services/service_manager/tests/lifecycle/app_client.cc
@@ -6,14 +6,20 @@
 
 #include "base/macros.h"
 #include "base/run_loop.h"
-#include "services/service_manager/public/cpp/service_context.h"
+#include "services/service_manager/public/cpp/service_binding.h"
 
 namespace service_manager {
 namespace test {
 
-AppClient::AppClient() {
+AppClient::AppClient(service_manager::mojom::ServiceRequest request,
+                     base::OnceClosure quit_closure)
+    : service_binding_(this, std::move(request)),
+      quit_closure_(std::move(quit_closure)) {
+  bindings_.set_connection_error_handler(base::BindRepeating(
+      &AppClient::LifecycleControlBindingLost, base::Unretained(this)));
+
   registry_.AddInterface<mojom::LifecycleControl>(
-      base::Bind(&AppClient::Create, base::Unretained(this)));
+      base::BindRepeating(&AppClient::Create, base::Unretained(this)));
 }
 
 AppClient::~AppClient() {}
@@ -24,9 +30,12 @@
   registry_.BindInterface(interface_name, std::move(interface_pipe));
 }
 
-bool AppClient::OnServiceManagerConnectionLost() {
-  context()->QuitNow();
-  return true;
+void AppClient::OnDisconnected() {
+  DCHECK(service_binding_.is_bound());
+  service_binding_.Close();
+
+  if (quit_closure_)
+    std::move(quit_closure_).Run();
 }
 
 void AppClient::Create(mojom::LifecycleControlRequest request) {
@@ -38,7 +47,10 @@
 }
 
 void AppClient::GracefulQuit() {
-  context()->CreateQuitClosure().Run();
+  if (service_binding_.is_bound())
+    service_binding_.RequestClose();
+  else if (quit_closure_)
+    std::move(quit_closure_).Run();
 }
 
 void AppClient::Crash() {
@@ -49,14 +61,13 @@
 }
 
 void AppClient::CloseServiceManagerConnection() {
-  context()->DisconnectFromServiceManager();
-  bindings_.set_connection_error_handler(
-      base::Bind(&AppClient::BindingLost, base::Unretained(this)));
+  if (service_binding_.is_bound())
+    service_binding_.Close();
 }
 
-void AppClient::BindingLost() {
-  if (bindings_.empty())
-    OnServiceManagerConnectionLost();
+void AppClient::LifecycleControlBindingLost() {
+  if (!service_binding_.is_bound() && bindings_.empty() && quit_closure_)
+    std::move(quit_closure_).Run();
 }
 
 }  // namespace test
diff --git a/services/service_manager/tests/lifecycle/app_client.h b/services/service_manager/tests/lifecycle/app_client.h
index f425446..812a28b2 100644
--- a/services/service_manager/tests/lifecycle/app_client.h
+++ b/services/service_manager/tests/lifecycle/app_client.h
@@ -8,11 +8,12 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/callback.h"
 #include "base/macros.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/cpp/service_binding.h"
 #include "services/service_manager/public/mojom/service.mojom.h"
 #include "services/service_manager/tests/lifecycle/lifecycle_unittest.mojom.h"
 
@@ -22,16 +23,15 @@
 class AppClient : public Service,
                   public mojom::LifecycleControl {
  public:
-  AppClient();
+  explicit AppClient(service_manager::mojom::ServiceRequest request,
+                     base::OnceClosure quit_closure);
   ~AppClient() override;
 
-  void set_runner(ServiceRunner* runner) { runner_ = runner; }
-
   // Service:
   void OnBindInterface(const BindSourceInfo& source_info,
                        const std::string& interface_name,
                        mojo::ScopedMessagePipeHandle interface_pipe) override;
-  bool OnServiceManagerConnectionLost() override;
+  void OnDisconnected() override;
 
   void Create(mojom::LifecycleControlRequest request);
 
@@ -44,9 +44,11 @@
  private:
   class ServiceImpl;
 
-  void BindingLost();
+  void LifecycleControlBindingLost();
 
-  ServiceRunner* runner_ = nullptr;
+  ServiceBinding service_binding_;
+  base::OnceClosure quit_closure_;
+
   BinderRegistry registry_;
   mojo::BindingSet<mojom::LifecycleControl> bindings_;
 
diff --git a/services/service_manager/tests/lifecycle/lifecycle_exe.cc b/services/service_manager/tests/lifecycle/lifecycle_exe.cc
index f5ab4cd..92f409f 100644
--- a/services/service_manager/tests/lifecycle/lifecycle_exe.cc
+++ b/services/service_manager/tests/lifecycle/lifecycle_exe.cc
@@ -2,11 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
 #include "services/service_manager/public/c/main.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/mojom/service.mojom.h"
 #include "services/service_manager/tests/lifecycle/app_client.h"
 
 MojoResult ServiceMain(MojoHandle service_request_handle) {
-  service_manager::ServiceRunner runner(new service_manager::test::AppClient);
-  return runner.Run(service_request_handle);
+  base::MessageLoop message_loop;
+  base::RunLoop run_loop;
+  service_manager::test::AppClient app_client(
+      service_manager::mojom::ServiceRequest(mojo::MakeScopedHandle(
+          mojo::MessagePipeHandle(service_request_handle))),
+      run_loop.QuitClosure());
+  run_loop.Run();
+  return MOJO_RESULT_OK;
 }
diff --git a/services/service_manager/tests/lifecycle/package.cc b/services/service_manager/tests/lifecycle/package.cc
index ad17e1fb..2d942d3 100644
--- a/services/service_manager/tests/lifecycle/package.cc
+++ b/services/service_manager/tests/lifecycle/package.cc
@@ -7,12 +7,12 @@
 
 #include "base/bind.h"
 #include "base/macros.h"
+#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/service_manager/public/c/main.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
-#include "services/service_manager/public/cpp/service_context.h"
-#include "services/service_manager/public/cpp/service_runner.h"
+#include "services/service_manager/public/cpp/service_binding.h"
 #include "services/service_manager/public/mojom/service_factory.mojom.h"
 #include "services/service_manager/tests/lifecycle/app_client.h"
 #include "services/service_manager/tests/lifecycle/lifecycle_unittest.mojom.h"
@@ -22,19 +22,20 @@
 class PackagedApp : public service_manager::Service,
                     public service_manager::test::mojom::LifecycleControl {
  public:
-  PackagedApp(
-      const base::Closure& service_manager_connection_closed_callback,
-      const base::Closure& destruct_callback)
-      : service_manager_connection_closed_callback_(
-            service_manager_connection_closed_callback),
-        destruct_callback_(destruct_callback) {
-    bindings_.set_connection_error_handler(base::Bind(&PackagedApp::BindingLost,
-                                                      base::Unretained(this)));
+  PackagedApp(service_manager::mojom::ServiceRequest request,
+              base::OnceClosure service_manager_connection_closed_callback,
+              base::OnceClosure destruct_callback)
+      : service_binding_(this, std::move(request)),
+        service_manager_connection_closed_callback_(
+            std::move(service_manager_connection_closed_callback)),
+        destruct_callback_(std::move(destruct_callback)) {
+    bindings_.set_connection_error_handler(
+        base::BindRepeating(&PackagedApp::MaybeQuit, base::Unretained(this)));
     registry_.AddInterface<service_manager::test::mojom::LifecycleControl>(
         base::Bind(&PackagedApp::Create, base::Unretained(this)));
   }
 
-  ~PackagedApp() override {}
+  ~PackagedApp() override = default;
 
  private:
   // service_manager::Service:
@@ -44,6 +45,11 @@
     registry_.BindInterface(interface_name, std::move(interface_pipe));
   }
 
+  void OnDisconnected() override {
+    std::move(service_manager_connection_closed_callback_).Run();
+    std::move(destruct_callback_).Run();
+  }
+
   void Create(service_manager::test::mojom::LifecycleControlRequest request) {
     bindings_.AddBinding(this, std::move(request));
   }
@@ -51,12 +57,7 @@
   // LifecycleControl:
   void Ping(PingCallback callback) override { std::move(callback).Run(); }
 
-  void GracefulQuit() override {
-    service_manager_connection_closed_callback_.Run();
-
-    // Deletes |this|.
-    destruct_callback_.Run();
-  }
+  void GracefulQuit() override { service_binding_.RequestClose(); }
 
   void Crash() override {
     // When multiple instances are vended from the same package instance, this
@@ -65,50 +66,68 @@
   }
 
   void CloseServiceManagerConnection() override {
-    service_manager_connection_closed_callback_.Run();
-    context()->QuitNow();
+    std::move(service_manager_connection_closed_callback_).Run();
+
+    if (service_binding_.is_bound())
+      service_binding_.Close();
+
     // This only closed our relationship with the service manager, existing
     // |bindings_| remain active.
+    MaybeQuit();
   }
 
-  void BindingLost() {
-    if (bindings_.empty()) {
-      // Deletes |this|.
-      destruct_callback_.Run();
-    }
+  void MaybeQuit() {
+    if (service_binding_.is_bound() || !bindings_.empty())
+      return;
+
+    // Deletes |this|.
+    std::move(destruct_callback_).Run();
   }
 
+  service_manager::ServiceBinding service_binding_;
+
   service_manager::BinderRegistry registry_;
   mojo::BindingSet<service_manager::test::mojom::LifecycleControl> bindings_;
 
   // Run when this object's connection to the service manager is closed.
-  base::Closure service_manager_connection_closed_callback_;
+  base::OnceClosure service_manager_connection_closed_callback_;
   // Run when this object is destructed.
-  base::Closure destruct_callback_;
+  base::OnceClosure destruct_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(PackagedApp);
 };
 
-class Package : public service_manager::ForwardingService,
+class Package : public service_manager::Service,
                 public service_manager::mojom::ServiceFactory {
  public:
-  Package() : ForwardingService(&app_client_) {
+  explicit Package(service_manager::mojom::ServiceRequest request,
+                   base::OnceClosure quit_closure)
+      : service_binding_(this, std::move(request)),
+        quit_closure_(std::move(quit_closure)),
+        app_client_(service_manager::mojom::ServiceRequest(),
+                    base::BindOnce(&Package::QuitFromAppClient,
+                                   base::Unretained(this))) {
     registry_.AddInterface<service_manager::mojom::ServiceFactory>(
-        base::Bind(&Package::Create, base::Unretained(this)));
+        base::BindRepeating(&Package::Create, base::Unretained(this)));
   }
-  ~Package() override {}
+
+  ~Package() override = default;
 
  private:
-  // ForwardingService:
+  void QuitFromAppClient() { std::move(quit_closure_).Run(); }
+
+  // service_manager::Service:
   void OnBindInterface(const service_manager::BindSourceInfo& source_info,
                        const std::string& interface_name,
                        mojo::ScopedMessagePipeHandle interface_pipe) override {
     if (!registry_.TryBindInterface(interface_name, &interface_pipe)) {
-      ForwardingService::OnBindInterface(source_info, interface_name,
-                                         std::move(interface_pipe));
+      app_client_.OnBindInterface(source_info, interface_name,
+                                  std::move(interface_pipe));
     }
   }
 
+  void OnDisconnected() override { std::move(quit_closure_).Run(); }
+
   void Create(service_manager::mojom::ServiceFactoryRequest request) {
     bindings_.AddBinding(this, std::move(request));
   }
@@ -120,48 +139,35 @@
       service_manager::mojom::PIDReceiverPtr pid_receiver) override {
     ++service_manager_connection_refcount_;
     int id = next_id_++;
-    std::unique_ptr<service_manager::ServiceContext> context =
-        std::make_unique<service_manager::ServiceContext>(
-            std::make_unique<PackagedApp>(
-                base::Bind(&Package::AppServiceManagerConnectionClosed,
-                           base::Unretained(this)),
-                base::Bind(&Package::DestroyService, base::Unretained(this),
-                           id)),
-            std::move(request));
-    service_manager::ServiceContext* raw_context = context.get();
-    contexts_.insert(std::make_pair(raw_context, std::move(context)));
-    id_to_context_.insert(std::make_pair(id, raw_context));
+    auto app = std::make_unique<PackagedApp>(
+        std::move(request),
+        base::BindOnce(&Package::OnAppInstanceDisconnected,
+                       base::Unretained(this)),
+        base::BindOnce(&Package::DestroyAppInstance, base::Unretained(this),
+                       id));
+    app_instances_.emplace(id, std::move(app));
   }
 
-  void AppServiceManagerConnectionClosed() {
-    if (!--service_manager_connection_refcount_)
-      app_client_.CloseServiceManagerConnection();
+  void OnAppInstanceDisconnected() {
+    if (--service_manager_connection_refcount_ == 0)
+      service_binding_.RequestClose();
   }
 
-  void DestroyService(int id) {
-    auto id_it = id_to_context_.find(id);
-    DCHECK(id_it != id_to_context_.end());
-
-    auto it = contexts_.find(id_it->second);
-    DCHECK(it != contexts_.end());
-    contexts_.erase(it);
-    id_to_context_.erase(id_it);
-    if (contexts_.empty() && base::RunLoop::IsRunningOnCurrentThread())
-      context()->QuitNow();
+  void DestroyAppInstance(int id) {
+    app_instances_.erase(id);
+    if (app_instances_.empty())
+      std::move(quit_closure_).Run();
   }
 
+  service_manager::ServiceBinding service_binding_;
+  base::OnceClosure quit_closure_;
   service_manager::test::AppClient app_client_;
   int service_manager_connection_refcount_ = 0;
   service_manager::BinderRegistry registry_;
   mojo::BindingSet<service_manager::mojom::ServiceFactory> bindings_;
 
-  using ServiceContextMap =
-      std::map<service_manager::ServiceContext*,
-               std::unique_ptr<service_manager::ServiceContext>>;
-  ServiceContextMap contexts_;
-
   int next_id_ = 0;
-  std::map<int, service_manager::ServiceContext*> id_to_context_;
+  std::map<int, std::unique_ptr<PackagedApp>> app_instances_;
 
   DISALLOW_COPY_AND_ASSIGN(Package);
 };
@@ -169,6 +175,11 @@
 }  // namespace
 
 MojoResult ServiceMain(MojoHandle service_request_handle) {
-  service_manager::ServiceRunner runner(new Package);
-  return runner.Run(service_request_handle);
+  base::MessageLoop message_loop;
+  base::RunLoop run_loop;
+  Package package(service_manager::mojom::ServiceRequest(mojo::MakeScopedHandle(
+                      mojo::MessagePipeHandle(service_request_handle))),
+                  run_loop.QuitClosure());
+  run_loop.Run();
+  return MOJO_RESULT_OK;
 }
diff --git a/services/ws/remote_view_host/server_remote_view_host.cc b/services/ws/remote_view_host/server_remote_view_host.cc
index b01ab14..1448b09 100644
--- a/services/ws/remote_view_host/server_remote_view_host.cc
+++ b/services/ws/remote_view_host/server_remote_view_host.cc
@@ -14,7 +14,16 @@
 namespace ws {
 
 ServerRemoteViewHost::ServerRemoteViewHost(WindowService* window_service)
-    : window_service_(window_service) {}
+    : window_service_(window_service),
+      embedding_root_(
+          std::make_unique<aura::Window>(nullptr,
+                                         aura::client::WINDOW_TYPE_UNKNOWN,
+                                         window_service_->env())) {
+  embedding_root_->set_owned_by_parent(false);
+  embedding_root_->SetName("ServerRemoteViewHostWindow");
+  embedding_root_->SetType(aura::client::WINDOW_TYPE_CONTROL);
+  embedding_root_->Init(ui::LAYER_NOT_DRAWN);
+}
 
 ServerRemoteViewHost::~ServerRemoteViewHost() = default;
 
@@ -26,13 +35,6 @@
   embed_flags_ = embed_flags;
   embed_callback_ = std::move(callback);
 
-  embedding_root_ = std::make_unique<aura::Window>(
-      nullptr, aura::client::WINDOW_TYPE_UNKNOWN, window_service_->env());
-  embedding_root_->set_owned_by_parent(false);
-  embedding_root_->SetName("ServerRemoteViewHostWindow");
-  embedding_root_->SetType(aura::client::WINDOW_TYPE_CONTROL);
-  embedding_root_->Init(ui::LAYER_NOT_DRAWN);
-
   // TODO(sky): having to wait for being parented is a bit of a hassle. Fix
   // this.
   if (GetWidget())
@@ -40,28 +42,17 @@
 }
 
 void ServerRemoteViewHost::EmbedImpl() {
-  // Should not be attached to anything.
-  DCHECK(!native_view());
-
-  // There is a pending embed request.
-  DCHECK(!embed_token_.is_empty());
-
-  // TODO(sky): fix this, only necessary because of restrictions in WindowTree.
-  // Must happen before EmbedUsingToken call for window server to figure out
-  // the relevant display.
-  Attach(embedding_root_.get());
-
+  DCHECK(IsEmbedPending());
   const bool result = window_service_->CompleteScheduleEmbedForExistingClient(
       embedding_root_.get(), embed_token_, embed_flags_);
-
-  if (!result)
-    embedding_root_.reset();
-
   std::move(embed_callback_).Run(result);
 }
 
 void ServerRemoteViewHost::AddedToWidget() {
-  if (!native_view())
+  if (native_view())
+    return;
+  Attach(embedding_root_.get());
+  if (IsEmbedPending())
     EmbedImpl();
 }
 
diff --git a/services/ws/remote_view_host/server_remote_view_host.h b/services/ws/remote_view_host/server_remote_view_host.h
index 0c10e5f6..f5515ad 100644
--- a/services/ws/remote_view_host/server_remote_view_host.h
+++ b/services/ws/remote_view_host/server_remote_view_host.h
@@ -52,6 +52,8 @@
   aura::Window* embedding_root() { return embedding_root_.get(); }
 
  private:
+  bool IsEmbedPending() const { return !embed_token_.is_empty(); }
+
   void EmbedImpl();
 
   // views::NativeViewHost:
@@ -61,7 +63,7 @@
   base::UnguessableToken embed_token_;
   int embed_flags_ = 0;
   EmbedCallback embed_callback_;
-  std::unique_ptr<aura::Window> embedding_root_;
+  const std::unique_ptr<aura::Window> embedding_root_;
 
   DISALLOW_COPY_AND_ASSIGN(ServerRemoteViewHost);
 };
diff --git a/storage/browser/fileapi/README.md b/storage/browser/fileapi/README.md
new file mode 100644
index 0000000..ced2bcfe
--- /dev/null
+++ b/storage/browser/fileapi/README.md
@@ -0,0 +1,15 @@
+# FileSystem API
+
+This directory contains part of the browser side implementation of various
+filesystem related APIs, as well as interfaces to treat various types of native
+and non-native filesystems mostly the same without having to worry about the
+underlying implementation.
+
+## Related directories
+
+[`//content/browser/fileapi/`](../../../content/browser/fileapi) contains the
+rest of the browser side implementation, while
+[`blink/renderer/modules/filesystem`](../../../third_party/blink/renderer/modules/filesystem)
+contains the renderer side implementation and
+[`blink/public/mojom/filesystem`](../../../third_party/blink/public/mojom/filesystem)
+contains the mojom interfaces for these APIs.
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json
index f605621e..580e0424 100644
--- a/testing/buildbot/chromium.perf.fyi.json
+++ b/testing/buildbot/chromium.perf.fyi.json
@@ -1,53 +1,4 @@
 {
-  "Android Nexus 5X Perf FYI": {
-    "isolated_scripts": [
-      {
-        "args": [
-          "-v",
-          "--upload-results",
-          "--output-format=histograms",
-          "--browser=android-chromium",
-          "--test-shard-map-filename=android_nexus5x_fyi_4_shard_map.json"
-        ],
-        "isolate_name": "performance_test_suite",
-        "merge": {
-          "args": [
-            "--service-account-file",
-            "/creds/service_accounts/service-account-chromium-perf-histograms.json"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "performance_test_suite",
-        "override_compile_targets": [
-          "performance_test_suite"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_flavor": "google",
-              "device_type": "bullhead",
-              "os": "Android",
-              "pool": "chrome.tests.perf-fyi"
-            }
-          ],
-          "expiration": 3600,
-          "hard_timeout": 1080,
-          "ignore_task_failure": false,
-          "io_timeout": 360,
-          "shards": 4
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      }
-    ]
-  },
   "One Buildbot Step Test Builder": {
     "isolated_scripts": [
       {
@@ -190,6 +141,55 @@
       }
     ]
   },
+  "android-nexus5x-perf-fyi": {
+    "isolated_scripts": [
+      {
+        "args": [
+          "-v",
+          "--upload-results",
+          "--output-format=histograms",
+          "--browser=android-chromium",
+          "--test-shard-map-filename=android_nexus5x_fyi_4_shard_map.json"
+        ],
+        "isolate_name": "performance_test_suite",
+        "merge": {
+          "args": [
+            "--service-account-file",
+            "/creds/service_accounts/service-account-chromium-perf-histograms.json"
+          ],
+          "script": "//tools/perf/process_perf_results.py"
+        },
+        "name": "performance_test_suite",
+        "override_compile_targets": [
+          "performance_test_suite"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_os": "MMB29Q",
+              "device_os_flavor": "google",
+              "device_type": "bullhead",
+              "os": "Android",
+              "pool": "chrome.tests.perf-fyi"
+            }
+          ],
+          "expiration": 3600,
+          "hard_timeout": 1080,
+          "ignore_task_failure": false,
+          "io_timeout": 360,
+          "shards": 4
+        },
+        "trigger_script": {
+          "args": [
+            "--multiple-dimension-script-verbose",
+            "True"
+          ],
+          "script": "//testing/trigger_scripts/perf_device_trigger.py"
+        }
+      }
+    ]
+  },
   "android-pixel2-perf": {
     "isolated_scripts": [
       {
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index a488972..67281ad 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -1,6 +1,33 @@
 {
   "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {},
   "AAAAA2 See generate_buildbot_json.py to make changes": {},
+  "WebKit Win10": {
+    "isolated_scripts": [
+      {
+        "args": [
+          "--num-retries=3"
+        ],
+        "isolate_name": "webkit_layout_tests_exparchive",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "webkit_layout_tests",
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Windows-10-15063"
+            }
+          ],
+          "shards": 12
+        }
+      }
+    ]
+  },
   "Win 7 Tests x64 (1)": {
     "gtest_tests": [
       {
diff --git a/testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter b/testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter
index b0591af..cb11ed33 100644
--- a/testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter
+++ b/testing/buildbot/filters/chromeos.single_process_mash.interactive_ui_tests.filter
@@ -91,3 +91,6 @@
 -TabScrubberTest.RTLSkipped
 -TabScrubberTest.Single
 -TabScrubberTest.Skipped
+
+# OobeInteractiveUITest: crbug.com/892263
+-OobeInteractiveUITest.SimpleEndToEnd
diff --git a/testing/buildbot/filters/mojo.fyi.chromeos.network_browser_tests.filter b/testing/buildbot/filters/mojo.fyi.chromeos.network_browser_tests.filter
index fe1a4e2..410f1d1 100644
--- a/testing/buildbot/filters/mojo.fyi.chromeos.network_browser_tests.filter
+++ b/testing/buildbot/filters/mojo.fyi.chromeos.network_browser_tests.filter
@@ -13,6 +13,7 @@
 # Stuck at the 'Local Auth Server' screen with email / password filed. Some
 # tests will pass after clicking 'Next' manually, while others may fail later
 # due to other issues such as empty |device_id_in_profile|.
+# https://crbug.com/891490
 -ChromeSessionManagerTest.OobeNewUser
 -DeviceIDTest.LegacyUsers
 -DeviceIDTest.Migration
@@ -36,6 +37,7 @@
 -WebviewLoginTest.Basic
 
 # The test went into the 'Local Auth Server' screen instead of the Kiosk screen.
+# https://crbug.com/892357
 -KioskUpdateTest.LaunchCachedOfflineEnabledAppNoNetwork
 
 # SAML doesn't work with Network Service.
diff --git a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
index 0f648c4..cc24c840 100644
--- a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
+++ b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
@@ -103,6 +103,10 @@
 
 # https://crbug.com/721403
 -ContextMenuBrowserTest.DataSaverOpenOrigImageInNewTab
+-DataReductionProxyBrowsertest.ChromeProxyEctHeaderSet
+-DataReductionProxyBrowsertest.ChromeProxyHeaderSet
+-DataReductionProxyBrowsertest.ChromeProxyHeaderSetForSubresource
+-DataReductionProxyBrowsertest.ProxyNotUsedWhenDisabled
 
 # NOTE: if adding an exclusion for an existing failure (e.g. additional test for
 # feature X that is already not working), please add it beside the existing
diff --git a/testing/buildbot/filters/webui_polymer2_browser_tests.filter b/testing/buildbot/filters/webui_polymer2_browser_tests.filter
index b3fde098..f871c7f 100644
--- a/testing/buildbot/filters/webui_polymer2_browser_tests.filter
+++ b/testing/buildbot/filters/webui_polymer2_browser_tests.filter
@@ -36,8 +36,6 @@
 -CrSettingsBluetoothPageTest.All
 -CrSettingsCrostiniPageTest.All
 -CrSettingsFingerprintProgressArcTest.All
--CrSettingsInternetDetailPageTest.InternetDetailPage
--CrSettingsInternetPageTest.InternetPage
 -CrSettingsMultidevicePageTest.All
 -CrSettingsPeoplePageLockScreenTest.All
 -CrSettingsPeoplePageQuickUnlockAuthenticateTest.All
@@ -139,6 +137,8 @@
 CrSettingsGoogleAssistantPageTest.*
 CrSettingsImportDataDialogTest.*
 CrSettingsIncompatibleApplicationsPageTest.*
+CrSettingsInternetDetailPageTest.*
+CrSettingsInternetPageTest.*
 CrSettingsLanguagesPageTest.*
 CrSettingsLanguagesTest.*
 CrSettingsMainPageTest.*
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index b46f47f..1e720ae 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -3450,6 +3450,8 @@
           ],
         },
       },
+      # TODO(jchinlee): This builder is in chromium.win on LUCI, see
+      # crbug.com/790343.
       'WebKit Win10': {
         'test_suites': {
           'isolated_scripts': 'chromium_webkit_isolated_scripts',
@@ -3656,6 +3658,11 @@
   {
     'name': 'chromium.win',
     'machines': {
+      'WebKit Win10': {
+        'test_suites': {
+          'isolated_scripts': 'chromium_webkit_isolated_scripts',
+        },
+      },
       'Win 7 Tests x64 (1)': {
         'test_suites': {
           'gtest_tests': 'chromium_win_gtests',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 7414476..ce61f6e 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2534,34 +2534,8 @@
                     "enable_features": [
                         "NewTabPageBackgrounds",
                         "NewTabPageCustomLinks",
-                        "NewTabPageIcons"
-                    ]
-                }
-            ]
-        }
-    ],
-    "NTPFaviconsFromNewServer": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "ContentSuggestionsFaviconsFromNewServer"
-                    ]
-                },
-                {
-                    "name": "Enabled_10",
-                    "enable_features": [
-                        "ContentSuggestionsFaviconsFromNewServer"
-                    ]
-                },
-                {
-                    "name": "Enabled_50",
-                    "enable_features": [
-                        "ContentSuggestionsFaviconsFromNewServer"
+                        "NewTabPageIcons",
+                        "NewTabPageUIMd"
                     ]
                 }
             ]
@@ -5106,6 +5080,25 @@
             ]
         }
     ],
+    "WebAudioAutoplay": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "disable_features": [
+                        "AutoplayIgnoreWebAudio"
+                    ]
+                }
+            ]
+        }
+    ],
     "WebAuthenticationUI": [
         {
             "platforms": [
diff --git a/third_party/WebKit/LayoutTests/MSANExpectations b/third_party/WebKit/LayoutTests/MSANExpectations
index 302e1949..020f5291 100644
--- a/third_party/WebKit/LayoutTests/MSANExpectations
+++ b/third_party/WebKit/LayoutTests/MSANExpectations
@@ -114,9 +114,11 @@
 crbug.com/856601 [ Linux ] http/tests/event-timing/event-timing-retrievability.html [ Pass Timeout ]
 
 # Slow idlharness.js tests on MSAN
+crbug.com/856601 [ Linux ] external/wpt/BackgroundSync/interfaces.https.any.html [ Timeout Pass ]

 crbug.com/856601 [ Linux ] external/wpt/FileAPI/idlharness.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/FileAPI/idlharness.worker.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/IndexedDB/idlharness.any.sharedworker.html [ Pass Timeout ]
+crbug.com/856601 [ Linux ] external/wpt/IndexedDB/idlharness.any.worker.html [ Timeout Pass ]

 crbug.com/856601 [ Linux ] external/wpt/IndexedDB/idlharness.https.any.serviceworker.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/IndexedDB/interfaces.any.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/bluetooth/idl/idlharness.tentative.window.html [ Pass Timeout ]
@@ -128,12 +130,15 @@
 crbug.com/856601 [ Linux ] external/wpt/dom/nodes/Element-classlist.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/encrypted-media/idlharness.https.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.worker.html [ Pass Timeout ]
+crbug.com/856601 [ Linux ] external/wpt/gamepad/idlharness.window.html [ Timeout Pass ]

 crbug.com/856601 [ Linux ] external/wpt/mediacapture-image/idlharness.window.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/mediacapture-streams/idlharness.https.window.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/notifications/idlharness.https.any.html [ Pass Failure Timeout ]
+crbug.com/856601 [ Linux ] external/wpt/notifications/idlharness.https.any.serviceworker.html [ Timeout Pass ]

 crbug.com/856601 [ Linux ] external/wpt/pointerevents/idlharness.window.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/presentation-api/controlling-ua/idlharness.https.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/push-api/idlharness.https.any.html [ Pass Timeout ]
+crbug.com/856601 [ Linux ] external/wpt/push-api/idlharness.https.any.serviceworker.html [ Timeout Pass ]

 crbug.com/856601 [ Linux ] external/wpt/push-api/idlharness.https.any.sharedworker.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/push-api/idlharness.https.any.worker.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/remote-playback/idlharness.window.html [ Pass Timeout ]
@@ -169,10 +174,12 @@
 crbug.com/856601 [ Linux ] external/wpt/page-visibility/idlharness.window.html [ Timeout Pass ]
 crbug.com/856601 [ Linux ] virtual/new-remote-playback-pipeline/external/wpt/remote-playback/idlharness.window.html [ Timeout Pass ]
 crbug.com/856601 [ Linux ] virtual/outofblink-cors-ns/external/wpt/xhr/idlharness.any.sharedworker.html [ Timeout Pass ]
+crbug.com/856601 [ Linux ] virtual/outofblink-cors/external/wpt/fetch/api/idl.any.html [ Timeout Pass ]

+crbug.com/856601 [ Linux ] virtual/outofblink-cors/external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.html [ Timeout Pass ]
 crbug.com/856601 [ Linux ] virtual/outofblink-cors/external/wpt/xhr/idlharness.any.html [ Timeout Pass ]
 crbug.com/856601 [ Linux ] virtual/service-worker-servicification/external/wpt/service-workers/service-worker/interfaces-window.https.html [ Timeout Pass ]
 crbug.com/856601 [ Linux ] virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/idlharness.https.window.html [ Timeout Pass ]
-
+

 # background-fetch tests crash on MSAN
 crbug.com/869818 [ Linux ] external/wpt/background-fetch/fetch.https.window.html [ Pass Crash ]
 crbug.com/869818 [ Linux ] external/wpt/background-fetch/get-ids.https.window.html [ Pass Crash ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index a7e0c82..9bce4f39 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -117,7 +117,6 @@
 # Flaky virtual/threaded/fast/scrolling tests
 crbug.com/841567 virtual/threaded/fast/scrolling/absolute-position-behind-scrollbar.html [ Failure Pass ]
 crbug.com/841567 virtual/threaded/fast/scrolling/fixed-position-behind-scrollbar.html [ Failure Pass ]
-crbug.com/841567 virtual/threaded/fast/scrolling/hover-during-scroll.html [ Failure Timeout Pass ]
 crbug.com/841567 virtual/threaded/fast/scrolling/listbox-wheel-event.html [ Failure Pass ]
 crbug.com/841567 virtual/threaded/fast/scrolling/overflow-scrollability.html [ Failure Pass Timeout ]
 crbug.com/841567 virtual/threaded/fast/scrolling/scrollbar-tickmarks-hittest.html [ Failure Pass ]
@@ -1750,12 +1749,10 @@
 
 # Fieldset in NG
 #
-crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow-hidden.html [ Crash Pass ]
-crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html [ Crash ]
+crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html [ Failure ]
 crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-painting-order.html [ Failure ]
 crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-percentage-block-size.html [ Failure ]
-crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-percentage-padding.html [ Crash Pass ]
-crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-transform-translatez.html [ Crash Failure ]
+crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-transform-translatez.html [ Failure ]
 crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-vertical.html [ Failure ]
 crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-align.html [ Failure ]
 crbug.com/875235 virtual/layout_ng_experimental/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-auto-margins.html [ Failure ]
@@ -1910,6 +1907,10 @@
 crbug.com/526463 virtual/mouseevent_fractional/fast/events/wheel/mouse-wheel-scroll-latching.html [ Pass Failure ]
 crbug.com/526463 virtual/mouseevent_fractional/fast/events/wheel/wheel-scroll-latching-on-scrollbar.html [ Pass Failure ]
 
+crbug.com/892032 fast/events/wheel/wheel-latched-scroll-node-removed.html [ Pass Failure ]
+crbug.com/892032 virtual/mouseevent_fractional/fast/events/wheel/wheel-latched-scroll-node-removed.html [ Pass Failure ]
+crbug.com/892032 virtual/user-activation-v2/fast/events/wheel/wheel-latched-scroll-node-removed.html [ Pass Failure ]
+
 crbug.com/410974 virtual/threaded/fast/scroll-behavior/scroll-customization/scrollstate-basic.html [ Pass Failure ]
 crbug.com/410974 virtual/threaded/fast/scroll-behavior/scroll-customization/scrollstate-consume-deltas.html [ Pass Failure ]
 crbug.com/410974 virtual/threaded/fast/scroll-behavior/scroll-customization/scrollstate-consume-deltas-throw.html [ Pass Failure ]
@@ -2845,6 +2846,7 @@
 crbug.com/875249 external/wpt/infrastructure/testdriver/bless.html [ Timeout Pass ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht [ Failure ]
 crbug.com/626703 [ Win10 ] external/wpt/speech-api/idlharness.window.html [ Failure Timeout ]
 crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_position_50.html [ Failure ]
 crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_center_wrapped.html [ Failure ]
@@ -3842,8 +3844,6 @@
 # worker script, because the script url has a .html file extension.
 crbug.com/655458 external/wpt/workers/semantics/multiple-workers/003.html [ Timeout ]
 
-crbug.com/490511 external/wpt/html/semantics/embedded-content/media-elements/playing-the-media-resource/pause-remove-from-document-networkState.html [ Timeout ]
-
 crbug.com/435547 http/tests/cachestorage/serviceworker/ignore-search-with-credentials.html [ Skip ]
 
 crbug.com/697971 [ Mac10.12 ] fast/text/selection/flexbox-selection-nested.html [ Skip ]
@@ -5236,13 +5236,9 @@
 crbug.com/887659 animations/animationworklet/animator-animate.html [ Failure ]
 crbug.com/887659 animations/animationworklet/animator-with-options.html [ Failure ]
 crbug.com/887659 animations/animationworklet/peek-updated-composited-property-on-main.html [ Failure ]
-crbug.com/887659 animations/animationworklet/scroll-timeline-display-none.html [ Crash ]
-crbug.com/887659 animations/animationworklet/scroll-timeline-dynamic-update.html [ Crash ]
 crbug.com/887659 animations/animationworklet/worklet-animation-currentTime.html [ Failure ]
 crbug.com/887659 animations/animationworklet/worklet-animation-local-time-after-duration.html [ Failure ]
 crbug.com/887659 animations/animationworklet/worklet-animation-local-time-undefined.html [ Failure ]
-crbug.com/887659 animations/animationworklet/worklet-animation-set-keyframes.html [ Crash ]
-crbug.com/887659 animations/animationworklet/worklet-animation-set-timing.html [ Crash ]
 crbug.com/887659 animations/animationworklet/worklet-animation-style-update.html [ Failure ]
 crbug.com/887659 animations/animationworklet/worklet-animation-responsive-to-zoom.html [ Crash ]
 
@@ -5252,3 +5248,4 @@
 # Sheriff 2018-10-03
 crbug.com/891530 [ Linux ] virtual/android/rootscroller/remove-rootscroller-crash.html [ Pass Timeout ]
 crbug.com/891510 [ Win7 ] fast/dom/inline-event-attributes-release.html [ Failure Pass ]
+crbug.com/892772 [ Mac ] editing/caret/caret-painting-low-dpi.html [ Failure Pass ]
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/accessibility/multiselect-list-reports-active-option.html b/third_party/WebKit/LayoutTests/accessibility/multiselect-list-reports-active-option.html
index 1fd37ff..936ae3fd 100644
--- a/third_party/WebKit/LayoutTests/accessibility/multiselect-list-reports-active-option.html
+++ b/third_party/WebKit/LayoutTests/accessibility/multiselect-list-reports-active-option.html
@@ -17,7 +17,7 @@
     let notificationReceivedIndex = 0;
 
     function runTest() {
-        assert_exists(window, 'accessibilityController');
+        assert_own_property(window, 'accessibilityController');
 
         var menulist = document.getElementById("menulist");
         menulist.focus();
diff --git a/third_party/WebKit/LayoutTests/accessibility/name-calc-native-markup-buttons.html b/third_party/WebKit/LayoutTests/accessibility/name-calc-native-markup-buttons.html
index 3bf7a35..f0af6040 100644
--- a/third_party/WebKit/LayoutTests/accessibility/name-calc-native-markup-buttons.html
+++ b/third_party/WebKit/LayoutTests/accessibility/name-calc-native-markup-buttons.html
@@ -73,7 +73,7 @@
 <script>
 test(function(t) {
     var axButton6 = accessibilityController.accessibleElementById("button6");
-    assert_equals(axButton6.name, "I love cake!");
+    assert_equals(axButton6.name, "I love cake !");
     assert_equals(axButton6.nameFrom, "contents");
 }, "Button with text content and img content with alt");
 </script>
diff --git a/third_party/WebKit/LayoutTests/animations/animation-finish-promise-gc.html b/third_party/WebKit/LayoutTests/animations/animation-finish-promise-gc.html
index d69486ec5..042549bd 100644
--- a/third_party/WebKit/LayoutTests/animations/animation-finish-promise-gc.html
+++ b/third_party/WebKit/LayoutTests/animations/animation-finish-promise-gc.html
@@ -7,7 +7,7 @@
 <body>
 <script>
 async_test(t => {
-  assert_exists(window, "GCController", "gc controller needed");
+  assert_own_property(window, "GCController", "gc controller needed");
   setInterval(gc, 0);
 
   var anim = document.body.animate(null, 1);
diff --git a/third_party/WebKit/LayoutTests/css3/masking/clip-path-selection.html b/third_party/WebKit/LayoutTests/css3/masking/clip-path-selection.html
index b08677d..a09bc411 100644
--- a/third_party/WebKit/LayoutTests/css3/masking/clip-path-selection.html
+++ b/third_party/WebKit/LayoutTests/css3/masking/clip-path-selection.html
@@ -23,8 +23,8 @@
 
 <script>
 function drag(from, to) {
-  assert_exists(window, 'chrome');
-  assert_exists(window.chrome, 'gpuBenchmarking');
+  assert_own_property(window, 'chrome');
+  assert_own_property(window.chrome, 'gpuBenchmarking');
   return new Promise((resolve) => {
     chrome.gpuBenchmarking.pointerActionSequence(
       [{
diff --git a/third_party/WebKit/LayoutTests/editing/assert_selection.html b/third_party/WebKit/LayoutTests/editing/assert_selection.html
index f0559bc5..2ee593c 100644
--- a/third_party/WebKit/LayoutTests/editing/assert_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/assert_selection.html
@@ -385,8 +385,8 @@
 }, 'removeSampleIfSucceeded');
 
 test(() => {
-    assert_exists(window, 'internals');
-    assert_exists(window, 'eventSender');
+    assert_own_property(window, 'internals');
+    assert_own_property(window, 'eventSender');
     assert_selection(
         'foo|bar',
         () => { assert_equals(internals.textAffinity, 'Downstream'); },
@@ -406,7 +406,7 @@
 }, 'Textaffinity');
 
 test(() => {
-  assert_exists(window, 'eventSender');
+  assert_own_property(window, 'eventSender');
   assert_selection(
     [
       '<div id="first">one <span id="start"></span>two three</div>',
diff --git a/third_party/WebKit/LayoutTests/editing/deleting/delete_with_unfocused_selection.html b/third_party/WebKit/LayoutTests/editing/deleting/delete_with_unfocused_selection.html
index f50b2db..2c2df0b 100644
--- a/third_party/WebKit/LayoutTests/editing/deleting/delete_with_unfocused_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/deleting/delete_with_unfocused_selection.html
@@ -4,7 +4,7 @@
 <script src="../assert_selection.js"></script>
 <script>
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
@@ -24,7 +24,7 @@
 }, 'Delete with unfocused selection in text control');
 
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
diff --git a/third_party/WebKit/LayoutTests/editing/deleting/smart_editing_disabled.html b/third_party/WebKit/LayoutTests/editing/deleting/smart_editing_disabled.html
index 9e20409..b5fe266f 100644
--- a/third_party/WebKit/LayoutTests/editing/deleting/smart_editing_disabled.html
+++ b/third_party/WebKit/LayoutTests/editing/deleting/smart_editing_disabled.html
@@ -4,8 +4,8 @@
 <script src="../assert_selection.js"></script>
 <script>
 test(() => {
-  assert_exists(window, 'internals', 'This test requires window.internals.');
-  assert_exists(window, 'testRunner', 'This test requires window.testRunner.');
+  assert_own_property(window, 'internals', 'This test requires window.internals.');
+  assert_own_property(window, 'testRunner', 'This test requires window.testRunner.');
   internals.settings.setSmartInsertDeleteEnabled(false);
   internals.settings.setSelectTrailingWhitespaceEnabled(true);
   assert_selection(
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/clipboard-access-with-userGesture.html b/third_party/WebKit/LayoutTests/editing/execCommand/clipboard-access-with-userGesture.html
index 4fd9316..a53474e 100644
--- a/third_party/WebKit/LayoutTests/editing/execCommand/clipboard-access-with-userGesture.html
+++ b/third_party/WebKit/LayoutTests/editing/execCommand/clipboard-access-with-userGesture.html
@@ -8,13 +8,13 @@
 function runTest()
 {
     test(() => {
-      assert_exists(window, 'testRunner');
+      assert_own_property(window, 'testRunner');
       testRunner.setJavaScriptCanAccessClipboard(false);
       clickButton("copy");
     }, 'Copy');
 
     test(() => {
-      assert_exists(window, 'testRunner');
+      assert_own_property(window, 'testRunner');
       testRunner.setJavaScriptCanAccessClipboard(false);
       clickButton("cut");
     }, 'Cut');
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/remove_format_with_unfocused_selection.html b/third_party/WebKit/LayoutTests/editing/execCommand/remove_format_with_unfocused_selection.html
index dd827129..dc9881e1 100644
--- a/third_party/WebKit/LayoutTests/editing/execCommand/remove_format_with_unfocused_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/execCommand/remove_format_with_unfocused_selection.html
@@ -4,7 +4,7 @@
 <script src="../assert_selection.js"></script>
 <script>
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/transpose_with_unfocused_selection.html b/third_party/WebKit/LayoutTests/editing/execCommand/transpose_with_unfocused_selection.html
index 1efd62a..94e1dc0 100644
--- a/third_party/WebKit/LayoutTests/editing/execCommand/transpose_with_unfocused_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/execCommand/transpose_with_unfocused_selection.html
@@ -4,7 +4,7 @@
 <script src="../assert_selection.js"></script>
 <script>
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
@@ -24,7 +24,7 @@
 }, 'Transpose with unfocused selection in text control');
 
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/unlink_with_unfocused_selection.html b/third_party/WebKit/LayoutTests/editing/execCommand/unlink_with_unfocused_selection.html
index 13eda51..e56c12cb 100644
--- a/third_party/WebKit/LayoutTests/editing/execCommand/unlink_with_unfocused_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/execCommand/unlink_with_unfocused_selection.html
@@ -4,7 +4,7 @@
 <script src="../assert_selection.js"></script>
 <script>
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-composition-whitespace.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-composition-whitespace.html
index 8265bc63..bd7392e 100644
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-composition-whitespace.html
+++ b/third_party/WebKit/LayoutTests/editing/inserting/insert-composition-whitespace.html
@@ -18,7 +18,7 @@
 }
 
 test(() => {
- assert_exists(window, 'textInputController',
+ assert_own_property(window, 'textInputController',
                'this test requires window.textInputController.');
 
   assertMarkedText('div', 'AB', 'AB');
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-on-unfocused-element.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-on-unfocused-element.html
index 32a8d90e..3008b106 100644
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-on-unfocused-element.html
+++ b/third_party/WebKit/LayoutTests/editing/inserting/insert-on-unfocused-element.html
@@ -6,7 +6,7 @@
 </div>
 <script>
 test(() => {
-  assert_exists(window, 'eventSender', 'this test requires window.eventSender');
+  assert_own_property(window, 'eventSender', 'this test requires window.eventSender');
   input.focus();
   assert_equals(document.activeElement, input);
   outer.focus();
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-text-nodes-disconnect-on-textinput-event.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-text-nodes-disconnect-on-textinput-event.html
index a851a2eb..e538b8cf 100644
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-text-nodes-disconnect-on-textinput-event.html
+++ b/third_party/WebKit/LayoutTests/editing/inserting/insert-text-nodes-disconnect-on-textinput-event.html
@@ -6,7 +6,7 @@
 selection_test(
     '<div contenteditable>foo<br>^bar<div>|baz</div></div>',
     selection => {
-        assert_exists(window, 'textInputController',
+        assert_own_property(window, 'textInputController',
             'this test requires window.textInputController.');
         selection.document.addEventListener('textInput', () => {
             // disconnect the node here
diff --git a/third_party/WebKit/LayoutTests/editing/inserting/insert-text-remove-iframe-on-textInput-event.html b/third_party/WebKit/LayoutTests/editing/inserting/insert-text-remove-iframe-on-textInput-event.html
index 9d7c76e..45c3f9bd 100644
--- a/third_party/WebKit/LayoutTests/editing/inserting/insert-text-remove-iframe-on-textInput-event.html
+++ b/third_party/WebKit/LayoutTests/editing/inserting/insert-text-remove-iframe-on-textInput-event.html
@@ -6,7 +6,7 @@
 selection_test(
     '<iframe></iframe>',
     selection => {
-        assert_exists(window, 'textInputController',
+        assert_own_property(window, 'textInputController',
                 'this test requires window.textInputController.');
         const document = selection.document;
         const iframe = document.querySelector('iframe');
diff --git a/third_party/WebKit/LayoutTests/editing/pasteboard/pasteboard_with_unfocused_selection.html b/third_party/WebKit/LayoutTests/editing/pasteboard/pasteboard_with_unfocused_selection.html
index 84ee51f..65e788b 100644
--- a/third_party/WebKit/LayoutTests/editing/pasteboard/pasteboard_with_unfocused_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/pasteboard/pasteboard_with_unfocused_selection.html
@@ -4,7 +4,7 @@
 <script src="../assert_selection.js"></script>
 <script>
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
@@ -28,7 +28,7 @@
 }, 'Cutting with unfocused selection in contenteditable div');
 
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
@@ -58,7 +58,7 @@
 }, 'Copying with unfocused selection in contenteditable div');
 
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
@@ -84,7 +84,7 @@
 }, 'Pasting with unfocused selection in contenteditable div');
 
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
@@ -110,8 +110,8 @@
 }, 'Pasting as plain text with unfocused selection in contenteditable div');
 
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
-  assert_exists(window, 'internals', 'This test requires internal settings');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'internals', 'This test requires internal settings');
   internals.settings.setEditingBehavior('unix');
 
   assert_selection(
diff --git a/third_party/WebKit/LayoutTests/editing/selection/arrow_key_with_unfocused_selection.html b/third_party/WebKit/LayoutTests/editing/selection/arrow_key_with_unfocused_selection.html
index ee071d6..fd1dd4f 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/arrow_key_with_unfocused_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/arrow_key_with_unfocused_selection.html
@@ -6,7 +6,7 @@
 // Regression tests for crbug.com/713607.
 
 test(() => {
-  assert_exists(window, 'eventSender', 'This test requires eventSender');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender');
 
   assert_selection(
   [
@@ -26,7 +26,7 @@
 }, 'Press left arrow key with unfocused selection in text control');
 
 test(() => {
-  assert_exists(window, 'eventSender', 'This test requires eventSender');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender');
 
   assert_selection(
   [
diff --git a/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_before_select.html b/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_before_select.html
index e7e7132..410d75d 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_before_select.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_before_select.html
@@ -15,7 +15,7 @@
     assert_equals(selection.focusNode, select, 'DOM focusNode');
     assert_equals(selection.focusOffset, 0, 'DOM focusOffset');
 
-    assert_exists(window, 'internals');
+    assert_own_property(window, 'internals');
     assert_equals(internals.visibleSelectionAnchorNode, anchor, 'Canonicalized anchorNode');
     assert_equals(internals.visibleSelectionAnchorOffset, 0, 'Canonicalized anchorOffset');
     assert_equals(internals.visibleSelectionFocusNode, anchor, 'Canonicalized focusNode');
diff --git a/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_document_in_design_mode.html b/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_document_in_design_mode.html
index fb3e009..79d498c8 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_document_in_design_mode.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_document_in_design_mode.html
@@ -18,7 +18,7 @@
     assert_equals(selection.focusNode, document, 'DOM focusNode');
     assert_equals(selection.focusOffset, 0, 'DOM focusOffset');
 
-    assert_exists(window, 'internals');
+    assert_own_property(window, 'internals');
     assert_equals(internals.visibleSelectionAnchorNode, anchor, 'Canonicalized anchorNode');
     assert_equals(internals.visibleSelectionAnchorOffset, 0, 'Canonicalized anchorOffset');
     assert_equals(internals.visibleSelectionFocusNode, anchor, 'Canonicalized focusNode');
diff --git a/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_html_to_editable_body.html b/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_html_to_editable_body.html
index d82fb3d..6cd7f29 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_html_to_editable_body.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/collapse/collapse_html_to_editable_body.html
@@ -19,7 +19,7 @@
     assert_equals(selection.focusNode, document, 'DOM focusNode');
     assert_equals(selection.focusOffset, 0, 'DOM focusOffset');
 
-    assert_exists(window, 'internals');
+    assert_own_property(window, 'internals');
     assert_equals(internals.visibleSelectionAnchorNode, anchor, 'Canonicalized anchorNode');
     assert_equals(internals.visibleSelectionAnchorOffset, 0, 'Canonicalized anchorOffset');
     assert_equals(internals.visibleSelectionFocusNode, anchor, 'Canonicalized focusNode');
diff --git a/third_party/WebKit/LayoutTests/editing/selection/collapse/table-caret-2.html b/third_party/WebKit/LayoutTests/editing/selection/collapse/table-caret-2.html
index 59ab138..ee046e77 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/collapse/table-caret-2.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/collapse/table-caret-2.html
@@ -19,7 +19,7 @@
     assert_equals(selection.anchorNode, sample, 'DOM anchorNode');
     assert_equals(selection.anchorOffset, childLength, 'DOM anchorOffset');
 
-    assert_exists(window, 'internals');
+    assert_own_property(window, 'internals');
     assert_equals(internals.visibleSelectionAnchorNode, div, 'Canonicalized anchorNode');
     assert_equals(internals.visibleSelectionAnchorOffset, 2, 'Canonicalized anchorOffset');
 });
diff --git a/third_party/WebKit/LayoutTests/editing/selection/collapse/table-caret-3.html b/third_party/WebKit/LayoutTests/editing/selection/collapse/table-caret-3.html
index a89b43b4..2efa9c75 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/collapse/table-caret-3.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/collapse/table-caret-3.html
@@ -18,7 +18,7 @@
 
     assert_equals(selection.anchorNode, sample, 'DOM anchorNode');
     assert_equals(selection.anchorOffset, childLength, 'DOM anchorOffset');
-    assert_exists(window, 'internals');
+    assert_own_property(window, 'internals');
     assert_equals(internals.visibleSelectionAnchorNode, div, 'Canonicalized anchorNode');
     assert_equals(internals.visibleSelectionAnchorOffset, 2, 'Canonicalized anchorOffset');
 });
diff --git a/third_party/WebKit/LayoutTests/editing/selection/double_click_and_modify.html b/third_party/WebKit/LayoutTests/editing/selection/double_click_and_modify.html
index cc737d0..a99cd6d 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/double_click_and_modify.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/double_click_and_modify.html
@@ -18,7 +18,7 @@
     eventSender.mouseUp();
   }
 
-  assert_exists(window, 'eventSender', 'This test requires eventSender.');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender.');
 
   assert_selection(
     '<span id="sample">xyz</span>',
diff --git a/third_party/WebKit/LayoutTests/editing/selection/mark_with_unfocused_selection.html b/third_party/WebKit/LayoutTests/editing/selection/mark_with_unfocused_selection.html
index 1db12c60..867c8767 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/mark_with_unfocused_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/mark_with_unfocused_selection.html
@@ -4,7 +4,7 @@
 <script src="../assert_selection.js"></script>
 <script>
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
@@ -28,7 +28,7 @@
 }, 'Swap-with-mark with unfocused selection in text control');
 
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
   [
diff --git a/third_party/WebKit/LayoutTests/editing/selection/modify_extend/extend_with_unfocused_selection.html b/third_party/WebKit/LayoutTests/editing/selection/modify_extend/extend_with_unfocused_selection.html
index cad8771a..61ead25 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/modify_extend/extend_with_unfocused_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/modify_extend/extend_with_unfocused_selection.html
@@ -4,7 +4,7 @@
 <script src="../../assert_selection.js"></script>
 <script>
 test(() => {
-  assert_exists(window, 'eventSender', 'This test requires eventSender');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender');
   assert_selection(
   [
     '<textarea>|text</textarea>',
@@ -23,7 +23,7 @@
 }, 'Press Shift + right arrow key with unfocused selection in text control');
 
 test(() => {
-  assert_exists(window, 'eventSender', 'This test requires eventSender');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender');
   assert_selection(
   [
     '<div contenteditable>|text</div>',
diff --git a/third_party/WebKit/LayoutTests/editing/selection/modify_move/resources/move-by-word-visually.js b/third_party/WebKit/LayoutTests/editing/selection/modify_move/resources/move-by-word-visually.js
index 1dd39bd..41db4cc 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/modify_move/resources/move-by-word-visually.js
+++ b/third_party/WebKit/LayoutTests/editing/selection/modify_move/resources/move-by-word-visually.js
@@ -142,7 +142,7 @@
   var sel = getSelection();
   for (var testcase of tests) {
       test(function () {
-          assert_exists(window, 'internals');
+          assert_own_property(window, 'internals');
           if (testcase.className.search('fix_width') != -1) {
               var span = document.getElementById('span_size');
               var length = span.offsetWidth;
diff --git a/third_party/WebKit/LayoutTests/editing/selection/mouse/extend_by_word_with_base_is_end.html b/third_party/WebKit/LayoutTests/editing/selection/mouse/extend_by_word_with_base_is_end.html
index b73debb..d3352ce3 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/mouse/extend_by_word_with_base_is_end.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/mouse/extend_by_word_with_base_is_end.html
@@ -7,7 +7,7 @@
 // |chrome.pointerActionSequence()| instead of |eventSender|.
 
 function moveToMiddle(selection, target) {
-  assert_exists(window, 'eventSender', 'This test requires eventSender.');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender.');
   eventSender.mouseMoveTo(
       selection.computeLeft(target),
       selection.computeTop(target) + target.offsetHeight / 2);
@@ -37,7 +37,7 @@
 }
 
 function doTest1(behavior) {
-  assert_exists(window, 'internals', 'This test requires internals.');
+  assert_own_property(window, 'internals', 'This test requires internals.');
   internals.settings.setEditingBehavior(behavior);
   internals.settings.setSelectTrailingWhitespaceEnabled(behavior === 'win');
 
@@ -121,7 +121,7 @@
 }
 
 function doTest2(behavior) {
-  assert_exists(window, 'internals', 'This test requires internals.');
+  assert_own_property(window, 'internals', 'This test requires internals.');
   internals.settings.setEditingBehavior(behavior);
 
   const kSample2 = [
diff --git a/third_party/WebKit/LayoutTests/editing/selection/select-bidi-run.html b/third_party/WebKit/LayoutTests/editing/selection/select-bidi-run.html
index b5c56af..2685a20 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/select-bidi-run.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/select-bidi-run.html
@@ -25,7 +25,7 @@
 }
 
 function startDrag(x, y) {
-  assert_exists(window, 'eventSender', 'This test requires window.eventSender');
+  assert_own_property(window, 'eventSender', 'This test requires window.eventSender');
   eventSender.dragMode = false;
 
   // Clear click count
diff --git a/third_party/WebKit/LayoutTests/editing/selection/select-out-of-floated-non-editable.html b/third_party/WebKit/LayoutTests/editing/selection/select-out-of-floated-non-editable.html
index 70e3cd6..3daa646 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/select-out-of-floated-non-editable.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/select-out-of-floated-non-editable.html
@@ -6,7 +6,7 @@
 const kFontSize = '10px';
 const kMouseStep = '5';
 function startDrag(x, y) {
-  assert_exists(window, 'eventSender', 'This test requires window.eventSender');
+  assert_own_property(window, 'eventSender', 'This test requires window.eventSender');
   eventSender.dragMode = false;
 
   // Clear click count
diff --git a/third_party/WebKit/LayoutTests/editing/selection/select_all/select_all_with_unfocused_selection.html b/third_party/WebKit/LayoutTests/editing/selection/select_all/select_all_with_unfocused_selection.html
index 6c811ac3..eb0385f 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/select_all/select_all_with_unfocused_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/select_all/select_all_with_unfocused_selection.html
@@ -8,7 +8,7 @@
 // no selection at all.
 
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
     'foo<textarea>bar|</textarea><a href="http://www.example.com">baz</a>',
@@ -20,7 +20,7 @@
 }, 'User-triggered SelectAll selects entire document when there is unfocused caret selection hidden in text control');
 
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
     'foo<textarea>^ba|r</textarea><a href="http://www.example.com">baz</a>',
@@ -32,7 +32,7 @@
 }, 'User-triggered SelectAll selects entire document when there is unfocused range selection hidden in text control');
 
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
     'foo<div contenteditable>bar|</div><a href="http://www.example.com">baz</a>',
@@ -44,7 +44,7 @@
 }, 'User-triggered SelectAll selects entire document when there is unfocused caret selection hidden in contenteditable div');
 
 test(() => {
-  assert_exists(window, 'testRunner', 'This test requires testRunner');
+  assert_own_property(window, 'testRunner', 'This test requires testRunner');
 
   assert_selection(
     'foo<div contenteditable>^ba|r</div><a href="http://www.example.com">baz</a>',
diff --git a/third_party/WebKit/LayoutTests/editing/selection/shift-click.html b/third_party/WebKit/LayoutTests/editing/selection/shift-click.html
index 390d6fa..5baeef96 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/shift-click.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/shift-click.html
@@ -11,8 +11,8 @@
 ].join('');
 
 function doTest(behavior) {
-  assert_exists(window, 'eventSender', 'This test requires eventSender.');
-  assert_exists(window, 'internals', 'This test requires internals.');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender.');
+  assert_own_property(window, 'internals', 'This test requires internals.');
 
   function doDrag(selection) {
     const document = selection.document;
diff --git a/third_party/WebKit/LayoutTests/editing/selection/unrendered-001.html b/third_party/WebKit/LayoutTests/editing/selection/unrendered-001.html
index 9537d21..cbe6e92 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/unrendered-001.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/unrendered-001.html
@@ -15,7 +15,7 @@
     assert_true(selection.isCollapsed, 'isCollapsed');
     assert_equals(selection.anchorNode, document.getElementById('start').firstChild, 'DOM anchorNode');
     assert_equals(selection.anchorOffset, 2, 'DOM anchorOffset');
-    assert_exists(window, 'internals');
+    assert_own_property(window, 'internals');
     assert_equals(internals.visibleSelectionAnchorNode, sample.lastChild, 'Canonicalized anchorNode');
     assert_equals(internals.visibleSelectionAnchorOffset, 3, 'Canoincalized anchorOffset');
 });
diff --git a/third_party/WebKit/LayoutTests/editing/selection/user-select-all-with-shift.html b/third_party/WebKit/LayoutTests/editing/selection/user-select-all-with-shift.html
index c8cdfec0..596bdd1 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/user-select-all-with-shift.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/user-select-all-with-shift.html
@@ -46,8 +46,8 @@
 }
 
 function doTest(behavior) {
-  assert_exists(window, 'eventSender', 'This test requires eventSender.');
-  assert_exists(window, 'internals', 'This test requires internals.');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender.');
+  assert_own_property(window, 'internals', 'This test requires internals.');
   internals.settings.setEditingBehavior(behavior);
 
   assert_selection(
diff --git a/third_party/WebKit/LayoutTests/editing/selection/user-select/user-select-all.html b/third_party/WebKit/LayoutTests/editing/selection/user-select/user-select-all.html
index db1f4f86..89f2c61 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/user-select/user-select-all.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/user-select/user-select-all.html
@@ -42,7 +42,7 @@
 }, 'Modify move is not affected by user-select:all.');
 
 function mouseDownAt(x, y) {
-  assert_exists(window, 'eventSender');
+  assert_own_property(window, 'eventSender');
   eventSender.dragMode = false;
   eventSender.mouseMoveTo(x, y);
   eventSender.mouseDown();
diff --git a/third_party/WebKit/LayoutTests/editing/style/apply_style_with_unfocused_selection.html b/third_party/WebKit/LayoutTests/editing/style/apply_style_with_unfocused_selection.html
index fc28532..ae4268e4 100644
--- a/third_party/WebKit/LayoutTests/editing/style/apply_style_with_unfocused_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/style/apply_style_with_unfocused_selection.html
@@ -4,7 +4,7 @@
 <script src="../assert_selection.js"></script>
 <script>
 test(() => {
-  assert_exists(window, 'eventSender', 'This test requires eventSender');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender');
 
   assert_selection(
   [
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json
index 499dd30..d76a085 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json
@@ -191234,6 +191234,12 @@
      {}
     ]
    ],
+   "background-fetch/abort.https.window.js": [
+    [
+     "/background-fetch/abort.https.window.html",
+     {}
+    ]
+   ],
    "background-fetch/content-security-policy.https.window.js": [
     [
      "/background-fetch/content-security-policy.https.window.html",
@@ -289369,6 +289375,10 @@
    "7c414b254be90f5e6793a2b9fcbe2f57332a4065",
    "support"
   ],
+  "background-fetch/abort.https.window.js": [
+   "588fcac012ff9046370d3484f88342180bcb1961",
+   "testharness"
+  ],
   "background-fetch/content-security-policy.https.window.js": [
    "0b5b1cb5e94d3f27bebbb5a462bf1e823dfc57b4",
    "testharness"
@@ -289386,7 +289396,7 @@
    "testharness"
   ],
   "background-fetch/get.https.window.js": [
-   "cd1dc3a6c49264d2cbf5ccc9e499b5f98b36d8cb",
+   "cb678e692d8db0c17ecfd795998babffeb2a2d87",
    "testharness"
   ],
   "background-fetch/idlharness.https.any-expected.txt": [
@@ -289434,7 +289444,7 @@
    "support"
   ],
   "background-fetch/service_workers/sw.js": [
-   "af4655dbad4ef6ad6b17d79bb2645aee98ce1102",
+   "2e3fbfff1a83e2d1f4aa40e738fa305a6eba513c",
    "support"
   ],
   "background-fetch/update-ui.https.window.js": [
@@ -333302,11 +333312,11 @@
    "reftest"
   ],
   "css/css-multicol/multicol-span-all-margin-bottom-001-ref.xht": [
-   "d6719f0b882216eca8634e021ef0824495fef00d",
+   "2152b5663724bd65393277d21f8f1caad3128c63",
    "support"
   ],
   "css/css-multicol/multicol-span-all-margin-bottom-001.xht": [
-   "5a81ca1ec4027f482a132f511c621ff06cfa5cab",
+   "b9571bd7a2e539e881d9f337a71ad8f4ebbe73fc",
    "reftest"
   ],
   "css/css-multicol/multicol-span-all-margin-nested-001-ref.xht": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001-ref.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001-ref.xht
index d6719f0..2152b56 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001-ref.xht
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001-ref.xht
@@ -22,9 +22,9 @@
     <img src="support/swatch-yellow.png" width="160" height="20" alt="Image download support must be enabled" />
     <img src="support/black20x20.png" width="160" height="20" alt="Image download support must be enabled" />
     <img src="support/swatch-yellow.png" width="160" height="20" alt="Image download support must be enabled" />
+    <img src="support/swatch-yellow.png" width="40" height="20" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="80" height="20" alt="Image download support must be enabled" /><img src="support/swatch-pink.png" width="40" height="20" alt="Image download support must be enabled" />
     <img src="support/swatch-orange.png" width="40" height="20" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="40" height="20" alt="Image download support must be enabled" /><img src="support/swatch-pink.png" width="80" height="20" alt="Image download support must be enabled" />
     <img src="support/swatch-yellow.png" width="40" height="20" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="40" height="20" alt="Image download support must be enabled" /><img src="support/swatch-pink.png" width="40" height="20" alt="Image download support must be enabled" /><img src="support/swatch-yellow.png" width="40" height="20" alt="Image download support must be enabled" />
-    <img src="support/swatch-blue.png" width="80" height="20" alt="Image download support must be enabled" /><img src="support/swatch-pink.png" width="40" height="20" alt="Image download support must be enabled" /><img src="support/swatch-yellow.png" width="40" height="20" alt="Image download support must be enabled" />
   </div>
 
  </body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht
index 5a81ca1..b9571bd 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-multicol/multicol-span-all-margin-bottom-001.xht
@@ -50,10 +50,10 @@
   color: orange;
   /*
   In this test, the glyphs "or" are painted into 1st column box.
-  "Content in the normal flow that extends into column
-  gaps (e.g., long words or images) is clipped in the
-  middle of the column gap."
-  Therefore, the glyphs "ang" are clipped and not painted.
+  Per spec, content in the normal flow that extends into column
+  gaps (e.g., long words or images) is not clipped to the column
+  box. However, the glyphs "ang" are overwritten by <span>s, so
+  they're not visible.
   */
   }
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/playing-the-media-resource/pause-move-within-document-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/playing-the-media-resource/pause-move-within-document-expected.txt
deleted file mode 100644
index 915f171..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/playing-the-media-resource/pause-move-within-document-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL paused state when moving within a document assert_false: paused after moving expected false got true
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/playing-the-media-resource/pause-remove-from-document-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/playing-the-media-resource/pause-remove-from-document-expected.txt
deleted file mode 100644
index 946bc05..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/playing-the-media-resource/pause-remove-from-document-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL paused state when removing from a document assert_false: paused after removing expected false got true
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/permissions/interfaces.any.js b/third_party/WebKit/LayoutTests/external/wpt/permissions/interfaces.any.js
index 78f1fc65..77fa909a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/permissions/interfaces.any.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/permissions/interfaces.any.js
@@ -22,6 +22,7 @@
 
   try {
     self.permissionStatus = await navigator.permissions.query({ name: "geolocation" });
+    self.permissionStatus = await navigator.permissions.query({ name: "background-fetch"});
   } catch (e) {
     // Will be surfaced in idlharness.js's test_object below.
   }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/permissions/test-background-fetch-permission.html b/third_party/WebKit/LayoutTests/external/wpt/permissions/test-background-fetch-permission.html
new file mode 100644
index 0000000..c3da77d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/permissions/test-background-fetch-permission.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test Background Fetch Permission.</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+
+<script>
+  promise_test(function(test) {
+    internals.runtimeFlags.backgroundFetchEnabled = true;
+    return navigator.permissions.query({name:'background-fetch'}).then(function(result) {
+      assert_true(result instanceof PermissionStatus);
+    });
+  });
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https-expected.txt
index f3d1cd5..18291cff 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https-expected.txt
@@ -76,13 +76,13 @@
 PASS Unscopable handled correctly for suspend() on AudioContext
 PASS AudioContext interface: operation close()
 PASS Unscopable handled correctly for close() on AudioContext
-FAIL AudioContext interface: operation createMediaElementSource(HTMLMediaElement) assert_own_property: interface prototype object missing non-static operation expected property "createMediaElementSource" missing
+PASS AudioContext interface: operation createMediaElementSource(HTMLMediaElement)
 PASS Unscopable handled correctly for createMediaElementSource(HTMLMediaElement) on AudioContext
-FAIL AudioContext interface: operation createMediaStreamSource(MediaStream) assert_own_property: interface prototype object missing non-static operation expected property "createMediaStreamSource" missing
+PASS AudioContext interface: operation createMediaStreamSource(MediaStream)
 PASS Unscopable handled correctly for createMediaStreamSource(MediaStream) on AudioContext
 FAIL AudioContext interface: operation createMediaStreamTrackSource(MediaStreamTrack) assert_own_property: interface prototype object missing non-static operation expected property "createMediaStreamTrackSource" missing
 PASS Unscopable handled correctly for createMediaStreamTrackSource(MediaStreamTrack) on AudioContext
-FAIL AudioContext interface: operation createMediaStreamDestination() assert_own_property: interface prototype object missing non-static operation expected property "createMediaStreamDestination" missing
+PASS AudioContext interface: operation createMediaStreamDestination()
 PASS Unscopable handled correctly for createMediaStreamDestination() on AudioContext
 PASS AudioContext must be primary interface of context
 PASS Stringification of context
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.window-expected.txt
index c1e94f9..64ec9f4 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.window-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.window-expected.txt
@@ -44,10 +44,10 @@
 PASS AudioContext interface: operation resume()
 PASS AudioContext interface: operation suspend()
 PASS AudioContext interface: operation close()
-FAIL AudioContext interface: operation createMediaElementSource(HTMLMediaElement) assert_own_property: interface prototype object missing non-static operation expected property "createMediaElementSource" missing
-FAIL AudioContext interface: operation createMediaStreamSource(MediaStream) assert_own_property: interface prototype object missing non-static operation expected property "createMediaStreamSource" missing
+PASS AudioContext interface: operation createMediaElementSource(HTMLMediaElement)
+PASS AudioContext interface: operation createMediaStreamSource(MediaStream)
 FAIL AudioContext interface: operation createMediaStreamTrackSource(MediaStreamTrack) assert_own_property: interface prototype object missing non-static operation expected property "createMediaStreamTrackSource" missing
-FAIL AudioContext interface: operation createMediaStreamDestination() assert_own_property: interface prototype object missing non-static operation expected property "createMediaStreamDestination" missing
+PASS AudioContext interface: operation createMediaStreamDestination()
 PASS AudioContext must be primary interface of context
 PASS Stringification of context
 PASS AudioContext interface: context must inherit property "baseLatency" with the proper type
diff --git a/third_party/WebKit/LayoutTests/fast/dom/htmlformcontrolscollection-no-img.html b/third_party/WebKit/LayoutTests/fast/dom/htmlformcontrolscollection-no-img.html
index e505d92..2bfa8349 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/htmlformcontrolscollection-no-img.html
+++ b/third_party/WebKit/LayoutTests/fast/dom/htmlformcontrolscollection-no-img.html
@@ -9,8 +9,8 @@
 <script>
 test(function() {
     var collection = document.querySelector('form').elements;
-    assert_not_exists(collection, 'imageName', 'name getter for name=');
-    assert_not_exists(collection, 'imageId', 'name getter for id=');
+    assert_equals(collection['imageName'], undefined, 'name getter for name=');
+    assert_equals(collection['imageId'], undefined, 'name getter for id=');
     assert_equals(collection.namedItem('imageName'), null);
     assert_equals(collection.namedItem('imageId'), null);
     for (var i = 0; i < collection.length; ++i)
diff --git a/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query.html b/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query.html
index 6ae1386..ecfea50 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query.html
+++ b/third_party/WebKit/LayoutTests/fast/dom/shadow/content-selector-query.html
@@ -19,7 +19,7 @@
         content.setAttribute('select', select);
 
     test(() => {
-      assert_exists(window, 'internals',
+      assert_own_property(window, 'internals',
                     'This test requires internals.isValidContentSelect');
       assert_equals(internals.isValidContentSelect(content), valid);
     }, `${select} ${valid}`);
diff --git a/third_party/WebKit/LayoutTests/fast/events/click-with-large-negative-text-indent.html b/third_party/WebKit/LayoutTests/fast/events/click-with-large-negative-text-indent.html
index ae1572a1..5241187 100644
--- a/third_party/WebKit/LayoutTests/fast/events/click-with-large-negative-text-indent.html
+++ b/third_party/WebKit/LayoutTests/fast/events/click-with-large-negative-text-indent.html
@@ -12,7 +12,7 @@
 const btnClicked = testCase.step_func_done(() => {});
 
 testCase.step(() => {
-  assert_exists(window, 'eventSender');
+  assert_own_property(window, 'eventSender');
   var testEle = document.getElementById('testButton');
   eventSender.mouseMoveTo(testEle.offsetLeft + testEle.offsetWidth / 2, testEle.offsetTop + testEle.offsetHeight / 2);
   eventSender.mouseDown();
diff --git a/third_party/WebKit/LayoutTests/fast/events/content-changed-during-drop.html b/third_party/WebKit/LayoutTests/fast/events/content-changed-during-drop.html
index 7ca2309..d73262c5 100644
--- a/third_party/WebKit/LayoutTests/fast/events/content-changed-during-drop.html
+++ b/third_party/WebKit/LayoutTests/fast/events/content-changed-during-drop.html
@@ -12,7 +12,7 @@
             function runTest()
             {
                 test(() => {
-                    assert_exists(
+                    assert_own_property(
                         window, 'eventSender',
                         'This test requires eventSender. To test this manually drag the link into the text field.');
 
diff --git a/third_party/WebKit/LayoutTests/fast/events/contextmenu-follows-focus.html b/third_party/WebKit/LayoutTests/fast/events/contextmenu-follows-focus.html
index d007013..e73fbc9 100644
--- a/third_party/WebKit/LayoutTests/fast/events/contextmenu-follows-focus.html
+++ b/third_party/WebKit/LayoutTests/fast/events/contextmenu-follows-focus.html
@@ -24,7 +24,7 @@
 
 <script>
 test(function() {
-  assert_exists(window, 'eventSender', 'This test requires eventSender.');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender.');
 
   document.querySelector('INPUT').focus();
   eventSender.keyDown('ContextMenu');
@@ -34,7 +34,7 @@
 }, 'ContextMenu should target the focused link (not the unfocused field).');
 
 test(function() {
-  assert_exists(window, 'eventSender', 'This test requires eventSender.');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender.');
 
   document.querySelector('div').focus();
   eventSender.keyDown('ContextMenu');
@@ -44,7 +44,7 @@
 }, 'ContextMenu should target the focused link (not the div\'s caret).');
 
 test(function() {
-  assert_exists(window, 'eventSender', 'This test requires eventSender.');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender.');
 
   const div = document.querySelector('div');
   div.focus();
@@ -56,7 +56,7 @@
 }, 'ContextMenu should target the focused link (not the div\'s selection).');
 
 test(function() {
-  assert_exists(window, 'eventSender', 'This test requires eventSender.');
+  assert_own_property(window, 'eventSender', 'This test requires eventSender.');
 
   const span = document.querySelector('span');
   window.getSelection().selectAllChildren(span);
diff --git a/third_party/WebKit/LayoutTests/fast/events/dispatch-mouse-events-to-window-always.html b/third_party/WebKit/LayoutTests/fast/events/dispatch-mouse-events-to-window-always.html
index da8b6d3..c42bc25 100644
--- a/third_party/WebKit/LayoutTests/fast/events/dispatch-mouse-events-to-window-always.html
+++ b/third_party/WebKit/LayoutTests/fast/events/dispatch-mouse-events-to-window-always.html
@@ -41,7 +41,7 @@
     'and window even if they do not hit any element in the page.';
 
 test(() => {
-    assert_exists(window, 'eventSender', 'window.eventSender is required for this test.');
+    assert_own_property(window, 'eventSender', 'window.eventSender is required for this test.');
 
     window.receivers = new Map();
     var eventTypes = ['wheel', 'click', 'mousedown', 'mouseup'];
diff --git a/third_party/WebKit/LayoutTests/fast/forms/label/label-selection-by-textSelection-and-click.html b/third_party/WebKit/LayoutTests/fast/forms/label/label-selection-by-textSelection-and-click.html
index 348e6f11..07b8d51 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/label/label-selection-by-textSelection-and-click.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/label/label-selection-by-textSelection-and-click.html
@@ -24,8 +24,8 @@
 // 3. Radio button should be checked.
 
 testLabelClickWithSelectedText.step(() => {
-  assert_exists(window, "chrome");
-  assert_exists(chrome, "gpuBenchmarking");
+  assert_own_property(window, "chrome");
+  assert_own_property(chrome, "gpuBenchmarking");
 
   var pointerActions =
           [{ source: "mouse",
diff --git a/third_party/WebKit/LayoutTests/fast/forms/radio/radio-input-keyboard-navigation.html b/third_party/WebKit/LayoutTests/fast/forms/radio/radio-input-keyboard-navigation.html
index b05bfe1..4db7b13 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/radio/radio-input-keyboard-navigation.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/radio/radio-input-keyboard-navigation.html
@@ -27,7 +27,7 @@
 <script>
 	test(function() {
 		document.querySelector("input").focus();
-		assert_exists(window, "eventSender");
+		assert_own_property(window, "eventSender");
 		for (var i = 0; i < 5; i++) {
 			eventSender.keyDown("ArrowDown");
 		}
diff --git a/third_party/WebKit/LayoutTests/fast/forms/text-control-selection-after-blur.html b/third_party/WebKit/LayoutTests/fast/forms/text-control-selection-after-blur.html
index 6c5a4c6..e0559ff1 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/text-control-selection-after-blur.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/text-control-selection-after-blur.html
@@ -10,7 +10,7 @@
 <script>
 function testSelectionAfterBlur(element) {
   test(() => {
-    assert_exists(window, 'eventSender');
+    assert_own_property(window, 'eventSender');
     element.value = '';
     element.focus();
     eventSender.keyDown('a');
diff --git a/third_party/WebKit/LayoutTests/fast/forms/text/text-change-event-after-clear-in-submit.html b/third_party/WebKit/LayoutTests/fast/forms/text/text-change-event-after-clear-in-submit.html
index 938a42f..7f33ee2 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/text/text-change-event-after-clear-in-submit.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/text/text-change-event-after-clear-in-submit.html
@@ -6,7 +6,7 @@
 <input id="target2">
 <script>
 test(() => {
-  assert_exists(window, 'eventSender');
+  assert_own_property(window, 'eventSender');
   let form = document.querySelector('form');
   let text = document.querySelector('input');
   let submit = document.querySelectorAll('input')[1];
@@ -32,7 +32,7 @@
 }, 'Clearing INPUT value in submit event handler should not prevent next change event. crbug.com/695349');
 
 test(() => {
-  assert_exists(window, 'eventSender');
+  assert_own_property(window, 'eventSender');
   let text = document.querySelector('#target2');
   var lastChangeValue = '';
   text.addEventListener('change', () => { lastChangeValue = text.value; text.value = ''; });
diff --git a/third_party/WebKit/LayoutTests/fast/forms/text/text-selection-after-type-change.html b/third_party/WebKit/LayoutTests/fast/forms/text/text-selection-after-type-change.html
index 9c2c084..5a2946a 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/text/text-selection-after-type-change.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/text/text-selection-after-type-change.html
@@ -8,7 +8,7 @@
 <script>
 var t = async_test('selectionStart/selectionEnd should be kept after input type changes.');
 t.step(() => {
-  assert_exists(window, 'eventSender');
+  assert_own_property(window, 'eventSender');
   var element = document.querySelector('input');
   element.value = '';
   element.focus();
diff --git a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html
index ac11e0ce..0af62a7a 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-above-min-size-and-below-initial-size.html
@@ -30,8 +30,8 @@
 
 var t = async_test('Test for resizing the TEXTAREA above minimum size set and below its initial size.');
 t.step(() => {
-  assert_exists(window, 'chrome');
-  assert_exists(chrome, 'gpuBenchmarking');
+  assert_own_property(window, 'chrome');
+  assert_own_property(chrome, 'gpuBenchmarking');
 
   var textArea = document.getElementById('textInputID');
   textArea.style.width = '400px';
diff --git a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html
index d76fe6b..2958bad6 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-intrinsic-size.html
@@ -18,8 +18,8 @@
 
 var t = async_test('Test for resizing the TEXTAREA below its min intrinsic size.');
 t.step(() => {
-  assert_exists(window, 'chrome');
-  assert_exists(chrome, 'gpuBenchmarking');
+  assert_own_property(window, 'chrome');
+  assert_own_property(chrome, 'gpuBenchmarking');
 
   var textArea = document.getElementById("textInputID");
   var startX = textArea.offsetLeft + 400;
diff --git a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-size-zoomed.html b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-size-zoomed.html
index 019eb12..f4ad777 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-size-zoomed.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-size-zoomed.html
@@ -33,8 +33,8 @@
 
 var t = async_test('Test for resizing the TEXTAREA below the minimum size set in zoomed environment.');
 t.step(() => {
-  assert_exists(window, 'chrome');
-  assert_exists(chrome, 'gpuBenchmarking');
+  assert_own_property(window, 'chrome');
+  assert_own_property(chrome, 'gpuBenchmarking');
 
   var textArea = document.getElementById('textInputID');
   var startX = textArea.offsetLeft + 195;
diff --git a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-size.html b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-size.html
index b3ef76fd..bbec690 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-size.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-below-min-size.html
@@ -26,8 +26,8 @@
 
 var t = async_test('Test for resizing the TEXTAREA below the minimum size set.');
 t.step(() => {
-  assert_exists(window, 'chrome');
-  assert_exists(chrome, 'gpuBenchmarking');
+  assert_own_property(window, 'chrome');
+  assert_own_property(chrome, 'gpuBenchmarking');
 
   var textArea = document.getElementById('textInputID');
   textArea.style.width = '400px';
diff --git a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-orthogonal-containing-block.html b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-orthogonal-containing-block.html
index fc45fd6..27cc576c 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-orthogonal-containing-block.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/textarea/textarea-resize-orthogonal-containing-block.html
@@ -20,8 +20,8 @@
 
 var t = async_test('Test for resizing the TEXTAREA below its initial size and with orthogonal containing block.');
 t.step(() => {
-  assert_exists(window, 'chrome');
-  assert_exists(chrome, 'gpuBenchmarking');
+  assert_own_property(window, 'chrome');
+  assert_own_property(chrome, 'gpuBenchmarking');
 
   var textArea = document.getElementById("textInputID");
   var startX = textArea.offsetLeft + 400;
diff --git a/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html b/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html
index 58778d2..907393e2 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html
@@ -67,8 +67,8 @@
 
 // Hours, 1-12
 test(() => {
-  assert_exists(window, 'internals');
-  assert_exists(window, 'eventSender');
+  assert_own_property(window, 'internals');
+  assert_own_property(window, 'eventSender');
 
   assert_input_value_after_up('07:00', 1, '08:00');
   assert_input_value_after_down('07:00', 1, '06:00');
@@ -120,8 +120,8 @@
 
 // Hours, 0-11
 test(() => {
-  assert_exists(window, 'internals');
-  assert_exists(window, 'eventSender');
+  assert_own_property(window, 'internals');
+  assert_own_property(window, 'eventSender');
   setDateTimeFormat('KK:mm a');
 
   assert_input_value_after_up('11:00', 1, '00:00', '00:00 AM');
@@ -156,8 +156,8 @@
 
 // Hours, 0-23
 test(() => {
-  assert_exists(window, 'internals');
-  assert_exists(window, 'eventSender');
+  assert_own_property(window, 'internals');
+  assert_own_property(window, 'eventSender');
   setDateTimeFormat('HH:mm');
 
   assert_input_value_after_up('07:00', 1, '08:00');
@@ -208,8 +208,8 @@
 
 // Hours, 1-24
 test(() => {
-  assert_exists(window, 'internals');
-  assert_exists(window, 'eventSender');
+  assert_own_property(window, 'internals');
+  assert_own_property(window, 'eventSender');
   setDateTimeFormat('kk:mm');
 
   assert_input_value_after_up('11:00', 1, '12:00', '12:00');
diff --git a/third_party/WebKit/LayoutTests/fast/forms/validation-bubble-update.html b/third_party/WebKit/LayoutTests/fast/forms/validation-bubble-update.html
index 1e94fc6..cd0a737 100644
--- a/third_party/WebKit/LayoutTests/fast/forms/validation-bubble-update.html
+++ b/third_party/WebKit/LayoutTests/fast/forms/validation-bubble-update.html
@@ -6,7 +6,7 @@
 var t = async_test('Ensure that adding an OPTION to a SELECT element closes a validation bubble.');
 var select = document.querySelector('select');
 t.step(() => {
-  assert_exists(window, 'internals');
+  assert_own_property(window, 'internals');
   select.reportValidity();
   assert_true(internals.isValidationMessageVisible(select));
   select.appendChild(new Option('value'));
diff --git a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCRtpSender-getParameters.html b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCRtpSender-getParameters.html
index c88c8603..823f5ed 100644
--- a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCRtpSender-getParameters.html
+++ b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCRtpSender-getParameters.html
@@ -54,45 +54,45 @@
 }
 
 function verifySenderParameters(parameters, kind) {
-  assert_exists(parameters, "transactionId", "transactionId");
-  assert_exists(parameters, "rtcp", "rtcp");
+  assert_own_property(parameters, "transactionId", "transactionId");
+  assert_own_property(parameters, "rtcp", "rtcp");
 
   assert_greater_than(parameters.codecs.length, 0);
   for(let codec of parameters.codecs) {
     if(kind === 'video') {
-      assert_not_exists(codec, "channels", "no channels on video tracks");
+      assert_false(codec.hasOwnProperty("channels"), "no channels on video tracks");
       assert_equals(codec.clockRate, 90000);
     } else {
-      assert_exists(codec, "channels", "channel count");
+      assert_own_property(codec, "channels", "channel count");
       assert_greater_than(codec.clockRate, 0);
     }
 
-    assert_exists(codec, "mimeType", "mime type");
+    assert_own_property(codec, "mimeType", "mime type");
     assert_true(codec.mimeType.startsWith(kind + "/"));
 
-    assert_exists(codec, "payloadType", "payload type");
+    assert_own_property(codec, "payloadType", "payload type");
   }
 
-  assert_exists(parameters, "headerExtensions", "headerExtension");
+  assert_own_property(parameters, "headerExtensions", "headerExtension");
   for(let header of parameters.headerExtensions) {
-    assert_exists(header, "uri");
-    assert_exists(header, "id");
+    assert_own_property(header, "uri");
+    assert_own_property(header, "id");
   }
 
   assert_greater_than(parameters.encodings.length, 0);
   for(let encoding of parameters.encodings) {
-    assert_not_exists(encoding, "codecPayloadType", "unset codecPayloadType");
-    assert_not_exists(encoding, "dtx", "unset dtx");
+    assert_false(encoding.hasOwnProperty("codecPayloadType"), "unset codecPayloadType");
+    assert_false(encoding.hasOwnProperty("dtx"), "unset dtx");
     assert_true(encoding.active);
     assert_equals(encoding.priority, "low");
-    assert_not_exists(encoding, "ptime", "unset ptime");
-    assert_not_exists(encoding, "maxBitrate", "unset maxBitrate");
-    assert_not_exists(encoding, "maxFramerate", "unset maxFramerate");
-    assert_not_exists(encoding, "scaleResolutionDownBy", "unset scaleResolutionDownBy");
-    assert_not_exists(encoding, "rid", "unset rid");
+    assert_false(encoding.hasOwnProperty("ptime"), "unset ptime");
+    assert_false(encoding.hasOwnProperty("maxBitrate"), "unset maxBitrate");
+    assert_false(encoding.hasOwnProperty("maxFramerate"), "unset maxFramerate");
+    assert_false(encoding.hasOwnProperty("scaleResolutionDownBy"), "unset scaleResolutionDownBy");
+    assert_false(encoding.hasOwnProperty("rid"), "unset rid");
   }
 
-  assert_not_exists(parameters, "degradationPreference", "unimplemented degradationPreference");
+  assert_false(parameters.hasOwnProperty("degradationPreference"), "unimplemented degradationPreference");
 }
 </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/fast/scrolling/hover-during-scroll.html b/third_party/WebKit/LayoutTests/fast/scrolling/hover-during-scroll.html
index 16242c7..9a555143 100644
--- a/third_party/WebKit/LayoutTests/fast/scrolling/hover-during-scroll.html
+++ b/third_party/WebKit/LayoutTests/fast/scrolling/hover-during-scroll.html
@@ -68,12 +68,14 @@
       let y = centerOfDivAtIndex(0);
       // Move cursor to 1st element.
       await mouseMoveTo(x, y);
+      await waitFor( () => { return array[0].innerHTML == textWhenHovered;}, 'wait for move to 1st element');
       assert_equals(array[0].innerHTML, textWhenHovered);
       assert_equals(array[1].innerHTML, textWhenNotHovered);
 
       // Move cursor to 2nd element.
       y = centerOfDivAtIndex(1);
       await mouseMoveTo(x, y);
+      await waitFor( () => { return array[1].innerHTML == textWhenHovered;}, 'wait for move to 2nd element');
       assert_equals(array[0].innerHTML, textWhenWasHovered);
       assert_equals(array[1].innerHTML, textWhenHovered);
       assert_equals(array[2].innerHTML, textWhenNotHovered);
@@ -88,12 +90,15 @@
       assert_equals(array[2].innerHTML, textWhenNotHovered);
       assert_equals(array[3].innerHTML, textWhenHovered);
       assert_equals(array[4].innerHTML, textWhenNotHovered);
-      assert_equals(document.scrollingElement.scrollTop, 2 * elementHeight);
+      assert_approx_equals(document.scrollingElement.scrollTop, 2 * elementHeight, 2);
 
       // Hide cursor and scroll end up at 5th element. No hover state should update.
       internals.setIsCursorVisible(document, false);
-      await smoothScroll(elementHeight, x, y, mouse, 'down', SPEED_INSTANT);
-      await waitFor( () => { return document.scrollingElement.scrollTop == 3 * elementHeight;}, 'wait for scroll stop at 5th element');
+      await smoothScroll(elementHeight, x, y, mouse, 'down', SPEED_INSTANT, true /* precise_scrolling_deltas */, false /* scroll_by_page */, false /* cursor_visible */);
+      await waitFor( () => {
+        return document.scrollingElement.scrollTop >= 3 * elementHeight - 10 && document.scrollingElement.scrollTop <= 3 * elementHeight + 10;}, 'wait for scroll stop at 5th element');
+      // Wait enough time to see if we fire a fake mouse move event to update the hover state.
+      await waitForAnimationEnd(() => { return document.scrollingElement.scrollTop; }, 200, 60);
       assert_equals(array[0].innerHTML, textWhenWasHovered);
       assert_equals(array[1].innerHTML, textWhenWasHovered);
       assert_equals(array[2].innerHTML, textWhenNotHovered);
diff --git a/third_party/WebKit/LayoutTests/fast/text/hyphens/can-hyphenate-locale.html b/third_party/WebKit/LayoutTests/fast/text/hyphens/can-hyphenate-locale.html
index 04e0a1563..ffebacb9 100644
--- a/third_party/WebKit/LayoutTests/fast/text/hyphens/can-hyphenate-locale.html
+++ b/third_party/WebKit/LayoutTests/fast/text/hyphens/can-hyphenate-locale.html
@@ -5,7 +5,7 @@
 'use strict';
 (function () {
   test(function () {
-    assert_exists(window, 'internals');
+    assert_own_property(window, 'internals');
   }, 'This test requires "internals.canHyphenate"');
 
   ['en-us', 'en-gu'].forEach(function (locale) {
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/squashing/vertical-writing-mode-squashed-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/squashing/vertical-writing-mode-squashed-expected.txt
deleted file mode 100644
index 9256734..0000000
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/compositing/squashing/vertical-writing-mode-squashed-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x416
-  LayoutNGBlockFlow {HTML} at (0,0) size 800x416
-    LayoutNGBlockFlow {BODY} at (8,8) size 784x400
-layer at (8,8) size 400x400 clip at (8,8) size 400x385 scrollX 9640.00 scrollWidth 10040
-  LayoutNGBlockFlow {DIV} at (0,0) size 400x400
-    LayoutNGBlockFlow {DIV} at (40,0) size 10000x200 [bgcolor=#FFFF00]
-layer at (368,8) size 40x385
-  LayoutNGBlockFlow (relative positioned) {DIV} at (0,0) size 40x385
-    LayoutNGBlockFlow (anonymous) at (0,0) size 20x385
-      LayoutText {#text} at (1,0) size 19x63
-        text run at (1,0) width 63: "Some text"
-    LayoutNGBlockFlow {DIV} at (20,0) size 20x385
-      LayoutText {#text} at (0,0) size 0x0
-layer at (368,8) size 19x262
-  LayoutInline (relative positioned) {A} at (0,0) size 19x262
-    LayoutText {#text} at (1,0) size 19x262
-      text run at (1,0) width 262: "This text should not overlap the other text"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-expected.txt
index 8df91ef..4e97cb85 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-expected.txt
@@ -18,13 +18,13 @@
         text run at (179,394) width 4: " "
       LayoutNGBlockFlow {DIV} at (183,230) size 452x179 [border: (1px solid #000000)]
         LayoutInline {SPAN} at (0,0) size 418x177 [bgcolor=#808080] [border: (2px solid #000000)]
-          LayoutText {#text} at (319,3) size 114x50
-            text run at (319,3) width 50: "  "
-          LayoutBR {BR} at (319,53) size 114x0
+          LayoutText {#text} at (19,3) size 114x50
+            text run at (19,3) width 50: "  "
+          LayoutBR {BR} at (19,53) size 114x0
           LayoutText {#text} at (169,1) size 114x125
             text run at (169,1) width 125: "     "
           LayoutBR {BR} at (169,126) size 114x0
-          LayoutText {#text} at (19,1) size 114x175
-            text run at (19,1) width 175: "       "
+          LayoutText {#text} at (319,1) size 114x175
+            text run at (319,1) width 175: "       "
         LayoutText {#text} at (0,0) size 0x0
       LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-image-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-image-expected.txt
index dd55d62..e0a1407 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-image-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/backgrounds/border-radius-split-background-image-expected.txt
@@ -18,13 +18,13 @@
         text run at (179,394) width 4: " "
       LayoutNGBlockFlow {DIV} at (183,230) size 452x179 [border: (1px solid #000000)]
         LayoutInline {SPAN} at (0,0) size 418x177 [bgcolor=#C0C0C0] [border: (2px solid #000000)]
-          LayoutText {#text} at (319,3) size 114x50
-            text run at (319,3) width 50: "  "
-          LayoutBR {BR} at (319,53) size 114x0
+          LayoutText {#text} at (19,3) size 114x50
+            text run at (19,3) width 50: "  "
+          LayoutBR {BR} at (19,53) size 114x0
           LayoutText {#text} at (169,1) size 114x125
             text run at (169,1) width 125: "     "
           LayoutBR {BR} at (169,126) size 114x0
-          LayoutText {#text} at (19,1) size 114x175
-            text run at (19,1) width 175: "       "
+          LayoutText {#text} at (319,1) size 114x175
+            text run at (319,1) width 175: "       "
         LayoutText {#text} at (0,0) size 0x0
       LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/h1-in-section-elements-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/h1-in-section-elements-expected.txt
deleted file mode 100644
index baf32fc..0000000
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/h1-in-section-elements-expected.txt
+++ /dev/null
@@ -1,216 +0,0 @@
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x417
-  LayoutNGBlockFlow {HTML} at (0,0) size 800x417
-    LayoutNGBlockFlow {BODY} at (8,16) size 784x188
-      LayoutNGBlockFlow {P} at (0,0) size 784x20
-        LayoutText {#text} at (0,0) size 439x19
-          text run at (0,0) width 439: "For each of pairs, the first one and the second one should be identical."
-      LayoutTable (floating) {TABLE} at (0,36) size 152x365
-        LayoutTableSection {TBODY} at (0,0) size 152x365
-          LayoutTableRow {TR} at (0,2) size 152x75
-            LayoutNGTableCell {TD} at (2,2) size 73x74.81 [r=0 c=0 rs=1 cs=1]
-              LayoutNGBlockFlow {SECTION} at (1,1) size 71x72.81
-                LayoutNGBlockFlow {H1} at (0,21.91) size 71x29 [border: (1px solid #00FF00)]
-                  LayoutText {#text} at (1,1) size 69x26
-                    text run at (1,1) width 69: "MMM"
-            LayoutNGTableCell {TD} at (77,2) size 73x74.81 [r=0 c=1 rs=1 cs=1]
-              LayoutNGBlockFlow {H2} at (1,22.91) size 71x29 [border: (1px solid #00FF00)]
-                LayoutText {#text} at (1,1) size 69x26
-                  text run at (1,1) width 69: "MMM"
-          LayoutTableRow {TR} at (0,79) size 152x68
-            LayoutNGTableCell {TD} at (2,79) size 73x68.44 [r=1 c=0 rs=1 cs=1]
-              LayoutNGBlockFlow {ARTICLE} at (1,1) size 71x66.44
-                LayoutNGBlockFlow {SECTION} at (0,0) size 71x66.44
-                  LayoutNGBlockFlow {H1} at (0,20.72) size 71x25 [border: (1px solid #00FF00)]
-                    LayoutText {#text} at (1,1) size 54x22
-                      text run at (1,1) width 54: "MMM"
-            LayoutNGTableCell {TD} at (77,79) size 73x68.44 [r=1 c=1 rs=1 cs=1]
-              LayoutNGBlockFlow {H3} at (1,21.72) size 71x25 [border: (1px solid #00FF00)]
-                LayoutText {#text} at (1,1) size 54x22
-                  text run at (1,1) width 54: "MMM"
-          LayoutTableRow {TR} at (0,149) size 152x71
-            LayoutNGTableCell {TD} at (2,149) size 73x70.53 [r=2 c=0 rs=1 cs=1]
-              LayoutNGBlockFlow {NAV} at (1,1) size 71x68.53
-                LayoutNGBlockFlow {ARTICLE} at (0,0) size 71x68.53
-                  LayoutNGBlockFlow {SECTION} at (0,0) size 71x68.53
-                    LayoutNGBlockFlow {H1} at (0,23.27) size 71x22 [border: (1px solid #00FF00)]
-                      LayoutText {#text} at (1,1) size 45x19
-                        text run at (1,1) width 45: "MMM"
-            LayoutNGTableCell {TD} at (77,149) size 73x70.53 [r=2 c=1 rs=1 cs=1]
-              LayoutNGBlockFlow {H4} at (1,24.27) size 71x22 [border: (1px solid #00FF00)]
-                LayoutText {#text} at (1,1) size 45x19
-                  text run at (1,1) width 45: "MMM"
-          LayoutTableRow {TR} at (0,222) size 152x68
-            LayoutNGTableCell {TD} at (2,222) size 73x68.34 [r=3 c=0 rs=1 cs=1]
-              LayoutNGBlockFlow {NAV} at (1,1) size 71x66.34
-                LayoutNGBlockFlow {ASIDE} at (0,0) size 71x66.34
-                  LayoutNGBlockFlow {ARTICLE} at (0,0) size 71x66.34
-                    LayoutNGBlockFlow {SECTION} at (0,0) size 71x66.34
-                      LayoutNGBlockFlow {H1} at (0,24.17) size 71x18 [border: (1px solid #00FF00)]
-                        LayoutText {#text} at (1,1) size 36x15
-                          text run at (1,1) width 36: "MMM"
-            LayoutNGTableCell {TD} at (77,222) size 73x68.34 [r=3 c=1 rs=1 cs=1]
-              LayoutNGBlockFlow {H5} at (1,25.17) size 71x18 [border: (1px solid #00FF00)]
-                LayoutText {#text} at (1,1) size 36x15
-                  text run at (1,1) width 36: "MMM"
-          LayoutTableRow {TR} at (0,292) size 152x71
-            LayoutNGTableCell {TD} at (2,292) size 73x70.94 [r=4 c=0 rs=1 cs=1]
-              LayoutNGBlockFlow {SECTION} at (1,1) size 71x68.94
-                LayoutNGBlockFlow {DIV} at (0,0) size 71x68.94
-                  LayoutNGBlockFlow {NAV} at (0,0) size 71x68.94
-                    LayoutNGBlockFlow {ASIDE} at (0,0) size 71x68.94
-                      LayoutNGBlockFlow {ARTICLE} at (0,0) size 71x68.94
-                        LayoutNGBlockFlow {SECTION} at (0,0) size 71x68.94
-                          LayoutNGBlockFlow {H1} at (0,26.97) size 71x15 [border: (1px solid #00FF00)]
-                            LayoutText {#text} at (1,1) size 30x13
-                              text run at (1,1) width 30: "MMM"
-                  LayoutNGBlockFlow {DIV} at (0,68.94) size 71x0
-            LayoutNGTableCell {TD} at (77,292) size 73x70.94 [r=4 c=1 rs=1 cs=1]
-              LayoutNGBlockFlow {H6} at (1,27.97) size 71x15 [border: (1px solid #00FF00)]
-                LayoutText {#text} at (1,1) size 30x13
-                  text run at (1,1) width 30: "MMM"
-      LayoutTable {TABLE} at (152,36) size 365x152
-        LayoutTableSection {TBODY} at (0,0) size 365x152
-          LayoutTableRow {TR} at (2,0) size 75x152
-            LayoutNGTableCell {TD} at (2,2) size 74.81x73 [r=0 c=0 rs=1 cs=1]
-              LayoutNGBlockFlow {SECTION} at (1,1) size 72.81x71
-                LayoutNGBlockFlow {H1} at (21.91,0) size 29x71 [border: (1px solid #00FF00)]
-                  LayoutText {#text} at (2,1) size 26x69
-                    text run at (2,1) width 69: "MMM"
-            LayoutNGTableCell {TD} at (2,77) size 74.81x73 [r=0 c=1 rs=1 cs=1]
-              LayoutNGBlockFlow {H2} at (22.91,1) size 29x71 [border: (1px solid #00FF00)]
-                LayoutText {#text} at (2,1) size 26x69
-                  text run at (2,1) width 69: "MMM"
-          LayoutTableRow {TR} at (79,0) size 68x152
-            LayoutNGTableCell {TD} at (79,2) size 68.44x73 [r=1 c=0 rs=1 cs=1]
-              LayoutNGBlockFlow {ARTICLE} at (1,1) size 66.44x71
-                LayoutNGBlockFlow {SECTION} at (0,0) size 66.44x71
-                  LayoutNGBlockFlow {H1} at (20.72,0) size 25x71 [border: (1px solid #00FF00)]
-                    LayoutText {#text} at (2,1) size 22x54
-                      text run at (2,1) width 54: "MMM"
-            LayoutNGTableCell {TD} at (79,77) size 68.44x73 [r=1 c=1 rs=1 cs=1]
-              LayoutNGBlockFlow {H3} at (21.72,1) size 25x71 [border: (1px solid #00FF00)]
-                LayoutText {#text} at (2,1) size 22x54
-                  text run at (2,1) width 54: "MMM"
-          LayoutTableRow {TR} at (149,0) size 71x152
-            LayoutNGTableCell {TD} at (149,2) size 70.53x73 [r=2 c=0 rs=1 cs=1]
-              LayoutNGBlockFlow {NAV} at (1,1) size 68.53x71
-                LayoutNGBlockFlow {ARTICLE} at (0,0) size 68.53x71
-                  LayoutNGBlockFlow {SECTION} at (0,0) size 68.53x71
-                    LayoutNGBlockFlow {H1} at (23.27,0) size 22x71 [border: (1px solid #00FF00)]
-                      LayoutText {#text} at (2,1) size 19x45
-                        text run at (2,1) width 45: "MMM"
-            LayoutNGTableCell {TD} at (149,77) size 70.53x73 [r=2 c=1 rs=1 cs=1]
-              LayoutNGBlockFlow {H4} at (24.27,1) size 22x71 [border: (1px solid #00FF00)]
-                LayoutText {#text} at (2,1) size 19x45
-                  text run at (2,1) width 45: "MMM"
-          LayoutTableRow {TR} at (222,0) size 68x152
-            LayoutNGTableCell {TD} at (222,2) size 68.34x73 [r=3 c=0 rs=1 cs=1]
-              LayoutNGBlockFlow {NAV} at (1,1) size 66.34x71
-                LayoutNGBlockFlow {ASIDE} at (0,0) size 66.34x71
-                  LayoutNGBlockFlow {ARTICLE} at (0,0) size 66.34x71
-                    LayoutNGBlockFlow {SECTION} at (0,0) size 66.34x71
-                      LayoutNGBlockFlow {H1} at (24.17,0) size 18x71 [border: (1px solid #00FF00)]
-                        LayoutText {#text} at (2,1) size 15x36
-                          text run at (2,1) width 36: "MMM"
-            LayoutNGTableCell {TD} at (222,77) size 68.34x73 [r=3 c=1 rs=1 cs=1]
-              LayoutNGBlockFlow {H5} at (25.17,1) size 18x71 [border: (1px solid #00FF00)]
-                LayoutText {#text} at (2,1) size 15x36
-                  text run at (2,1) width 36: "MMM"
-          LayoutTableRow {TR} at (292,0) size 71x152
-            LayoutNGTableCell {TD} at (292,2) size 70.94x73 [r=4 c=0 rs=1 cs=1]
-              LayoutNGBlockFlow {SECTION} at (1,1) size 68.94x71
-                LayoutNGBlockFlow {DIV} at (0,0) size 68.94x71
-                  LayoutNGBlockFlow {NAV} at (0,0) size 68.94x71
-                    LayoutNGBlockFlow {ASIDE} at (0,0) size 68.94x71
-                      LayoutNGBlockFlow {ARTICLE} at (0,0) size 68.94x71
-                        LayoutNGBlockFlow {SECTION} at (0,0) size 68.94x71
-                          LayoutNGBlockFlow {H1} at (26.97,0) size 15x71 [border: (1px solid #00FF00)]
-                            LayoutText {#text} at (1,1) size 13x30
-                              text run at (1,1) width 30: "MMM"
-                  LayoutNGBlockFlow {DIV} at (68.94,0) size 0x71
-            LayoutNGTableCell {TD} at (292,77) size 70.94x73 [r=4 c=1 rs=1 cs=1]
-              LayoutNGBlockFlow {H6} at (27.97,1) size 15x71 [border: (1px solid #00FF00)]
-                LayoutText {#text} at (1,1) size 13x30
-                  text run at (1,1) width 30: "MMM"
-layer at (11,55) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,0) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (11,126) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,70.81) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (86,55) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,1) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (86,126) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,71.81) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (11,132) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,0) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (11,196) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,64.44) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (86,132) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,1) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (86,196) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,65.44) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (11,202) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,0) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (11,269) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,66.53) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (86,202) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,1) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (86,269) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,67.53) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (11,275) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,0) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (11,339) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,64.34) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (86,275) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,1) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (86,339) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,65.34) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (11,345) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,0) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (11,412) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,66.94) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (86,345) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,1) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (86,412) size 71x2 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,67.94) size 71x2 [border: (1px inset #EEEEEE)]
-layer at (520,55) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,0) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (449,55) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (70.81,0) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (520,130) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,1) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (449,130) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (71.81,1) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (443,55) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,0) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (379,55) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (64.44,0) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (443,130) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,1) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (379,130) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (65.44,1) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (373,55) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,0) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (306,55) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (66.53,0) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (373,130) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,1) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (306,130) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (67.53,1) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (300,55) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,0) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (236,55) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (64.34,0) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (300,130) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,1) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (236,130) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (65.34,1) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (230,55) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (0,0) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (163,55) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (66.94,0) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (230,130) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (1,1) size 2x71 [border: (1px inset #EEEEEE)]
-layer at (163,130) size 2x71 clip at (0,0) size 0x0
-  LayoutNGBlockFlow {HR} at (67.94,1) size 2x71 [border: (1px inset #EEEEEE)]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt
index 0641ab6..fe86ba4 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt
@@ -29,77 +29,77 @@
           text run at (0,0) width 507: "Right-To-Left containing replaced content blocking the ellipsis"
 layer at (8,50) size 22x310 clip at (9,51) size 20x308 scrollHeight 718
   LayoutNGBlockFlow {DIV} at (0,41.72) size 22x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x303
-      text run at (2,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (2,288) width 16: "\x{2026}"
+    LayoutText {#text} at (1,1) size 19x303
+      text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,288) width 16: "\x{2026}"
 layer at (8,421) size 82x310 backgroundClip at (8,421) size 82x179 clip at (9,422) size 80x178 scrollHeight 718
   LayoutNGBlockFlow {DIV} at (0,413.44) size 82x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (62,1) size 19x303
-      text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (62,288) width 16: "\x{2026}"
+    LayoutText {#text} at (1,1) size 19x303
+      text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,288) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (42,1) size 19x306
-      text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
-      text run at (42,291) width 16: "\x{2026}"
+    LayoutText {#text} at (21,1) size 19x306
+      text run at (21,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
+      text run at (21,291) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (22,1) size 19x302
-      text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
-      text run at (22,287) width 16: "\x{2026}"
+    LayoutText {#text} at (41,1) size 19x302
+      text run at (41,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
+      text run at (41,287) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (2,1) size 19x305
-      text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
-      text run at (2,290) width 16: "\x{2026}"
+    LayoutText {#text} at (61,1) size 19x305
+      text run at (61,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
+      text run at (61,290) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747
   LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x181
-      text run at (2,1) width 181: "Lorem ipsum dolor sit amet, "
+    LayoutText {#text} at (11,1) size 19x181
+      text run at (11,1) width 181: "Lorem ipsum dolor sit amet, "
     LayoutImage {IMG} at (1,182) size 25x25
-    LayoutText {#text} at (2,207) size 19x102
-      text run at (2,207) width 86: " consectetur a"
-      text run at (2,293) width 16: "\x{2026}"
+    LayoutText {#text} at (11,207) size 19x102
+      text run at (11,207) width 86: " consectetur a"
+      text run at (11,293) width 16: "\x{2026}"
 layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 743
   LayoutNGBlockFlow {DIV} at (0,1156.88) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x287
-      text run at (2,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
-      text run at (2,272) width 16: "\x{2026}"
+    LayoutText {#text} at (11,1) size 19x287
+      text run at (11,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
+      text run at (11,272) width 16: "\x{2026}"
     LayoutImage {IMG} at (0,0) size 25x25
     LayoutText {#text} at (0,0) size 0x0
 layer at (8,1537) size 22x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1528.59) size 22x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,22) size 19x303
-      text run at (2,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (2,6) width 16: "\x{2026}"
+    LayoutText {#text} at (1,22) size 19x303
+      text run at (1,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,6) width 16: "\x{2026}"
 layer at (8,1908) size 82x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1900.31) size 82x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (62,22) size 19x303
-      text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (62,6) width 16: "\x{2026}"
+    LayoutText {#text} at (1,22) size 19x303
+      text run at (1,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,6) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (42,19) size 19x306
-      text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
-      text run at (42,3) width 16: "\x{2026}"
+    LayoutText {#text} at (21,19) size 19x306
+      text run at (21,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
+      text run at (21,3) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (22,23) size 19x302
-      text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
-      text run at (22,7) width 16: "\x{2026}"
+    LayoutText {#text} at (41,23) size 19x302
+      text run at (41,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
+      text run at (41,7) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (2,20) size 19x305
-      text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
-      text run at (2,4) width 16: "\x{2026}"
+    LayoutText {#text} at (61,20) size 19x305
+      text run at (61,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
+      text run at (61,4) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748
   LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,128) size 19x181
-      text run at (2,128) width 181: "Lorem ipsum dolor sit amet, "
+    LayoutText {#text} at (11,128) size 19x181
+      text run at (11,128) width 181: "Lorem ipsum dolor sit amet, "
     LayoutImage {IMG} at (1,103) size 25x25
-    LayoutText {#text} at (2,17) size 19x102
-      text run at (2,17) width 86: " consectetur a"
-      text run at (2,1) width 16: "\x{2026}"
+    LayoutText {#text} at (11,17) size 19x102
+      text run at (11,17) width 86: " consectetur a"
+      text run at (11,1) width 16: "\x{2026}"
 layer at (8,2652) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 436.00 scrollHeight 744
   LayoutNGBlockFlow {DIV} at (0,2643.75) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,38) size 19x287
-      text run at (2,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
-      text run at (2,22) width 16: "\x{2026}"
+    LayoutText {#text} at (11,38) size 19x287
+      text run at (11,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
+      text run at (11,22) width 16: "\x{2026}"
     LayoutImage {IMG} at (0,0) size 25x25
     LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt
index 0641ab6..fe86ba4 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt
@@ -29,77 +29,77 @@
           text run at (0,0) width 507: "Right-To-Left containing replaced content blocking the ellipsis"
 layer at (8,50) size 22x310 clip at (9,51) size 20x308 scrollHeight 718
   LayoutNGBlockFlow {DIV} at (0,41.72) size 22x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x303
-      text run at (2,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (2,288) width 16: "\x{2026}"
+    LayoutText {#text} at (1,1) size 19x303
+      text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,288) width 16: "\x{2026}"
 layer at (8,421) size 82x310 backgroundClip at (8,421) size 82x179 clip at (9,422) size 80x178 scrollHeight 718
   LayoutNGBlockFlow {DIV} at (0,413.44) size 82x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (62,1) size 19x303
-      text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (62,288) width 16: "\x{2026}"
+    LayoutText {#text} at (1,1) size 19x303
+      text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,288) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (42,1) size 19x306
-      text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
-      text run at (42,291) width 16: "\x{2026}"
+    LayoutText {#text} at (21,1) size 19x306
+      text run at (21,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
+      text run at (21,291) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (22,1) size 19x302
-      text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
-      text run at (22,287) width 16: "\x{2026}"
+    LayoutText {#text} at (41,1) size 19x302
+      text run at (41,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
+      text run at (41,287) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (2,1) size 19x305
-      text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
-      text run at (2,290) width 16: "\x{2026}"
+    LayoutText {#text} at (61,1) size 19x305
+      text run at (61,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
+      text run at (61,290) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747
   LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x181
-      text run at (2,1) width 181: "Lorem ipsum dolor sit amet, "
+    LayoutText {#text} at (11,1) size 19x181
+      text run at (11,1) width 181: "Lorem ipsum dolor sit amet, "
     LayoutImage {IMG} at (1,182) size 25x25
-    LayoutText {#text} at (2,207) size 19x102
-      text run at (2,207) width 86: " consectetur a"
-      text run at (2,293) width 16: "\x{2026}"
+    LayoutText {#text} at (11,207) size 19x102
+      text run at (11,207) width 86: " consectetur a"
+      text run at (11,293) width 16: "\x{2026}"
 layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 743
   LayoutNGBlockFlow {DIV} at (0,1156.88) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x287
-      text run at (2,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
-      text run at (2,272) width 16: "\x{2026}"
+    LayoutText {#text} at (11,1) size 19x287
+      text run at (11,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
+      text run at (11,272) width 16: "\x{2026}"
     LayoutImage {IMG} at (0,0) size 25x25
     LayoutText {#text} at (0,0) size 0x0
 layer at (8,1537) size 22x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1528.59) size 22x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,22) size 19x303
-      text run at (2,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (2,6) width 16: "\x{2026}"
+    LayoutText {#text} at (1,22) size 19x303
+      text run at (1,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,6) width 16: "\x{2026}"
 layer at (8,1908) size 82x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1900.31) size 82x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (62,22) size 19x303
-      text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (62,6) width 16: "\x{2026}"
+    LayoutText {#text} at (1,22) size 19x303
+      text run at (1,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,6) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (42,19) size 19x306
-      text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
-      text run at (42,3) width 16: "\x{2026}"
+    LayoutText {#text} at (21,19) size 19x306
+      text run at (21,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
+      text run at (21,3) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (22,23) size 19x302
-      text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
-      text run at (22,7) width 16: "\x{2026}"
+    LayoutText {#text} at (41,23) size 19x302
+      text run at (41,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
+      text run at (41,7) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (2,20) size 19x305
-      text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
-      text run at (2,4) width 16: "\x{2026}"
+    LayoutText {#text} at (61,20) size 19x305
+      text run at (61,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
+      text run at (61,4) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748
   LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,128) size 19x181
-      text run at (2,128) width 181: "Lorem ipsum dolor sit amet, "
+    LayoutText {#text} at (11,128) size 19x181
+      text run at (11,128) width 181: "Lorem ipsum dolor sit amet, "
     LayoutImage {IMG} at (1,103) size 25x25
-    LayoutText {#text} at (2,17) size 19x102
-      text run at (2,17) width 86: " consectetur a"
-      text run at (2,1) width 16: "\x{2026}"
+    LayoutText {#text} at (11,17) size 19x102
+      text run at (11,17) width 86: " consectetur a"
+      text run at (11,1) width 16: "\x{2026}"
 layer at (8,2652) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 436.00 scrollHeight 744
   LayoutNGBlockFlow {DIV} at (0,2643.75) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,38) size 19x287
-      text run at (2,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
-      text run at (2,22) width 16: "\x{2026}"
+    LayoutText {#text} at (11,38) size 19x287
+      text run at (11,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
+      text run at (11,22) width 16: "\x{2026}"
     LayoutImage {IMG} at (0,0) size 25x25
     LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt
index 0641ab6..fe86ba4 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt
@@ -29,77 +29,77 @@
           text run at (0,0) width 507: "Right-To-Left containing replaced content blocking the ellipsis"
 layer at (8,50) size 22x310 clip at (9,51) size 20x308 scrollHeight 718
   LayoutNGBlockFlow {DIV} at (0,41.72) size 22x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x303
-      text run at (2,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (2,288) width 16: "\x{2026}"
+    LayoutText {#text} at (1,1) size 19x303
+      text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,288) width 16: "\x{2026}"
 layer at (8,421) size 82x310 backgroundClip at (8,421) size 82x179 clip at (9,422) size 80x178 scrollHeight 718
   LayoutNGBlockFlow {DIV} at (0,413.44) size 82x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (62,1) size 19x303
-      text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (62,288) width 16: "\x{2026}"
+    LayoutText {#text} at (1,1) size 19x303
+      text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,288) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (42,1) size 19x306
-      text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
-      text run at (42,291) width 16: "\x{2026}"
+    LayoutText {#text} at (21,1) size 19x306
+      text run at (21,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
+      text run at (21,291) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (22,1) size 19x302
-      text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
-      text run at (22,287) width 16: "\x{2026}"
+    LayoutText {#text} at (41,1) size 19x302
+      text run at (41,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
+      text run at (41,287) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (2,1) size 19x305
-      text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
-      text run at (2,290) width 16: "\x{2026}"
+    LayoutText {#text} at (61,1) size 19x305
+      text run at (61,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
+      text run at (61,290) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747
   LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x181
-      text run at (2,1) width 181: "Lorem ipsum dolor sit amet, "
+    LayoutText {#text} at (11,1) size 19x181
+      text run at (11,1) width 181: "Lorem ipsum dolor sit amet, "
     LayoutImage {IMG} at (1,182) size 25x25
-    LayoutText {#text} at (2,207) size 19x102
-      text run at (2,207) width 86: " consectetur a"
-      text run at (2,293) width 16: "\x{2026}"
+    LayoutText {#text} at (11,207) size 19x102
+      text run at (11,207) width 86: " consectetur a"
+      text run at (11,293) width 16: "\x{2026}"
 layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 743
   LayoutNGBlockFlow {DIV} at (0,1156.88) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x287
-      text run at (2,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
-      text run at (2,272) width 16: "\x{2026}"
+    LayoutText {#text} at (11,1) size 19x287
+      text run at (11,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
+      text run at (11,272) width 16: "\x{2026}"
     LayoutImage {IMG} at (0,0) size 25x25
     LayoutText {#text} at (0,0) size 0x0
 layer at (8,1537) size 22x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1528.59) size 22x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,22) size 19x303
-      text run at (2,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (2,6) width 16: "\x{2026}"
+    LayoutText {#text} at (1,22) size 19x303
+      text run at (1,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,6) width 16: "\x{2026}"
 layer at (8,1908) size 82x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1900.31) size 82x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (62,22) size 19x303
-      text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (62,6) width 16: "\x{2026}"
+    LayoutText {#text} at (1,22) size 19x303
+      text run at (1,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,6) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (42,19) size 19x306
-      text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
-      text run at (42,3) width 16: "\x{2026}"
+    LayoutText {#text} at (21,19) size 19x306
+      text run at (21,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
+      text run at (21,3) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (22,23) size 19x302
-      text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
-      text run at (22,7) width 16: "\x{2026}"
+    LayoutText {#text} at (41,23) size 19x302
+      text run at (41,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
+      text run at (41,7) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (2,20) size 19x305
-      text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
-      text run at (2,4) width 16: "\x{2026}"
+    LayoutText {#text} at (61,20) size 19x305
+      text run at (61,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
+      text run at (61,4) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748
   LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,128) size 19x181
-      text run at (2,128) width 181: "Lorem ipsum dolor sit amet, "
+    LayoutText {#text} at (11,128) size 19x181
+      text run at (11,128) width 181: "Lorem ipsum dolor sit amet, "
     LayoutImage {IMG} at (1,103) size 25x25
-    LayoutText {#text} at (2,17) size 19x102
-      text run at (2,17) width 86: " consectetur a"
-      text run at (2,1) width 16: "\x{2026}"
+    LayoutText {#text} at (11,17) size 19x102
+      text run at (11,17) width 86: " consectetur a"
+      text run at (11,1) width 16: "\x{2026}"
 layer at (8,2652) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 436.00 scrollHeight 744
   LayoutNGBlockFlow {DIV} at (0,2643.75) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,38) size 19x287
-      text run at (2,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
-      text run at (2,22) width 16: "\x{2026}"
+    LayoutText {#text} at (11,38) size 19x287
+      text run at (11,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
+      text run at (11,22) width 16: "\x{2026}"
     LayoutImage {IMG} at (0,0) size 25x25
     LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt
index 0641ab6..fe86ba4 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt
@@ -29,77 +29,77 @@
           text run at (0,0) width 507: "Right-To-Left containing replaced content blocking the ellipsis"
 layer at (8,50) size 22x310 clip at (9,51) size 20x308 scrollHeight 718
   LayoutNGBlockFlow {DIV} at (0,41.72) size 22x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x303
-      text run at (2,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (2,288) width 16: "\x{2026}"
+    LayoutText {#text} at (1,1) size 19x303
+      text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,288) width 16: "\x{2026}"
 layer at (8,421) size 82x310 backgroundClip at (8,421) size 82x179 clip at (9,422) size 80x178 scrollHeight 718
   LayoutNGBlockFlow {DIV} at (0,413.44) size 82x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (62,1) size 19x303
-      text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (62,288) width 16: "\x{2026}"
+    LayoutText {#text} at (1,1) size 19x303
+      text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,288) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (42,1) size 19x306
-      text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
-      text run at (42,291) width 16: "\x{2026}"
+    LayoutText {#text} at (21,1) size 19x306
+      text run at (21,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
+      text run at (21,291) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (22,1) size 19x302
-      text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
-      text run at (22,287) width 16: "\x{2026}"
+    LayoutText {#text} at (41,1) size 19x302
+      text run at (41,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
+      text run at (41,287) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (2,1) size 19x305
-      text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
-      text run at (2,290) width 16: "\x{2026}"
+    LayoutText {#text} at (61,1) size 19x305
+      text run at (61,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
+      text run at (61,290) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747
   LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x181
-      text run at (2,1) width 181: "Lorem ipsum dolor sit amet, "
+    LayoutText {#text} at (11,1) size 19x181
+      text run at (11,1) width 181: "Lorem ipsum dolor sit amet, "
     LayoutImage {IMG} at (1,182) size 25x25
-    LayoutText {#text} at (2,207) size 19x102
-      text run at (2,207) width 86: " consectetur a"
-      text run at (2,293) width 16: "\x{2026}"
+    LayoutText {#text} at (11,207) size 19x102
+      text run at (11,207) width 86: " consectetur a"
+      text run at (11,293) width 16: "\x{2026}"
 layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 743
   LayoutNGBlockFlow {DIV} at (0,1156.88) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,1) size 19x287
-      text run at (2,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
-      text run at (2,272) width 16: "\x{2026}"
+    LayoutText {#text} at (11,1) size 19x287
+      text run at (11,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
+      text run at (11,272) width 16: "\x{2026}"
     LayoutImage {IMG} at (0,0) size 25x25
     LayoutText {#text} at (0,0) size 0x0
 layer at (8,1537) size 22x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1528.59) size 22x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,22) size 19x303
-      text run at (2,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (2,6) width 16: "\x{2026}"
+    LayoutText {#text} at (1,22) size 19x303
+      text run at (1,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,6) width 16: "\x{2026}"
 layer at (8,1908) size 82x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1900.31) size 82x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (62,22) size 19x303
-      text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
-      text run at (62,6) width 16: "\x{2026}"
+    LayoutText {#text} at (1,22) size 19x303
+      text run at (1,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
+      text run at (1,6) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (42,19) size 19x306
-      text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
-      text run at (42,3) width 16: "\x{2026}"
+    LayoutText {#text} at (21,19) size 19x306
+      text run at (21,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
+      text run at (21,3) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (22,23) size 19x302
-      text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
-      text run at (22,7) width 16: "\x{2026}"
+    LayoutText {#text} at (41,23) size 19x302
+      text run at (41,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
+      text run at (41,7) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
-    LayoutText {#text} at (2,20) size 19x305
-      text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
-      text run at (2,4) width 16: "\x{2026}"
+    LayoutText {#text} at (61,20) size 19x305
+      text run at (61,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
+      text run at (61,4) width 16: "\x{2026}"
     LayoutBR {BR} at (0,0) size 0x0
 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748
   LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,128) size 19x181
-      text run at (2,128) width 181: "Lorem ipsum dolor sit amet, "
+    LayoutText {#text} at (11,128) size 19x181
+      text run at (11,128) width 181: "Lorem ipsum dolor sit amet, "
     LayoutImage {IMG} at (1,103) size 25x25
-    LayoutText {#text} at (2,17) size 19x102
-      text run at (2,17) width 86: " consectetur a"
-      text run at (2,1) width 16: "\x{2026}"
+    LayoutText {#text} at (11,17) size 19x102
+      text run at (11,17) width 86: " consectetur a"
+      text run at (11,1) width 16: "\x{2026}"
 layer at (8,2652) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 436.00 scrollHeight 744
   LayoutNGBlockFlow {DIV} at (0,2643.75) size 32x310 [border: (1px solid #000000)]
-    LayoutText {#text} at (2,38) size 19x287
-      text run at (2,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
-      text run at (2,22) width 16: "\x{2026}"
+    LayoutText {#text} at (11,38) size 19x287
+      text run at (11,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
+      text run at (11,22) width 16: "\x{2026}"
     LayoutImage {IMG} at (0,0) size 25x25
     LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/details_summary/details-marker-style-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/details_summary/details-marker-style-expected.txt
index b4ba77cd..0ed1f5ad 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/details_summary/details-marker-style-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/html/details_summary/details-marker-style-expected.txt
@@ -13,8 +13,8 @@
         LayoutNGBlockFlow {DETAILS} at (0,0) size 118.83x183.42
           LayoutNGBlockFlow {SUMMARY} at (0,0) size 118.83x183.42
             LayoutDetailsMarker {DIV} at (0,0) size 111.83x79.83 [border: (8px solid #00FF00) (16px solid #00FF00) (24px solid #00FF00) (32px solid #00FF00)]: down
-            LayoutText {#text} at (1,89) size 27x95
-              text run at (1,89) width 94: "Summary"
+            LayoutText {#text} at (90,89) size 27x95
+              text run at (90,89) width 95: "Summary"
       LayoutNGBlockFlow {DIV} at (0,270.25) size 784x47
         LayoutNGBlockFlow {DETAILS} at (0,0) size 784x47
           LayoutNGBlockFlow {SUMMARY} at (0,0) size 784x47
@@ -25,5 +25,5 @@
         LayoutNGBlockFlow {DETAILS} at (0,0) size 71x143.59
           LayoutNGBlockFlow {SUMMARY} at (0,0) size 71x143.59
             LayoutDetailsMarker {DIV} at (0,0) size 64x40 [border: (8px solid #00FF00)]: down
-            LayoutText {#text} at (1,49) size 27x95
-              text run at (1,49) width 94: "Summary"
+            LayoutText {#text} at (43,49) size 27x95
+              text run at (43,49) width 94: "Summary"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-h-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-h-expected.txt
index 02b82e0..2eea07e 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-h-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/invalidation/text-emphasis-h-expected.txt
@@ -28,8 +28,8 @@
       LayoutText {#text} at (16,0) size 32x128
         text run at (16,0) width 128: "1111"
     LayoutNGBlockFlow {DIV} at (96,0) size 48x128
-      LayoutText {#text} at (0,0) size 32x128
-        text run at (0,0) width 128: "1111"
-    LayoutNGBlockFlow {DIV} at (144,0) size 48x128
       LayoutText {#text} at (16,0) size 32x128
         text run at (16,0) width 128: "1111"
+    LayoutNGBlockFlow {DIV} at (144,0) size 48x128
+      LayoutText {#text} at (0,0) size 32x128
+        text run at (0,0) width 128: "1111"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/image-writing-modes-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/image-writing-modes-expected.txt
index faa3a99..f705133 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/image-writing-modes-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/image-writing-modes-expected.txt
@@ -22,11 +22,11 @@
       LayoutNGBlockFlow (anonymous) at (0,420) size 769x100
         LayoutBR {BR} at (0,40) size 0x20
       LayoutNGBlockFlow {DIV} at (0,520) size 200x120
-        LayoutText {#text} at (140,0) size 20x60
-          text run at (140,0) width 60: "foo"
+        LayoutText {#text} at (40,0) size 20x60
+          text run at (40,0) width 60: "foo"
         LayoutImage {IMG} at (30,60) size 40x30
         LayoutImage {IMG} at (30,90) size 40x30
-        LayoutBR {BR} at (140,120) size 20x0
+        LayoutBR {BR} at (40,120) size 20x0
         LayoutImage {IMG} at (130,0) size 40x30
       LayoutNGBlockFlow (anonymous) at (0,640) size 769x100
         LayoutBR {BR} at (0,40) size 0x20
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-vertical-rl-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-vertical-rl-expected.txt
index cf9f5c2..2debec9 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-vertical-rl-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/selection/text-selection-newline-vertical-rl-expected.txt
@@ -4,8 +4,8 @@
   LayoutNGBlockFlow {HTML} at (0,0) size 800x48
     LayoutNGBlockFlow {BODY} at (8,8) size 784x32
       LayoutNGBlockFlow {DIV} at (0,0) size 32x32
-        LayoutText {#text} at (16,0) size 32x32
-          text run at (16,0) width 32: "xx"
-          text run at (0,0) width 16: "y"
+        LayoutText {#text} at (0,0) size 32x32
+          text run at (0,0) width 32: "xx"
+          text run at (16,0) width 16: "y"
 selection start: position 5 of child 0 {#text} of child 3 {DIV} of body
 selection end:   position 9 of child 0 {#text} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/test-inputs.js b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/test-inputs.js
index 776cc217..a2ec88e7 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/test-inputs.js
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/test-inputs.js
@@ -106,7 +106,7 @@
 
 // Verifies if |r| is the valid response to credentials.create(publicKey).
 function assertValidMakeCredentialResponse(r) {
-assert_equals(r.id, ID, 'id');
+    assert_equals(r.id, ID, 'id');
     assert_true(r.rawId instanceof ArrayBuffer);
     assert_array_equals(new Uint8Array(r.rawId),
         RAW_ID, "rawId returned is the same");
@@ -117,8 +117,8 @@
     assert_true(r.response.attestationObject instanceof ArrayBuffer);
     assert_array_equals(new Uint8Array(r.response.attestationObject),
         ATTESTATION_OBJECT, "attestationObject returned is the same");
-    assert_not_exists(r.response, 'authenticatorData');
-    assert_not_exists(r.response, 'signature');
+    assert_false('authenticatorData' in r.response);
+    assert_false('signature' in r.response);
 }
 
 // Verifies if |r| is the valid response to credentials.get(publicKey).
@@ -140,5 +140,5 @@
         AUTHENTICATOR_DATA, "authenticator_data returned is the same");
     assert_array_equals(new Uint8Array(r.response.signature),
         SIGNATURE, "signature returned is the same");
-    assert_not_exists(r.response, 'attestationObject');
+    assert_false('attestationObject' in r.response);
 }
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/resources/origintrials-worker.js b/third_party/WebKit/LayoutTests/http/tests/origin_trials/resources/origintrials-worker.js
index 59c0ecc..c5a420c6 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/resources/origintrials-worker.js
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/resources/origintrials-worker.js
@@ -34,12 +34,12 @@
   }, 'Accessing attribute should throw error in ' + worker_type + ' worker');
   test(() => {
     var testObject = self.internals.originTrialsTest();
-    assert_not_exists(testObject, 'normalAttribute');
+    assert_false('normalAttribute' in testObject);
     assert_equals(testObject.normalAttribute, undefined);
   }, 'Attribute should not exist in ' + worker_type + ' worker');
   test(() => {
     var testObject = self.internals.originTrialsTest();
-    assert_not_exists(testObject, 'CONSTANT');
+    assert_false('CONSTANT' in testObject);
     assert_equals(testObject.CONSTANT, undefined);
   }, 'Constant should not exist in ' + worker_type + ' worker');
   done();
@@ -53,7 +53,7 @@
   var worker_type = get_worker_type();
   test(() => {
     var testObject = self.internals.originTrialsTest();
-    assert_not_exists(testObject, 'impliedAttribute');
+    assert_false('impliedAttribute' in testObject);
     assert_equals(testObject.impliedAttribute, undefined);
   }, 'Implied attribute should not exist in ' + worker_type + ' worker');
   done();
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/resources/origintrials.js b/third_party/WebKit/LayoutTests/http/tests/origin_trials/resources/origintrials.js
index 8922492..c8acab4 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/resources/origintrials.js
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/resources/origintrials.js
@@ -17,7 +17,7 @@
 expect_dictionary_member = (dictionary_member_name) => {
   var testObject = internals.originTrialsTest();
   var dictionary = testObject.getDictionaryMethod();
-  assert_exists(dictionary, dictionary_member_name);
+  assert_own_property(dictionary, dictionary_member_name);
   assert_true(dictionary[dictionary_member_name],
     'Dictionary member ' + dictionary_member_name + ' should return boolean value');
 }
@@ -47,7 +47,7 @@
 expect_static_member = (member_name, get_value_func) => {
   var testObject = internals.originTrialsTest();
   var testInterface = testObject.constructor;
-  assert_exists(testInterface, member_name);
+  assert_own_property(testInterface, member_name);
   assert_true(get_value_func(testInterface),
     'Static member should return boolean value');
 }
@@ -57,7 +57,7 @@
 expect_constant = (constant_name, constant_value, get_value_func) => {
   var testObject = internals.originTrialsTest();
   var testInterface = testObject.constructor;
-  assert_exists(testInterface, constant_name);
+  assert_own_property(testInterface, constant_name);
   assert_equals(get_value_func(testInterface), constant_value,
     'Constant should return expected value');
   testInterface[constant_name] = constant_value + 1;
@@ -70,7 +70,6 @@
 expect_member_fails = (member_name) => {
   var testObject = internals.originTrialsTest();
   assert_false(member_name in testObject);
-  assert_not_exists(testObject, member_name);
   assert_equals(testObject[member_name], undefined);
 }
 
@@ -80,7 +79,6 @@
   var testObject = internals.originTrialsTest();
   var dictionary = testObject.getDictionaryMethod();
   assert_false(dictionary_member_name in dictionary);
-  assert_not_exists(dictionary, dictionary_member_name);
   assert_equals(dictionary[dictionary_member_name], undefined,
     'Dictionary member ' + dictionary_member_name + ' should not have a value');
 }
@@ -111,7 +109,6 @@
   var testObject = internals.originTrialsTest();
   var testInterface = testObject.constructor;
   assert_false(member_name in testInterface);
-  assert_not_exists(testInterface, member_name);
   assert_equals(testInterface[member_name], undefined);
 }
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces.html b/third_party/WebKit/LayoutTests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces.html
index ba7e0b5..5e60f1cc 100644
--- a/third_party/WebKit/LayoutTests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces.html
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/webexposed/animationworklet-origin-trial-interfaces.html
@@ -14,7 +14,7 @@
 }, 'AnimationWorklet related interfaces in Origin-Trial enabled document.');
 
 test(t => {
-  assert_exists(CSS, 'animationWorklet');
+  assert_own_property(CSS, 'animationWorklet');
   OriginTrialsHelper.check_properties(this,
       {'WorkletAnimation': ['play', 'cancel', 'playState', 'timeline'],
        'ScrollTimeline': ['scrollSource', 'orientation', 'timeRange'],
diff --git a/third_party/WebKit/LayoutTests/http/tests/resources/permissions-helper.js b/third_party/WebKit/LayoutTests/http/tests/resources/permissions-helper.js
index 75970c4b..788571a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/resources/permissions-helper.js
+++ b/third_party/WebKit/LayoutTests/http/tests/resources/permissions-helper.js
@@ -33,6 +33,8 @@
         return {name: "clipboard-write"};
       case "payment-handler":
         return {name: "payment-handler"};
+      case "background-fetch":
+        return {name: "background-fetch"};
       default:
         throw "Invalid permission name provided";
     }
diff --git a/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-nameSources-buttons-expected.txt b/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-nameSources-buttons-expected.txt
index 22b3e7e..18458a0e 100644
--- a/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-nameSources-buttons-expected.txt
+++ b/third_party/WebKit/LayoutTests/inspector-protocol/accessibility/accessibility-nameSources-buttons-expected.txt
@@ -238,7 +238,7 @@
   },
   "name": {
     "type": "computedString",
-    "value": "I love cake!",
+    "value": "I love cake !",
     "sources": [
       {
         "type": "relatedElement",
@@ -256,7 +256,7 @@
         "type": "contents",
         "value": {
           "type": "computedString",
-          "value": "I love cake!"
+          "value": "I love cake !"
         }
       },
       {
diff --git a/third_party/WebKit/LayoutTests/media/autoplay/document-user-activation.html b/third_party/WebKit/LayoutTests/media/autoplay/document-user-activation.html
index 3c08c85..5376d035 100644
--- a/third_party/WebKit/LayoutTests/media/autoplay/document-user-activation.html
+++ b/third_party/WebKit/LayoutTests/media/autoplay/document-user-activation.html
@@ -88,7 +88,7 @@
 // TODO(mlamouri): should not allowed to autoplay if the document was scrolled
 // with touch events.
 
-promise_test(t => {
+promise_test(async t => {
   t.add_cleanup(() => {
     internals.settings.setAutoplayPolicy('no-user-gesture-required');
   });
@@ -111,6 +111,13 @@
   video.src = '../content/test.ogv';
   document.body.appendChild(video);  // Moved to `window.document`.
   document.body.removeChild(video);  // To avoid polluting the DOM.
+
+  await new Promise(resolve => {
+    video.addEventListener('volumechange', resolve, { once: true });
+
+    video.volume = 0.5;
+  });
+
   return video.play();
 }, 'After being moved to a document with user gesture, autoplay is allowed');
 
diff --git a/third_party/WebKit/LayoutTests/media/remove-from-document-config-controls-no-crash.html b/third_party/WebKit/LayoutTests/media/remove-from-document-config-controls-no-crash.html
index bdc41def..446e184 100644
--- a/third_party/WebKit/LayoutTests/media/remove-from-document-config-controls-no-crash.html
+++ b/third_party/WebKit/LayoutTests/media/remove-from-document-config-controls-no-crash.html
@@ -4,7 +4,7 @@
 <script src="../resources/js-test.js"></script>
 </head>
 <body>
-<video id="v"></video>
+<video controls id="v"></video>
 <script>
 description("Verify that removing a video element from the DOM does not crash.");
 
diff --git a/third_party/WebKit/LayoutTests/media/remove-from-document.html b/third_party/WebKit/LayoutTests/media/remove-from-document.html
index a4a29d9..f59a058 100644
--- a/third_party/WebKit/LayoutTests/media/remove-from-document.html
+++ b/third_party/WebKit/LayoutTests/media/remove-from-document.html
@@ -5,17 +5,20 @@
 <video autoplay></video>
 <script>
 async_test(function(t) {
-    var video = document.querySelector("video");
-    video.src = "content/test.ogv";
+  const video = document.querySelector("video");
+  video.src = "content/test.ogv";
 
-    video.oncanplaythrough = t.step_func_done(function() {
-        assert_not_equals(video.networkState, HTMLMediaElement.NETWORK_EMPTY);
-        assert_false(video.paused);
+  video.oncanplaythrough = t.step_func(() => {
+    assert_not_equals(video.networkState, HTMLMediaElement.NETWORK_EMPTY);
+    assert_false(video.paused);
 
-        document.body.removeChild(video);
+    document.body.removeChild(video);
 
-        assert_not_equals(video.networkState, HTMLMediaElement.NETWORK_EMPTY);
-        assert_true(video.paused);
-    });
+    assert_not_equals(video.networkState, HTMLMediaElement.NETWORK_EMPTY);
+
+    setTimeout(t.step_func_done(() => {
+      assert_true(video.paused);
+    }));
+  });
 });
-</script>
\ No newline at end of file
+</script>
diff --git a/third_party/WebKit/LayoutTests/resources/gesture-util.js b/third_party/WebKit/LayoutTests/resources/gesture-util.js
index c59560c8..26704b84 100644
--- a/third_party/WebKit/LayoutTests/resources/gesture-util.js
+++ b/third_party/WebKit/LayoutTests/resources/gesture-util.js
@@ -92,7 +92,7 @@
 // the synthetic gesture code modified to guarantee the single update behavior.
 const SPEED_INSTANT = 200000;
 
-function smoothScroll(pixels_to_scroll, start_x, start_y, gesture_source_type, direction, speed_in_pixels_s, precise_scrolling_deltas, scroll_by_page) {
+function smoothScroll(pixels_to_scroll, start_x, start_y, gesture_source_type, direction, speed_in_pixels_s, precise_scrolling_deltas, scroll_by_page, cursor_visible) {
   return new Promise((resolve, reject) => {
     if (chrome && chrome.gpuBenchmarking) {
       chrome.gpuBenchmarking.smoothScrollBy(pixels_to_scroll,
@@ -103,7 +103,8 @@
                                             direction,
                                             speed_in_pixels_s,
                                             precise_scrolling_deltas,
-                                            scroll_by_page);
+                                            scroll_by_page,
+                                            cursor_visible);
     } else {
       reject('This test requires chrome.gpuBenchmarking');
     }
diff --git a/third_party/WebKit/LayoutTests/svg/dom/svgangle-units.html b/third_party/WebKit/LayoutTests/svg/dom/svgangle-units.html
index cbb7f25..8ba88b1 100644
--- a/third_party/WebKit/LayoutTests/svg/dom/svgangle-units.html
+++ b/third_party/WebKit/LayoutTests/svg/dom/svgangle-units.html
@@ -1,4 +1,4 @@
-<!doctype html> 
+<!doctype html>
 <title>SVGAngle tests</title>
 <script src=../../resources/testharness.js></script>
 <script src=../../resources/testharnessreport.js></script>
@@ -13,10 +13,10 @@
 var marker = document.querySelector("marker");
 var EPSILON = Math.pow(2, -8);
 var angles = [ 10, 0, 360, 500, 90, 180, 45, 25.9, 145, 270, 0.5, 0.2, 1.37, 3.14159 /* Math.PI */, 0.523599 /* Math.PI/6 */ ];
-var units = { 
-	"" : 1, 
-	"deg": 2, 
-	"rad": 3, 
+var units = {
+	"" : 1,
+	"deg": 2,
+	"rad": 3,
 	"grad": 4,
 	"turn": 5
 };
@@ -110,13 +110,13 @@
 for(var constant in unitconstants) {
 	var str = "SVG_ANGLETYPE_" + constant;
 	test(function() {
-		assert_exists(SVGAngle, str, "");
+		assert_own_property(SVGAngle, str);
 	}, "SVGAngle." + str);
 }
 for(var constant in nonexposedunitconstants) {
 	var str = "SVG_ANGLETYPE_" + constant;
 	test(function() {
-		assert_not_exists(SVGAngle, str, "");
+		assert_false(str in SVGAngle);
 	}, "SVGAngle." + str);
 }
 
@@ -130,14 +130,14 @@
 		catch(e) {
 			continue;
 		}
-		
+
 		test(function() {
 			assert_approx_equals(angle, ref.valueInSpecifiedUnits, EPSILON);
 		}, "SVGAngle(" + anglestr + ").valueInSpecifiedUnits");
 
-		try {	
+		try {
 			marker.setAttribute("orient", anglestr);
-		
+
 			test(function() {
 				assert_equals(marker.orientAngle.baseVal.valueAsString, anglestr);
 			}, "orient=\"" + anglestr + "\".valueAsString");
@@ -149,7 +149,7 @@
 		finally {
 			marker.removeAttribute("orient");
 		}
-		
+
 		for (var otherunit in units) {
 			test(function() {
 				var a = createAngle(anglestr);
@@ -164,7 +164,7 @@
 				else
 					assert_approx_equals(a.valueInSpecifiedUnits, convertTo(angle, unit, otherunit), EPSILON);
 			}, "SVGAngle(" + anglestr + ").convertToSpecifiedUnits(" + units[otherunit] + " /*" + (otherunit ? otherunit : "unspecified") + "*/)");
-			
+
 			test(function() {
 				var result = "";
 				try {
diff --git a/third_party/WebKit/LayoutTests/svg/dom/svglength-units.html b/third_party/WebKit/LayoutTests/svg/dom/svglength-units.html
index 2f9f1f67..6e4e165 100644
--- a/third_party/WebKit/LayoutTests/svg/dom/svglength-units.html
+++ b/third_party/WebKit/LayoutTests/svg/dom/svglength-units.html
@@ -1,5 +1,5 @@
 <!doctype html>
-<title>SVGlength tests</title>
+<title>SVGLength tests</title>
 <script src=../../resources/testharness.js></script>
 <script src=../../resources/testharnessreport.js></script>
 <div id="testcontainer">
@@ -122,7 +122,7 @@
   };
   for (var constant in unitConstants) {
     var str = "SVG_LENGTHTYPE_" + constant;
-    assert_exists(SVGLength, str, str + " should exist in SVGlength");
+    assert_own_property(SVGLength, str, str + " should exist in SVGLength");
   }
 }, "Test that unit constants that are supposed to be exposed are available");
 
@@ -133,7 +133,7 @@
   };
   for (var constant in nonexposedUnitConstants) {
     var str = "SVG_LENGTHTYPE_" + constant;
-    assert_not_exists(SVGLength, str, str + " should not be exposed in SVGlength");
+    assert_false(str in SVGLength, str + " should not be exposed in SVGLength");
   }
 }, "Test that unit constants that are not supposed to be exposed are not available");
 
diff --git a/third_party/WebKit/LayoutTests/svg/dom/tooltip-title-external-svg.html b/third_party/WebKit/LayoutTests/svg/dom/tooltip-title-external-svg.html
index eae76029..836e175 100644
--- a/third_party/WebKit/LayoutTests/svg/dom/tooltip-title-external-svg.html
+++ b/third_party/WebKit/LayoutTests/svg/dom/tooltip-title-external-svg.html
@@ -12,8 +12,8 @@
 function testTooltipText(x, y, expectedText, description) {
     async_test(function(t) {
         window.addEventListener('load', t.step_func_done(function() {
-            assert_exists(window, 'eventSender');
-            assert_exists(window, 'testRunner');
+            assert_own_property(window, 'eventSender');
+            assert_own_property(window, 'testRunner');
             eventSender.dragMode = false;
             eventSender.mouseMoveTo(x,y);
             assert_equals(testRunner.tooltipText, expectedText);
diff --git a/third_party/WebKit/LayoutTests/svg/dom/tooltip-title-inline-svg.html b/third_party/WebKit/LayoutTests/svg/dom/tooltip-title-inline-svg.html
index 59305806..50e0b9a 100644
--- a/third_party/WebKit/LayoutTests/svg/dom/tooltip-title-inline-svg.html
+++ b/third_party/WebKit/LayoutTests/svg/dom/tooltip-title-inline-svg.html
@@ -14,8 +14,8 @@
 function testTooltipText(x, y, expectedText, description) {
     async_test(function(t) {
         window.addEventListener('load', t.step_func_done(function() {
-            assert_exists(window, 'eventSender');
-            assert_exists(window, 'testRunner');
+            assert_own_property(window, 'eventSender');
+            assert_own_property(window, 'testRunner');
             eventSender.dragMode = false;
             eventSender.mouseMoveTo(x,y);
             assert_equals(testRunner.tooltipText, expectedText);
diff --git a/third_party/WebKit/LayoutTests/svg/text/select-text-vertical.html b/third_party/WebKit/LayoutTests/svg/text/select-text-vertical.html
index 0265f20..f22140d 100644
--- a/third_party/WebKit/LayoutTests/svg/text/select-text-vertical.html
+++ b/third_party/WebKit/LayoutTests/svg/text/select-text-vertical.html
@@ -13,8 +13,8 @@
   let startPoint = { x: 10 + 10, y: 20 + start * 20 + 8 };
   let endPoint = { x: 10 + 10, y: 20 + (end + 1) * 20 - 8 };
 
-  assert_exists(window, 'chrome');
-  assert_exists(window.chrome, 'gpuBenchmarking');
+  assert_own_property(window, 'chrome');
+  assert_own_property(window.chrome, 'gpuBenchmarking');
   return new Promise(function(resolve, reject) {
     chrome.gpuBenchmarking.pointerActionSequence(
       [{
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 6c4857b..d6ad45d 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -126,6 +126,9 @@
     getter baseLatency
     method close
     method constructor
+    method createMediaElementSource
+    method createMediaStreamDestination
+    method createMediaStreamSource
     method getOutputTimestamp
     method resume
     method suspend
@@ -252,9 +255,6 @@
     method createDynamicsCompressor
     method createGain
     method createIIRFilter
-    method createMediaElementSource
-    method createMediaStreamDestination
-    method createMediaStreamSource
     method createOscillator
     method createPanner
     method createPeriodicWave
diff --git a/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-nominal-range-expected.txt b/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-nominal-range-expected.txt
index 7fba500b..1e13f1c 100644
--- a/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-nominal-range-expected.txt
+++ b/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-nominal-range-expected.txt
@@ -1,47 +1,47 @@
-CONSOLE WARNING: line 212: The Web Audio autoplay policy will be re-enabled in Chrome 71 (December 2018). Please check that your website is compatible with it. https://goo.gl/7K7WLu
-CONSOLE WARNING: line 395: Delay.delayTime.value -1 outside nominal range [0, 1.5]; value will be clamped.
-CONSOLE WARNING: line 395: Delay.delayTime.setValueAtTime value -1 outside nominal range [0, 1.5]; value will be clamped.
-CONSOLE WARNING: line 407: Delay.delayTime.value 4 outside nominal range [0, 1.5]; value will be clamped.
-CONSOLE WARNING: line 407: Delay.delayTime.setValueAtTime value 4 outside nominal range [0, 1.5]; value will be clamped.
-CONSOLE WARNING: line 395: StereoPanner.pan.value -3 outside nominal range [-1, 1]; value will be clamped.
-CONSOLE WARNING: line 395: StereoPanner.pan.setValueAtTime value -3 outside nominal range [-1, 1]; value will be clamped.
-CONSOLE WARNING: line 407: StereoPanner.pan.value 3 outside nominal range [-1, 1]; value will be clamped.
-CONSOLE WARNING: line 407: StereoPanner.pan.setValueAtTime value 3 outside nominal range [-1, 1]; value will be clamped.
-CONSOLE WARNING: line 395: DynamicsCompressor.threshold.value -201 outside nominal range [-100, 0]; value will be clamped.
-CONSOLE WARNING: line 395: DynamicsCompressor.threshold.setValueAtTime value -201 outside nominal range [-100, 0]; value will be clamped.
-CONSOLE WARNING: line 407: DynamicsCompressor.threshold.value 1 outside nominal range [-100, 0]; value will be clamped.
-CONSOLE WARNING: line 407: DynamicsCompressor.threshold.setValueAtTime value 1 outside nominal range [-100, 0]; value will be clamped.
-CONSOLE WARNING: line 395: DynamicsCompressor.knee.value -1 outside nominal range [0, 40]; value will be clamped.
-CONSOLE WARNING: line 395: DynamicsCompressor.knee.setValueAtTime value -1 outside nominal range [0, 40]; value will be clamped.
-CONSOLE WARNING: line 407: DynamicsCompressor.knee.value 81 outside nominal range [0, 40]; value will be clamped.
-CONSOLE WARNING: line 407: DynamicsCompressor.knee.setValueAtTime value 81 outside nominal range [0, 40]; value will be clamped.
-CONSOLE WARNING: line 407: DynamicsCompressor.ratio.value 41 outside nominal range [1, 20]; value will be clamped.
-CONSOLE WARNING: line 407: DynamicsCompressor.ratio.setValueAtTime value 41 outside nominal range [1, 20]; value will be clamped.
-CONSOLE WARNING: line 395: DynamicsCompressor.attack.value -1 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 395: DynamicsCompressor.attack.setValueAtTime value -1 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 407: DynamicsCompressor.attack.value 3 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 407: DynamicsCompressor.attack.setValueAtTime value 3 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 395: DynamicsCompressor.release.value -1 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 395: DynamicsCompressor.release.setValueAtTime value -1 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 407: DynamicsCompressor.release.value 3 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 407: DynamicsCompressor.release.setValueAtTime value 3 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 395: BiquadFilter.frequency.value -1 outside nominal range [0, 24000]; value will be clamped.
-CONSOLE WARNING: line 395: BiquadFilter.frequency.setValueAtTime value -1 outside nominal range [0, 24000]; value will be clamped.
-CONSOLE WARNING: line 407: BiquadFilter.frequency.value 48001 outside nominal range [0, 24000]; value will be clamped.
-CONSOLE WARNING: line 407: BiquadFilter.frequency.setValueAtTime value 48001 outside nominal range [0, 24000]; value will be clamped.
-CONSOLE WARNING: line 395: Oscillator.frequency.value -48001 outside nominal range [-24000, 24000]; value will be clamped.
-CONSOLE WARNING: line 395: Oscillator.frequency.setValueAtTime value -48001 outside nominal range [-24000, 24000]; value will be clamped.
-CONSOLE WARNING: line 407: Oscillator.frequency.value 48001 outside nominal range [-24000, 24000]; value will be clamped.
-CONSOLE WARNING: line 407: Oscillator.frequency.setValueAtTime value 48001 outside nominal range [-24000, 24000]; value will be clamped.
-CONSOLE WARNING: line 395: Oscillator.detune.value -307201 outside nominal range [-153600, 153600]; value will be clamped.
-CONSOLE WARNING: line 395: Oscillator.detune.setValueAtTime value -307201 outside nominal range [-153600, 153600]; value will be clamped.
-CONSOLE WARNING: line 407: Oscillator.detune.value 307201 outside nominal range [-153600, 153600]; value will be clamped.
-CONSOLE WARNING: line 407: Oscillator.detune.setValueAtTime value 307201 outside nominal range [-153600, 153600]; value will be clamped.
-CONSOLE WARNING: line 326: Delay.delayTime.setValueAtTime value -1 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 327: Delay.delayTime.linearRampToValueAtTime value 2 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 328: Delay.delayTime.exponentialRampToValue value 3 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 329: Delay.delayTime.setTargetAtTime value -1 outside nominal range [0, 1]; value will be clamped.
-CONSOLE WARNING: line 330: Delay.delayTime.setValueCurveAtTime value 1.5 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 213: The Web Audio autoplay policy will be re-enabled in Chrome 71 (December 2018). Please check that your website is compatible with it. https://goo.gl/7K7WLu
+CONSOLE WARNING: line 396: Delay.delayTime.value -1 outside nominal range [0, 1.5]; value will be clamped.
+CONSOLE WARNING: line 396: Delay.delayTime.setValueAtTime value -1 outside nominal range [0, 1.5]; value will be clamped.
+CONSOLE WARNING: line 408: Delay.delayTime.value 4 outside nominal range [0, 1.5]; value will be clamped.
+CONSOLE WARNING: line 408: Delay.delayTime.setValueAtTime value 4 outside nominal range [0, 1.5]; value will be clamped.
+CONSOLE WARNING: line 396: StereoPanner.pan.value -3 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: line 396: StereoPanner.pan.setValueAtTime value -3 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: line 408: StereoPanner.pan.value 3 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: line 408: StereoPanner.pan.setValueAtTime value 3 outside nominal range [-1, 1]; value will be clamped.
+CONSOLE WARNING: line 396: DynamicsCompressor.threshold.value -201 outside nominal range [-100, 0]; value will be clamped.
+CONSOLE WARNING: line 396: DynamicsCompressor.threshold.setValueAtTime value -201 outside nominal range [-100, 0]; value will be clamped.
+CONSOLE WARNING: line 408: DynamicsCompressor.threshold.value 1 outside nominal range [-100, 0]; value will be clamped.
+CONSOLE WARNING: line 408: DynamicsCompressor.threshold.setValueAtTime value 1 outside nominal range [-100, 0]; value will be clamped.
+CONSOLE WARNING: line 396: DynamicsCompressor.knee.value -1 outside nominal range [0, 40]; value will be clamped.
+CONSOLE WARNING: line 396: DynamicsCompressor.knee.setValueAtTime value -1 outside nominal range [0, 40]; value will be clamped.
+CONSOLE WARNING: line 408: DynamicsCompressor.knee.value 81 outside nominal range [0, 40]; value will be clamped.
+CONSOLE WARNING: line 408: DynamicsCompressor.knee.setValueAtTime value 81 outside nominal range [0, 40]; value will be clamped.
+CONSOLE WARNING: line 408: DynamicsCompressor.ratio.value 41 outside nominal range [1, 20]; value will be clamped.
+CONSOLE WARNING: line 408: DynamicsCompressor.ratio.setValueAtTime value 41 outside nominal range [1, 20]; value will be clamped.
+CONSOLE WARNING: line 396: DynamicsCompressor.attack.value -1 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 396: DynamicsCompressor.attack.setValueAtTime value -1 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 408: DynamicsCompressor.attack.value 3 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 408: DynamicsCompressor.attack.setValueAtTime value 3 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 396: DynamicsCompressor.release.value -1 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 396: DynamicsCompressor.release.setValueAtTime value -1 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 408: DynamicsCompressor.release.value 3 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 408: DynamicsCompressor.release.setValueAtTime value 3 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 396: BiquadFilter.frequency.value -1 outside nominal range [0, 24000]; value will be clamped.
+CONSOLE WARNING: line 396: BiquadFilter.frequency.setValueAtTime value -1 outside nominal range [0, 24000]; value will be clamped.
+CONSOLE WARNING: line 408: BiquadFilter.frequency.value 48001 outside nominal range [0, 24000]; value will be clamped.
+CONSOLE WARNING: line 408: BiquadFilter.frequency.setValueAtTime value 48001 outside nominal range [0, 24000]; value will be clamped.
+CONSOLE WARNING: line 396: Oscillator.frequency.value -48001 outside nominal range [-24000, 24000]; value will be clamped.
+CONSOLE WARNING: line 396: Oscillator.frequency.setValueAtTime value -48001 outside nominal range [-24000, 24000]; value will be clamped.
+CONSOLE WARNING: line 408: Oscillator.frequency.value 48001 outside nominal range [-24000, 24000]; value will be clamped.
+CONSOLE WARNING: line 408: Oscillator.frequency.setValueAtTime value 48001 outside nominal range [-24000, 24000]; value will be clamped.
+CONSOLE WARNING: line 396: Oscillator.detune.value -307201 outside nominal range [-153600, 153600]; value will be clamped.
+CONSOLE WARNING: line 396: Oscillator.detune.setValueAtTime value -307201 outside nominal range [-153600, 153600]; value will be clamped.
+CONSOLE WARNING: line 408: Oscillator.detune.value 307201 outside nominal range [-153600, 153600]; value will be clamped.
+CONSOLE WARNING: line 408: Oscillator.detune.setValueAtTime value 307201 outside nominal range [-153600, 153600]; value will be clamped.
+CONSOLE WARNING: line 327: Delay.delayTime.setValueAtTime value -1 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 328: Delay.delayTime.linearRampToValueAtTime value 2 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 329: Delay.delayTime.exponentialRampToValue value 3 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 330: Delay.delayTime.setTargetAtTime value -1 outside nominal range [0, 1]; value will be clamped.
+CONSOLE WARNING: line 331: Delay.delayTime.setValueCurveAtTime value 1.5 outside nominal range [0, 1]; value will be clamped.
 This is a testharness.js-based test.
 PASS # AUDIT TASK RUNNER STARTED.
 PASS > [initialize] 
diff --git a/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-nominal-range.html b/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-nominal-range.html
index 13eb074b..f84c267 100644
--- a/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-nominal-range.html
+++ b/third_party/WebKit/LayoutTests/webaudio/AudioParam/audioparam-nominal-range.html
@@ -14,9 +14,10 @@
       // Some arbitrary sample rate for the offline context.
       let sampleRate = 48000;
 
-      // The actual contexts to use
+      // The actual contexts to use.  Generally use the offline context for
+      // testing except for the media nodes which require an AudioContext.
       let offlineContext;
-      let onlineContext;
+      let audioContext;
 
       // The set of all methods that we've tested for verifying that we tested
       // all of the necessary objects.
diff --git a/third_party/WebKit/LayoutTests/webaudio/MediaStreamAudioDestination/ctor-mediastreamaudiodestination.html b/third_party/WebKit/LayoutTests/webaudio/MediaStreamAudioDestination/ctor-mediastreamaudiodestination.html
index ffb9e3b7..06c27bd8 100644
--- a/third_party/WebKit/LayoutTests/webaudio/MediaStreamAudioDestination/ctor-mediastreamaudiodestination.html
+++ b/third_party/WebKit/LayoutTests/webaudio/MediaStreamAudioDestination/ctor-mediastreamaudiodestination.html
@@ -17,7 +17,10 @@
       let audit = Audit.createTaskRunner();
 
       audit.define('initialize', (task, should) => {
-        context = initializeContext(should);
+        // Need AudioContext, not OfflineAudioContext, for these tests.
+        should(() => {
+          context = new AudioContext();
+        }, 'context = new AudioContext()').notThrow();
         task.done();
       });
 
diff --git a/third_party/WebKit/LayoutTests/webaudio/MediaStreamAudioSource/ctor-mediastreamaudiosource.html b/third_party/WebKit/LayoutTests/webaudio/MediaStreamAudioSource/ctor-mediastreamaudiosource.html
index f8a2b01..0edf31bf 100644
--- a/third_party/WebKit/LayoutTests/webaudio/MediaStreamAudioSource/ctor-mediastreamaudiosource.html
+++ b/third_party/WebKit/LayoutTests/webaudio/MediaStreamAudioSource/ctor-mediastreamaudiosource.html
@@ -12,12 +12,15 @@
   </head>
   <body>
     <script id="layout-test-code">
-      let context = new AudioContext();
+      let context;
 
       let audit = Audit.createTaskRunner();
 
       audit.define('initialize', (task, should) => {
-        context = initializeContext(should);
+        // Need AudioContext, not OfflineAudioContext, for these tests.
+        should(() => {
+          context = new AudioContext();
+        }, 'context = new AudioContext()').notThrow();
         task.done();
       });
 
diff --git a/third_party/WebKit/LayoutTests/webaudio/dom-exceptions-expected.txt b/third_party/WebKit/LayoutTests/webaudio/dom-exceptions-expected.txt
index 7dae6ff6..edc4b84 100644
--- a/third_party/WebKit/LayoutTests/webaudio/dom-exceptions-expected.txt
+++ b/third_party/WebKit/LayoutTests/webaudio/dom-exceptions-expected.txt
@@ -25,10 +25,10 @@
 PASS   context.createBuffer(new ArrayBuffer(100), true) threw TypeError: "Failed to execute 'createBuffer' on 'BaseAudioContext': 3 arguments required, but only 2 present.".
 PASS < [createBuffer] All assertions passed. (total 11 assertions)
 PASS > [createMediaElementSource] 
-PASS   context.createMediaElementSource(null) threw TypeError: "Failed to execute 'createMediaElementSource' on 'BaseAudioContext': parameter 1 is not of type 'HTMLMediaElement'.".
+PASS   context.createMediaElementSource(null) threw TypeError: "Failed to execute 'createMediaElementSource' on 'AudioContext': parameter 1 is not of type 'HTMLMediaElement'.".
 PASS < [createMediaElementSource] All assertions passed. (total 1 assertions)
 PASS > [createMediaStreamSource] 
-PASS   context.createMediaStreamSource(null) threw TypeError: "Failed to execute 'createMediaStreamSource' on 'BaseAudioContext': parameter 1 is not of type 'MediaStream'.".
+PASS   context.createMediaStreamSource(null) threw TypeError: "Failed to execute 'createMediaStreamSource' on 'AudioContext': parameter 1 is not of type 'MediaStream'.".
 PASS < [createMediaStreamSource] All assertions passed. (total 1 assertions)
 PASS > [createScriptProcessor] 
 PASS   context.createScriptProcessor(1, 1, 1) threw IndexSizeError: "Failed to execute 'createScriptProcessor' on 'BaseAudioContext': buffer size (1) must be 0 or a power of two between 256 and 16384.".
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index 11ed279..a65d246 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -296,6 +296,9 @@
     getter baseLatency
     method close
     method constructor
+    method createMediaElementSource
+    method createMediaStreamDestination
+    method createMediaStreamSource
     method getOutputTimestamp
     method resume
     method suspend
@@ -478,9 +481,6 @@
     method createDynamicsCompressor
     method createGain
     method createIIRFilter
-    method createMediaElementSource
-    method createMediaStreamDestination
-    method createMediaStreamSource
     method createOscillator
     method createPanner
     method createPeriodicWave
diff --git a/third_party/blink/public/mojom/filesystem/file_system.mojom b/third_party/blink/public/mojom/filesystem/file_system.mojom
index d33a4ee..d372a8d 100644
--- a/third_party/blink/public/mojom/filesystem/file_system.mojom
+++ b/third_party/blink/public/mojom/filesystem/file_system.mojom
@@ -72,6 +72,13 @@
   DidReceiveSnapshotFile();
 };
 
+enum ChooseFileSystemEntryType {
+  kOpenFile,
+  kOpenMultipleFiles,
+  kSaveFile,
+  kOpenDirectory
+};
+
 // Interface provided by the browser to the renderer to carry out filesystem
 // operations. All [Sync] methods should only be called synchronously on worker
 // threads (and asynchronously otherwise).
@@ -219,7 +226,7 @@
   // success.
   // TODO(https://crbug.com/878581): Add more options to this method to support
   //     multiple files, directories, "open" vs "save" dialogs, etc.
-  ChooseEntry() =>
+  ChooseEntry(ChooseFileSystemEntryType type) =>
       (mojo_base.mojom.FileError error_code,
        array<FileSystemEntry> entries);
 };
diff --git a/third_party/blink/public/platform/modules/permissions/permission.mojom b/third_party/blink/public/platform/modules/permissions/permission.mojom
index f16cf16..0ccecc1 100644
--- a/third_party/blink/public/platform/modules/permissions/permission.mojom
+++ b/third_party/blink/public/platform/modules/permissions/permission.mojom
@@ -20,6 +20,7 @@
   CLIPBOARD_READ,
   CLIPBOARD_WRITE,
   PAYMENT_HANDLER,
+  BACKGROUND_FETCH,
 };
 
 struct MidiPermissionDescriptor {
diff --git a/third_party/blink/public/platform/web_gesture_event.h b/third_party/blink/public/platform/web_gesture_event.h
index c50e1bff..4ac43735 100644
--- a/third_party/blink/public/platform/web_gesture_event.h
+++ b/third_party/blink/public/platform/web_gesture_event.h
@@ -72,6 +72,7 @@
       float height;
     } show_press;
 
+    // This is used for both GestureLongPress and GestureLongTap.
     struct {
       float width;
       float height;
diff --git a/third_party/blink/public/web/web_widget.h b/third_party/blink/public/web/web_widget.h
index ebbeed1e..900a584 100644
--- a/third_party/blink/public/web/web_widget.h
+++ b/third_party/blink/public/web/web_widget.h
@@ -238,6 +238,15 @@
   // Called by client to request showing the context menu.
   virtual void ShowContextMenu(WebMenuSourceType) {}
 
+  // When the WebWidget is part of a frame tree, returns the active url for
+  // main frame of that tree, if the main frame is local in that tree. When
+  // the WebWidget is of a different kind (e.g. a popup) it returns the active
+  // url for the main frame of the frame tree that spawned the WebWidget, if
+  // the main frame is local in that tree. When the relevant main frame is
+  // remote in that frame tree, then the url is not known, and an empty url is
+  // returned.
+  virtual WebURL GetURLForDebugTrace() = 0;
+
  protected:
   ~WebWidget() = default;
 };
diff --git a/third_party/blink/renderer/bindings/scripts/utilities.py b/third_party/blink/renderer/bindings/scripts/utilities.py
index 127acfea..9d9725f 100644
--- a/third_party/blink/renderer/bindings/scripts/utilities.py
+++ b/third_party/blink/renderer/bindings/scripts/utilities.py
@@ -462,8 +462,6 @@
 
 
 def to_snake_case(name):
-    if name.lower() == name:
-        return name
     return NameStyleConverter(name).to_snake_case()
 
 
diff --git a/third_party/blink/renderer/bindings/scripts/v8_utilities.py b/third_party/blink/renderer/bindings/scripts/v8_utilities.py
index 296466bf..cc1a954 100644
--- a/third_party/blink/renderer/bindings/scripts/v8_utilities.py
+++ b/third_party/blink/renderer/bindings/scripts/v8_utilities.py
@@ -35,6 +35,7 @@
 import re
 import sys
 
+from blinkbuild.name_style_converter import NameStyleConverter
 from idl_types import IdlTypeBase
 import idl_types
 from idl_definitions import Exposure, IdlInterface, IdlAttribute
@@ -366,6 +367,12 @@
     extended_attributes = definition_or_member.extended_attributes
     if extended_attributes and 'ImplementedAs' in extended_attributes:
         return extended_attributes['ImplementedAs']
+    # WebIDL identifiers can contain hyphens[1], but C++ identifiers cannot.
+    # Therefore camelCase hyphen-containing identifiers.
+    #
+    # [1] https://heycam.github.io/webidl/#prod-identifier
+    if '-' in definition_or_member.name:
+        return NameStyleConverter(definition_or_member.name).to_lower_camel_case()
     return definition_or_member.name
 
 
diff --git a/third_party/blink/renderer/bindings/tests/idls/core/test_dictionary.idl b/third_party/blink/renderer/bindings/tests/idls/core/test_dictionary.idl
index d4e9f27..0ec4913 100644
--- a/third_party/blink/renderer/bindings/tests/idls/core/test_dictionary.idl
+++ b/third_party/blink/renderer/bindings/tests/idls/core/test_dictionary.idl
@@ -63,4 +63,5 @@
     record<DOMString, (double or DOMString)?> unionOrNullRecordMember;
     VoidCallbackFunction callbackFunctionMember;
     required VoidCallbackFunction requiredCallbackFunctionMember;
+    boolean member-with-hyphen-in-name = false;
 };
diff --git a/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.cc b/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.cc
index 4f892fd..bd498bc 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.cc
+++ b/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.cc
@@ -22,6 +22,7 @@
   setDoubleOrStringMember(DoubleOrString::FromDouble(3.14));
   setEnumMember("foo");
   setLongMember(1);
+  setMemberWithHyphenInName(false);
   setOtherDoubleOrStringMember(DoubleOrString::FromString("default string value"));
   setRestrictedDoubleMember(3.14);
   setStringOrNullMember("default string value");
diff --git a/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.h b/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.h
index 9e4f577..69afdb2 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.h
+++ b/third_party/blink/renderer/bindings/tests/results/core/test_dictionary.h
@@ -222,6 +222,13 @@
   }
   inline void setLongMember(int32_t);
 
+  bool hasMemberWithHyphenInName() const { return has_member_with_hyphen_in_name_; }
+  bool memberWithHyphenInName() const {
+    DCHECK(has_member_with_hyphen_in_name_);
+    return member_with_hyphen_in_name_;
+  }
+  inline void setMemberWithHyphenInName(bool);
+
   bool hasObjectMember() const { return !(object_member_.IsEmpty() || object_member_.IsNull() || object_member_.IsUndefined()); }
   ScriptValue objectMember() const {
     return object_member_;
@@ -454,6 +461,7 @@
   bool has_internal_dictionary_sequence_member_ = false;
   bool has_is_public_ = false;
   bool has_long_member_ = false;
+  bool has_member_with_hyphen_in_name_ = false;
   bool has_origin_trial_member_ = false;
   bool has_origin_trial_second_member_ = false;
   bool has_record_member_ = false;
@@ -498,6 +506,7 @@
   HeapVector<InternalDictionary> internal_dictionary_sequence_member_;
   bool is_public_;
   int32_t long_member_;
+  bool member_with_hyphen_in_name_;
   ScriptValue object_member_;
   ScriptValue object_or_null_member_;
   bool origin_trial_member_;
@@ -602,6 +611,11 @@
   has_long_member_ = true;
 }
 
+void TestDictionary::setMemberWithHyphenInName(bool value) {
+  member_with_hyphen_in_name_ = value;
+  has_member_with_hyphen_in_name_ = true;
+}
+
 void TestDictionary::setOriginTrialMember(bool value) {
   origin_trial_member_ = value;
   has_origin_trial_member_ = true;
diff --git a/third_party/blink/renderer/bindings/tests/results/core/v8_test_dictionary.cc b/third_party/blink/renderer/bindings/tests/results/core/v8_test_dictionary.cc
index 9b78be3..d605d0a 100644
--- a/third_party/blink/renderer/bindings/tests/results/core/v8_test_dictionary.cc
+++ b/third_party/blink/renderer/bindings/tests/results/core/v8_test_dictionary.cc
@@ -61,6 +61,7 @@
     "garbageCollectedRecordMember",
     "internalDictionarySequenceMember",
     "longMember",
+    "member-with-hyphen-in-name",
     "objectMember",
     "objectOrNullMember",
     "originTrialMember",
@@ -516,8 +517,22 @@
     impl.setLongMember(long_member_cpp_value);
   }
 
+  v8::Local<v8::Value> member_with_hyphen_in_name_value;
+  if (!v8Object->Get(context, keys[26].Get(isolate)).ToLocal(&member_with_hyphen_in_name_value)) {
+    exceptionState.RethrowV8Exception(block.Exception());
+    return;
+  }
+  if (member_with_hyphen_in_name_value.IsEmpty() || member_with_hyphen_in_name_value->IsUndefined()) {
+    // Do nothing.
+  } else {
+    bool member_with_hyphen_in_name_cpp_value = NativeValueTraits<IDLBoolean>::NativeValue(isolate, member_with_hyphen_in_name_value, exceptionState);
+    if (exceptionState.HadException())
+      return;
+    impl.setMemberWithHyphenInName(member_with_hyphen_in_name_cpp_value);
+  }
+
   v8::Local<v8::Value> object_member_value;
-  if (!v8Object->Get(context, keys[26].Get(isolate)).ToLocal(&object_member_value)) {
+  if (!v8Object->Get(context, keys[27].Get(isolate)).ToLocal(&object_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -533,7 +548,7 @@
   }
 
   v8::Local<v8::Value> object_or_null_member_value;
-  if (!v8Object->Get(context, keys[27].Get(isolate)).ToLocal(&object_or_null_member_value)) {
+  if (!v8Object->Get(context, keys[28].Get(isolate)).ToLocal(&object_or_null_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -551,7 +566,7 @@
   }
 
   v8::Local<v8::Value> other_double_or_string_member_value;
-  if (!v8Object->Get(context, keys[30].Get(isolate)).ToLocal(&other_double_or_string_member_value)) {
+  if (!v8Object->Get(context, keys[31].Get(isolate)).ToLocal(&other_double_or_string_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -566,7 +581,7 @@
   }
 
   v8::Local<v8::Value> public_value;
-  if (!v8Object->Get(context, keys[31].Get(isolate)).ToLocal(&public_value)) {
+  if (!v8Object->Get(context, keys[32].Get(isolate)).ToLocal(&public_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -580,7 +595,7 @@
   }
 
   v8::Local<v8::Value> record_member_value;
-  if (!v8Object->Get(context, keys[32].Get(isolate)).ToLocal(&record_member_value)) {
+  if (!v8Object->Get(context, keys[33].Get(isolate)).ToLocal(&record_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -594,7 +609,7 @@
   }
 
   v8::Local<v8::Value> required_callback_function_member_value;
-  if (!v8Object->Get(context, keys[33].Get(isolate)).ToLocal(&required_callback_function_member_value)) {
+  if (!v8Object->Get(context, keys[34].Get(isolate)).ToLocal(&required_callback_function_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -607,7 +622,7 @@
   }
 
   v8::Local<v8::Value> restricted_double_member_value;
-  if (!v8Object->Get(context, keys[34].Get(isolate)).ToLocal(&restricted_double_member_value)) {
+  if (!v8Object->Get(context, keys[35].Get(isolate)).ToLocal(&restricted_double_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -621,7 +636,7 @@
   }
 
   v8::Local<v8::Value> string_member_value;
-  if (!v8Object->Get(context, keys[37].Get(isolate)).ToLocal(&string_member_value)) {
+  if (!v8Object->Get(context, keys[38].Get(isolate)).ToLocal(&string_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -635,7 +650,7 @@
   }
 
   v8::Local<v8::Value> string_or_null_member_value;
-  if (!v8Object->Get(context, keys[38].Get(isolate)).ToLocal(&string_or_null_member_value)) {
+  if (!v8Object->Get(context, keys[39].Get(isolate)).ToLocal(&string_or_null_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -649,7 +664,7 @@
   }
 
   v8::Local<v8::Value> string_or_null_record_member_value;
-  if (!v8Object->Get(context, keys[39].Get(isolate)).ToLocal(&string_or_null_record_member_value)) {
+  if (!v8Object->Get(context, keys[40].Get(isolate)).ToLocal(&string_or_null_record_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -663,7 +678,7 @@
   }
 
   v8::Local<v8::Value> string_or_null_sequence_member_value;
-  if (!v8Object->Get(context, keys[40].Get(isolate)).ToLocal(&string_or_null_sequence_member_value)) {
+  if (!v8Object->Get(context, keys[41].Get(isolate)).ToLocal(&string_or_null_sequence_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -677,7 +692,7 @@
   }
 
   v8::Local<v8::Value> string_sequence_member_value;
-  if (!v8Object->Get(context, keys[41].Get(isolate)).ToLocal(&string_sequence_member_value)) {
+  if (!v8Object->Get(context, keys[42].Get(isolate)).ToLocal(&string_sequence_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -691,7 +706,7 @@
   }
 
   v8::Local<v8::Value> test_enum_or_null_or_test_enum_sequence_member_value;
-  if (!v8Object->Get(context, keys[42].Get(isolate)).ToLocal(&test_enum_or_null_or_test_enum_sequence_member_value)) {
+  if (!v8Object->Get(context, keys[43].Get(isolate)).ToLocal(&test_enum_or_null_or_test_enum_sequence_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -706,7 +721,7 @@
   }
 
   v8::Local<v8::Value> test_enum_or_test_enum_or_null_sequence_member_value;
-  if (!v8Object->Get(context, keys[43].Get(isolate)).ToLocal(&test_enum_or_test_enum_or_null_sequence_member_value)) {
+  if (!v8Object->Get(context, keys[44].Get(isolate)).ToLocal(&test_enum_or_test_enum_or_null_sequence_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -721,7 +736,7 @@
   }
 
   v8::Local<v8::Value> test_enum_or_test_enum_sequence_member_value;
-  if (!v8Object->Get(context, keys[44].Get(isolate)).ToLocal(&test_enum_or_test_enum_sequence_member_value)) {
+  if (!v8Object->Get(context, keys[45].Get(isolate)).ToLocal(&test_enum_or_test_enum_sequence_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -736,7 +751,7 @@
   }
 
   v8::Local<v8::Value> test_interface_2_or_uint8_array_member_value;
-  if (!v8Object->Get(context, keys[45].Get(isolate)).ToLocal(&test_interface_2_or_uint8_array_member_value)) {
+  if (!v8Object->Get(context, keys[46].Get(isolate)).ToLocal(&test_interface_2_or_uint8_array_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -751,7 +766,7 @@
   }
 
   v8::Local<v8::Value> test_interface_member_value;
-  if (!v8Object->Get(context, keys[46].Get(isolate)).ToLocal(&test_interface_member_value)) {
+  if (!v8Object->Get(context, keys[47].Get(isolate)).ToLocal(&test_interface_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -767,7 +782,7 @@
   }
 
   v8::Local<v8::Value> test_interface_or_null_member_value;
-  if (!v8Object->Get(context, keys[47].Get(isolate)).ToLocal(&test_interface_or_null_member_value)) {
+  if (!v8Object->Get(context, keys[48].Get(isolate)).ToLocal(&test_interface_or_null_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -785,7 +800,7 @@
   }
 
   v8::Local<v8::Value> test_interface_sequence_member_value;
-  if (!v8Object->Get(context, keys[48].Get(isolate)).ToLocal(&test_interface_sequence_member_value)) {
+  if (!v8Object->Get(context, keys[49].Get(isolate)).ToLocal(&test_interface_sequence_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -799,7 +814,7 @@
   }
 
   v8::Local<v8::Value> test_object_sequence_member_value;
-  if (!v8Object->Get(context, keys[49].Get(isolate)).ToLocal(&test_object_sequence_member_value)) {
+  if (!v8Object->Get(context, keys[50].Get(isolate)).ToLocal(&test_object_sequence_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -813,7 +828,7 @@
   }
 
   v8::Local<v8::Value> treat_null_as_string_sequence_member_value;
-  if (!v8Object->Get(context, keys[50].Get(isolate)).ToLocal(&treat_null_as_string_sequence_member_value)) {
+  if (!v8Object->Get(context, keys[51].Get(isolate)).ToLocal(&treat_null_as_string_sequence_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -827,7 +842,7 @@
   }
 
   v8::Local<v8::Value> uint8_array_member_value;
-  if (!v8Object->Get(context, keys[51].Get(isolate)).ToLocal(&uint8_array_member_value)) {
+  if (!v8Object->Get(context, keys[52].Get(isolate)).ToLocal(&uint8_array_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -845,7 +860,7 @@
   }
 
   v8::Local<v8::Value> union_in_record_member_value;
-  if (!v8Object->Get(context, keys[52].Get(isolate)).ToLocal(&union_in_record_member_value)) {
+  if (!v8Object->Get(context, keys[53].Get(isolate)).ToLocal(&union_in_record_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -859,7 +874,7 @@
   }
 
   v8::Local<v8::Value> union_member_with_sequence_default_value;
-  if (!v8Object->Get(context, keys[53].Get(isolate)).ToLocal(&union_member_with_sequence_default_value)) {
+  if (!v8Object->Get(context, keys[54].Get(isolate)).ToLocal(&union_member_with_sequence_default_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -874,7 +889,7 @@
   }
 
   v8::Local<v8::Value> union_or_null_record_member_value;
-  if (!v8Object->Get(context, keys[54].Get(isolate)).ToLocal(&union_or_null_record_member_value)) {
+  if (!v8Object->Get(context, keys[55].Get(isolate)).ToLocal(&union_or_null_record_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -888,7 +903,7 @@
   }
 
   v8::Local<v8::Value> union_or_null_sequence_member_value;
-  if (!v8Object->Get(context, keys[55].Get(isolate)).ToLocal(&union_or_null_sequence_member_value)) {
+  if (!v8Object->Get(context, keys[56].Get(isolate)).ToLocal(&union_or_null_sequence_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -902,7 +917,7 @@
   }
 
   v8::Local<v8::Value> union_with_typedefs_value;
-  if (!v8Object->Get(context, keys[56].Get(isolate)).ToLocal(&union_with_typedefs_value)) {
+  if (!v8Object->Get(context, keys[57].Get(isolate)).ToLocal(&union_with_typedefs_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -917,7 +932,7 @@
   }
 
   v8::Local<v8::Value> unrestricted_double_member_value;
-  if (!v8Object->Get(context, keys[57].Get(isolate)).ToLocal(&unrestricted_double_member_value)) {
+  if (!v8Object->Get(context, keys[58].Get(isolate)).ToLocal(&unrestricted_double_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -931,7 +946,7 @@
   }
 
   v8::Local<v8::Value> usv_string_or_null_member_value;
-  if (!v8Object->Get(context, keys[58].Get(isolate)).ToLocal(&usv_string_or_null_member_value)) {
+  if (!v8Object->Get(context, keys[59].Get(isolate)).ToLocal(&usv_string_or_null_member_value)) {
     exceptionState.RethrowV8Exception(block.Exception());
     return;
   }
@@ -946,7 +961,7 @@
 
   if (RuntimeEnabledFeatures::RuntimeFeatureEnabled()) {
     v8::Local<v8::Value> runtime_member_value;
-    if (!v8Object->Get(context, keys[35].Get(isolate)).ToLocal(&runtime_member_value)) {
+    if (!v8Object->Get(context, keys[36].Get(isolate)).ToLocal(&runtime_member_value)) {
       exceptionState.RethrowV8Exception(block.Exception());
       return;
     }
@@ -960,7 +975,7 @@
     }
 
     v8::Local<v8::Value> runtime_second_member_value;
-    if (!v8Object->Get(context, keys[36].Get(isolate)).ToLocal(&runtime_second_member_value)) {
+    if (!v8Object->Get(context, keys[37].Get(isolate)).ToLocal(&runtime_second_member_value)) {
       exceptionState.RethrowV8Exception(block.Exception());
       return;
     }
@@ -976,7 +991,7 @@
 
   if (OriginTrials::FeatureNameEnabled(executionContext)) {
     v8::Local<v8::Value> origin_trial_member_value;
-    if (!v8Object->Get(context, keys[28].Get(isolate)).ToLocal(&origin_trial_member_value)) {
+    if (!v8Object->Get(context, keys[29].Get(isolate)).ToLocal(&origin_trial_member_value)) {
       exceptionState.RethrowV8Exception(block.Exception());
       return;
     }
@@ -992,7 +1007,7 @@
 
   if (OriginTrials::FeatureName1Enabled(executionContext)) {
     v8::Local<v8::Value> origin_trial_second_member_value;
-    if (!v8Object->Get(context, keys[29].Get(isolate)).ToLocal(&origin_trial_second_member_value)) {
+    if (!v8Object->Get(context, keys[30].Get(isolate)).ToLocal(&origin_trial_second_member_value)) {
       exceptionState.RethrowV8Exception(block.Exception());
       return;
     }
@@ -1324,6 +1339,20 @@
     return false;
   }
 
+  v8::Local<v8::Value> member_with_hyphen_in_name_value;
+  bool member_with_hyphen_in_name_has_value_or_default = false;
+  if (impl.hasMemberWithHyphenInName()) {
+    member_with_hyphen_in_name_value = v8::Boolean::New(isolate, impl.memberWithHyphenInName());
+    member_with_hyphen_in_name_has_value_or_default = true;
+  } else {
+    member_with_hyphen_in_name_value = v8::Boolean::New(isolate, false);
+    member_with_hyphen_in_name_has_value_or_default = true;
+  }
+  if (member_with_hyphen_in_name_has_value_or_default &&
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[26].Get(isolate), member_with_hyphen_in_name_value))) {
+    return false;
+  }
+
   v8::Local<v8::Value> object_member_value;
   bool object_member_has_value_or_default = false;
   if (impl.hasObjectMember()) {
@@ -1332,7 +1361,7 @@
     object_member_has_value_or_default = true;
   }
   if (object_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[26].Get(isolate), object_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[27].Get(isolate), object_member_value))) {
     return false;
   }
 
@@ -1347,7 +1376,7 @@
     object_or_null_member_has_value_or_default = true;
   }
   if (object_or_null_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[27].Get(isolate), object_or_null_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[28].Get(isolate), object_or_null_member_value))) {
     return false;
   }
 
@@ -1361,7 +1390,7 @@
     other_double_or_string_member_has_value_or_default = true;
   }
   if (other_double_or_string_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[30].Get(isolate), other_double_or_string_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[31].Get(isolate), other_double_or_string_member_value))) {
     return false;
   }
 
@@ -1372,7 +1401,7 @@
     public_has_value_or_default = true;
   }
   if (public_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[31].Get(isolate), public_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[32].Get(isolate), public_value))) {
     return false;
   }
 
@@ -1383,7 +1412,7 @@
     record_member_has_value_or_default = true;
   }
   if (record_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[32].Get(isolate), record_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[33].Get(isolate), record_member_value))) {
     return false;
   }
 
@@ -1396,7 +1425,7 @@
     NOTREACHED();
   }
   if (required_callback_function_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[33].Get(isolate), required_callback_function_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[34].Get(isolate), required_callback_function_member_value))) {
     return false;
   }
 
@@ -1410,7 +1439,7 @@
     restricted_double_member_has_value_or_default = true;
   }
   if (restricted_double_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[34].Get(isolate), restricted_double_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[35].Get(isolate), restricted_double_member_value))) {
     return false;
   }
 
@@ -1421,7 +1450,7 @@
     string_member_has_value_or_default = true;
   }
   if (string_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[37].Get(isolate), string_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[38].Get(isolate), string_member_value))) {
     return false;
   }
 
@@ -1435,7 +1464,7 @@
     string_or_null_member_has_value_or_default = true;
   }
   if (string_or_null_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[38].Get(isolate), string_or_null_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[39].Get(isolate), string_or_null_member_value))) {
     return false;
   }
 
@@ -1446,7 +1475,7 @@
     string_or_null_record_member_has_value_or_default = true;
   }
   if (string_or_null_record_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[39].Get(isolate), string_or_null_record_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[40].Get(isolate), string_or_null_record_member_value))) {
     return false;
   }
 
@@ -1457,7 +1486,7 @@
     string_or_null_sequence_member_has_value_or_default = true;
   }
   if (string_or_null_sequence_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[40].Get(isolate), string_or_null_sequence_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[41].Get(isolate), string_or_null_sequence_member_value))) {
     return false;
   }
 
@@ -1471,7 +1500,7 @@
     string_sequence_member_has_value_or_default = true;
   }
   if (string_sequence_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[41].Get(isolate), string_sequence_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[42].Get(isolate), string_sequence_member_value))) {
     return false;
   }
 
@@ -1482,7 +1511,7 @@
     test_enum_or_null_or_test_enum_sequence_member_has_value_or_default = true;
   }
   if (test_enum_or_null_or_test_enum_sequence_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[42].Get(isolate), test_enum_or_null_or_test_enum_sequence_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[43].Get(isolate), test_enum_or_null_or_test_enum_sequence_member_value))) {
     return false;
   }
 
@@ -1493,7 +1522,7 @@
     test_enum_or_test_enum_or_null_sequence_member_has_value_or_default = true;
   }
   if (test_enum_or_test_enum_or_null_sequence_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[43].Get(isolate), test_enum_or_test_enum_or_null_sequence_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[44].Get(isolate), test_enum_or_test_enum_or_null_sequence_member_value))) {
     return false;
   }
 
@@ -1504,7 +1533,7 @@
     test_enum_or_test_enum_sequence_member_has_value_or_default = true;
   }
   if (test_enum_or_test_enum_sequence_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[44].Get(isolate), test_enum_or_test_enum_sequence_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[45].Get(isolate), test_enum_or_test_enum_sequence_member_value))) {
     return false;
   }
 
@@ -1515,7 +1544,7 @@
     test_interface_2_or_uint8_array_member_has_value_or_default = true;
   }
   if (test_interface_2_or_uint8_array_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[45].Get(isolate), test_interface_2_or_uint8_array_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[46].Get(isolate), test_interface_2_or_uint8_array_member_value))) {
     return false;
   }
 
@@ -1526,7 +1555,7 @@
     test_interface_member_has_value_or_default = true;
   }
   if (test_interface_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[46].Get(isolate), test_interface_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[47].Get(isolate), test_interface_member_value))) {
     return false;
   }
 
@@ -1537,7 +1566,7 @@
     test_interface_or_null_member_has_value_or_default = true;
   }
   if (test_interface_or_null_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[47].Get(isolate), test_interface_or_null_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[48].Get(isolate), test_interface_or_null_member_value))) {
     return false;
   }
 
@@ -1551,7 +1580,7 @@
     test_interface_sequence_member_has_value_or_default = true;
   }
   if (test_interface_sequence_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[48].Get(isolate), test_interface_sequence_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[49].Get(isolate), test_interface_sequence_member_value))) {
     return false;
   }
 
@@ -1562,7 +1591,7 @@
     test_object_sequence_member_has_value_or_default = true;
   }
   if (test_object_sequence_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[49].Get(isolate), test_object_sequence_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[50].Get(isolate), test_object_sequence_member_value))) {
     return false;
   }
 
@@ -1576,7 +1605,7 @@
     treat_null_as_string_sequence_member_has_value_or_default = true;
   }
   if (treat_null_as_string_sequence_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[50].Get(isolate), treat_null_as_string_sequence_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[51].Get(isolate), treat_null_as_string_sequence_member_value))) {
     return false;
   }
 
@@ -1587,7 +1616,7 @@
     uint8_array_member_has_value_or_default = true;
   }
   if (uint8_array_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[51].Get(isolate), uint8_array_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[52].Get(isolate), uint8_array_member_value))) {
     return false;
   }
 
@@ -1598,7 +1627,7 @@
     union_in_record_member_has_value_or_default = true;
   }
   if (union_in_record_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[52].Get(isolate), union_in_record_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[53].Get(isolate), union_in_record_member_value))) {
     return false;
   }
 
@@ -1612,7 +1641,7 @@
     union_member_with_sequence_default_has_value_or_default = true;
   }
   if (union_member_with_sequence_default_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[53].Get(isolate), union_member_with_sequence_default_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[54].Get(isolate), union_member_with_sequence_default_value))) {
     return false;
   }
 
@@ -1623,7 +1652,7 @@
     union_or_null_record_member_has_value_or_default = true;
   }
   if (union_or_null_record_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[54].Get(isolate), union_or_null_record_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[55].Get(isolate), union_or_null_record_member_value))) {
     return false;
   }
 
@@ -1634,7 +1663,7 @@
     union_or_null_sequence_member_has_value_or_default = true;
   }
   if (union_or_null_sequence_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[55].Get(isolate), union_or_null_sequence_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[56].Get(isolate), union_or_null_sequence_member_value))) {
     return false;
   }
 
@@ -1645,7 +1674,7 @@
     union_with_typedefs_has_value_or_default = true;
   }
   if (union_with_typedefs_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[56].Get(isolate), union_with_typedefs_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[57].Get(isolate), union_with_typedefs_value))) {
     return false;
   }
 
@@ -1659,7 +1688,7 @@
     unrestricted_double_member_has_value_or_default = true;
   }
   if (unrestricted_double_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[57].Get(isolate), unrestricted_double_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[58].Get(isolate), unrestricted_double_member_value))) {
     return false;
   }
 
@@ -1673,7 +1702,7 @@
     usv_string_or_null_member_has_value_or_default = true;
   }
   if (usv_string_or_null_member_has_value_or_default &&
-      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[58].Get(isolate), usv_string_or_null_member_value))) {
+      !V8CallBoolean(dictionary->CreateDataProperty(context, keys[59].Get(isolate), usv_string_or_null_member_value))) {
     return false;
   }
 
@@ -1685,7 +1714,7 @@
       runtime_member_has_value_or_default = true;
     }
     if (runtime_member_has_value_or_default &&
-        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[35].Get(isolate), runtime_member_value))) {
+        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[36].Get(isolate), runtime_member_value))) {
       return false;
     }
 
@@ -1696,7 +1725,7 @@
       runtime_second_member_has_value_or_default = true;
     }
     if (runtime_second_member_has_value_or_default &&
-        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[36].Get(isolate), runtime_second_member_value))) {
+        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[37].Get(isolate), runtime_second_member_value))) {
       return false;
     }
   }
@@ -1709,7 +1738,7 @@
       origin_trial_member_has_value_or_default = true;
     }
     if (origin_trial_member_has_value_or_default &&
-        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[28].Get(isolate), origin_trial_member_value))) {
+        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[29].Get(isolate), origin_trial_member_value))) {
       return false;
     }
   }
@@ -1722,7 +1751,7 @@
       origin_trial_second_member_has_value_or_default = true;
     }
     if (origin_trial_second_member_has_value_or_default &&
-        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[29].Get(isolate), origin_trial_second_member_value))) {
+        !V8CallBoolean(dictionary->CreateDataProperty(context, keys[30].Get(isolate), origin_trial_second_member_value))) {
       return false;
     }
   }
diff --git a/third_party/blink/renderer/build/scripts/blinkbuild/name_style_converter.py b/third_party/blink/renderer/build/scripts/blinkbuild/name_style_converter.py
index 9f28d3ad..a989def3 100644
--- a/third_party/blink/renderer/build/scripts/blinkbuild/name_style_converter.py
+++ b/third_party/blink/renderer/build/scripts/blinkbuild/name_style_converter.py
@@ -22,6 +22,7 @@
     'Uint16',
     'Uint32',
     'WebGL2',
+    'webgl2',
     'WebGPU',
     'ASCII',
     'CSSOM',
@@ -38,9 +39,11 @@
     'WebGL',
     'XPath',
     'ETC1',
+    'etc1',
     'HTML',
     'Int8',
     'S3TC',
+    's3tc',
     'SPv2',
     'UTF8',
     'sRGB',
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
index 7d00e155..d149a4e 100644
--- a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
@@ -530,6 +530,13 @@
   page_->GetFocusController().SetFocused(enable);
 }
 
+WebURL WebPagePopupImpl::GetURLForDebugTrace() {
+  WebFrame* main_frame = web_view_->MainFrame();
+  if (main_frame->IsWebLocalFrame())
+    return main_frame->ToWebLocalFrame()->GetDocument().Url();
+  return {};
+}
+
 void WebPagePopupImpl::Close() {
   closing_ = true;
   // In case closePopup() was not called.
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.h b/third_party/blink/renderer/core/exported/web_page_popup_impl.h
index 486da7e..6648d6f3 100644
--- a/third_party/blink/renderer/core/exported/web_page_popup_impl.h
+++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.h
@@ -96,6 +96,7 @@
   bool IsAcceleratedCompositingActive() const override {
     return is_accelerated_compositing_active_;
   }
+  WebURL GetURLForDebugTrace() override;
 
   // PageWidgetEventHandler functions
   WebInputEventResult HandleCharEvent(const WebKeyboardEvent&) override;
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index 419ffb2..865f79d 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -2857,6 +2857,13 @@
   MainFrameImpl()->FrameWidget()->ShowContextMenu(source_type);
 }
 
+WebURL WebViewImpl::GetURLForDebugTrace() {
+  WebFrame* main_frame = MainFrame();
+  if (main_frame->IsWebLocalFrame())
+    return main_frame->ToWebLocalFrame()->GetDocument().Url();
+  return {};
+}
+
 void WebViewImpl::DidCloseContextMenu() {
   LocalFrame* frame = page_->GetFocusController().FocusedFrame();
   if (frame)
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
index 72e55d9..db5e6b3 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
+++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -117,7 +117,6 @@
   void SetSuppressFrameRequestsWorkaroundFor704763Only(bool) override;
   void BeginFrame(base::TimeTicks last_frame_time) override;
   void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) override;
-
   void UpdateLifecycle(LifecycleUpdate requested_update) override;
   void UpdateAllLifecyclePhasesAndCompositeForTesting(bool do_raster) override;
   void PaintContent(cc::PaintCanvas*, const WebRect&) override;
@@ -130,7 +129,6 @@
   WebInputEventResult HandleInputEvent(const WebCoalescedInputEvent&) override;
   WebInputEventResult DispatchBufferedTouchEvents() override;
   void SetCursorVisibilityState(bool is_visible) override;
-
   void ApplyViewportDeltas(const WebFloatSize& visual_viewport_delta,
                            const WebFloatSize& layout_viewport_delta,
                            const WebFloatSize& elastic_overscroll_delta,
@@ -149,6 +147,7 @@
   void DidNotAcquirePointerLock() override;
   void DidLosePointerLock() override;
   void ShowContextMenu(WebMenuSourceType) override;
+  WebURL GetURLForDebugTrace() override;
 
   // WebView methods:
   bool IsWebView() const override { return true; }
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index 293bc24..3c2210de 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -738,6 +738,13 @@
       is_throttled, subtree_throttled);
 }
 
+WebURL WebFrameWidgetImpl::GetURLForDebugTrace() {
+  WebFrame* main_frame = View()->MainFrame();
+  if (main_frame->IsWebLocalFrame())
+    return main_frame->ToWebLocalFrame()->GetDocument().Url();
+  return {};
+}
+
 void WebFrameWidgetImpl::HandleMouseLeave(LocalFrame& main_frame,
                                           const WebMouseEvent& event) {
   // FIXME: WebWidget doesn't have the method below.
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
index d1c25b14..ab70553 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -110,6 +110,7 @@
   void SetInheritedEffectiveTouchAction(TouchAction) override;
   void UpdateRenderThrottlingStatus(bool is_throttled,
                                     bool subtree_throttled) override;
+  WebURL GetURLForDebugTrace() override;
 
   // WebFrameWidget implementation.
   void SetVisibilityState(mojom::PageVisibilityState) override;
diff --git a/third_party/blink/renderer/core/frame/web_view_frame_widget.cc b/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
index 49442002..0d106f0a 100644
--- a/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
+++ b/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
@@ -156,6 +156,10 @@
   web_view_->UpdateBrowserControlsState(constraints, current, animate);
 }
 
+WebURL WebViewFrameWidget::GetURLForDebugTrace() {
+  return web_view_->GetURLForDebugTrace();
+}
+
 void WebViewFrameWidget::SetVisibilityState(
     mojom::PageVisibilityState visibility_state) {
   web_view_->SetVisibilityState(visibility_state, false);
diff --git a/third_party/blink/renderer/core/frame/web_view_frame_widget.h b/third_party/blink/renderer/core/frame/web_view_frame_widget.h
index 08d8b29..0ed4e90 100644
--- a/third_party/blink/renderer/core/frame/web_view_frame_widget.h
+++ b/third_party/blink/renderer/core/frame/web_view_frame_widget.h
@@ -39,7 +39,7 @@
   explicit WebViewFrameWidget(WebWidgetClient&, WebViewImpl&);
   ~WebViewFrameWidget() override;
 
-  // WebFrameWidget overrides:
+  // WebWidget overrides:
   void Close() override;
   WebSize Size() override;
   void Resize(const WebSize&) override;
@@ -77,6 +77,9 @@
   void UpdateBrowserControlsState(cc::BrowserControlsState constraints,
                                   cc::BrowserControlsState current,
                                   bool animate) override;
+  WebURL GetURLForDebugTrace() override;
+
+  // WebFrameWidget overrides:
   void SetVisibilityState(mojom::PageVisibilityState) override;
   void SetBackgroundColorOverride(SkColor) override;
   void ClearBackgroundColorOverride() override;
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index f85fb0f8..0c6c66e7 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -478,6 +478,10 @@
           document.GetTaskRunner(TaskType::kInternalMedia),
           this,
           &HTMLMediaElement::CheckViewportIntersectionTimerFired),
+      removed_from_document_timer_(
+          document.GetTaskRunner(TaskType::kInternalMedia),
+          this,
+          &HTMLMediaElement::OnRemovedFromDocumentTimerFired),
       played_time_ranges_(),
       async_event_queue_(EventQueue::Create(GetExecutionContext(),
                                             TaskType::kMediaElementEvent)),
@@ -578,6 +582,8 @@
       GetDocument().GetTaskRunner(TaskType::kInternalMedia));
   deferred_load_timer_.MoveToNewTaskRunner(
       GetDocument().GetTaskRunner(TaskType::kInternalMedia));
+  removed_from_document_timer_.MoveToNewTaskRunner(
+      GetDocument().GetTaskRunner(TaskType::kInternalMedia));
 
   autoplay_policy_->DidMoveToNewDocument(old_document);
 
@@ -729,11 +735,9 @@
   BLINK_MEDIA_LOG << "removedFrom(" << (void*)this << ", " << insertion_point
                   << ")";
 
+  removed_from_document_timer_.StartOneShot(TimeDelta(), FROM_HERE);
+
   HTMLElement::RemovedFrom(insertion_point);
-  if (insertion_point.InActiveDocument()) {
-    if (network_state_ > kNetworkEmpty)
-      PauseInternal();
-  }
 }
 
 void HTMLMediaElement::AttachLayoutTree(AttachContext& context) {
@@ -1003,7 +1007,7 @@
   // 3 - Set the media element's delaying-the-load-event flag to true (this
   // delays the load event)
   SetShouldDelayLoadEvent(true);
-  if (GetMediaControls())
+  if (GetMediaControls() && isConnected())
     GetMediaControls()->Reset();
 
   // 4 - Await a stable state, allowing the task that invoked this algorithm to
@@ -3614,6 +3618,7 @@
     GetLayoutObject()->UpdateFromElement();
 
   StopPeriodicTimers();
+  removed_from_document_timer_.Stop();
 }
 
 bool HTMLMediaElement::HasPendingActivity() const {
@@ -4149,6 +4154,13 @@
   return histogram;
 }
 
+void HTMLMediaElement::OnRemovedFromDocumentTimerFired(TimerBase*) {
+  if (InActiveDocument())
+    return;
+
+  PauseInternal();
+}
+
 void HTMLMediaElement::ClearWeakMembers(Visitor* visitor) {
   if (!ThreadHeap::IsHeapObjectAlive(audio_source_node_)) {
     GetAudioSourceProvider().SetClient(nullptr);
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.h b/third_party/blink/renderer/core/html/media/html_media_element.h
index 5bd47e1d..d2a28f3 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.h
+++ b/third_party/blink/renderer/core/html/media/html_media_element.h
@@ -560,11 +560,14 @@
 
   void OnVisibilityChangedForLazyLoad(bool);
 
+  void OnRemovedFromDocumentTimerFired(TimerBase*);
+
   TaskRunnerTimer<HTMLMediaElement> load_timer_;
   TaskRunnerTimer<HTMLMediaElement> progress_event_timer_;
   TaskRunnerTimer<HTMLMediaElement> playback_progress_timer_;
   TaskRunnerTimer<HTMLMediaElement> audio_tracks_timer_;
   TaskRunnerTimer<HTMLMediaElement> check_viewport_intersection_timer_;
+  TaskRunnerTimer<HTMLMediaElement> removed_from_document_timer_;
 
   Member<TimeRanges> played_time_ranges_;
   Member<EventQueue> async_event_queue_;
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc
index 96d6b75..834727d 100644
--- a/third_party/blink/renderer/core/layout/layout_text.cc
+++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -1559,15 +1559,18 @@
 }
 
 FloatPoint LayoutText::FirstRunOrigin() const {
-  return FloatPoint(FirstRunX(), FirstRunY());
-}
-
-float LayoutText::FirstRunX() const {
-  return FirstTextBox() ? FirstTextBox()->X().ToFloat() : 0;
-}
-
-float LayoutText::FirstRunY() const {
-  return FirstTextBox() ? FirstTextBox()->Y().ToFloat() : 0;
+  if (const NGPaintFragment* fragment = FirstInlineFragment()) {
+    LayoutPoint origin = fragment->InlineOffsetToContainerBox().ToLayoutPoint();
+    if (UNLIKELY(HasFlippedBlocksWritingMode())) {
+      LayoutRect line_box_rect(origin, fragment->Size().ToLayoutSize());
+      ContainingBlock()->FlipForWritingMode(line_box_rect);
+      return FloatPoint(line_box_rect.Location());
+    }
+    return FloatPoint(origin);
+  }
+  if (const auto* text_box = FirstTextBox())
+    return FloatPoint(text_box->Location());
+  return FloatPoint();
 }
 
 bool LayoutText::CanOptimizeSetText() const {
@@ -2396,19 +2399,7 @@
 // the first run's x and y, but that would involve updating many test results.
 LayoutRect LayoutText::DebugRect() const {
   IntRect lines_box = EnclosingIntRect(LinesBoundingBox());
-  FloatPoint first_run_offset;
-  if (const NGPhysicalBoxFragment* box_fragment =
-          EnclosingBlockFlowFragment()) {
-    const auto fragments =
-        NGInlineFragmentTraversal::SelfFragmentsOf(*box_fragment, this);
-    if (fragments.size()) {
-      const auto& child = fragments[0];
-      first_run_offset = {child.offset_to_container_box.left.ToFloat(),
-                          child.offset_to_container_box.top.ToFloat()};
-    }
-  } else {
-    first_run_offset = {FirstRunX(), FirstRunY()};
-  }
+  FloatPoint first_run_offset = FirstRunOrigin();
   LayoutRect rect =
       LayoutRect(IntRect(first_run_offset.X(), first_run_offset.Y(),
                          lines_box.Width(), lines_box.Height()));
diff --git a/third_party/blink/renderer/core/layout/layout_text.h b/third_party/blink/renderer/core/layout/layout_text.h
index adf0d63..a60e125 100644
--- a/third_party/blink/renderer/core/layout/layout_text.h
+++ b/third_party/blink/renderer/core/layout/layout_text.h
@@ -187,8 +187,6 @@
   LayoutRect VisualOverflowRect() const;
 
   FloatPoint FirstRunOrigin() const;
-  float FirstRunX() const;
-  float FirstRunY() const;
 
   virtual void SetText(scoped_refptr<StringImpl>,
                        bool force = false,
diff --git a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
index 06008630..5aff0e6 100644
--- a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
+++ b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
@@ -457,8 +457,19 @@
     return;
   const NGPhysicalTextFragment& physical_text_fragment =
       ToNGPhysicalTextFragment(physical_fragment);
-  NGTextFragment fragment(physical_fragment.Style().GetWritingMode(),
-                          physical_text_fragment);
+  const ComputedStyle& style = physical_fragment.Style();
+  NGTextFragment fragment(style.GetWritingMode(), physical_text_fragment);
+  if (UNLIKELY(style.IsFlippedBlocksWritingMode())) {
+    if (physical_fragment.GetLayoutObject()) {
+      LayoutRect rect(offset_to_container_box.ToLayoutPoint(),
+                      physical_fragment.Size().ToLayoutSize());
+      const LayoutBlock* containing_block =
+          physical_fragment.GetLayoutObject()->ContainingBlock();
+      containing_block->FlipForWritingMode(rect);
+      offset_to_container_box.left = rect.X();
+    }
+  }
+
   // See WriteTextRun() for why we convert to int.
   int x = offset_to_container_box.left.ToInt();
   int y = offset_to_container_box.top.ToInt();
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_fieldset.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_fieldset.cc
index c36ff07b7..eca59a4 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_fieldset.cc
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_fieldset.cc
@@ -32,8 +32,8 @@
     scoped_refptr<ComputedStyle> new_style =
         ComputedStyle::CreateAnonymousStyleWithDisplay(StyleRef(),
                                                        EDisplay::kFlowRoot);
-    new_style->SetOverflowX(StyleRef().OverflowX());
-    new_style->SetOverflowY(StyleRef().OverflowY());
+    // TODO(crbug.com/875235): When the paint code is ready for anonymous
+    // scrollable containers, inherit overflow-x and overflow-y here.
 
     new_style->SetPaddingTop(StyleRef().PaddingTop());
     new_style->SetPaddingRight(StyleRef().PaddingRight());
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc
index 635b3de3..cf71646 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.cc
@@ -26,73 +26,6 @@
   flags_ = NGConstraintSpace::kFixedSizeBlockIsDefinite;
 }
 
-NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetAvailableSize(
-    NGLogicalSize available_size) {
-  available_size_ = available_size;
-  return *this;
-}
-
-NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetPercentageResolutionSize(
-    NGLogicalSize percentage_resolution_size) {
-  percentage_resolution_size_ = percentage_resolution_size;
-  return *this;
-}
-
-NGConstraintSpaceBuilder&
-NGConstraintSpaceBuilder::SetReplacedPercentageResolutionSize(
-    NGLogicalSize replaced_percentage_resolution_size) {
-  replaced_percentage_resolution_size_ = replaced_percentage_resolution_size;
-  return *this;
-}
-
-NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetTextDirection(
-    TextDirection text_direction) {
-  text_direction_ = text_direction;
-  return *this;
-}
-
-NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetMarginStrut(
-    const NGMarginStrut& margin_strut) {
-  margin_strut_ = margin_strut;
-  return *this;
-}
-
-NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetBfcOffset(
-    const NGBfcOffset& bfc_offset) {
-  bfc_offset_ = bfc_offset;
-  return *this;
-}
-
-NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetFloatsBfcBlockOffset(
-    const base::Optional<LayoutUnit>& floats_bfc_block_offset) {
-  floats_bfc_block_offset_ = floats_bfc_block_offset;
-  return *this;
-}
-
-NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetClearanceOffset(
-    LayoutUnit clearance_offset) {
-  clearance_offset_ = clearance_offset;
-  return *this;
-}
-
-NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetExclusionSpace(
-    const NGExclusionSpace& exclusion_space) {
-  exclusion_space_ = &exclusion_space;
-  return *this;
-}
-
-NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetFragmentationType(
-    NGFragmentationType fragmentation_type) {
-  fragmentation_type_ = fragmentation_type;
-  return *this;
-}
-
-void NGConstraintSpaceBuilder::AddBaselineRequests(
-    const Vector<NGBaselineRequest>& requests) {
-  DCHECK(baseline_requests_.IsEmpty());
-  baseline_requests_.AppendVector(requests);
-}
-
 NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::AddBaselineRequest(
     const NGBaselineRequest& request) {
   for (const auto& existing : baseline_requests_) {
@@ -103,11 +36,4 @@
   return *this;
 }
 
-const NGConstraintSpace NGConstraintSpaceBuilder::ToConstraintSpace(
-    WritingMode out_writing_mode) {
-  return NGConstraintSpace(out_writing_mode,
-                           flags_ & NGConstraintSpace::kNewFormattingContext,
-                           *this);
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
index 6505d3c..e8ac08b 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
@@ -31,11 +31,22 @@
   // setters are in.
   NGConstraintSpaceBuilder(WritingMode writing_mode, NGPhysicalSize icb_size);
 
-  NGConstraintSpaceBuilder& SetAvailableSize(NGLogicalSize available_size);
+  NGConstraintSpaceBuilder& SetAvailableSize(NGLogicalSize available_size) {
+    available_size_ = available_size;
+    return *this;
+  }
 
-  NGConstraintSpaceBuilder& SetPercentageResolutionSize(NGLogicalSize);
+  NGConstraintSpaceBuilder& SetPercentageResolutionSize(
+      NGLogicalSize percentage_resolution_size) {
+    percentage_resolution_size_ = percentage_resolution_size;
+    return *this;
+  }
 
-  NGConstraintSpaceBuilder& SetReplacedPercentageResolutionSize(NGLogicalSize);
+  NGConstraintSpaceBuilder& SetReplacedPercentageResolutionSize(
+      NGLogicalSize replaced_percentage_resolution_size) {
+    replaced_percentage_resolution_size_ = replaced_percentage_resolution_size;
+    return *this;
+  }
 
   NGConstraintSpaceBuilder& SetFragmentainerBlockSize(LayoutUnit size) {
     fragmentainer_block_size_ = size;
@@ -47,7 +58,10 @@
     return *this;
   }
 
-  NGConstraintSpaceBuilder& SetTextDirection(TextDirection);
+  NGConstraintSpaceBuilder& SetTextDirection(TextDirection text_direction) {
+    text_direction_ = text_direction;
+    return *this;
+  }
 
   NGConstraintSpaceBuilder& SetIsFixedSizeInline(bool b) {
     SetFlag(NGConstraintSpace::kFixedSizeInline, b);
@@ -74,7 +88,11 @@
     return *this;
   }
 
-  NGConstraintSpaceBuilder& SetFragmentationType(NGFragmentationType);
+  NGConstraintSpaceBuilder& SetFragmentationType(
+      NGFragmentationType fragmentation_type) {
+    fragmentation_type_ = fragmentation_type;
+    return *this;
+  }
 
   NGConstraintSpaceBuilder& SetSeparateLeadingFragmentainerMargins(bool b) {
     SetFlag(NGConstraintSpace::kSeparateLeadingFragmentainerMargins, b);
@@ -100,13 +118,25 @@
     return *this;
   }
 
-  NGConstraintSpaceBuilder& SetMarginStrut(const NGMarginStrut& margin_strut);
+  NGConstraintSpaceBuilder& SetMarginStrut(const NGMarginStrut& margin_strut) {
+    margin_strut_ = margin_strut;
+    return *this;
+  }
 
-  NGConstraintSpaceBuilder& SetBfcOffset(const NGBfcOffset& bfc_offset);
+  NGConstraintSpaceBuilder& SetBfcOffset(const NGBfcOffset& bfc_offset) {
+    bfc_offset_ = bfc_offset;
+    return *this;
+  }
   NGConstraintSpaceBuilder& SetFloatsBfcBlockOffset(
-      const base::Optional<LayoutUnit>&);
+      const base::Optional<LayoutUnit>& floats_bfc_block_offset) {
+    floats_bfc_block_offset_ = floats_bfc_block_offset;
+    return *this;
+  }
 
-  NGConstraintSpaceBuilder& SetClearanceOffset(LayoutUnit clearance_offset);
+  NGConstraintSpaceBuilder& SetClearanceOffset(LayoutUnit clearance_offset) {
+    clearance_offset_ = clearance_offset;
+    return *this;
+  }
 
   NGConstraintSpaceBuilder& SetShouldForceClearance(bool b) {
     SetFlag(NGConstraintSpace::kForceClearance, b);
@@ -130,9 +160,15 @@
   }
 
   NGConstraintSpaceBuilder& SetExclusionSpace(
-      const NGExclusionSpace& exclusion_space);
+      const NGExclusionSpace& exclusion_space) {
+    exclusion_space_ = &exclusion_space;
+    return *this;
+  }
 
-  void AddBaselineRequests(const Vector<NGBaselineRequest>&);
+  void AddBaselineRequests(const Vector<NGBaselineRequest>& requests) {
+    DCHECK(baseline_requests_.IsEmpty());
+    baseline_requests_.AppendVector(requests);
+  }
   NGConstraintSpaceBuilder& AddBaselineRequest(const NGBaselineRequest&);
 
   // Creates a new constraint space. This may be called multiple times, for
@@ -143,7 +179,11 @@
   //  - Has its size is determined by its parent layout (flex, abs-pos).
   //
   // WritingMode specifies the writing mode of the generated space.
-  const NGConstraintSpace ToConstraintSpace(WritingMode);
+  const NGConstraintSpace ToConstraintSpace(WritingMode out_writing_mode) {
+    return NGConstraintSpace(out_writing_mode,
+                             flags_ & NGConstraintSpace::kNewFormattingContext,
+                             *this);
+  }
 
  private:
   void SetFlag(NGConstraintSpace::ConstraintSpaceFlags mask, bool value) {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc
index 58d4250..a9a46583 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc
@@ -62,14 +62,6 @@
 
 }  // namespace
 
-bool NGLayoutInputNode::IsInline() const {
-  return type_ == kInline;
-}
-
-bool NGLayoutInputNode::IsBlock() const {
-  return type_ == kBlock;
-}
-
 bool NGLayoutInputNode::IsColumnSpanAll() const {
   return IsBlock() && box_->IsColumnSpanAll();
 }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h
index a6389c5..fb69ffe8 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h
@@ -56,8 +56,8 @@
 
   NGLayoutInputNode(std::nullptr_t) : box_(nullptr), type_(kBlock) {}
 
-  bool IsInline() const;
-  bool IsBlock() const;
+  bool IsInline() const { return type_ == kInline; }
+  bool IsBlock() const { return type_ == kBlock; }
 
   bool IsColumnSpanAll() const;
   bool IsFloating() const;
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource.cc b/third_party/blink/renderer/core/loader/resource/image_resource.cc
index a02ea02..ba6594e4 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource.cc
+++ b/third_party/blink/renderer/core/loader/resource/image_resource.cc
@@ -590,6 +590,11 @@
   DCHECK(!is_scheduling_reload_);
   is_scheduling_reload_ = true;
 
+  if (GetResourceRequest().GetPreviewsState() &
+      (WebURLRequest::kClientLoFiOn | WebURLRequest::kServerLoFiOn)) {
+    SetCachePolicyBypassingCache();
+  }
+
   // The reloaded image should not use any previews transformations.
   WebURLRequest::PreviewsState previews_state_for_reload =
       WebURLRequest::kPreviewsNoTransform;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
index 51d6553..c61588e 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -852,7 +852,7 @@
     return false;
 
   // if this element has aria attributes on it, it should not be ignored.
-  if (SupportsARIAAttributes())
+  if (HasGlobalARIAAttribute())
     return false;
 
   if (IsImage())
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index 7f8f89d..86db84d6 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -1876,6 +1876,7 @@
   const AtomicString& title = GetAttribute(titleAttr);
   if (!title.IsEmpty()) {
     text_alternative = title;
+    name_from = ax::mojom::NameFrom::kTitle;
     if (name_sources) {
       found_text_alternative = true;
       name_sources->back().text = text_alternative;
@@ -1900,8 +1901,11 @@
   return String();
 }
 
-static bool ShouldInsertSpaceBetweenObjectsIfNeeded(AXObject* previous,
-                                                    AXObject* next) {
+static bool ShouldInsertSpaceBetweenObjectsIfNeeded(
+    AXObject* previous,
+    AXObject* next,
+    ax::mojom::NameFrom last_used_name_from,
+    ax::mojom::NameFrom name_from) {
   // If we're going between two layoutObjects that are in separate
   // LayoutBoxes, add whitespace if it wasn't there already. Intuitively if
   // you have <span>Hello</span><span>World</span>, those are part of the same
@@ -1912,6 +1916,39 @@
                                   previous->GetLayoutObject()))
     return true;
 
+  // Even if it is in the same inline block flow, if we are using a text
+  // alternative such as an ARIA label or HTML title, we should separate
+  // the strings. Doing so is consistent with what is stated in the AccName
+  // spec and with what is done in other user agents.
+  switch (last_used_name_from) {
+    case ax::mojom::NameFrom::kNone:
+    case ax::mojom::NameFrom::kUninitialized:
+    case ax::mojom::NameFrom::kAttributeExplicitlyEmpty:
+    case ax::mojom::NameFrom::kContents:
+      break;
+    case ax::mojom::NameFrom::kAttribute:
+    case ax::mojom::NameFrom::kCaption:
+    case ax::mojom::NameFrom::kPlaceholder:
+    case ax::mojom::NameFrom::kRelatedElement:
+    case ax::mojom::NameFrom::kTitle:
+    case ax::mojom::NameFrom::kValue:
+      return true;
+  }
+  switch (name_from) {
+    case ax::mojom::NameFrom::kNone:
+    case ax::mojom::NameFrom::kUninitialized:
+    case ax::mojom::NameFrom::kAttributeExplicitlyEmpty:
+    case ax::mojom::NameFrom::kContents:
+      break;
+    case ax::mojom::NameFrom::kAttribute:
+    case ax::mojom::NameFrom::kCaption:
+    case ax::mojom::NameFrom::kPlaceholder:
+    case ax::mojom::NameFrom::kRelatedElement:
+    case ax::mojom::NameFrom::kTitle:
+    case ax::mojom::NameFrom::kValue:
+      return true;
+  }
+
   // According to the AccName spec, we need to separate controls from text nodes
   // using a space.
   return previous->IsControl() || next->IsControl();
@@ -1924,6 +1961,7 @@
 
   StringBuilder accumulated_text;
   AXObject* previous = nullptr;
+  ax::mojom::NameFrom last_used_name_from = ax::mojom::NameFrom::kUninitialized;
 
   AXObjectVector children;
 
@@ -1945,22 +1983,39 @@
     if (child->AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kHidden))
       continue;
 
+    ax::mojom::NameFrom child_name_from = ax::mojom::NameFrom::kUninitialized;
     String result;
-    if (child->IsPresentational())
+    if (child->IsPresentational()) {
       result = child->TextFromDescendants(visited, true);
-    else
-      result = RecursiveTextAlternative(*child, false, visited);
+    } else {
+      result =
+          RecursiveTextAlternative(*child, false, visited, child_name_from);
+    }
 
     if (!result.IsEmpty() && previous && accumulated_text.length() &&
         !IsHTMLSpace(accumulated_text[accumulated_text.length() - 1]) &&
         !IsHTMLSpace(result[0])) {
-      if (ShouldInsertSpaceBetweenObjectsIfNeeded(previous, child)) {
+      if (ShouldInsertSpaceBetweenObjectsIfNeeded(
+              previous, child, last_used_name_from, child_name_from)) {
         accumulated_text.Append(' ');
       }
     }
 
     accumulated_text.Append(result);
+
+    // We keep track of all non-hidden children, even those whose content is
+    // not included, because all rendered children impact whether or not a
+    // space should be inserted between objects. Example: A label which has
+    // a single, nameless input surrounded by CSS-generated content should
+    // have a space separating the before and after content.
     previous = child;
+
+    // We only keep track of the source of children whose content is included.
+    // Example: Three spans, the first with an aria-label, the second with no
+    // content, and the third whose name comes from content. There should be a
+    // space between the first and third because of the aria-label in the first.
+    if (!result.IsEmpty())
+      last_used_name_from = child_name_from;
   }
 
   return accumulated_text.ToString();
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index 67362208..25aaa69 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -1444,12 +1444,20 @@
 String AXObject::RecursiveTextAlternative(const AXObject& ax_obj,
                                           bool in_aria_labelled_by_traversal,
                                           AXObjectSet& visited) {
+  ax::mojom::NameFrom tmp_name_from;
+  return RecursiveTextAlternative(ax_obj, in_aria_labelled_by_traversal,
+                                  visited, tmp_name_from);
+}
+
+String AXObject::RecursiveTextAlternative(const AXObject& ax_obj,
+                                          bool in_aria_labelled_by_traversal,
+                                          AXObjectSet& visited,
+                                          ax::mojom::NameFrom& name_from) {
   if (visited.Contains(&ax_obj) && !in_aria_labelled_by_traversal)
     return String();
 
-  ax::mojom::NameFrom tmp_name_from;
   return ax_obj.TextAlternative(true, in_aria_labelled_by_traversal, visited,
-                                tmp_name_from, nullptr, nullptr);
+                                name_from, nullptr, nullptr);
 }
 
 bool AXObject::IsHiddenForTextAlternativeCalculation() const {
@@ -1820,10 +1828,62 @@
   }
 }
 
-bool AXObject::SupportsARIAAttributes() const {
-  return IsLiveRegion() || SupportsARIADragging() || SupportsARIADropping() ||
-         SupportsARIAFlowTo() || SupportsARIAOwns() ||
-         HasAttribute(aria_labelAttr) || HasAttribute(aria_currentAttr);
+bool AXObject::HasGlobalARIAAttribute() const {
+  if (!GetElement())
+    return false;
+
+  AttributeCollection attributes = GetElement()->AttributesWithoutUpdate();
+  for (const Attribute& attr : attributes) {
+    // Attributes cache their uppercase names.
+    auto name = attr.GetName().LocalNameUpper();
+    if (!name.StartsWith("ARIA"))
+      continue;
+    if (name.StartsWith("ARIA-ATOMIC"))
+      return true;
+    if (name.StartsWith("ARIA-BUSY"))
+      return true;
+    if (name.StartsWith("ARIA-CONTROLS"))
+      return true;
+    if (name.StartsWith("ARIA-CURRENT"))
+      return true;
+    if (name.StartsWith("ARIA-DESCRIBEDBY"))
+      return true;
+    if (name.StartsWith("ARIA-DETAILS"))
+      return true;
+    if (name.StartsWith("ARIA-DISABLED"))
+      return true;
+    if (name.StartsWith("ARIA-DROPEFFECT"))
+      return true;
+    if (name.StartsWith("ARIA-ERRORMESSAGE"))
+      return true;
+    if (name.StartsWith("ARIA-FLOWTO"))
+      return true;
+    if (name.StartsWith("ARIA-GRABBED"))
+      return true;
+    if (name.StartsWith("ARIA-HASPOPUP"))
+      return true;
+    if (name.StartsWith("ARIA-HIDDEN"))
+      return true;
+    if (name.StartsWith("ARIA-INVALID"))
+      return true;
+    if (name.StartsWith("ARIA-KEYSHORTCUTS"))
+      return true;
+    if (name.StartsWith("ARIA-LABEL"))
+      return true;
+    if (name.StartsWith("ARIA-LABELEDBY"))
+      return true;
+    if (name.StartsWith("ARIA-LABELLEDBY"))
+      return true;
+    if (name.StartsWith("ARIA-LIVE"))
+      return true;
+    if (name.StartsWith("ARIA-OWNS"))
+      return true;
+    if (name.StartsWith("ARIA-RELEVANT"))
+      return true;
+    if (name.StartsWith("ARIA-ROLEDESCRIPTION"))
+      return true;
+  }
+  return false;
 }
 
 bool AXObject::SupportsRangeValue() const {
@@ -1891,9 +1951,11 @@
   ax::mojom::Role role = AriaRoleToWebCoreRole(aria_role);
 
   // ARIA states if an item can get focus, it should not be presentational.
+  // It also states user agents should ignore the presentational role if
+  // the element has global ARIA states and properties.
   if ((role == ax::mojom::Role::kNone ||
        role == ax::mojom::Role::kPresentational) &&
-      CanSetFocusAttribute())
+      (CanSetFocusAttribute() || HasGlobalARIAAttribute()))
     return ax::mojom::Role::kUnknown;
 
   if (role == ax::mojom::Role::kButton)
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h
index b86749b1..34a1c79 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -748,7 +748,7 @@
   virtual bool IsRichlyEditable() const { return false; }
   bool AriaCheckedIsPresent() const;
   bool AriaPressedIsPresent() const;
-  bool SupportsARIAAttributes() const;
+  bool HasGlobalARIAAttribute() const;
   bool SupportsARIAExpanded() const;
   virtual bool SupportsARIADragging() const { return false; }
   virtual bool SupportsARIADropping() const { return false; }
@@ -1019,6 +1019,10 @@
   static String RecursiveTextAlternative(const AXObject&,
                                          bool in_aria_labelled_by_traversal,
                                          AXObjectSet& visited);
+  static String RecursiveTextAlternative(const AXObject&,
+                                         bool in_aria_labelled_by_traversal,
+                                         AXObjectSet& visited,
+                                         ax::mojom::NameFrom& name_from);
   bool IsHiddenForTextAlternativeCalculation() const;
   String AriaTextAlternative(bool recursive,
                              bool in_aria_labelled_by_traversal,
diff --git a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
index 3687e32..0ce6e7f 100644
--- a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
+++ b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
@@ -306,7 +306,6 @@
   DCHECK(IsMainThread());
   if (play_state_ == Animation::kPending)
     return;
-  document_->GetWorkletAnimationController().AttachAnimation(*this);
 
   String failure_message;
   if (!CheckCanStart(&failure_message)) {
@@ -315,6 +314,7 @@
     return;
   }
 
+  document_->GetWorkletAnimationController().AttachAnimation(*this);
   SetPlayState(Animation::kPending);
 
   for (auto& effect : effects_) {
@@ -416,6 +416,8 @@
 }
 
 void WorkletAnimation::UpdateCompositingState() {
+  DCHECK(play_state_ != Animation::kIdle && play_state_ != Animation::kUnset);
+
   if (play_state_ == Animation::kPending) {
     String warning_message;
     DCHECK(CheckCanStart(&warning_message));
@@ -429,8 +431,14 @@
         kOtherMessageSource, kWarningMessageLevel, message));
     StartOnMain();
   } else if (play_state_ == Animation::kRunning) {
-    UpdateOnCompositor();
+    // TODO(majidvp): If keyframes have changed then it may be possible to now
+    // run the animation on compositor. The current logic does not allow this
+    // switch from main to compositor to happen.
+    if (!running_on_main_thread_)
+      UpdateOnCompositor();
   }
+  DCHECK(running_on_main_thread_ != !!compositor_animation_)
+      << "Active worklet animation should either run on main or compositor";
 }
 
 void WorkletAnimation::InvalidateCompositingState() {
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc
index 1c982f3..e5170cb5 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc
@@ -114,10 +114,18 @@
     // Update the src of |icon| to include the base URL in case relative paths
     // were used.
     icon.setSrc(execution_context->CompleteURL(icon.src()));
-    icons.emplace_back(blink::ConvertManifestImageResource(icon));
+    Manifest::ImageResource candidate_icon =
+        blink::ConvertManifestImageResource(icon);
+    // Provide default values for 'purpose' and 'sizes' if they are missing.
+    if (candidate_icon.sizes.empty())
+      candidate_icon.sizes.emplace_back(gfx::Size(0, 0));
+    if (candidate_icon.purpose.empty()) {
+      candidate_icon.purpose.emplace_back(
+          Manifest::ImageResource::Purpose::ANY);
+    }
+    icons.emplace_back(candidate_icon);
   }
 
-  // TODO(crbug.com/868875): Handle cases where `sizes` or `purpose` is empty.
   return KURL(ManifestIconSelector::FindBestMatchingIcon(
       std::move(icons), icon_display_size_pixels_.height, kMinimumIconSizeInPx,
       Manifest::ImageResource::Purpose::ANY));
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader_test.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader_test.cc
index 839d2ada..7670984 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader_test.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader_test.cc
@@ -97,12 +97,14 @@
 
   void LoadIcon(const KURL& url,
                 const WebSize& maximum_size,
-                base::OnceClosure quit_closure) {
+                base::OnceClosure quit_closure,
+                const String& sizes = "500x500",
+                const String& purpose = "ANY") {
     ManifestImageResource icon;
     icon.setSrc(url.GetString());
     icon.setType("image/png");
-    icon.setSizes("500x500");
-    icon.setPurpose("ANY");
+    icon.setSizes(sizes);
+    icon.setPurpose(purpose);
     HeapVector<ManifestImageResource> icons(1, icon);
     loader_->icons_ = std::move(icons);
     loader_->DidGetIconDisplaySizeIfSoLoadIcon(
@@ -183,4 +185,34 @@
                             kBackgroundFetchImageLoaderIcon48x48));
 }
 
+TEST_F(BackgroundFetchIconLoaderTest, EmptySizes) {
+  base::RunLoop run_loop;
+
+  WebSize maximum_size{192, 168};
+  LoadIcon(KURL(kBackgroundFetchImageLoaderIcon500x500FullPath), maximum_size,
+           run_loop.QuitClosure(), "", "ANY");
+
+  platform_->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
+
+  run_loop.Run();
+
+  ASSERT_EQ(BackgroundFetchLoadState::kLoadSuccessful, loaded_);
+  ASSERT_FALSE(bitmap_.drawsNothing());
+}
+
+TEST_F(BackgroundFetchIconLoaderTest, EmptyPurpose) {
+  base::RunLoop run_loop;
+
+  WebSize maximum_size{192, 168};
+  LoadIcon(KURL(kBackgroundFetchImageLoaderIcon500x500FullPath), maximum_size,
+           run_loop.QuitClosure(), "500X500", "");
+
+  platform_->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
+
+  run_loop.Run();
+
+  ASSERT_EQ(BackgroundFetchLoadState::kLoadSuccessful, loaded_);
+  ASSERT_FALSE(bitmap_.drawsNothing());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.cc b/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.cc
index 2f6a900..e7b9e67b 100644
--- a/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/authenticator_attestation_response.cc
@@ -31,6 +31,7 @@
   for (auto transport : transports_) {
     ret.emplace_back(mojo::ConvertTo<String>(transport));
   }
+  std::sort(ret.begin(), ret.end(), WTF::CodePointCompareLessThan);
   return ret;
 }
 
diff --git a/third_party/blink/renderer/modules/filesystem/README.md b/third_party/blink/renderer/modules/filesystem/README.md
new file mode 100644
index 0000000..6e3f3df
--- /dev/null
+++ b/third_party/blink/renderer/modules/filesystem/README.md
@@ -0,0 +1,74 @@
+# FileSystem API
+
+This directory contains the renderer side implementation of various filesystem
+related APIs.
+
+## Related directories
+
+[`//storage/browser/fileapi/`](../../../storage/browser/fileapi) contains part
+of the browser side implementation, while
+[`//content/browser/fileapi/`](../../../content/browser/fileapi) contains the
+rest of the browser side implementation and
+[`blink/public/mojom/filesystem`](../../../third_party/blink/public/mojom/filesystem)
+contains the mojom interfaces for these APIs.
+
+## APIs In this directory
+
+### File and Directory Entries API
+
+First of all this directory contains the implementation of the
+[Entries API](https://wicg.github.io/entries-api). This API consists of
+types to expose read-only access to file and directory entries to the web,
+primarily used by drag-and-drop and `<input type=file>`. Our implementation
+doesn't match the interface names of the spec, but otherwise should be pretty
+close to the spec.
+
+TODO(mek): More details
+
+### File API: Directories and FileSystem
+
+Secondly this directory contains the implementation of something similar to the
+deprecated [w3c file-system-api](https://www.w3.org/TR/2012/WD-file-system-api-20120417/).
+This API is very similar to the previous Entries API, but it also adds support
+for writing and modifying to files and directories, as well as a way to get
+access to a origin scoped sandboxed filesystem.
+
+TODO(mek): More details
+
+### Writable Files
+
+Finally this directory contains the implementation of the new and still under
+development [Writable Files API](https://github.com/WICG/writable-files/blob/master/EXPLAINER.md).
+This API is mostly implemented on top of the same backend as the previous two
+APIs, but hopes to eventually replace both of those, while also adding new
+functionality.
+
+It consists of the following parts:
+
+ * `FileSystemBaseHandle`, `FileSystemFileHandle` and `FileSystemDirectoryHandle`:
+   these interfaces mimic the old `Entry` interfaces (and inherit from `EntryBase`
+   to share as much of the implementation as possible), but expose a more modern
+   promisified API.
+
+ * `getSystemDirectory`: An entry point (exposed via `FileSystemDirectoryHandle`)
+   that today only gives access to the same sandboxed filesystem as what was
+   available through the old API. In the future this could get extended to add
+   support for other directories as well.
+
+ * `FileSystemWriter`: a more modern API with similar functionality to the
+   old `FileWriter` API. The implementation of this actually does make use of
+   a different mojom interface than the old API. But since the functionality is
+   mostly the same, hopefully we will be able to migrate the old implementation
+   to the new mojom API as well.
+
+ * `chooseFileSystemEntries`: An entry point, currently on `window`, that lets
+   a website pop-up a file picker, prompting the user to select one or more
+   files or directories, to which the website than gets access.
+
+Since the `Handle` interfaces are based on the implementation of the `Entry`
+interfaces, internally and across IPC these are still represented by
+`filesystem://` URLs. Hopefully in the future we will be able to change this and
+turn it into a more capabilities based API (where having a mojo handle gives you
+access to specific files or directories), as with the current implementation it
+is very hard to properly support transferring handles to other processes via
+postMessage (which is something we do want to support in the future).
diff --git a/third_party/blink/renderer/modules/filesystem/choose_file_system_entries_options.idl b/third_party/blink/renderer/modules/filesystem/choose_file_system_entries_options.idl
new file mode 100644
index 0000000..8e50e6f
--- /dev/null
+++ b/third_party/blink/renderer/modules/filesystem/choose_file_system_entries_options.idl
@@ -0,0 +1,11 @@
+// Copyright 2018 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.
+
+// https://github.com/WICG/writable-files/blob/master/EXPLAINER.md
+enum ChooseFileSystemEntriesType { "openFile", "saveFile", "openDirectory" };
+
+dictionary ChooseFileSystemEntriesOptions {
+    ChooseFileSystemEntriesType type = "openFile";
+    boolean multiple = false;
+};
diff --git a/third_party/blink/renderer/modules/filesystem/dom_window_file_system.cc b/third_party/blink/renderer/modules/filesystem/dom_window_file_system.cc
index 5a8ee47fd..ea4b4e2 100644
--- a/third_party/blink/renderer/modules/filesystem/dom_window_file_system.cc
+++ b/third_party/blink/renderer/modules/filesystem/dom_window_file_system.cc
@@ -135,7 +135,8 @@
 
 ScriptPromise DOMWindowFileSystem::chooseFileSystemEntries(
     ScriptState* script_state,
-    LocalDOMWindow& window) {
+    LocalDOMWindow& window,
+    const ChooseFileSystemEntriesOptions& options) {
   if (!window.IsCurrentlyDisplayedInFrame()) {
     return ScriptPromise::RejectWithDOMException(
         script_state, DOMException::Create(DOMExceptionCode::kAbortError));
@@ -157,7 +158,7 @@
 
   auto* resolver = ScriptPromiseResolver::Create(script_state);
   ScriptPromise result = resolver->Promise();
-  LocalFileSystem::From(*document)->ChooseEntry(resolver);
+  LocalFileSystem::From(*document)->ChooseEntry(resolver, options);
   return result;
 }
 
diff --git a/third_party/blink/renderer/modules/filesystem/dom_window_file_system.h b/third_party/blink/renderer/modules/filesystem/dom_window_file_system.h
index a12e3be..8d4264d 100644
--- a/third_party/blink/renderer/modules/filesystem/dom_window_file_system.h
+++ b/third_party/blink/renderer/modules/filesystem/dom_window_file_system.h
@@ -32,6 +32,7 @@
 
 namespace blink {
 
+class ChooseFileSystemEntriesOptions;
 class LocalDOMWindow;
 class ScriptPromise;
 class ScriptState;
@@ -60,7 +61,10 @@
     kPersistent,
   };
 
-  static ScriptPromise chooseFileSystemEntries(ScriptState*, LocalDOMWindow&);
+  static ScriptPromise chooseFileSystemEntries(
+      ScriptState*,
+      LocalDOMWindow&,
+      const ChooseFileSystemEntriesOptions&);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_dispatcher.cc b/third_party/blink/renderer/modules/filesystem/file_system_dispatcher.cc
index 4c99f50..fe82262 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_dispatcher.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_system_dispatcher.cc
@@ -436,18 +436,20 @@
 }
 
 void FileSystemDispatcher::ChooseEntry(
+    mojom::blink::ChooseFileSystemEntryType type,
     std::unique_ptr<ChooseEntryCallbacks> callbacks) {
-  GetFileSystemManager().ChooseEntry(WTF::Bind(
-      [](std::unique_ptr<ChooseEntryCallbacks> callbacks,
-         base::File::Error result,
-         Vector<mojom::blink::FileSystemEntryPtr> entries) {
-        if (result != base::File::FILE_OK) {
-          callbacks->OnError(result);
-        } else {
-          callbacks->OnSuccess(std::move(entries));
-        }
-      },
-      std::move(callbacks)));
+  GetFileSystemManager().ChooseEntry(
+      type, WTF::Bind(
+                [](std::unique_ptr<ChooseEntryCallbacks> callbacks,
+                   base::File::Error result,
+                   Vector<mojom::blink::FileSystemEntryPtr> entries) {
+                  if (result != base::File::FILE_OK) {
+                    callbacks->OnError(result);
+                  } else {
+                    callbacks->OnSuccess(std::move(entries));
+                  }
+                },
+                std::move(callbacks)));
 }
 
 mojom::blink::FileSystemManager& FileSystemDispatcher::GetFileSystemManager() {
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_dispatcher.h b/third_party/blink/renderer/modules/filesystem/file_system_dispatcher.h
index d8a899a..bbee2b8 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_dispatcher.h
+++ b/third_party/blink/renderer/modules/filesystem/file_system_dispatcher.h
@@ -143,7 +143,8 @@
 
   using ChooseEntryCallbacks =
       WebCallbacks<Vector<mojom::blink::FileSystemEntryPtr>, base::File::Error>;
-  void ChooseEntry(std::unique_ptr<ChooseEntryCallbacks> callbacks);
+  void ChooseEntry(mojom::blink::ChooseFileSystemEntryType,
+                   std::unique_ptr<ChooseEntryCallbacks> callbacks);
 
  private:
   class WriteListener;
diff --git a/third_party/blink/renderer/modules/filesystem/local_file_system.cc b/third_party/blink/renderer/modules/filesystem/local_file_system.cc
index 0951745..233e973 100644
--- a/third_party/blink/renderer/modules/filesystem/local_file_system.cc
+++ b/third_party/blink/renderer/modules/filesystem/local_file_system.cc
@@ -43,6 +43,7 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
 #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
+#include "third_party/blink/renderer/modules/filesystem/choose_file_system_entries_options.h"
 #include "third_party/blink/renderer/modules/filesystem/directory_entry.h"
 #include "third_party/blink/renderer/modules/filesystem/dom_file_system.h"
 #include "third_party/blink/renderer/modules/filesystem/file_system_client.h"
@@ -120,12 +121,13 @@
     : public WebCallbacks<Vector<mojom::blink::FileSystemEntryPtr>,
                           base::File::Error> {
  public:
-  ChooseEntryCallbacks(ScriptPromiseResolver* resolver, bool return_multiple)
-      : resolver_(resolver), return_multiple_(return_multiple) {}
+  ChooseEntryCallbacks(ScriptPromiseResolver* resolver,
+                       const ChooseFileSystemEntriesOptions& options)
+      : resolver_(resolver), options_(options) {}
 
   void OnSuccess(Vector<mojom::blink::FileSystemEntryPtr> entries) override {
     ScriptState::Scope scope(resolver_->GetScriptState());
-    if (return_multiple_) {
+    if (options_.multiple()) {
       Vector<ScriptPromise> result;
       result.ReserveInitialCapacity(SafeCast<wtf_size_t>(entries.size()));
       for (const auto& entry : entries)
@@ -152,19 +154,43 @@
         resolver_->GetExecutionContext(), entry->file_system_id);
     // TODO(mek): Try to create handle directly rather than having to do more
     // IPCs to get the actual entries.
-    fs->GetFile(fs->root(), entry->base_name, FileSystemFlags(),
-                new EntryCallbacks::OnDidGetEntryPromiseImpl(new_resolver),
-                new PromiseErrorCallback(new_resolver));
+    if (options_.type() == "openDirectory") {
+      fs->GetDirectory(
+          fs->root(), entry->base_name, FileSystemFlags(),
+          new EntryCallbacks::OnDidGetEntryPromiseImpl(new_resolver),
+          new PromiseErrorCallback(new_resolver));
+    } else {
+      fs->GetFile(fs->root(), entry->base_name, FileSystemFlags(),
+                  new EntryCallbacks::OnDidGetEntryPromiseImpl(new_resolver),
+                  new PromiseErrorCallback(new_resolver));
+    }
     return result;
   }
 
   Persistent<ScriptPromiseResolver> resolver_;
-  bool return_multiple_;
+  ChooseFileSystemEntriesOptions options_;
 };
 
+mojom::blink::ChooseFileSystemEntryType ConvertChooserType(const String& input,
+                                                           bool multiple) {
+  if (input == "openFile") {
+    return multiple
+               ? mojom::blink::ChooseFileSystemEntryType::kOpenMultipleFiles
+               : mojom::blink::ChooseFileSystemEntryType::kOpenFile;
+  }
+  if (input == "saveFile")
+    return mojom::blink::ChooseFileSystemEntryType::kSaveFile;
+  if (input == "openDirectory")
+    return mojom::blink::ChooseFileSystemEntryType::kOpenDirectory;
+  NOTREACHED();
+  return mojom::blink::ChooseFileSystemEntryType::kOpenFile;
+}
+
 }  // namespace
 
-void LocalFileSystem::ChooseEntry(ScriptPromiseResolver* resolver) {
+void LocalFileSystem::ChooseEntry(
+    ScriptPromiseResolver* resolver,
+    const ChooseFileSystemEntriesOptions& options) {
   if (!base::FeatureList::IsEnabled(blink::features::kWritableFilesAPI)) {
     resolver->Reject(
         FileError::CreateDOMException(base::File::FILE_ERROR_ABORT));
@@ -172,7 +198,8 @@
   }
 
   FileSystemDispatcher::From(resolver->GetExecutionContext())
-      .ChooseEntry(std::make_unique<ChooseEntryCallbacks>(resolver, false));
+      .ChooseEntry(ConvertChooserType(options.type(), options.multiple()),
+                   std::make_unique<ChooseEntryCallbacks>(resolver, options));
 }
 
 void LocalFileSystem::RequestFileSystemAccessInternal(
diff --git a/third_party/blink/renderer/modules/filesystem/local_file_system.h b/third_party/blink/renderer/modules/filesystem/local_file_system.h
index b137d0e9..5a4a6fa 100644
--- a/third_party/blink/renderer/modules/filesystem/local_file_system.h
+++ b/third_party/blink/renderer/modules/filesystem/local_file_system.h
@@ -45,6 +45,7 @@
 
 class AsyncFileSystemCallbacks;
 class CallbackWrapper;
+class ChooseFileSystemEntriesOptions;
 class FileSystemClient;
 class ExecutionContext;
 class KURL;
@@ -76,7 +77,8 @@
                          std::unique_ptr<AsyncFileSystemCallbacks>,
                          SynchronousType sync_type);
 
-  void ChooseEntry(ScriptPromiseResolver*);
+  void ChooseEntry(ScriptPromiseResolver*,
+                   const ChooseFileSystemEntriesOptions& options);
 
   FileSystemClient& Client() const { return *client_; }
 
diff --git a/third_party/blink/renderer/modules/filesystem/window_file_system.idl b/third_party/blink/renderer/modules/filesystem/window_file_system.idl
index 3259df9f..ed10797d 100644
--- a/third_party/blink/renderer/modules/filesystem/window_file_system.idl
+++ b/third_party/blink/renderer/modules/filesystem/window_file_system.idl
@@ -41,5 +41,6 @@
     // https://github.com/WICG/writable-files/blob/master/EXPLAINER.md
     // TODO(crbug.com/878581): This needs some kind of options dictionary.
     [RuntimeEnabled=WritableFiles, CallWith=ScriptState, SecureContext]
-    Promise<(FileSystemBaseHandle or sequence<FileSystemBaseHandle>)> chooseFileSystemEntries();
+    Promise<(FileSystemBaseHandle or sequence<FileSystemBaseHandle>)>
+        chooseFileSystemEntries(optional ChooseFileSystemEntriesOptions options);
 };
diff --git a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css b/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css
index 68cb989..0008b69 100644
--- a/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css
+++ b/third_party/blink/renderer/modules/media_controls/resources/modernMediaControls.css
@@ -598,7 +598,7 @@
   -webkit-appearance: -internal-media-control;
 
   height: 4px;
-  width: 100px;
+  width: 52px;
   transition: width 0.3s;
   margin: 0;
   padding: 22px 0; /* (48px button panel height - 4px slider height) / 2  */
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni
index 763c8494..3c69f24 100644
--- a/third_party/blink/renderer/modules/modules_idl_files.gni
+++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -528,6 +528,7 @@
           "encryptedmedia/media_key_system_media_capability.idl",
           "encryptedmedia/media_keys_policy.idl",
           "eventsource/event_source_init.idl",
+          "filesystem/choose_file_system_entries_options.idl",
           "filesystem/file_system_directory_iterator_entry.idl",
           "filesystem/file_system_flags.idl",
           "filesystem/file_system_get_directory_options.idl",
diff --git a/third_party/blink/renderer/modules/permissions/permission_descriptor.idl b/third_party/blink/renderer/modules/permissions/permission_descriptor.idl
index 0fca2df..d222ccb 100644
--- a/third_party/blink/renderer/modules/permissions/permission_descriptor.idl
+++ b/third_party/blink/renderer/modules/permissions/permission_descriptor.idl
@@ -12,6 +12,7 @@
     "microphone",
     // "speaker",
     // "device-info",
+    "background-fetch",
     "background-sync",
     // "bluetooth",
     "persistent-storage",
diff --git a/third_party/blink/renderer/modules/permissions/permissions.cc b/third_party/blink/renderer/modules/permissions/permissions.cc
index 695ad24..402001ad 100644
--- a/third_party/blink/renderer/modules/permissions/permissions.cc
+++ b/third_party/blink/renderer/modules/permissions/permissions.cc
@@ -139,6 +139,13 @@
   }
   if (name == "payment-handler")
     return CreatePermissionDescriptor(PermissionName::PAYMENT_HANDLER);
+  if (name == "background-fetch") {
+    if (!RuntimeEnabledFeatures::BackgroundFetchEnabled()) {
+      exception_state.ThrowTypeError("Background Fetch is not enabled.");
+      return nullptr;
+    }
+    return CreatePermissionDescriptor(PermissionName::BACKGROUND_FETCH);
+  }
 
   return nullptr;
 }
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc
index 6c6e417..9669d35 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
@@ -14,13 +14,18 @@
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/use_counter.h"
+#include "third_party/blink/renderer/core/html/media/html_media_element.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/core/timing/dom_window_performance.h"
 #include "third_party/blink/renderer/core/timing/window_performance.h"
+#include "third_party/blink/renderer/modules/mediastream/media_stream.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_context_options.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_timestamp.h"
 #include "third_party/blink/renderer/modules/webaudio/default_audio_destination_node.h"
+#include "third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.h"
+#include "third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.h"
+#include "third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.h"
 #include "third_party/blink/renderer/platform/audio/audio_utilities.h"
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -327,6 +332,32 @@
          static_cast<double>(sampleRate());
 }
 
+MediaElementAudioSourceNode* AudioContext::createMediaElementSource(
+    HTMLMediaElement* media_element,
+    ExceptionState& exception_state) {
+  DCHECK(IsMainThread());
+
+  return MediaElementAudioSourceNode::Create(*this, *media_element,
+                                             exception_state);
+}
+
+MediaStreamAudioSourceNode* AudioContext::createMediaStreamSource(
+    MediaStream* media_stream,
+    ExceptionState& exception_state) {
+  DCHECK(IsMainThread());
+
+  return MediaStreamAudioSourceNode::Create(*this, *media_stream,
+                                            exception_state);
+}
+
+MediaStreamAudioDestinationNode* AudioContext::createMediaStreamDestination(
+    ExceptionState& exception_state) {
+  DCHECK(IsMainThread());
+
+  // Set number of output channels to stereo by default.
+  return MediaStreamAudioDestinationNode::Create(*this, 2, exception_state);
+}
+
 void AudioContext::NotifySourceNodeStart() {
   source_node_started_ = true;
   if (!user_gesture_required_)
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.h b/third_party/blink/renderer/modules/webaudio/audio_context.h
index 2c93de4..7a3db4c 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_context.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_context.h
@@ -19,6 +19,11 @@
 class AudioTimestamp;
 class Document;
 class ExceptionState;
+class HTMLMediaElement;
+class MediaElementAudioSourceNode;
+class MediaStream;
+class MediaStreamAudioDestinationNode;
+class MediaStreamAudioSourceNode;
 class ScriptState;
 class WebAudioLatencyHint;
 
@@ -49,6 +54,13 @@
   void getOutputTimestamp(ScriptState*, AudioTimestamp&);
   double baseLatency() const;
 
+  MediaElementAudioSourceNode* createMediaElementSource(HTMLMediaElement*,
+                                                        ExceptionState&);
+  MediaStreamAudioSourceNode* createMediaStreamSource(MediaStream*,
+                                                      ExceptionState&);
+  MediaStreamAudioDestinationNode* createMediaStreamDestination(
+      ExceptionState&);
+
   // Called by handlers of AudioScheduledSourceNode and AudioBufferSourceNode to
   // notify their associated AudioContext when start() is called. It may resume
   // the AudioContext if it is now allowed to start.
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.idl b/third_party/blink/renderer/modules/webaudio/audio_context.idl
index cd64c27..e386af9 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_context.idl
+++ b/third_party/blink/renderer/modules/webaudio/audio_context.idl
@@ -49,10 +49,8 @@
     // passing the audio from the AudioDestinationNode to the audio subsystem
     readonly attribute double baseLatency;
 
-    // Sources
-    // TODO(rtoy): The following methods should be here instead of in BaseAudioContext:
-    //
-    // createMediaElementSource(HTMLMediaElement mediaElement)
-    // createMediaStreamSource(MediaStream mediaStream)
-    // createMediaStreamDestination()
+    [RaisesException, MeasureAs=AudioContextCreateMediaElementSource] MediaElementAudioSourceNode createMediaElementSource(HTMLMediaElement mediaElement);
+    [RaisesException, MeasureAs=AudioContextCreateMediaStreamSource] MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream);
+    [RaisesException, MeasureAs=AudioContextCreateMediaStreamDestination] MediaStreamAudioDestinationNode createMediaStreamDestination();
+
 };
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
index 600a1b53..fb348f02 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
@@ -33,10 +33,10 @@
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
+#include "third_party/blink/renderer/core/html/media/autoplay_policy.h"
 #include "third_party/blink/renderer/core/html/media/html_media_element.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/core/inspector/console_types.h"
-#include "third_party/blink/renderer/modules/mediastream/media_stream.h"
 #include "third_party/blink/renderer/modules/webaudio/analyser_node.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_buffer.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_buffer_source_node.h"
@@ -56,9 +56,6 @@
 #include "third_party/blink/renderer/modules/webaudio/dynamics_compressor_node.h"
 #include "third_party/blink/renderer/modules/webaudio/gain_node.h"
 #include "third_party/blink/renderer/modules/webaudio/iir_filter_node.h"
-#include "third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.h"
-#include "third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.h"
-#include "third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.h"
 #include "third_party/blink/renderer/modules/webaudio/offline_audio_completion_event.h"
 #include "third_party/blink/renderer/modules/webaudio/offline_audio_context.h"
 #include "third_party/blink/renderer/modules/webaudio/offline_audio_destination_node.h"
@@ -368,32 +365,6 @@
   return ConstantSourceNode::Create(*this, exception_state);
 }
 
-MediaElementAudioSourceNode* BaseAudioContext::createMediaElementSource(
-    HTMLMediaElement* media_element,
-    ExceptionState& exception_state) {
-  DCHECK(IsMainThread());
-
-  return MediaElementAudioSourceNode::Create(*this, *media_element,
-                                             exception_state);
-}
-
-MediaStreamAudioSourceNode* BaseAudioContext::createMediaStreamSource(
-    MediaStream* media_stream,
-    ExceptionState& exception_state) {
-  DCHECK(IsMainThread());
-
-  return MediaStreamAudioSourceNode::Create(*this, *media_stream,
-                                            exception_state);
-}
-
-MediaStreamAudioDestinationNode* BaseAudioContext::createMediaStreamDestination(
-    ExceptionState& exception_state) {
-  DCHECK(IsMainThread());
-
-  // Set number of output channels to stereo by default.
-  return MediaStreamAudioDestinationNode::Create(*this, 2, exception_state);
-}
-
 ScriptProcessorNode* BaseAudioContext::createScriptProcessor(
     ExceptionState& exception_state) {
   DCHECK(IsMainThread());
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.h b/third_party/blink/renderer/modules/webaudio/base_audio_context.h
index 7ce3971..d0a57608 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.h
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.h
@@ -71,12 +71,7 @@
 class DynamicsCompressorNode;
 class ExceptionState;
 class GainNode;
-class HTMLMediaElement;
 class IIRFilterNode;
-class MediaElementAudioSourceNode;
-class MediaStream;
-class MediaStreamAudioDestinationNode;
-class MediaStreamAudioSourceNode;
 class OscillatorNode;
 class PannerNode;
 class PeriodicWave;
@@ -179,12 +174,6 @@
   // JavaScript).
   AudioBufferSourceNode* createBufferSource(ExceptionState&);
   ConstantSourceNode* createConstantSource(ExceptionState&);
-  MediaElementAudioSourceNode* createMediaElementSource(HTMLMediaElement*,
-                                                        ExceptionState&);
-  MediaStreamAudioSourceNode* createMediaStreamSource(MediaStream*,
-                                                      ExceptionState&);
-  MediaStreamAudioDestinationNode* createMediaStreamDestination(
-      ExceptionState&);
   GainNode* createGain(ExceptionState&);
   BiquadFilterNode* createBiquadFilter(ExceptionState&);
   WaveShaperNode* createWaveShaper(ExceptionState&);
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.idl b/third_party/blink/renderer/modules/webaudio/base_audio_context.idl
index 00b7009..a1d7cd6 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.idl
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.idl
@@ -61,12 +61,6 @@
     [RaisesException, MeasureAs=AudioContextCreateChannelSplitter] ChannelSplitterNode createChannelSplitter(optional unsigned long numberOfOutputs);
     [RaisesException, MeasureAs=AudioContextCreateChannelMerger] ChannelMergerNode createChannelMerger(optional unsigned long numberOfInputs);
 
-    // TODO(rtoy): These really belong to the AudioContext, but we need them
-    // here so we can use an offline audio context to test these.
-    [RaisesException, MeasureAs=AudioContextCreateMediaElementSource] MediaElementAudioSourceNode createMediaElementSource(HTMLMediaElement mediaElement);
-    [RaisesException, MeasureAs=AudioContextCreateMediaStreamSource] MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream);
-    [RaisesException, MeasureAs=AudioContextCreateMediaStreamDestination] MediaStreamAudioDestinationNode createMediaStreamDestination();
-
     [SecureContext] readonly attribute AudioWorklet audioWorklet;
 
     attribute EventHandler onstatechange;
diff --git a/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.cc b/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.cc
index 9c24f3a..67289c4 100644
--- a/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.cc
@@ -29,8 +29,8 @@
 #include "third_party/blink/renderer/core/frame/deprecation.h"
 #include "third_party/blink/renderer/core/html/media/html_media_element.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
+#include "third_party/blink/renderer/modules/webaudio/audio_context.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_node_output.h"
-#include "third_party/blink/renderer/modules/webaudio/base_audio_context.h"
 #include "third_party/blink/renderer/modules/webaudio/media_element_audio_source_options.h"
 #include "third_party/blink/renderer/platform/audio/audio_utilities.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -217,14 +217,14 @@
 // ----------------------------------------------------------------
 
 MediaElementAudioSourceNode::MediaElementAudioSourceNode(
-    BaseAudioContext& context,
+    AudioContext& context,
     HTMLMediaElement& media_element)
     : AudioNode(context) {
   SetHandler(MediaElementAudioSourceHandler::Create(*this, media_element));
 }
 
 MediaElementAudioSourceNode* MediaElementAudioSourceNode::Create(
-    BaseAudioContext& context,
+    AudioContext& context,
     HTMLMediaElement& media_element,
     ExceptionState& exception_state) {
   DCHECK(IsMainThread());
@@ -261,7 +261,7 @@
 }
 
 MediaElementAudioSourceNode* MediaElementAudioSourceNode::Create(
-    BaseAudioContext* context,
+    AudioContext* context,
     const MediaElementAudioSourceOptions& options,
     ExceptionState& exception_state) {
   return Create(*context, *options.mediaElement(), exception_state);
diff --git a/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.h b/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.h
index b89cff6..9fbb812 100644
--- a/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.h
+++ b/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.h
@@ -38,7 +38,7 @@
 
 namespace blink {
 
-class BaseAudioContext;
+class AudioContext;
 class HTMLMediaElement;
 class MediaElementAudioSourceOptions;
 
@@ -115,13 +115,11 @@
   USING_GARBAGE_COLLECTED_MIXIN(MediaElementAudioSourceNode);
 
  public:
-  static MediaElementAudioSourceNode* Create(BaseAudioContext&,
+  static MediaElementAudioSourceNode* Create(AudioContext&,
                                              HTMLMediaElement&,
                                              ExceptionState&);
-  static MediaElementAudioSourceNode* Create(
-      BaseAudioContext*,
-      const MediaElementAudioSourceOptions&,
-      ExceptionState&);
+  static MediaElementAudioSourceNode*
+  Create(AudioContext*, const MediaElementAudioSourceOptions&, ExceptionState&);
 
   void Trace(blink::Visitor*) override;
   MediaElementAudioSourceHandler& GetMediaElementAudioSourceHandler() const;
@@ -136,7 +134,7 @@
       UNLOCK_FUNCTION(GetMediaElementAudioSourceHandler().GetProcessLock());
 
  private:
-  MediaElementAudioSourceNode(BaseAudioContext&, HTMLMediaElement&);
+  MediaElementAudioSourceNode(AudioContext&, HTMLMediaElement&);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.idl b/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.idl
index 8a1df10e..9916261 100644
--- a/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.idl
+++ b/third_party/blink/renderer/modules/webaudio/media_element_audio_source_node.idl
@@ -25,8 +25,7 @@
 
 // See https://webaudio.github.io/web-audio-api/#mediaelementaudiosourcenode
 [
-    // TODO(rtoy): This should be AudioContext, not BaseAudioContext.
-    Constructor(BaseAudioContext context, MediaElementAudioSourceOptions options),
+    Constructor(AudioContext context, MediaElementAudioSourceOptions options),
     RaisesException=Constructor,
     Measure
 ]
diff --git a/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.cc b/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.cc
index d9f697b..31f983c 100644
--- a/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.cc
@@ -26,7 +26,7 @@
 #include "third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.h"
 
 #include "third_party/blink/public/platform/web_rtc_peer_connection_handler.h"
-#include "third_party/blink/renderer/core/frame/deprecation.h"
+#include "third_party/blink/renderer/modules/webaudio/audio_context.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_node_input.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_node_options.h"
 #include "third_party/blink/renderer/modules/webaudio/base_audio_context.h"
@@ -142,7 +142,7 @@
 // ----------------------------------------------------------------
 
 MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode(
-    BaseAudioContext& context,
+    AudioContext& context,
     size_t number_of_channels)
     : AudioBasicInspectorNode(context) {
   SetHandler(
@@ -150,7 +150,7 @@
 }
 
 MediaStreamAudioDestinationNode* MediaStreamAudioDestinationNode::Create(
-    BaseAudioContext& context,
+    AudioContext& context,
     size_t number_of_channels,
     ExceptionState& exception_state) {
   DCHECK(IsMainThread());
@@ -164,7 +164,7 @@
 }
 
 MediaStreamAudioDestinationNode* MediaStreamAudioDestinationNode::Create(
-    BaseAudioContext* context,
+    AudioContext* context,
     const AudioNodeOptions& options,
     ExceptionState& exception_state) {
   DCHECK(IsMainThread());
@@ -182,12 +182,6 @@
 
   node->HandleChannelOptions(options, exception_state);
 
-  if (!context->HasRealtimeConstraint()) {
-    Deprecation::CountDeprecation(
-        node->GetExecutionContext(),
-        WebFeature::kMediaStreamDestinationOnOfflineContext);
-  }
-
   return node;
 }
 
diff --git a/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.h b/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.h
index b4a5710..427d924d 100644
--- a/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.h
+++ b/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.h
@@ -33,7 +33,7 @@
 
 namespace blink {
 
-class BaseAudioContext;
+class AudioContext;
 
 class MediaStreamAudioDestinationHandler final
     : public AudioBasicInspectorHandler {
@@ -78,17 +78,17 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static MediaStreamAudioDestinationNode* Create(BaseAudioContext&,
+  static MediaStreamAudioDestinationNode* Create(AudioContext&,
                                                  size_t number_of_channels,
                                                  ExceptionState&);
-  static MediaStreamAudioDestinationNode* Create(BaseAudioContext*,
+  static MediaStreamAudioDestinationNode* Create(AudioContext*,
                                                  const AudioNodeOptions&,
                                                  ExceptionState&);
 
   MediaStream* stream() const;
 
  private:
-  MediaStreamAudioDestinationNode(BaseAudioContext&, size_t number_of_channels);
+  MediaStreamAudioDestinationNode(AudioContext&, size_t number_of_channels);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.idl b/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.idl
index 7cc91d8..d4bc924 100644
--- a/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.idl
+++ b/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.idl
@@ -25,7 +25,7 @@
 
 // See https://webaudio.github.io/web-audio-api/#mediastreamaudiodestinationnode
 [
-    Constructor(BaseAudioContext context, optional AudioNodeOptions options),
+    Constructor(AudioContext context, optional AudioNodeOptions options),
     RaisesException=Constructor,
     Measure
 ]
diff --git a/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.cc b/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.cc
index 59c845c..488a538 100644
--- a/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.cc
@@ -26,9 +26,8 @@
 #include "third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.h"
 
 #include <memory>
-#include "third_party/blink/renderer/core/frame/deprecation.h"
+#include "third_party/blink/renderer/modules/webaudio/audio_context.h"
 #include "third_party/blink/renderer/modules/webaudio/audio_node_output.h"
-#include "third_party/blink/renderer/modules/webaudio/base_audio_context.h"
 #include "third_party/blink/renderer/modules/webaudio/media_stream_audio_source_options.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/wtf/locker.h"
@@ -120,7 +119,7 @@
 // ----------------------------------------------------------------
 
 MediaStreamAudioSourceNode::MediaStreamAudioSourceNode(
-    BaseAudioContext& context,
+    AudioContext& context,
     MediaStream& media_stream,
     MediaStreamTrack* audio_track,
     std::unique_ptr<AudioSourceProvider> audio_source_provider)
@@ -132,7 +131,7 @@
 }
 
 MediaStreamAudioSourceNode* MediaStreamAudioSourceNode::Create(
-    BaseAudioContext& context,
+    AudioContext& context,
     MediaStream& media_stream,
     ExceptionState& exception_state) {
   DCHECK(IsMainThread());
@@ -166,17 +165,11 @@
   // context keeps reference until node is disconnected
   context.NotifySourceNodeStartedProcessing(node);
 
-  if (!context.HasRealtimeConstraint()) {
-    Deprecation::CountDeprecation(
-        node->GetExecutionContext(),
-        WebFeature::kMediaStreamSourceOnOfflineContext);
-  }
-
   return node;
 }
 
 MediaStreamAudioSourceNode* MediaStreamAudioSourceNode::Create(
-    BaseAudioContext* context,
+    AudioContext* context,
     const MediaStreamAudioSourceOptions& options,
     ExceptionState& exception_state) {
   return Create(*context, *options.mediaStream(), exception_state);
diff --git a/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.h b/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.h
index f903710..21bd3e4 100644
--- a/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.h
+++ b/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.h
@@ -36,7 +36,7 @@
 
 namespace blink {
 
-class BaseAudioContext;
+class AudioContext;
 class MediaStreamAudioSourceOptions;
 
 class MediaStreamAudioSourceHandler final : public AudioHandler {
@@ -83,13 +83,11 @@
   USING_GARBAGE_COLLECTED_MIXIN(MediaStreamAudioSourceNode);
 
  public:
-  static MediaStreamAudioSourceNode* Create(BaseAudioContext&,
+  static MediaStreamAudioSourceNode* Create(AudioContext&,
                                             MediaStream&,
                                             ExceptionState&);
-  static MediaStreamAudioSourceNode* Create(
-      BaseAudioContext*,
-      const MediaStreamAudioSourceOptions&,
-      ExceptionState&);
+  static MediaStreamAudioSourceNode*
+  Create(AudioContext*, const MediaStreamAudioSourceOptions&, ExceptionState&);
 
   void Trace(blink::Visitor*) override;
 
@@ -99,7 +97,7 @@
   void SetFormat(size_t number_of_channels, float sample_rate) override;
 
  private:
-  MediaStreamAudioSourceNode(BaseAudioContext&,
+  MediaStreamAudioSourceNode(AudioContext&,
                              MediaStream&,
                              MediaStreamTrack*,
                              std::unique_ptr<AudioSourceProvider>);
diff --git a/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.idl b/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.idl
index 1e8713d..e3c8a6c0 100644
--- a/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.idl
+++ b/third_party/blink/renderer/modules/webaudio/media_stream_audio_source_node.idl
@@ -25,7 +25,7 @@
 
 // See https://webaudio.github.io/web-audio-api/#mediastreamaudiosourcenode
 [
-    Constructor(BaseAudioContext context, MediaStreamAudioSourceOptions options),
+    Constructor(AudioContext context, MediaStreamAudioSourceOptions options),
     RaisesException=Constructor,
     Measure
 ]
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource.cc b/third_party/blink/renderer/platform/loader/fetch/resource.cc
index 9ac50f8..c5867dc8 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource.cc
@@ -995,6 +995,10 @@
       identifier_);
 }
 
+void Resource::SetCachePolicyBypassingCache() {
+  resource_request_.SetCacheMode(mojom::FetchCacheMode::kBypassCache);
+}
+
 void Resource::SetPreviewsState(WebURLRequest::PreviewsState previews_state) {
   resource_request_.SetPreviewsState(previews_state);
 }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource.h b/third_party/blink/renderer/platform/loader/fetch/resource.h
index ddececf..4f16c04 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource.h
@@ -476,6 +476,7 @@
     return clients_;
   }
 
+  void SetCachePolicyBypassingCache();
   void SetPreviewsState(WebURLRequest::PreviewsState);
   void ClearRangeRequestHeader();
 
diff --git a/third_party/blink/renderer/platform/web_gesture_event.cc b/third_party/blink/renderer/platform/web_gesture_event.cc
index 305bc488..b767d45 100644
--- a/third_party/blink/renderer/platform/web_gesture_event.cc
+++ b/third_party/blink/renderer/platform/web_gesture_event.cc
@@ -68,7 +68,8 @@
     return WebFloatSize(data.long_press.width / frame_scale_,
                         data.long_press.height / frame_scale_);
   } else if (type_ == WebInputEvent::kGestureTap ||
-             type_ == WebInputEvent::kGestureTapUnconfirmed) {
+             type_ == WebInputEvent::kGestureTapUnconfirmed ||
+             type_ == WebInputEvent::kGestureDoubleTap) {
     return WebFloatSize(data.tap.width / frame_scale_,
                         data.tap.height / frame_scale_);
   } else if (type_ == WebInputEvent::kGestureTapDown) {
@@ -128,6 +129,7 @@
         break;
       case WebInputEvent::kGestureTap:
       case WebInputEvent::kGestureTapUnconfirmed:
+      case WebInputEvent::kGestureDoubleTap:
         data.tap.width /= frame_scale_;
         data.tap.height /= frame_scale_;
         break;
diff --git a/third_party/blink/tools/blinkpy/common/net/buildbot.py b/third_party/blink/tools/blinkpy/common/net/buildbot.py
index 72bd6012..5ee288b 100644
--- a/third_party/blink/tools/blinkpy/common/net/buildbot.py
+++ b/third_party/blink/tools/blinkpy/common/net/buildbot.py
@@ -28,16 +28,20 @@
 
 import collections
 import logging
+import json
 import re
+import urllib
 import urllib2
 
 from blinkpy.common.memoized import memoized
 from blinkpy.common.net.layout_test_results import LayoutTestResults
 from blinkpy.common.net.network_transaction import NetworkTransaction
+from blinkpy.web_tests.layout_package import json_results_generator
 
 _log = logging.getLogger(__name__)
 
-RESULTS_URL_BASE = 'https://test-results.appspot.com/data/layout_results'
+TEST_RESULTS_SERVER = 'https://test-results.appspot.com'
+RESULTS_URL_BASE = '%s/data/layout_results' % TEST_RESULTS_SERVER
 
 
 class Build(collections.namedtuple('Build', ('builder_name', 'build_number'))):
@@ -58,7 +62,7 @@
         https://www.chromium.org/developers/the-json-test-results-format
     """
 
-    def results_url(self, builder_name, build_number=None):
+    def results_url(self, builder_name, build_number=None, step_name=None):
         """Returns a URL for one set of archived layout test results.
 
         If a build number is given, this will be results for a particular run;
@@ -68,6 +72,8 @@
         if build_number:
             assert str(build_number).isdigit(), 'expected numeric build number, got %s' % build_number
             url_base = self.builder_results_url_base(builder_name)
+            if step_name:
+                return '%s/%s/%s/layout-test-results' % (url_base, build_number, step_name)
             return '%s/%s/layout-test-results' % (url_base, build_number)
         return self.accumulated_results_url_base(builder_name)
 
@@ -102,7 +108,46 @@
         Uses full_results.json if full is True, otherwise failing_results.json.
         """
         return self.fetch_layout_test_results(
-            self.results_url(build.builder_name, build.build_number), full)
+            self.results_url(build.builder_name, build.build_number,
+                             step_name=self.get_layout_test_step_name(build)),
+            full)
+
+    @memoized
+    def get_layout_test_step_name(self, build):
+        url = '%s/testfile?%s' % (TEST_RESULTS_SERVER, urllib.urlencode({
+            'builder': build.builder_name,
+            'buildnumber': build.build_number,
+            'name': 'full_results.json',
+            # This forces the server to gives us JSON rather than an HTML page.
+            'callback': 'ADD_RESULTS',
+        }))
+        data = NetworkTransaction(return_none_on_404=True).run(
+            lambda: self.fetch_file(url))
+        if not data:
+            _log.debug('Got 404 response from:\n%s', url)
+            return None
+
+        # Strip out the callback
+        data = json.loads(json_results_generator.strip_json_wrapper(data))
+        suites = [
+            entry['TestType'] for entry in data
+            # Some suite names are like 'webkit_layout_tests on Intel GPU (with
+            # patch)'. Only make sure it starts with webkit_layout_tests and
+            # runs with a patch. This should be changed eventually to use actual
+            # structured data from the test results server.
+            if (entry['TestType'].startswith('webkit_layout_tests') and
+                entry['TestType'].endswith('(with patch)'))
+        ]
+        # In manual testing, I sometimes saw results where the same suite was
+        # repeated twice. De-duplicate here to try to catch this.
+        suites = list(set(suites))
+        if len(suites) != 1:
+            raise Exception(
+                'build %s on builder %s expected to only have one layout test '
+                'step, instead has %s' % (
+                    build.build_number, build.builder_name, suites))
+
+        return suites[0]
 
     @memoized
     def fetch_layout_test_results(self, results_url, full=False):
@@ -111,20 +156,20 @@
         """
         base_filename = 'full_results.json' if full else 'failing_results.json'
         results_file = NetworkTransaction(return_none_on_404=True).run(
-            lambda: self.fetch_file(results_url, base_filename))
+            lambda: self.fetch_file('%s/%s' % (results_url, base_filename)))
         if results_file is None:
             _log.debug('Got 404 response from:\n%s/%s', results_url, base_filename)
             return None
         revision = NetworkTransaction(return_none_on_404=True).run(
-            lambda: self.fetch_file(results_url, 'LAST_CHANGE'))
+            lambda: self.fetch_file('%s/LAST_CHANGE' % results_url))
         if revision is None:
             _log.debug('Got 404 response from:\n%s/LAST_CHANGE', results_url)
         return LayoutTestResults.results_from_string(results_file, revision)
 
-    def fetch_file(self, url_base, filename):
+    def fetch_file(self, url):
         # It seems this can return None if the url redirects and then returns 404.
         # FIXME: This could use Web instead of using urllib2 directly.
-        result = urllib2.urlopen('%s/%s' % (url_base, filename))
+        result = urllib2.urlopen(url)
         if not result:
             return None
         # urlopen returns a file-like object which sometimes works fine with str()
diff --git a/third_party/blink/tools/blinkpy/common/net/buildbot_unittest.py b/third_party/blink/tools/blinkpy/common/net/buildbot_unittest.py
index 0ca913f..80e35a5 100644
--- a/third_party/blink/tools/blinkpy/common/net/buildbot_unittest.py
+++ b/third_party/blink/tools/blinkpy/common/net/buildbot_unittest.py
@@ -26,6 +26,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+import json
 import logging
 import unittest
 
@@ -65,8 +66,8 @@
     def test_fetch_layout_test_results_with_no_results_fetched(self):
         buildbot = BuildBot()
 
-        def fetch_file(_, filename):
-            return None if filename == 'failing_results.json' else 'contents'
+        def fetch_file(url):
+            return None if url.endswith('failing_results.json') else 'contents'
 
         buildbot.fetch_file = fetch_file
         results = buildbot.fetch_layout_test_results(buildbot.results_url('B'))
@@ -76,6 +77,38 @@
             'https://test-results.appspot.com/data/layout_results/B/results/layout-test-results/failing_results.json\n'
         ])
 
+    def test_fetch_layout_test_results_weird_step_name(self):
+        buildbot = BuildBot()
+
+        def fetch_file(url):
+            if '/testfile' in url:
+                return ('ADD_RESULTS(%s);' % (json.dumps(
+                    [{"TestType": "webkit_layout_tests on Intel GPU (with patch)"},
+                     {"TestType": "base_unittests (with patch)"}])))
+            return json.dumps({'passed': True}) if url.endswith('failing_results.json') else 'deadbeef'
+
+        buildbot.fetch_file = fetch_file
+        results = buildbot.fetch_results(Build('builder', 123))
+        self.assertEqual(results._results, {  # pylint: disable=protected-access
+            'passed': True
+        })
+        self.assertLog([])
+
+    def test_get_step_name(self):
+        buildbot = BuildBot()
+
+        def fetch_file(_):
+            return ('ADD_RESULTS(%s);' % (json.dumps(
+                [{"TestType": "webkit_layout_tests (with patch)"},
+                 {"TestType": "site_per_process_webkit_layout_tests (with patch)"},
+                 {"TestType": "webkit_layout_tests (retry with patch)"},
+                 {"TestType": "base_unittests (with patch)"}])))
+
+        buildbot.fetch_file = fetch_file
+        step_name = buildbot.get_layout_test_step_name(Build('foo', 5))
+        self.assertEqual(step_name, 'webkit_layout_tests (with patch)')
+        self.assertLog([])
+
 
 class BuildBotHelperFunctionTest(unittest.TestCase):
 
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test.py
index a28db44..665c81d 100644
--- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test.py
+++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test.py
@@ -4,6 +4,7 @@
 
 import json
 import logging
+import optparse
 
 from blinkpy.tool.commands.rebaseline import AbstractRebaseliningCommand
 
@@ -22,6 +23,10 @@
             self.builder_option,
             self.build_number_option,
             self.results_directory_option,
+            optparse.make_option(
+                '--step-name',
+                help=('Name of the step which ran the actual tests, and which '
+                      'should be used to retrieve results from.'))
         ])
 
     def execute(self, options, args, tool):
@@ -44,7 +49,9 @@
         if options.results_directory:
             results_url = 'file://' + options.results_directory
         else:
-            results_url = self._tool.buildbot.results_url(options.builder, build_number=options.build_number)
+            results_url = self._tool.buildbot.results_url(
+                options.builder, build_number=options.build_number,
+                step_name=options.step_name)
 
         for suffix in self._baseline_suffix_list:
             self._rebaseline_test(port_name, options.test, suffix, results_url)
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py
index 0271f2e..64e1a031 100644
--- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py
+++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_test_unittest.py
@@ -21,7 +21,8 @@
             'test': 'userscripts/another-test.html',
             'suffixes': 'txt',
             'results_directory': None,
-            'build_number': None
+            'build_number': None,
+            'step_name': None,
         }, **kwargs))
 
     def test_rebaseline_test_internal_with_port_that_lacks_buildbot(self):
@@ -44,7 +45,8 @@
                 'verbose': True,
                 'test': 'failures/expected/image.html',
                 'results_directory': None,
-                'build_number': None
+                'build_number': None,
+                'step_name': None,
             })
             oc.capture_output()
             self.command.execute(options, [], self.tool)
diff --git a/third_party/closure_compiler/externs/accessibility_private.js b/third_party/closure_compiler/externs/accessibility_private.js
index ba1d7b7..07961aa 100644
--- a/third_party/closure_compiler/externs/accessibility_private.js
+++ b/third_party/closure_compiler/externs/accessibility_private.js
@@ -168,6 +168,12 @@
 chrome.accessibilityPrivate.sendSyntheticKeyEvent = function(keyEvent) {};
 
 /**
+ * Enables or disables mouse events in ChromeVox.
+ * @param {boolean} enabled True if ChromeVox should receive mouse events.
+ */
+chrome.accessibilityPrivate.enableChromeVoxMouseEvents = function(enabled) {};
+
+/**
  * Fired whenever ChromeVox should output introduction.
  * @type {!ChromeEvent}
  */
diff --git a/third_party/tcmalloc/chromium/src/heap-profile-table.cc b/third_party/tcmalloc/chromium/src/heap-profile-table.cc
index 238d041..cffe809 100644
--- a/third_party/tcmalloc/chromium/src/heap-profile-table.cc
+++ b/third_party/tcmalloc/chromium/src/heap-profile-table.cc
@@ -440,22 +440,20 @@
                                     AllocationMap* allocations) {
   RAW_VLOG(1, "Dumping non-live heap profile to %s", file_name);
   RawFD fd = RawOpenForWriting(file_name);
-  if (fd != kIllegalRawFD) {
-    RawWrite(fd, kProfileHeader, strlen(kProfileHeader));
-    char buf[512];
-    int len = UnparseBucket(total, buf, 0, sizeof(buf), " heapprofile",
-                            NULL);
-    RawWrite(fd, buf, len);
-    const DumpArgs args(fd, NULL);
-    allocations->Iterate<const DumpArgs&>(DumpNonLiveIterator, args);
-    RawWrite(fd, kProcSelfMapsHeader, strlen(kProcSelfMapsHeader));
-    DumpProcSelfMaps(fd);
-    RawClose(fd);
-    return true;
-  } else {
+  if (fd == kIllegalRawFD) {
     RAW_LOG(ERROR, "Failed dumping filtered heap profile to %s", file_name);
     return false;
   }
+  RawWrite(fd, kProfileHeader, strlen(kProfileHeader));
+  char buf[512];
+  int len = UnparseBucket(total, buf, 0, sizeof(buf), " heapprofile", NULL);
+  RawWrite(fd, buf, len);
+  const DumpArgs args(fd, NULL);
+  allocations->Iterate<const DumpArgs&>(DumpNonLiveIterator, args);
+  RawWrite(fd, kProcSelfMapsHeader, strlen(kProcSelfMapsHeader));
+  DumpProcSelfMaps(fd);
+  RawClose(fd);
+  return true;
 }
 
 void HeapProfileTable::CleanupOldProfiles(const char* prefix) {
diff --git a/third_party/tcmalloc/chromium/src/heap-profiler.cc b/third_party/tcmalloc/chromium/src/heap-profiler.cc
old mode 100755
new mode 100644
index b037f62..b46bd547
--- a/third_party/tcmalloc/chromium/src/heap-profiler.cc
+++ b/third_party/tcmalloc/chromium/src/heap-profiler.cc
@@ -556,7 +556,7 @@
 //----------------------------------------------------------------------
 // Initialization/finalization code
 //----------------------------------------------------------------------
-
+#if defined(ENABLE_PROFILING)
 // Initialization code
 static void HeapProfilerInit() {
   // Everything after this point is for setting up the profiler based on envvar
@@ -620,3 +620,4 @@
 static const TCMallocGuard tcmalloc_initializer;
 REGISTER_MODULE_INITIALIZER(heapprofiler, HeapProfilerInit());
 static HeapProfileEndWriter heap_profile_end_writer;
+#endif  // defined(ENABLE_PROFILING)
diff --git a/third_party/tcmalloc/chromium/src/packed-cache-inl.h b/third_party/tcmalloc/chromium/src/packed-cache-inl.h
index 7c216e5..3353fad 100644
--- a/third_party/tcmalloc/chromium/src/packed-cache-inl.h
+++ b/third_party/tcmalloc/chromium/src/packed-cache-inl.h
@@ -143,7 +143,9 @@
   // Decrease the size map cache if running in the small memory mode.
   static const int kHashbits = 12;
 #else
-  static const int kHashbits = 16;
+  // We don't want the hash map to occupy 512K memory at Chromium, so
+  // kHashbits is decreased from 16 to 12.
+  static const int kHashbits = 12;
 #endif
   static const int kValuebits = 7;
   // one bit after value bits
diff --git a/third_party/tcmalloc/chromium/src/tcmalloc.cc b/third_party/tcmalloc/chromium/src/tcmalloc.cc
index 5b4d064..d828590 100644
--- a/third_party/tcmalloc/chromium/src/tcmalloc.cc
+++ b/third_party/tcmalloc/chromium/src/tcmalloc.cc
@@ -936,13 +936,13 @@
   }
 
   virtual void GetFreeListSizes(vector<MallocExtension::FreeListInfo>* v) {
-    static const char* kCentralCacheType = "tcmalloc.central";
-    static const char* kTransferCacheType = "tcmalloc.transfer";
-    static const char* kThreadCacheType = "tcmalloc.thread";
-    static const char* kPageHeapType = "tcmalloc.page";
-    static const char* kPageHeapUnmappedType = "tcmalloc.page_unmapped";
-    static const char* kLargeSpanType = "tcmalloc.large";
-    static const char* kLargeUnmappedSpanType = "tcmalloc.large_unmapped";
+    static const char kCentralCacheType[] = "tcmalloc.central";
+    static const char kTransferCacheType[] = "tcmalloc.transfer";
+    static const char kThreadCacheType[] = "tcmalloc.thread";
+    static const char kPageHeapType[] = "tcmalloc.page";
+    static const char kPageHeapUnmappedType[] = "tcmalloc.page_unmapped";
+    static const char kLargeSpanType[] = "tcmalloc.large";
+    static const char kLargeUnmappedSpanType[] = "tcmalloc.large_unmapped";
 
     v->clear();
 
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 008efed..b0d7393 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -217,6 +217,7 @@
       'Libfuzzer Upload Linux MSan': 'libfuzzer_msan_release_bot',
       'Libfuzzer Upload Linux UBSan': 'libfuzzer_ubsan_release_bot',
       'Libfuzzer Upload Mac ASan': 'libfuzzer_mac_asan_release_bot',
+      'Libfuzzer Upload Windows ASan': 'libfuzzer_windows_asan_release_bot',
       'Linux ARM': 'release_bot_arm',
       'Linux Clang Analyzer': 'linux_chromium_analysis',
       'Linux remote_run Builder': 'release_bot',
@@ -1432,6 +1433,13 @@
       'libfuzzer', 'asan', 'release_bot', 'chrome_with_codecs', 'pdf_xfa', 'disable_nacl', 'optimize_for_fuzzing',
     ],
 
+    # Note that because of optimize_for_fuzzing, Windows cannot share a config
+    # with other libFuzzer builds. optimize_for_fuzzing is used by the other
+    # libFuzzer build configs but it does not work on Windows.
+    'libfuzzer_windows_asan_release_bot': [
+      'libfuzzer', 'asan', 'release_bot', 'chrome_with_codecs', 'pdf_xfa', 'disable_nacl', 'minimal_symbols',
+    ],
+
     'libfuzzer_msan_release_bot': [
       'libfuzzer', 'msan', 'release_bot', 'chromeos_codecs', 'pdf_xfa', 'disable_nacl', 'optimize_for_fuzzing',
     ],
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index efb04c55..e23fffe 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -16934,6 +16934,7 @@
   <int value="1282" label="AUTOTESTPRIVATE_RUNCROSTINIUNINSTALLER"/>
   <int value="1283" label="AUTOTESTPRIVATE_TAKESCREENSHOT"/>
   <int value="1284" label="ACCESSIBILITY_PRIVATE_TOGGLEDICTATION"/>
+  <int value="1285" label="ACCESSIBILITY_PRIVATE_ENABLECHROMEVOXMOUSEEVENTS"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -26494,6 +26495,16 @@
   <int value="2" label="Remote suggestions collapsed"/>
 </enum>
 
+<enum name="IOSOpenInDownloadResult">
+  <int value="0" label="Download Succeeded"/>
+  <int value="1" label="Download Canceled">
+    User canceled the download manually.
+  </int>
+  <int value="2" label="Download Failed">
+    Download failed either by getting a corrupted file or no file at all.
+  </int>
+</enum>
+
 <enum name="IOSPageLoadCountNavigationType">
   <int value="0" label="Chrome URL Navigation"/>
   <int value="1" label="Same Document Web Navigation"/>
@@ -30123,6 +30134,7 @@
   <int value="1004909189"
       label="ContentSuggestionsThumbnailDominantColor:disabled"/>
   <int value="1005684777" label="PictureInPicture:disabled"/>
+  <int value="1006608931" label="ArcEnableUnifiedAudioFocus:disabled"/>
   <int value="1007444341" label="enable-prefixed-encrypted-media"/>
   <int value="1012942422" label="HorizontalTabSwitcherAndroid:disabled"/>
   <int value="1015895665" label="drop-sync-credential:enabled"/>
@@ -30293,6 +30305,7 @@
   <int value="1298981651" label="disable-new-task-manager"/>
   <int value="1300282719" label="OfflinePagesBackgroundLoading:enabled"/>
   <int value="1302421166" label="NativeNotifications:disabled"/>
+  <int value="1304636193" label="ArcEnableUnifiedAudioFocus:enabled"/>
   <int value="1307003774" label="AutofillEnableCompanyName:disabled"/>
   <int value="1308537004" label="force-pnacl-subzero"/>
   <int value="1311860720" label="ChromeHomeNtpRedesign:disabled"/>
@@ -45442,6 +45455,19 @@
   <int value="2" label="Succeeded"/>
 </enum>
 
+<enum name="SimpleCacheConsistencyResult">
+  <int value="0" label="kOK"/>
+  <int value="1" label="kCreateDirectoryFailed"/>
+  <int value="2" label="kBadFakeIndexFile"/>
+  <int value="3" label="kBadInitialMagicNumber"/>
+  <int value="4" label="kVersionTooOld"/>
+  <int value="5" label="kVersionFromTheFuture"/>
+  <int value="6" label="kBadZeroCheck"/>
+  <int value="7" label="kUpgradeIndexV5V6Failed"/>
+  <int value="8" label="kWriteFakeIndexFileFailed"/>
+  <int value="9" label="kReplaceFileFailed"/>
+</enum>
+
 <enum name="SimpleCacheHeaderSizeChange">
   <obsolete>
     Removed 2018-06-05
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 9ad3e616..70c2759d 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -27871,6 +27871,17 @@
   <summary>Counts when the explore sites store is opened or closed.</summary>
 </histogram>
 
+<histogram name="ExploreSites.MonthlyHostCount" units="hosts">
+  <owner>dimich@chromium.org</owner>
+  <summary>
+    Number of unique hosts visited by the user during the last 30 days. Reported
+    at most once a week for all users on Android only, with a 5 second delay
+    after startup. This is different from History.MonthlyHostCount which is
+    reported for a percentage of startups, to avoid bias toward more active
+    users.
+  </summary>
+</histogram>
+
 <histogram name="ExtensionActivity.AdInjected" units="Extension Count">
   <obsolete>
     Deprecated with M46.
@@ -36321,16 +36332,18 @@
   </summary>
 </histogram>
 
-<histogram name="History.MonthlyHostCount">
+<histogram name="History.MonthlyHostCount" units="hosts">
   <owner>shess@chromium.org</owner>
   <summary>
     Unique hostnames in History database urls table with last-visit times in the
     last 30 days. Metrics are logged on initialization of the History DB on 0.3%
-    of starts.
+    of starts. See also ExploreSites.MonthlyHostCount metric which is similar
+    but is reported on a elapsed time basis to help avoid bias toward more
+    active users.
   </summary>
 </histogram>
 
-<histogram name="History.MonthlyURLCount">
+<histogram name="History.MonthlyURLCount" units="urls">
   <owner>shess@chromium.org</owner>
   <summary>
     Unique URLs in History database urls table with last-visit times in the last
@@ -36339,7 +36352,7 @@
   </summary>
 </histogram>
 
-<histogram name="History.MonthlyVisitCount">
+<histogram name="History.MonthlyVisitCount" units="visits">
   <owner>shess@chromium.org</owner>
   <summary>
     Number of rows in History visits table with visit times in the last 30 days.
@@ -39334,6 +39347,14 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.OpenIn.DownloadResult" enum="IOSOpenInDownloadResult">
+  <owner>mrefaat@chromium.org</owner>
+  <summary>
+    The result of the download operation done when the user taps &quot;open
+    in&quot; button to open a file by a different application.
+  </summary>
+</histogram>
+
 <histogram name="IOS.PageLoadCount.Counts"
     enum="IOSPageLoadCountNavigationType">
   <owner>danyao@chromium.org</owner>
@@ -54311,6 +54332,17 @@
   </summary>
 </histogram>
 
+<histogram name="Net.HttpAuthCacheEntriesExaminedWhenNoMatch">
+  <owner>chlily@chromium.org</owner>
+  <summary>
+    The number of entries examined (equal to the cache size) when attempting to
+    look up an HTTP auth cache entry (either by path or realm) and finding no
+    matching entries. This is recorded whenever the lookup fails (i.e., value 0
+    in Net.HttpAuthCacheLookupPosition and
+    Net.HttpAuthCacheLookupByPathPosition).
+  </summary>
+</histogram>
+
 <histogram name="Net.HttpAuthCacheLookupByPathPosition">
   <owner>asanka@chromium.org</owner>
   <summary>
@@ -98602,6 +98634,17 @@
   </summary>
 </histogram>
 
+<histogram base="true" name="SimpleCache.ConsistencyResult"
+    enum="SimpleCacheConsistencyResult">
+  <owner>wanderview@chromium.org</owner>
+  <summary>
+    Record the outcome of the simple DiskCache consistency check. The
+    consistency check is executed every time a simple DiskCache is initialized.
+    This check includes both inspecting the schema on disk and upgrading the
+    schema to the latest version if necessary.
+  </summary>
+</histogram>
+
 <histogram base="true" name="SimpleCache.CreationToIndex" units="ms">
   <owner>morlovich@chromium.org</owner>
   <summary>
@@ -101797,7 +101840,8 @@
   </summary>
 </histogram>
 
-<histogram name="Startup.Android.Cold.TimeToFirstContentfulPaint" units="ms">
+<histogram base="true" name="Startup.Android.Cold.TimeToFirstContentfulPaint"
+    units="ms">
   <owner>pasko@chromium.org</owner>
   <owner>alexilin@chromium.org</owner>
   <summary>
@@ -101809,7 +101853,8 @@
   </summary>
 </histogram>
 
-<histogram name="Startup.Android.Cold.TimeToFirstNavigationCommit" units="ms">
+<histogram base="true" name="Startup.Android.Cold.TimeToFirstNavigationCommit"
+    units="ms">
   <owner>pasko@chromium.org</owner>
   <owner>alexilin@chromium.org</owner>
   <summary>
@@ -121843,6 +121888,7 @@
   <suffix name="Media" label="Collected from the Media Cache instance."/>
   <affected-histogram name="SimpleCache.CacheSizeOnInit"/>
   <affected-histogram name="SimpleCache.CheckCRCResult"/>
+  <affected-histogram name="SimpleCache.ConsistencyResult"/>
   <affected-histogram name="SimpleCache.CreationToIndex"/>
   <affected-histogram name="SimpleCache.CreationToIndexFail"/>
   <affected-histogram name="SimpleCache.DiskCloseLatency"/>
diff --git a/tools/perf/contrib/leak_detection/page_sets.py b/tools/perf/contrib/leak_detection/page_sets.py
index 390d3ee57..e24cc4e 100644
--- a/tools/perf/contrib/leak_detection/page_sets.py
+++ b/tools/perf/contrib/leak_detection/page_sets.py
@@ -160,7 +160,9 @@
       'https://imgur.com/',
       'https://www.craigslist.org/',
       'https://www.chase.com/',
-      'https://www.tumblr.com/',
+      # TODO(892352): tumblr started timing out due to a catapult roll. See
+      # https://crbug.com/892352
+      # 'https://www.tumblr.com/',
       'https://www.paypal.com/',
       'http://www.espn.com/',
       'https://edition.cnn.com/',
diff --git a/tools/perf/page_sets/data/system_health_desktop.json b/tools/perf/page_sets/data/system_health_desktop.json
index 43818ae3..6945580 100644
--- a/tools/perf/page_sets/data/system_health_desktop.json
+++ b/tools/perf/page_sets/data/system_health_desktop.json
@@ -96,9 +96,6 @@
         "browse_accessibility:tech:codesearch:2018": {
             "DEFAULT": "system_health_desktop_063.wprgo"
         },
-        "browse_accessibility:tools:gmail_compose": {
-            "DEFAULT": "system_health_desktop_059.wprgo"
-        },
         "load:games:alphabetty": {
             "DEFAULT": "system_health_desktop_005.wprgo"
         },
diff --git a/ui/accessibility/ax_node_data.cc b/ui/accessibility/ax_node_data.cc
index 76810a1a..698ee829 100644
--- a/ui/accessibility/ax_node_data.cc
+++ b/ui/accessibility/ax_node_data.cc
@@ -22,18 +22,18 @@
 namespace {
 
 bool IsFlagSet(uint32_t bitfield, uint32_t flag) {
-  return 0 != (bitfield & (1 << flag));
+  return (bitfield & (1 << flag)) != 0;
 }
 
 uint32_t ModifyFlag(uint32_t bitfield, uint32_t flag, bool set) {
   return set ? (bitfield |= (1 << flag)) : (bitfield &= ~(1 << flag));
 }
 
-std::string StateBitfieldToString(uint32_t state) {
+std::string StateBitfieldToString(uint32_t state_enum) {
   std::string str;
   for (uint32_t i = static_cast<uint32_t>(ax::mojom::State::kNone) + 1;
        i <= static_cast<uint32_t>(ax::mojom::State::kMaxValue); ++i) {
-    if (IsFlagSet(state, i))
+    if (IsFlagSet(state_enum, i))
       str += " " +
              base::ToUpperASCII(ui::ToString(static_cast<ax::mojom::State>(i)));
   }
@@ -510,16 +510,23 @@
   return IsFlagSet(state, static_cast<uint32_t>(state_enum));
 }
 
-bool AXNodeData::HasAction(ax::mojom::Action action_enum) const {
-  return IsFlagSet(actions, static_cast<uint32_t>(action_enum));
+bool AXNodeData::HasAction(ax::mojom::Action action) const {
+  return IsFlagSet(actions, static_cast<uint32_t>(action));
 }
 
-void AXNodeData::AddState(ax::mojom::State state_enum) {
+ax::mojom::State AXNodeData::AddState(ax::mojom::State state_enum) {
   DCHECK_NE(state_enum, ax::mojom::State::kNone);
   state = ModifyFlag(state, static_cast<uint32_t>(state_enum), true);
+  return static_cast<ax::mojom::State>(state);
 }
 
-void AXNodeData::AddAction(ax::mojom::Action action_enum) {
+ax::mojom::State AXNodeData::RemoveState(ax::mojom::State state_enum) {
+  DCHECK_NE(state_enum, ax::mojom::State::kNone);
+  state = ModifyFlag(state, static_cast<uint32_t>(state_enum), false);
+  return static_cast<ax::mojom::State>(state);
+}
+
+ax::mojom::Action AXNodeData::AddAction(ax::mojom::Action action_enum) {
   switch (action_enum) {
     case ax::mojom::Action::kNone:
       NOTREACHED();
@@ -563,11 +570,7 @@
   }
 
   actions = ModifyFlag(actions, static_cast<uint32_t>(action_enum), true);
-}
-
-void AXNodeData::RemoveState(ax::mojom::State state_enum) {
-  DCHECK_NE(state_enum, ax::mojom::State::kNone);
-  state = ModifyFlag(state, static_cast<uint32_t>(state_enum), false);
+  return static_cast<ax::mojom::Action>(actions);
 }
 
 std::string AXNodeData::ToString() const {
diff --git a/ui/accessibility/ax_node_data.h b/ui/accessibility/ax_node_data.h
index c7d3320e..6f8302ff 100644
--- a/ui/accessibility/ax_node_data.h
+++ b/ui/accessibility/ax_node_data.h
@@ -127,15 +127,13 @@
   void SetValue(const base::string16& value);
 
   // Returns true if the given enum bit is 1.
-  bool HasState(ax::mojom::State state_enum) const;
-  bool HasAction(ax::mojom::Action state_enum) const;
+  bool HasState(ax::mojom::State state) const;
+  bool HasAction(ax::mojom::Action action) const;
 
-  // Set bits in the given enum's corresponding bitfield.
-  void AddState(ax::mojom::State state_enum);
-  void AddAction(ax::mojom::Action action_enum);
-
-  // Remove bits in the given enum's corresponding bitfield.
-  void RemoveState(ax::mojom::State state_enum);
+  // Set or remove bits in the given enum's corresponding bitfield.
+  ax::mojom::State AddState(ax::mojom::State state);
+  ax::mojom::State RemoveState(ax::mojom::State state);
+  ax::mojom::Action AddAction(ax::mojom::Action action);
 
   // Helper functions to get some common int attributes with some specific
   // enum types:
@@ -153,18 +151,22 @@
     return static_cast<ax::mojom::DefaultActionVerb>(
         GetIntAttribute(ax::mojom::IntAttribute::kDefaultActionVerb));
   }
+
   ax::mojom::InvalidState GetInvalidState() const {
     return static_cast<ax::mojom::InvalidState>(
         GetIntAttribute(ax::mojom::IntAttribute::kInvalidState));
   }
+
   ax::mojom::NameFrom GetNameFrom() const {
     return static_cast<ax::mojom::NameFrom>(
         GetIntAttribute(ax::mojom::IntAttribute::kNameFrom));
   }
+
   ax::mojom::Restriction GetRestriction() const {
     return static_cast<ax::mojom::Restriction>(
         GetIntAttribute(ax::mojom::IntAttribute::kRestriction));
   }
+
   ax::mojom::TextDirection GetTextDirection() const {
     return static_cast<ax::mojom::TextDirection>(
         GetIntAttribute(ax::mojom::IntAttribute::kTextDirection));
diff --git a/ui/accessibility/platform/ax_platform_node.cc b/ui/accessibility/platform/ax_platform_node.cc
index a4f31d93..840944b 100644
--- a/ui/accessibility/platform/ax_platform_node.cc
+++ b/ui/accessibility/platform/ax_platform_node.cc
@@ -61,7 +61,7 @@
 }
 
 int32_t AXPlatformNode::GetUniqueId() const {
-  DCHECK(GetDelegate());  // Must be called after Init()
+  DCHECK(GetDelegate()) << "|GetUniqueId| must be called after |Init|.";
   return GetDelegate() ? GetDelegate()->GetUniqueId().Get() : -1;
 }
 
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index 9e493e3..1977c724 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -44,16 +44,16 @@
 //
 
 #define COM_OBJECT_VALIDATE() \
-    if (!delegate_) \
-      return E_FAIL;
+  if (!GetDelegate())         \
+    return E_FAIL;
 #define COM_OBJECT_VALIDATE_1_ARG(arg) \
-  if (!delegate_)                      \
+  if (!GetDelegate())                  \
     return E_FAIL;                     \
   if (!arg)                            \
     return E_INVALIDARG;               \
   *arg = {};
 #define COM_OBJECT_VALIDATE_2_ARGS(arg1, arg2) \
-  if (!delegate_)                              \
+  if (!GetDelegate())                          \
     return E_FAIL;                             \
   if (!arg1)                                   \
     return E_INVALIDARG;                       \
@@ -62,7 +62,7 @@
     return E_INVALIDARG;                       \
   *arg2 = {};
 #define COM_OBJECT_VALIDATE_3_ARGS(arg1, arg2, arg3) \
-  if (!delegate_)                                    \
+  if (!GetDelegate())                                \
     return E_FAIL;                                   \
   if (!arg1)                                         \
     return E_INVALIDARG;                             \
@@ -74,7 +74,7 @@
     return E_INVALIDARG;                             \
   *arg3 = {};
 #define COM_OBJECT_VALIDATE_4_ARGS(arg1, arg2, arg3, arg4) \
-  if (!delegate_)                                          \
+  if (!GetDelegate())                                      \
     return E_FAIL;                                         \
   if (!arg1)                                               \
     return E_INVALIDARG;                                   \
@@ -89,15 +89,15 @@
     return E_INVALIDARG;                                   \
   *arg4 = {};
 #define COM_OBJECT_VALIDATE_VAR_ID_AND_GET_TARGET(var_id, target) \
-  if (!delegate_)                                                 \
+  if (!GetDelegate())                                             \
     return E_FAIL;                                                \
   target = GetTargetFromChildID(var_id);                          \
   if (!target)                                                    \
     return E_INVALIDARG;                                          \
-  if (!target->delegate_)                                         \
+  if (!target->GetDelegate())                                     \
     return E_INVALIDARG;
 #define COM_OBJECT_VALIDATE_VAR_ID_1_ARG_AND_GET_TARGET(var_id, arg, target) \
-  if (!delegate_)                                                            \
+  if (!GetDelegate())                                                        \
     return E_FAIL;                                                           \
   if (!arg)                                                                  \
     return E_INVALIDARG;                                                     \
@@ -105,11 +105,11 @@
   target = GetTargetFromChildID(var_id);                                     \
   if (!target)                                                               \
     return E_INVALIDARG;                                                     \
-  if (!target->delegate_)                                                    \
+  if (!target->GetDelegate())                                                \
     return E_INVALIDARG;
 #define COM_OBJECT_VALIDATE_VAR_ID_2_ARGS_AND_GET_TARGET(var_id, arg1, arg2, \
                                                          target)             \
-  if (!delegate_)                                                            \
+  if (!GetDelegate())                                                        \
     return E_FAIL;                                                           \
   if (!arg1)                                                                 \
     return E_INVALIDARG;                                                     \
@@ -120,11 +120,11 @@
   target = GetTargetFromChildID(var_id);                                     \
   if (!target)                                                               \
     return E_INVALIDARG;                                                     \
-  if (!target->delegate_)                                                    \
+  if (!target->GetDelegate())                                                \
     return E_INVALIDARG;
 #define COM_OBJECT_VALIDATE_VAR_ID_3_ARGS_AND_GET_TARGET(var_id, arg1, arg2, \
                                                          arg3, target)       \
-  if (!delegate_)                                                            \
+  if (!GetDelegate())                                                        \
     return E_FAIL;                                                           \
   if (!arg1)                                                                 \
     return E_INVALIDARG;                                                     \
@@ -138,11 +138,11 @@
   target = GetTargetFromChildID(var_id);                                     \
   if (!target)                                                               \
     return E_INVALIDARG;                                                     \
-  if (!target->delegate_)                                                    \
+  if (!target->GetDelegate())                                                \
     return E_INVALIDARG;
 #define COM_OBJECT_VALIDATE_VAR_ID_4_ARGS_AND_GET_TARGET(var_id, arg1, arg2, \
                                                          arg3, arg4, target) \
-  if (!delegate_)                                                            \
+  if (!GetDelegate())                                                        \
     return E_FAIL;                                                           \
   if (!arg1)                                                                 \
     return E_INVALIDARG;                                                     \
@@ -159,7 +159,7 @@
   target = GetTargetFromChildID(var_id);                                     \
   if (!target)                                                               \
     return E_INVALIDARG;                                                     \
-  if (!target->delegate_)                                                    \
+  if (!target->GetDelegate())                                                \
     return E_INVALIDARG;
 
 namespace ui {
@@ -378,7 +378,7 @@
   LONG i = 0;
   for (const auto& node_id : ids) {
     AXPlatformNodeWin* node_win =
-        static_cast<AXPlatformNodeWin*>(delegate_->GetFromNodeID(node_id));
+        static_cast<AXPlatformNodeWin*>(GetDelegate()->GetFromNodeID(node_id));
     DCHECK(node_win);
     node_win->AddRef();
     SafeArrayPutElement(uia_array, &i,
@@ -392,14 +392,14 @@
 gfx::Vector2d AXPlatformNodeWin::CalculateUIAScrollPoint(
     const ScrollAmount horizontal_amount,
     const ScrollAmount vertical_amount) const {
-  if (!delegate_ || !IsScrollable())
+  if (!GetDelegate() || !IsScrollable())
     return {};
 
-  const gfx::Rect bounds = delegate_->GetClippedScreenBoundsRect();
+  const gfx::Rect bounds = GetDelegate()->GetClippedScreenBoundsRect();
   const int large_horizontal_change = bounds.width();
   const int large_vertical_change = bounds.height();
 
-  const HWND hwnd = delegate_->GetTargetForNativeAccessibilityEvent();
+  const HWND hwnd = GetDelegate()->GetTargetForNativeAccessibilityEvent();
   DCHECK(hwnd);
   const float scale_factor =
       display::win::ScreenWin::GetScaleFactorForHWND(hwnd);
@@ -482,7 +482,7 @@
 }
 
 void AXPlatformNodeWin::NotifyAccessibilityEvent(ax::mojom::Event event_type) {
-  HWND hwnd = delegate_->GetTargetForNativeAccessibilityEvent();
+  HWND hwnd = GetDelegate()->GetTargetForNativeAccessibilityEvent();
   if (!hwnd)
     return;
 
@@ -554,13 +554,14 @@
   COM_OBJECT_VALIDATE_1_ARG(child);
 
   gfx::Point point(x_left, y_top);
-  if (!delegate_->GetClippedScreenBoundsRect().Contains(point)) {
+  if (!GetDelegate()->GetClippedScreenBoundsRect().Contains(point)) {
     // Return S_FALSE and VT_EMPTY when outside the object's boundaries.
     child->vt = VT_EMPTY;
     return S_FALSE;
   }
 
-  gfx::NativeViewAccessible hit_child = delegate_->HitTestSync(x_left, y_top);
+  gfx::NativeViewAccessible hit_child =
+      GetDelegate()->HitTestSync(x_left, y_top);
   if (!hit_child) {
     child->vt = VT_EMPTY;
     return S_FALSE;
@@ -599,7 +600,7 @@
   AXActionData data;
   data.action = ax::mojom::Action::kDoDefault;
 
-  if (target->delegate_->AccessibilityPerformAction(data))
+  if (target->GetDelegate()->AccessibilityPerformAction(data))
     return S_OK;
   return E_FAIL;
 }
@@ -614,7 +615,7 @@
   COM_OBJECT_VALIDATE_VAR_ID_4_ARGS_AND_GET_TARGET(var_id, x_left, y_top, width,
                                                    height, target);
 
-  gfx::Rect bounds = target->delegate_->GetUnclippedScreenBoundsRect();
+  gfx::Rect bounds = target->GetDelegate()->GetUnclippedScreenBoundsRect();
   *x_left = bounds.x();
   *y_top = bounds.y();
   *width  = bounds.width();
@@ -642,13 +643,14 @@
   IAccessible* result = nullptr;
   switch (nav_dir) {
     case NAVDIR_FIRSTCHILD:
-      if (delegate_->GetChildCount() > 0)
-        result = delegate_->ChildAtIndex(0);
+      if (GetDelegate()->GetChildCount() > 0)
+        result = GetDelegate()->ChildAtIndex(0);
       break;
 
     case NAVDIR_LASTCHILD:
-      if (delegate_->GetChildCount() > 0)
-        result = delegate_->ChildAtIndex(delegate_->GetChildCount() - 1);
+      if (GetDelegate()->GetChildCount() > 0)
+        result =
+            GetDelegate()->ChildAtIndex(GetDelegate()->GetChildCount() - 1);
       break;
 
     case NAVDIR_NEXT: {
@@ -754,7 +756,7 @@
 IFACEMETHODIMP AXPlatformNodeWin::get_accChildCount(LONG* child_count) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_CHILD_COUNT);
   COM_OBJECT_VALIDATE_1_ARG(child_count);
-  *child_count = delegate_->GetChildCount();
+  *child_count = GetDelegate()->GetChildCount();
   return S_OK;
 }
 
@@ -797,7 +799,7 @@
 IFACEMETHODIMP AXPlatformNodeWin::get_accFocus(VARIANT* focus_child) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_FOCUS);
   COM_OBJECT_VALIDATE_1_ARG(focus_child);
-  gfx::NativeViewAccessible focus_accessible = delegate_->GetFocus();
+  gfx::NativeViewAccessible focus_accessible = GetDelegate()->GetFocus();
   if (focus_accessible == this) {
     focus_child->vt = VT_I4;
     focus_child->lVal = CHILDID_SELF;
@@ -947,7 +949,7 @@
   //
   if (target->GetData().role == ax::mojom::Role::kRootWebArea ||
       target->GetData().role == ax::mojom::Role::kWebArea) {
-    result = base::UTF8ToUTF16(target->delegate_->GetTreeData().url);
+    result = base::UTF8ToUTF16(target->GetDelegate()->GetTreeData().url);
     *value = SysAllocString(result.c_str());
     DCHECK(*value);
     return S_OK;
@@ -994,7 +996,7 @@
   AXActionData data;
   data.action = ax::mojom::Action::kSetValue;
   data.value = base::WideToUTF8(new_value);
-  if (target->delegate_->AccessibilityPerformAction(data))
+  if (target->GetDelegate()->AccessibilityPerformAction(data))
     return S_OK;
   return E_FAIL;
 }
@@ -1003,9 +1005,9 @@
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_ACC_SELECTION);
   COM_OBJECT_VALIDATE_1_ARG(selected);
   std::vector<Microsoft::WRL::ComPtr<IDispatch>> selected_nodes;
-  for (int i = 0; i < delegate_->GetChildCount(); ++i) {
+  for (int i = 0; i < GetDelegate()->GetChildCount(); ++i) {
     auto* node = static_cast<AXPlatformNodeWin*>(
-        FromNativeViewAccessible(delegate_->ChildAtIndex(i)));
+        FromNativeViewAccessible(GetDelegate()->ChildAtIndex(i)));
     if (node &&
         node->GetData().GetBoolAttribute(ax::mojom::BoolAttribute::kSelected))
       selected_nodes.emplace_back(node);
@@ -1044,7 +1046,7 @@
   if (flagsSelect & SELFLAG_TAKEFOCUS) {
     AXActionData action_data;
     action_data.action = ax::mojom::Action::kFocus;
-    target->delegate_->AccessibilityPerformAction(action_data);
+    target->GetDelegate()->AccessibilityPerformAction(action_data);
     return S_OK;
   }
 
@@ -1108,7 +1110,7 @@
 IFACEMETHODIMP AXPlatformNodeWin::get_windowHandle(HWND* window_handle) {
   WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_WINDOW_HANDLE);
   COM_OBJECT_VALIDATE_1_ARG(window_handle);
-  *window_handle = delegate_->GetTargetForNativeAccessibilityEvent();
+  *window_handle = GetDelegate()->GetTargetForNativeAccessibilityEvent();
   return *window_handle ? S_OK : S_FALSE;
 }
 
@@ -1159,7 +1161,7 @@
   base::string16 relation_type;
   std::set<int32_t> target_ids;
   int found = AXPlatformRelationWin::EnumerateRelationships(
-      GetData(), delegate_, 0, type, &relation_type, &target_ids);
+      GetData(), GetDelegate(), 0, type, &relation_type, &target_ids);
   if (found == 0)
     return S_FALSE;
 
@@ -1173,8 +1175,8 @@
   *targets = static_cast<IUnknown**>(CoTaskMemAlloc(count * sizeof(IUnknown*)));
   int index = 0;
   for (int target_id : target_ids) {
-    AXPlatformNodeWin* target =
-        static_cast<AXPlatformNodeWin*>(delegate_->GetFromNodeID(target_id));
+    AXPlatformNodeWin* target = static_cast<AXPlatformNodeWin*>(
+        GetDelegate()->GetFromNodeID(target_id));
     if (target) {
       (*targets)[index] = static_cast<IAccessible*>(target);
       (*targets)[index]->AddRef();
@@ -1221,7 +1223,7 @@
   AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes);
 
   int count = AXPlatformRelationWin::EnumerateRelationships(
-      GetData(), delegate_, -1, base::string16(), nullptr, nullptr);
+      GetData(), GetDelegate(), -1, base::string16(), nullptr, nullptr);
   *n_relations = count;
   return S_OK;
 }
@@ -1235,8 +1237,8 @@
   base::string16 relation_type;
   std::set<int32_t> targets;
   int found = AXPlatformRelationWin::EnumerateRelationships(
-      GetData(), delegate_, relation_index, base::string16(), &relation_type,
-      &targets);
+      GetData(), GetDelegate(), relation_index, base::string16(),
+      &relation_type, &targets);
   if (found == 0)
     return E_INVALIDARG;
 
@@ -1246,8 +1248,8 @@
   relation_obj->AddRef();
   relation_obj->Initialize(relation_type);
   for (int target_id : targets) {
-    AXPlatformNodeWin* target =
-        static_cast<AXPlatformNodeWin*>(delegate_->GetFromNodeID(target_id));
+    AXPlatformNodeWin* target = static_cast<AXPlatformNodeWin*>(
+        GetDelegate()->GetFromNodeID(target_id));
     if (!target)
       continue;
     relation_obj->AddTarget(target);
@@ -1356,7 +1358,7 @@
   action_data.target_node_id = GetData().id;
   action_data.action = ax::mojom::Action::kScrollToMakeVisible;
   action_data.target_rect = r;
-  delegate_->AccessibilityPerformAction(action_data);
+  GetDelegate()->AccessibilityPerformAction(action_data);
   return S_OK;
 }
 
@@ -1372,8 +1374,9 @@
   if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
     if (GetParent()) {
       AXPlatformNodeBase* base = FromNativeViewAccessible(GetParent());
-      scroll_to +=
-          base->delegate_->GetUnclippedScreenBoundsRect().OffsetFromOrigin();
+      scroll_to += base->GetDelegate()
+                       ->GetUnclippedScreenBoundsRect()
+                       .OffsetFromOrigin();
     }
   } else if (coordinate_type != IA2_COORDTYPE_SCREEN_RELATIVE) {
     return E_INVALIDARG;
@@ -1383,7 +1386,7 @@
   action_data.target_node_id = GetData().id;
   action_data.action = ax::mojom::Action::kScrollToPoint;
   action_data.target_point = scroll_to;
-  delegate_->AccessibilityPerformAction(action_data);
+  GetDelegate()->AccessibilityPerformAction(action_data);
   return S_OK;
 }
 
@@ -1449,7 +1452,7 @@
   AXActionData action_data;
   action_data.action = ax::mojom::Action::kDoDefault;
 
-  if (delegate_->AccessibilityPerformAction(action_data))
+  if (GetDelegate()->AccessibilityPerformAction(action_data))
     return S_OK;
   return E_FAIL;
 }
@@ -1458,7 +1461,7 @@
   AXActionData action_data;
   action_data.action = ax::mojom::Action::kDoDefault;
 
-  if (delegate_->AccessibilityPerformAction(action_data))
+  if (GetDelegate()->AccessibilityPerformAction(action_data))
     return S_OK;
   return E_FAIL;
 }
@@ -1564,7 +1567,7 @@
   action_data.target_node_id = GetData().id;
   action_data.target_rect = r;
   action_data.action = ax::mojom::Action::kScrollToMakeVisible;
-  if (delegate_->AccessibilityPerformAction(action_data))
+  if (GetDelegate()->AccessibilityPerformAction(action_data))
     return S_OK;
   return E_FAIL;
 }
@@ -1584,7 +1587,7 @@
   action_data.action = ax::mojom::Action::kSetScrollOffset;
   action_data.target_point = gfx::PointAtOffsetFromOrigin(
       CalculateUIAScrollPoint(horizontal_amount, vertical_amount));
-  if (delegate_->AccessibilityPerformAction(action_data))
+  if (GetDelegate()->AccessibilityPerformAction(action_data))
     return S_OK;
   return E_FAIL;
 }
@@ -1607,7 +1610,7 @@
   action_data.target_node_id = GetData().id;
   action_data.action = ax::mojom::Action::kSetScrollOffset;
   action_data.target_point = scroll_to;
-  if (delegate_->AccessibilityPerformAction(action_data))
+  if (GetDelegate()->AccessibilityPerformAction(action_data))
     return S_OK;
   return E_FAIL;
 }
@@ -1641,7 +1644,7 @@
     return S_OK;
   }
 
-  gfx::RectF clipped_bounds(delegate_->GetClippedScreenBoundsRect());
+  gfx::RectF clipped_bounds(GetDelegate()->GetClippedScreenBoundsRect());
   float x_min = GetIntAttribute(ax::mojom::IntAttribute::kScrollXMin);
   float x_max = GetIntAttribute(ax::mojom::IntAttribute::kScrollXMax);
   float total_width = clipped_bounds.width() + x_max - x_min;
@@ -1679,7 +1682,7 @@
     return S_OK;
   }
 
-  gfx::RectF clipped_bounds(delegate_->GetClippedScreenBoundsRect());
+  gfx::RectF clipped_bounds(GetDelegate()->GetClippedScreenBoundsRect());
   float y_min = GetIntAttribute(ax::mojom::IntAttribute::kScrollYMin);
   float y_max = GetIntAttribute(ax::mojom::IntAttribute::kScrollYMax);
   float total_height = clipped_bounds.height() + y_max - y_min;
@@ -1704,7 +1707,7 @@
 
   AXActionData data;
   data.action = ax::mojom::Action::kDoDefault;
-  if (delegate_->AccessibilityPerformAction(data))
+  if (GetDelegate()->AccessibilityPerformAction(data))
     return S_OK;
   return E_FAIL;
 }
@@ -1725,7 +1728,7 @@
 
   AXActionData data;
   data.action = ax::mojom::Action::kDoDefault;
-  if (delegate_->AccessibilityPerformAction(data))
+  if (GetDelegate()->AccessibilityPerformAction(data))
     return S_OK;
   return E_FAIL;
 }
@@ -1763,11 +1766,11 @@
 
 IFACEMETHODIMP AXPlatformNodeWin::GetSelection(SAFEARRAY** result) {
   COM_OBJECT_VALIDATE_1_ARG(result);
-  int child_count = delegate_->GetChildCount();
+  int child_count = GetDelegate()->GetChildCount();
   *result = SafeArrayCreateVector(VT_UNKNOWN, 0, child_count);
   for (LONG i = 0; i < child_count; ++i) {
     auto* child = static_cast<AXPlatformNodeWin*>(
-        FromNativeViewAccessible(delegate_->ChildAtIndex(i)));
+        FromNativeViewAccessible(GetDelegate()->ChildAtIndex(i)));
     DCHECK(child);
     child->AddRef();
     SafeArrayPutElement(*result, &i,
@@ -1797,7 +1800,7 @@
     return E_FAIL;
 
   std::vector<int32_t> column_header_ids =
-      delegate_->GetColHeaderNodeIds(GetTableColumn());
+      GetDelegate()->GetColHeaderNodeIds(GetTableColumn());
   if (column_header_ids.empty())
     return S_FALSE;
   *result = CreateUIAElementsArrayFromIdVector(column_header_ids);
@@ -1811,7 +1814,7 @@
     return E_FAIL;
 
   std::vector<int32_t> row_header_ids =
-      delegate_->GetRowHeaderNodeIds(GetTableRow());
+      GetDelegate()->GetRowHeaderNodeIds(GetTableRow());
   if (row_header_ids.empty())
     return S_FALSE;
   *result = CreateUIAElementsArrayFromIdVector(row_header_ids);
@@ -1828,7 +1831,7 @@
   if (!GetTable())
     return E_FAIL;
 
-  std::vector<int32_t> column_header_ids = delegate_->GetColHeaderNodeIds();
+  std::vector<int32_t> column_header_ids = GetDelegate()->GetColHeaderNodeIds();
   *result = CreateUIAElementsArrayFromIdVector(column_header_ids);
   return S_OK;
 }
@@ -1839,7 +1842,7 @@
   if (!GetTable())
     return E_FAIL;
 
-  std::vector<int32_t> row_header_ids = delegate_->GetRowHeaderNodeIds();
+  std::vector<int32_t> row_header_ids = GetDelegate()->GetRowHeaderNodeIds();
   *result = CreateUIAElementsArrayFromIdVector(row_header_ids);
   return S_OK;
 }
@@ -1858,7 +1861,7 @@
   AXActionData action_data;
   action_data.action = ax::mojom::Action::kDoDefault;
 
-  if (delegate_->AccessibilityPerformAction(action_data))
+  if (GetDelegate()->AccessibilityPerformAction(action_data))
     return S_OK;
   return E_FAIL;
 }
@@ -1887,7 +1890,7 @@
   AXActionData data;
   data.action = ax::mojom::Action::kSetValue;
   data.value = base::WideToUTF8(value);
-  if (delegate_->AccessibilityPerformAction(data))
+  if (GetDelegate()->AccessibilityPerformAction(data))
     return S_OK;
   return E_FAIL;
 }
@@ -1918,7 +1921,7 @@
   AXActionData data;
   data.action = ax::mojom::Action::kSetValue;
   data.value = base::NumberToString(value);
-  if (delegate_->AccessibilityPerformAction(data))
+  if (GetDelegate()->AccessibilityPerformAction(data))
     return S_OK;
   return E_FAIL;
 }
@@ -3633,7 +3636,7 @@
       return ROLE_SYSTEM_DOCUMENT;
 
     case ax::mojom::Role::kEmbeddedObject:
-      if (delegate_->GetChildCount()) {
+      if (GetDelegate()->GetChildCount()) {
         return ROLE_SYSTEM_GROUPING;
       } else {
         return ROLE_SYSTEM_CLIENT;
@@ -4154,7 +4157,7 @@
       ia2_role = IA2_ROLE_FOOTNOTE;
       break;
     case ax::mojom::Role::kEmbeddedObject:
-      if (!delegate_->GetChildCount()) {
+      if (!GetDelegate()->GetChildCount()) {
         ia2_role = IA2_ROLE_EMBEDDED_OBJECT;
       }
       break;
@@ -4426,7 +4429,7 @@
       return L"document";
 
     case ax::mojom::Role::kEmbeddedObject:
-      if (delegate_->GetChildCount()) {
+      if (GetDelegate()->GetChildCount()) {
         return L"group";
       } else {
         return L"document";
@@ -5049,7 +5052,7 @@
       return UIA_DocumentControlTypeId;
 
     case ax::mojom::Role::kEmbeddedObject:
-      if (delegate_->GetChildCount()) {
+      if (GetDelegate()->GetChildCount()) {
         return UIA_GroupControlTypeId;
       } else {
         return UIA_DocumentControlTypeId;
@@ -5464,7 +5467,7 @@
     // Expose whether or not the mouse is over an element, but suppress
     // this for tests because it can make the test results flaky depending
     // on the position of the mouse.
-    if (delegate_->ShouldIgnoreHoveredStateForTesting())
+    if (GetDelegate()->ShouldIgnoreHoveredStateForTesting())
       msaa_state |= STATE_SYSTEM_HOTTRACKED;
   }
 
@@ -5484,7 +5487,7 @@
     msaa_state |= STATE_SYSTEM_MULTISELECTABLE;
   }
 
-  if (delegate_->IsOffscreen())
+  if (GetDelegate()->IsOffscreen())
     msaa_state |= STATE_SYSTEM_OFFSCREEN;
 
   if (data.HasState(ax::mojom::State::kProtected))
@@ -5552,7 +5555,7 @@
   //
   // Handle STATE_SYSTEM_FOCUSED
   //
-  gfx::NativeViewAccessible focus = delegate_->GetFocus();
+  gfx::NativeViewAccessible focus = GetDelegate()->GetFocus();
   if (focus == GetNativeViewAccessible())
     msaa_state |= STATE_SYSTEM_FOCUSED;
 
@@ -5717,11 +5720,11 @@
   if (child_id == CHILDID_SELF)
     return this;
 
-  if (child_id >= 1 && child_id <= delegate_->GetChildCount()) {
+  if (child_id >= 1 && child_id <= GetDelegate()->GetChildCount()) {
     // Positive child ids are a 1-based child index, used by clients
     // that want to enumerate all immediate children.
     AXPlatformNodeBase* base =
-        FromNativeViewAccessible(delegate_->ChildAtIndex(child_id - 1));
+        FromNativeViewAccessible(GetDelegate()->ChildAtIndex(child_id - 1));
     return static_cast<AXPlatformNodeWin*>(base);
   }
 
@@ -5846,13 +5849,13 @@
   // cross-tree traversal is necessary.
   if (child->IsTextOnlyObject()) {
     int32_t hypertext_offset = 0;
-    int32_t index_in_parent = child->delegate_->GetIndexInParent();
+    int32_t index_in_parent = child->GetDelegate()->GetIndexInParent();
     DCHECK_GE(index_in_parent, 0);
     DCHECK_LT(index_in_parent,
-              static_cast<int32_t>(delegate_->GetChildCount()));
+              static_cast<int32_t>(GetDelegate()->GetChildCount()));
     for (uint32_t i = 0; i < static_cast<uint32_t>(index_in_parent); ++i) {
       auto* sibling = static_cast<AXPlatformNodeWin*>(
-          FromNativeViewAccessible(delegate_->ChildAtIndex(i)));
+          FromNativeViewAccessible(GetDelegate()->ChildAtIndex(i)));
       DCHECK(sibling);
       if (sibling->IsTextOnlyObject())
         hypertext_offset += (int32_t)sibling->GetTextAsString16().size();
@@ -5872,7 +5875,7 @@
 int32_t AXPlatformNodeWin::GetHypertextOffsetFromDescendant(
     AXPlatformNodeWin* descendant) {
   auto* parent_object = static_cast<AXPlatformNodeWin*>(
-      FromNativeViewAccessible(descendant->delegate_->GetParent()));
+      FromNativeViewAccessible(descendant->GetDelegate()->GetParent()));
   while (parent_object && parent_object != this) {
     descendant = parent_object;
     parent_object = static_cast<AXPlatformNodeWin*>(
@@ -5904,9 +5907,9 @@
     return endpoint_offset;
 
   AXPlatformNodeWin* common_parent = this;
-  int32_t index_in_common_parent = delegate_->GetIndexInParent();
+  int32_t index_in_common_parent = GetDelegate()->GetIndexInParent();
   while (common_parent && !endpoint_object->IsDescendantOf(common_parent)) {
-    index_in_common_parent = common_parent->delegate_->GetIndexInParent();
+    index_in_common_parent = common_parent->GetDelegate()->GetIndexInParent();
     common_parent = static_cast<AXPlatformNodeWin*>(
         FromNativeViewAccessible(common_parent->GetParent()));
   }
@@ -5938,12 +5941,13 @@
   // We can safely assume that the endpoint is in another part of the tree or
   // at common parent, and that this object is a descendant of common parent.
   int32_t endpoint_index_in_common_parent = -1;
-  for (int i = 0; i < common_parent->delegate_->GetChildCount(); ++i) {
+  for (int i = 0; i < common_parent->GetDelegate()->GetChildCount(); ++i) {
     auto* child = static_cast<AXPlatformNodeWin*>(
-        common_parent->delegate_->ChildAtIndex(i));
+        common_parent->GetDelegate()->ChildAtIndex(i));
     DCHECK(child);
     if (endpoint_object->IsDescendantOf(child)) {
-      endpoint_index_in_common_parent = child->delegate_->GetIndexInParent();
+      endpoint_index_in_common_parent =
+          child->GetDelegate()->GetIndexInParent();
       break;
     }
   }
@@ -6073,24 +6077,24 @@
 }
 
 int AXPlatformNodeWin::GetSelectionAnchor() {
-  int32_t anchor_id = delegate_->GetTreeData().sel_anchor_object_id;
+  int32_t anchor_id = GetDelegate()->GetTreeData().sel_anchor_object_id;
   AXPlatformNodeWin* anchor_object =
-      static_cast<AXPlatformNodeWin*>(delegate_->GetFromNodeID(anchor_id));
+      static_cast<AXPlatformNodeWin*>(GetDelegate()->GetFromNodeID(anchor_id));
   if (!anchor_object)
     return -1;
 
-  int anchor_offset = delegate_->GetTreeData().sel_anchor_offset;
+  int anchor_offset = GetDelegate()->GetTreeData().sel_anchor_offset;
   return GetHypertextOffsetFromEndpoint(anchor_object, anchor_offset);
 }
 
 int AXPlatformNodeWin::GetSelectionFocus() {
-  int32_t focus_id = delegate_->GetTreeData().sel_focus_object_id;
+  int32_t focus_id = GetDelegate()->GetTreeData().sel_focus_object_id;
   AXPlatformNodeWin* focus_object =
-      static_cast<AXPlatformNodeWin*>(delegate_->GetFromNodeID(focus_id));
+      static_cast<AXPlatformNodeWin*>(GetDelegate()->GetFromNodeID(focus_id));
   if (!focus_object)
     return -1;
 
-  int focus_offset = delegate_->GetTreeData().sel_focus_offset;
+  int focus_offset = GetDelegate()->GetTreeData().sel_focus_offset;
   return GetHypertextOffsetFromEndpoint(focus_object, focus_offset);
 }
 
diff --git a/ui/accessibility/platform/ax_unique_id.cc b/ui/accessibility/platform/ax_unique_id.cc
index 06282f6..852371c 100644
--- a/ui/accessibility/platform/ax_unique_id.cc
+++ b/ui/accessibility/platform/ax_unique_id.cc
@@ -8,6 +8,7 @@
 #include <unordered_set>
 
 #include "base/lazy_instance.h"
+#include "base/stl_util.h"
 
 namespace ui {
 
@@ -18,6 +19,8 @@
 
 }  // namespace
 
+AXUniqueId::AXUniqueId() : AXUniqueId(INT32_MAX) {}
+
 AXUniqueId::AXUniqueId(const int32_t max_id) : id_(GetNextAXUniqueId(max_id)) {}
 
 AXUniqueId::~AXUniqueId() {
@@ -32,9 +35,8 @@
   return !(*this == other);
 }
 
-bool AXUniqueId::IsAssigned(int32_t id) const {
-  auto id_map = g_assigned_ids.Get();
-  return id_map.find(id) != id_map.end();
+bool AXUniqueId::IsAssigned(const int32_t id) const {
+  return base::ContainsKey(g_assigned_ids.Get(), id);
 }
 
 int32_t AXUniqueId::GetNextAXUniqueId(const int32_t max_id) {
@@ -42,22 +44,23 @@
   static bool has_wrapped = false;
 
   const int32_t prev_id = current_id;
-
-  while (true) {
+  do {
     if (current_id == max_id) {
       current_id = 1;
       has_wrapped = true;
     } else {
-      current_id++;
+      ++current_id;
     }
-    if (current_id == prev_id)
-      LOG(FATAL) << "Over 2 billion active ids, something is wrong.";
-    if (!has_wrapped || !IsAssigned(current_id))
-      break;
-  }
+    if (current_id == prev_id) {
+      LOG(FATAL) << "There are over 2 billion available IDs, so the newly "
+                    "created ID cannot be equal to the most recently created "
+                    "ID.";
+    }
+    // If it |has_wrapped| then we need to continue until we find the first
+    // unassigned ID.
+  } while (has_wrapped && IsAssigned(current_id));
 
   g_assigned_ids.Get().insert(current_id);
-
   return current_id;
 }
 
diff --git a/ui/accessibility/platform/ax_unique_id.h b/ui/accessibility/platform/ax_unique_id.h
index f0c20fcb..0f3853f 100644
--- a/ui/accessibility/platform/ax_unique_id.h
+++ b/ui/accessibility/platform/ax_unique_id.h
@@ -17,17 +17,18 @@
 // is required to generate the ID, and the ID is freed when the AXUniqueID is
 // destroyed.
 //
-// The  unique id that's guaranteed to be a positive number. Becase some
+// The  unique id that's guaranteed to be a positive number. Because some
 // platforms want to negate it, we ensure the range is below the signed int max.
 //
 // These ids must not be conflated with the int id, that comes with web node
 // data, which are only unique within their source frame.
 class AX_EXPORT AXUniqueId {
  public:
-  AXUniqueId() : AXUniqueId(INT32_MAX) {}
-  ~AXUniqueId();
+  AXUniqueId();
+  virtual ~AXUniqueId();
 
   int32_t Get() const { return id_; }
+  operator int32_t() const { return id_; }
 
   bool operator==(const AXUniqueId& other) const;
   bool operator!=(const AXUniqueId& other) const;
diff --git a/ui/accessibility/platform/ax_unique_id_unittest.cc b/ui/accessibility/platform/ax_unique_id_unittest.cc
index 4baafae..d6fdb58 100644
--- a/ui/accessibility/platform/ax_unique_id_unittest.cc
+++ b/ui/accessibility/platform/ax_unique_id_unittest.cc
@@ -21,11 +21,15 @@
 class AXTestSmallBankUniqueId : public AXUniqueId {
  public:
   AXTestSmallBankUniqueId();
+  ~AXTestSmallBankUniqueId() override;
 
+ private:
   friend class AXUniqueId;
+  DISALLOW_COPY_AND_ASSIGN(AXTestSmallBankUniqueId);
 };
 
 AXTestSmallBankUniqueId::AXTestSmallBankUniqueId() : AXUniqueId(kMaxId) {}
+AXTestSmallBankUniqueId::~AXTestSmallBankUniqueId() = default;
 
 TEST(AXPlatformUniqueIdTest, UnassignedIdsAreReused) {
   // Create a bank of ids that uses up all available ids.
diff --git a/ui/events/event.cc b/ui/events/event.cc
index 10b60a3..d2eca3c 100644
--- a/ui/events/event.cc
+++ b/ui/events/event.cc
@@ -826,8 +826,7 @@
                        const gfx::Point& location,
                        base::TimeTicks time_stamp,
                        const PointerDetails& pointer_details,
-                       int flags,
-                       float angle)
+                       int flags)
     : LocatedEvent(type,
                    gfx::PointF(location),
                    gfx::PointF(location),
@@ -839,7 +838,6 @@
       hovering_(false),
       pointer_details_(pointer_details) {
   latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT);
-  pointer_details_.twist = angle;
 }
 
 TouchEvent::TouchEvent(const TouchEvent& copy)
diff --git a/ui/events/event.h b/ui/events/event.h
index 05199c68..7e60f1a 100644
--- a/ui/events/event.h
+++ b/ui/events/event.h
@@ -717,8 +717,7 @@
              const gfx::Point& location,
              base::TimeTicks time_stamp,
              const PointerDetails& pointer_details,
-             int flags = 0,
-             float angle = 0.0f);
+             int flags = 0);
 
   TouchEvent(const TouchEvent& copy);
 
diff --git a/ui/events/event_unittest.cc b/ui/events/event_unittest.cc
index d993a4b6..4742a79 100644
--- a/ui/events/event_unittest.cc
+++ b/ui/events/event_unittest.cc
@@ -615,8 +615,8 @@
     TouchEvent event(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0), time,
                      PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH,
                                     /* pointer_id*/ 0, radius_x, radius_y,
-                                    /* force */ 0),
-                     0, angle_in_range);
+                                    /* force */ 0, angle_in_range),
+                     0);
     EXPECT_FLOAT_EQ(angle_in_range, event.ComputeRotationAngle());
   }
 
@@ -625,8 +625,8 @@
     TouchEvent event(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0), time,
                      PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH,
                                     /* pointer_id*/ 0, radius_x, radius_y,
-                                    /* force */ 0),
-                     0, angle_in_range);
+                                    /* force */ 0, angle_in_range),
+                     0);
     EXPECT_FLOAT_EQ(angle_in_range, event.ComputeRotationAngle());
   }
 
@@ -635,8 +635,8 @@
     TouchEvent event(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0), time,
                      PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH,
                                     /* pointer_id*/ 0, radius_x, radius_y,
-                                    /* force */ 0),
-                     0, angle_negative);
+                                    /* force */ 0, angle_negative),
+                     0);
     EXPECT_FLOAT_EQ(180 - 0.1f, event.ComputeRotationAngle());
   }
 
@@ -645,8 +645,8 @@
     TouchEvent event(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0), time,
                      PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH,
                                     /* pointer_id*/ 0, radius_x, radius_y,
-                                    /* force */ 0),
-                     0, angle_negative);
+                                    /* force */ 0, angle_negative),
+                     0);
     EXPECT_FLOAT_EQ(360 - 200, event.ComputeRotationAngle());
   }
 
@@ -655,8 +655,8 @@
     TouchEvent event(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0), time,
                      PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH,
                                     /* pointer_id*/ 0, radius_x, radius_y,
-                                    /* force */ 0),
-                     0, angle_too_big);
+                                    /* force */ 0, angle_too_big),
+                     0);
     EXPECT_FLOAT_EQ(0, event.ComputeRotationAngle());
   }
 
@@ -665,8 +665,8 @@
     TouchEvent event(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0), time,
                      PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH,
                                     /* pointer_id*/ 0, radius_x, radius_y,
-                                    /* force */ 0),
-                     0, angle_too_big);
+                                    /* force */ 0, angle_too_big),
+                     0);
     EXPECT_FLOAT_EQ(400 - 360, event.ComputeRotationAngle());
   }
 }
@@ -1032,8 +1032,9 @@
                      /* pointer_id*/ 15,
                      /* radius_x */ 11.5,
                      /* radius_y */ 13.5,
-                     /* force */ 0.5),
-      0, 13.0));
+                     /* force */ 0.0,
+                     /* twist */ 13.0),
+      0));
   ui::TouchEvent touch_event(pointer_event);
 
   EXPECT_EQ(pointer_event.location(), touch_event.location());
diff --git a/ui/events/gestures/gesture_provider_aura.cc b/ui/events/gestures/gesture_provider_aura.cc
index e3232c4..83f085a 100644
--- a/ui/events/gestures/gesture_provider_aura.cc
+++ b/ui/events/gestures/gesture_provider_aura.cc
@@ -96,10 +96,10 @@
 }
 
 void GestureProviderAura::OnTouchEnter(int pointer_id, float x, float y) {
-  std::unique_ptr<TouchEvent> touch_event(new TouchEvent(
+  auto touch_event = std::make_unique<TouchEvent>(
       ET_TOUCH_PRESSED, gfx::Point(), ui::EventTimeForNow(),
       PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, pointer_id),
-      EF_IS_SYNTHESIZED, 0.0f));
+      EF_IS_SYNTHESIZED);
   gfx::PointF point(x, y);
   touch_event->set_location_f(point);
   touch_event->set_root_location_f(point);
diff --git a/ui/events/gestures/gesture_provider_aura_unittest.cc b/ui/events/gestures/gesture_provider_aura_unittest.cc
index 1eaa215..b425a98 100644
--- a/ui/events/gestures/gesture_provider_aura_unittest.cc
+++ b/ui/events/gestures/gesture_provider_aura_unittest.cc
@@ -125,55 +125,55 @@
   const int kTouchId0 = 5;
   const int kTouchId1 = 3;
 
-  PointerDetails pointerDetails1(EventPointerType::POINTER_TYPE_TOUCH,
-                                 kTouchId0);
+  PointerDetails pointer_details1(EventPointerType::POINTER_TYPE_TOUCH,
+                                  kTouchId0);
   base::TimeTicks time = ui::EventTimeForNow();
   TouchEvent press0_1(ET_TOUCH_PRESSED, gfx::Point(9, 10), time,
-                      pointerDetails1);
+                      pointer_details1);
   EXPECT_TRUE(provider()->OnTouchEvent(&press0_1));
 
-  PointerDetails pointerDetails2(EventPointerType::POINTER_TYPE_TOUCH,
-                                 kTouchId1);
+  PointerDetails pointer_details2(EventPointerType::POINTER_TYPE_TOUCH,
+                                  kTouchId1);
   TouchEvent press1_1(ET_TOUCH_PRESSED, gfx::Point(40, 40), time,
-                      pointerDetails2);
+                      pointer_details2);
   EXPECT_TRUE(provider()->OnTouchEvent(&press1_1));
 
   time += base::TimeDelta::FromMilliseconds(10);
-  pointerDetails1 = PointerDetails(EventPointerType::POINTER_TYPE_TOUCH,
-                                   kTouchId0, kRadiusX, kRadiusY, kForce);
-  TouchEvent move0_1(ET_TOUCH_MOVED, gfx::Point(10, 10), time, pointerDetails1,
-                     0, kAngle);
+  pointer_details1 =
+      PointerDetails(EventPointerType::POINTER_TYPE_TOUCH, kTouchId0, kRadiusX,
+                     kRadiusY, kForce, kAngle);
+  TouchEvent move0_1(ET_TOUCH_MOVED, gfx::Point(10, 10), time, pointer_details1,
+                     0);
   EXPECT_TRUE(provider()->OnTouchEvent(&move0_1));
 
-  pointerDetails2 = PointerDetails(EventPointerType::POINTER_TYPE_TOUCH,
-                                   kTouchId1, kRadiusX, kRadiusY, kForce);
+  pointer_details2 =
+      PointerDetails(EventPointerType::POINTER_TYPE_TOUCH, kTouchId1, kRadiusX,
+                     kRadiusY, kForce, kAngle);
   TouchEvent move1_1(ET_TOUCH_MOVED, gfx::Point(100, 200), time,
-                     pointerDetails2, 0, kAngle);
+                     pointer_details2, 0);
   EXPECT_TRUE(provider()->OnTouchEvent(&move1_1));
 
   time += base::TimeDelta::FromMilliseconds(10);
-  TouchEvent move0_2(ET_TOUCH_MOVED, gfx::Point(10, 10), time, pointerDetails1,
-                     0, kAngle);
+  TouchEvent move0_2(ET_TOUCH_MOVED, gfx::Point(10, 10), time, pointer_details1,
+                     0);
   // Nothing has changed, so ignore the move.
   EXPECT_FALSE(provider()->OnTouchEvent(&move0_2));
 
   TouchEvent move1_2(ET_TOUCH_MOVED, gfx::Point(100, 200), time,
-                     pointerDetails2, 0, kAngle);
+                     pointer_details2, 0);
   // Nothing has changed, so ignore the move.
   EXPECT_FALSE(provider()->OnTouchEvent(&move1_2));
 
   time += base::TimeDelta::FromMilliseconds(10);
-  TouchEvent move0_3(ET_TOUCH_MOVED, gfx::Point(), time, pointerDetails1, 0,
-                     kAngle);
+  TouchEvent move0_3(ET_TOUCH_MOVED, gfx::Point(), time, pointer_details1, 0);
   move0_3.set_location_f(gfx::PointF(70, 75.1f));
   move0_3.set_root_location_f(gfx::PointF(70, 75.1f));
   // Position has changed, so don't ignore the move.
   EXPECT_TRUE(provider()->OnTouchEvent(&move0_3));
 
   time += base::TimeDelta::FromMilliseconds(10);
-  pointerDetails2.radius_y += 1;
-  TouchEvent move0_4(ET_TOUCH_MOVED, gfx::Point(), time, pointerDetails2, 0,
-                     kAngle);
+  pointer_details2.radius_y += 1;
+  TouchEvent move0_4(ET_TOUCH_MOVED, gfx::Point(), time, pointer_details2, 0);
   move0_4.set_location_f(gfx::PointF(70, 75.1f));
   move0_4.set_root_location_f(gfx::PointF(70, 75.1f));
 }
diff --git a/ui/events/gestures/gesture_recognizer_impl.cc b/ui/events/gestures/gesture_recognizer_impl.cc
index 873d2d4..45ec592 100644
--- a/ui/events/gestures/gesture_recognizer_impl.cc
+++ b/ui/events/gestures/gesture_recognizer_impl.cc
@@ -207,11 +207,11 @@
   if (pointer_state.GetPointerCount() == 0)
     return cancelling_touches;
   for (size_t i = 0; i < pointer_state.GetPointerCount(); ++i) {
-    std::unique_ptr<TouchEvent> touch_event(
-        new TouchEvent(type, gfx::Point(), EventTimeForNow(),
-                       PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH,
-                                      pointer_state.GetPointerId(i)),
-                       EF_IS_SYNTHESIZED, 0.0f));
+    auto touch_event = std::make_unique<TouchEvent>(
+        type, gfx::Point(), EventTimeForNow(),
+        PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH,
+                       pointer_state.GetPointerId(i)),
+        EF_IS_SYNTHESIZED);
     gfx::PointF point(pointer_state.GetX(i), pointer_state.GetY(i));
     touch_event->set_location_f(point);
     touch_event->set_root_location_f(point);
diff --git a/ui/events/gestures/motion_event_aura_unittest.cc b/ui/events/gestures/motion_event_aura_unittest.cc
index 276876f20..5fb665b 100644
--- a/ui/events/gestures/motion_event_aura_unittest.cc
+++ b/ui/events/gestures/motion_event_aura_unittest.cc
@@ -40,8 +40,8 @@
   ui::TouchEvent event(
       type, gfx::Point(1, 1), base::TimeTicks(),
       ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, id, radius_x,
-                         radius_y, pressure),
-      0, rotation_angle);
+                         radius_y, pressure, rotation_angle),
+      0);
   return event;
 }
 
diff --git a/ui/events/ozone/evdev/event_factory_evdev.cc b/ui/events/ozone/evdev/event_factory_evdev.cc
index 733f297..27f934c 100644
--- a/ui/events/ozone/evdev/event_factory_evdev.cc
+++ b/ui/events/ozone/evdev/event_factory_evdev.cc
@@ -336,13 +336,13 @@
 
   gfx::PointF location = GetTransformedEventLocation(params);
   PointerDetails details = GetTransformedEventPointerDetails(params);
+  details.twist = 0.f;
 
   // params.slot is guaranteed to be < kNumTouchEvdevSlots.
   int input_id = params.device_id * kNumTouchEvdevSlots + params.slot;
   details.id = touch_id_generator_.GetGeneratedID(input_id);
   TouchEvent touch_event(params.type, gfx::Point(), params.timestamp, details,
-                         modifiers_.GetModifierFlags() | params.flags,
-                         /* angle */ 0.f);
+                         modifiers_.GetModifierFlags() | params.flags);
   touch_event.set_location_f(location);
   touch_event.set_root_location_f(location);
   touch_event.set_source_device_id(params.device_id);
diff --git a/ui/events/test/event_generator.cc b/ui/events/test/event_generator.cc
index 25edf27..c6a4ce9 100644
--- a/ui/events/test/event_generator.cc
+++ b/ui/events/test/event_generator.cc
@@ -74,8 +74,7 @@
                                       /* radius_x */ 1.0f,
                                       /* radius_y */ 1.0f,
                                       /* force */ 0.0f),
-                   flags,
-                   0.0f) {}
+                   flags) {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TestTouchEvent);
diff --git a/ui/gfx/platform_font_win.cc b/ui/gfx/platform_font_win.cc
index 985ad2e..800734f6 100644
--- a/ui/gfx/platform_font_win.cc
+++ b/ui/gfx/platform_font_win.cc
@@ -236,12 +236,56 @@
     NONCLIENTMETRICS_XP metrics;
     base::win::GetNonClientMetrics(&metrics);
 
-    AddFont(gfx::PlatformFontWin::SystemFont::kCaption, &metrics.lfCaptionFont);
-    AddFont(gfx::PlatformFontWin::SystemFont::kSmallCaption,
+    // NOTE(dfried): When rendering Chrome, we do all of our own font scaling
+    // based on a number of factors, but what Windows reports to us has some
+    // (but not all) of these factors baked in, and not in a way that is
+    // display-consistent.
+    //
+    // For example, if your system DPI is 192 (200%) but you connect a monitor
+    // with a standard DPI (100%) then even if Chrome starts on the second
+    // monitor, we will be told the system font is 24pt instead of 12pt.
+    // Conversely, if the system DPI is set to 96 (100%) but all of our monitors
+    // are currently at 150%, Windows will still report 12pt fonts.
+    //
+    // The same is true with Text Zoom (a new accessibility feature). If zoom is
+    // set to 150%, then Windows will report a font size of 18pt. But again, we
+    // already take Text Zoom into account when rendering, so we want to account
+    // for that.
+    //
+    // Our system fonts are in DIPs, so we must always take what Windows gives
+    // us, figure out which adjustments it's making (and undo them), make our
+    // own adjustments for localization (for example, we always render Hindi 25%
+    // larger for readability), and only then can we store (and report) the
+    // system fonts.
+
+    // Factor in/out scale adjustment that fall outside what we can access here.
+    // This includes l10n adjustments and those we have to ask UWP or other COM
+    // interfaces for (since we don't have dependencies on that code from this
+    // module, and don't want to implicitly invoke COM for testing purposes if
+    // we don't have to).
+    gfx::PlatformFontWin::FontAdjustment font_adjustment;
+    if (PlatformFontWin::adjust_font_callback_) {
+      PlatformFontWin::adjust_font_callback_(&font_adjustment);
+    }
+
+    // Factor out system DPI scale that Windows will include in reported font
+    // sizes. Note that these are (sadly) system-wide and do not reflect
+    // specific displays' DPI.
+    double system_scale = GetSystemScale();
+    font_adjustment.font_scale /= system_scale;
+
+    // Grab each of the fonts from the NONCLIENTMETRICS block, adjust it
+    // appropriately, and store it in the font table.
+    AddFont(gfx::PlatformFontWin::SystemFont::kCaption, font_adjustment,
+            &metrics.lfCaptionFont);
+    AddFont(gfx::PlatformFontWin::SystemFont::kSmallCaption, font_adjustment,
             &metrics.lfSmCaptionFont);
-    AddFont(gfx::PlatformFontWin::SystemFont::kMenu, &metrics.lfMenuFont);
-    AddFont(gfx::PlatformFontWin::SystemFont::kMessage, &metrics.lfMessageFont);
-    AddFont(gfx::PlatformFontWin::SystemFont::kStatus, &metrics.lfStatusFont);
+    AddFont(gfx::PlatformFontWin::SystemFont::kMenu, font_adjustment,
+            &metrics.lfMenuFont);
+    AddFont(gfx::PlatformFontWin::SystemFont::kMessage, font_adjustment,
+            &metrics.lfMessageFont);
+    AddFont(gfx::PlatformFontWin::SystemFont::kStatus, font_adjustment,
+            &metrics.lfStatusFont);
 
     is_initialized_ = true;
   }
@@ -264,13 +308,11 @@
   static bool IsInitialized() { return is_initialized_; }
 
  private:
-  void AddFont(gfx::PlatformFontWin::SystemFont system_font, LOGFONT* logfont) {
+  void AddFont(gfx::PlatformFontWin::SystemFont system_font,
+               const gfx::PlatformFontWin::FontAdjustment& font_adjustment,
+               LOGFONT* logfont) {
     // Make adjustments to the font as necessary.
-    if (PlatformFontWin::adjust_font_callback_) {
-      gfx::PlatformFontWin::FontAdjustment font_adjustment;
-      PlatformFontWin::adjust_font_callback_(&font_adjustment);
-      PlatformFontWin::AdjustLOGFONT(font_adjustment, logfont);
-    }
+    PlatformFontWin::AdjustLOGFONT(font_adjustment, logfont);
 
     // Cap at minimum font size.
     logfont->lfHeight = PlatformFontWin::AdjustFontSize(logfont->lfHeight, 0);
@@ -281,6 +323,16 @@
     system_fonts_.emplace(system_font, gfx::PlatformFontWin::HFontToFont(font));
   }
 
+  // Returns the system DPI scale (standard DPI being 1.0).
+  // TODO(dfried): move dpi.[h|cc] somewhere in base/win so we can share this
+  // logic. However, note that the similar function in dpi.h is used many places
+  // it ought not to be.
+  static double GetSystemScale() {
+    constexpr double kDefaultDPI = 96.0;
+    base::win::ScopedGetDC screen_dc(nullptr);
+    return GetDeviceCaps(screen_dc, LOGPIXELSY) / kDefaultDPI;
+  }
+
   // Use a flat map for faster lookups.
   base::flat_map<gfx::PlatformFontWin::SystemFont, gfx::Font> system_fonts_;
 
diff --git a/ui/keyboard/BUILD.gn b/ui/keyboard/BUILD.gn
index dce68b3..73281c7 100644
--- a/ui/keyboard/BUILD.gn
+++ b/ui/keyboard/BUILD.gn
@@ -46,7 +46,6 @@
     "keyboard_util.h",
     "notification_manager.cc",
     "notification_manager.h",
-    "public/keyboard_config_util.h",
     "queued_container_type.cc",
     "queued_container_type.h",
     "queued_display_change.cc",
@@ -144,6 +143,7 @@
 
 mojom("mojom") {
   sources = [
+    "public/keyboard_config.mojom",
     "public/keyboard_controller.mojom",
   ]
   deps = [
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc
index c75cf9db..45af5b3 100644
--- a/ui/keyboard/keyboard_controller.cc
+++ b/ui/keyboard/keyboard_controller.cc
@@ -406,12 +406,12 @@
   if (enabled() && !IsOverscrollAllowed())
     return false;
 
-  // If overscroll enabled override is set, use it instead. Currently
+  // If overscroll enabled behavior is set, use it instead. Currently
   // login / out-of-box disable keyboard overscroll. http://crbug.com/363635
-  if (keyboard_config_.overscroll_override !=
-      mojom::KeyboardOverscrollOverride::kNone) {
-    return keyboard_config_.overscroll_override ==
-           mojom::KeyboardOverscrollOverride::kEnabled;
+  if (keyboard_config_.overscroll_behavior !=
+      mojom::KeyboardOverscrollBehavior::kDefault) {
+    return keyboard_config_.overscroll_behavior ==
+           mojom::KeyboardOverscrollBehavior::kEnabled;
   }
 
   return !base::CommandLine::ForCurrentProcess()->HasSwitch(
diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h
index e167d9b..23afda6 100644
--- a/ui/keyboard/keyboard_controller.h
+++ b/ui/keyboard/keyboard_controller.h
@@ -26,7 +26,7 @@
 #include "ui/keyboard/keyboard_layout_delegate.h"
 #include "ui/keyboard/keyboard_ukm_recorder.h"
 #include "ui/keyboard/notification_manager.h"
-#include "ui/keyboard/public/keyboard_config_util.h"
+#include "ui/keyboard/public/keyboard_config.mojom.h"
 #include "ui/keyboard/public/keyboard_controller.mojom.h"
 #include "ui/keyboard/queued_container_type.h"
 #include "ui/keyboard/queued_display_change.h"
@@ -392,7 +392,7 @@
   KeyboardControllerState state_ = KeyboardControllerState::UNKNOWN;
 
   // Keyboard configuration associated with the controller.
-  mojom::KeyboardConfig keyboard_config_ = keyboard::GetDefaultKeyboardConfig();
+  mojom::KeyboardConfig keyboard_config_;
 
   NotificationManager notification_manager_;
 
diff --git a/ui/keyboard/keyboard_util_unittest.cc b/ui/keyboard/keyboard_util_unittest.cc
index 5dd40ee..5361b06 100644
--- a/ui/keyboard/keyboard_util_unittest.cc
+++ b/ui/keyboard/keyboard_util_unittest.cc
@@ -147,15 +147,15 @@
   keyboard::SetTouchKeyboardEnabled(true);
   EXPECT_TRUE(keyboard_controller_.IsKeyboardOverscrollEnabled());
 
-  // Override overscroll enabled state.
+  // Set overscroll enabled state.
   auto config = keyboard::KeyboardController::Get()->keyboard_config();
-  config.overscroll_override =
-      keyboard::mojom::KeyboardOverscrollOverride::kDisabled;
+  config.overscroll_behavior =
+      keyboard::mojom::KeyboardOverscrollBehavior::kDisabled;
   keyboard::KeyboardController::Get()->UpdateKeyboardConfig(config);
   EXPECT_FALSE(keyboard_controller_.IsKeyboardOverscrollEnabled());
 
-  config.overscroll_override =
-      keyboard::mojom::KeyboardOverscrollOverride::kNone;
+  config.overscroll_behavior =
+      keyboard::mojom::KeyboardOverscrollBehavior::kDefault;
   keyboard::KeyboardController::Get()->UpdateKeyboardConfig(config);
   EXPECT_TRUE(keyboard_controller_.IsKeyboardOverscrollEnabled());
 
diff --git a/ui/keyboard/public/keyboard_config.mojom b/ui/keyboard/public/keyboard_config.mojom
new file mode 100644
index 0000000..1c37f57
--- /dev/null
+++ b/ui/keyboard/public/keyboard_config.mojom
@@ -0,0 +1,40 @@
+// Copyright 2018 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 keyboard.mojom;
+
+// Determines how the keyboard overscroll enabled state is set,
+enum KeyboardOverscrollBehavior {
+  // Use the default behavior.
+  kDefault,
+
+  // Enable keyboard overscroll if allowed.
+  kEnabled,
+
+  // Do not enable keyboard overscroll.
+  kDisabled,
+};
+
+struct KeyboardConfig {
+  // Whether the virtual keyboard can provide auto-complete.
+  bool auto_complete = true;
+
+  // Whether the virtual keyboard can provide auto-correct.
+  bool auto_correct = true;
+
+  // Whether the virtual keyboard can provide auto-capitalization.
+  bool auto_capitalize = true;
+
+  // Whether the virtual keyboard can provide input via handwriting recognition.
+  bool handwriting = true;
+
+  // Whether the virtual keyboard can provide spell-check.
+  bool spell_check = true;
+
+  // Whether the virtual keyboard can provide voice input.
+  bool voice_input = true;
+
+  // Whether overscroll is currently allowed by the active keyboard container.
+  KeyboardOverscrollBehavior overscroll_behavior = kDefault;
+};
diff --git a/ui/keyboard/public/keyboard_config_util.h b/ui/keyboard/public/keyboard_config_util.h
deleted file mode 100644
index 89569fbe..0000000
--- a/ui/keyboard/public/keyboard_config_util.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018 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 UI_KEYBOARD_PUBLIC_KEYBOARD_CONFIG_UTIL_H_
-#define UI_KEYBOARD_PUBLIC_KEYBOARD_CONFIG_UTIL_H_
-
-#include "ui/keyboard/public/keyboard_controller.mojom.h"
-
-namespace keyboard {
-
-inline mojom::KeyboardConfig GetDefaultKeyboardConfig() {
-  return mojom::KeyboardConfig(
-      true /* auto_complete */, true /* auto_correct */,
-      true /* auto_capitalize */, true /* handwriting */,
-      true /* spell_check */,
-      // It denotes the preferred value, and can be true even if there is no
-      // actual audio input device.
-      true /* voice_input */,
-      mojom::KeyboardOverscrollOverride::kNone /* overscroll_override */);
-};
-
-}  // namespace keyboard
-
-#endif  // UI_KEYBOARD_PUBLIC_KEYBOARD_CONFIG_UTIL_H_
diff --git a/ui/keyboard/public/keyboard_controller.mojom b/ui/keyboard/public/keyboard_controller.mojom
index 2a47a7a..104773e 100644
--- a/ui/keyboard/public/keyboard_controller.mojom
+++ b/ui/keyboard/public/keyboard_controller.mojom
@@ -5,35 +5,7 @@
 module keyboard.mojom;
 
 import "ui/gfx/geometry/mojo/geometry.mojom";
-
-enum KeyboardOverscrollOverride {
-  kDisabled = 0,
-  kEnabled,
-  kNone,
-};
-
-struct KeyboardConfig {
-  // Whether the virtual keyboard can provide auto-complete.
-  bool auto_complete;
-
-  // Whether the virtual keyboard can provide auto-correct.
-  bool auto_correct;
-
-  // Whether the virtual keyboard can provide auto-capitalization.
-  bool auto_capitalize;
-
-  // Whether the virtual keyboard can provide input via handwriting recognition.
-  bool handwriting;
-
-  // Whether the virtual keyboard can provide spell-check.
-  bool spell_check;
-
-  // Whether the virtual keyboard can provide voice input.
-  bool voice_input;
-
-  // Whether overscroll is currently allowed by the active keyboard container.
-  KeyboardOverscrollOverride overscroll_override;
-};
+import "ui/keyboard/public/keyboard_config.mojom";
 
 interface KeyboardControllerObserver {
   // Called when the enabled state of the virtual keyboard changes.
diff --git a/ui/ozone/platform/drm/gpu/screen_manager.cc b/ui/ozone/platform/drm/gpu/screen_manager.cc
index e6d1104e..f34901f 100644
--- a/ui/ozone/platform/drm/gpu/screen_manager.cc
+++ b/ui/ozone/platform/drm/gpu/screen_manager.cc
@@ -341,8 +341,8 @@
     if (it != window_to_controller_map.end())
       controller = it->second;
 
-    bool should_enable =
-        controller && pair.second->GetController() != controller;
+    bool should_enable = controller && pair.second->GetController() &&
+                         pair.second->GetController() != controller;
     pair.second->SetController(controller);
 
     // If we're moving windows between controllers modeset the controller
diff --git a/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc b/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
index 1d05b1d9..01944a2 100644
--- a/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
@@ -572,6 +572,26 @@
   window->Shutdown();
 }
 
+TEST_F(ScreenManagerTest, ConfigureDisplayControllerShouldModesetOnce) {
+  std::unique_ptr<ui::DrmWindow> window(
+      new ui::DrmWindow(1, device_manager_.get(), screen_manager_.get()));
+  window->Initialize();
+  window->SetBounds(GetPrimaryBounds());
+  screen_manager_->AddWindow(1, std::move(window));
+
+  screen_manager_->AddDisplayController(drm_, kPrimaryCrtc, kPrimaryConnector);
+  screen_manager_->ConfigureDisplayController(
+      drm_, kPrimaryCrtc, kPrimaryConnector, GetPrimaryBounds().origin(),
+      kDefaultMode);
+
+  // When a window that had no controller becomes associated with a new
+  // controller, expect the crtc to be modeset once.
+  EXPECT_EQ(drm_->get_set_crtc_call_count(), 1);
+
+  window = screen_manager_->RemoveWindow(1);
+  window->Shutdown();
+}
+
 TEST(ScreenManagerTest2, ShouldNotHardwareMirrorDifferentDrmDevices) {
   auto gbm_device1 = std::make_unique<MockGbmDevice>();
   auto drm_device1 =
diff --git a/ui/platform_window/android/platform_window_android.cc b/ui/platform_window/android/platform_window_android.cc
index 7267e3c..25f80458e 100644
--- a/ui/platform_window/android/platform_window_android.cc
+++ b/ui/platform_window/android/platform_window_android.cc
@@ -120,8 +120,8 @@
       event_type, gfx::Point(),
       base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms),
       ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, pointer_id,
-                         touch_major, touch_minor, pressure),
-      ui::EF_NONE, orientation);
+                         touch_major, touch_minor, pressure, orientation),
+      ui::EF_NONE);
   touch.set_location_f(gfx::PointF(x, y));
   touch.set_root_location_f(gfx::PointF(x, y));
   delegate()->DispatchEvent(&touch);
diff --git a/ui/strings/translations/ui_strings_no.xtb b/ui/strings/translations/ui_strings_no.xtb
index b4b8237f..551c58b 100644
--- a/ui/strings/translations/ui_strings_no.xtb
+++ b/ui/strings/translations/ui_strings_no.xtb
@@ -158,6 +158,7 @@
 <translation id="8179976553408161302">Enter</translation>
 <translation id="8210608804940886430">Ned 1 s.</translation>
 <translation id="8245914219290430011">Fane</translation>
+<translation id="8259556432390118667">Heksadesimal fargekode</translation>
 <translation id="8328145009876646418">Venstre kant</translation>
 <translation id="8331626408530291785">Rull opp</translation>
 <translation id="8352146631962686268">{YEARS,plural, =1{1 år}other{# år}}</translation>
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index a57f45a..bbdbc39 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -59,6 +59,7 @@
     "../views_bridge_mac/bridged_native_widget_impl.h",
     "../views_bridge_mac/native_widget_mac_nswindow.h",
     "../views_bridge_mac/window_touch_bar_delegate.h",
+    "accessibility/ax_virtual_view.h",
     "accessibility/view_accessibility.h",
     "accessibility/view_accessibility_utils.h",
     "accessible_pane_view.h",
@@ -264,6 +265,7 @@
     # TODO(ccameron): Move these sources to the views_bridge_mac component
     "../views_bridge_mac/bridged_native_widget_impl.mm",
     "../views_bridge_mac/native_widget_mac_nswindow.mm",
+    "accessibility/ax_virtual_view.cc",
     "accessibility/view_accessibility.cc",
     "accessibility/view_accessibility_utils.cc",
     "accessible_pane_view.cc",
@@ -516,6 +518,7 @@
   if (use_x11) {
     deps += [ "//ui/display/util" ]
   }
+
   if (is_linux && !is_chromeos) {
     sources -= [ "window/window_button_order_provider.cc" ]
     deps += [ "//ui/shell_dialogs" ]
@@ -575,6 +578,7 @@
   if (use_ozone) {
     deps += [ "//ui/ozone" ]
   }
+
   if (use_x11) {
     configs += [
       "//build/config/linux:x11",
@@ -621,6 +625,7 @@
       "widget/tooltip_manager_aura.h",
       "widget/window_reorderer.h",
     ]
+
     sources += [
       "accessibility/ax_aura_obj_cache.cc",
       "accessibility/ax_aura_obj_wrapper.cc",
@@ -1081,7 +1086,10 @@
   }
 
   if (has_native_accessibility) {
-    sources += [ "accessibility/view_ax_platform_node_delegate_unittest.cc" ]
+    sources += [
+      "accessibility/ax_virtual_view_unittest.cc",
+      "accessibility/view_ax_platform_node_delegate_unittest.cc",
+    ]
   }
 
   if (use_x11) {
diff --git a/ui/views/accessibility/ax_virtual_view.cc b/ui/views/accessibility/ax_virtual_view.cc
new file mode 100644
index 0000000..faa4da2
--- /dev/null
+++ b/ui/views/accessibility/ax_virtual_view.cc
@@ -0,0 +1,274 @@
+// Copyright 2018 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 "ui/views/accessibility/ax_virtual_view.h"
+
+#include <stdint.h>
+
+#include <algorithm>
+#include <utility>
+
+#include "ui/accessibility/ax_action_data.h"
+#include "ui/accessibility/ax_tree_data.h"
+#include "ui/accessibility/platform/ax_platform_node.h"
+#include "ui/accessibility/platform/ax_platform_node_base.h"
+#include "ui/views/accessibility/view_accessibility.h"
+#include "ui/views/view.h"
+
+namespace views {
+
+AXVirtualView::AXVirtualView()
+    : parent_view_(nullptr), virtual_parent_view_(nullptr) {
+  ax_platform_node_ = ui::AXPlatformNode::Create(this);
+  DCHECK(ax_platform_node_);
+}
+
+AXVirtualView::~AXVirtualView() {
+  DCHECK(!parent_view_ || !virtual_parent_view_)
+      << "Either |parent_view_| or |virtual_parent_view_| could be set but "
+         "not both.";
+
+  if (ax_platform_node_) {
+    ax_platform_node_->Destroy();
+    ax_platform_node_ = nullptr;
+  }
+}
+
+void AXVirtualView::AddChildView(std::unique_ptr<AXVirtualView> view) {
+  DCHECK(view);
+  if (view->virtual_parent_view_ == this)
+    return;
+  AddChildViewAt(std::move(view), GetChildCount());
+}
+
+void AXVirtualView::AddChildViewAt(std::unique_ptr<AXVirtualView> view,
+                                   int index) {
+  DCHECK(view);
+  CHECK_NE(view.get(), this)
+      << "You cannot add an AXVirtualView as its own child.";
+  DCHECK(!view->parent_view_) << "This |view| already has an AXVirtualView "
+                                 "parent. Call RemoveVirtualChildView first.";
+  DCHECK(!view->virtual_parent_view_)
+      << "This |view| already has a View parent. Call RemoveChildView first.";
+  DCHECK_GE(index, 0);
+  DCHECK_LE(index, GetChildCount());
+
+  view->virtual_parent_view_ = this;
+  children_.insert(children_.begin() + index, std::move(view));
+}
+
+void AXVirtualView::ReorderChildView(AXVirtualView* view, int index) {
+  DCHECK(view);
+  if (index >= GetChildCount())
+    return;
+  if (index < 0)
+    index = GetChildCount() - 1;
+
+  DCHECK_EQ(view->virtual_parent_view_, this);
+  if (children_[index].get() == view)
+    return;
+
+  int cur_index = GetIndexOf(view);
+  if (cur_index < 0)
+    return;
+
+  std::unique_ptr<AXVirtualView> child = std::move(children_[cur_index]);
+  children_.erase(children_.begin() + cur_index);
+  children_.insert(children_.begin() + index, std::move(child));
+}
+
+std::unique_ptr<AXVirtualView> AXVirtualView::RemoveChildView(
+    AXVirtualView* view) {
+  DCHECK(view);
+  int cur_index = GetIndexOf(view);
+  if (cur_index < 0)
+    return {};
+
+  std::unique_ptr<AXVirtualView> child = std::move(children_[cur_index]);
+  children_.erase(children_.begin() + cur_index);
+  child->virtual_parent_view_ = nullptr;
+  return child;
+}
+
+void AXVirtualView::RemoveAllChildViews() {
+  while (!children_.empty())
+    RemoveChildView(children_.back().get());
+}
+
+const AXVirtualView* AXVirtualView::child_at(int index) const {
+  DCHECK_GE(index, 0);
+  DCHECK_LT(index, static_cast<int>(children_.size()));
+  return children_[index].get();
+}
+
+AXVirtualView* AXVirtualView::child_at(int index) {
+  return const_cast<AXVirtualView*>(
+      const_cast<const AXVirtualView*>(this)->child_at(index));
+}
+
+bool AXVirtualView::Contains(const AXVirtualView* view) const {
+  DCHECK(view);
+  for (const AXVirtualView* v = view; v; v = v->virtual_parent_view_) {
+    if (v == this)
+      return true;
+  }
+  return false;
+}
+
+int AXVirtualView::GetIndexOf(const AXVirtualView* view) const {
+  DCHECK(view);
+  const auto iter =
+      std::find_if(children_.begin(), children_.end(),
+                   [view](const auto& child) { return child.get() == view; });
+  return iter != children_.end() ? static_cast<int>(iter - children_.begin())
+                                 : -1;
+}
+
+gfx::NativeViewAccessible AXVirtualView::GetNativeObject() const {
+  DCHECK(ax_platform_node_);
+  return ax_platform_node_->GetNativeViewAccessible();
+}
+
+void AXVirtualView::NotifyAccessibilityEvent(ax::mojom::Event event_type) {
+  DCHECK(ax_platform_node_);
+  ax_platform_node_->NotifyAccessibilityEvent(event_type);
+}
+
+void AXVirtualView::OverrideRole(const ax::mojom::Role role) {
+  custom_data_.role = role;
+}
+
+void AXVirtualView::OverrideState(ax::mojom::State state) {
+  custom_data_.state = static_cast<int32_t>(state);
+}
+
+void AXVirtualView::OverrideName(const std::string& name) {
+  custom_data_.SetName(name);
+}
+
+void AXVirtualView::OverrideName(const base::string16& name) {
+  custom_data_.SetName(name);
+}
+
+void AXVirtualView::OverrideDescription(const std::string& description) {
+  custom_data_.SetDescription(description);
+}
+
+void AXVirtualView::OverrideDescription(const base::string16& description) {
+  custom_data_.SetDescription(description);
+}
+
+void AXVirtualView::OverrideBoundsRect(const gfx::RectF& location) {
+  custom_data_.location = location;
+}
+
+// ui::AXPlatformNodeDelegate
+
+const ui::AXNodeData& AXVirtualView::GetData() const {
+  if (!IsParentVisible()) {
+    custom_data_.AddState(ax::mojom::State::kInvisible);
+  } else {
+    custom_data_.RemoveState(ax::mojom::State::kInvisible);
+  }
+  return custom_data_;
+}
+
+int AXVirtualView::GetChildCount() {
+  return static_cast<int>(children_.size());
+}
+
+gfx::NativeViewAccessible AXVirtualView::ChildAtIndex(int index) {
+  DCHECK_GE(index, 0) << "Child indices should be greater or equal to 0.";
+  DCHECK_LT(index, GetChildCount())
+      << "Child indices should be less than the child count.";
+  if (index >= 0 && index < GetChildCount())
+    return children_[index]->GetNativeObject();
+  return nullptr;
+}
+
+gfx::NativeWindow AXVirtualView::GetTopLevelWidget() {
+  // TODO(nektar): Implement.
+  return nullptr;
+}
+
+gfx::NativeViewAccessible AXVirtualView::GetParent() {
+  if (parent_view_)
+    return parent_view_->GetNativeViewAccessible();
+
+  if (virtual_parent_view_)
+    return virtual_parent_view_->GetNativeObject();
+
+  return nullptr;
+}
+
+gfx::Rect AXVirtualView::GetClippedScreenBoundsRect() const {
+  // We could optionally add clipping here if ever needed.
+  // TODO(nektar): Implement.
+  return {};
+}
+
+gfx::Rect AXVirtualView::GetUnclippedScreenBoundsRect() const {
+  // TODO(nektar): Implement.
+  return {};
+}
+
+gfx::NativeViewAccessible AXVirtualView::HitTestSync(int x, int y) {
+  // TODO(nektar): Implement.
+  return GetNativeObject();
+}
+
+gfx::NativeViewAccessible AXVirtualView::GetFocus() {
+  // TODO(nektar): Implement.
+  return nullptr;
+}
+
+ui::AXPlatformNode* AXVirtualView::GetFromNodeID(int32_t id) {
+  // TODO(nektar): Implement.
+  return nullptr;
+}
+
+bool AXVirtualView::AccessibilityPerformAction(const ui::AXActionData& data) {
+  // TODO(nektar): Implement.
+  return false;
+}
+
+bool AXVirtualView::ShouldIgnoreHoveredStateForTesting() {
+  // TODO(nektar): Implement.
+  return false;
+}
+
+bool AXVirtualView::IsOffscreen() const {
+  // TODO(nektar): Implement.
+  return false;
+}
+
+const ui::AXUniqueId& AXVirtualView::GetUniqueId() const {
+  return unique_id_;
+}
+
+bool AXVirtualView::IsParentVisible() const {
+  if (parent_view_) {
+    const auto* parent_node = static_cast<ui::AXPlatformNodeBase*>(
+        ui::AXPlatformNode::FromNativeViewAccessible(
+            parent_view_->GetNativeViewAccessible()));
+    if (!parent_node) {
+      NOTREACHED() << "AXVirtualView should be created on a platform with "
+                      "native accessibility support.";
+      return false;
+    }
+
+    const ui::AXNodeData& parent_data = parent_node->GetData();
+    return !parent_data.HasState(ax::mojom::State::kInvisible);
+  }
+
+  if (virtual_parent_view_) {
+    return !virtual_parent_view_->GetData().HasState(
+        ax::mojom::State::kInvisible);
+  }
+
+  // Not attached to a parent yet.
+  return false;
+}
+
+}  // namespace views
diff --git a/ui/views/accessibility/ax_virtual_view.h b/ui/views/accessibility/ax_virtual_view.h
new file mode 100644
index 0000000..763b953
--- /dev/null
+++ b/ui/views/accessibility/ax_virtual_view.h
@@ -0,0 +1,161 @@
+// Copyright 2018 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 UI_VIEWS_ACCESSIBILITY_AX_VIRTUAL_VIEW_H_
+#define UI_VIEWS_ACCESSIBILITY_AX_VIRTUAL_VIEW_H_
+
+#include <stdint.h>
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/strings/string16.h"
+#include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/accessibility/platform/ax_platform_node_delegate_base.h"
+#include "ui/accessibility/platform/ax_unique_id.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/rect_f.h"
+#include "ui/gfx/native_widget_types.h"
+#include "ui/views/views_export.h"
+
+namespace ui {
+
+struct AXActionData;
+class AXUniqueId;
+
+}  // namespace ui
+
+namespace views {
+
+class View;
+class ViewAccessibility;
+
+// Implements a virtual view that is used only for accessibility.
+//
+// Some composite widgets such as tree and table views may utilize lightweight
+// UI objects instead of actual views for displaying and managing their
+// contents. We need a corresponding virtual accessibility view to expose
+// information about these lightweight Ui objects to accessibility. An
+// AXVirtualView is owned by its parent, which could either be a
+// ViewAccessibility or an AXVirtualView.
+class VIEWS_EXPORT AXVirtualView : public ui::AXPlatformNodeDelegateBase {
+ public:
+  AXVirtualView();
+  ~AXVirtualView() override;
+
+  //
+  // Methods for managing parent - child relationships.
+  //
+
+  // Adds |view| as a child of this virtual view, optionally at |index|.
+  // We take ownership of our children.
+  void AddChildView(std::unique_ptr<AXVirtualView> view);
+  void AddChildViewAt(std::unique_ptr<AXVirtualView> view, int index);
+
+  // Moves |view| to the specified |index|. A negative value for |index| moves
+  // |view| to the end.
+  void ReorderChildView(AXVirtualView* view, int index);
+
+  // Removes |view| from this virtual view. The view's parent will change to
+  // nullptr. Hands ownership back to the caller.
+  std::unique_ptr<AXVirtualView> RemoveChildView(AXVirtualView* view);
+
+  // Removes all the children from this virtual view.
+  // The virtual views are deleted.
+  void RemoveAllChildViews();
+
+  bool has_children() const { return !children_.empty(); }
+
+  const AXVirtualView* child_at(int index) const;
+  AXVirtualView* child_at(int index);
+
+  // Returns the parent view if the parent is a real View and not an
+  // AXVirtualView. Returns nullptr otherwise.
+  const View* parent_view() const { return parent_view_; }
+  View* parent_view() { return parent_view_; }
+
+  // Returns the parent view if the parent is an AXVirtualView and not a real
+  // View. Returns nullptr otherwise.
+  const AXVirtualView* virtual_parent_view() const {
+    return virtual_parent_view_;
+  }
+  AXVirtualView* virtual_parent_view() { return virtual_parent_view_; }
+
+  // Returns true if |view| is contained within the hierarchy of this
+  // AXVirtualView, even as an indirect descendant. Will return true if |view|
+  // is also this AXVirtualView.
+  bool Contains(const AXVirtualView* view) const;
+
+  // Returns the index of |view|, or -1 if |view| is not a child of this virtual
+  // view.
+  int GetIndexOf(const AXVirtualView* view) const;
+
+  //
+  // Methods also found in ViewAccessibility.
+  //
+
+  gfx::NativeViewAccessible GetNativeObject() const;
+  void NotifyAccessibilityEvent(ax::mojom::Event event_type);
+  void OverrideRole(const ax::mojom::Role role);
+  void OverrideState(ax::mojom::State state);
+  void OverrideName(const std::string& name);
+  void OverrideName(const base::string16& name);
+  void OverrideDescription(const std::string& description);
+  void OverrideDescription(const base::string16& description);
+  void OverrideBoundsRect(const gfx::RectF& location);
+
+  // ui::AXPlatformNodeDelegate
+  const ui::AXNodeData& GetData() const override;
+  int GetChildCount() override;
+  gfx::NativeViewAccessible ChildAtIndex(int index) override;
+  gfx::NativeWindow GetTopLevelWidget() override;
+  gfx::NativeViewAccessible GetParent() override;
+  gfx::Rect GetClippedScreenBoundsRect() const override;
+  gfx::Rect GetUnclippedScreenBoundsRect() const override;
+  gfx::NativeViewAccessible HitTestSync(int x, int y) override;
+  gfx::NativeViewAccessible GetFocus() override;
+  ui::AXPlatformNode* GetFromNodeID(int32_t id) override;
+  bool AccessibilityPerformAction(const ui::AXActionData& data) override;
+  bool ShouldIgnoreHoveredStateForTesting() override;
+  bool IsOffscreen() const override;
+  const ui::AXUniqueId& GetUniqueId() const override;
+
+ private:
+  // Sets the parent view if the parent is a real View and not an AXVirtualView.
+  // It is invalid to set both |parent_view_| and |virtual_parent_view_|.
+  void set_parent_view(View* view) {
+    DCHECK(!virtual_parent_view_);
+    parent_view_ = view;
+  }
+
+  bool IsParentVisible() const;
+
+  // We own this, but it is reference-counted on some platforms so we can't use
+  // a unique_ptr. It is destroyed in the destructor.
+  ui::AXPlatformNode* ax_platform_node_;
+
+  // Weak. Owns us if not nullptr.
+  // Either |parent_view_| or |virtual_parent_view_| should be set but not both.
+  View* parent_view_;
+
+  // Weak. Owns us if not nullptr.
+  // Either |parent_view_| or |virtual_parent_view_| should be set but not both.
+  AXVirtualView* virtual_parent_view_;
+
+  // We own our children.
+  std::vector<std::unique_ptr<AXVirtualView>> children_;
+
+  ui::AXUniqueId unique_id_;
+  mutable ui::AXNodeData custom_data_;
+
+  friend class ViewAccessibility;
+  DISALLOW_COPY_AND_ASSIGN(AXVirtualView);
+};
+
+}  // namespace views
+
+#endif  // UI_VIEWS_ACCESSIBILITY_AX_VIRTUAL_VIEW_H_
diff --git a/ui/views/accessibility/ax_virtual_view_unittest.cc b/ui/views/accessibility/ax_virtual_view_unittest.cc
new file mode 100644
index 0000000..43fdd6d
--- /dev/null
+++ b/ui/views/accessibility/ax_virtual_view_unittest.cc
@@ -0,0 +1,216 @@
+// Copyright 2018 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 "ui/views/accessibility/ax_virtual_view.h"
+
+#include "base/memory/ptr_util.h"
+#include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/views/accessibility/view_ax_platform_node_delegate.h"
+#include "ui/views/controls/button/button.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/widget.h"
+
+namespace views {
+namespace test {
+
+namespace {
+
+class TestButton : public Button {
+ public:
+  TestButton() : Button(NULL) {}
+  ~TestButton() override = default;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestButton);
+};
+
+}  // namespace
+
+class AXVirtualViewTest : public ViewsTestBase {
+ public:
+  AXVirtualViewTest() = default;
+  ~AXVirtualViewTest() override = default;
+
+  void SetUp() override {
+    ViewsTestBase::SetUp();
+
+    widget_ = new Widget;
+    Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
+    params.bounds = gfx::Rect(0, 0, 200, 200);
+    widget_->Init(params);
+    button_ = new TestButton;
+    button_->SetSize(gfx::Size(20, 20));
+    widget_->GetContentsView()->AddChildView(button_);
+    virtual_label_ = new AXVirtualView;
+    virtual_label_->OverrideRole(ax::mojom::Role::kStaticText);
+    virtual_label_->OverrideName("Label");
+    button_->GetViewAccessibility().AddVirtualChildView(
+        base::WrapUnique(virtual_label_));
+    widget_->Show();
+  }
+
+  void TearDown() override {
+    if (!widget_->IsClosed())
+      widget_->Close();
+    ViewsTestBase::TearDown();
+  }
+
+  ViewAXPlatformNodeDelegate* GetButtonAccessibility() {
+    return static_cast<ViewAXPlatformNodeDelegate*>(
+        &button_->GetViewAccessibility());
+  }
+
+ protected:
+  Widget* widget_;
+  Button* button_;
+  // Weak, |button_| owns this.
+  AXVirtualView* virtual_label_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(AXVirtualViewTest);
+};
+
+TEST_F(AXVirtualViewTest, AccessibilityRoleAndName) {
+  EXPECT_EQ(ax::mojom::Role::kButton, GetButtonAccessibility()->GetData().role);
+  EXPECT_EQ(ax::mojom::Role::kStaticText, virtual_label_->GetData().role);
+  EXPECT_EQ("Label", virtual_label_->GetData().GetStringAttribute(
+                         ax::mojom::StringAttribute::kName));
+}
+
+TEST_F(AXVirtualViewTest, VirtualLabelIsChildOfButton) {
+  EXPECT_EQ(1, GetButtonAccessibility()->GetChildCount());
+  EXPECT_EQ(0, virtual_label_->GetChildCount());
+  ASSERT_NE(nullptr, virtual_label_->GetParent());
+  EXPECT_EQ(button_->GetNativeViewAccessible(), virtual_label_->GetParent());
+  ASSERT_NE(nullptr, GetButtonAccessibility()->ChildAtIndex(0));
+  EXPECT_EQ(virtual_label_->GetNativeObject(),
+            GetButtonAccessibility()->ChildAtIndex(0));
+}
+
+TEST_F(AXVirtualViewTest, AddingAndRemovingVirtualChildren) {
+  ASSERT_EQ(0, virtual_label_->GetChildCount());
+
+  AXVirtualView* virtual_child_1 = new AXVirtualView;
+  virtual_label_->AddChildView(base::WrapUnique(virtual_child_1));
+  EXPECT_EQ(1, virtual_label_->GetChildCount());
+  ASSERT_NE(nullptr, virtual_child_1->GetParent());
+  EXPECT_EQ(virtual_label_->GetNativeObject(), virtual_child_1->GetParent());
+  ASSERT_NE(nullptr, virtual_label_->ChildAtIndex(0));
+  EXPECT_EQ(virtual_child_1->GetNativeObject(),
+            virtual_label_->ChildAtIndex(0));
+
+  AXVirtualView* virtual_child_2 = new AXVirtualView;
+  virtual_label_->AddChildView(base::WrapUnique(virtual_child_2));
+  EXPECT_EQ(2, virtual_label_->GetChildCount());
+  ASSERT_NE(nullptr, virtual_child_2->GetParent());
+  EXPECT_EQ(virtual_label_->GetNativeObject(), virtual_child_2->GetParent());
+  ASSERT_NE(nullptr, virtual_label_->ChildAtIndex(1));
+  EXPECT_EQ(virtual_child_2->GetNativeObject(),
+            virtual_label_->ChildAtIndex(1));
+
+  AXVirtualView* virtual_child_3 = new AXVirtualView;
+  virtual_child_2->AddChildView(base::WrapUnique(virtual_child_3));
+  EXPECT_EQ(2, virtual_label_->GetChildCount());
+  EXPECT_EQ(0, virtual_child_1->GetChildCount());
+  EXPECT_EQ(1, virtual_child_2->GetChildCount());
+  ASSERT_NE(nullptr, virtual_child_3->GetParent());
+  EXPECT_EQ(virtual_child_2->GetNativeObject(), virtual_child_3->GetParent());
+  ASSERT_NE(nullptr, virtual_child_2->ChildAtIndex(0));
+  EXPECT_EQ(virtual_child_3->GetNativeObject(),
+            virtual_child_2->ChildAtIndex(0));
+
+  virtual_child_2->RemoveChildView(virtual_child_3);
+  EXPECT_EQ(0, virtual_child_2->GetChildCount());
+  EXPECT_EQ(2, virtual_label_->GetChildCount());
+
+  virtual_label_->RemoveAllChildViews();
+  EXPECT_EQ(0, virtual_label_->GetChildCount());
+}
+
+TEST_F(AXVirtualViewTest, ReorderingVirtualChildren) {
+  ASSERT_EQ(0, virtual_label_->GetChildCount());
+
+  AXVirtualView* virtual_child_1 = new AXVirtualView;
+  virtual_label_->AddChildView(base::WrapUnique(virtual_child_1));
+  ASSERT_EQ(1, virtual_label_->GetChildCount());
+
+  AXVirtualView* virtual_child_2 = new AXVirtualView;
+  virtual_label_->AddChildView(base::WrapUnique(virtual_child_2));
+  ASSERT_EQ(2, virtual_label_->GetChildCount());
+
+  virtual_label_->ReorderChildView(virtual_child_1, -1);
+  ASSERT_EQ(2, virtual_label_->GetChildCount());
+  EXPECT_EQ(virtual_label_->GetNativeObject(), virtual_child_2->GetParent());
+  ASSERT_NE(nullptr, virtual_label_->ChildAtIndex(0));
+  EXPECT_EQ(virtual_child_2->GetNativeObject(),
+            virtual_label_->ChildAtIndex(0));
+  ASSERT_NE(nullptr, virtual_label_->ChildAtIndex(1));
+  EXPECT_EQ(virtual_child_1->GetNativeObject(),
+            virtual_label_->ChildAtIndex(1));
+
+  virtual_label_->ReorderChildView(virtual_child_1, 0);
+  ASSERT_EQ(2, virtual_label_->GetChildCount());
+  EXPECT_EQ(virtual_label_->GetNativeObject(), virtual_child_1->GetParent());
+  ASSERT_NE(nullptr, virtual_label_->ChildAtIndex(0));
+  EXPECT_EQ(virtual_child_1->GetNativeObject(),
+            virtual_label_->ChildAtIndex(0));
+  ASSERT_NE(nullptr, virtual_label_->ChildAtIndex(1));
+  EXPECT_EQ(virtual_child_2->GetNativeObject(),
+            virtual_label_->ChildAtIndex(1));
+
+  virtual_label_->RemoveAllChildViews();
+  ASSERT_EQ(0, virtual_label_->GetChildCount());
+}
+
+TEST_F(AXVirtualViewTest, ContainsVirtualChild) {
+  ASSERT_EQ(0, virtual_label_->GetChildCount());
+
+  AXVirtualView* virtual_child_1 = new AXVirtualView;
+  virtual_label_->AddChildView(base::WrapUnique(virtual_child_1));
+  ASSERT_EQ(1, virtual_label_->GetChildCount());
+
+  AXVirtualView* virtual_child_2 = new AXVirtualView;
+  virtual_label_->AddChildView(base::WrapUnique(virtual_child_2));
+  ASSERT_EQ(2, virtual_label_->GetChildCount());
+
+  AXVirtualView* virtual_child_3 = new AXVirtualView;
+  virtual_child_2->AddChildView(base::WrapUnique(virtual_child_3));
+  ASSERT_EQ(1, virtual_child_2->GetChildCount());
+
+  EXPECT_TRUE(virtual_label_->Contains(virtual_label_));
+  EXPECT_TRUE(virtual_label_->Contains(virtual_child_1));
+  EXPECT_TRUE(virtual_label_->Contains(virtual_child_2));
+  EXPECT_TRUE(virtual_label_->Contains(virtual_child_3));
+  EXPECT_TRUE(virtual_child_2->Contains(virtual_child_2));
+  EXPECT_TRUE(virtual_child_2->Contains(virtual_child_3));
+
+  EXPECT_FALSE(virtual_child_1->Contains(virtual_label_));
+  EXPECT_FALSE(virtual_child_2->Contains(virtual_label_));
+  EXPECT_FALSE(virtual_child_3->Contains(virtual_child_2));
+
+  virtual_label_->RemoveAllChildViews();
+  ASSERT_EQ(0, virtual_label_->GetChildCount());
+}
+
+// Verify that virtual views with invisible ancestors inherit the
+// ax::mojom::State::kInvisible state.
+TEST_F(AXVirtualViewTest, InvisibleVirtualViews) {
+  EXPECT_TRUE(widget_->IsVisible());
+  EXPECT_FALSE(GetButtonAccessibility()->GetData().HasState(
+      ax::mojom::State::kInvisible));
+  EXPECT_FALSE(
+      virtual_label_->GetData().HasState(ax::mojom::State::kInvisible));
+
+  button_->SetVisible(false);
+  EXPECT_TRUE(GetButtonAccessibility()->GetData().HasState(
+      ax::mojom::State::kInvisible));
+  EXPECT_TRUE(virtual_label_->GetData().HasState(ax::mojom::State::kInvisible));
+  button_->SetVisible(true);
+}
+
+}  // namespace test
+}  // namespace views
diff --git a/ui/views/accessibility/view_accessibility.cc b/ui/views/accessibility/view_accessibility.cc
index db7109d..c2a15f8 100644
--- a/ui/views/accessibility/view_accessibility.cc
+++ b/ui/views/accessibility/view_accessibility.cc
@@ -4,6 +4,10 @@
 
 #include "ui/views/accessibility/view_accessibility.h"
 
+#include <algorithm>
+#include <utility>
+
+#include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/accessibility/platform/ax_platform_node.h"
 #include "ui/base/ui_features.h"
@@ -36,6 +40,7 @@
 #if !BUILDFLAG_INTERNAL_HAS_NATIVE_ACCESSIBILITY()
 // static
 std::unique_ptr<ViewAccessibility> ViewAccessibility::Create(View* view) {
+  // Cannot use std::make_unique because constructor is protected.
   return base::WrapUnique(new ViewAccessibility(view));
 }
 #endif
@@ -45,6 +50,63 @@
 
 ViewAccessibility::~ViewAccessibility() = default;
 
+void ViewAccessibility::AddVirtualChildView(
+    std::unique_ptr<AXVirtualView> virtual_view) {
+  DCHECK(virtual_view);
+  if (virtual_view->parent_view() == view())
+    return;
+  AddVirtualChildViewAt(std::move(virtual_view), virtual_child_count());
+}
+
+void ViewAccessibility::AddVirtualChildViewAt(
+    std::unique_ptr<AXVirtualView> virtual_view,
+    int index) {
+  DCHECK(virtual_view);
+  DCHECK(!virtual_view->parent_view()) << "This |view| already has a View "
+                                          "parent. Call RemoveVirtualChildView "
+                                          "first.";
+  DCHECK(!virtual_view->virtual_parent_view()) << "This |view| already has an "
+                                                  "AXVirtualView parent. Call "
+                                                  "RemoveChildView first.";
+  DCHECK_GE(index, 0);
+  DCHECK_LE(index, virtual_child_count());
+
+  virtual_view->set_parent_view(view());
+  virtual_children_.insert(virtual_children_.begin() + index,
+                           std::move(virtual_view));
+}
+
+std::unique_ptr<AXVirtualView> ViewAccessibility::RemoveVirtualChildView(
+    AXVirtualView* virtual_view) {
+  DCHECK(virtual_view);
+  int cur_index = GetIndexOf(virtual_view);
+  if (cur_index < 0)
+    return {};
+
+  std::unique_ptr<AXVirtualView> child =
+      std::move(virtual_children_[cur_index]);
+  virtual_children_.erase(virtual_children_.begin() + cur_index);
+  child->set_parent_view(nullptr);
+  return child;
+}
+
+void ViewAccessibility::RemoveAllVirtualChildViews() {
+  while (!virtual_children_.empty())
+    RemoveVirtualChildView(virtual_children_.back().get());
+}
+
+int ViewAccessibility::GetIndexOf(const AXVirtualView* virtual_view) const {
+  DCHECK(virtual_view);
+  const auto iter =
+      std::find_if(virtual_children_.begin(), virtual_children_.end(),
+                   [virtual_view](const auto& child) {
+                     return child.get() == virtual_view;
+                   });
+  return iter != virtual_children_.end()
+             ? static_cast<int>(iter - virtual_children_.begin())
+             : -1;
+}
+
 const ui::AXUniqueId& ViewAccessibility::GetUniqueId() const {
   return unique_id_;
 }
@@ -109,7 +171,7 @@
   return is_leaf_;
 }
 
-void ViewAccessibility::OverrideRole(ax::mojom::Role role) {
+void ViewAccessibility::OverrideRole(const ax::mojom::Role role) {
   DCHECK(IsValidRoleForViews(role));
 
   custom_data_.role = role;
@@ -120,14 +182,15 @@
 }
 
 void ViewAccessibility::OverrideName(const base::string16& name) {
-  custom_data_.SetName(base::UTF16ToUTF8(name));
+  custom_data_.SetName(name);
 }
 
 void ViewAccessibility::OverrideDescription(const std::string& description) {
-  DCHECK(!custom_data_.HasStringAttribute(
-      ax::mojom::StringAttribute::kDescription));
-  custom_data_.AddStringAttribute(ax::mojom::StringAttribute::kDescription,
-                                  description);
+  custom_data_.SetDescription(description);
+}
+
+void ViewAccessibility::OverrideDescription(const base::string16& description) {
+  custom_data_.SetDescription(description);
 }
 
 void ViewAccessibility::OverrideIsLeaf() {
diff --git a/ui/views/accessibility/view_accessibility.h b/ui/views/accessibility/view_accessibility.h
index 903c4e5d..d226948 100644
--- a/ui/views/accessibility/view_accessibility.h
+++ b/ui/views/accessibility/view_accessibility.h
@@ -6,13 +6,16 @@
 #define UI_VIEWS_ACCESSIBILITY_VIEW_ACCESSIBILITY_H_
 
 #include <memory>
+#include <string>
 
 #include "base/macros.h"
+#include "base/strings/string16.h"
 #include "build/build_config.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/accessibility/platform/ax_unique_id.h"
 #include "ui/gfx/native_widget_types.h"
+#include "ui/views/accessibility/ax_virtual_view.h"
 #include "ui/views/views_export.h"
 
 namespace views {
@@ -45,10 +48,11 @@
   // Note that string attributes are only used if non-empty, so you can't
   // override a string with the empty string.
   //
-  void OverrideRole(ax::mojom::Role role);
+  void OverrideRole(const ax::mojom::Role role);
   void OverrideName(const std::string& name);
   void OverrideName(const base::string16& name);
   void OverrideDescription(const std::string& description);
+  void OverrideDescription(const base::string16& description);
   void OverrideIsLeaf();  // Force this node to be treated as a leaf node.
 
   virtual gfx::NativeViewAccessible GetNativeObject();
@@ -64,6 +68,39 @@
   bool is_ignored() const { return is_ignored_; }
   void set_is_ignored(bool ignored) { is_ignored_ = ignored; }
 
+  //
+  // Methods for managing virtual views.
+  //
+
+  // Adds |virtual_view| as a child of this View, optionally at |index|.
+  // We take ownership of our virtual children.
+  void AddVirtualChildView(std::unique_ptr<AXVirtualView> virtual_view);
+  void AddVirtualChildViewAt(std::unique_ptr<AXVirtualView> virtual_view,
+                             int index);
+
+  // Removes |virtual_view| from this View. The virtual view's parent will
+  // change to nullptr. Hands ownership back to the caller.
+  std::unique_ptr<AXVirtualView> RemoveVirtualChildView(
+      AXVirtualView* virtual_view);
+
+  // Removes all the virtual children from this View.
+  // The virtual views are deleted.
+  void RemoveAllVirtualChildViews();
+
+  int virtual_child_count() const {
+    return static_cast<int>(virtual_children_.size());
+  }
+
+  const AXVirtualView* virtual_child_at(int index) const {
+    DCHECK_GE(index, 0);
+    DCHECK_LT(index, virtual_child_count());
+    return virtual_children_[index].get();
+  }
+
+  // Returns the index of |virtual_view|, or -1 if |virtual_view| is not a child
+  // of this View.
+  int GetIndexOf(const AXVirtualView* virtual_view) const;
+
  protected:
   explicit ViewAccessibility(View* view);
 
@@ -73,6 +110,10 @@
   // Weak. Owns this.
   View* const owner_view_;
 
+  // If there are any virtual children, they override any real children.
+  // We own our virtual children.
+  std::vector<std::unique_ptr<AXVirtualView>> virtual_children_;
+
   const ui::AXUniqueId unique_id_;
 
   // Contains data set explicitly via SetRole, SetName, etc. that overrides
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate.cc b/ui/views/accessibility/view_ax_platform_node_delegate.cc
index adc4575f..14e2d7a 100644
--- a/ui/views/accessibility/view_ax_platform_node_delegate.cc
+++ b/ui/views/accessibility/view_ax_platform_node_delegate.cc
@@ -9,10 +9,12 @@
 
 #include "base/lazy_instance.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "ui/accessibility/ax_action_data.h"
 #include "ui/accessibility/ax_role_properties.h"
+#include "ui/accessibility/ax_tree_data.h"
 #include "ui/accessibility/platform/ax_platform_node.h"
+#include "ui/accessibility/platform/ax_unique_id.h"
 #include "ui/events/event_utils.h"
-#include "ui/gfx/native_widget_types.h"
 #include "ui/views/accessibility/view_accessibility_utils.h"
 #include "ui/views/controls/native/native_view_host.h"
 #include "ui/views/view.h"
@@ -227,6 +229,10 @@
 int ViewAXPlatformNodeDelegate::GetChildCount() {
   if (IsLeaf())
     return 0;
+
+  if (virtual_child_count())
+    return virtual_child_count();
+
   int child_count = view()->child_count();
 
   std::vector<Widget*> child_widgets;
@@ -242,9 +248,15 @@
 }
 
 gfx::NativeViewAccessible ViewAXPlatformNodeDelegate::ChildAtIndex(int index) {
+  DCHECK_GE(index, 0) << "Child indices should be greater or equal to 0.";
+  DCHECK_LT(index, GetChildCount())
+      << "Child indices should be less than the child count.";
   if (IsLeaf())
     return nullptr;
 
+  if (virtual_child_count())
+    return virtual_child_at(index)->GetNativeObject();
+
   // If this is a root view, our widget might have child widgets. Include
   std::vector<Widget*> child_widgets;
   bool is_tab_modal_showing;
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate.h b/ui/views/accessibility/view_ax_platform_node_delegate.h
index 8dea736..2e9cb2b4 100644
--- a/ui/views/accessibility/view_ax_platform_node_delegate.h
+++ b/ui/views/accessibility/view_ax_platform_node_delegate.h
@@ -5,21 +5,26 @@
 #ifndef UI_VIEWS_ACCESSIBILITY_VIEW_AX_PLATFORM_NODE_DELEGATE_H_
 #define UI_VIEWS_ACCESSIBILITY_VIEW_AX_PLATFORM_NODE_DELEGATE_H_
 
-#include <memory>
+#include <stdint.h>
 
 #include "base/macros.h"
+#include "base/strings/string16.h"
 #include "build/build_config.h"
-#include "ui/accessibility/ax_action_data.h"
+#include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
-#include "ui/accessibility/ax_tree_data.h"
-#include "ui/accessibility/platform/ax_platform_node.h"
 #include "ui/accessibility/platform/ax_platform_node_delegate_base.h"
-#include "ui/accessibility/platform/ax_unique_id.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/views/accessibility/view_accessibility.h"
-#include "ui/views/views_export.h"
 #include "ui/views/widget/widget_observer.h"
 
+namespace ui {
+
+struct AXActionData;
+class AXUniqueId;
+
+}  // namespace ui
+
 namespace views {
 
 class View;
@@ -29,9 +34,8 @@
 // |ViewAXPlatformNodeDelegate| to interface with the native accessibility
 // toolkit. This class owns the |AXPlatformNode|, which implements those native
 // APIs.
-class VIEWS_EXPORT ViewAXPlatformNodeDelegate
-    : public ViewAccessibility,
-      public ui::AXPlatformNodeDelegateBase {
+class ViewAXPlatformNodeDelegate : public ViewAccessibility,
+                                   public ui::AXPlatformNodeDelegateBase {
  public:
   ~ViewAXPlatformNodeDelegate() override;
 
@@ -56,8 +60,8 @@
   bool AccessibilityPerformAction(const ui::AXActionData& data) override;
   bool ShouldIgnoreHoveredStateForTesting() override;
   bool IsOffscreen() const override;
-  const ui::AXUniqueId& GetUniqueId()
-      const override;  // Also in ViewAccessibility
+  // Also in |ViewAccessibility|.
+  const ui::AXUniqueId& GetUniqueId() const override;
 
  protected:
   explicit ViewAXPlatformNodeDelegate(View* view);
@@ -74,7 +78,7 @@
   void OnMenuEnd();
 
   // We own this, but it is reference-counted on some platforms so we can't use
-  // a scoped_ptr. It is dereferenced in the destructor.
+  // a unique_ptr. It is destroyed in the destructor.
   ui::AXPlatformNode* ax_node_;
 
   mutable ui::AXNodeData data_;
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc b/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
index 09711e4..4814102 100644
--- a/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
+++ b/ui/views/accessibility/view_ax_platform_node_delegate_unittest.cc
@@ -5,8 +5,12 @@
 #include "ui/views/accessibility/view_ax_platform_node_delegate.h"
 
 #include "base/strings/utf_string_conversions.h"
+#include "ui/accessibility/ax_action_data.h"
+#include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/rect_conversions.h"
+#include "ui/gfx/geometry/size.h"
 #include "ui/views/accessibility/ax_aura_obj_cache.h"
 #include "ui/views/accessibility/ax_aura_obj_wrapper.h"
 #include "ui/views/accessibility/ax_widget_obj_wrapper.h"
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.h b/ui/views/cocoa/bridged_native_widget_host_impl.h
index fdfac6e..0a13d280 100644
--- a/ui/views/cocoa/bridged_native_widget_host_impl.h
+++ b/ui/views/cocoa/bridged_native_widget_host_impl.h
@@ -6,6 +6,7 @@
 #define UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_HOST_IMPL_H_
 
 #include <memory>
+#include <vector>
 
 #include "base/mac/scoped_nsobject.h"
 #include "base/macros.h"
@@ -62,14 +63,18 @@
       uint64_t bridged_native_widget_id);
   uint64_t bridged_native_widget_id() const { return widget_id_; }
 
-  // Creates one side of the bridge. |parent| must not be NULL.
-  explicit BridgedNativeWidgetHostImpl(NativeWidgetMac* parent);
+  // Creates one side of the bridge. |owner| must not be NULL.
+  explicit BridgedNativeWidgetHostImpl(NativeWidgetMac* owner);
   ~BridgedNativeWidgetHostImpl() override;
 
   // The NativeWidgetMac that owns |this|.
   views::NativeWidgetMac* native_widget_mac() const {
     return native_widget_mac_;
   }
+  BridgedNativeWidgetHostImpl* parent() const { return parent_; }
+  std::vector<BridgedNativeWidgetHostImpl*> children() const {
+    return children_;
+  }
 
   // The bridge factory that was used to create the true NSWindow for this
   // widget. This is nullptr for in-process windows.
@@ -164,6 +169,10 @@
   // fullscreen or transitioning between fullscreen states.
   gfx::Rect GetRestoredBounds() const;
 
+  // Set |parent_| and update the old and new parents' |children_|. It is valid
+  // to set |new_parent| to nullptr.
+  void SetParent(BridgedNativeWidgetHostImpl* new_parent);
+
   // Properties set and queried by views. Not actually native.
   void SetNativeWindowProperty(const char* name, void* value);
   void* GetNativeWindowProperty(const char* name) const;
@@ -300,7 +309,12 @@
   const uint64_t widget_id_;
   views::NativeWidgetMac* const native_widget_mac_;  // Weak. Owns |this_|.
 
-  // The factory that was used to create |bridge_ptr_|.
+  // Parent and child widgets.
+  BridgedNativeWidgetHostImpl* parent_ = nullptr;
+  std::vector<BridgedNativeWidgetHostImpl*> children_;
+
+  // The factory that was used to create |bridge_ptr_|. This must be the same
+  // as |parent_->bridge_factory_host_|.
   BridgeFactoryHost* bridge_factory_host_ = nullptr;
 
   Widget::InitParams::Type widget_type_ = Widget::InitParams::TYPE_WINDOW;
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.mm b/ui/views/cocoa/bridged_native_widget_host_impl.mm
index 95bbb660..0f065d26 100644
--- a/ui/views/cocoa/bridged_native_widget_host_impl.mm
+++ b/ui/views/cocoa/bridged_native_widget_host_impl.mm
@@ -13,6 +13,7 @@
 #include "ui/compositor/recyclable_compositor_mac.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/geometry/dip_util.h"
+#include "ui/gfx/mac/coordinate_conversion.h"
 #include "ui/native_theme/native_theme_mac.h"
 #include "ui/views/cocoa/tooltip_manager_mac.h"
 #include "ui/views/controls/menu/menu_config.h"
@@ -75,19 +76,19 @@
   return found->second;
 }
 
-BridgedNativeWidgetHostImpl::BridgedNativeWidgetHostImpl(
-    NativeWidgetMac* parent)
+BridgedNativeWidgetHostImpl::BridgedNativeWidgetHostImpl(NativeWidgetMac* owner)
     : widget_id_(++g_last_bridged_native_widget_id),
-      native_widget_mac_(parent),
+      native_widget_mac_(owner),
       root_view_id_(ui::NSViewIds::GetNewId()),
       host_mojo_binding_(this) {
   DCHECK(GetIdToWidgetHostImplMap().find(widget_id_) ==
          GetIdToWidgetHostImplMap().end());
   GetIdToWidgetHostImplMap().insert(std::make_pair(widget_id_, this));
-  DCHECK(parent);
+  DCHECK(owner);
 }
 
 BridgedNativeWidgetHostImpl::~BridgedNativeWidgetHostImpl() {
+  DCHECK(children_.empty());
   if (bridge_factory_host_) {
     bridge_ptr_.reset();
     host_mojo_binding_.Unbind();
@@ -396,15 +397,24 @@
   return found->second;
 }
 
+void BridgedNativeWidgetHostImpl::SetParent(
+    BridgedNativeWidgetHostImpl* new_parent) {
+  if (new_parent == parent_)
+    return;
+
+  if (parent_) {
+    auto found =
+        std::find(parent_->children_.begin(), parent_->children_.end(), this);
+    DCHECK(found != parent_->children_.end());
+    parent_->children_.erase(found);
+  }
+  parent_ = new_parent;
+  if (parent_)
+    parent_->children_.push_back(this);
+}
+
 void BridgedNativeWidgetHostImpl::SetAssociationForView(const View* view,
                                                         NSView* native_view) {
-  // TODO(ccameron): For the case of out-of-process NSWindows, it will be
-  // necessary to:
-  // - migrate |native_view| to the new process (for web contents).
-  // - use a dummy parent window if |native_view| is perforce in this process.
-  if (bridge_impl_)
-    [bridge_impl_->ns_view() addSubview:native_view];
-
   DCHECK_EQ(0u, associated_views_.count(view));
   associated_views_[view] = native_view;
   native_widget_mac_->GetWidget()->ReorderNativeViews();
@@ -639,6 +649,16 @@
 void BridgedNativeWidgetHostImpl::OnWindowGeometryChanged(
     const gfx::Rect& new_window_bounds_in_screen,
     const gfx::Rect& new_content_bounds_in_screen) {
+  // If we are accessing the BridgedNativeWidget through mojo, then
+  // |local_window_| is not the true window that was just resized. Update
+  // the frame of |local_window_| to keep it in sync for any native calls
+  // that may use it (e.g, for context menu positioning).
+  if (bridge_ptr_) {
+    [local_window_ setFrame:gfx::ScreenRectToNSRect(new_window_bounds_in_screen)
+                    display:NO
+                    animate:NO];
+  }
+
   bool window_has_moved =
       new_window_bounds_in_screen.origin() != window_bounds_in_screen_.origin();
   bool content_has_resized =
@@ -715,9 +735,14 @@
   if (DialogDelegate* dialog = widget->widget_delegate()->AsDialogDelegate())
     dialog->RemoveObserver(this);
   native_widget_mac_->WindowDestroying();
+  // Remove |this| from the parent's list of children.
+  SetParent(nullptr);
 }
 
 void BridgedNativeWidgetHostImpl::OnWindowHasClosed() {
+  // OnWindowHasClosed will be called only after all child windows have had
+  // OnWindowWillClose called on them.
+  DCHECK(children_.empty());
   native_widget_mac_->WindowDestroyed();
 }
 
diff --git a/ui/views/controls/native/native_view_host_mac.mm b/ui/views/controls/native/native_view_host_mac.mm
index f246206..d98e6e1 100644
--- a/ui/views/controls/native/native_view_host_mac.mm
+++ b/ui/views/controls/native/native_view_host_mac.mm
@@ -116,6 +116,7 @@
 
   auto* bridge_host = GetBridgedNativeWidgetHost();
   DCHECK(bridge_host);
+  [bridge_host->native_widget_mac()->GetNativeView() addSubview:native_view_];
   bridge_host->SetAssociationForView(host_, native_view_);
 
   if ([native_view_ conformsToProtocol:@protocol(ViewsHostable)]) {
diff --git a/ui/views/mus/remote_view/remote_view_host.cc b/ui/views/mus/remote_view/remote_view_host.cc
index 70d35ea..a0fc606 100644
--- a/ui/views/mus/remote_view/remote_view_host.cc
+++ b/ui/views/mus/remote_view/remote_view_host.cc
@@ -15,7 +15,14 @@
 
 namespace views {
 
-RemoteViewHost::RemoteViewHost() = default;
+RemoteViewHost::RemoteViewHost()
+    : embedding_root_(std::make_unique<aura::Window>(nullptr)) {
+  embedding_root_->set_owned_by_parent(false);
+  embedding_root_->SetName("RemoteViewHostWindow");
+  embedding_root_->SetType(aura::client::WINDOW_TYPE_CONTROL);
+  embedding_root_->Init(ui::LAYER_NOT_DRAWN);
+}
+
 RemoteViewHost::~RemoteViewHost() = default;
 
 void RemoteViewHost::EmbedUsingToken(const base::UnguessableToken& embed_token,
@@ -29,27 +36,11 @@
   embed_callback_ = std::move(callback);
 
   if (GetWidget())
-    CreateEmbeddingRoot();
+    EmbedImpl();
 }
 
-void RemoteViewHost::CreateEmbeddingRoot() {
-  // Should not be attached to anything.
-  DCHECK(!native_view());
-
-  // There is a pending embed request.
-  DCHECK(!embed_token_.is_empty());
-
-  embedding_root_ = std::make_unique<aura::Window>(nullptr);
-  embedding_root_->set_owned_by_parent(false);
-
-  embedding_root_->SetName("RemoteViewHostWindow");
-  embedding_root_->SetType(aura::client::WINDOW_TYPE_CONTROL);
-  embedding_root_->Init(ui::LAYER_NOT_DRAWN);
-
-  // Must happen before EmbedUsingToken call for window server to figure out
-  // the relevant display.
-  Attach(embedding_root_.get());
-
+void RemoteViewHost::EmbedImpl() {
+  DCHECK(IsEmbedPending());
   aura::WindowPortMus::Get(embedding_root_.get())
       ->EmbedUsingToken(embed_token_, embed_flags_,
                         base::BindOnce(&RemoteViewHost::OnEmbedResult,
@@ -58,17 +49,17 @@
 
 void RemoteViewHost::OnEmbedResult(bool success) {
   LOG_IF(ERROR, !success) << "Failed to embed, token=" << embed_token_;
-
-  if (!success && embedding_root_)
-    embedding_root_.reset();
-
+  embed_token_ = {};
   if (embed_callback_)
     std::move(embed_callback_).Run(success);
 }
 
 void RemoteViewHost::AddedToWidget() {
-  if (!native_view() && !embed_token_.is_empty())
-    CreateEmbeddingRoot();
+  if (native_view())
+    return;
+  Attach(embedding_root_.get());
+  if (IsEmbedPending())
+    EmbedImpl();
 }
 
 }  // namespace views
diff --git a/ui/views/mus/remote_view/remote_view_host.h b/ui/views/mus/remote_view/remote_view_host.h
index 44b1552..2a3e453 100644
--- a/ui/views/mus/remote_view/remote_view_host.h
+++ b/ui/views/mus/remote_view/remote_view_host.h
@@ -36,8 +36,10 @@
                        EmbedCallback callback);
 
  private:
+  bool IsEmbedPending() const { return !embed_token_.is_empty(); }
+
   // Creates the embedding aura::Window and attach to it.
-  void CreateEmbeddingRoot();
+  void EmbedImpl();
 
   // Invoked after the embed operation.
   void OnEmbedResult(bool success);
@@ -49,7 +51,7 @@
   int embed_flags_ = 0;
   EmbedCallback embed_callback_;
 
-  std::unique_ptr<aura::Window> embedding_root_;
+  const std::unique_ptr<aura::Window> embedding_root_;
   base::WeakPtrFactory<RemoteViewHost> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(RemoteViewHost);
diff --git a/ui/views/mus/remote_view/remote_view_host_unittest.cc b/ui/views/mus/remote_view/remote_view_host_unittest.cc
index 611c001..30db5c39 100644
--- a/ui/views/mus/remote_view/remote_view_host_unittest.cc
+++ b/ui/views/mus/remote_view/remote_view_host_unittest.cc
@@ -80,21 +80,20 @@
   DISALLOW_COPY_AND_ASSIGN(RemoteViewHostTest);
 };
 
-// Tests that the embed operation fails with an unknown token and RemoteViewHost
-// will not be attached.
+// Tests that the embed operation fails with an unknown token.
 TEST_F(RemoteViewHostTest, BadEmbed) {
   const base::UnguessableToken unknown_token = base::UnguessableToken::Create();
 
   // Ownership will be passed to |widget| later.
   RemoteViewHost* host = new RemoteViewHost();
   std::unique_ptr<views::Widget> widget = CreateTestWidget(host);
-  EXPECT_FALSE(host->native_view());
+  EXPECT_TRUE(host->native_view());
 
   // Embed fails with unknown token.
   EXPECT_FALSE(Embed(host, unknown_token));
 
-  // |host| is not attached after adding to a widget.
-  EXPECT_FALSE(host->native_view());
+  // |host| is still attached despite the Embed failure.
+  EXPECT_TRUE(host->native_view());
 }
 
 // Tests when RemoveViewHost is added to a widget before embedding.
@@ -105,15 +104,15 @@
   // Ownership will be passed to |widget| later.
   RemoteViewHost* host = new RemoteViewHost();
 
-  // |host| is not attached because embed operation is not performed.
+  // |host| is not attached until the widget is created.
   EXPECT_FALSE(host->native_view());
   std::unique_ptr<views::Widget> widget = CreateTestWidget(host);
-  EXPECT_FALSE(host->native_view());
+  EXPECT_TRUE(host->native_view());
 
   // Embed succeeds.
   EXPECT_TRUE(Embed(host, token));
 
-  // |host| is now attached to the embedding window.
+  // |host| is still attached to the embedding window.
   EXPECT_TRUE(host->native_view());
 }
 
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
index c372bd2..496f1e39 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
@@ -548,7 +548,7 @@
 }
 
 bool DesktopWindowTreeHostX11::IsVisible() const {
-  return window_mapped_in_client_;
+  return window_mapped_in_client_ && !IsMinimized();
 }
 
 void DesktopWindowTreeHostX11::SetSize(const gfx::Size& requested_size) {
@@ -832,16 +832,18 @@
 
 void DesktopWindowTreeHostX11::Minimize() {
   ReleaseCapture();
-  XIconifyWindow(xdisplay_, xwindow_, 0);
-  window_mapped_in_client_ = false;
+  if (window_mapped_in_client_)
+    XIconifyWindow(xdisplay_, xwindow_, 0);
+  else
+    SetWMSpecState(true, gfx::GetAtom("_NET_WM_STATE_HIDDEN"), x11::None);
 }
 
 void DesktopWindowTreeHostX11::Restore() {
   should_maximize_after_map_ = false;
   SetWMSpecState(false, gfx::GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"),
                  gfx::GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ"));
-  if (IsMinimized())
-    Show(ui::SHOW_STATE_NORMAL, gfx::Rect());
+  Show(ui::SHOW_STATE_NORMAL, gfx::Rect());
+  SetWMSpecState(false, gfx::GetAtom("_NET_WM_STATE_HIDDEN"), x11::None);
 }
 
 bool DesktopWindowTreeHostX11::IsMaximized() const {
@@ -1195,7 +1197,7 @@
 }
 
 void DesktopWindowTreeHostX11::HideImpl() {
-  if (IsVisible()) {
+  if (window_mapped_in_client_) {
     XWithdrawWindow(xdisplay_, xwindow_, 0);
     window_mapped_in_client_ = false;
     native_widget_delegate_->OnNativeWidgetVisibilityChanged(false);
@@ -1638,7 +1640,7 @@
 void DesktopWindowTreeHostX11::SetWMSpecState(bool enabled,
                                               XAtom state1,
                                               XAtom state2) {
-  if (IsVisible()) {
+  if (window_mapped_in_client_) {
     ui::SetWMSpecState(xwindow_, enabled, state1, state2);
   } else {
     // The updated state will be set when the window is (re)mapped.
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm
index af243e8..32be9a9 100644
--- a/ui/views/widget/native_widget_mac.mm
+++ b/ui/views/widget/native_widget_mac.mm
@@ -133,6 +133,10 @@
         [CreateNSWindow(params) retain]);
     bridge_host_->CreateLocalBridge(std::move(window), params.parent);
   }
+
+  if (parent_host)
+    bridge_host_->SetParent(parent_host);
+
   bridge_host_->InitWindow(params);
 
   // Only set always-on-top here if it is true since setting it may affect how
@@ -305,7 +309,7 @@
   // A peculiarity of the constrained window framework is that it permits a
   // dialog of MODAL_TYPE_WINDOW to have a null parent window; falling back to
   // a non-modal window in this case.
-  DCHECK(bridge_impl()->parent() || modal_type == ui::MODAL_TYPE_WINDOW);
+  DCHECK(bridge_host_->parent() || modal_type == ui::MODAL_TYPE_WINDOW);
 
   // Everything happens upon show.
 }
@@ -332,20 +336,14 @@
 }
 
 void NativeWidgetMac::SetBoundsConstrained(const gfx::Rect& bounds) {
-  if (!bridge_impl())
+  if (!bridge_host_)
     return;
-
   gfx::Rect new_bounds(bounds);
-  NativeWidgetPrivate* ancestor = nullptr;
-  if (bridge_impl() && bridge_impl()->parent()) {
-    ancestor =
-        GetNativeWidgetForNativeWindow(bridge_impl()->parent()->ns_window());
-  }
-  if (!ancestor) {
-    new_bounds = ConstrainBoundsToDisplayWorkArea(new_bounds);
-  } else {
+  if (bridge_host_->parent()) {
     new_bounds.AdjustToFit(
-        gfx::Rect(ancestor->GetWindowBoundsInScreen().size()));
+        gfx::Rect(bridge_host_->parent()->GetWindowBoundsInScreen().size()));
+  } else {
+    new_bounds = ConstrainBoundsToDisplayWorkArea(new_bounds);
   }
   SetBounds(new_bounds);
 }
@@ -725,13 +723,9 @@
       BridgedNativeWidgetHostImpl::GetFromNativeWindow([native_view window]);
   if (!bridge_host)
     return nullptr;
-
-  NativeWidgetPrivate* ancestor =
-      bridge_host->bridge_impl()->parent()
-          ? GetTopLevelNativeWidget(
-                [bridge_host->bridge_impl()->parent()->ns_window() contentView])
-          : nullptr;
-  return ancestor ? ancestor : bridge_host->native_widget_mac();
+  while (bridge_host->parent())
+    bridge_host = bridge_host->parent();
+  return bridge_host->native_widget_mac();
 }
 
 // static
@@ -766,36 +760,34 @@
   // |native_view|, not the Widget for |native_view|. |native_view| doesn't have
   // a corresponding Widget of its own in this case (and so can't have Widget
   // children of its own on Mac).
-  if (bridge_host->bridge_impl()->ns_view() != native_view)
+  if (bridge_host->native_widget_mac()->GetNativeView() != native_view)
     return;
 
   // Code expects widget for |native_view| to be added to |children|.
   if (bridge_host->native_widget_mac()->GetWidget())
     children->insert(bridge_host->native_widget_mac()->GetWidget());
 
-  // When the NSWindow *is* a Widget, only consider child_windows(). I.e. do not
+  // When the NSWindow *is* a Widget, only consider children(). I.e. do not
   // look through -[NSWindow childWindows] as done for the (!bridge_host) case
   // above. -childWindows does not support hidden windows, and anything in there
-  // which is not in child_windows() would have been added by AppKit.
-  for (BridgedNativeWidgetImpl* child :
-       bridge_host->bridge_impl()->child_windows()) {
-    GetAllChildWidgets(child->ns_view(), children);
-  }
+  // which is not in children() would have been added by AppKit.
+  for (BridgedNativeWidgetHostImpl* child : bridge_host->children())
+    GetAllChildWidgets(child->native_widget_mac()->GetNativeView(), children);
 }
 
 // static
 void NativeWidgetPrivate::GetAllOwnedWidgets(gfx::NativeView native_view,
                                              Widget::Widgets* owned) {
-  BridgedNativeWidgetImpl* bridge =
-      BridgedNativeWidgetImpl::GetFromNativeWindow([native_view window]);
-  if (!bridge) {
+  BridgedNativeWidgetHostImpl* bridge_host =
+      BridgedNativeWidgetHostImpl::GetFromNativeWindow([native_view window]);
+  if (!bridge_host) {
     GetAllChildWidgets(native_view, owned);
     return;
   }
-  if (bridge->ns_view() != native_view)
+  if (bridge_host->native_widget_mac()->GetNativeView() != native_view)
     return;
-  for (BridgedNativeWidgetImpl* child : bridge->child_windows())
-    GetAllChildWidgets(child->ns_view(), owned);
+  for (BridgedNativeWidgetHostImpl* child : bridge_host->children())
+    GetAllChildWidgets(child->native_widget_mac()->GetNativeView(), owned);
 }
 
 // static
@@ -807,13 +799,13 @@
     return;
   }
 
-  BridgedNativeWidgetImpl* bridge =
-      BridgedNativeWidgetImpl::GetFromNativeWindow([native_view window]);
-  BridgedNativeWidgetImpl* parent_bridge =
-      BridgedNativeWidgetImpl::GetFromNativeWindow([new_parent window]);
-  DCHECK(bridge);
+  BridgedNativeWidgetHostImpl* bridge_host =
+      BridgedNativeWidgetHostImpl::GetFromNativeWindow([native_view window]);
+  BridgedNativeWidgetHostImpl* parent_bridge_host =
+      BridgedNativeWidgetHostImpl::GetFromNativeWindow([new_parent window]);
+  DCHECK(bridge_host);
   if (Widget::GetWidgetForNativeView(native_view)->is_top_level() &&
-      bridge->parent() == parent_bridge)
+      bridge_host->parent() == parent_bridge_host)
     return;
 
   Widget::Widgets widgets;
@@ -824,7 +816,14 @@
   for (auto* child : widgets)
     child->NotifyNativeViewHierarchyWillChange();
 
-  bridge->ReparentNativeView(native_view, new_parent);
+  // Update |brige_host|'s parent only if
+  // BridgedNativeWidgetImpl::ReparentNativeView will.
+  bool native_view_is_root_view =
+      native_view == bridge_host->native_widget_mac()->GetNativeView();
+  if (native_view_is_root_view)
+    bridge_host->SetParent(parent_bridge_host);
+
+  bridge_host->bridge_impl()->ReparentNativeView(native_view, new_parent);
 
   // And now, notify them that they have a brand new parent.
   for (auto* child : widgets)
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index 2841eb8b..9afbcf6 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -2971,8 +2971,8 @@
       event_type, touch_point, event_time,
       ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH,
                          mapped_pointer_id, radius_x, radius_y, pressure,
-                         pointer_touch_info.orientation, 0.0f, 0.0f, 0.0f),
-      ui::GetModifiersFromKeyState(), rotation_angle);
+                         rotation_angle),
+      ui::GetModifiersFromKeyState());
 
   event.latency()->AddLatencyNumberWithTimestamp(
       ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, event_time, 1);
diff --git a/ui/views/win/pen_event_processor.cc b/ui/views/win/pen_event_processor.cc
index b820c51..e142993 100644
--- a/ui/views/win/pen_event_processor.cc
+++ b/ui/views/win/pen_event_processor.cc
@@ -56,12 +56,14 @@
   // convert pressure into a float [0, 1]. The range of the pressure is
   // [0, 1024] as specified on MSDN.
   float pressure = static_cast<float>(pointer_pen_info.pressure) / 1024;
-  float rotation = pointer_pen_info.rotation;
+  int rotation_angle = static_cast<int>(pointer_pen_info.rotation) % 180;
+  if (rotation_angle < 0)
+    rotation_angle += 180;
   int tilt_x = pointer_pen_info.tiltX;
   int tilt_y = pointer_pen_info.tiltY;
   ui::PointerDetails pointer_details(
       input_type, mapped_pointer_id, /* radius_x */ 0.0f, /* radius_y */ 0.0f,
-      pressure, rotation, tilt_x, tilt_y, /* tangential_pressure */ 0.0f);
+      pressure, rotation_angle, tilt_x, tilt_y, /* tangential_pressure */ 0.0f);
 
   // If the flag is disabled, we send mouse events for all pen inputs.
   if (!direct_manipulation_enabled_) {
@@ -186,12 +188,9 @@
 
   const base::TimeTicks event_time = ui::EventTimeForNow();
 
-  int rotation_angle = static_cast<int>(pointer_details.twist) % 180;
-  if (rotation_angle < 0)
-    rotation_angle += 180;
   std::unique_ptr<ui::TouchEvent> event = std::make_unique<ui::TouchEvent>(
       event_type, point, event_time, pointer_details,
-      flags | ui::GetModifiersFromKeyState(), rotation_angle);
+      flags | ui::GetModifiersFromKeyState());
   event->set_hovering(event_type == ui::ET_TOUCH_RELEASED);
   event->latency()->AddLatencyNumberWithTimestamp(
       ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, event_time, 1);
diff --git a/ui/views_bridge_mac/bridged_native_widget_impl.mm b/ui/views_bridge_mac/bridged_native_widget_impl.mm
index 813f1c52..27cadb0a 100644
--- a/ui/views_bridge_mac/bridged_native_widget_impl.mm
+++ b/ui/views_bridge_mac/bridged_native_widget_impl.mm
@@ -263,19 +263,10 @@
 }
 
 BridgedNativeWidgetImpl::~BridgedNativeWidgetImpl() {
-  // Ensure that |this| cannot be reached by its id while it is being destroyed.
-  auto found = GetIdToWidgetImplMap().find(id_);
-  DCHECK(found != GetIdToWidgetImplMap().end());
-  DCHECK_EQ(found->second, this);
-  GetIdToWidgetImplMap().erase(found);
-
   // The delegate should be cleared already. Note this enforces the precondition
   // that -[NSWindow close] is invoked on the hosted window before the
   // destructor is called.
   DCHECK(![window_ delegate]);
-
-  ui::CATransactionCoordinator::Get().RemovePreCommitObserver(this);
-  RemoveOrDestroyChildren();
   DCHECK(child_windows_.empty());
   DestroyContentView();
 }
@@ -696,6 +687,7 @@
 }
 
 void BridgedNativeWidgetImpl::OnWindowWillClose() {
+  ui::CATransactionCoordinator::Get().RemovePreCommitObserver(this);
   host_->OnWindowWillClose();
 
   // Ensure BridgedNativeWidgetImpl does not have capture, otherwise
@@ -716,6 +708,14 @@
   DCHECK(!show_animation_);
 
   [window_ setDelegate:nil];
+
+  // Ensure that |this| cannot be reached by its id while it is being destroyed.
+  size_t erased = GetIdToWidgetImplMap().erase(id_);
+  DCHECK_EQ(1u, erased);
+
+  RemoveOrDestroyChildren();
+  DCHECK(child_windows_.empty());
+
   host_->OnWindowHasClosed();
   // Note: |this| and its host will be deleted here.
 }